text: #!/usr/bin/env python
  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 selfdrive.messaging as messaging
  from selfdrive.services import service_list
  
  
  unlogger = os.getenv("UNLOGGER") is not None   # debug prints
  
  def main(gctx=None):
    context = zmq.Context()
    poller = zmq.Poller()
  
    context = zmq.Context()
    gpsLocationExternal = messaging.pub_sock(context, service_list['gpsLocationExternal'].port)
    ubloxGnss = messaging.pub_sock(context, service_list['ubloxGnss'].port)
  
    # ubloxRaw = messaging.sub_sock(context, service_list['ubloxRaw'].port, 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()
  