msg_id → msg_type

This commit is contained in:
Laura Klünder 2023-10-20 15:41:46 +02:00
parent 9bee0bf774
commit bf1834cd63
6 changed files with 50 additions and 46 deletions

View file

@ -69,7 +69,7 @@
{% else %} {% else %}
{% for key, value in msg.data.items %} {% 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" %}
<div class="mesh-msg-data mesh-msg-type-{{ key }}"> <div class="mesh-msg-data mesh-msg-type-{{ key }}">
<strong>{{ key }}</strong>: {{ value }} <strong>{{ key }}</strong>: {{ value }}
</div> </div>

View file

@ -169,7 +169,7 @@ class MeshMessageSendingView(ControlPanelMixin, TemplateView):
**data, **data,
"node_name": node_names.get(data["msg_data"].get("address"), ""), "node_name": node_names.get(data["msg_data"].get("address"), ""),
"recipients": [(address, node_names[address]) for address in data["recipients"]], "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"],
} }

View file

@ -217,7 +217,7 @@ class MeshConsumer(WebsocketConsumer):
NodeMessage.objects.create( NodeMessage.objects.create(
uplink_node=self.uplink_node, uplink_node=self.uplink_node,
src_node=src_node, src_node=src_node,
message_type=msg.msg_id, message_type=msg.msg_type.name,
data=as_json, data=as_json,
) )
@ -325,7 +325,7 @@ class MeshUIConsumer(JsonWebsocketConsumer):
async_to_sync(self.channel_layer.group_add)("mesh_msg_sent", self.channel_name) async_to_sync(self.channel_layer.group_add)("mesh_msg_sent", self.channel_name)
self.msg_sent_filter = {"sender": 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) 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"]} self.msg_received_filter = {"request_id": msg_to_send["msg_data"]["request_id"]}

View file

@ -72,7 +72,7 @@ class MeshMessageForm(forms.Form):
raise Exception('nope') raise Exception('nope')
return { return {
'msg_id': self.msg_type, 'msg_type': self.msg_type.name,
'src': MESH_ROOT_ADDRESS, 'src': MESH_ROOT_ADDRESS,
**self.get_cleaned_msg_data(), **self.get_cleaned_msg_data(),
} }

View file

