diff --git a/opendbc_repo/opendbc/car/hyundai/carcontroller.py b/opendbc_repo/opendbc/car/hyundai/carcontroller.py index 2c6d47e1d..196a7c742 100644 --- a/opendbc_repo/opendbc/car/hyundai/carcontroller.py +++ b/opendbc_repo/opendbc/car/hyundai/carcontroller.py @@ -10,7 +10,7 @@ from opendbc.car.lateral import apply_driver_steer_torque_limits, apply_steer_an from opendbc.car.common.conversions import Conversions as CV from opendbc.car.hyundai import hyundaicanfd, hyundaican from opendbc.car.hyundai.hyundaicanfd import CanBus -from opendbc.car.hyundai.values import HyundaiFlags, HyundaiStarPilotFlags, Buttons, CarControllerParams, CAR, CANFD_ANGLE_LONGITUDINAL_CAR, \ +from opendbc.car.hyundai.values import HyundaiFlags, HyundaiSafetyFlags, HyundaiStarPilotFlags, Buttons, CarControllerParams, CAR, CANFD_ANGLE_LONGITUDINAL_CAR, \ CANFD_RADAR_LIVE_LONGITUDINAL_CAR, CANFD_ALT_BUTTONS_RESUME_CAR, kia_ev6_gt_line_longitudinal_tuning, \ KIA_EV6_GT_LINE_LONG_TUNING_TESTING_GROUND_ID from opendbc.car.interfaces import CarControllerBase @@ -477,6 +477,11 @@ class CarController(CarControllerBase): self._dash_lat_disengage_init = False self._dash_prev_lat_active = False self._ray_lkas11_active = False + self._ray_lfa_8byte = CP.carFingerprint == CAR.KIA_RAY_EV and bool( + getattr(CP, "safetyConfigs", None) and + CP.safetyConfigs[-1].safetyParam & HyundaiSafetyFlags.CAN_REFRESH_MSGS + ) + self._ray_lfa_packer = CANPacker("hyundai_kia_ray_lfa") if self._ray_lfa_8byte else None def _update_dash_icon_state(self, CC): if CC.latActive: @@ -834,7 +839,10 @@ class CarController(CarControllerBase): # 20 Hz LFA MFA message if self.frame % 5 == 0 and (self.CP.flags & HyundaiFlags.SEND_LFA.value or (self.long_active_ecu and blended_hda2)): - can_sends.append(hyundaican.create_lfahda_mfc(self.packer, CC.enabled, self.frame, self.CP, lfa_icon)) + if self._ray_lfa_8byte: + can_sends.append(hyundaican.create_ray_lfahda_mfc(self._ray_lfa_packer, CC.latActive, lfa_icon)) + else: + can_sends.append(hyundaican.create_lfahda_mfc(self.packer, CC.enabled, self.frame, self.CP, lfa_icon)) # 5 Hz ACC options if self.frame % 20 == 0 and self.long_active_ecu and not can_canfd_blended: diff --git a/opendbc_repo/opendbc/car/hyundai/hyundaican.py b/opendbc_repo/opendbc/car/hyundai/hyundaican.py index 0eaeffe88..0d08f7928 100644 --- a/opendbc_repo/opendbc/car/hyundai/hyundaican.py +++ b/opendbc_repo/opendbc/car/hyundai/hyundaican.py @@ -203,6 +203,17 @@ def create_lfahda_mfc(packer, enabled, frame=None, CP=None, lfa_icon=None): return packer.make_can_msg("LFAHDA_MFC", bus, values) +def create_ray_lfahda_mfc(packer, lat_active, lfa_icon): + values = { + "HDA_USM": 2, + "HDA_Icon_State": 2 if lfa_icon else 0, + "HDA_VSetReq": 0, + "HDA_Icon_Wheel": int(lat_active), + "LFA_Icon_State": lfa_icon, + } + return packer.make_can_msg("LFAHDA_MFC", 0, values) + + def create_acc_commands_can_canfd_blended(packer, enabled, accel, upper_jerk, idx, hud_control, set_speed, stopping, long_override, use_fca, CP): commands = [] diff --git a/opendbc_repo/opendbc/car/hyundai/interface.py b/opendbc_repo/opendbc/car/hyundai/interface.py index 77ae9edcf..9b9d4e729 100644 --- a/opendbc_repo/opendbc/car/hyundai/interface.py +++ b/opendbc_repo/opendbc/car/hyundai/interface.py @@ -211,9 +211,7 @@ class CarInterface(CarInterfaceBase): ret.enableBsm = 0x58b in fingerprint[CAN.ECAN] # Send LFA message on cars with HDA - if 0x485 in fingerprint[CAN.CAM] and ( - candidate != CAR.KIA_RAY_EV or fingerprint[CAN.CAM][0x485] == 4 - ): + if 0x485 in fingerprint[CAN.CAM]: ret.flags |= HyundaiFlags.SEND_LFA.value # These cars use the FCA11 message for the AEB and FCW signals, all others use SCC12 @@ -228,6 +226,9 @@ class CarInterface(CarInterfaceBase): else: ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.hyundai, 0)] + if candidate == CAR.KIA_RAY_EV and fingerprint[CAN.CAM].get(0x485) == 8: + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CAN_REFRESH_MSGS.value + if ret.flags & HyundaiFlags.CAMERA_SCC: ret.safetyConfigs[0].safetyParam |= HyundaiSafetyFlags.CAMERA_SCC.value if candidate in (CAR.HYUNDAI_ELANTRA_2024, CAR.HYUNDAI_ELANTRA_HEV_2024): diff --git a/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py b/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py index 27931c34f..05d8c92af 100644 --- a/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py +++ b/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py @@ -901,7 +901,21 @@ class TestHyundaiFingerprint: fingerprint[2][0x485] = 8 CP = CarInterface.get_params(CAR.KIA_RAY_EV, fingerprint, [], False, False, False, None) - assert not (CP.flags & HyundaiFlags.SEND_LFA) + assert CP.flags & HyundaiFlags.SEND_LFA + assert CP.safetyConfigs[-1].safetyParam & HyundaiSafetyFlags.CAN_REFRESH_MSGS + + def test_ray_ev_uses_carrot_eight_byte_lfa_frame(self): + fingerprint = gen_empty_fingerprint() + fingerprint[2][0x485] = 8 + CP = CarInterface.get_params(CAR.KIA_RAY_EV, fingerprint, [], False, False, False, None) + controller = CarController(DBC[CP.carFingerprint], CP) + + msg = hyundaican.create_ray_lfahda_mfc(controller._ray_lfa_packer, True, 2) + assert msg[0] == 0x485 + assert len(msg[1]) == 8 + assert msg[1][0] & 0x03 == 2 + assert msg[1][2] & 0x10 == 0x10 + assert msg[1][3] & 0x03 == 2 def test_non_ray_legacy_platform_keeps_53e_lkas12_detection(self): fingerprint = gen_empty_fingerprint() @@ -1038,9 +1052,12 @@ class TestHyundaiFingerprint: ret = update(0, 3) assert any(be.type == ButtonType.lkas and not be.pressed for be in ret.buttonEvents) - ret = update(2, 4) + ret = update(1, 4) assert any(be.type == ButtonType.lkas and be.pressed for be in ret.buttonEvents) + raw_button_msg = packer.make_can_msg("BCM_PO_11", 0, {"RAY_LKAS_BTN": 1}) + assert raw_button_msg[1][0] == 0x10 + def test_non_ray_does_not_use_ray_lkas_signal(self): CP = CarInterface.get_params(CAR.KIA_FORTE_2021_NON_SCC, gen_empty_fingerprint(), [], False, False, False, None) car_state = CarState(CP, CarInterface.get_starpilot_params(CAR.KIA_FORTE_2021_NON_SCC, diff --git a/opendbc_repo/opendbc/dbc/hyundai_kia_generic.dbc b/opendbc_repo/opendbc/dbc/hyundai_kia_generic.dbc index b26f0f392..5ab391b0d 100644 --- a/opendbc_repo/opendbc/dbc/hyundai_kia_generic.dbc +++ b/opendbc_repo/opendbc/dbc/hyundai_kia_generic.dbc @@ -1497,7 +1497,7 @@ BO_ 913 BCM_PO_11: 8 Vector__XXX SG_ BCM_Door_Dri_Status : 5|1@0+ (1,0) [0|1] "" PT_ESC_ABS SG_ BCM_Shift_R_MT_SW_Status : 39|2@0+ (1,0) [0|3] "" PT_ESC_ABS SG_ LDA_BTN : 4|1@0+ (1,0) [0|1] "" XXX - SG_ RAY_LKAS_BTN : 0|2@1+ (1,0) [0|3] "" XXX + SG_ RAY_LKAS_BTN : 4|1@0+ (1,0) [0|1] "" XXX BO_ 1426 LABEL11: 8 XXX SG_ CC_React : 34|1@1+ (1,0) [0|1] "" XXX diff --git a/opendbc_repo/opendbc/dbc/hyundai_kia_ray_lfa.dbc b/opendbc_repo/opendbc/dbc/hyundai_kia_ray_lfa.dbc new file mode 100644 index 000000000..9f35bafbb --- /dev/null +++ b/opendbc_repo/opendbc/dbc/hyundai_kia_ray_lfa.dbc @@ -0,0 +1,25 @@ +VERSION "" + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + +BS_: + +BU_: XXX + +BO_ 1157 LFAHDA_MFC: 8 XXX + SG_ HDA_USM : 0|2@1+ (1,0) [0|3] "" XXX + SG_ HDA_Active : 2|1@1+ (1,0) [0|1] "" XXX + SG_ HDA_Icon_State : 3|2@1+ (1,0) [0|3] "" XXX + SG_ HDA_Chime : 7|1@1+ (1,0) [0|1] "" XXX + SG_ HDA_VSetReq : 8|8@1+ (1,0) [0|255] "km/h" XXX + SG_ LFA_SysWarning : 16|3@1+ (1,0) [0|7] "" XXX + SG_ HDA_Icon_Wheel : 20|1@1+ (1,0) [0|1] "" XXX + SG_ HDA_LdwSysState : 21|2@1+ (1,0) [0|3] "" XXX + SG_ LFA_Icon_State : 24|2@1+ (1,0) [0|3] "" XXX + SG_ LFA_USM : 27|2@1+ (1,0) [0|3] "" XXX + SG_ HDA_SysWarning : 29|2@1+ (1,0) [0|3] "" XXX