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 %}
{% 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 }}">
<strong>{{ key }}</strong>: {{ value }}
</div>

View file

@ -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"],
}

View file

@ -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"]}

View file

@ -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(),
}

View file

@ -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((

View file

@ -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)})