mirror of https://github.com/1okko/openpilot.git
57 lines
1.5 KiB
Python
Executable File
57 lines
1.5 KiB
Python
Executable File
#!/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()
|