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

import os
from selfdrive.locationd.test import ublox
from common import realtime
from selfdrive.locationd.test.ubloxd import gen_raw, gen_solution
import zmq
import cereal.messaging as messaging


unlogger = os.getenv("UNLOGGER") is not None   # debug prints

def main():
  poller = zmq.Poller()

  gpsLocationExternal = messaging.pub_sock('gpsLocationExternal')
  ubloxGnss = messaging.pub_sock('ubloxGnss')

  # ubloxRaw = messaging.sub_sock('ubloxRaw', poller)

  # buffer with all the messages that still need to be input into the kalman
  while 1:
    polld = poller.poll(timeout=1000)
    for sock, mode in polld:
      if mode != zmq.POLLIN:
        continue
      logs = messaging.drain_sock(sock)
      for log in logs:
        buff = log.ubloxRaw
        time = log.logMonoTime
        msg = ublox.UBloxMessage()
        msg.add(buff)
        if msg.valid():
          if msg.name() == 'NAV_PVT':
            sol = gen_solution(msg)
            if unlogger:
              sol.logMonoTime = time
            else:
              sol.logMonoTime = int(realtime.sec_since_boot() * 1e9)
            gpsLocationExternal.send(sol.to_bytes())
          elif msg.name() == 'RXM_RAW':
            raw = gen_raw(msg)
            if unlogger:
              raw.logMonoTime = time
            else:
              raw.logMonoTime = int(realtime.sec_since_boot() * 1e9)
            ubloxGnss.send(raw.to_bytes())
        else:
          print("INVALID MESSAGE")


if __name__ == "__main__":
  main()
