Make the location map work when the last packet has no location.

This commit is contained in:
Jason Michalski
2024-05-18 00:38:55 -07:00
parent eac3530a35
commit 7c53b45eea
3 changed files with 26 additions and 28 deletions

View File

@@ -129,6 +129,20 @@ async def get_packets(node_id=None, portnum=None):
return result.scalars()
async def get_packets_from(node_id=None, portnum=None):
async with database.async_session() as session:
q = select(Packet)
if node_id:
q = q.where(
Packet.from_node_id == node_id
)
if portnum:
q = q.where(Packet.portnum == portnum)
result = await session.execute(q.limit(500).order_by(Packet.import_time.desc()))
return result.scalars()
async def get_packet(packet_id):
async with database.async_session() as session:
q = select(Packet).where(Packet.id == packet_id)
@@ -136,13 +150,6 @@ async def get_packet(packet_id):
return result.scalar_one_or_none()
async def get_position(node_id):
async with database.async_session() as session:
q = select(Packet).where((Packet.from_node_id == node_id) & (Packet.portnum == PortNum.POSITION_APP)).order_by(Packet.import_time.desc())
result = await session.execute(q)
return result.scalar()
async def get_uplinked_packets(node_id):
async with database.async_session() as session:
result = await session.execute(

View File

@@ -7,7 +7,7 @@
{% block css %}
#map{
height:90%;
height:100%;
}
#packet_details{
height: 95vh;
@@ -26,8 +26,8 @@
sse-connect="/events?node_id={{node_id}}{% if portnum %}&portnum={{portnum}}{% endif %}">
{% endif %}
<div class="row">
<div class="col">
<div class="card text-white bg-primary mb-3" id="node_info">
<div class="col mb-3">
<div class="card text-white bg-primary" id="node_info">
{% if node %}
<div class="card-header">
{{node.long_name}} ({{node.node_id|node_id_to_hex}})
@@ -47,7 +47,7 @@
{% endif %}
</div>
</div>
<div class="col">
<div class="col mb-3">
<div id="map"/>
</div>
@@ -67,17 +67,16 @@
</div>
</div>
{% if position and position.raw_payload.latitude_i %}
{% if trace %}
<script>
var pos = [{{position.raw_payload.latitude_i * 1e-7}}, {{position.raw_payload.longitude_i * 1e-7}}];
var trace = {{trace | tojson}};
var map = L.map('map').setView(pos, 13);
var map = L.map('map').setView(trace[0], 13);
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
}).addTo(map);
L.polyline(trace).addTo(map);
var marker = L.marker(pos).addTo(map);
L.marker(trace[0]).addTo(map);
</script>
{% endif %}

View File

@@ -23,10 +23,8 @@ env = Environment(loader=PackageLoader("meshview"), autoescape=select_autoescape
async def build_trace(node_id):
trace = []
for raw_p in await store.get_packets(node_id, PortNum.POSITION_APP):
for raw_p in await store.get_packets_from(node_id, PortNum.POSITION_APP):
p = Packet.from_model(raw_p)
if p.from_node_id != node_id:
continue
if not p.raw_payload.latitude_i or not p.raw_payload.longitude_i:
continue
trace.append((p.raw_payload.latitude_i * 1e-7, p.raw_payload.longitude_i * 1e-7))
@@ -173,22 +171,21 @@ async def node_search(request):
if node_id:
node_task = tg.create_task(store.get_node(node_id))
packets_task = tg.create_task(store.get_packets(node_id, portnum=portnum))
position_task = tg.create_task(store.get_position(node_id))
trace_task = tg.create_task(build_trace(node_id))
else:
loop = asyncio.get_running_loop()
node_task = loop.create_future()
node_task.set_result(None)
packets_task = loop.create_future()
packets_task.set_result(())
position_task = loop.create_future()
position_task.set_result(None)
trace_task = loop.create_future()
trace_task.set_result([])
node_options_task = tg.create_task(store.get_fuzzy_nodes(raw_node_id))
packets = [Packet.from_model(p) for p in packets_task.result()]
template = env.get_template("node.html")
options = list(node_options_task.result())
position = Packet.from_model(position_task.result()) if position_task.result() else None
return web.Response(
text=template.render(
@@ -199,8 +196,7 @@ async def node_search(request):
packet_event="packet",
node_options=options,
portnum=portnum,
position=position,
trace=await build_trace(node_id),
trace=trace_task.result(),
),
content_type="text/html",
)
@@ -226,7 +222,6 @@ async def node_match(request):
async def packet_list(request):
node_id = int(request.match_info["node_id"])
raw_packets = await store.get_packets(node_id)
position = await store.get_position(node_id)
packets = (Packet.from_model(p) for p in raw_packets)
template = env.get_template("node.html")
@@ -238,7 +233,6 @@ async def packet_list(request):
node=node,
packets=packets,
packet_event="packet",
position=Packet.from_model(position) if position else None,
trace=await build_trace(node_id),
),
content_type="text/html",
@@ -250,7 +244,6 @@ async def uplinked_list(request):
node_id = int(request.match_info["node_id"])
raw_packets = await store.get_uplinked_packets(node_id)
packets = (Packet.from_model(p) for p in raw_packets)
position = await store.get_position(node_id)
node = await store.get_node(node_id)
template = env.get_template("node.html")
@@ -262,7 +255,6 @@ async def uplinked_list(request):
node=node,
packets=packets,
packet_event="uplinked",
position=Packet.from_model(position) if position else None,
trace=await build_trace(node_id),
),
content_type="text/html",