diff --git a/opendbc_repo/opendbc/car/hyundai/radar_interface.py b/opendbc_repo/opendbc/car/hyundai/radar_interface.py index bad511f47..f47b35d60 100644 --- a/opendbc_repo/opendbc/car/hyundai/radar_interface.py +++ b/opendbc_repo/opendbc/car/hyundai/radar_interface.py @@ -6,13 +6,15 @@ 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_MRR30_RADAR_DBC, \ - HYUNDAI_MRR35_RADAR_DBC +from opendbc.car.hyundai.values import CAR, DBC, HYUNDAI_MANDO_FRONT_RADAR_DBC, HYUNDAI_MRREVO14F_RADAR_DBC, \ + HYUNDAI_MRR30_RADAR_DBC, HYUNDAI_MRR35_RADAR_DBC from openpilot.common.swaglog import cloudlog RADAR_START_ADDR = 0x500 RADAR_MSG_COUNT = 32 G90_RADAR_MSG_COUNT = 64 +MRREVO14F_RADAR_START_ADDR = 0x602 +MRREVO14F_RADAR_MSG_COUNT = 16 MRR30_RADAR_START_ADDR = 0x210 MRR30_RADAR_MSG_COUNT = 16 MRR35_RADAR_START_ADDR = 0x3A5 @@ -35,7 +37,8 @@ class RadarTrackConfig: RADAR_TRACK_CONFIGS = { HYUNDAI_MANDO_FRONT_RADAR_DBC: RadarTrackConfig(RADAR_START_ADDR, RADAR_MSG_COUNT, "mando"), - HYUNDAI_MRR30_RADAR_DBC: RadarTrackConfig(MRR30_RADAR_START_ADDR, MRR30_RADAR_MSG_COUNT, "mrr30"), + 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), } @@ -200,6 +203,27 @@ class RadarInterface(RadarInterfaceBase): del self.pts[track_key] continue + if radar_type == "mrrevo14f": + for i in ("1", "2"): + track_key = addr * 2 + int(i) - 1 + valid = msg[f"{i}_DISTANCE"] != 255.75 + if valid: + pt = self.pts.get(track_key) + if pt is None: + pt = structs.RadarData.RadarPoint() + pt.trackId = self.track_id + self.track_id += 1 + self.pts[track_key] = pt + pt.measured = True + pt.dRel = msg[f"{i}_DISTANCE"] + pt.yRel = msg[f"{i}_LATERAL"] + pt.vRel = msg[f"{i}_SPEED"] + pt.aRel = float("nan") + pt.yvRel = float("nan") + elif track_key in self.pts: + del self.pts[track_key] + continue + if radar_type == "mrr35": # Most of the 32 channels are empty each frame. Only allocate a point # when the channel is valid; drop it otherwise. Avoids the per-frame diff --git a/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py b/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py index 6d8fe1bb8..e1aee5570 100644 --- a/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py +++ b/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py @@ -14,7 +14,8 @@ from opendbc.car.hyundai.carstate import CarState, decode_canfd_camera_lead, dec from opendbc.car.hyundai.interface import CarInterface from opendbc.car.hyundai import hyundaican, hyundaicanfd from opendbc.car.hyundai.hyundaicanfd import CanBus -from opendbc.car.hyundai.radar_interface import MRR30_RADAR_START_ADDR, MRR35_RADAR_START_ADDR, RADAR_START_ADDR, get_radar_track_config +from opendbc.car.hyundai.radar_interface import MRREVO14F_RADAR_START_ADDR, MRR30_RADAR_START_ADDR, MRR35_RADAR_START_ADDR, \ + RADAR_START_ADDR, get_radar_track_config from opendbc.car.hyundai.values import CAMERA_SCC_CAR, CANFD_CAR, CAN_GEARS, CAR, CHECKSUM, DATE_FW_ECUS, \ HYBRID_CAR, EV_CAR, FW_QUERY_CONFIG, LEGACY_SAFETY_MODE_CAR, CANFD_FUZZY_WHITELIST, \ UNSUPPORTED_LONGITUDINAL_CAR, PLATFORM_CODE_ECUS, HYUNDAI_VERSION_REQUEST_LONG, \ @@ -120,7 +121,22 @@ class TestHyundaiFingerprint: assert bool(CP.flags & HyundaiFlags.CANFD_LKA_STEERING) == lka_steering # radar available - for candidate in (CAR.HYUNDAI_SONATA, CAR.HYUNDAI_SONATA_HYBRID, CAR.GENESIS_G90): + for candidate in ( + CAR.HYUNDAI_IONIQ, + CAR.HYUNDAI_IONIQ_EV_LTD, + CAR.HYUNDAI_SANTA_FE, + CAR.HYUNDAI_SANTA_FE_2022, + CAR.HYUNDAI_SANTA_FE_HEV_2022, + CAR.HYUNDAI_SANTA_FE_PHEV_2022, + CAR.HYUNDAI_SONATA, + CAR.HYUNDAI_SONATA_HYBRID, + CAR.KIA_K5_HEV_2020, + CAR.KIA_NIRO_EV, + CAR.KIA_NIRO_PHEV, + CAR.KIA_NIRO_PHEV_2022, + CAR.GENESIS_G70_2020, + CAR.GENESIS_G90, + ): assert get_radar_track_config(candidate).start_addr == RADAR_START_ADDR for radar in (True, False): fingerprint = gen_empty_fingerprint() @@ -141,9 +157,12 @@ class TestHyundaiFingerprint: assert not CP.radarUnavailable for candidate, radar_addr in ( + (CAR.HYUNDAI_KONA_EV_2022, MRREVO14F_RADAR_START_ADDR), (CAR.HYUNDAI_IONIQ_5, MRR30_RADAR_START_ADDR), (CAR.HYUNDAI_IONIQ_5_N, MRR30_RADAR_START_ADDR), + (CAR.KIA_EV6, MRR30_RADAR_START_ADDR), (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), @@ -157,6 +176,8 @@ class TestHyundaiFingerprint: 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 fingerprint = gen_empty_fingerprint() fingerprint[1][MRR35_RADAR_START_ADDR] = 24 diff --git a/opendbc_repo/opendbc/car/hyundai/values.py b/opendbc_repo/opendbc/car/hyundai/values.py index a9806b43b..0e2db5565 100644 --- a/opendbc_repo/opendbc/car/hyundai/values.py +++ b/opendbc_repo/opendbc/car/hyundai/values.py @@ -19,6 +19,7 @@ SPORTAGE_HEV_2026_LOW_SPEED_JERK_WIDTH = 5.0 SPORTAGE_HEV_2026_MAX_ANGLE_RATE = 6.5 SPORTAGE_HEV_2026_STEER_ANGLE_MAX = 220.0 HYUNDAI_MANDO_FRONT_RADAR_DBC = "hyundai_kia_mando_front_radar_generated" +HYUNDAI_MRREVO14F_RADAR_DBC = "hyundai_mrrevo14f_radar_generated" HYUNDAI_MRR30_RADAR_DBC = "hyundai_mrr30_radar_generated" HYUNDAI_MRR35_RADAR_DBC = "hyundai_mrr35_radar_generated" @@ -224,9 +225,12 @@ class HyundaiNonSccCarDocs(CarDocs): @dataclass class HyundaiPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: "hyundai_kia_generic"}) + radar_dbc: str | None = None def init(self): - if self.flags & HyundaiFlags.MANDO_RADAR: + if self.radar_dbc is not None: + self.dbc_dict = {Bus.pt: "hyundai_kia_generic", Bus.radar: self.radar_dbc} + elif self.flags & HyundaiFlags.MANDO_RADAR: self.dbc_dict = {Bus.pt: "hyundai_kia_generic", Bus.radar: HYUNDAI_MANDO_FRONT_RADAR_DBC} if self.flags & HyundaiFlags.MIN_STEER_32_MPH: @@ -313,7 +317,7 @@ class CAR(Platforms): HYUNDAI_IONIQ = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Ioniq Hybrid 2017-19", car_parts=CarParts.common([CarHarness.hyundai_c]))], CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), - flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH, + flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH | HyundaiFlags.MANDO_RADAR, ) HYUNDAI_IONIQ_HEV_2022 = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Ioniq Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_h]))], @@ -369,6 +373,7 @@ class CAR(Platforms): [HyundaiCarDocs("Hyundai Kona Electric 2022-23", car_parts=CarParts.common([CarHarness.hyundai_o]))], CarSpecs(mass=1743, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.CAMERA_SCC | HyundaiFlags.EV | HyundaiFlags.ALT_LIMITS, + radar_dbc=HYUNDAI_MRREVO14F_RADAR_DBC, ) HYUNDAI_KONA_EV_2ND_GEN = HyundaiCanFDPlatformConfig( [ @@ -400,17 +405,17 @@ class CAR(Platforms): [HyundaiCarDocs("Hyundai Santa Fe 2021-23", "All", video="https://youtu.be/VnHzSTygTS4", car_parts=CarParts.common([CarHarness.hyundai_l]))], HYUNDAI_SANTA_FE.specs, - flags=HyundaiFlags.CHECKSUM_CRC8, + flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, ) HYUNDAI_SANTA_FE_HEV_2022 = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Santa Fe Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))], HYUNDAI_SANTA_FE.specs, - flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, + flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) HYUNDAI_SANTA_FE_PHEV_2022 = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Santa Fe Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))], HYUNDAI_SANTA_FE.specs, - flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, + flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) HYUNDAI_SANTA_FE_HEV_5TH_GEN = HyundaiCanFDPlatformConfig( [ @@ -749,6 +754,7 @@ class CAR(Platforms): ], CarSpecs(mass=2055, wheelbase=2.9, steerRatio=16, tireStiffnessFactor=0.65), flags=HyundaiFlags.EV, + radar_dbc=HYUNDAI_MRR30_RADAR_DBC, ) KIA_EV6_2025 = HyundaiCanFDPlatformConfig( [ @@ -783,6 +789,7 @@ class CAR(Platforms): ], CarSpecs(mass=2205, wheelbase=2.9, steerRatio=17.6), flags=HyundaiFlags.EV, + radar_dbc=HYUNDAI_MRR30_RADAR_DBC, ) GENESIS_G70 = HyundaiPlatformConfig( [HyundaiCarDocs("Genesis G70 2018", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))], @@ -1110,8 +1117,13 @@ CANFD_RADAR_SCC_CAR = CAR.with_flags(HyundaiFlags.RADAR_SCC) # TODO: merge with # CAN-FD cars with ADAS ECUs that work with the communication-control path. CANFD_SECURITYACCESS_CAR = {CAR.HYUNDAI_IONIQ_5, CAR.HYUNDAI_IONIQ_6, CAR.HYUNDAI_KONA_EV_2ND_GEN} CANFD_UNSUPPORTED_LONGITUDINAL_CAR = CAR.with_flags(HyundaiFlags.CANFD_NO_RADAR_DISABLE) - CANFD_SECURITYACCESS_CAR # TODO: merge with UNSUPPORTED_LONGITUDINAL_CAR -CANFD_RADAR_LIVE_LONGITUDINAL_CAR = {CAR.HYUNDAI_IONIQ_5, CAR.HYUNDAI_IONIQ_6} +CANFD_RADAR_LIVE_LONGITUDINAL_CAR = {CAR.HYUNDAI_IONIQ_5, CAR.HYUNDAI_IONIQ_6, CAR.KIA_EV6, CAR.GENESIS_GV60_EV_1ST_GEN} RADAR_LIVE_LONGITUDINAL_CAR = CANFD_RADAR_LIVE_LONGITUDINAL_CAR | { + CAR.HYUNDAI_IONIQ, + CAR.HYUNDAI_KONA_EV_2022, + CAR.HYUNDAI_SANTA_FE_2022, + CAR.HYUNDAI_SANTA_FE_HEV_2022, + CAR.HYUNDAI_SANTA_FE_PHEV_2022, CAR.HYUNDAI_SONATA, CAR.HYUNDAI_SONATA_HYBRID, CAR.GENESIS_G90,