@ -18,27 +18,27 @@ class Command(BaseCommand):
done_definitions = set() done_definitions = set()
ignore_names = set(field_.name for field_ in fields(MeshMessage)) ignore_names = set(field_.name for field_ in fields(MeshMessage))
for msg_id, msg_type in MeshMessage.get_types().items(): for msg_type, msg_class in MeshMessage.get_types().items():
if msg_type.c_struct_name: if msg_class.c_struct_name:
if msg_type.c_struct_name in done_struct_names: if msg_class.c_struct_name in done_struct_names:
continue continue
done_struct_names.add(msg_type.c_struct_name) done_struct_names.add(msg_class.c_struct_name)
msg_type = MeshMessage.c_structs[msg_type.c_struct_name] msg_class = MeshMessage.c_structs[msg_class.c_struct_name]
base_name = (msg_type.c_struct_name or normalize_name( base_name = (msg_class.c_struct_name or normalize_name(
getattr(msg_id, 'name', msg_type.__name__) getattr(msg_type, 'name', msg_class.__name__)
)) ))
name = "mesh_msg_%s_t" % base_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: if definition_name not in done_definitions:
done_definitions.add(definition_name) done_definitions.add(definition_name)
print(definition) print(definition)
print() 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: 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_lines[base_name] = "%s %s;" % (name, base_name.replace('_announce', ''))
struct_sizes.append(size) struct_sizes.append(size)
print(code) print(code)
@ -46,7 +46,7 @@ class Command(BaseCommand):
(name, size)) (name, size))
print() print()
else: else:
nodata.add(msg_type) nodata.add(msg_class)
print("/** union between all message data structs */") print("/** union between all message data structs */")
print("typedef union __packed {") print("typedef union __packed {")
@ -63,16 +63,16 @@ class Command(BaseCommand):
max_msg_type = max(MeshMessage.get_types().keys()) max_msg_type = max(MeshMessage.get_types().keys())
macro_data = [] macro_data = []
for i in range(((max_msg_type//16)+1)*16): for i in range(((max_msg_type//16)+1)*16):
msg_type = MeshMessage.get_types().get(i, None) msg_class = MeshMessage.get_types().get(i, None)
if msg_type: if msg_class:
name = (msg_type.c_struct_name or normalize_name( name = (msg_class.c_struct_name or normalize_name(
getattr(msg_type.msg_id, 'name', msg_type.__name__) getattr(msg_class.msg_type, 'name', msg_class.__name__)
)) ))
macro_data.append(( macro_data.append((
msg_type.get_c_enum_name()+',', msg_class.get_c_enum_name()+',',
("nodata" if msg_type in nodata else name)+',', ("nodata" if msg_class in nodata else name)+',',
msg_type.get_var_num(), msg_class.get_var_num(),
msg_type.__doc__.strip(), msg_class.__doc__.strip(),
)) ))
else: else:
macro_data.append(( macro_data.append((

View file

@ -47,7 +47,11 @@ class MeshMessageType(IntEnum):
@property @property
def pretty_name(self): 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') M = TypeVar('M', bound='MeshMessage')
@ -64,10 +68,10 @@ class ChipType(IntEnum):
@dataclass @dataclass
class MeshMessage(StructType, union_type_field="msg_id"): class MeshMessage(StructType, union_type_field="msg_type"):
dst: str = field(metadata={"format": MacAddressFormat()}) dst: str = field(metadata={"format": MacAddressFormat()})
src: 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_structs = {}
c_struct_name = None c_struct_name = None
@ -106,7 +110,7 @@ class MeshMessage(StructType, union_type_field="msg_id"):
@dataclass @dataclass
class NoopMessage(MeshMessage, msg_id=MeshMessageType.NOOP): class NoopMessage(MeshMessage, msg_type=MeshMessageType.NOOP):
""" noop """ """ noop """
pass pass
@ -122,25 +126,25 @@ class BaseEchoMessage(MeshMessage, c_struct_name="echo"):
@dataclass @dataclass
class EchoRequestMessage(BaseEchoMessage, msg_id=MeshMessageType.ECHO_REQUEST): class EchoRequestMessage(BaseEchoMessage, msg_type=MeshMessageType.ECHO_REQUEST):
""" repeat back string """ """ repeat back string """
pass pass
@dataclass @dataclass
class EchoResponseMessage(BaseEchoMessage, msg_id=MeshMessageType.ECHO_RESPONSE): class EchoResponseMessage(BaseEchoMessage, msg_type=MeshMessageType.ECHO_RESPONSE):
""" repeat back string """ """ repeat back string """
pass pass
@dataclass @dataclass
class MeshSigninMessage(MeshMessage, msg_id=MeshMessageType.MESH_SIGNIN): class MeshSigninMessage(MeshMessage, msg_type=MeshMessageType.MESH_SIGNIN):
""" node says hello to upstream node """ """ node says hello to upstream node """
pass pass
@dataclass @dataclass
class MeshLayerAnnounceMessage(MeshMessage, msg_id=MeshMessageType.MESH_LAYER_ANNOUNCE): class MeshLayerAnnounceMessage(MeshMessage, msg_type=MeshMessageType.MESH_LAYER_ANNOUNCE):
""" upstream node announces layer number """ """ upstream node announces layer number """
layer: int = field(metadata={ layer: int = field(metadata={
"format": SimpleFormat('B'), "format": SimpleFormat('B'),
@ -159,19 +163,19 @@ class BaseDestinationsMessage(MeshMessage, c_struct_name="destinations"):
@dataclass @dataclass
class MeshAddDestinationsMessage(BaseDestinationsMessage, msg_id=MeshMessageType.MESH_ADD_DESTINATIONS): class MeshAddDestinationsMessage(BaseDestinationsMessage, msg_type=MeshMessageType.MESH_ADD_DESTINATIONS):
""" downstream node announces served destination """ """ downstream node announces served destination """
pass pass
@dataclass @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 """ """ downstream node announces no longer served destination """
pass pass
@dataclass @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 routing information for node """
request_id: int = field(metadata={"format": SimpleFormat('I')}) request_id: int = field(metadata={"format": SimpleFormat('I')})
address: str = field(metadata={ address: str = field(metadata={
@ -181,7 +185,7 @@ class MeshRouteRequestMessage(MeshMessage, msg_id=MeshMessageType.MESH_ROUTE_REQ
@dataclass @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 """ """ reporting the routing table entry to the given address """
request_id: int = field(metadata={"format": SimpleFormat('I')}) request_id: int = field(metadata={"format": SimpleFormat('I')})
route: str = field(metadata={ route: str = field(metadata={
@ -191,7 +195,7 @@ class MeshRouteResponseMessage(MeshMessage, msg_id=MeshMessageType.MESH_ROUTE_RE
@dataclass @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 """ """ special message, collects all hop adresses on its way """
request_id: int = field(metadata={"format": SimpleFormat('I')}) request_id: int = field(metadata={"format": SimpleFormat('I')})
trace: list[str] = field(default_factory=list, metadata={ trace: list[str] = field(default_factory=list, metadata={
@ -201,19 +205,19 @@ class MeshRouteTraceMessage(MeshMessage, msg_id=MeshMessageType.MESH_ROUTE_TRACE
@dataclass @dataclass
class MeshRoutingFailedMessage(MeshMessage, msg_id=MeshMessageType.MESH_ROUTING_FAILED): class MeshRoutingFailedMessage(MeshMessage, msg_type=MeshMessageType.MESH_ROUTING_FAILED):
""" TODO description""" """ TODO description"""
address: str = field(metadata={"format": MacAddressFormat()}) address: str = field(metadata={"format": MacAddressFormat()})
@dataclass @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 """ """ request for the node to dump its config """
pass pass
@dataclass @dataclass
class ConfigHardwareMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_HARDWARE): class ConfigHardwareMessage(MeshMessage, msg_type=MeshMessageType.CONFIG_HARDWARE):
""" respond hardware/chip info """ """ respond hardware/chip info """
chip: ChipType = field(metadata={ chip: ChipType = field(metadata={
"format": EnumFormat("H"), "format": EnumFormat("H"),
@ -227,19 +231,19 @@ class ConfigHardwareMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_HARDWARE)
@dataclass @dataclass
class ConfigBoardMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_BOARD): class ConfigBoardMessage(MeshMessage, msg_type=MeshMessageType.CONFIG_BOARD):
""" set/respond board config """ """ set/respond board config """
board_config: BoardConfig = field(metadata={"c_embed": True, "json_embed": True}) board_config: BoardConfig = field(metadata={"c_embed": True, "json_embed": True})
@dataclass @dataclass
class ConfigFirmwareMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_FIRMWARE): class ConfigFirmwareMessage(MeshMessage, msg_type=MeshMessageType.CONFIG_FIRMWARE):
""" respond firmware info """ """ respond firmware info """
app_desc: FirmwareAppDescription = field(metadata={'json_embed': True}) app_desc: FirmwareAppDescription = field(metadata={'json_embed': True})
@dataclass @dataclass
class ConfigPositionMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_POSITION): class ConfigPositionMessage(MeshMessage, msg_type=MeshMessageType.CONFIG_POSITION):
""" set/respond position config """ """ set/respond position config """
x_pos: int = field(metadata={"format": SimpleFormat('i')}) x_pos: int = field(metadata={"format": SimpleFormat('i')})
y_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 @dataclass
class ConfigUplinkMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_UPLINK): class ConfigUplinkMessage(MeshMessage, msg_type=MeshMessageType.CONFIG_UPLINK):
""" set/respond uplink config """ """ set/respond uplink config """
enabled: bool = field(metadata={"format": BoolFormat()}) enabled: bool = field(metadata={"format": BoolFormat()})
ssid: str = field(metadata={"format": FixedStrFormat(32)}) ssid: str = field(metadata={"format": FixedStrFormat(32)})
@ -260,12 +264,12 @@ class ConfigUplinkMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_UPLINK):
@dataclass @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 """ """ request to report distance to all nearby nodes """
pass pass
@dataclass @dataclass
class LocateRangeResults(MeshMessage, msg_id=MeshMessageType.LOCATE_RANGE_RESULTS): class LocateRangeResults(MeshMessage, msg_type=MeshMessageType.LOCATE_RANGE_RESULTS):
""" reports distance to given nodes """ """ reports distance to given nodes """
ranges: dict[str, int] = field(metadata={"format": VarArrayFormat(RangeItemType)}) ranges: dict[str, int] = field(metadata={"format": VarArrayFormat(RangeItemType)})