add actual distance to mesh ranging view
This commit is contained in:
parent
d85d9845b2
commit
518219a7a4
5 changed files with 45 additions and 11 deletions
|
@ -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" %}
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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(),
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue