diff --git a/src/c3nav/control/templates/control/mesh_messages.html b/src/c3nav/control/templates/control/mesh_messages.html index 640dc8cd..27b99e84 100644 --- a/src/c3nav/control/templates/control/mesh_messages.html +++ b/src/c3nav/control/templates/control/mesh_messages.html @@ -69,7 +69,7 @@ {% else %} {% for key, value in msg.data.items %} - {% if key != "src" and key != "dst" and key != "msg_id" %} + {% if key != "src" and key != "dst" and key != "msg_type" %}
{{ key }}: {{ value }}
diff --git a/src/c3nav/control/views/mesh.py b/src/c3nav/control/views/mesh.py index b7d36131..76bbe5d9 100644 --- a/src/c3nav/control/views/mesh.py +++ b/src/c3nav/control/views/mesh.py @@ -169,7 +169,7 @@ class MeshMessageSendingView(ControlPanelMixin, TemplateView): **data, "node_name": node_names.get(data["msg_data"].get("address"), ""), "recipients": [(address, node_names[address]) for address in data["recipients"]], - "msg_type": MeshMessageType(data["msg_data"]["msg_id"]).name, + "msg_type": data["msg_data"]["msg_type"], } diff --git a/src/c3nav/mesh/consumers.py b/src/c3nav/mesh/consumers.py index 9591268e..8a6b55fd 100644 --- a/src/c3nav/mesh/consumers.py +++ b/src/c3nav/mesh/consumers.py @@ -217,7 +217,7 @@ class MeshConsumer(WebsocketConsumer): NodeMessage.objects.create( uplink_node=self.uplink_node, src_node=src_node, - message_type=msg.msg_id, + message_type=msg.msg_type.name, data=as_json, ) @@ -325,7 +325,7 @@ class MeshUIConsumer(JsonWebsocketConsumer): async_to_sync(self.channel_layer.group_add)("mesh_msg_sent", self.channel_name) self.msg_sent_filter = {"sender": self.channel_name} - if msg_to_send["msg_data"]["msg_id"] == MeshMessageType.MESH_ROUTE_REQUEST: + if msg_to_send["msg_data"]["msg_type"] == MeshMessageType.MESH_ROUTE_REQUEST.name: async_to_sync(self.channel_layer.group_add)("mesh_msg_received", self.channel_name) self.msg_received_filter = {"request_id": msg_to_send["msg_data"]["request_id"]} diff --git a/src/c3nav/mesh/forms.py b/src/c3nav/mesh/forms.py index 3fe5b874..5e0c1b08 100644 --- a/src/c3nav/mesh/forms.py +++ b/src/c3nav/mesh/forms.py @@ -72,7 +72,7 @@ class MeshMessageForm(forms.Form): raise Exception('nope') return { - 'msg_id': self.msg_type, + 'msg_type': self.msg_type.name, 'src': MESH_ROOT_ADDRESS, **self.get_cleaned_msg_data(), } diff --git a/src/c3nav/mesh/management/commands/generate_c_types.py b/src/c3nav/mesh/management/commands/generate_c_types.py index 4fd9f73d..0b334b70 100644 --- a/src/c3nav/mesh/management/commands/generate_c_types.py +++ b/src/c3nav/mesh/management/commands/generate_c_types.py @@ -18,27 +18,27 @@ class Command(BaseCommand): done_definitions = set() ignore_names = set(field_.name for field_ in fields(MeshMessage)) - for msg_id, msg_type in MeshMessage.get_types().items(): - if msg_type.c_struct_name: - if msg_type.c_struct_name in done_struct_names: + for msg_type, msg_class in MeshMessage.get_types().items(): + if msg_class.c_struct_name: + if msg_class.c_struct_name in done_struct_names: continue - done_struct_names.add(msg_type.c_struct_name) - msg_type = MeshMessage.c_structs[msg_type.c_struct_name] + done_struct_names.add(msg_class.c_struct_name) + msg_class = MeshMessage.c_structs[msg_class.c_struct_name] - base_name = (msg_type.c_struct_name or normalize_name( - getattr(msg_id, 'name', msg_type.__name__) + base_name = (msg_class.c_struct_name or normalize_name( + getattr(msg_type, 'name', msg_class.__name__) )) name = "mesh_msg_%s_t" % base_name - for definition_name, definition in msg_type.get_c_definitions().items(): + for definition_name, definition in msg_class.get_c_definitions().items(): if definition_name not in done_definitions: done_definitions.add(definition_name) print(definition) print() - code = msg_type.get_c_code(name, ignore_fields=ignore_names, no_empty=True) + code = msg_class.get_c_code(name, ignore_fields=ignore_names, no_empty=True) if code: - size = msg_type.get_min_size(no_inherited_fields=True) + size = msg_class.get_min_size(no_inherited_fields=True) struct_lines[base_name] = "%s %s;" % (name, base_name.replace('_announce', '')) struct_sizes.append(size) print(code) @@ -46,7 +46,7 @@ class Command(BaseCommand): (name, size)) print() else: - nodata.add(msg_type) + nodata.add(msg_class) print("/** union between all message data structs */") print("typedef union __packed {") @@ -63,16 +63,16 @@ class Command(BaseCommand): max_msg_type = max(MeshMessage.get_types().keys()) macro_data = [] for i in range(((max_msg_type//16)+1)*16): - msg_type = MeshMessage.get_types().get(i, None) - if msg_type: - name = (msg_type.c_struct_name or normalize_name( - getattr(msg_type.msg_id, 'name', msg_type.__name__) + msg_class = MeshMessage.get_types().get(i, None) + if msg_class: + name = (msg_class.c_struct_name or normalize_name( + getattr(msg_class.msg_type, 'name', msg_class.__name__) )) macro_data.append(( - msg_type.get_c_enum_name()+',', - ("nodata" if msg_type in nodata else name)+',', - msg_type.get_var_num(), - msg_type.__doc__.strip(), + msg_class.get_c_enum_name()+',', + ("nodata" if msg_class in nodata else name)+',', + msg_class.get_var_num(), + msg_class.__doc__.strip(), )) else: macro_data.append(( diff --git a/src/c3nav/mesh/messages.py b/src/c3nav/mesh/messages.py index 2f73b81f..23069922 100644 --- a/src/c3nav/mesh/messages.py +++ b/src/c3nav/mesh/messages.py @@ -47,7 +47,11 @@ class MeshMessageType(IntEnum): @property def pretty_name(self): - return self.name.replace('_', ' ').title() + name = self.name.replace('_', ' ').lower() + if name.startswith('config'): + name = name.removeprefix('config').strip()+' config' + name.replace('ota', 'OTA') + return name M = TypeVar('M', bound='MeshMessage') @@ -64,10 +68,10 @@ class ChipType(IntEnum): @dataclass -class MeshMessage(StructType, union_type_field="msg_id"): +class MeshMessage(StructType, union_type_field="msg_type"): dst: str = field(metadata={"format": MacAddressFormat()}) src: str = field(metadata={"format": MacAddressFormat()}) - msg_id: int = field(metadata={"format": SimpleFormat('B')}, init=False, repr=False) + msg_type: MeshMessageType = field(metadata={"format": EnumFormat('B')}, init=False, repr=False) c_structs = {} c_struct_name = None @@ -106,7 +110,7 @@ class MeshMessage(StructType, union_type_field="msg_id"): @dataclass -class NoopMessage(MeshMessage, msg_id=MeshMessageType.NOOP): +class NoopMessage(MeshMessage, msg_type=MeshMessageType.NOOP): """ noop """ pass @@ -122,25 +126,25 @@ class BaseEchoMessage(MeshMessage, c_struct_name="echo"): @dataclass -class EchoRequestMessage(BaseEchoMessage, msg_id=MeshMessageType.ECHO_REQUEST): +class EchoRequestMessage(BaseEchoMessage, msg_type=MeshMessageType.ECHO_REQUEST): """ repeat back string """ pass @dataclass -class EchoResponseMessage(BaseEchoMessage, msg_id=MeshMessageType.ECHO_RESPONSE): +class EchoResponseMessage(BaseEchoMessage, msg_type=MeshMessageType.ECHO_RESPONSE): """ repeat back string """ pass @dataclass -class MeshSigninMessage(MeshMessage, msg_id=MeshMessageType.MESH_SIGNIN): +class MeshSigninMessage(MeshMessage, msg_type=MeshMessageType.MESH_SIGNIN): """ node says hello to upstream node """ pass @dataclass -class MeshLayerAnnounceMessage(MeshMessage, msg_id=MeshMessageType.MESH_LAYER_ANNOUNCE): +class MeshLayerAnnounceMessage(MeshMessage, msg_type=MeshMessageType.MESH_LAYER_ANNOUNCE): """ upstream node announces layer number """ layer: int = field(metadata={ "format": SimpleFormat('B'), @@ -159,19 +163,19 @@ class BaseDestinationsMessage(MeshMessage, c_struct_name="destinations"): @dataclass -class MeshAddDestinationsMessage(BaseDestinationsMessage, msg_id=MeshMessageType.MESH_ADD_DESTINATIONS): +class MeshAddDestinationsMessage(BaseDestinationsMessage, msg_type=MeshMessageType.MESH_ADD_DESTINATIONS): """ downstream node announces served destination """ pass @dataclass -class MeshRemoveDestinationsMessage(BaseDestinationsMessage, msg_id=MeshMessageType.MESH_REMOVE_DESTINATIONS): +class MeshRemoveDestinationsMessage(BaseDestinationsMessage, msg_type=MeshMessageType.MESH_REMOVE_DESTINATIONS): """ downstream node announces no longer served destination """ pass @dataclass -class MeshRouteRequestMessage(MeshMessage, msg_id=MeshMessageType.MESH_ROUTE_REQUEST): +class MeshRouteRequestMessage(MeshMessage, msg_type=MeshMessageType.MESH_ROUTE_REQUEST): """ request routing information for node """ request_id: int = field(metadata={"format": SimpleFormat('I')}) address: str = field(metadata={ @@ -181,7 +185,7 @@ class MeshRouteRequestMessage(MeshMessage, msg_id=MeshMessageType.MESH_ROUTE_REQ @dataclass -class MeshRouteResponseMessage(MeshMessage, msg_id=MeshMessageType.MESH_ROUTE_RESPONSE): +class MeshRouteResponseMessage(MeshMessage, msg_type=MeshMessageType.MESH_ROUTE_RESPONSE): """ reporting the routing table entry to the given address """ request_id: int = field(metadata={"format": SimpleFormat('I')}) route: str = field(metadata={ @@ -191,7 +195,7 @@ class MeshRouteResponseMessage(MeshMessage, msg_id=MeshMessageType.MESH_ROUTE_RE @dataclass -class MeshRouteTraceMessage(MeshMessage, msg_id=MeshMessageType.MESH_ROUTE_TRACE): +class MeshRouteTraceMessage(MeshMessage, msg_type=MeshMessageType.MESH_ROUTE_TRACE): """ special message, collects all hop adresses on its way """ request_id: int = field(metadata={"format": SimpleFormat('I')}) trace: list[str] = field(default_factory=list, metadata={ @@ -201,19 +205,19 @@ class MeshRouteTraceMessage(MeshMessage, msg_id=MeshMessageType.MESH_ROUTE_TRACE @dataclass -class MeshRoutingFailedMessage(MeshMessage, msg_id=MeshMessageType.MESH_ROUTING_FAILED): +class MeshRoutingFailedMessage(MeshMessage, msg_type=MeshMessageType.MESH_ROUTING_FAILED): """ TODO description""" address: str = field(metadata={"format": MacAddressFormat()}) @dataclass -class ConfigDumpMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_DUMP): +class ConfigDumpMessage(MeshMessage, msg_type=MeshMessageType.CONFIG_DUMP): """ request for the node to dump its config """ pass @dataclass -class ConfigHardwareMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_HARDWARE): +class ConfigHardwareMessage(MeshMessage, msg_type=MeshMessageType.CONFIG_HARDWARE): """ respond hardware/chip info """ chip: ChipType = field(metadata={ "format": EnumFormat("H"), @@ -227,19 +231,19 @@ class ConfigHardwareMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_HARDWARE) @dataclass -class ConfigBoardMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_BOARD): +class ConfigBoardMessage(MeshMessage, msg_type=MeshMessageType.CONFIG_BOARD): """ set/respond board config """ board_config: BoardConfig = field(metadata={"c_embed": True, "json_embed": True}) @dataclass -class ConfigFirmwareMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_FIRMWARE): +class ConfigFirmwareMessage(MeshMessage, msg_type=MeshMessageType.CONFIG_FIRMWARE): """ respond firmware info """ app_desc: FirmwareAppDescription = field(metadata={'json_embed': True}) @dataclass -class ConfigPositionMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_POSITION): +class ConfigPositionMessage(MeshMessage, msg_type=MeshMessageType.CONFIG_POSITION): """ set/respond position config """ x_pos: int = field(metadata={"format": SimpleFormat('i')}) y_pos: int = field(metadata={"format": SimpleFormat('i')}) @@ -247,7 +251,7 @@ class ConfigPositionMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_POSITION) @dataclass -class ConfigUplinkMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_UPLINK): +class ConfigUplinkMessage(MeshMessage, msg_type=MeshMessageType.CONFIG_UPLINK): """ set/respond uplink config """ enabled: bool = field(metadata={"format": BoolFormat()}) ssid: str = field(metadata={"format": FixedStrFormat(32)}) @@ -260,12 +264,12 @@ class ConfigUplinkMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_UPLINK): @dataclass -class LocateRequestRangeMessage(MeshMessage, msg_id=MeshMessageType.LOCATE_REQUEST_RANGE): +class LocateRequestRangeMessage(MeshMessage, msg_type=MeshMessageType.LOCATE_REQUEST_RANGE): """ request to report distance to all nearby nodes """ pass @dataclass -class LocateRangeResults(MeshMessage, msg_id=MeshMessageType.LOCATE_RANGE_RESULTS): +class LocateRangeResults(MeshMessage, msg_type=MeshMessageType.LOCATE_RANGE_RESULTS): """ reports distance to given nodes """ ranges: dict[str, int] = field(metadata={"format": VarArrayFormat(RangeItemType)})