"""This prints out all parsed ITM packets.

Connect a USB to Serial converter to the SWO pin and then provide the serial
device to this script. It should be 1MBaud SWO signal. CTRL-C when you've
captured enough data and then it'll process and output.

pip install pysigrok-libsigrokdecode
python tools/swo_viewer.py /dev/ttyACM0
"""

import serial
import sys
import sigrokdecode
import time
import json

decoder = sigrokdecode.get_decoder("arm_itm")()

decoder.reset()
decoder.options = {"objdump": "", "elffile": ""}
decoder.start()

dwt_timestamp = 0
last_dwt_timestamp = 0
streak = 0

stack = []


def decoder_cb(ss, es, data):
    global streak
    global last_dwt_timestamp
    print(dwt_timestamp, ss, es, data)


decoder.add_callback(sigrokdecode.OUTPUT_ANN, None, decoder_cb)

s = serial.Serial(sys.argv[-2], 1000000)

buffers = []
while True:
    try:
        start_ts = time.monotonic_ns()
        b = s.read(s.in_waiting)
        if b:
            end_ts = time.monotonic_ns()
            buffers.append((start_ts, end_ts, b))
            # print(len(b))
            # if len(buffers) > 10:
            #     break
    except KeyboardInterrupt:
        break

time_per_bit = 1_000_000_000 / 1000000

min_gap = 100000000
total_bytes = 0
for start_ts, end_ts, buf in buffers:
    # print(total_bytes, start_ts, end_ts, buf)
    ts_per_byte = (end_ts - start_ts) / len(buf)
    for i, b in enumerate(buf):
        # print(total_bytes, hex(b))
        total_bytes += 1
        decoder.decode(
            start_ts + ts_per_byte * i, start_ts + ts_per_byte * (i + 1), ("DATA", None, (b,))
        )
        dwt_timestamp = decoder.dwt_timestamp