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 %}
|
{% 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" %}
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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(),
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue