From 65ed589e8b2915f30fd02e962dbe32505f9427a7 Mon Sep 17 00:00:00 2001 From: Mikhail Yudin Date: Fri, 19 May 2023 01:11:36 +0700 Subject: [PATCH] feat: read all channel names --- read-settings.py | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/read-settings.py b/read-settings.py index 50c5a10..ec3d399 100755 --- a/read-settings.py +++ b/read-settings.py @@ -8,6 +8,8 @@ from time import time from serial import Serial KEY = bytes.fromhex('166c14e62e910d402135d5401303e980') +BLOCK_SIZE = 0x80 + PREAMBLE = b'\xab\xcd' POSTAMBLE = b'\xdc\xba' @@ -17,15 +19,13 @@ CMD_VERSION_RES = 0x0515 CMD_SETTINGS_REQ = 0x051B CMD_SETTINGS_RES = 0x051C +TIMESTAMP = int(time()).to_bytes(4, 'little') + def xor(var): return bytes(a ^ b for a, b in zip(var, cycle(KEY))) -def timestamp32(): - return int(time()).to_bytes(4, 'little') - - def i2b16(cmd_id): return cmd_id.to_bytes(2,'little') @@ -43,7 +43,7 @@ def crc16(data): def cmd_make_req(cmd_id, body=b''): - data = body + timestamp32() + data = body + TIMESTAMP payload = i2b16(cmd_id) + len16(data) + data encoded_payload = xor(payload + crc16(payload)) @@ -57,10 +57,12 @@ def cmd_resp(cmd_id, data): return if cmd_id == CMD_SETTINGS_RES: - print('Channels:') + channels_offset = b2i(data[:2]) + channels_size = b2i(data[2:4]) + print(f'Channels({channels_offset}, {channels_size}):') channel_names = data[4:] for i in range(len(channel_names)//16): - print(channel_names[i*16:(i+1)*16].decode()) + print(channel_names[i*16:(i+1)*16].decode(errors='ignore')) return @@ -68,39 +70,43 @@ class UVK5(Serial): def __init__(self, port: str | None = None) -> None: super().__init__(port, 38400, timeout=5) + def read_mem(self, offset, size): + return self.cmd(CMD_SETTINGS_REQ, i2b16(offset) + i2b16(size)) def cmd(self, id, body = b''): self.write(cmd_make_req(id, body)) preamble = self.read(2) if preamble != PREAMBLE: - print('Bad response (PRE)') - exit(128) + raise ValueError('Bad response (PRE)') - payload_len = b2i(self.read(2)) - data = xor(self.read(payload_len)) + payload_len = b2i(self.read(2)) + 2 # CRC len + payload = xor(self.read(payload_len)) - self.read(2) + # crc = payload[-2:] postamble = self.read(2) if postamble != POSTAMBLE: - print('Bad response (POST)') - exit(128) + raise ValueError('Bad response (POST)') # print(data.hex()) - cmd_id = b2i(data[:2]) - data_len = b2i(data[2:4]) + cmd_id = b2i(payload[:2]) + data_len = b2i(payload[2:4]) + data = payload[4:4+data_len] - return (cmd_id, data[4:4+data_len]) + return (cmd_id, data) def main(port): with UVK5(port) as s: resp_ver = s.cmd(CMD_VERSION_REQ) cmd_resp(*resp_ver) - - resp_cfg = s.cmd(CMD_SETTINGS_REQ, i2b16(0x0F50) + i2b16(0x0C80)) - cmd_resp(*resp_cfg) + size = 16*8 + for i in range(int(0xc80/size)): + offset = 0x0F50 + i*size + print('0x%x 0x%x' % (offset, size)) + resp_cfg = s.read_mem(offset, size) + cmd_resp(*resp_cfg) if __name__ == '__main__':