add all config mesh messages
This commit is contained in:
parent
5e24ad4f2a
commit
2d4d66b6ef
1 changed files with 77 additions and 3 deletions
|
@ -31,6 +31,14 @@ class FixedStrFormat:
|
||||||
return struct.unpack('%ss' % self.num, data[:self.num])[0].rstrip(bytes((0, ))).decode(), data[self.num:]
|
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:
|
class HexFormat:
|
||||||
def __init__(self, num, sep=''):
|
def __init__(self, num, sep=''):
|
||||||
self.num = num
|
self.num = num
|
||||||
|
@ -70,7 +78,49 @@ class MacAddressesListFormat:
|
||||||
)
|
)
|
||||||
|
|
||||||
def decode(self, data: bytes):
|
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
|
@dataclass
|
||||||
|
@ -143,11 +193,35 @@ class ConfigDumpMessage(Message, msg_id=0x10):
|
||||||
class ConfigFirmwareMessage(Message, msg_id=0x11):
|
class ConfigFirmwareMessage(Message, msg_id=0x11):
|
||||||
magic_word: int = field(metadata={'format': SimpleFormat('I')}, repr=False)
|
magic_word: int = field(metadata={'format': SimpleFormat('I')}, repr=False)
|
||||||
secure_version: int = field(metadata={'format': SimpleFormat('I')})
|
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)})
|
version: str = field(metadata={'format': FixedStrFormat(32)})
|
||||||
project_name: str = field(metadata={'format': FixedStrFormat(32)})
|
project_name: str = field(metadata={'format': FixedStrFormat(32)})
|
||||||
compile_time: str = field(metadata={'format': FixedStrFormat(16)})
|
compile_time: str = field(metadata={'format': FixedStrFormat(16)})
|
||||||
compile_date: str = field(metadata={'format': FixedStrFormat(16)})
|
compile_date: str = field(metadata={'format': FixedStrFormat(16)})
|
||||||
idf_version: str = field(metadata={'format': FixedStrFormat(32)})
|
idf_version: str = field(metadata={'format': FixedStrFormat(32)})
|
||||||
app_elf_sha256: str = field(metadata={'format': HexFormat(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')})
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue