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.
		
		
		
		
		
			
		
			
				
					
					
						
							56 lines
						
					
					
						
							1.5 KiB
						
					
					
				
			
		
		
	
	
							56 lines
						
					
					
						
							1.5 KiB
						
					
					
				| #!/usr/bin/env python3
 | |
| import datetime
 | |
| import subprocess
 | |
| import time
 | |
| from typing import NoReturn
 | |
| 
 | |
| import cereal.messaging as messaging
 | |
| from openpilot.common.time import system_time_valid
 | |
| from openpilot.common.swaglog import cloudlog
 | |
| 
 | |
| 
 | |
| def set_time(new_time):
 | |
|   diff = datetime.datetime.now() - new_time
 | |
|   if diff < datetime.timedelta(seconds=10):
 | |
|     cloudlog.debug(f"Time diff too small: {diff}")
 | |
|     return
 | |
| 
 | |
|   cloudlog.debug(f"Setting time to {new_time}")
 | |
|   try:
 | |
|     subprocess.run(f"TZ=UTC date -s '{new_time}'", shell=True, check=True)
 | |
|   except subprocess.CalledProcessError:
 | |
|     cloudlog.exception("timed.failed_setting_time")
 | |
| 
 | |
| 
 | |
| def main() -> NoReturn:
 | |
|   """
 | |
|     timed has one responsibility:
 | |
|     - getting the current time
 | |
| 
 | |
|     GPS directly gives time.
 | |
|     AGNOS will also use NTP to update the time.
 | |
|   """
 | |
| 
 | |
|   pm = messaging.PubMaster(['clocks'])
 | |
|   sm = messaging.SubMaster(['liveLocationKalman'])
 | |
|   while True:
 | |
|     sm.update(1000)
 | |
| 
 | |
|     msg = messaging.new_message('clocks')
 | |
|     msg.valid = system_time_valid()
 | |
|     msg.clocks.wallTimeNanos = time.time_ns()
 | |
|     pm.send('clocks', msg)
 | |
| 
 | |
|     llk = sm['liveLocationKalman']
 | |
|     if not llk.gpsOK or (time.monotonic() - sm.logMonoTime['liveLocationKalman']/1e9) > 0.2:
 | |
|       continue
 | |
| 
 | |
|     # set time
 | |
|     # TODO: account for unixTimesatmpMillis being a (usually short) time in the past
 | |
|     gps_time = datetime.datetime.fromtimestamp(llk.unixTimestampMillis / 1000.)
 | |
|     set_time(gps_time)
 | |
| 
 | |
|     time.sleep(10)
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|   main()
 | |
| 
 |