#!/usr/bin/env python3
# type: ignore

import os
import argparse
import struct
from collections import deque
from statistics import mean

from cereal import log
import cereal.messaging as messaging

if __name__ == "__main__":

  parser = argparse.ArgumentParser(description='Sniff a communication socket')
  parser.add_argument('--addr', default='127.0.0.1')
  args = parser.parse_args()

  if args.addr != "127.0.0.1":
    os.environ["ZMQ"] = "1"
    messaging.context = messaging.Context()

  poller = messaging.Poller()
  messaging.sub_sock('can', poller, addr=args.addr)

  active = 0
  start_t = 0
  start_v = 0
  max_v = 0
  max_t = 0
  window = deque(maxlen=10)
  avg = 0
  while 1:
    polld = poller.poll(1000)
    for sock in polld:
      msg = sock.receive()
      with log.Event.from_bytes(msg) as log_evt:
        evt = log_evt

      for item in evt.can:
        if item.address == 0xe4 and item.src == 128:
          torque_req = struct.unpack('!h', item.dat[0:2])[0]
          # print(torque_req)
          active = abs(torque_req) > 0
          if abs(torque_req) < 100:
            if max_v > 5:
              print(f'{start_v} -> {max_v} = {round(max_v - start_v, 2)} over {round(max_t - start_t, 2)}s')
            start_t = evt.logMonoTime / 1e9
            start_v = avg
            max_t = 0
            max_v = 0
        if item.address == 0x1ab and item.src == 0:
          motor_torque = ((item.dat[0] & 0x3) << 8) + item.dat[1]
          window.append(motor_torque)
          avg = mean(window)
          #print(f'{evt.logMonoTime}: {avg}')
          if active and avg > max_v + 0.5:
            max_v = avg
            max_t = evt.logMonoTime / 1e9