summaryrefslogtreecommitdiff
path: root/gm_platform/fw/tw_test.py
diff options
context:
space:
mode:
authorjaseg <git-bigdata-wsl-arch@jaseg.de>2021-04-09 18:38:02 +0200
committerjaseg <git-bigdata-wsl-arch@jaseg.de>2021-04-09 18:38:57 +0200
commit50998fcfb916ae251309bd4b464f2c122e8cb30d (patch)
tree4ecf7a7443b75ab51c4dc0c0fc9289342dc7d6a0 /gm_platform/fw/tw_test.py
parent312fee491cfab436d52db4b6265107e20f3e1293 (diff)
downloadmaster-thesis-50998fcfb916ae251309bd4b464f2c122e8cb30d.tar.gz
master-thesis-50998fcfb916ae251309bd4b464f2c122e8cb30d.tar.bz2
master-thesis-50998fcfb916ae251309bd4b464f2c122e8cb30d.zip
Repo re-org
Diffstat (limited to 'gm_platform/fw/tw_test.py')
-rw-r--r--gm_platform/fw/tw_test.py139
1 files changed, 0 insertions, 139 deletions
diff --git a/gm_platform/fw/tw_test.py b/gm_platform/fw/tw_test.py
deleted file mode 100644
index e329abd..0000000
--- a/gm_platform/fw/tw_test.py
+++ /dev/null
@@ -1,139 +0,0 @@
-#!/usr/bin/env python3
-
-import os
-from time import time
-from binascii import hexlify
-import enum
-import struct
-import zlib
-import sys
-import sqlite3
-
-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)
-
-if __name__ == '__main__':
- import argparse
- parser = argparse.ArgumentParser()
-
- parser.add_argument('-b', '--baudrate', type=int, default=250000)
- parser.add_argument('port', nargs='?', default=None)
- parser.add_argument('dbfile')
- args = parser.parse_args()
-
- if args.port is None:
- try:
- candidate, = os.listdir('/dev/serial/by-id')
- args.port = os.path.join('/dev/serial/by-id', candidate)
- print(f'No port given, guessing {args.port}')
-
- except:
- print('No port given and could not guess port. Exiting.')
- sys.exit(1)
-
- ser = serial.Serial(args.port, args.baudrate, timeout=1.0)
- db = sqlite3.connect(args.dbfile)
- db.execute('CREATE TABLE IF NOT EXISTS measurements (run_id INTEGER, rx_ts INTEGER, seq INTEGER, data BLOB)')
- db.execute('''CREATE TABLE IF NOT EXISTS errors (
- run_id INTEGER,
- rx_ts INTEGER,
- type TEXT,
- seq INTEGER,
- pid INTEGER,
- pid_expected INTEGER,
- crc32 INTEGER,
- crc32_expected INTEGER,
- data BLOB)''')
- run_id, = db.execute('SELECT IFNULL(MAX(run_id), -1) + 1 FROM measurements').fetchone()
-
- ser.flushInput()
- ser.write(ctrl_reset())
- ser.flushOutput()
-
- last_pid = None
- lines_written = 0
- cur = db.cursor()
- capture_start = time()
- while True:
- #ser.write(cobs.encode(b'\x01\xff') + b'\0')
- data = ser.read_until(b'\0')
- for data in data.split(b'\0')[:-1]: # data always ends on \0 due to read_until, so split off the trailing empty bytes()
- try:
- if not data:
- #print(f'{time():>7.3f} Timeout: resetting')
- #ser.write(cobs.encode(b'\x01\xff') + b'\0') # reset
- ser.write(ctrl_ack(0)) # FIXME delet this
- cur.execute('INSERT INTO errors(run_id, rx_ts, type) VALUES (?, ?, "retransmission")',
- (run_id, int(time()*1000)))
- continue
-
- crc32, payload = unpack_head('I', cobs.decode(data))
- pid, seq, data = unpack_head('xBH', payload)
- ts = time()
-
- # Calculate byte-wise CRC32
- our_crc = zlib.crc32(bytes(b for x in payload for b in (0, 0, 0, x)))
- #log.append((time(), seq, crc32, our_crc, pid, data))
- bars = '\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588'
- sparkline = ''.join(bars[int(x/4096*8)] for x in struct.unpack('<32H', data))
- print(f'\033[38;5;249m{ts-capture_start:>10.3f}',
- f'\033[94m{seq:05d}',
- f'\033[38;5;243m{crc32:08x}',
- f'\033[38;5;243m{our_crc:08x}',
- f'\033[38;5;243m{pid}',
- f'\033[0m{hexlify(data).decode()}',
- f'\033[94m{sparkline}\033[0m', end='')
-
- error = False
- suppress_ack = False
- if crc32 != our_crc:
- print(' \033[1;91mCRC ERROR\033[0m', end='')
- suppress_ack = True
- error = True
-
- if last_pid is not None and pid != (last_pid+1)%8:
- print(' \033[1;93mPID ERROR\033[0m', end='')
- error = True
- else:
- last_pid = pid
-
- if not suppress_ack:
- ser.write(ctrl_ack(pid))
- ser.flushOutput()
-
- if not suppress_ack:
- cur.execute('INSERT INTO measurements VALUES (?, ?, ?, ?)', (run_id, int(ts*1000), seq, data))
- if error:
- cur.execute('INSERT INTO errors VALUES (?, ?, "pid", ?, ?, ?, ?, ?, ?)',
- (run_id, int(ts*1000), seq, pid, (last_pid+1)%8, crc32, our_crc, data))
-
- print()
- lines_written += 1
- if lines_written == 80:
- lines_written = 0
- print('\033[2J\033[H', end='')
- delta = ts-capture_start
- print(f'\033[7mRun {run_id}, capturing for {delta//3600//24:> 3.0f}:{delta//3600%24:02.0f}:{delta//60%60:02.0f}:{delta%60:06.3f}\033[0m')
- db.commit()
-
- except Exception as e:
- print(e, len(data))
- ser.write(ctrl_ack(0)) # FIXME delet this
-