timed: use gps location packet for time (#33306)

* GPS helpers

* Use GPS socket in timed

* Use helper in controlsd

* Use updated and logMonoTime

* Helper type annot

* Not updated

* Increase time threashold
old-commit-hash: cf355ecf20
This commit is contained in:
Kacper Rączy 2024-08-22 23:30:29 -07:00 committed by GitHub
parent 7bfd763291
commit e154f03a12
3 changed files with 19 additions and 8 deletions

8
common/gps.py Normal file
View File

@ -0,0 +1,8 @@
from openpilot.common.params import Params
def get_gps_location_service(params: Params) -> str:
if params.get_bool("UbloxAvailable"):
return "gpsLocationExternal"
else:
return "gpsLocation"

View File

@ -17,6 +17,7 @@ from openpilot.common.numpy_fast import clip
from openpilot.common.params import Params from openpilot.common.params import Params
from openpilot.common.realtime import config_realtime_process, Priority, Ratekeeper, DT_CTRL from openpilot.common.realtime import config_realtime_process, Priority, Ratekeeper, DT_CTRL
from openpilot.common.swaglog import cloudlog from openpilot.common.swaglog import cloudlog
from openpilot.common.gps import get_gps_location_service
from opendbc.car.car_helpers import get_car_interface from opendbc.car.car_helpers import get_car_interface
from openpilot.selfdrive.controls.lib.alertmanager import AlertManager, set_offroad_alert from openpilot.selfdrive.controls.lib.alertmanager import AlertManager, set_offroad_alert
@ -79,10 +80,7 @@ class Controls:
# Setup sockets # Setup sockets
self.pm = messaging.PubMaster(['controlsState', 'carControl', 'onroadEvents']) self.pm = messaging.PubMaster(['controlsState', 'carControl', 'onroadEvents'])
if self.params.get_bool("UbloxAvailable"): self.gps_location_service = get_gps_location_service(self.params)
self.gps_location_service = "gpsLocationExternal"
else:
self.gps_location_service = "gpsLocation"
self.gps_packets = [self.gps_location_service] self.gps_packets = [self.gps_location_service]
self.sensor_packets = ["accelerometer", "gyroscope"] self.sensor_packets = ["accelerometer", "gyroscope"]
self.camera_packets = ["roadCameraState", "driverCameraState", "wideRoadCameraState"] self.camera_packets = ["roadCameraState", "driverCameraState", "wideRoadCameraState"]

View File

@ -7,6 +7,8 @@ from typing import NoReturn
import cereal.messaging as messaging import cereal.messaging as messaging
from openpilot.common.time import system_time_valid from openpilot.common.time import system_time_valid
from openpilot.common.swaglog import cloudlog from openpilot.common.swaglog import cloudlog
from openpilot.common.params import Params
from openpilot.common.gps import get_gps_location_service
def set_time(new_time): def set_time(new_time):
@ -31,8 +33,11 @@ def main() -> NoReturn:
AGNOS will also use NTP to update the time. AGNOS will also use NTP to update the time.
""" """
params = Params()
gps_location_service = get_gps_location_service(params)
pm = messaging.PubMaster(['clocks']) pm = messaging.PubMaster(['clocks'])
sm = messaging.SubMaster(['liveLocationKalman']) sm = messaging.SubMaster([gps_location_service])
while True: while True:
sm.update(1000) sm.update(1000)
@ -41,13 +46,13 @@ def main() -> NoReturn:
msg.clocks.wallTimeNanos = time.time_ns() msg.clocks.wallTimeNanos = time.time_ns()
pm.send('clocks', msg) pm.send('clocks', msg)
llk = sm['liveLocationKalman'] gps = sm[gps_location_service]
if not llk.gpsOK or (time.monotonic() - sm.logMonoTime['liveLocationKalman']/1e9) > 0.2: if not sm.updated[gps_location_service] or (time.monotonic() - sm.logMonoTime[gps_location_service] / 1e9) > 2.0:
continue continue
# set time # set time
# TODO: account for unixTimesatmpMillis being a (usually short) time in the past # TODO: account for unixTimesatmpMillis being a (usually short) time in the past
gps_time = datetime.datetime.fromtimestamp(llk.unixTimestampMillis / 1000.) gps_time = datetime.datetime.fromtimestamp(gps.unixTimestampMillis / 1000.)
set_time(gps_time) set_time(gps_time)
time.sleep(10) time.sleep(10)