#!/usr/bin/env python3
import unittest
from datetime import datetime
from laika import AstroDog
from laika . gps_time import GPSTime
from laika . helpers import ConstellationId
from laika . raw_gnss import GNSSMeasurement
from selfdrive . locationd . laikad import Laikad , create_measurement_msg
from selfdrive . test . openpilotci import get_url
from tools . lib . logreader import LogReader
def get_log ( segs = range ( 0 ) ) :
logs = [ ]
for i in segs :
logs . extend ( LogReader ( get_url ( " 4cf7a6ad03080c90|2021-09-29--13-46-36 " , i ) ) )
return [ m for m in logs if m . which ( ) == ' ubloxGnss ' ]
def verify_messages ( lr , dog , laikad ) :
good_msgs = [ ]
for m in lr :
msg = laikad . process_ublox_msg ( m . ubloxGnss , dog , m . logMonoTime )
if msg is not None and len ( msg . gnssMeasurements . correctedMeasurements ) > 0 :
good_msgs . append ( msg )
return good_msgs
class TestLaikad ( unittest . TestCase ) :
@classmethod
def setUpClass ( cls ) :
cls . logs = get_log ( range ( 1 ) )
def test_create_msg_without_errors ( self ) :
gpstime = GPSTime . from_datetime ( datetime . now ( ) )
meas = GNSSMeasurement ( ConstellationId . GPS , 1 , gpstime . week , gpstime . tow , { ' C1C ' : 0. , ' D1C ' : 0. } , { ' C1C ' : 0. , ' D1C ' : 0. } )
# Fake observables_final to be correct
meas . observables_final = meas . observables
msg = create_measurement_msg ( meas )
self . assertEqual ( msg . constellationId , ' gps ' )
def test_laika_online ( self ) :
# Set to offline forces to use ephemeris messages
dog = AstroDog ( use_internet = True )
laikad = Laikad ( )
correct_msgs = verify_messages ( self . logs , dog , laikad )
correct_msgs_expected = 560
self . assertEqual ( correct_msgs_expected , len ( correct_msgs ) )
self . assertEqual ( correct_msgs_expected , len ( [ m for m in correct_msgs if m . gnssMeasurements . positionECEF . valid ] ) )
if __name__ == " __main__ " :
unittest . main ( )