diff --git a/cereal/car.capnp b/cereal/car.capnp index e77e8c2943..38be2d9441 100644 --- a/cereal/car.capnp +++ b/cereal/car.capnp @@ -137,6 +137,7 @@ struct CarEvent @0x9b1657f34caf3ad3 { speedLimitPreActive @139; speedLimitConfirmed @140; torqueNNLoad @141; + hyundaiRadarTracksAvailable @142; radarCanErrorDEPRECATED @15; communityFeatureDisallowedDEPRECATED @62; diff --git a/common/params.cc b/common/params.cc index c613cf0a36..52b50ecd97 100644 --- a/common/params.cc +++ b/common/params.cc @@ -264,6 +264,7 @@ std::unordered_map keys = { {"HkgSmoothStop", PERSISTENT | BACKUP}, {"HotspotOnBoot", PERSISTENT}, {"HotspotOnBootConfirmed", PERSISTENT}, + {"HyundaiRadarTracksAvailable", PERSISTENT | BACKUP}, {"LastCarModel", PERSISTENT | BACKUP}, {"LastSpeedLimitSignTap", PERSISTENT}, {"LastSunnylinkPingTime", CLEAR_ON_MANAGER_START}, diff --git a/selfdrive/car/hyundai/interface.py b/selfdrive/car/hyundai/interface.py index c2140d2925..3910061c7d 100644 --- a/selfdrive/car/hyundai/interface.py +++ b/selfdrive/car/hyundai/interface.py @@ -1,6 +1,7 @@ from cereal import car from panda import Panda from openpilot.common.params import Params +from openpilot.selfdrive.car.car_helpers import can_fingerprint, get_one_can from openpilot.selfdrive.car.hyundai.enable_radar_tracks import enable_radar_tracks from openpilot.selfdrive.car.hyundai.hyundaicanfd import CanBus from openpilot.selfdrive.car.hyundai.values import HyundaiFlags, HyundaiFlagsSP, CAR, DBC, CANFD_CAR, CAMERA_SCC_CAR, CANFD_RADAR_SCC_CAR, \ @@ -125,7 +126,8 @@ class CarInterface(CarInterfaceBase): if ret.flags & HyundaiFlags.MANDO_RADAR and ret.radarUnavailable: ret.spFlags |= HyundaiFlagsSP.SP_RADAR_TRACKS.value - ret.radarUnavailable = False + if Params().get_bool("HyundaiRadarTracksAvailable"): + ret.radarUnavailable = False # *** panda safety config *** if candidate in CANFD_CAR: @@ -199,7 +201,20 @@ class CarInterface(CarInterfaceBase): # some CAN platforms are able to enable radar tracks config at the radar ECU, # but the config is reset after ignition cycle if CP.spFlags & HyundaiFlagsSP.SP_RADAR_TRACKS: + params = Params() enable_radar_tracks(logcan, sendcan, bus=0, addr=0x7d0, config_data_id=b'\x01\x42') + rt_avail = params.get_bool("HyundaiRadarTracksAvailable") + rt_avail_cache = params.get_bool("HyundaiRadarTracksAvailableCache") + if rt_avail and rt_avail_cache: + pass + elif rt_avail != rt_avail_cache: + params.put_bool_nonblocking("HyundaiRadarTracksAvailableCache", rt_avail) + else: + _, fingerprint = can_fingerprint(lambda: get_one_can(logcan)) + if RADAR_START_ADDR in fingerprint[1] and DBC[CP.carFingerprint]["radar"] is not None: + params.put_bool_nonblocking("HyundaiRadarTracksAvailable", True) + elif RADAR_START_ADDR not in fingerprint[1] or DBC[CP.carFingerprint]["radar"] is None: + params.put_bool_nonblocking("HyundaiRadarTracksAvailable", False) def _update(self, c): ret = self.CS.update(self.cp, self.cp_cam) @@ -266,6 +281,9 @@ class CarInterface(CarInterfaceBase): if self.low_speed_alert and self.CS.madsEnabled: events.add(car.CarEvent.EventName.belowSteerSpeed) + if self.CS.params_list.hyundai_radar_tracks_available and not self.CS.params_list.hyundai_radar_tracks_available_cache: + events.add(car.CarEvent.EventName.hyundaiRadarTracksAvailable) + ret.customStockLong = self.CS.update_custom_stock_long(self.CC.cruise_button, self.CC.final_speed_kph, self.CC.target_speed, self.CC.v_set_dis, self.CC.speed_diff, self.CC.button_type) diff --git a/selfdrive/car/param_manager.py b/selfdrive/car/param_manager.py index c7df87b9b7..b0f830ccc7 100644 --- a/selfdrive/car/param_manager.py +++ b/selfdrive/car/param_manager.py @@ -9,6 +9,8 @@ class ParamManager: "acc_mads_combo": False, "below_speed_pause": False, "experimental_mode": False, + "hyundai_radar_tracks_available": False, + "hyundai_radar_tracks_available_cache": False, "is_metric": False, "last_speed_limit_sign_tap": False, "mads_main_toggle": False, @@ -35,6 +37,8 @@ class ParamManager: "acc_mads_combo": params.get_bool("AccMadsCombo"), "below_speed_pause": params.get_bool("BelowSpeedPause"), "experimental_mode": params.get_bool("ExperimentalMode"), + "hyundai_radar_tracks_available": params.get_bool("HyundaiRadarTracksAvailable"), + "hyundai_radar_tracks_available_cache": params.get_bool("HyundaiRadarTracksAvailableCache"), "is_metric": params.get_bool("IsMetric"), "last_speed_limit_sign_tap": params.get_bool("LastSpeedLimitSignTap"), "mads_main_toggle": params.get_bool("MadsCruiseMain"), diff --git a/selfdrive/controls/lib/events.py b/selfdrive/controls/lib/events.py index 13cef37960..f6d6f5bd0c 100755 --- a/selfdrive/controls/lib/events.py +++ b/selfdrive/controls/lib/events.py @@ -1141,6 +1141,9 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { ET.PERMANENT: torque_nn_load_alert, }, + EventName.hyundaiRadarTracksAvailable: { + ET.PERMANENT: NormalPermanentAlert("Radar tracks available. Restart the car to initialize") + } }