From 2d4d66b6efad6ebe3bf850438cc761bfa32356a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Wed, 6 Apr 2022 23:44:24 +0200 Subject: [PATCH] add all config mesh messages --- src/c3nav/mesh/messages.py | 80 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 77 insertions(+), 3 deletions(-) diff --git a/src/c3nav/mesh/messages.py b/src/c3nav/mesh/messages.py index eaeaf656..66aee846 100644 --- a/src/c3nav/mesh/messages.py +++ b/src/c3nav/mesh/messages.py @@ -31,6 +31,14 @@ class FixedStrFormat: return struct.unpack('%ss' % self.num, data[:self.num])[0].rstrip(bytes((0, ))).decode(), data[self.num:] +class BoolFormat: + def encode(self, value): + return struct.pack('B', (int(value), )) + + def decode(self, data: bytes): + return bool(struct.unpack('B', data[:1])[0]), data[1:] + + class HexFormat: def __init__(self, num, sep=''): self.num = num @@ -70,7 +78,49 @@ class MacAddressesListFormat: ) def decode(self, data: bytes): - return [MAC_FMT % tuple(data[1+6*i:1+6+6*i]) for i in range(data[0])], data[1+data[0]*6] + return [MAC_FMT % tuple(data[1+6*i:1+6+6*i]) for i in range(data[0])], data[1+data[0]*6:] + + +class LedConfig: + pass + + +@dataclass +class SerialLedConfig(LedConfig): + type = 1 + gpio: int + rmt: int + + +@dataclass +class MultipinLedConfig(LedConfig): + type = 2 + gpio_red: int + gpio_green: int + gpio_blue: int + + +class LedConfigFormat: + def encode(self, value) -> bytes: + if value is None: + return struct.pack('BBBB', (0, 0, 0, 0)) + if isinstance(value, SerialLedConfig): + return struct.pack('BBBB', (value.type, value.gpio, value.rmt, 0)) + if isinstance(value, MultipinLedConfig): + return struct.pack('BBBB', (value.type, value.gpio_red, value.gpio_green, value.gpio_blue)) + raise ValueError + + def decode(self, data: bytes): + type_, *bytes_ = struct.unpack('BBBB', data) + if type_ == 0: + value = None + elif type_ == 1: + value = SerialLedConfig(gpio=bytes_[0], rmt=bytes_[1]) + elif type_ == 2: + value = MultipinLedConfig(gpio_red=bytes_[0], gpio_green=bytes_[1], gpio_blue=bytes_[2]) + else: + raise ValueError + return value, data[4:] @dataclass @@ -143,11 +193,35 @@ class ConfigDumpMessage(Message, msg_id=0x10): class ConfigFirmwareMessage(Message, msg_id=0x11): magic_word: int = field(metadata={'format': SimpleFormat('I')}, repr=False) secure_version: int = field(metadata={'format': SimpleFormat('I')}) - reserv1: int = field(metadata={'format': SimpleFormat('2I')}, repr=False) + reserv1: list[int] = field(metadata={'format': SimpleFormat('2I')}, repr=False) version: str = field(metadata={'format': FixedStrFormat(32)}) project_name: str = field(metadata={'format': FixedStrFormat(32)}) compile_time: str = field(metadata={'format': FixedStrFormat(16)}) compile_date: str = field(metadata={'format': FixedStrFormat(16)}) idf_version: str = field(metadata={'format': FixedStrFormat(32)}) app_elf_sha256: str = field(metadata={'format': HexFormat(32)}) - reserv2: int = field(metadata={'format': SimpleFormat('20I')}, repr=False) + reserv2: list[int] = field(metadata={'format': SimpleFormat('20I')}, repr=False) + + +@dataclass +class ConfigPositionMessage(Message, msg_id=0x12): + x_pos: int = field(metadata={'format': SimpleFormat('I')}) + y_pos: int = field(metadata={'format': SimpleFormat('I')}) + z_pos: int = field(metadata={'format': SimpleFormat('H')}) + + +@dataclass +class ConfigLedMessage(Message, msg_id=0x13): + led_config: LedConfig = field(metadata={'format': LedConfigFormat()}) + + +@dataclass +class ConfigUplinkMessage(Message, msg_id=0x14): + enabled: bool = field(metadata={'format': BoolFormat()}) + ssid: str = field(metadata={'format': FixedStrFormat(32)}) + password: str = field(metadata={'format': FixedStrFormat(64)}) + channel: int = field(metadata={'format': SimpleFormat('B')}) + udp: bool = field(metadata={'format': BoolFormat()}) + ssl: bool = field(metadata={'format': BoolFormat()}) + host: str = field(metadata={'format': FixedStrFormat(64)}) + port: int = field(metadata={'format': SimpleFormat('H')})