#!/usr/bin/env python3 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								import  cereal . messaging  as  messaging 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								from  laika  import  constants 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								if  __name__  ==  " __main__ " : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  sm  =  messaging . SubMaster ( [ ' ubloxGnss ' ,  ' qcomGnss ' ] ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  meas  =  None 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  while  1 : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    sm . update ( ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  sm [ ' ubloxGnss ' ] . which ( )  ==  " measurementReport " : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      meas  =  sm [ ' ubloxGnss ' ] . measurementReport . measurements 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  not  sm . updated [ ' qcomGnss ' ]  or  meas  is  None : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      continue 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    report  =  sm [ ' qcomGnss ' ] . measurementReport 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  report . source  not  in  [ 0 ,  1 ] : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      continue 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    GLONASS  =  report . source  ==  1 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    recv_time  =  report . milliseconds  /  1000 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    car  =  [ ] 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    print ( " qcom has  " ,  list ( sorted ( [ x . svId  for  x  in  report . sv ] ) ) ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    print ( " ublox has " ,  list ( sorted ( [ x . svId  for  x  in  meas  if  x . gnssId  ==  ( 6  if  GLONASS  else  0 ) ] ) ) ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    for  i  in  report . sv : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      # match to ublox 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      tm  =  None 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      for  m  in  meas : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  i . svId  ==  m . svId  and  m . gnssId  ==  0  and  m . sigId  ==  0  and  not  GLONASS : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          tm  =  m 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( i . svId - 64 )  ==  m . svId  and  m . gnssId  ==  6  and  m . sigId  ==  0  and  GLONASS : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          tm  =  m 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      if  tm  is  None : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        continue 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      if  not  i . measurementStatus . measurementNotUsable  and  i . measurementStatus . satelliteTimeIsKnown : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        sat_time  =  ( i . unfilteredMeasurementIntegral  +  i . unfilteredMeasurementFraction  +  i . latency )  /  1000 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ublox_psuedorange  =  tm . pseudorange 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        qcom_psuedorange  =  ( recv_time  -  sat_time ) * constants . SPEED_OF_LIGHT 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  GLONASS : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          glonass_freq  =  tm . glonassFrequencyIndex  -  7 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          ublox_speed  =  - ( constants . SPEED_OF_LIGHT  /  ( constants . GLONASS_L1  +  glonass_freq * constants . GLONASS_L1_DELTA ) )  *  ( tm . doppler ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        else : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          ublox_speed  =  - ( constants . SPEED_OF_LIGHT  /  constants . GPS_L1 )  *  tm . doppler 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        qcom_speed  =  i . unfilteredSpeed 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        car . append ( ( i . svId ,  tm . pseudorange ,  ublox_speed ,  qcom_psuedorange ,  qcom_speed ,  tm . cno ) ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  len ( car )  ==  0 : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      print ( " nothing to compare " ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      continue 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    pr_err ,  speed_err  =  0. ,  0. 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    for  c  in  car : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      ublox_psuedorange ,  ublox_speed ,  qcom_psuedorange ,  qcom_speed  =  c [ 1 : 5 ] 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      pr_err  + =  ublox_psuedorange  -  qcom_psuedorange 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      speed_err  + =  ublox_speed  -  qcom_speed 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    pr_err  / =  len ( car ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    speed_err  / =  len ( car ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    print ( " avg psuedorange err  %f  avg speed err  %f "  %  ( pr_err ,  speed_err ) ) 
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    for  c  in  sorted ( car ,  key = lambda  x :  abs ( x [ 1 ]  -  x [ 3 ]  -  pr_err ) ) : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      svid ,  ublox_psuedorange ,  ublox_speed ,  qcom_psuedorange ,  qcom_speed ,  cno  =  c 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      print ( " svid:  %3d   pseudorange:  %10.2f  m  speed:  %8.2f  m/s   meas:  %12.2f   speed:  %10.2f    meas_err:  %10.3f  speed_err:  %8.3f  cno:  %d "  % 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ( svid ,  ublox_psuedorange ,  ublox_speed ,  qcom_psuedorange ,  qcom_speed , 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ublox_psuedorange  -  qcom_psuedorange  -  pr_err ,  ublox_speed  -  qcom_speed  -  speed_err ,  cno ) )