HKG Blended CAN/CAN-FD

This commit is contained in:
firestar5683
2026-05-01 23:20:45 -05:00
parent 0c39558afb
commit 712aa081bc
18 changed files with 756 additions and 161 deletions
+1 -1
View File
@@ -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)
+18 -1
View File
@@ -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
+1
View File
@@ -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,
@@ -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
+11 -5
View File
@@ -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
@@ -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 ',
+128 -8
View File
@@ -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
+20 -10
View File
@@ -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:
@@ -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}"
@@ -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),
@@ -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"
@@ -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"
@@ -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"
+91 -30
View File
@@ -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);
@@ -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) {
+12 -2
View File
@@ -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])
@@ -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]
@@ -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]]