diff options
Diffstat (limited to 'gm_platform/fw/tw_test.py')
-rw-r--r-- | gm_platform/fw/tw_test.py | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/gm_platform/fw/tw_test.py b/gm_platform/fw/tw_test.py new file mode 100644 index 0000000..0380f95 --- /dev/null +++ b/gm_platform/fw/tw_test.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 + +from time import time +from binascii import hexlify +import enum +import struct +import zlib +import sys + +import serial +from cobs import cobs + + +class CtrlPacketTypes(enum.Enum): + RESET = 1 + ACK = 2 + RETRANSMIT = 3 + +def unpack_head(fmt, data): + split = struct.calcsize(fmt) + return *struct.unpack(fmt, data[:split]), data[split:] + +def ctrl_packet(ptype, pid=0): + return cobs.encode(struct.pack('BB', ptype.value, pid)) + b'\0' + +ctrl_reset = lambda: ctrl_packet(CtrlPacketTypes.RESET) +ctrl_ack = lambda pid: ctrl_packet(CtrlPacketTypes.ACK, pid) +ctrl_retransmit = lambda pid: ctrl_packet(CtrlPacketTypes.RETRANSMIT, pid) + + +ser = serial.Serial('/dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0', 250000, timeout=1.0) +ser.write(b'foobar'*32) +sys.exit(0) + +log = [] +ser.flushInput() +ser.write(ctrl_reset()) +ser.flushOutput() +for _ in range(100): + #ser.write(cobs.encode(b'\x01\xff') + b'\0') + data = ser.read_until(b'\0') + if not data or data[-1] != 0x00: + #print(f'{time():>7.3f} Timeout: resetting') + #ser.write(cobs.encode(b'\x01\xff') + b'\0') # reset + continue + + crc32, payload = unpack_head('I', cobs.decode(data[:-1])) + pid, seq, data = unpack_head('xBH', payload) + ser.write(ctrl_ack(pid)) + ser.flushOutput() + + # Calculate byte-wise CRC32 + #our_crc = zlib.crc32(bytes(b for x in payload for b in (0, 0, 0, x))) + our_crc = 0 + #log.append((time(), seq, crc32, our_crc, pid, data)) + +for time, seq, crc32, our_crc, pid, data in log: + print(f'{time:>7.3f} {seq:05d} {crc32:08x} {our_crc:08x} {pid} {hexlify(data).decode()}') |