#!/usr/bin/env python3
import cereal.messaging as messaging
from typing import Optional

if __name__ == "__main__":
  modeld_sock = messaging.sub_sock("modelV2")

  last_frame_id = None
  start_t: Optional[int] = None
  frame_cnt = 0
  dropped = 0

  while True:
    m = messaging.recv_one(modeld_sock)
    if m is None:
      continue

    frame_id = m.modelV2.frameId
    t = m.logMonoTime / 1e9
    frame_cnt += 1

    if start_t is None:
      start_t = t
      last_frame_id = frame_id
      continue

    d_frame = frame_id - last_frame_id
    dropped += d_frame - 1

    expected_num_frames = int((t - start_t) * 20)
    frame_drop = 100 * (1 - (expected_num_frames / frame_cnt))
    print(f"Num dropped {dropped}, Drop compared to 20Hz: {frame_drop:.2f}%")

    last_frame_id = frame_id
