#!/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 ( )