add actual distance to mesh ranging view

This commit is contained in:
Laura Klünder 2023-11-25 18:55:18 +01:00
parent d85d9845b2
commit 518219a7a4
5 changed files with 45 additions and 11 deletions

View file

@ -4,10 +4,17 @@
{% if send_uuid %}
{{ send_uuid|json_script:"send-uuid" }}
{% endif %}
{% if nodes_xyz %}
{{ nodes_xyz|json_script:"nodes-xyz" }}
{% endif %}
<script type="text/javascript">
{% if node_names %}
const node_names = JSON.parse(document.getElementById('node-names').textContent);
{% endif %}
{% if node_names %}
const nodes_xyz = JSON.parse(document.getElementById('nodes-xyz').textContent);
const nodes_distances = {}
{% endif %}
function connect() {
console.log('reconnecting websocket...');
@ -93,18 +100,37 @@ function connect() {
case 'mesh.msg_received':
{% if ranging_form %}
var cell;
for (cell of document.querySelectorAll(`[data-range-from="${data.msg.src}"]`)) {
var cell, key, src_node, peer_node;
src_node = data.msg.src;
for (cell of document.querySelectorAll(`[data-range-from="${src_node}"]:not([data-range-to="${src_node}"])`)) {
cell.innerText = "-";
}
for (var i=0;i<data.msg.ranges.length;i++) {
let range = data.msg.ranges[i];
peer_node = range.peer;
cell = document.querySelector(
`[data-range-from="${data.msg.src}"][data-range-to="${data.msg.ranges[i].peer}"]`
`[data-range-from="${src_node}"][data-range-to="${peer_node}"]`
);
if (cell) cell.innerText = (
((data.msg.ranges[i].distance == 0xff) ? "invalid" : `${data.msg.ranges[i].distance}cm`) +
` (${data.msg.ranges[i].rssi}dBm)`
if (!cell) continue;
key = `${src_node}-${peer_node}`
if (!(key in nodes_distances)) {
if (!(src_node in nodes_xyz && peer_node in nodes_xyz)) {
nodes_distances[key] = null;
} else {
nodes_distances[key] = Math.round(Math.sqrt(
Math.pow(nodes_xyz[src_node][0]-nodes_xyz[peer_node][0], 2) +
Math.pow(nodes_xyz[src_node][1]-nodes_xyz[peer_node][1], 2) +
Math.pow(nodes_xyz[src_node][2]-nodes_xyz[peer_node][2], 2)
));
}
}
cell.innerText = (
((range.distance == 0xff) ? "invalid" : `${range.distance}cm`) +
` (${range.rssi}dBm)`
);
if (nodes_distances[key] != null) {
cell.innerHTML += `<br> <em>(actual: ${nodes_distances[key]}cm</em>)`
}
}
{% endif %}
{% if send_uuid and msg_type == "MESH_ROUTE_REQUEST" %}

View file

@ -12,15 +12,15 @@
{% else %}
<table>
<tr>
<th></th>
<th>peer \ source</th>
{% for range_from in ranging_form.cleaned_data.range_from %}
<th>{% mesh_node range_from %}</th>
<th>{% mesh_node range_from True %}</th>
{% endfor %}
</tr>
{% for range_to in ranging_form.cleaned_data.range_to %}
<tr>
<td>{% mesh_node range_to %}</td>
<td>{% mesh_node range_to True %}</td>
{% for range_from in ranging_form.cleaned_data.range_from %}
<td data-range-to="{{ range_to }}" data-range-from="{{ range_from }}"></td>
{% endfor %}

View file

@ -8,7 +8,7 @@ register = template.Library()
@register.simple_tag(takes_context=True)
def mesh_node(context, node: str | MeshNode):
def mesh_node(context, node: str | MeshNode, linebreak=False):
if isinstance(node, str):
bssid = node
name = context.get("node_names", {}).get(node, None)
@ -17,7 +17,7 @@ def mesh_node(context, node: str | MeshNode):
name = node.name
if name:
return format_html(
'<a href="{url}">{bssid}</a> ({name})',
'<a href="{url}">{bssid}</a>'+('<br>' if linebreak else ' ')+'({name})',
url=reverse('mesh.node.detail', kwargs={"pk": bssid}), bssid=bssid, name=name
)
else:

View file

@ -19,7 +19,9 @@ class MeshRangingView(TemplateView):
template_name = "mesh/mesh_ranging.html"
def get_context_data(self, **kwargs):
from c3nav.routing.rangelocator import RangeLocator
return {
"ranging_form": RangingForm(self.request.GET or None),
"node_names": get_node_names(),
"nodes_xyz": RangeLocator.load().get_all_xyz(),
}

View file

@ -57,6 +57,12 @@ class RangeLocator:
return None
return tuple(self.beacon_positions[i])
def get_all_xyz(self):
return {
address: tuple(self.beacon_positions[i].tolist())
for address, i in self.beacon_lookup.items()
}
cached = None
cache_update = None
cache_lock = threading.Lock()