mesh map API now also delivers range results
This commit is contained in:
parent
e9b8d1b645
commit
b84cd059df
2 changed files with 44 additions and 3 deletions
|
@ -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.exceptions import API404, APIConflict, APIRequestValidationFailed
|
||||||
from c3nav.api.schema import BaseSchema
|
from c3nav.api.schema import BaseSchema
|
||||||
from c3nav.mapdata.models.geometry.space import RangingBeacon
|
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.models import FirmwareBuild, FirmwareVersion, NodeMessage, MeshNode
|
||||||
from c3nav.mesh.schemas import BoardType, ChipType, FirmwareImage, RangingBeaconGeoFeature, MeshConnectionGeoFeature, \
|
from c3nav.mesh.schemas import BoardType, ChipType, FirmwareImage, RangingBeaconGeoFeature, MeshConnectionGeoFeature, \
|
||||||
RangingMapData
|
RangingMapData
|
||||||
|
@ -269,8 +269,10 @@ def mesh_map(request, level_id: int):
|
||||||
if node.ranging_beacon and node.ranging_beacon.id in beacon_ids
|
if node.ranging_beacon and node.ranging_beacon.id in beacon_ids
|
||||||
}
|
}
|
||||||
|
|
||||||
mesh_connection_result = []
|
|
||||||
ranging_beacon_result = []
|
ranging_beacon_result = []
|
||||||
|
mesh_connection_result = []
|
||||||
|
locate_range_result = []
|
||||||
|
|
||||||
for beacon in beacons:
|
for beacon in beacons:
|
||||||
if beacon.space.level_id != level_id:
|
if beacon.space.level_id != level_id:
|
||||||
continue
|
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(
|
return RangingMapData(
|
||||||
connections=mesh_connection_result,
|
connections=mesh_connection_result,
|
||||||
ranging_beacons=ranging_beacon_result,
|
ranging_beacons=ranging_beacon_result,
|
||||||
|
ranges=locate_range_result,
|
||||||
)
|
)
|
||||||
|
|
|
@ -314,6 +314,20 @@ class MeshConnectionGeoFeature(BaseSchema):
|
||||||
properties: MeshConnectionGeoFeatureProperties
|
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):
|
class RangingMapData(BaseSchema):
|
||||||
connections: list[MeshConnectionGeoFeature]
|
connections: list[MeshConnectionGeoFeature]
|
||||||
ranging_beacons: list[RangingBeaconGeoFeature]
|
ranging_beacons: list[RangingBeaconGeoFeature]
|
||||||
|
ranges: list[MeshRangeResultGeoFeature]
|
Loading…
Add table
Add a link
Reference in a new issue