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

View file

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

View file

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

View file

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

View file

@ -57,6 +57,12 @@ class RangeLocator:
return None return None
return tuple(self.beacon_positions[i]) 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 cached = None
cache_update = None cache_update = None
cache_lock = threading.Lock() cache_lock = threading.Lock()