more mesh_msg export stuffs

This commit is contained in:
Laura Klünder 2023-10-05 20:55:36 +02:00
parent 7a13193acd
commit 16f47168a2
3 changed files with 85 additions and 42 deletions

View file

@ -2,22 +2,27 @@ from dataclasses import fields
from django.core.management.base import BaseCommand
from c3nav.mesh.dataformats import normalize_name
from c3nav.mesh.messages import MeshMessage
from c3nav.mesh.dataformats import normalize_name, LedConfig
from c3nav.mesh.messages import MeshMessage, MeshMessageType
from c3nav.mesh.utils import indent_c
class Command(BaseCommand):
help = 'export mesh message structs for c code'
def shorten_name(self, name):
name = name.replace('config', 'cfg')
name = name.replace('position', 'pos')
name = name.replace('mesh_', '')
name = name.replace('firmware', 'fw')
return name
def handle(self, *args, **options):
done_struct_names = set()
nodata = set()
struct_lines = {}
ignore_names = set(field_.name for field_ in fields(MeshMessage))
from pprint import pprint
pprint(MeshMessage.get_msg_types())
for msg_id, msg_type in MeshMessage.get_msg_types().items():
if msg_type.c_struct_name:
if msg_type.c_struct_name in done_struct_names:
@ -25,16 +30,22 @@ class Command(BaseCommand):
done_struct_names.add(msg_type.c_struct_name)
msg_type = MeshMessage.c_structs[msg_type.c_struct_name]
name = "mesh_msg_%s_t" % (
msg_type.c_struct_name or normalize_name(getattr(msg_id, 'name', msg_type.__name__))
)
base_name = (msg_type.c_struct_name or self.shorten_name(normalize_name(
getattr(msg_id, 'name', msg_type.__name__)
)))
name = "mesh_msg_%s_t" % base_name
if msg_id == MeshMessageType.CONFIG_LED:
msg_type = LedConfig
code = msg_type.get_c_code(name, ignore_fields=ignore_names, no_empty=True)
if code:
struct_lines[base_name] = "%s %s;" % (name, base_name.replace('_announce', ''))
print(code)
print()
else:
nodata.add(msg_type)
return
print("/** union between all message data structs */")
print("typedef union __packed {")
for line in struct_lines.values():
@ -42,14 +53,17 @@ class Command(BaseCommand):
print("} mesh_msg_data_t;")
print()
max_msg_type = max(MeshMessage.msg_types.keys())
max_msg_type = max(MeshMessage.get_msg_types().keys())
macro_data = []
for i in range(((max_msg_type//16)+1)*16):
msg_type = MeshMessage.msg_types.get(i, None)
msg_type = MeshMessage.get_msg_types().get(i, None)
if msg_type:
name = (msg_type.c_struct_name or self.shorten_name(normalize_name(
getattr(msg_type.msg_id, 'name', msg_type.__name__)
)))
macro_data.append((
msg_type.get_c_enum_name()+',',
("nodata" if msg_type in nodata else msg_type.get_c_struct_name())+',',
("nodata" if msg_type in nodata else name)+',',
msg_type.get_var_num(),
msg_type.__doc__.strip(),
))