mesh map API now also delivers range results

This commit is contained in:
Laura Klünder 2024-03-30 19:46:23 +01:00
parent e9b8d1b645
commit b84cd059df
2 changed files with 44 additions and 3 deletions

View file

@ -15,7 +15,7 @@ from c3nav.api.auth import APIKeyAuth, auth_permission_responses, auth_responses
from c3nav.api.exceptions import API404, APIConflict, APIRequestValidationFailed
from c3nav.api.schema import BaseSchema
from c3nav.mapdata.models.geometry.space import RangingBeacon
from c3nav.mesh.messages import MeshMessageType, MeshMessage
from c3nav.mesh.messages import MeshMessageType, MeshMessage, LocateRangeResults
from c3nav.mesh.models import FirmwareBuild, FirmwareVersion, NodeMessage, MeshNode
from c3nav.mesh.schemas import BoardType, ChipType, FirmwareImage, RangingBeaconGeoFeature, MeshConnectionGeoFeature, \
RangingMapData
@ -269,8 +269,10 @@ def mesh_map(request, level_id: int):
if node.ranging_beacon and node.ranging_beacon.id in beacon_ids
}
mesh_connection_result = []
ranging_beacon_result = []
mesh_connection_result = []
locate_range_result = []
for beacon in beacons:
if beacon.space.level_id != level_id:
continue
@ -305,7 +307,32 @@ def mesh_map(request, level_id: int):
}
})
if node:
locate_range_results_msg = node.last_messages[MeshMessageType.LOCATE_RANGE_RESULTS]
if locate_range_results_msg:
locate_range_results_msg: LocateRangeResults
for range_result in locate_range_results_msg.parsed.content.ranges:
try:
peer_node = nodes[range_result.peer]
except KeyError:
continue
if peer_node.ranging_beacon:
locate_range_result.append({
"type": "Feature",
"geometry": mapping(LineString(
list(beacon.geometry.coords) + list(peer_node.ranging_beacon.geometry.coords)
)),
"properties": {
"observer": node.address,
"peer": peer_node.address,
"rssi": range_result.rssi,
"distance": range_result.distance,
}
})
return RangingMapData(
connections=mesh_connection_result,
ranging_beacons=ranging_beacon_result,
ranges=locate_range_result,
)

View file

@ -314,6 +314,20 @@ class MeshConnectionGeoFeature(BaseSchema):
properties: MeshConnectionGeoFeatureProperties
class MeshRangeResultGeoFeatureProperties(BaseSchema):
observer: MacAddress
peer: MacAddress
rssi: Annotated[NonPositiveInt, Gt(-100)]
distance: Annotated[int, Gt(-32000), Lt(32000)]
class MeshRangeResultGeoFeature(BaseSchema):
type: Literal["Feature"]
geometry: LineSchema
properties: MeshRangeResultGeoFeatureProperties
class RangingMapData(BaseSchema):
connections: list[MeshConnectionGeoFeature]
ranging_beacons: list[RangingBeaconGeoFeature]
ranging_beacons: list[RangingBeaconGeoFeature]
ranges: list[MeshRangeResultGeoFeature]