msg_id → msg_type
This commit is contained in:
parent
9bee0bf774
commit
bf1834cd63
6 changed files with 50 additions and 46 deletions
|
@ -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>
|
||||||
|
|
|
@ -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"],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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"]}
|
||||||
|
|
||||||
|
|
|
@ -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(),
|
||||||
}
|
}
|
||||||
|
|
|
@ -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((
|
||||||
|
|
|
@ -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)})
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue