From 24b0f37ae74612b294bd0863858b8bbc4a190b22 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Sat, 6 Jun 2026 19:31:04 -0500 Subject: [PATCH] hda1 --- opendbc_repo/opendbc/car/hyundai/interface.py | 10 +++--- .../opendbc/car/hyundai/radar_interface.py | 34 +++++++++++++++---- .../opendbc/car/hyundai/tests/test_hyundai.py | 32 +++++++++++++---- 3 files changed, 58 insertions(+), 18 deletions(-) diff --git a/opendbc_repo/opendbc/car/hyundai/interface.py b/opendbc_repo/opendbc/car/hyundai/interface.py index a043060b4..9f9a4ae4f 100644 --- a/opendbc_repo/opendbc/car/hyundai/interface.py +++ b/opendbc_repo/opendbc/car/hyundai/interface.py @@ -9,7 +9,7 @@ from opendbc.car.hyundai.values import HyundaiFlags, CAR, CarControllerParams, \ UNSUPPORTED_LONGITUDINAL_CAR, HyundaiSafetyFlags, \ HyundaiStarPilotSafetyFlags, \ hyundai_cancel_button_enables_cruise -from opendbc.car.hyundai.radar_interface import get_radar_track_config +from opendbc.car.hyundai.radar_interface import get_radar_track_config, radar_tracks_available from opendbc.car.interfaces import CarInterfaceBase, ACCEL_MIN from opendbc.car.disable_ecu import disable_ecu, ecu_log from opendbc.car.hyundai.carcontroller import CarController @@ -191,13 +191,13 @@ class CarInterface(CarInterfaceBase): # Common longitudinal control setup - radar_config = get_radar_track_config(ret.carFingerprint) - radar_tracks_available = radar_config is not None and radar_config.start_addr in fingerprint[radar_config.bus] - ret.radarUnavailable = not radar_tracks_available + radar_config = get_radar_track_config(ret.carFingerprint, ret.flags) + radar_available = radar_tracks_available(radar_config, fingerprint) + ret.radarUnavailable = not radar_available if ret.flags & HyundaiFlags.NON_SCC: ret.alphaLongitudinalAvailable = False ret.openpilotLongitudinalControl = alpha_long and ret.alphaLongitudinalAvailable - if ret.openpilotLongitudinalControl and not (candidate in RADAR_LIVE_LONGITUDINAL_CAR and radar_tracks_available): + if ret.openpilotLongitudinalControl and not (candidate in RADAR_LIVE_LONGITUDINAL_CAR and radar_available): ret.radarUnavailable = True ret.pcmCruise = not ret.openpilotLongitudinalControl apply_platform_longitudinal_params(ret) diff --git a/opendbc_repo/opendbc/car/hyundai/radar_interface.py b/opendbc_repo/opendbc/car/hyundai/radar_interface.py index f47b35d60..9649b085e 100644 --- a/opendbc_repo/opendbc/car/hyundai/radar_interface.py +++ b/opendbc_repo/opendbc/car/hyundai/radar_interface.py @@ -1,12 +1,12 @@ import math -from dataclasses import dataclass +from dataclasses import dataclass, replace from opendbc.can import CANParser from opendbc.can.dbc import DBC as DBCReader from opendbc.can.parser import get_raw_value from opendbc.car import Bus, structs from opendbc.car.interfaces import RadarInterfaceBase -from opendbc.car.hyundai.values import CAR, DBC, HYUNDAI_MANDO_FRONT_RADAR_DBC, HYUNDAI_MRREVO14F_RADAR_DBC, \ +from opendbc.car.hyundai.values import CAR, DBC, HyundaiFlags, HYUNDAI_MANDO_FRONT_RADAR_DBC, HYUNDAI_MRREVO14F_RADAR_DBC, \ HYUNDAI_MRR30_RADAR_DBC, HYUNDAI_MRR35_RADAR_DBC from openpilot.common.swaglog import cloudlog @@ -29,6 +29,7 @@ class RadarTrackConfig: bus: int = 1 frequency: int = 50 parser_msg_count: int | None = None + expected_length: int | None = None @property def can_parser_msg_count(self) -> int: @@ -38,18 +39,37 @@ class RadarTrackConfig: RADAR_TRACK_CONFIGS = { HYUNDAI_MANDO_FRONT_RADAR_DBC: RadarTrackConfig(RADAR_START_ADDR, RADAR_MSG_COUNT, "mando"), HYUNDAI_MRREVO14F_RADAR_DBC: RadarTrackConfig(MRREVO14F_RADAR_START_ADDR, MRREVO14F_RADAR_MSG_COUNT, "mrrevo14f"), - HYUNDAI_MRR30_RADAR_DBC: RadarTrackConfig(MRR30_RADAR_START_ADDR, MRR30_RADAR_MSG_COUNT, "mrr30", bus=0), - HYUNDAI_MRR35_RADAR_DBC: RadarTrackConfig(MRR35_RADAR_START_ADDR, MRR35_RADAR_MSG_COUNT, "mrr35", bus=0, frequency=20), + HYUNDAI_MRR30_RADAR_DBC: RadarTrackConfig(MRR30_RADAR_START_ADDR, MRR30_RADAR_MSG_COUNT, "mrr30", bus=0, expected_length=32), + HYUNDAI_MRR35_RADAR_DBC: RadarTrackConfig(MRR35_RADAR_START_ADDR, MRR35_RADAR_MSG_COUNT, "mrr35", bus=0, frequency=20, expected_length=24), } # POC for parsing corner radars: https://github.com/commaai/openpilot/pull/24221/ -def get_radar_track_config(car_fingerprint) -> RadarTrackConfig | None: +def get_radar_track_config(car_fingerprint, flags: int = 0) -> RadarTrackConfig | None: radar_dbc = DBC[car_fingerprint].get(Bus.radar) if car_fingerprint == CAR.GENESIS_G90 and radar_dbc == HYUNDAI_MANDO_FRONT_RADAR_DBC: return RadarTrackConfig(RADAR_START_ADDR, G90_RADAR_MSG_COUNT, "mando", parser_msg_count=RADAR_MSG_COUNT) - return RADAR_TRACK_CONFIGS.get(radar_dbc) + + radar_config = RADAR_TRACK_CONFIGS.get(radar_dbc) + if radar_config is None: + return None + + if car_fingerprint == CAR.HYUNDAI_IONIQ_6 and flags & HyundaiFlags.CANFD_CAMERA_SCC: + return replace(radar_config, bus=1) + + return radar_config + + +def radar_tracks_available(radar_config: RadarTrackConfig | None, fingerprint) -> bool: + if radar_config is None: + return False + + msg_len = fingerprint[radar_config.bus].get(radar_config.start_addr) + if msg_len is None: + return False + + return radar_config.expected_length is None or msg_len == radar_config.expected_length def get_radar_can_parser(CP, radar_config): @@ -64,7 +84,7 @@ def get_radar_can_parser(CP, radar_config): class RadarInterface(RadarInterfaceBase): def __init__(self, CP): super().__init__(CP) - self.radar_config = get_radar_track_config(CP.carFingerprint) + self.radar_config = get_radar_track_config(CP.carFingerprint, CP.flags) self.updated_messages = set() self.trigger_msg = (self.radar_config.start_addr + self.radar_config.can_parser_msg_count - 1 if self.radar_config is not None else RADAR_START_ADDR) diff --git a/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py b/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py index 5744a3791..017cc85aa 100644 --- a/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py +++ b/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py @@ -164,7 +164,6 @@ class TestHyundaiFingerprint: (CAR.KIA_EV6_2025, MRR30_RADAR_START_ADDR), (CAR.GENESIS_GV60_EV_1ST_GEN, MRR30_RADAR_START_ADDR), (CAR.HYUNDAI_KONA_EV_2ND_GEN, MRR35_RADAR_START_ADDR), - (CAR.HYUNDAI_IONIQ_6, MRR35_RADAR_START_ADDR), (CAR.HYUNDAI_IONIQ_9, MRR35_RADAR_START_ADDR), ): radar_config = get_radar_track_config(candidate) @@ -172,29 +171,50 @@ class TestHyundaiFingerprint: for radar in (True, False): fingerprint = gen_empty_fingerprint() if radar: - fingerprint[radar_config.bus][radar_addr] = 8 + fingerprint[radar_config.bus][radar_addr] = radar_config.expected_length or 8 CP = CarInterface.get_params(candidate, fingerprint, [], False, False, False, None) assert CP.radarUnavailable != radar assert get_radar_track_config(CAR.HYUNDAI_KONA_EV_2022).bus == 1 assert get_radar_track_config(CAR.HYUNDAI_IONIQ_5).bus == 0 - assert get_radar_track_config(CAR.HYUNDAI_IONIQ_6).start_addr == MRR35_RADAR_START_ADDR + ioniq_6_hda2_radar_config = get_radar_track_config(CAR.HYUNDAI_IONIQ_6) + ioniq_6_hda1_radar_config = get_radar_track_config(CAR.HYUNDAI_IONIQ_6, HyundaiFlags.CANFD_CAMERA_SCC) + assert ioniq_6_hda2_radar_config.start_addr == MRR35_RADAR_START_ADDR + assert ioniq_6_hda2_radar_config.bus == 0 + assert ioniq_6_hda1_radar_config.bus == 1 + assert ioniq_6_hda1_radar_config.frequency == 20 + fingerprint = gen_empty_fingerprint() - fingerprint[1][MRR35_RADAR_START_ADDR] = 24 + fingerprint[0][MRR35_RADAR_START_ADDR] = 8 CP = CarInterface.get_params(CAR.HYUNDAI_IONIQ_6, fingerprint, [], False, False, False, None) assert not CP.openpilotLongitudinalControl assert CP.radarUnavailable + fingerprint = gen_empty_fingerprint() + fingerprint[ioniq_6_hda1_radar_config.bus][MRR35_RADAR_START_ADDR] = 24 + CP = CarInterface.get_params(CAR.HYUNDAI_IONIQ_6, fingerprint, [], False, False, False, None) + assert not CP.openpilotLongitudinalControl + assert CP.flags & HyundaiFlags.CANFD_CAMERA_SCC + assert not CP.radarUnavailable + CP = CarInterface.get_params(CAR.HYUNDAI_IONIQ_6, gen_empty_fingerprint(), [], True, False, False, None) assert CP.openpilotLongitudinalControl assert CP.radarUnavailable fingerprint = gen_empty_fingerprint() - fingerprint[get_radar_track_config(CAR.HYUNDAI_IONIQ_6).bus][MRR35_RADAR_START_ADDR] = 24 + fingerprint[ioniq_6_hda1_radar_config.bus][MRR35_RADAR_START_ADDR] = 24 CP = CarInterface.get_params(CAR.HYUNDAI_IONIQ_6, fingerprint, [], True, False, False, None) assert CP.openpilotLongitudinalControl + assert CP.flags & HyundaiFlags.CANFD_CAMERA_SCC + assert not CP.radarUnavailable + + fingerprint = gen_empty_fingerprint() + fingerprint[CanBus(None, fingerprint).CAM][0x50] = 32 + fingerprint[ioniq_6_hda2_radar_config.bus][MRR35_RADAR_START_ADDR] = 24 + CP = CarInterface.get_params(CAR.HYUNDAI_IONIQ_6, fingerprint, [], True, False, False, None) + assert CP.openpilotLongitudinalControl + assert CP.flags & HyundaiFlags.CANFD_LKA_STEERING assert not CP.radarUnavailable - assert get_radar_track_config(CAR.HYUNDAI_IONIQ_6).frequency == 20 fingerprint = gen_empty_fingerprint() fingerprint[CanBus(None, fingerprint).CAM][0x50] = 32