diff --git a/opendbc_repo/opendbc/car/__init__.py b/opendbc_repo/opendbc/car/__init__.py index 79198204f..6c5ec477d 100644 --- a/opendbc_repo/opendbc/car/__init__.py +++ b/opendbc_repo/opendbc/car/__init__.py @@ -122,7 +122,7 @@ class CanBusBase: assert fingerprint is not None num = max([k for k, v in fingerprint.items() if len(v)], default=0) // 4 + 1 else: - num = len(CP.safetyConfigs) + num = max(1, len(CP.safetyConfigs)) self.offset = 4 * (num - 1) diff --git a/opendbc_repo/opendbc/car/disable_ecu.py b/opendbc_repo/opendbc/car/disable_ecu.py index 90e441d85..a3e1f5995 100644 --- a/opendbc_repo/opendbc/car/disable_ecu.py +++ b/opendbc_repo/opendbc/car/disable_ecu.py @@ -5,6 +5,8 @@ from opendbc.car.isotp_parallel_query import IsoTpParallelQuery EXT_DIAG_REQUEST = b'\x10\x03' EXT_DIAG_RESPONSE = b'\x50\x03' +RESET_REQUEST = b'\x11\x01' +RESET_RESPONSE = b'' # File-based logging for debugging ECU_LOG_FILE = "/data/ecu_disable.log" @@ -21,7 +23,7 @@ def ecu_log(msg): pass -def disable_ecu(can_recv, can_send, bus=0, addr=0x7d0, sub_addr=None, com_cont_req=b'\x28\x83\x01', timeout=0.1, retry=10): +def disable_ecu(can_recv, can_send, bus=0, addr=0x7d0, sub_addr=None, com_cont_req=b'\x28\x83\x01', timeout=0.1, retry=10, reset=False): """Silence an ECU by disabling sending and receiving messages using UDS 0x28. The ECU will stay silent as long as openpilot keeps sending Tester Present. @@ -29,6 +31,15 @@ def disable_ecu(can_recv, can_send, bus=0, addr=0x7d0, sub_addr=None, com_cont_r WARNING: THIS DISABLES AEB!""" ecu_log(f"=== ECU DISABLE START === addr={hex(addr)}, bus={bus}") + if reset: + try: + ecu_log("sending ECU reset before communication control...") + reset_query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr, sub_addr)], [RESET_REQUEST], [RESET_RESPONSE]) + reset_query.get_data(timeout=timeout) + time.sleep(0.2) + except Exception as e: + ecu_log(f"reset exception: {e}") + # Try multiple times with different approaches for i in range(retry): try: @@ -50,6 +61,7 @@ def disable_ecu(can_recv, can_send, bus=0, addr=0x7d0, sub_addr=None, com_cont_r # Log what we got back cc_success = False cc_rejected = False + cc_nrc = None for (rx_addr, _), data in cc_response.items(): ecu_log(f"CC response: {data.hex() if data else 'empty'}") # Check for positive response (0x68 = 0x28 + 0x40) @@ -59,6 +71,7 @@ def disable_ecu(can_recv, can_send, bus=0, addr=0x7d0, sub_addr=None, com_cont_r # Check for negative response elif len(data) >= 3 and data[0] == 0x7F: nrc = data[2] + cc_nrc = nrc nrc_meanings = { 0x12: "subFunctionNotSupported", 0x13: "incorrectMessageLengthOrInvalidFormat", @@ -73,6 +86,10 @@ def disable_ecu(can_recv, can_send, bus=0, addr=0x7d0, sub_addr=None, com_cont_r if cc_success: return True elif cc_rejected: + if reset and cc_nrc == 0x22 and i < retry - 1: + ecu_log("CC rejected with NRC 0x22 after reset; retrying...") + time.sleep(0.2) + continue # ECU explicitly rejected - don't retry, it won't work ecu_log("=== ECU DISABLE REJECTED ===") return False diff --git a/opendbc_repo/opendbc/car/fingerprints.py b/opendbc_repo/opendbc/car/fingerprints.py index 66033a0c2..544e413c4 100644 --- a/opendbc_repo/opendbc/car/fingerprints.py +++ b/opendbc_repo/opendbc/car/fingerprints.py @@ -205,6 +205,7 @@ MIGRATION = { "HYUNDAI STARIA 4TH GEN": HYUNDAI.HYUNDAI_STARIA_4TH_GEN, "HYUNDAI TUCSON 2019": HYUNDAI.HYUNDAI_TUCSON, "HYUNDAI PALISADE 2020": HYUNDAI.HYUNDAI_PALISADE, + "HYUNDAI PALISADE 2023": HYUNDAI.HYUNDAI_PALISADE_2023, "HYUNDAI VELOSTER 2019": HYUNDAI.HYUNDAI_VELOSTER, "HYUNDAI SONATA HYBRID 2021": HYUNDAI.HYUNDAI_SONATA_HYBRID, "HYUNDAI IONIQ 5 2022": HYUNDAI.HYUNDAI_IONIQ_5, diff --git a/opendbc_repo/opendbc/car/hyundai/carcontroller.py b/opendbc_repo/opendbc/car/hyundai/carcontroller.py index 2229a8cb1..60abed1ea 100644 --- a/opendbc_repo/opendbc/car/hyundai/carcontroller.py +++ b/opendbc_repo/opendbc/car/hyundai/carcontroller.py @@ -333,7 +333,7 @@ class CarController(CarControllerBase): # tester present - w/ no response (keeps relevant ECU disabled) if self.frame % 100 == 0 and not (self.CP.flags & HyundaiFlags.CANFD_CAMERA_SCC) and self.long_active_ecu: # for longitudinal control, either radar or ADAS driving ECU - addr, bus = 0x7d0, self.CAN.ECAN if self.CP.flags & HyundaiFlags.CANFD else 0 + addr, bus = 0x7d0, self.CAN.ECAN if self.CP.flags & (HyundaiFlags.CANFD | HyundaiFlags.CAN_CANFD_BLENDED) else 0 if self.CP.flags & HyundaiFlags.CANFD_LKA_STEERING.value: addr, bus = 0x730, self.CAN.ECAN can_sends.append(make_tester_present_msg(addr, bus, suppress_response=True)) @@ -365,15 +365,22 @@ class CarController(CarControllerBase): def create_can_msgs(self, apply_steer_req, apply_torque, torque_fault, set_speed_in_units, accel, stopping, hud_control, actuators, CS, CC): can_sends = [] + can_canfd_blended = bool(self.CP.flags & HyundaiFlags.CAN_CANFD_BLENDED) # HUD messages sys_warning, sys_state, left_lane_warning, right_lane_warning = process_hud_alert(CC.enabled, self.car_fingerprint, hud_control) - can_sends.append(hyundaican.create_lkas11(self.packer, self.frame, self.CP, apply_torque, apply_steer_req, - torque_fault, CS.lkas11, sys_warning, sys_state, CC.enabled, - hud_control.leftLaneVisible, hud_control.rightLaneVisible, - left_lane_warning, right_lane_warning)) + if can_canfd_blended: + can_sends.extend(hyundaican.create_lkas11_can_canfd_blended(self.packer, self.frame, self.CP, apply_torque, apply_steer_req, + torque_fault, CS.lkas11, sys_warning, sys_state, CC.enabled, + hud_control.leftLaneVisible, hud_control.rightLaneVisible, + left_lane_warning, right_lane_warning, CS.msg_364)) + else: + can_sends.append(hyundaican.create_lkas11(self.packer, self.frame, self.CP, apply_torque, apply_steer_req, + torque_fault, CS.lkas11, sys_warning, sys_state, CC.enabled, + hud_control.leftLaneVisible, hud_control.rightLaneVisible, + left_lane_warning, right_lane_warning)) # Button messages if not self.long_active_ecu: @@ -387,24 +394,33 @@ class CarController(CarControllerBase): if (self.frame - self.last_button_frame) * DT_CTRL >= 0.15: self.last_button_frame = self.frame + if self.long_active_ecu and can_canfd_blended: + can_sends.extend(hyundaican.create_radar_aux_messages(self.packer, self.CAN, self.frame)) + if self.frame % 2 == 0 and self.long_active_ecu: # TODO: unclear if this is needed jerk = 3.0 if actuators.longControlState == LongCtrlState.pid else 1.0 use_fca = self.CP.flags & HyundaiFlags.USE_FCA.value - can_sends.extend(hyundaican.create_acc_commands(self.packer, CC.enabled, accel, jerk, int(self.frame / 2), - hud_control, set_speed_in_units, stopping, - CC.cruiseControl.override, use_fca, self.CP)) + if can_canfd_blended: + can_sends.extend(hyundaican.create_acc_commands_can_canfd_blended(self.packer, CC.enabled, accel, jerk, + int(self.frame / 2), hud_control, + set_speed_in_units, stopping, + CC.cruiseControl.override, use_fca, self.CP)) + else: + can_sends.extend(hyundaican.create_acc_commands(self.packer, CC.enabled, accel, jerk, int(self.frame / 2), + hud_control, set_speed_in_units, stopping, + CC.cruiseControl.override, use_fca, self.CP)) # 20 Hz LFA MFA message if self.frame % 5 == 0 and self.CP.flags & HyundaiFlags.SEND_LFA.value: - can_sends.append(hyundaican.create_lfahda_mfc(self.packer, CC.enabled)) + can_sends.append(hyundaican.create_lfahda_mfc(self.packer, CC.enabled, self.frame, self.CP)) # 5 Hz ACC options - if self.frame % 20 == 0 and self.long_active_ecu: + if self.frame % 20 == 0 and self.long_active_ecu and not can_canfd_blended: can_sends.extend(hyundaican.create_acc_opt(self.packer, self.CP)) # 2 Hz front radar options - if self.frame % 50 == 0 and self.long_active_ecu: + if self.frame % 50 == 0 and self.long_active_ecu and not can_canfd_blended: can_sends.append(hyundaican.create_frt_radar_opt(self.packer)) return can_sends diff --git a/opendbc_repo/opendbc/car/hyundai/carstate.py b/opendbc_repo/opendbc/car/hyundai/carstate.py index ce9770a20..45e5db884 100644 --- a/opendbc_repo/opendbc/car/hyundai/carstate.py +++ b/opendbc_repo/opendbc/car/hyundai/carstate.py @@ -86,6 +86,7 @@ class CarState(CarStateBase): self.buttons_counter = 0 self.cruise_info = {} + self.msg_364 = {} self.stock_lfa_msg = {} self.stock_lfahda_cluster_msg = {} self.stock_blinker_stalks_ts = 0 @@ -177,11 +178,15 @@ class CarState(CarStateBase): if cruise_has_set_speed: ret.cruiseState.speed = cruise_set_speed * speed_conv else: - ret.cruiseState.available = cp_cruise.vl["SCC11"]["MainMode_ACC"] == 1 + scc_msg = "SCC12" if self.CP.flags & HyundaiFlags.CAN_CANFD_BLENDED else "SCC11" + ret.cruiseState.available = cp_cruise.vl[scc_msg]["MainMode_ACC"] == 1 ret.cruiseState.enabled = cp_cruise.vl["SCC12"]["ACCMode"] != 0 - ret.cruiseState.standstill = cp_cruise.vl["SCC11"]["SCCInfoDisplay"] == 4. - ret.cruiseState.nonAdaptive = cp_cruise.vl["SCC11"]["SCCInfoDisplay"] == 2. # Shows 'Cruise Control' on dash - ret.cruiseState.speed = cp_cruise.vl["SCC11"]["VSetDis"] * speed_conv + ret.cruiseState.standstill = cp_cruise.vl[scc_msg]["SCCInfoDisplay"] == 4. + ret.cruiseState.nonAdaptive = cp_cruise.vl[scc_msg]["SCCInfoDisplay"] == 2. # Shows 'Cruise Control' on dash + ret.cruiseState.speed = cp_cruise.vl[scc_msg]["VSetDis"] * speed_conv + + if self.CP.flags & HyundaiFlags.CAN_CANFD_BLENDED: + self.msg_364 = copy.copy(cp_cam.vl["ALERTS_364"]) # TODO: Find brake pressure ret.brake = 0 @@ -217,7 +222,8 @@ class CarState(CarStateBase): ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(gear)) - if not self.CP.openpilotLongitudinalControl or self.CP.flags & HyundaiFlags.CAMERA_SCC: + if (not self.CP.openpilotLongitudinalControl or self.CP.flags & HyundaiFlags.CAMERA_SCC) and \ + not (self.CP.flags & HyundaiFlags.CAN_CANFD_BLENDED): aeb_src = "FCA11" if self.CP.flags & HyundaiFlags.USE_FCA.value else "SCC12" aeb_sig = "FCA_CmdAct" if self.CP.flags & HyundaiFlags.USE_FCA.value else "AEB_CmdAct" aeb_warning = cp_cruise.vl[aeb_src]["CF_VSM_Warn"] != 0 diff --git a/opendbc_repo/opendbc/car/hyundai/fingerprints.py b/opendbc_repo/opendbc/car/hyundai/fingerprints.py index e1def32e2..63157f820 100644 --- a/opendbc_repo/opendbc/car/hyundai/fingerprints.py +++ b/opendbc_repo/opendbc/car/hyundai/fingerprints.py @@ -467,6 +467,33 @@ FW_VERSIONS = { b'\xf1\x00ON MFC AT USA LHD 1.00 1.04 99211-S9100 211227', ], }, + CAR.HYUNDAI_PALISADE_2023: { + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00ON MDPS C 1.00 1.01 56300-S9500 2922', + b'\xf1\x00LXP MDPS C 1.00 1.00 56310-S8620 4LXPC100', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00ON MFC AT USA LHD 1.00 1.00 99211-S9170 240531', + b'\xf1\x00ON MFC AT USA LHD 1.00 1.01 99211-S9160 230802', + b'\xf1\x00LX2 MFC AT USA LHD 1.00 1.04 99211-S8150 220622', + b'\xf1\x00LX2 MFC AT RUS LHD 1.00 1.04 99211-S8150 220622', + b'\xf1\x00ON MFC AT USA LHD 1.00 1.01 99211-S9150 220708', + b'\xf1\x00ON MFC AT USA LHD 1.00 1.00 99211-S9160 230303', + b'\xf1\x00LX2 MFC AT USA LHD 1.00 1.01 99211-S8600 230817', + b'\xf1\x00LX2 MFC AT USA LHD 1.00 1.00 99211-S8700 240221', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00ON__ SCC FHCUP 1.00 1.00 99110-S9170 ', + b'\xf1\x00ON__ SCC FHCUP 1.00 1.00 99110-S9160 ', + b'\xf1\x00LX2_ SCC ----- 1.00 1.01 99110-S8150 ', + b'\xf1\x00ON__ SCC ----- 1.00 1.01 99110-S9150 ', + b'\xf1\x00LX2_ SCC FHCUP 1.00 1.01 99110-S8150 ', + b'\xf1\x00ON__ SCC FHCUP 1.00 1.01 99110-S9150 ', + b'\xf1\x00LX2 SCC FHCUP 1.00 1.00 99110-S8600 ', + b'\xf1\x00LX2_ SCC FHCUP 1.00 1.01 99110-S8700 ', + b'\xf1\x00LX2_ SCC F-CUP 1.00 1.01 99110-S8150 ', + ], + }, CAR.HYUNDAI_VELOSTER: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00JS__ SCC H-CUP 1.00 1.02 95650-J3200 ', diff --git a/opendbc_repo/opendbc/car/hyundai/hyundaican.py b/opendbc_repo/opendbc/car/hyundai/hyundaican.py index 8f3a049cd..ab0c1e194 100644 --- a/opendbc_repo/opendbc/car/hyundai/hyundaican.py +++ b/opendbc_repo/opendbc/car/hyundai/hyundaican.py @@ -1,4 +1,5 @@ import crcmod +from opendbc.car.hyundai.hyundaicanfd import CanBus from opendbc.car.hyundai.values import CAR, HyundaiFlags hyundai_checksum = crcmod.mkCrcFun(0x11D, initCrc=0xFD, rev=False, xorOut=0xdf) @@ -96,6 +97,47 @@ def create_lkas11(packer, frame, CP, apply_torque, steer_req, return packer.make_can_msg("LKAS11", 0, values) +def create_checksum_can_canfd_blended(packer, bus, addr, values): + dat = packer.make_can_msg(addr, bus, values)[1] + return hyundai_checksum(dat[1:8]) + + +def create_lkas11_can_canfd_blended(packer, frame, CP, apply_steer, steer_req, + torque_fault, lkas11, sys_warning, sys_state, enabled, + left_lane, right_lane, + left_lane_depart, right_lane_depart, msg_364): + bus = CanBus(CP).ECAN + values = { + "CF_Lkas_LdwsActivemode": int(left_lane) + (int(right_lane) << 1), + "CF_Lkas_LdwsLHWarning": left_lane_depart, + "CF_Lkas_LdwsRHWarning": right_lane_depart, + "CF_Lkas_FcwOpt_USM": 2 if enabled else 1, + "CR_Lkas_StrToqReq": apply_steer, + "CF_Lkas_ActToi": steer_req, + "CF_Lkas_ToiFlt": torque_fault, + "CF_Lkas_MsgCount": frame % 0x10, + "NEW_SIGNAL_1": 0, + "NEW_SIGNAL_5": 100, + } + values["CF_Lkas_Chksum"] = create_checksum_can_canfd_blended(packer, bus, "LKAS11", values) + + alerts_364 = {k: v for k, v in msg_364.items() if k not in ("CHECKSUM", "COUNTER")} if msg_364 else {} + alerts_364.setdefault("BYTE2", 0) + alerts_364.setdefault("BYTE3", 0) + alerts_364.setdefault("DAW_Status", 0) + alerts_364["DAW_Warning"] = 0 + alerts_364.setdefault("BYTE5", 0) + alerts_364.setdefault("BYTE6", 0) + alerts_364.setdefault("BYTE7", 0) + alerts_364["COUNTER"] = frame % 0x10 + alerts_364["CHECKSUM"] = create_checksum_can_canfd_blended(packer, bus, "ALERTS_364", alerts_364) + + return [ + packer.make_can_msg("LKAS11", bus, values), + packer.make_can_msg("ALERTS_364", bus, alerts_364), + ] + + def create_clu11(packer, frame, clu11, button, CP): values = {s: clu11[s] for s in [ "CF_Clu_CruiseSwState", @@ -114,15 +156,77 @@ def create_clu11(packer, frame, clu11, button, CP): values["CF_Clu_CruiseSwState"] = button values["CF_Clu_AliveCnt1"] = frame % 0x10 # send buttons to camera on camera-scc based cars - bus = 2 if CP.flags & HyundaiFlags.CAMERA_SCC else 0 + if CP.flags & HyundaiFlags.CAMERA_SCC: + bus = 2 + elif CP.flags & HyundaiFlags.CAN_CANFD_BLENDED: + bus = CanBus(CP).ECAN + else: + bus = 0 return packer.make_can_msg("CLU11", bus, values) -def create_lfahda_mfc(packer, enabled): +def create_lfahda_mfc(packer, enabled, frame=None, CP=None): values = { "LFA_Icon_State": 2 if enabled else 0, } - return packer.make_can_msg("LFAHDA_MFC", 0, values) + can_canfd_blended = CP is not None and bool(CP.flags & HyundaiFlags.CAN_CANFD_BLENDED) + bus = CanBus(CP).ECAN if can_canfd_blended else 0 + if can_canfd_blended: + values["COUNTER"] = 0 if frame is None else frame % 0x10 + values["CHECKSUM"] = create_checksum_can_canfd_blended(packer, bus, "LFAHDA_MFC", values) + return packer.make_can_msg("LFAHDA_MFC", bus, 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 = [] + bus = CanBus(CP).ECAN + + scc11_values = { + "aReqRaw": accel, + "aReqValue": accel, + "JerkUpperLimit": upper_jerk, + "JerkLowerLimit": 5.0, + "ComfortBandUpper": 0.0, + "ComfortBandLower": 0.0, + "COUNTER": idx % 0x10, + } + scc11_values["CHECKSUM"] = create_checksum_can_canfd_blended(packer, bus, "SCC11", scc11_values) + commands.append(packer.make_can_msg("SCC11", bus, scc11_values)) + + scc12_values = { + "MainMode_ACC": 1, + "ACCMode_Inactive": 0 if enabled else 1, + "TauGapSet": hud_control.leadDistanceBars, + "VSetDis": set_speed if enabled else 0, + "ACC_ObjDist": 1, + "ACCMode": 2 if enabled and long_override else 1 if enabled else 0, + "StopReq": 1 if stopping else 0, + "ACC_ObjDist_Ref": 1, + "COUNTER": idx % 0x10, + } + scc12_values["CHECKSUM"] = create_checksum_can_canfd_blended(packer, bus, "SCC12", scc12_values) + commands.append(packer.make_can_msg("SCC12", bus, scc12_values)) + + scc14_values = { + "ACC_ObjRelSpd": 0, + "ObjValid": 1, + "ObjStatus": 1, + "COUNTER": idx % 0x10, + } + scc14_values["CHECKSUM"] = create_checksum_can_canfd_blended(packer, bus, "SCC14", scc14_values) + commands.append(packer.make_can_msg("SCC14", bus, scc14_values)) + + if use_fca and not (CP.flags & HyundaiFlags.CAMERA_SCC): + fca11_values = { + "cr_vsm_deccmd": 255, + "cf_vsm_deccmdact": 127, + "COUNTER": idx % 0x10, + } + fca11_values["CHECKSUM"] = create_checksum_can_canfd_blended(packer, bus, "FCA11", fca11_values) + commands.append(packer.make_can_msg("FCA11", bus, fca11_values)) + + return commands def create_acc_commands(packer, enabled, accel, upper_jerk, idx, hud_control, set_speed, stopping, long_override, use_fca, CP): @@ -149,11 +253,10 @@ def create_acc_commands(packer, enabled, accel, upper_jerk, idx, hud_control, se "CR_VSM_Alive": idx % 0xF, } - # show AEB disabled indicator on dash with SCC12 if not sending FCA messages. - # these signals also prevent a TCS fault on non-FCA cars with alpha longitudinal + # Keep ESC/TCS happy on non-FCA cars without explicitly showing the disabled AEB icon. if not use_fca: scc12_values["CF_VSM_ConfMode"] = 1 - scc12_values["AEB_Status"] = 1 # AEB disabled + scc12_values["AEB_Status"] = 2 scc12_dat = packer.make_can_msg("SCC12", 0, scc12_values)[1] scc12_values["CR_VSM_ChkSum"] = 0x10 - sum(sum(divmod(i, 16)) for i in scc12_dat) % 0x10 @@ -179,7 +282,7 @@ def create_acc_commands(packer, enabled, accel, upper_jerk, idx, hud_control, se "CR_FCA_Alive": idx % 0xF, "PAINT1_Status": 1, "FCA_DrvSetStatus": 1, - "FCA_Status": 1, # AEB disabled + "FCA_Status": 2, } fca11_dat = packer.make_can_msg("FCA11", 0, fca11_values)[1] fca11_values["CR_FCA_ChkSum"] = hyundai_checksum(fca11_dat[:7]) @@ -203,7 +306,7 @@ def create_acc_opt(packer, CP): if not (CP.flags & HyundaiFlags.CAMERA_SCC): fca12_values = { "FCA_DrvSetState": 2, - "FCA_USM": 1, # AEB disabled + "FCA_USM": 2, } commands.append(packer.make_can_msg("FCA12", 0, fca12_values)) @@ -215,3 +318,20 @@ def create_frt_radar_opt(packer): "CF_FCA_Equip_Front_Radar": 1, } return packer.make_can_msg("FRT_RADAR11", 0, frt_radar11_values) + + +def create_radar_aux_messages(packer, CAN, frame): + commands = [] + + for addr, freq, values in ( + ("RADAR_0x363", 2, {"FCA_ESA": 1}), + ("RADAR_0x398", 5, {"BYTE4": 0x80, "BYTE5": 0x10}), + ): + if frame % freq != 0: + continue + + msg_values = values | {"COUNTER": frame % 0x10} + msg_values["CHECKSUM"] = create_checksum_can_canfd_blended(packer, CAN.ECAN, addr, msg_values) + commands.append(packer.make_can_msg(addr, CAN.ECAN, msg_values)) + + return commands diff --git a/opendbc_repo/opendbc/car/hyundai/interface.py b/opendbc_repo/opendbc/car/hyundai/interface.py index 01315d953..a11343b8f 100644 --- a/opendbc_repo/opendbc/car/hyundai/interface.py +++ b/opendbc_repo/opendbc/car/hyundai/interface.py @@ -34,6 +34,13 @@ def apply_platform_longitudinal_params(ret: structs.CarParams) -> None: ret.stoppingDecelRate = 0.4 +def apply_ecu_disable_failure_fallback(CP: structs.CarParams, params) -> None: + params.put_bool("EcuDisableFailed", True) + CP.safetyConfigs[-1].safetyParam &= ~HyundaiSafetyFlags.LONG.value + CP.openpilotLongitudinalControl = False + CP.pcmCruise = True + + class CarInterface(CarInterfaceBase): CarState = CarState CarController = CarController @@ -107,14 +114,14 @@ class CarInterface(CarInterfaceBase): else: # Shared configuration for non CAN-FD cars ret.alphaLongitudinalAvailable = candidate not in UNSUPPORTED_LONGITUDINAL_CAR - ret.enableBsm = 0x58b in fingerprint[0] + ret.enableBsm = 0x58b in fingerprint[CAN.ECAN] # Send LFA message on cars with HDA - if 0x485 in fingerprint[2]: + 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 - if 0x38d in fingerprint[0] or 0x38d in fingerprint[2]: + if 0x38d in fingerprint[CAN.ECAN] or 0x38d in fingerprint[CAN.CAM]: ret.flags |= HyundaiFlags.USE_FCA.value if ret.flags & HyundaiFlags.LEGACY: @@ -127,8 +134,10 @@ class CarInterface(CarInterfaceBase): ret.safetyConfigs[0].safetyParam |= HyundaiSafetyFlags.CAMERA_SCC.value # These cars have the LFA button on the steering wheel - if 0x391 in fingerprint[0]: + if 0x391 in fingerprint[0] or ret.flags & HyundaiFlags.CAN_CANFD_BLENDED: ret.flags |= HyundaiFlags.HAS_LDA_BUTTON.value + if ret.flags & HyundaiFlags.CAN_CANFD_BLENDED: + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CAN_CANFD_BLENDED.value if candidate == CAR.KIA_FORTE: has_scc_fw = any(fw.ecu == Ecu.fwdRadar for fw in car_fw) @@ -209,7 +218,7 @@ class CarInterface(CarInterfaceBase): ecu_log(f"=== init() called: opLong={CP.openpilotLongitudinalControl}, flags=0x{CP.flags:x}, safetyParam={CP.safetyConfigs[-1].safetyParam} ===") if CP.openpilotLongitudinalControl and not (CP.flags & (HyundaiFlags.CANFD_CAMERA_SCC | HyundaiFlags.CAMERA_SCC)): - addr, bus = 0x7d0, CanBus(CP).ECAN if CP.flags & HyundaiFlags.CANFD else 0 + addr, bus = 0x7d0, CanBus(CP).ECAN if CP.flags & (HyundaiFlags.CANFD | HyundaiFlags.CAN_CANFD_BLENDED) else 0 if CP.flags & HyundaiFlags.CANFD_LKA_STEERING.value: addr, bus = 0x730, CanBus(CP).ECAN @@ -217,7 +226,8 @@ class CarInterface(CarInterfaceBase): # If it fails (READY mode returns NRC 0x22, or timeout), strip LONG safety flag # so panda forwards stock SCC messages normally (lateral-only mode). ecu_log(f"=== ECU DISABLE attempt: addr=0x{addr:x}, bus={bus} ===") - ecu_disabled = disable_ecu(can_recv, can_send, bus=bus, addr=addr, com_cont_req=communication_control) + ecu_disabled = disable_ecu(can_recv, can_send, bus=bus, addr=addr, com_cont_req=communication_control, + reset=bool(CP.flags & HyundaiFlags.CAN_CANFD_BLENDED)) if CP.carFingerprint == CAR.HYUNDAI_IONIQ_6: # Ioniq 6: track success/failure to auto-switch between openpilot long and stock ACC @@ -227,15 +237,15 @@ class CarInterface(CarInterfaceBase): params.put_bool("ExperimentalMode", True) ecu_log("=== ECU DISABLE SUCCESS - Longitudinal + Experimental ENABLED ===") else: - params.put_bool("EcuDisableFailed", True) - CP.safetyConfigs[-1].safetyParam &= ~HyundaiSafetyFlags.LONG.value + apply_ecu_disable_failure_fallback(CP, params) ecu_log(f"=== ECU DISABLE FAILED - safetyParam stripped to {CP.safetyConfigs[-1].safetyParam}, lateral-only mode ===") else: - # Other cars: just log, don't change safety params or params store if ecu_disabled: + params.put_bool("EcuDisableFailed", False) ecu_log("=== ECU DISABLE SUCCESS ===") else: - ecu_log("=== ECU DISABLE FAILED ===") + apply_ecu_disable_failure_fallback(CP, params) + ecu_log(f"=== ECU DISABLE FAILED - safetyParam stripped to {CP.safetyConfigs[-1].safetyParam}, lateral-only mode ===") # for blinkers if CP.flags & HyundaiFlags.ENABLE_BLINKERS: diff --git a/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py b/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py index 86b5bd53c..60b73c0d5 100644 --- a/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py +++ b/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py @@ -5,7 +5,7 @@ import pytest from opendbc.can import CANPacker, CANParser from opendbc.car import Bus, ButtonType, gen_empty_fingerprint -from opendbc.car.structs import CarParams +from opendbc.car.structs import CarControl, CarParams from opendbc.car.fw_versions import build_fw_dict, match_fw_to_car from opendbc.car.hyundai.carcontroller import Ioniq6LongitudinalTuningState, GenesisG90LongitudinalTuningState, \ update_ioniq_6_longitudinal_tuning, update_genesis_g90_longitudinal_tuning @@ -19,7 +19,7 @@ from opendbc.car.hyundai.values import CAMERA_SCC_CAR, CANFD_CAR, CAN_GEARS, CAR UNSUPPORTED_LONGITUDINAL_CAR, PLATFORM_CODE_ECUS, HYUNDAI_VERSION_REQUEST_LONG, \ CarControllerParams, DBC, HyundaiFlags, get_platform_codes, HyundaiSafetyFlags -LongCtrlState = CarParams.Actuators.LongControlState +LongCtrlState = CarControl.Actuators.LongControlState from opendbc.car.hyundai.fingerprints import FW_VERSIONS Ecu = CarParams.Ecu @@ -97,6 +97,29 @@ class TestHyundaiFingerprint: CP = CarInterface.get_params(CAR.KIA_SPORTAGE_HEV_2026, fingerprint, [], False, False, False, None) assert CP.flags & HyundaiFlags.SEND_LFA + palisade_2023 = CarInterface.get_params(CAR.HYUNDAI_PALISADE_2023, gen_empty_fingerprint(), [], True, False, False, None) + assert palisade_2023.flags & HyundaiFlags.CAN_CANFD_BLENDED + assert DBC[palisade_2023.carFingerprint][Bus.pt] == "hyundai_palisade_2023_generated" + assert palisade_2023.safetyConfigs[-1].safetyParam & HyundaiSafetyFlags.CAN_CANFD_BLENDED + + def test_palisade_2023_disable_failure_falls_back_to_stock_acc(self, monkeypatch): + toggles = get_test_toggles() + CP = CarInterface.get_params(CAR.HYUNDAI_PALISADE_2023, gen_empty_fingerprint(), [], True, False, False, toggles) + + called = {} + + def fake_disable_ecu(*args, **kwargs): + called.update(kwargs) + return False + + monkeypatch.setattr("opendbc.car.hyundai.interface.disable_ecu", fake_disable_ecu) + CarInterface.init(CP, None, None) + + assert called["reset"] is True + assert not CP.openpilotLongitudinalControl + assert CP.pcmCruise + assert not (CP.safetyConfigs[-1].safetyParam & HyundaiSafetyFlags.LONG) + def test_canfd_longitudinal_params_match_family_tune(self): toggles = get_test_toggles() CP = CarInterface.get_params(CAR.KIA_EV6, gen_empty_fingerprint(), [], True, False, False, toggles) @@ -372,12 +395,81 @@ class TestHyundaiFingerprint: assert parser.can_valid assert parser.vl["SCC11"]["MainMode_ACC"] == 1 assert parser.vl["SCC12"]["StopReq"] == 0 + assert parser.vl["SCC12"]["CF_VSM_ConfMode"] == 1 + assert parser.vl["SCC12"]["AEB_Status"] == 2 assert parser.vl["SCC12"]["aReqRaw"] == pytest.approx(-1.0) assert parser.vl["SCC12"]["aReqValue"] == pytest.approx(-1.0) assert parser.vl["SCC14"]["ComfortBandUpper"] == pytest.approx(0.0) assert parser.vl["SCC14"]["ComfortBandLower"] == pytest.approx(0.0) assert parser.vl["SCC14"]["JerkLowerLimit"] == pytest.approx(5.0) + def test_can_acc_commands_use_enabled_fca_status(self): + CP = CarParams.new_message() + CP.carFingerprint = CAR.GENESIS_G90 + + packer = CANPacker(DBC[CP.carFingerprint][Bus.pt]) + parser = CANParser(DBC[CP.carFingerprint][Bus.pt], [("FCA11", 0)], 0) + + msgs = hyundaican.create_acc_commands(packer, enabled=True, accel=-1.0, upper_jerk=2.5, idx=3, + hud_control=SimpleNamespace(leadDistanceBars=3, leadVisible=False), set_speed=42, + stopping=False, long_override=False, use_fca=True, CP=CP) + parser.update([(1, msgs)]) + + assert parser.can_valid + assert parser.vl["FCA11"]["FCA_Status"] == 2 + + def test_can_canfd_blended_acc_commands_use_palisade_2023_layout(self): + CP = CarParams.new_message() + CP.carFingerprint = CAR.HYUNDAI_PALISADE_2023 + CP.flags = int(HyundaiFlags.CAN_CANFD_BLENDED) + + packer = CANPacker(DBC[CP.carFingerprint][Bus.pt]) + parser = CANParser(DBC[CP.carFingerprint][Bus.pt], [ + ("SCC11", 0), + ("SCC12", 0), + ("SCC14", 0), + ("RADAR_0x363", 0), + ("RADAR_0x398", 0), + ], 0) + + msgs = hyundaican.create_acc_commands_can_canfd_blended( + packer, + enabled=True, + accel=-1.0, + upper_jerk=2.5, + idx=3, + hud_control=SimpleNamespace(leadDistanceBars=3), + set_speed=42, + stopping=False, + long_override=False, + use_fca=False, + CP=CP, + ) + msgs.extend(hyundaican.create_radar_aux_messages(packer, CanBus(CP), 10)) + parser.update([(1, msgs)]) + + assert parser.can_valid + assert parser.vl["SCC11"]["aReqRaw"] == pytest.approx(-1.0) + assert parser.vl["SCC11"]["aReqValue"] == pytest.approx(-1.0) + assert parser.vl["SCC12"]["ACCMode"] == 1 + assert parser.vl["SCC12"]["MainMode_ACC"] == 1 + assert parser.vl["SCC14"]["ObjStatus"] == 1 + assert parser.vl["RADAR_0x363"]["FCA_ESA"] == 1 + + def test_can_acc_optional_messages_use_enabled_fca_usm(self): + CP = CarParams.new_message() + CP.carFingerprint = CAR.GENESIS_G90 + + packer = CANPacker(DBC[CP.carFingerprint][Bus.pt]) + parser = CANParser(DBC[CP.carFingerprint][Bus.pt], [("FCA12", 0)], 0) + + msgs = hyundaican.create_acc_opt(packer, CP) + parser.update([(1, msgs)]) + + assert parser.can_valid + assert parser.vl["FCA12"]["FCA_DrvSetState"] == 2 + assert parser.vl["FCA12"]["FCA_USM"] == 2 + def test_sportage_angle_steering_uses_adas_cmd_with_send_lfa(self): fingerprint = gen_empty_fingerprint() cam_can = CanBus(None, fingerprint).CAM @@ -654,7 +746,7 @@ class TestHyundaiFingerprint: # Third and fourth character are usually EV/hybrid identifiers codes = {code.split(b"-")[0][:2] for code, _ in get_platform_codes(fws)} - if car_model == CAR.HYUNDAI_PALISADE: + if car_model in (CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_PALISADE_2023): assert codes == {b"LX", b"ON"}, f"Car has unexpected platform codes: {car_model} {codes}" elif car_model == CAR.HYUNDAI_KONA_EV and ecu[0] == Ecu.fwdCamera: assert codes == {b"OE", b"OS"}, f"Car has unexpected platform codes: {car_model} {codes}" diff --git a/opendbc_repo/opendbc/car/hyundai/values.py b/opendbc_repo/opendbc/car/hyundai/values.py index b2cc4a5eb..b4155975b 100644 --- a/opendbc_repo/opendbc/car/hyundai/values.py +++ b/opendbc_repo/opendbc/car/hyundai/values.py @@ -81,6 +81,13 @@ class CarControllerParams: self.STEER_DELTA_UP = 2 self.STEER_DELTA_DOWN = 3 + elif CP.flags & HyundaiFlags.CAN_CANFD_BLENDED: + self.STEER_MAX = 404 + self.STEER_DRIVER_ALLOWANCE = 50 + self.STEER_THRESHOLD = 150 + self.STEER_DELTA_UP = 2 + self.STEER_DELTA_DOWN = 3 + # Default for most HKG else: self.STEER_MAX = 384 @@ -99,6 +106,7 @@ class HyundaiSafetyFlags(IntFlag): ALT_LIMITS_2 = 512 CANFD_ANGLE_STEERING = 1024 NON_SCC = 4096 + CAN_CANFD_BLENDED = 8192 class HyundaiStarPilotSafetyFlags(IntFlag): @@ -174,6 +182,9 @@ class HyundaiFlags(IntFlag): # Hyundai CAN-FD angle-based steering path used on newer ADAS platforms. CANFD_ANGLE_STEERING = 2 ** 28 + # Palisade/Telluride 2023+ uses CAN routing with CAN-FD-style checksums. + CAN_CANFD_BLENDED = 2 ** 29 + @dataclass class HyundaiCarDocs(CarDocs): @@ -191,6 +202,9 @@ class HyundaiPlatformConfig(PlatformConfig): if self.flags & HyundaiFlags.MIN_STEER_32_MPH: self.specs = self.specs.override(minSteerSpeed=32 * CV.MPH_TO_MS) + if self.flags & HyundaiFlags.CAN_CANFD_BLENDED: + self.dbc_dict = {Bus.pt: "hyundai_palisade_2023_generated"} + @dataclass class HyundaiCanFDPlatformConfig(PlatformConfig): @@ -371,6 +385,16 @@ class CAR(Platforms): CarSpecs(mass=1999, wheelbase=2.9, steerRatio=15.6 * 1.15, tireStiffnessFactor=0.63), flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, ) + HYUNDAI_PALISADE_2023 = HyundaiPlatformConfig( + [ + HyundaiCarDocs("Hyundai Palisade (without HDA II) 2023-25", "Highway Driving Assist", + car_parts=CarParts.common([CarHarness.hyundai_a])), + HyundaiCarDocs("Kia Telluride (without HDA II) 2023-25", "Highway Driving Assist", + car_parts=CarParts.common([CarHarness.hyundai_l])), + ], + HYUNDAI_PALISADE.specs, + flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.CAN_CANFD_BLENDED | HyundaiFlags.RADAR_SCC, + ) HYUNDAI_VELOSTER = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Veloster 2019-20", min_enable_speed=5. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_e]))], CarSpecs(mass=2917 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75 * 1.15, tireStiffnessFactor=0.5), diff --git a/opendbc_repo/opendbc/car/torque_data/substitute.toml b/opendbc_repo/opendbc/car/torque_data/substitute.toml index 9f67cac72..4d8fa581d 100644 --- a/opendbc_repo/opendbc/car/torque_data/substitute.toml +++ b/opendbc_repo/opendbc/car/torque_data/substitute.toml @@ -33,6 +33,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "HYUNDAI_KONA_2022" = "HYUNDAI_KONA_EV" "HYUNDAI_KONA_HEV" = "HYUNDAI_KONA_EV" "HYUNDAI_KONA_EV_2022" = "HYUNDAI_KONA_EV" +"HYUNDAI_PALISADE_2023" = "HYUNDAI_PALISADE" "HYUNDAI_IONIQ" = "HYUNDAI_IONIQ_PHEV_2019" "HYUNDAI_IONIQ_HEV_2022" = "HYUNDAI_IONIQ_PHEV_2019" "HYUNDAI_IONIQ_EV_2020" = "HYUNDAI_IONIQ_PHEV_2019" diff --git a/opendbc_repo/opendbc/dbc/generator/hyundai/hyundai_palisade_2023.dbc b/opendbc_repo/opendbc/dbc/generator/hyundai/hyundai_palisade_2023.dbc index 68f5d60af..0e0902af3 100644 --- a/opendbc_repo/opendbc/dbc/generator/hyundai/hyundai_palisade_2023.dbc +++ b/opendbc_repo/opendbc/dbc/generator/hyundai/hyundai_palisade_2023.dbc @@ -188,6 +188,50 @@ BO_ 640 EMS13: 8 XXX SG_ TCO : 24|8@1+ (0.75,-48) [0|0] "" XXX SG_ TIA : 48|8@1+ (0.75,-48) [0|0] "" XXX +BO_ 683 ESCC: 8 XXX + SG_ FCA_CmdAct : 0|1@1+ (1,0) [0|1] "" ESC + SG_ CF_VSM_Warn_FCA11 : 1|2@1+ (1,0) [0|3] "" ACU,CLU,ESC + SG_ AEB_CmdAct : 3|1@1+ (1,0) [0|1] "" ESC + SG_ CF_VSM_Warn_SCC12 : 4|2@1+ (1,0) [0|3] "" CLU,ESC,IAP + SG_ CF_VSM_DecCmdAct_SCC12 : 6|1@1+ (1,0) [0|1] "" ESC + SG_ CF_VSM_DecCmdAct_FCA11 : 7|1@1+ (1,0) [0|1] "" ESC + SG_ CR_VSM_DecCmd_SCC12 : 8|8@1+ (0.01,0) [0|2.55] "g" ESC + SG_ ObjValid : 16|1@1+ (1,0) [0|1] "" CLU,ESC,TCU + SG_ ACC_ObjStatus : 17|2@1+ (1,0) [0|3] "" ABS,ESC + SG_ ACC_ObjRelSpd : 40|9@1+ (0.1,-16.4) [0|0] "m/s" ABS,ESC + SG_ ACC_ObjDist : 24|11@1+ (0.1,0) [0|204.7] "m" ABS,ESC + SG_ CR_VSM_DecCmd_FCA11 : 56|8@1+ (0.01,0) [0|2.55] "g" ESC + +BO_ 2016 ESCC_DEBUG: 8 XXX + SG_ safety_mode : 0|8@1+ (1,0) [0|255] "" XXX + SG_ watchdog_fails : 8|8@1+ (1,0) [0|255] "" XXX + SG_ fwd_hook_count : 16|16@1+ (1,0) [0|255] "" XXX + SG_ fifo_overrun : 32|8@1+ (1,0) [0|255] "" XXX + SG_ fifo_overrun_count : 40|8@1+ (1,0) [0|255] "" XXX + SG_ can3_queue : 48|16@1+ (1,0) [0|255] "" XXX + +BO_ 2017 ESCC_DEBUG2: 8 XXX + SG_ CAN1_TME0 : 26|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_TME1 : 27|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_TME2 : 28|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_ALST0 : 2|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_ALST1 : 10|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_ALST2 : 18|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_TERR0 : 1|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_TERR1 : 9|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_TERR2 : 17|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_RQCP0 : 0|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_RQCP1 : 8|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_RQCP2 : 16|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_TX_ERR_CNT : 32|8@1+ (1,0) [0|255] "" XXX + SG_ CAN1_RX_ERR_CNT : 40|8@1+ (1,0) [0|255] "" XXX + SG_ CAN1_EWGF : 48|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_EPVF : 49|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_BOFF : 50|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_LEC : 56|3@1+ (1,0) [0|7] "" XXX + +VAL_ 2017 CAN1_LEC 0 "No Error" 1 "Stuff Error" 2 "Form Error" 3 "Ack Error" 4 "Bit Recessive Error" 5 "Bit Dominant Error" 6 "CRC Error" 7 "Set by Software" ; + BO_ 688 SAS11: 5 XXX SG_ CheckSum : 36|4@1+ (1,0) [0|0] "" XXX SG_ MsgCount : 32|4@1+ (1,0) [0|0] "" XXX @@ -256,7 +300,7 @@ BO_ 854 M_356: 8 XXX SG_ PAINT4 : 38|1@0+ (1,0) [0|0] "" XXX BO_ 867 RADAR_0x363: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX SG_ FCA_ESA : 8|2@1+ (1,0) [0|3] "" XXX SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX @@ -266,6 +310,17 @@ BO_ 867 RADAR_0x363: 8 XXX SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX +BO_ 868 ALERTS_364: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ DAW_Status : 35|3@1+ (1,0) [0|0] "" XXX + SG_ DAW_Warning : 39|1@1+ (1,0) [0|7] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|255] "" XXX + BO_ 870 EMS_366: 8 XXX SG_ N : 8|16@1+ (0.25,0) [0|0] "" XXX SG_ SWI_IGK : 48|1@0+ (1,0) [0|0] "" XXX @@ -275,6 +330,7 @@ BO_ 870 EMS_366: 8 XXX BO_ 871 LVR12: 8 XXX SG_ CF_Lvr_CruiseSet : 0|8@1+ (1,0) [0|0] "" XXX + SG_ AUTO_START_STOP_STATUS : 8|2@1+ (1,0) [0|3] "" XXX SG_ CF_Lvr_Gear : 32|4@1+ (1,0) [0|0] "" XXX BO_ 872 LVR11: 8 XXX @@ -329,26 +385,29 @@ BO_ 903 WHL_PUL11: 6 XXX SG_ WHL_PUL_RR : 24|8@1+ (0.5,0) [0|0] "" XXX BO_ 905 SCC14: 8 XXX - SG_ ACC_ObjLatPos : 16|9@1+ (0.1,-20) [-20|31.1] "m" ABS,ESC - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ ACC_ObjRelSpd : 16|9@1+ (0.1,-20) [-20|31.1] "m/s" ABS,ESC + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX - SG_ ObjGap : 51|3@1+ (1,0) [0|255] "" CLU,HUD,ESC + SG_ ObjValid : 27|1@1+ (1,0) [0|1] "" CLU,ESC,TCU + SG_ ObjStatus : 51|3@1+ (1,0) [0|7] "" CLU,HUD,ESC BO_ 909 FCA11: 8 XXX - SG_ CR_FCA_ChkSum : 0|8@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX - SG_ CR_FCA_Alive : 12|4@1+ (1,0) [0|0] "" XXX - SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ aeb_cmd_act : 16|1@1+ (1,0) [0|1] "" XXX + SG_ fca_cmd_act : 19|1@1+ (1,0) [0|1] "" XXX + SG_ fca_fault : 32|2@1+ (1,0) [0|3] "" XXX + SG_ cr_vsm_deccmd : 38|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 47|1@1+ (1,0) [0|1] "" XXX + SG_ cf_vsm_deccmdact : 48|7@1+ (1,-127) [0|15] "" XXX + SG_ cf_vsm_warn_1 : 55|1@1+ (1,0) [0|0] "" XXX + SG_ cf_vsm_warn_2 : 57|1@1+ (1,0) [0|1] "" XXX + SG_ cf_vsm_warn_3 : 62|1@1+ (1,0) [0|0] "" XXX BO_ 913 BCM_PO_11: 8 XXX SG_ BCM_Door_Dri_Status : 5|1@0+ (1,0) [0|0] "" XXX SG_ BCM_Shift_R_MT_SW_Status : 39|2@0+ (1,0) [0|0] "" XXX - SG_ LFA_Pressed : 4|1@0+ (1,0) [0|0] "" XXX + SG_ LDA_BTN : 4|1@0+ (1,0) [0|0] "" XXX BO_ 916 TCS13: 8 XXX SG_ ACCEL_REF_ACC : 32|11@1+ (0.01,-10.23) [0|0] "" XXX @@ -359,7 +418,7 @@ BO_ 916 TCS13: 8 XXX SG_ AliveCounterTCS : 13|3@1+ (1,0) [0|0] "" XXX SG_ BrakeLight : 11|1@1+ (1,0) [0|0] "" XXX SG_ CF_DriBkeStat : 60|1@1+ (1,0) [0|0] "" XXX - SG_ CF_VSM_Avail : 57|2@1+ (1,0) [0|0] "" XXX + SG_ CF_FCW_AEB_Status : 57|2@1+ (1,0) [0|0] "" XXX SG_ CF_VSM_Coded : 56|1@1+ (1,0) [0|0] "" XXX SG_ CF_VSM_ConfSwi : 61|2@1+ (1,0) [0|0] "" XXX SG_ CF_VSM_Handshake : 59|1@1+ (1,0) [0|0] "" XXX @@ -378,7 +437,7 @@ BO_ 916 TCS13: 8 XXX SG_ aBasis : 0|11@1+ (0.01,-10.23) [0|0] "" XXX BO_ 920 RADAR_0x398: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX @@ -389,7 +448,7 @@ BO_ 920 RADAR_0x398: 8 XXX SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX BO_ 921 RADAR_0x399: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX @@ -400,7 +459,7 @@ BO_ 921 RADAR_0x399: 8 XXX SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX BO_ 922 RADAR_0x39a: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX @@ -411,7 +470,7 @@ BO_ 922 RADAR_0x39a: 8 XXX SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX BO_ 923 RADAR_0x39b: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX @@ -422,7 +481,7 @@ BO_ 923 RADAR_0x39b: 8 XXX SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX BO_ 924 RADAR_0x39c: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX @@ -470,25 +529,27 @@ BO_ 1042 ICM_412h: 8 XXX SG_ WarningSoundOutput_3Group : 7|1@0+ (1,0) [0|0] "" XXX BO_ 1056 SCC11: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX - SG_ AliveCounterACC : 12|4@1+ (1,0) [0|15] "" CLU,EMS,ESC,TCU - SG_ JerkLowerLimit : 50|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC - SG_ JerkUpperLimit : 43|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC - SG_ ObjValid : 59|1@1+ (1,0) [0|1] "" CLU,ESC,TCU - SG_ aReqRaw : 27|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" Vector__XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" CLU,EMS,ESC,TCU SG_ aReqValue : 16|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" Vector__XXX + SG_ aReqRaw : 27|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" Vector__XXX + SG_ JerkUpperLimit : 38|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC + SG_ JerkLowerLimit : 45|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC + SG_ ComfortBandUpper : 52|6@1+ (0.02,0) [0|1.26] "m/s^2" ESC + SG_ ComfortBandLower : 58|6@1+ (0.02,0) [0|1.26] "m/s^2" ESC BO_ 1057 SCC12: 8 XXX SG_ ACCMode : 28|2@1+ (1,0) [0|3] "" CLU,HUD,LDWS_LKAS,ESC SG_ ACCMode_Inactive : 30|1@1+ (1,0) [0|1] "" CLU,HUD,LDWS_LKAS,ESC SG_ ACC_ObjDist : 16|11@1+ (0.1,0) [0|204.7] "m" ABS,ESC - SG_ CR_VSM_ChkSum : 0|8@1+ (1,0) [0|0] "" XXX - SG_ CR_VSM_Alive : 12|4@1+ (1,0) [0|15] "" ESC,PSB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" ESC,PSB SG_ MainMode_ACC : 27|1@1+ (1,0) [0|1] "" CLU,EMS,ESC SG_ SCCInfoDisplay : 32|3@1+ (1,0) [0|7] "" CLU,ESC SG_ TauGapSet : 37|3@1+ (1,0) [0|7] "" CLU,ESC,TCU SG_ VSetDis : 41|8@1+ (1,0) [0|255] "km/h or MPH" CLU,ESC,TCU SG_ StopReq : 49|1@1+ (1,0) [0|1] "" EPB,ESC + SG_ ACC_ObjDist_Ref : 50|11@1+ (0.1,0) [0|204.7] "" CLU,HUD,LDWS_LKAS,ESC BO_ 1064 _4WD11: 8 XXX SG_ AUTO_ACT : 43|1@1+ (1,0) [0|0] "" XXX @@ -519,7 +580,7 @@ BO_ 1078 PAS11: 4 XXX SG_ CF_Gway_PASSystemOn : 24|2@1+ (1,0) [0|0] "" XXX BO_ 1082 RADAR_0x43a: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX @@ -529,6 +590,11 @@ BO_ 1082 RADAR_0x43a: 8 XXX SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX +BO_ 1123 MSG_463: 8 XXX + SG_ DRV_MODE_PRIMARY_STATUS : 0|8@1+ (1,0) [0|255] "" XXX + SG_ DRV_MODE_SECONDARY_STATUS : 8|8@1+ (1,0) [0|255] "" XXX + SG_ DRV_MODE_EXT_IND : 16|8@1+ (1,0) [0|255] "" XXX + BO_ 1136 P_STS: 8 XXX SG_ Checksum : 62|2@1+ (1,0) [0|0] "" XXX SG_ Counter : 58|4@1+ (1,0) [0|0] "" XXX @@ -549,7 +615,7 @@ BO_ 1151 ESP11: 6 XXX SG_ _4WD_TQC_LIM : 16|16@1+ (1,0) [0|0] "" XXX BO_ 1157 LFAHDA_MFC: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_2 : 16|1@0+ (1,0) [0|0] "" XXX @@ -602,15 +668,15 @@ BO_ 1170 EMS19: 8 XXX BO_ 1173 YRS13: 8 XXX SG_ YRS_SeralNo : 16|48@1+ (1,0) [0|0] "" XXX -BO_ 1186 FRT_RADAR11: 2 XXX - SG_ BYTE0 : 0|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE1 : 8|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX +BO_ 1186 FRT_RADAR11: 8 FCA + SG_ BYTE0 : 0|8@1+ (1,0) [0|7] "" LDWS_LKAS,LDW_LKA,ESC + SG_ BYTE1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|255] "" XXX BO_ 1265 CLU11: 4 XXX SG_ CF_Clu_AliveCnt1 : 28|4@1+ (1,0) [0|0] "" XXX @@ -686,13 +752,15 @@ BO_ 1322 CLU15: 8 XXX BO_ 1342 LKAS12: 8 XXX SG_ CF_LkasDawStatus : 40|3@1+ (1,0) [0|0] "" XXX - SG_ CF_LkasTsrSpeed_Display_Navi : 24|8@1+ (1,0) [0|0] "" XXX - SG_ CF_Lkas_Daw_USM : 37|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Lkas_TsrAddinfo_Display : 32|2@1+ (1,0) [0|0] "" XXX + SG_ CF_LkasTsrSpeed_Display_Navi : 32|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Lkas_TsrSpeed_Display_Clu : 24|8@1+ (1,0) [0|0] "" XXX SG_ CF_Lkas_TsrSlifOpt : 10|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Lkas_TsrSpeed_Display_Clu : 16|8@1+ (1,0) [0|0] "" XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ CF_SLA_Avail : 48|2@1+ (1,0) [0|3] "" XXX + SG_ CF_SLA_AdjDisp : 51|2@1+ (1,0) [0|3] "" XXX + SG_ Sign_detected : 56|5@1+ (1,0) [0|255] "" XXX + SG_ CF_SLA_ACT : 61|1@0+ (1,0) [0|1] "" XXX BO_ 1345 CGW1: 8 XXX SG_ CF_Gway_ALightStat : 37|1@1+ (1,0) [0|0] "" XXX @@ -852,14 +920,26 @@ BO_ 1456 CLU12: 4 XXX SG_ CF_Clu_Odometer : 0|24@1+ (0.1,0) [0|0] "" XXX +CM_ SG_ 1123 DRV_MODE_PRIMARY_STATUS "Indicates the current drive mode selected by the driver (Smart, Sport, Comfort, ECO, Snow). This is a status-only signal, not writable."; +CM_ SG_ 1123 DRV_MODE_SECONDARY_STATUS "Indicates a secondary status modifier, often used in combination with PRIMARY to disambiguate ECO vs Snow. Status-only."; +CM_ SG_ 1123 DRV_MODE_EXT_IND "Drive mode extension indicator (e.g. Snow Mode flag). Status-only signal."; CM_ SG_ 1348 SpeedLim_Nav_Clu "Speed limit displayed on Nav, Cluster and HUD"; +CM_ SG_ 1342 CF_SLA_ACT "Speed limit assist active flag"; +CM_ SG_ 1342 CF_SLA_AdjDisp "Display of the automatically adjusting speed message"; +CM_ SG_ 1342 CF_SLA_Avail "Up or Down arrow showing speed limit assist available"; VAL_ 871 CF_Lvr_Gear 12 "T" 5 "D" 8 "S" 6 "N" 7 "R" 0 "P"; +VAL_ 871 AUTO_START_STOP_STATUS 3 "Off" 1 "On"; VAL_ 909 CF_VSM_Warn 2 "FCW" 3 "AEB"; VAL_ 916 ACCEnable 0 "SCC ready" 1 "SCC temp fault" 2 "SCC permanent fault" 3 "SCC permanent fault, communication issue"; +VAL_ 916 CF_FCW_AEB_Status 0 "Normal" 3 "Fault"; VAL_ 1057 ACCMode 0 "off" 1 "enabled" 2 "driver_override" 3 "off_maybe_fault" 4 "cancelled"; +VAL_ 1123 DRV_MODE_PRIMARY_STATUS 49 "Smart" 33 "Sport" 1 "Comfort" 17 "ECO_or_Snow"; +VAL_ 1123 DRV_MODE_SECONDARY_STATUS 1 "Normal" 17 "Snow"; +VAL_ 1123 DRV_MODE_EXT_IND 0 "Standard" 16 "SnowFlag"; VAL_ 1157 HDA_Icon_State 0 "no_hda" 1 "white_hda" 2 "green_hda"; VAL_ 1157 LFA_SysWarning 0 "no_message" 1 "switching_to_hda" 2 "switching_to_scc" 3 "lfa_error" 4 "check_hda" 5 "keep_hands_on_wheel_orange" 6 "keep_hands_on_wheel_red"; VAL_ 1157 LFA_Icon_State 0 "no_wheel" 1 "white_wheel" 2 "green_wheel" 3 "green_wheel_blink"; VAL_ 1157 HDA_SysWarning 0 "no_message" 1 "driving_convenience_systems_cancelled" 2 "highway_drive_assist_system_cancelled"; VAL_ 1322 CF_Clu_Gear 1 "P" 2 "R" 4 "N" 8 "D"; +VAL_ 1342 Sign_detected 1 "Slow/Caution" 8 "Stop" 9 "Yield" \ No newline at end of file diff --git a/opendbc_repo/opendbc/dbc/hyundai_palisade_2023_generated.dbc b/opendbc_repo/opendbc/dbc/hyundai_palisade_2023_generated.dbc index 57c2e0cb9..57cae4252 100644 --- a/opendbc_repo/opendbc/dbc/hyundai_palisade_2023_generated.dbc +++ b/opendbc_repo/opendbc/dbc/hyundai_palisade_2023_generated.dbc @@ -425,6 +425,50 @@ BO_ 640 EMS13: 8 XXX SG_ TCO : 24|8@1+ (0.75,-48) [0|0] "" XXX SG_ TIA : 48|8@1+ (0.75,-48) [0|0] "" XXX +BO_ 683 ESCC: 8 XXX + SG_ FCA_CmdAct : 0|1@1+ (1,0) [0|1] "" ESC + SG_ CF_VSM_Warn_FCA11 : 1|2@1+ (1,0) [0|3] "" ACU,CLU,ESC + SG_ AEB_CmdAct : 3|1@1+ (1,0) [0|1] "" ESC + SG_ CF_VSM_Warn_SCC12 : 4|2@1+ (1,0) [0|3] "" CLU,ESC,IAP + SG_ CF_VSM_DecCmdAct_SCC12 : 6|1@1+ (1,0) [0|1] "" ESC + SG_ CF_VSM_DecCmdAct_FCA11 : 7|1@1+ (1,0) [0|1] "" ESC + SG_ CR_VSM_DecCmd_SCC12 : 8|8@1+ (0.01,0) [0|2.55] "g" ESC + SG_ ObjValid : 16|1@1+ (1,0) [0|1] "" CLU,ESC,TCU + SG_ ACC_ObjStatus : 17|2@1+ (1,0) [0|3] "" ABS,ESC + SG_ ACC_ObjRelSpd : 40|9@1+ (0.1,-16.4) [0|0] "m/s" ABS,ESC + SG_ ACC_ObjDist : 24|11@1+ (0.1,0) [0|204.7] "m" ABS,ESC + SG_ CR_VSM_DecCmd_FCA11 : 56|8@1+ (0.01,0) [0|2.55] "g" ESC + +BO_ 2016 ESCC_DEBUG: 8 XXX + SG_ safety_mode : 0|8@1+ (1,0) [0|255] "" XXX + SG_ watchdog_fails : 8|8@1+ (1,0) [0|255] "" XXX + SG_ fwd_hook_count : 16|16@1+ (1,0) [0|255] "" XXX + SG_ fifo_overrun : 32|8@1+ (1,0) [0|255] "" XXX + SG_ fifo_overrun_count : 40|8@1+ (1,0) [0|255] "" XXX + SG_ can3_queue : 48|16@1+ (1,0) [0|255] "" XXX + +BO_ 2017 ESCC_DEBUG2: 8 XXX + SG_ CAN1_TME0 : 26|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_TME1 : 27|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_TME2 : 28|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_ALST0 : 2|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_ALST1 : 10|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_ALST2 : 18|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_TERR0 : 1|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_TERR1 : 9|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_TERR2 : 17|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_RQCP0 : 0|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_RQCP1 : 8|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_RQCP2 : 16|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_TX_ERR_CNT : 32|8@1+ (1,0) [0|255] "" XXX + SG_ CAN1_RX_ERR_CNT : 40|8@1+ (1,0) [0|255] "" XXX + SG_ CAN1_EWGF : 48|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_EPVF : 49|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_BOFF : 50|1@1+ (1,0) [0|1] "" XXX + SG_ CAN1_LEC : 56|3@1+ (1,0) [0|7] "" XXX + +VAL_ 2017 CAN1_LEC 0 "No Error" 1 "Stuff Error" 2 "Form Error" 3 "Ack Error" 4 "Bit Recessive Error" 5 "Bit Dominant Error" 6 "CRC Error" 7 "Set by Software" ; + BO_ 688 SAS11: 5 XXX SG_ CheckSum : 36|4@1+ (1,0) [0|0] "" XXX SG_ MsgCount : 32|4@1+ (1,0) [0|0] "" XXX @@ -493,7 +537,7 @@ BO_ 854 M_356: 8 XXX SG_ PAINT4 : 38|1@0+ (1,0) [0|0] "" XXX BO_ 867 RADAR_0x363: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX SG_ FCA_ESA : 8|2@1+ (1,0) [0|3] "" XXX SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX @@ -503,6 +547,17 @@ BO_ 867 RADAR_0x363: 8 XXX SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX +BO_ 868 ALERTS_364: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ DAW_Status : 35|3@1+ (1,0) [0|0] "" XXX + SG_ DAW_Warning : 39|1@1+ (1,0) [0|7] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|255] "" XXX + BO_ 870 EMS_366: 8 XXX SG_ N : 8|16@1+ (0.25,0) [0|0] "" XXX SG_ SWI_IGK : 48|1@0+ (1,0) [0|0] "" XXX @@ -512,6 +567,7 @@ BO_ 870 EMS_366: 8 XXX BO_ 871 LVR12: 8 XXX SG_ CF_Lvr_CruiseSet : 0|8@1+ (1,0) [0|0] "" XXX + SG_ AUTO_START_STOP_STATUS : 8|2@1+ (1,0) [0|3] "" XXX SG_ CF_Lvr_Gear : 32|4@1+ (1,0) [0|0] "" XXX BO_ 872 LVR11: 8 XXX @@ -566,26 +622,29 @@ BO_ 903 WHL_PUL11: 6 XXX SG_ WHL_PUL_RR : 24|8@1+ (0.5,0) [0|0] "" XXX BO_ 905 SCC14: 8 XXX - SG_ ACC_ObjLatPos : 16|9@1+ (0.1,-20) [-20|31.1] "m" ABS,ESC - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ ACC_ObjRelSpd : 16|9@1+ (0.1,-20) [-20|31.1] "m/s" ABS,ESC + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX - SG_ ObjGap : 51|3@1+ (1,0) [0|255] "" CLU,HUD,ESC + SG_ ObjValid : 27|1@1+ (1,0) [0|1] "" CLU,ESC,TCU + SG_ ObjStatus : 51|3@1+ (1,0) [0|7] "" CLU,HUD,ESC BO_ 909 FCA11: 8 XXX - SG_ CR_FCA_ChkSum : 0|8@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX - SG_ CR_FCA_Alive : 12|4@1+ (1,0) [0|0] "" XXX - SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ aeb_cmd_act : 16|1@1+ (1,0) [0|1] "" XXX + SG_ fca_cmd_act : 19|1@1+ (1,0) [0|1] "" XXX + SG_ fca_fault : 32|2@1+ (1,0) [0|3] "" XXX + SG_ cr_vsm_deccmd : 38|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 47|1@1+ (1,0) [0|1] "" XXX + SG_ cf_vsm_deccmdact : 48|7@1+ (1,-127) [0|15] "" XXX + SG_ cf_vsm_warn_1 : 55|1@1+ (1,0) [0|0] "" XXX + SG_ cf_vsm_warn_2 : 57|1@1+ (1,0) [0|1] "" XXX + SG_ cf_vsm_warn_3 : 62|1@1+ (1,0) [0|0] "" XXX BO_ 913 BCM_PO_11: 8 XXX SG_ BCM_Door_Dri_Status : 5|1@0+ (1,0) [0|0] "" XXX SG_ BCM_Shift_R_MT_SW_Status : 39|2@0+ (1,0) [0|0] "" XXX - SG_ LFA_Pressed : 4|1@0+ (1,0) [0|0] "" XXX + SG_ LDA_BTN : 4|1@0+ (1,0) [0|0] "" XXX BO_ 916 TCS13: 8 XXX SG_ ACCEL_REF_ACC : 32|11@1+ (0.01,-10.23) [0|0] "" XXX @@ -596,7 +655,7 @@ BO_ 916 TCS13: 8 XXX SG_ AliveCounterTCS : 13|3@1+ (1,0) [0|0] "" XXX SG_ BrakeLight : 11|1@1+ (1,0) [0|0] "" XXX SG_ CF_DriBkeStat : 60|1@1+ (1,0) [0|0] "" XXX - SG_ CF_VSM_Avail : 57|2@1+ (1,0) [0|0] "" XXX + SG_ CF_FCW_AEB_Status : 57|2@1+ (1,0) [0|0] "" XXX SG_ CF_VSM_Coded : 56|1@1+ (1,0) [0|0] "" XXX SG_ CF_VSM_ConfSwi : 61|2@1+ (1,0) [0|0] "" XXX SG_ CF_VSM_Handshake : 59|1@1+ (1,0) [0|0] "" XXX @@ -615,7 +674,7 @@ BO_ 916 TCS13: 8 XXX SG_ aBasis : 0|11@1+ (0.01,-10.23) [0|0] "" XXX BO_ 920 RADAR_0x398: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX @@ -626,7 +685,7 @@ BO_ 920 RADAR_0x398: 8 XXX SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX BO_ 921 RADAR_0x399: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX @@ -637,7 +696,7 @@ BO_ 921 RADAR_0x399: 8 XXX SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX BO_ 922 RADAR_0x39a: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX @@ -648,7 +707,7 @@ BO_ 922 RADAR_0x39a: 8 XXX SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX BO_ 923 RADAR_0x39b: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX @@ -659,7 +718,7 @@ BO_ 923 RADAR_0x39b: 8 XXX SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX BO_ 924 RADAR_0x39c: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX @@ -707,25 +766,27 @@ BO_ 1042 ICM_412h: 8 XXX SG_ WarningSoundOutput_3Group : 7|1@0+ (1,0) [0|0] "" XXX BO_ 1056 SCC11: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX - SG_ AliveCounterACC : 12|4@1+ (1,0) [0|15] "" CLU,EMS,ESC,TCU - SG_ JerkLowerLimit : 50|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC - SG_ JerkUpperLimit : 43|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC - SG_ ObjValid : 59|1@1+ (1,0) [0|1] "" CLU,ESC,TCU - SG_ aReqRaw : 27|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" Vector__XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" CLU,EMS,ESC,TCU SG_ aReqValue : 16|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" Vector__XXX + SG_ aReqRaw : 27|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" Vector__XXX + SG_ JerkUpperLimit : 38|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC + SG_ JerkLowerLimit : 45|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC + SG_ ComfortBandUpper : 52|6@1+ (0.02,0) [0|1.26] "m/s^2" ESC + SG_ ComfortBandLower : 58|6@1+ (0.02,0) [0|1.26] "m/s^2" ESC BO_ 1057 SCC12: 8 XXX SG_ ACCMode : 28|2@1+ (1,0) [0|3] "" CLU,HUD,LDWS_LKAS,ESC SG_ ACCMode_Inactive : 30|1@1+ (1,0) [0|1] "" CLU,HUD,LDWS_LKAS,ESC SG_ ACC_ObjDist : 16|11@1+ (0.1,0) [0|204.7] "m" ABS,ESC - SG_ CR_VSM_ChkSum : 0|8@1+ (1,0) [0|0] "" XXX - SG_ CR_VSM_Alive : 12|4@1+ (1,0) [0|15] "" ESC,PSB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" ESC,PSB SG_ MainMode_ACC : 27|1@1+ (1,0) [0|1] "" CLU,EMS,ESC SG_ SCCInfoDisplay : 32|3@1+ (1,0) [0|7] "" CLU,ESC SG_ TauGapSet : 37|3@1+ (1,0) [0|7] "" CLU,ESC,TCU SG_ VSetDis : 41|8@1+ (1,0) [0|255] "km/h or MPH" CLU,ESC,TCU SG_ StopReq : 49|1@1+ (1,0) [0|1] "" EPB,ESC + SG_ ACC_ObjDist_Ref : 50|11@1+ (0.1,0) [0|204.7] "" CLU,HUD,LDWS_LKAS,ESC BO_ 1064 _4WD11: 8 XXX SG_ AUTO_ACT : 43|1@1+ (1,0) [0|0] "" XXX @@ -756,7 +817,7 @@ BO_ 1078 PAS11: 4 XXX SG_ CF_Gway_PASSystemOn : 24|2@1+ (1,0) [0|0] "" XXX BO_ 1082 RADAR_0x43a: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX @@ -766,6 +827,11 @@ BO_ 1082 RADAR_0x43a: 8 XXX SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX +BO_ 1123 MSG_463: 8 XXX + SG_ DRV_MODE_PRIMARY_STATUS : 0|8@1+ (1,0) [0|255] "" XXX + SG_ DRV_MODE_SECONDARY_STATUS : 8|8@1+ (1,0) [0|255] "" XXX + SG_ DRV_MODE_EXT_IND : 16|8@1+ (1,0) [0|255] "" XXX + BO_ 1136 P_STS: 8 XXX SG_ Checksum : 62|2@1+ (1,0) [0|0] "" XXX SG_ Counter : 58|4@1+ (1,0) [0|0] "" XXX @@ -786,7 +852,7 @@ BO_ 1151 ESP11: 6 XXX SG_ _4WD_TQC_LIM : 16|16@1+ (1,0) [0|0] "" XXX BO_ 1157 LFAHDA_MFC: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_2 : 16|1@0+ (1,0) [0|0] "" XXX @@ -839,15 +905,15 @@ BO_ 1170 EMS19: 8 XXX BO_ 1173 YRS13: 8 XXX SG_ YRS_SeralNo : 16|48@1+ (1,0) [0|0] "" XXX -BO_ 1186 FRT_RADAR11: 2 XXX - SG_ BYTE0 : 0|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE1 : 8|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX +BO_ 1186 FRT_RADAR11: 8 FCA + SG_ BYTE0 : 0|8@1+ (1,0) [0|7] "" LDWS_LKAS,LDW_LKA,ESC + SG_ BYTE1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|255] "" XXX BO_ 1265 CLU11: 4 XXX SG_ CF_Clu_AliveCnt1 : 28|4@1+ (1,0) [0|0] "" XXX @@ -923,13 +989,15 @@ BO_ 1322 CLU15: 8 XXX BO_ 1342 LKAS12: 8 XXX SG_ CF_LkasDawStatus : 40|3@1+ (1,0) [0|0] "" XXX - SG_ CF_LkasTsrSpeed_Display_Navi : 24|8@1+ (1,0) [0|0] "" XXX - SG_ CF_Lkas_Daw_USM : 37|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Lkas_TsrAddinfo_Display : 32|2@1+ (1,0) [0|0] "" XXX + SG_ CF_LkasTsrSpeed_Display_Navi : 32|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Lkas_TsrSpeed_Display_Clu : 24|8@1+ (1,0) [0|0] "" XXX SG_ CF_Lkas_TsrSlifOpt : 10|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Lkas_TsrSpeed_Display_Clu : 16|8@1+ (1,0) [0|0] "" XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ CF_SLA_Avail : 48|2@1+ (1,0) [0|3] "" XXX + SG_ CF_SLA_AdjDisp : 51|2@1+ (1,0) [0|3] "" XXX + SG_ Sign_detected : 56|5@1+ (1,0) [0|255] "" XXX + SG_ CF_SLA_ACT : 61|1@0+ (1,0) [0|1] "" XXX BO_ 1345 CGW1: 8 XXX SG_ CF_Gway_ALightStat : 37|1@1+ (1,0) [0|0] "" XXX @@ -1089,14 +1157,26 @@ BO_ 1456 CLU12: 4 XXX SG_ CF_Clu_Odometer : 0|24@1+ (0.1,0) [0|0] "" XXX +CM_ SG_ 1123 DRV_MODE_PRIMARY_STATUS "Indicates the current drive mode selected by the driver (Smart, Sport, Comfort, ECO, Snow). This is a status-only signal, not writable."; +CM_ SG_ 1123 DRV_MODE_SECONDARY_STATUS "Indicates a secondary status modifier, often used in combination with PRIMARY to disambiguate ECO vs Snow. Status-only."; +CM_ SG_ 1123 DRV_MODE_EXT_IND "Drive mode extension indicator (e.g. Snow Mode flag). Status-only signal."; CM_ SG_ 1348 SpeedLim_Nav_Clu "Speed limit displayed on Nav, Cluster and HUD"; +CM_ SG_ 1342 CF_SLA_ACT "Speed limit assist active flag"; +CM_ SG_ 1342 CF_SLA_AdjDisp "Display of the automatically adjusting speed message"; +CM_ SG_ 1342 CF_SLA_Avail "Up or Down arrow showing speed limit assist available"; VAL_ 871 CF_Lvr_Gear 12 "T" 5 "D" 8 "S" 6 "N" 7 "R" 0 "P"; +VAL_ 871 AUTO_START_STOP_STATUS 3 "Off" 1 "On"; VAL_ 909 CF_VSM_Warn 2 "FCW" 3 "AEB"; VAL_ 916 ACCEnable 0 "SCC ready" 1 "SCC temp fault" 2 "SCC permanent fault" 3 "SCC permanent fault, communication issue"; +VAL_ 916 CF_FCW_AEB_Status 0 "Normal" 3 "Fault"; VAL_ 1057 ACCMode 0 "off" 1 "enabled" 2 "driver_override" 3 "off_maybe_fault" 4 "cancelled"; +VAL_ 1123 DRV_MODE_PRIMARY_STATUS 49 "Smart" 33 "Sport" 1 "Comfort" 17 "ECO_or_Snow"; +VAL_ 1123 DRV_MODE_SECONDARY_STATUS 1 "Normal" 17 "Snow"; +VAL_ 1123 DRV_MODE_EXT_IND 0 "Standard" 16 "SnowFlag"; VAL_ 1157 HDA_Icon_State 0 "no_hda" 1 "white_hda" 2 "green_hda"; VAL_ 1157 LFA_SysWarning 0 "no_message" 1 "switching_to_hda" 2 "switching_to_scc" 3 "lfa_error" 4 "check_hda" 5 "keep_hands_on_wheel_orange" 6 "keep_hands_on_wheel_red"; VAL_ 1157 LFA_Icon_State 0 "no_wheel" 1 "white_wheel" 2 "green_wheel" 3 "green_wheel_blink"; VAL_ 1157 HDA_SysWarning 0 "no_message" 1 "driving_convenience_systems_cancelled" 2 "highway_drive_assist_system_cancelled"; VAL_ 1322 CF_Clu_Gear 1 "P" 2 "R" 4 "N" 8 "D"; +VAL_ 1342 Sign_detected 1 "Slow/Caution" 8 "Stop" 9 "Yield" \ No newline at end of file diff --git a/opendbc_repo/opendbc/safety/modes/hyundai.h b/opendbc_repo/opendbc/safety/modes/hyundai.h index 63f2d6038..8e60954d4 100644 --- a/opendbc_repo/opendbc/safety/modes/hyundai.h +++ b/opendbc_repo/opendbc/safety/modes/hyundai.h @@ -46,8 +46,11 @@ const LongitudinalLimits HYUNDAI_LONG_LIMITS = { {.msg = {{0x251, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \ {.msg = {{0x4F1, 0, 4, 50U, .ignore_checksum = true, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \ -#define HYUNDAI_SCC12_ADDR_CHECK(scc_bus) \ - {.msg = {{0x421, (scc_bus), 8, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \ +#define HYUNDAI_SCC11_ADDR_CHECK(scc_bus) \ + {.msg = {{0x420, (scc_bus), 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \ + +#define HYUNDAI_SCC12_ADDR_CHECK(scc_bus, can_canfd_blended) \ + {.msg = {{0x421, (scc_bus), 8, 50U, .ignore_checksum = (can_canfd_blended), .ignore_counter = (can_canfd_blended), .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \ #define HYUNDAI_FCEV_GAS_ADDR_CHECK \ {.msg = {{0x91, 0, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \ @@ -74,7 +77,8 @@ static uint8_t hyundai_get_counter(const CANPacket_t *msg) { } else if (msg->addr == 0x394U) { cnt = (msg->data[1] >> 5) & 0x7U; } else if (msg->addr == 0x421U) { - cnt = msg->data[7] & 0xFU; + uint8_t byte_421 = hyundai_can_canfd_blended ? (msg->data[1] >> 4) : msg->data[7]; + cnt = byte_421 & 0xFU; } else if (msg->addr == 0x4F1U) { cnt = (msg->data[3] >> 4) & 0xFU; } else { @@ -92,7 +96,7 @@ static uint32_t hyundai_get_checksum(const CANPacket_t *msg) { } else if (msg->addr == 0x394U) { chksum = msg->data[6] & 0xFU; } else if (msg->addr == 0x421U) { - chksum = msg->data[7] >> 4; + chksum = hyundai_can_canfd_blended ? msg->data[0] : msg->data[7] >> 4; } else { } return chksum; @@ -115,18 +119,22 @@ static uint32_t hyundai_compute_checksum(const CANPacket_t *msg) { } chksum = (chksum ^ 9U) & 15U; } else { - // sum of nibbles - for (int i = 0; i < 8; i++) { - if ((msg->addr == 0x394U) && (i == 7)) { - continue; // exclude + if (hyundai_can_canfd_blended && (msg->addr == 0x421U)) { + chksum = hyundai_common_canfd_compute_checksum(msg); + } else { + // sum of nibbles + for (int i = 0; i < 8; i++) { + if ((msg->addr == 0x394U) && (i == 7)) { + continue; // exclude + } + uint8_t b = msg->data[i]; + if (((msg->addr == 0x260U) && (i == 7)) || ((msg->addr == 0x394U) && (i == 6)) || ((msg->addr == 0x421U) && (i == 7))) { + b &= (msg->addr == 0x421U) ? 0x0FU : 0xF0U; // remove checksum + } + chksum += (b % 16U) + (b / 16U); } - uint8_t b = msg->data[i]; - if (((msg->addr == 0x260U) && (i == 7)) || ((msg->addr == 0x394U) && (i == 6)) || ((msg->addr == 0x421U) && (i == 7))) { - b &= (msg->addr == 0x421U) ? 0x0FU : 0xF0U; // remove checksum - } - chksum += (b % 16U) + (b / 16U); + chksum = (16U - (chksum % 16U)) % 16U; } - chksum = (16U - (chksum % 16U)) % 16U; } return chksum; @@ -138,7 +146,8 @@ static void hyundai_rx_hook(const CANPacket_t *msg) { if (msg->addr == 0x421U) { if (((msg->bus == 0U) && !hyundai_camera_scc) || ((msg->bus == 2U) && hyundai_camera_scc)) { // 2 bits: 13-14 - int cruise_engaged = (GET_BYTES(msg, 0, 4) >> 13) & 0x3U; + uint8_t cruise_byte = hyundai_can_canfd_blended ? (msg->data[3] >> 4) : (GET_BYTES(msg, 0, 4) >> 13); + int cruise_engaged = cruise_byte & 0x3U; hyundai_common_cruise_state_check(cruise_engaged); } } @@ -195,6 +204,7 @@ static bool hyundai_tx_hook(const CANPacket_t *msg) { const TorqueSteeringLimits HYUNDAI_STEERING_LIMITS = HYUNDAI_LIMITS(384, 3, 7); const TorqueSteeringLimits HYUNDAI_STEERING_LIMITS_ALT = HYUNDAI_LIMITS(270, 2, 3); const TorqueSteeringLimits HYUNDAI_STEERING_LIMITS_ALT_2 = HYUNDAI_LIMITS(170, 2, 3); + const TorqueSteeringLimits HYUNDAI_STEERING_LIMITS_CAN_CANFD_BLENDED = HYUNDAI_LIMITS(404, 2, 3); bool tx = true; @@ -210,19 +220,23 @@ static bool hyundai_tx_hook(const CANPacket_t *msg) { } // ACCEL: safety check - if (msg->addr == 0x421U) { - int desired_accel_raw = (((msg->data[4] & 0x7U) << 8) | msg->data[3]) - 1023U; - int desired_accel_val = ((msg->data[5] << 3) | (msg->data[4] >> 5)) - 1023U; + if (((msg->addr == 0x420U) && hyundai_can_canfd_blended) || ((msg->addr == 0x421U) && !hyundai_can_canfd_blended)) { + int desired_accel_raw = hyundai_can_canfd_blended ? ((((msg->data[4] & 0x3FU) << 5) | (msg->data[3] >> 3)) - 1023U) : + ((((msg->data[4] & 0x7U) << 8) | msg->data[3]) - 1023U); + int desired_accel_val = hyundai_can_canfd_blended ? ((((msg->data[3] & 0x7U) << 8) | msg->data[2]) - 1023U) : + (((msg->data[5] << 3) | (msg->data[4] >> 5)) - 1023U); - int aeb_decel_cmd = msg->data[2]; - bool aeb_req = GET_BIT(msg, 54U); + int aeb_decel_cmd = hyundai_can_canfd_blended ? 0 : msg->data[2]; + bool aeb_req = hyundai_can_canfd_blended ? false : GET_BIT(msg, 54U); bool violation = false; violation |= longitudinal_accel_checks(desired_accel_raw, HYUNDAI_LONG_LIMITS); violation |= longitudinal_accel_checks(desired_accel_val, HYUNDAI_LONG_LIMITS); - violation |= (aeb_decel_cmd != 0); - violation |= aeb_req; + if (!hyundai_can_canfd_blended) { + violation |= (aeb_decel_cmd != 0); + violation |= aeb_req; + } if (violation) { tx = false; @@ -234,7 +248,8 @@ static bool hyundai_tx_hook(const CANPacket_t *msg) { int desired_torque = ((GET_BYTES(msg, 0, 4) >> 16) & 0x7ffU) - 1024U; bool steer_req = GET_BIT(msg, 27U); - const TorqueSteeringLimits limits = hyundai_alt_limits_2 ? HYUNDAI_STEERING_LIMITS_ALT_2 : + const TorqueSteeringLimits limits = hyundai_can_canfd_blended ? HYUNDAI_STEERING_LIMITS_CAN_CANFD_BLENDED : + hyundai_alt_limits_2 ? HYUNDAI_STEERING_LIMITS_ALT_2 : hyundai_alt_limits ? HYUNDAI_STEERING_LIMITS_ALT : HYUNDAI_STEERING_LIMITS; if (steer_torque_cmd_checks(desired_torque, steer_req, limits)) { @@ -279,9 +294,35 @@ static safety_config hyundai_init(uint16_t param) { HYUNDAI_LONG_COMMON_TX_MSGS(2) }; + static const CanMsg HYUNDAI_CAN_CANFD_BLENDED_TX_MSGS[] = { + {0x340, 0, 8, .check_relay = true}, + {0x4F1, 0, 4, .check_relay = false}, + {0x485, 0, 8, .check_relay = true}, + {0x364, 0, 8, .check_relay = true}, + }; + + static const CanMsg HYUNDAI_CAN_CANFD_BLENDED_LONG_TX_MSGS[] = { + {0x340, 0, 8, .check_relay = true}, + {0x4F1, 0, 4, .check_relay = false}, + {0x485, 0, 8, .check_relay = true}, + {0x364, 0, 8, .check_relay = true}, + {0x420, 0, 8, .check_relay = true}, + {0x421, 0, 8, .check_relay = true}, + {0x389, 0, 8, .check_relay = true}, + {0x38D, 0, 8, .check_relay = false}, + {0x7D0, 0, 8, .check_relay = false}, + {0x363, 0, 8, .check_relay = false}, + {0x398, 0, 8, .check_relay = false}, + {0x4A2, 0, 8, .check_relay = false}, + }; + hyundai_common_init(param); hyundai_legacy = false; + if (hyundai_can_canfd_blended) { + gen_crc_lookup_table_16(0x1021, hyundai_canfd_crc_lut); + } + safety_config ret; if (hyundai_longitudinal) { // Use CLU11 (buttons) to manage controls allowed instead of SCC cruise state @@ -320,6 +361,8 @@ static safety_config hyundai_init(uint16_t param) { } if (hyundai_camera_scc) { SET_TX_MSGS(HYUNDAI_CAMERA_SCC_LONG_TX_MSGS, ret); + } else if (hyundai_can_canfd_blended) { + SET_TX_MSGS(HYUNDAI_CAN_CANFD_BLENDED_LONG_TX_MSGS, ret); } else { SET_TX_MSGS(HYUNDAI_LONG_TX_MSGS, ret); } @@ -327,12 +370,12 @@ static safety_config hyundai_init(uint16_t param) { } else if (hyundai_camera_scc) { static RxCheck hyundai_cam_scc_rx_checks[] = { HYUNDAI_COMMON_RX_CHECKS(false) - HYUNDAI_SCC12_ADDR_CHECK(2) + HYUNDAI_SCC12_ADDR_CHECK(2, false) }; static RxCheck hyundai_cam_scc_rx_checks_lda[] = { HYUNDAI_COMMON_RX_CHECKS(false) - HYUNDAI_SCC12_ADDR_CHECK(2) + HYUNDAI_SCC12_ADDR_CHECK(2, false) HYUNDAI_LDA_BUTTON_ADDR_CHECK }; @@ -341,21 +384,39 @@ static safety_config hyundai_init(uint16_t param) { } else { ret = BUILD_SAFETY_CFG(hyundai_cam_scc_rx_checks, HYUNDAI_CAMERA_SCC_TX_MSGS); } + } else if (hyundai_can_canfd_blended) { + static RxCheck hyundai_can_canfd_blended_rx_checks[] = { + HYUNDAI_COMMON_RX_CHECKS(false) + HYUNDAI_SCC12_ADDR_CHECK(0, true) + }; + + static RxCheck hyundai_can_canfd_blended_rx_checks_lda[] = { + HYUNDAI_COMMON_RX_CHECKS(false) + HYUNDAI_SCC12_ADDR_CHECK(0, true) + HYUNDAI_LDA_BUTTON_ADDR_CHECK + }; + + SET_TX_MSGS(HYUNDAI_CAN_CANFD_BLENDED_TX_MSGS, ret); + if (hyundai_has_lda_button) { + SET_RX_CHECKS(hyundai_can_canfd_blended_rx_checks_lda, ret); + } else { + SET_RX_CHECKS(hyundai_can_canfd_blended_rx_checks, ret); + } } else { static RxCheck hyundai_rx_checks[] = { HYUNDAI_COMMON_RX_CHECKS(false) - HYUNDAI_SCC12_ADDR_CHECK(0) + HYUNDAI_SCC12_ADDR_CHECK(0, false) }; static RxCheck hyundai_fcev_rx_checks[] = { HYUNDAI_COMMON_RX_CHECKS(false) - HYUNDAI_SCC12_ADDR_CHECK(0) + HYUNDAI_SCC12_ADDR_CHECK(0, false) HYUNDAI_FCEV_GAS_ADDR_CHECK }; static RxCheck hyundai_rx_checks_lda[] = { HYUNDAI_COMMON_RX_CHECKS(false) - HYUNDAI_SCC12_ADDR_CHECK(0) + HYUNDAI_SCC12_ADDR_CHECK(0, false) HYUNDAI_LDA_BUTTON_ADDR_CHECK }; @@ -372,7 +433,7 @@ static safety_config hyundai_init(uint16_t param) { static RxCheck hyundai_fcev_rx_checks_lda[] = { HYUNDAI_COMMON_RX_CHECKS(false) - HYUNDAI_SCC12_ADDR_CHECK(0) + HYUNDAI_SCC12_ADDR_CHECK(0, false) HYUNDAI_FCEV_GAS_ADDR_CHECK HYUNDAI_LDA_BUTTON_ADDR_CHECK }; @@ -407,7 +468,7 @@ static safety_config hyundai_legacy_init(uint16_t param) { // older hyundai models have less checks due to missing counters and checksums static RxCheck hyundai_legacy_rx_checks[] = { HYUNDAI_COMMON_RX_CHECKS(true) - HYUNDAI_SCC12_ADDR_CHECK(0) + HYUNDAI_SCC12_ADDR_CHECK(0, false) }; hyundai_common_init(param); diff --git a/opendbc_repo/opendbc/safety/modes/hyundai_common.h b/opendbc_repo/opendbc/safety/modes/hyundai_common.h index 10678df85..f9ab4e02d 100644 --- a/opendbc_repo/opendbc/safety/modes/hyundai_common.h +++ b/opendbc_repo/opendbc/safety/modes/hyundai_common.h @@ -42,6 +42,9 @@ bool hyundai_fcev_gas_signal = false; extern bool hyundai_alt_limits_2; bool hyundai_alt_limits_2 = false; +extern bool hyundai_can_canfd_blended; +bool hyundai_can_canfd_blended = false; + extern bool hyundai_has_lda_button; bool hyundai_has_lda_button = false; @@ -65,6 +68,7 @@ void hyundai_common_init(uint16_t param) { const int HYUNDAI_PARAM_HAS_LDA_BUTTON = 1024; const uint16_t HYUNDAI_PARAM_AOL_LKAS_ON_ENGAGE = 2048; const uint16_t HYUNDAI_PARAM_NON_SCC = 4096; + const uint16_t HYUNDAI_PARAM_CAN_CANFD_BLENDED = 8192; hyundai_ev_gas_signal = GET_FLAG(param, HYUNDAI_PARAM_EV_GAS); hyundai_hybrid_gas_signal = !hyundai_ev_gas_signal && GET_FLAG(param, HYUNDAI_PARAM_HYBRID_GAS); @@ -73,6 +77,7 @@ void hyundai_common_init(uint16_t param) { hyundai_alt_limits = GET_FLAG(param, HYUNDAI_PARAM_ALT_LIMITS); hyundai_fcev_gas_signal = GET_FLAG(param, HYUNDAI_PARAM_FCEV_GAS); hyundai_alt_limits_2 = GET_FLAG(param, HYUNDAI_PARAM_ALT_LIMITS_2); + hyundai_can_canfd_blended = GET_FLAG(param, HYUNDAI_PARAM_CAN_CANFD_BLENDED); hyundai_has_lda_button = GET_FLAG(param, HYUNDAI_PARAM_HAS_LDA_BUTTON); hyundai_aol_lkas_on_engage = GET_FLAG(param, HYUNDAI_PARAM_AOL_LKAS_ON_ENGAGE); @@ -142,7 +147,6 @@ void hyundai_common_cruise_buttons_check(const int cruise_button, const bool mai main_button_prev = main_button; } -#ifdef CANFD uint32_t hyundai_common_canfd_compute_checksum(const CANPacket_t *msg) { int len = GET_LEN(msg); uint32_t address = msg->addr; @@ -167,7 +171,6 @@ uint32_t hyundai_common_canfd_compute_checksum(const CANPacket_t *msg) { return crc; } -#endif void hyundai_lkas_button_check(const bool lkas_button) { if (lkas_button && !lkas_button_prev) { diff --git a/opendbc_repo/opendbc/safety/tests/common.py b/opendbc_repo/opendbc/safety/tests/common.py index 01bd80869..64fd83310 100644 --- a/opendbc_repo/opendbc/safety/tests/common.py +++ b/opendbc_repo/opendbc/safety/tests/common.py @@ -980,7 +980,11 @@ class SafetyTest(SafetyTestBase): continue if attr.startswith('TestHyundaiCanfd') and current_test.startswith('TestHyundaiCanfd'): continue - if {attr, current_test}.issubset({'TestHyundaiLongitudinalSafety', 'TestHyundaiLongitudinalSafetyCameraSCC', 'TestHyundaiSafetyFCEVLong'}): + if attr.startswith('TestHyundaiCanCanfdBlended') and current_test.startswith('TestHyundaiCanCanfdBlended'): + continue + if {attr, current_test}.issubset({'TestHyundaiLongitudinalSafety', 'TestHyundaiLongitudinalSafetyCameraSCC', + 'TestHyundaiSafetyFCEVLong', 'TestHyundaiLongitudinalAolLkasOnEngageSafety', + 'TestHyundaiCanCanfdBlendedLongitudinalSafety'}): continue volkswagen_shared = ('TestVolkswagenMqb', 'TestVolkswagenMlb') if attr.startswith(volkswagen_shared) and current_test.startswith(volkswagen_shared): @@ -1007,7 +1011,13 @@ class SafetyTest(SafetyTestBase): # exceptions for common msgs across different hondas tx = list(filter(lambda m: m[0] not in [0x1FA, 0x30C, 0x33D, 0x33DB], tx)) - if attr.startswith('TestHyundaiLongitudinal'): + if attr.startswith('TestHyundai') and current_test.startswith('TestHyundai'): + # common Hyundai lateral/button messages are intentionally shared across multiple safety variants + tx = list(filter(lambda m: m[0] not in [0x340, 0x4F1, 0x485], tx)) + + if attr.startswith('TestHyundaiLongitudinal') or attr in ('TestHyundaiSafetyFCEVLong', + 'TestHyundaiLongitudinalAolLkasOnEngageSafety', + 'TestHyundaiCanCanfdBlendedLongitudinalSafety'): # exceptions for common msgs across different Hyundai CAN platforms tx = list(filter(lambda m: m[0] not in [0x420, 0x50A, 0x389, 0x4A2], tx)) all_tx.append([[m[0], m[1], attr] for m in tx]) diff --git a/opendbc_repo/opendbc/safety/tests/hyundai_common.py b/opendbc_repo/opendbc/safety/tests/hyundai_common.py index ed328c84b..627cd785b 100644 --- a/opendbc_repo/opendbc/safety/tests/hyundai_common.py +++ b/opendbc_repo/opendbc/safety/tests/hyundai_common.py @@ -94,6 +94,7 @@ class HyundaiButtonBase: class HyundaiLongitudinalBase(common.LongitudinalAccelSafetyTest): + MAX_ACCEL = 3.5 DISABLED_ECU_UDS_MSG: tuple[int, int] DISABLED_ECU_ACTUATION_MSG: tuple[int, int] diff --git a/opendbc_repo/opendbc/safety/tests/test_hyundai.py b/opendbc_repo/opendbc/safety/tests/test_hyundai.py index 80d7d30ae..f41bf3128 100755 --- a/opendbc_repo/opendbc/safety/tests/test_hyundai.py +++ b/opendbc_repo/opendbc/safety/tests/test_hyundai.py @@ -168,6 +168,26 @@ class TestHyundaiSafetyNonScc(TestHyundaiSafety): self.assertTrue(self.safety.safety_config_valid()) +class TestHyundaiCanCanfdBlendedSafety(TestHyundaiSafety): + TX_MSGS = [[0x340, 0], [0x4F1, 0], [0x485, 0], [0x364, 0]] + RELAY_MALFUNCTION_ADDRS = {0: (0x340, 0x485, 0x364)} + FWD_BLACKLISTED_ADDRS = {2: [0x340, 0x485, 0x364]} + MAX_RATE_UP = 2 + MAX_RATE_DOWN = 3 + MAX_TORQUE_LOOKUP = [0], [404] + + def setUp(self): + self.packer = CANPackerSafety("hyundai_palisade_2023_generated") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.CAN_CANFD_BLENDED) + self.safety.init_tests() + + def _pcm_status_msg(self, enable): + values = {"ACCMode": enable, "COUNTER": self.cnt_cruise % 16} + self.__class__.cnt_cruise += 1 + return self.packer.make_can_msg_panda("SCC12", 0, values) + + class TestHyundaiSafetyFCEV(TestHyundaiSafety): def setUp(self): self.packer = CANPackerSafety("hyundai_kia_generic") @@ -259,6 +279,32 @@ class TestHyundaiLongitudinalSafety(HyundaiLongitudinalBase, TestHyundaiSafety): self.assertFalse(self._tx(self._accel_msg(0, aeb_decel=1.0))) +class TestHyundaiCanCanfdBlendedLongitudinalSafety(HyundaiLongitudinalBase, TestHyundaiCanCanfdBlendedSafety): + TX_MSGS = [[0x340, 0], [0x4F1, 0], [0x485, 0], [0x364, 0], [0x420, 0], [0x421, 0], [0x389, 0], [0x38D, 0], [0x4A2, 0], [0x363, 0], [0x398, 0], [0x7D0, 0]] + FWD_BLACKLISTED_ADDRS = {2: [0x340, 0x485, 0x364, 0x420, 0x421, 0x389]} + RELAY_MALFUNCTION_ADDRS = {0: (0x340, 0x485, 0x364, 0x420, 0x421, 0x389)} + MAX_ACCEL = 3.5 + + DISABLED_ECU_UDS_MSG = (0x7D0, 0) + DISABLED_ECU_ACTUATION_MSG = (0x420, 0) + + def setUp(self): + self.packer = CANPackerSafety("hyundai_palisade_2023_generated") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.CAN_CANFD_BLENDED | HyundaiSafetyFlags.LONG) + self.safety.init_tests() + + def _accel_msg(self, accel, aeb_req=False, aeb_decel=0): + values = { + "aReqRaw": accel, + "aReqValue": accel, + } + return self.packer.make_can_msg_panda("SCC11", 0, values) + + def test_no_aeb_fca11(self): + pass + + class TestHyundaiLongitudinalSafetyCameraSCC(HyundaiLongitudinalBase, TestHyundaiSafety): TX_MSGS = [[0x340, 0], [0x4F1, 2], [0x485, 0], [0x420, 0], [0x421, 0], [0x50A, 0], [0x389, 0], [0x4A2, 0]]