#!/usr/bin/python3

import serial
import sys
import time
import os

K = 1024.0
M = K * K
G = K * K * K


def human(x):
    if x >= G:
        return "%.2fGiB" % (x / G)
    if x >= M:
        return "%.2fMiB" % (x / M)
    if x >= K:
        return "%.2fKiB" % (x / K)
    return "%dB" % x


def main():
    global c0
    s = serial.serial_for_url(
        "/dev/serial/by-id/usb-Adafruit_QT_Py_RP2040_DF609072DB5C3F28-if02"
    )
    s.timeout = None
    c = -1
    if len(sys.argv) > 1:
        c = int(sys.argv[1])

    t0 = time.time()
    c0 = c
    b = 0

    while c:
        if c == -1:
            a = 4096
        else:
            a = min(c, 4096)
        r = os.read(s.fileno(), a)
        a = len(r)
        if c != -1:
            c -= a
        b += a
        try:
            sys.stdout.buffer.write(r)
        except BrokenPipeError:
            break
        t1 = time.time()
        sp = "%s/s" % human(b / (t1 - t0))
        if c == -1:
            sys.stderr.write("# %10s @ %s\r" % (human(b), sp))
        else:
            sys.stderr.write("# %10s/%10s @ %s %d\r" % (human(b), human(c0), sp, a))
        sys.stdout.flush()
        if a < c:
            time.sleep(0.01)


if __name__ == "__main__":
    try:
        main()
    except (KeyboardInterrupt, IOError):
        sys.stderr.write("\n")
        if c0 != -1:
            raise