You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							105 lines
						
					
					
						
							2.9 KiB
						
					
					
				
			
		
		
	
	
							105 lines
						
					
					
						
							2.9 KiB
						
					
					
				| #!/usr/bin/env python3
 | |
| import os
 | |
| import time
 | |
| import unittest
 | |
| 
 | |
| import cereal.messaging as messaging
 | |
| import system.sensord.pigeond as pd
 | |
| 
 | |
| from common.params import Params
 | |
| from system.hardware import TICI
 | |
| from selfdrive.manager.process_config import managed_processes
 | |
| from selfdrive.test.helpers import with_processes
 | |
| 
 | |
| 
 | |
| def wait_for_location(sm, timeout, con=10):
 | |
|   cons_meas = 0
 | |
|   start_time = time.monotonic()
 | |
|   while (time.monotonic() - start_time) < timeout:
 | |
|     sm.update()
 | |
|     if not sm.updated["gnssMeasurements"]:
 | |
|       continue
 | |
| 
 | |
|     msg = sm["gnssMeasurements"]
 | |
|     cons_meas = (cons_meas + 1) if 'positionECEF' in msg.to_dict() else 0
 | |
|     if cons_meas >= con:
 | |
|       return True
 | |
|   return False
 | |
| 
 | |
| 
 | |
| class TestLaikad(unittest.TestCase):
 | |
|   @classmethod
 | |
|   def setUpClass(self):
 | |
|     if not TICI:
 | |
|       raise unittest.SkipTest
 | |
| 
 | |
|     ublox_available = Params().get_bool("UbloxAvailable")
 | |
|     if not ublox_available:
 | |
|       raise unittest.SkipTest
 | |
| 
 | |
|   def setUp(self):
 | |
|     # ensure laikad cold start
 | |
|     Params().remove("LaikadEphemerisV3")
 | |
|     os.environ["LAIKAD_NO_INTERNET"] = "1"
 | |
|     managed_processes['laikad'].start()
 | |
| 
 | |
|   def tearDown(self):
 | |
|     managed_processes['laikad'].stop()
 | |
| 
 | |
| 
 | |
|   @with_processes(['pigeond', 'ubloxd'])
 | |
|   def test_laikad_cold_start(self):
 | |
|     time.sleep(5)
 | |
| 
 | |
|     start_time = time.monotonic()
 | |
|     sm = messaging.SubMaster(["gnssMeasurements"])
 | |
| 
 | |
|     success = wait_for_location(sm, 60*2, con=10)
 | |
|     duration = time.monotonic() - start_time
 | |
| 
 | |
|     assert success, "Waiting for location timed out (2min)!"
 | |
|     assert duration < 60, f"Received Location {duration}!"
 | |
| 
 | |
| 
 | |
|   @with_processes(['ubloxd'])
 | |
|   def test_laikad_ublox_reset_start(self):
 | |
|     time.sleep(2)
 | |
| 
 | |
|     pigeon, pm = pd.create_pigeon()
 | |
|     pd.init_baudrate(pigeon)
 | |
|     assert pigeon.reset_device(), "Could not reset device!"
 | |
| 
 | |
|     laikad_sock = messaging.sub_sock("gnssMeasurements", timeout=0.1)
 | |
|     ublox_gnss_sock = messaging.sub_sock("ubloxGnss", timeout=0.1)
 | |
| 
 | |
|     pd.init_baudrate(pigeon)
 | |
|     pd.initialize_pigeon(pigeon)
 | |
|     pd.run_receiving(pigeon, pm, 180)
 | |
| 
 | |
|     ublox_msgs = messaging.drain_sock(ublox_gnss_sock)
 | |
|     laikad_msgs = messaging.drain_sock(laikad_sock)
 | |
| 
 | |
|     gps_ephem_cnt = 0
 | |
|     glonass_ephem_cnt = 0
 | |
|     for um in ublox_msgs:
 | |
|       if um.ubloxGnss.which() == 'ephemeris':
 | |
|         gps_ephem_cnt += 1
 | |
|       elif um.ubloxGnss.which() == 'glonassEphemeris':
 | |
|         glonass_ephem_cnt += 1
 | |
| 
 | |
|     assert gps_ephem_cnt > 0, "NO gps ephemeris collected!"
 | |
|     assert glonass_ephem_cnt > 0, "NO glonass ephemeris collected!"
 | |
| 
 | |
|     pos_meas = 0
 | |
|     duration = -1
 | |
|     for lm in laikad_msgs:
 | |
|       pos_meas = (pos_meas + 1) if 'positionECEF' in lm.gnssMeasurements.to_dict() else 0
 | |
|       if pos_meas > 5:
 | |
|         duration = (lm.logMonoTime - laikad_msgs[0].logMonoTime)*1e-9
 | |
|         break
 | |
| 
 | |
|     assert pos_meas > 5, "NOT enough positions at end of read!"
 | |
|     assert duration < 120, "Laikad took too long to get a Position!"
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|   unittest.main()
 | |
| 
 |