kopia lustrzana https://github.com/fagci/qs-uvk5-firmware-modder
feat: read all channel names
rodzic
a24584e2a6
commit
65ed589e8b
|
@ -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__':
|
||||
|
|
Ładowanie…
Reference in New Issue