#!/usr/bin/env python3 import argparse import pandas as pd import cereal.messaging as messaging def can_table(dat): rows = [] for b in dat: r = list(bin(b).lstrip('0b').zfill(8)) r += [hex(b)] rows.append(r) df = pd.DataFrame(data=rows) df.columns = [str(n) for n in range(7, -1, -1)] + [' '] table = df.to_markdown(tablefmt='grid') return table if __name__ == "__main__": parser = argparse.ArgumentParser(description="Cabana-like table of bits for your terminal", formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument("addr", type=str, nargs=1) parser.add_argument("bus", type=int, default=0, nargs='?') args = parser.parse_args() addr = int(args.addr[0], 0) can = messaging.sub_sock('can', conflate=False, timeout=None) print(f"waiting for {hex(addr)} ({addr}) on bus {args.bus}...") latest = None while True: for msg in messaging.drain_sock(can, wait_for_one=True): for m in msg.can: if m.address == addr and m.src == args.bus: latest = m if latest is None: continue table = can_table(latest.dat) print(f"\n\n{hex(addr)} ({addr}) on bus {args.bus}\n{table}")