Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hyundai: Sonata 2024 Port #1396

Draft
wants to merge 22 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion opendbc/car/hyundai/carcontroller.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,10 @@ def update(self, CC, CS, now_nanos):

# LFA and HDA icons
if self.frame % 5 == 0 and (not hda2 or hda2_long):
can_sends.append(hyundaicanfd.create_lfahda_cluster(self.packer, self.CAN, CC.enabled))
if self.car_fingerprint == CAR.HYUNDAI_SONATA_2024:
can_sends.extend(hyundaicanfd.create_ccnc(self.packer, self.CAN, self.frame, self.CP, CC, CS))
else:
can_sends.append(hyundaicanfd.create_lfahda_cluster(self.packer, self.CAN, CC.enabled))

# blinkers
if hda2 and self.CP.flags & HyundaiFlags.ENABLE_BLINKERS:
Expand Down
26 changes: 18 additions & 8 deletions opendbc/car/hyundai/carstate.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ def __init__(self, CP):

self.cruise_info = {}

self.ccnc_car = CP.carFingerprint in (CAR.HYUNDAI_SONATA_2024,)
self.msg_161 = {}
self.msg_162 = {}

# On some cars, CLU15->CF_Clu_VehicleSpeed can oscillate faster than the dash updates. Sample at 5 Hz
self.cluster_speed = 0
self.cluster_speed_counter = CLUSTER_SAMPLE_RATE
Expand Down Expand Up @@ -222,15 +226,16 @@ def update_canfd(self, can_parsers) -> structs.CarState:
ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > self.params.STEER_THRESHOLD, 5)
ret.steerFaultTemporary = cp.vl["MDPS"]["LKA_FAULT"] != 0

# TODO: alt signal usage may be described by cp.vl['BLINKERS']['USE_ALT_LAMP']
left_blinker_sig, right_blinker_sig = "LEFT_LAMP", "RIGHT_LAMP"
if self.CP.carFingerprint == CAR.HYUNDAI_KONA_EV_2ND_GEN:
left_blinker_sig, right_blinker_sig = "LEFT_LAMP_ALT", "RIGHT_LAMP_ALT"
ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_lamp(50, cp.vl["BLINKERS"][left_blinker_sig],
cp.vl["BLINKERS"][right_blinker_sig])
if self.ccnc_car:
self.msg_161 = copy.copy(cp_cam.vl["MSG_161"])
self.msg_162 = copy.copy(cp_cam.vl["MSG_162"])

alt = "_ALT" if self.ccnc_car else ""
ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_lamp(50, cp.vl["BLINKERS"][f"LEFT_LAMP{alt}"],
cp.vl["BLINKERS"][f"RIGHT_LAMP{alt}"])
if self.CP.enableBsm:
ret.leftBlindspot = cp.vl["BLINDSPOTS_REAR_CORNERS"]["FL_INDICATOR"] != 0
ret.rightBlindspot = cp.vl["BLINDSPOTS_REAR_CORNERS"]["FR_INDICATOR"] != 0
ret.leftBlindspot = cp.vl["BLINDSPOTS_REAR_CORNERS"][f"FL_INDICATOR{alt}"] != 0
ret.rightBlindspot = cp.vl["BLINDSPOTS_REAR_CORNERS"][f"FR_INDICATOR{alt}"] != 0

# cruise state
# CAN FD cars enable on main button press, set available if no TCS faults preventing engagement
Expand Down Expand Up @@ -314,6 +319,11 @@ def get_can_parsers_canfd(self, CP):
cam_messages += [
("SCC_CONTROL", 50),
]
if self.ccnc_car:
cam_messages += [
("MSG_161", 20),
("MSG_162", 20),
]

return {
Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], pt_messages, CanBus(CP).ECAN),
Expand Down
9 changes: 9 additions & 0 deletions opendbc/car/hyundai/fingerprints.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,15 @@
b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.07 99211-L1000 211223',
],
},
CAR.HYUNDAI_SONATA_2024: {
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00DN8_ RDR ----- 1.00 1.00 99110-L1800 ',
],
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.01 99211-L1800 230512',
b'\xf1\x00DN8 MFC AT KOR LHD 1.00 1.01 99211-L1800 230512',
],
},
CAR.HYUNDAI_SONATA_LF: {
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00LF__ SCC F-CUP 1.00 1.00 96401-C2200 ',
Expand Down
87 changes: 87 additions & 0 deletions opendbc/car/hyundai/hyundaicanfd.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from opendbc.car import CanBusBase
from opendbc.car.common.conversions import Conversions as CV
from opendbc.car.common.numpy_fast import clip
from opendbc.car.hyundai.values import HyundaiFlags

Expand Down Expand Up @@ -119,6 +120,92 @@ def create_lfahda_cluster(packer, CAN, enabled):
}
return packer.make_can_msg("LFAHDA_CLUSTER", CAN.ECAN, values)

def create_ccnc(packer, CAN, frame, car_params, car_control, car_state):
ret = []

msg_161 = car_state.msg_161.copy()
msg_162 = car_state.msg_162.copy()
enabled = car_control.enabled
hud_control = car_control.hudControl

# HIDE FAULTS
msg_162.update({
"FAULT_LSS": 0,
"FAULT_HDA": 0,
"FAULT_DAS": 0,
})

# HIDE ALERTS
if msg_161.get("ALERTS_5") == 5: # USE SWITCH OR PEDAL TO ACCELERATE
msg_161["ALERTS_5"] = 0
if msg_161.get("ALERTS_2") == 5: # CONSIDER TAKING A BREAK
msg_161.update({"ALERTS_2": 0, "SOUNDS_2": 0, "DAW_ICON": 0})

# LANELINES
curvature = {i: (31 if i == -1 else 13 - abs(i + 15)) if i < 0 else 15 + i for i in range(-15, 16)}
msg_161.update({
"LANELINE_CURVATURE": curvature.get(max(-15, min(int(car_state.out.steeringAngleDeg / 3), 15)), 14) if enabled else 15,
"LFA_ICON": 2 if enabled else 0,
"LKA_ICON": 4 if enabled else 0,
"LANELINE_LEFT": 2 if enabled else 0,
"LANELINE_RIGHT": 2 if enabled else 0,
"CENTERLINE": 1 if enabled else 0,
})

# LCA
if enabled:
speed_below_threshold = car_state.out.vEgo < 8.94
msg_161.update({
"LCA_LEFT_ICON": 0 if car_state.out.leftBlindspot or speed_below_threshold else 2 if car_control.leftBlinker else 1,
"LCA_RIGHT_ICON": 0 if car_state.out.rightBlindspot or speed_below_threshold else 2 if car_control.rightBlinker else 1,
"LCA_LEFT_ARROW": 2 if car_control.leftBlinker else 0,
"LCA_RIGHT_ARROW": 2 if car_control.rightBlinker else 0,
})

# LANE DEPARTURE
if hud_control.leftLaneDepart or hud_control.rightLaneDepart:
msg_162["VIBRATE"] = 1
if hud_control.leftLaneDepart:
msg_161["LANELINE_LEFT"] = 4 if (frame // 50) % 2 == 0 else 1
if hud_control.rightLaneDepart:
msg_161["LANELINE_RIGHT"] = 4 if (frame // 50) % 2 == 0 else 1


if car_params.openpilotLongitudinalControl:
# HIDE ALERTS
if msg_161.get("ALERTS_5") == 4: # SMART CRUISE CONTROL CONDITIONS NOT MET
msg_161["ALERTS_5"] = 0

# BACKGROUND,SETSPEED
msg_161.update({
"BACKGROUND": 1 if enabled else 7,
"SETSPEED": 3 if enabled else 1,
"SETSPEED_HUD": 2 if enabled else 1,
"SETSPEED_SPEED": 25 if (s := round(car_state.out.vCruiseCluster * CV.KPH_TO_MPH)) > 100 else s,
})

# DISTANCE
if 1 <= hud_control.leadDistanceBars <= 3:
msg_161["DISTANCE"] = hud_control.leadDistanceBars
msg_161["DISTANCE_SPACING"] = 1 if enabled else 0
msg_161["DISTANCE_LEAD"] = 2 if enabled and hud_control.leadVisible else 1 if enabled else 0
msg_161["DISTANCE_CAR"] = 2 if enabled else 1
msg_161["ALERTS_3"] = hud_control.leadDistanceBars + 6
else:
msg_161["DISTANCE"] = 0
msg_161["DISTANCE_SPACING"] = 0
msg_161["DISTANCE_LEAD"] = 0
msg_161["DISTANCE_CAR"] = 0

msg_162.update({
"LEAD": 2 if enabled else 1 if hud_control.leadVisible else 0,
"LEAD_DISTANCE": 100 if hud_control.leadVisible else 0,
})

ret.append(packer.make_can_msg("MSG_161", CAN.ECAN, msg_161))
ret.append(packer.make_can_msg("MSG_162", CAN.ECAN, msg_162))

return ret

def create_acc_control(packer, CAN, enabled, accel_last, accel, stopping, gas_override, set_speed, hud_control):
jerk = 5
Expand Down
4 changes: 4 additions & 0 deletions opendbc/car/hyundai/values.py
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,10 @@ class CAR(Platforms):
CarSpecs(mass=1513, wheelbase=2.84, steerRatio=13.27 * 1.15, tireStiffnessFactor=0.65), # 15% higher at the center seems reasonable
flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8,
)
HYUNDAI_SONATA_2024 = HyundaiCanFDPlatformConfig(
[HyundaiCarDocs("Hyundai Sonata 2024", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))],
CarSpecs(mass=1556, wheelbase=2.84, steerRatio=12.81),
)
HYUNDAI_SONATA_LF = HyundaiPlatformConfig(
[HyundaiCarDocs("Hyundai Sonata 2018-19", car_parts=CarParts.common([CarHarness.hyundai_e]))],
CarSpecs(mass=1536, wheelbase=2.804, steerRatio=13.27 * 1.15), # 15% higher at the center seems reasonable
Expand Down
1 change: 1 addition & 0 deletions opendbc/car/tests/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ class CarTestRoute(NamedTuple):
CarTestRoute("6a42c1197b2a8179|2023-09-21--10-23-44", HYUNDAI.KIA_OPTIMA_H_G4_FL),
CarTestRoute("c75a59efa0ecd502|2021-03-11--20-52-55", HYUNDAI.KIA_SELTOS),
CarTestRoute("5b7c365c50084530|2020-04-15--16-13-24", HYUNDAI.HYUNDAI_SONATA),
CarTestRoute("4267ea8a353cdb36/00000262--8a427003c7", HYUNDAI.HYUNDAI_SONATA_2024),
CarTestRoute("b2a38c712dcf90bd|2020-05-18--18-12-48", HYUNDAI.HYUNDAI_SONATA_LF),
CarTestRoute("c344fd2492c7a9d2|2023-12-11--09-03-23", HYUNDAI.HYUNDAI_STARIA_4TH_GEN),
CarTestRoute("fb3fd42f0baaa2f8|2022-03-30--15-25-05", HYUNDAI.HYUNDAI_TUCSON),
Expand Down
1 change: 1 addition & 0 deletions opendbc/car/torque_data/override.toml
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
"HYUNDAI_STARIA_4TH_GEN" = [1.8, 2.0, 0.15]
"GENESIS_GV70_ELECTRIFIED_1ST_GEN" = [1.9, 1.9, 0.09]
"GENESIS_G80_2ND_GEN_FL" = [2.5819356441497803, 2.5, 0.11244568973779678]
"HYUNDAI_SONATA_2024" = [2.5, 2.5, 0.1]

# Dashcam or fallback configured as ideal car
"MOCK" = [10.0, 10, 0.0]
Expand Down
112 changes: 112 additions & 0 deletions opendbc/dbc/hyundai_canfd.dbc
Original file line number Diff line number Diff line change
Expand Up @@ -599,6 +599,8 @@ BO_ 442 BLINDSPOTS_REAR_CORNERS: 24 XXX
SG_ FL_INDICATOR : 46|6@0+ (1,0) [0|1] "" XXX
SG_ FR_INDICATOR : 54|6@0+ (1,0) [0|63] "" XXX
SG_ RIGHT_BLOCKED : 64|1@0+ (1,0) [0|1] "" XXX
SG_ FL_INDICATOR_ALT : 138|1@0+ (1,0) [0|1] "" XXX
SG_ FR_INDICATOR_ALT : 141|1@0+ (1,0) [0|1] "" XXX

BO_ 874 BLINDSPOTS_FRONT_CORNER_2: 16 XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
Expand Down Expand Up @@ -658,6 +660,116 @@ BO_ 1264 LOCAL_TIME: 8 XXX
SG_ MINUTES : 21|6@0+ (1,0) [0|63] "" XXX
SG_ SECONDS : 31|8@0+ (1,0) [0|59] "" XXX

BO_ 353 MSG_161: 32 CCNC
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ FCA_ICON : 24|3@1+ (1,0) [0|7] "" XXX
SG_ FCA_ALT_ICON : 27|3@1+ (1,0) [0|7] "" XXX
SG_ LKA_ICON : 30|3@1+ (1,0) [0|3] "" XXX
SG_ HBA_ICON : 33|3@1+ (1,0) [0|7] "" XXX
SG_ ZEROS_1 : 36|4@1+ (1,0) [0|15] "" XXX
SG_ ZEROS_2 : 40|2@1+ (1,0) [0|3] "" XXX
SG_ FCA_IMAGE : 42|3@1+ (1,0) [0|7] "" XXX
SG_ ZEROS_3 : 45|3@1+ (1,0) [0|7] "" XXX
SG_ ZEROS_4 : 48|3@1+ (1,0) [0|7] "" XXX
SG_ BCA_LEFT : 51|3@1+ (1,0) [0|7] "" XXX
SG_ BCA_RIGHT : 54|3@1+ (1,0) [0|7] "" XXX
SG_ LCA_LEFT_ARROW : 57|3@1+ (1,0) [0|7] "" XXX
SG_ LCA_RIGHT_ARROW : 60|3@1+ (1,0) [0|7] "" XXX
SG_ ZEROS_5 : 63|1@0+ (1,0) [0|1] "" XXX
SG_ CENTERLINE : 64|2@1+ (1,0) [0|3] "" XXX
SG_ TARGET : 66|3@1+ (1,0) [0|7] "" XXX
SG_ TARGET_POSITION : 69|11@1+ (1,0) [0|7] "" XXX
SG_ LANELINE_LEFT : 80|4@1+ (1,0) [0|15] "" XXX
SG_ LANELINE_LEFT_POSITION : 84|6@1+ (1,0) [0|15] "" XXX
SG_ LANELINE_RIGHT : 90|4@1+ (1,0) [0|15] "" XXX
SG_ LANELINE_RIGHT_POSITION : 94|6@1+ (1,0) [0|3] "" XXX
SG_ LANELINE_CURVATURE : 100|5@1- (1,15) [0|31] "" XXX
SG_ LANE_HIGHLIGHT : 105|4@1+ (1,0) [0|15] "" XXX
SG_ LANE_HIGHLIGHT_DISTANCE : 109|11@1+ (1,0) [0|7] "" XXX
SG_ LANE_LEFT : 120|3@1+ (1,0) [0|7] "" XXX
SG_ LANE_RIGHT : 123|3@1+ (1,0) [0|7] "" XXX
SG_ LANE_ZOOM : 126|2@1+ (1,0) [0|3] "" XXX
SG_ ALERTS_1 : 128|6@1+ (1,0) [0|63] "" XXX
SG_ ALERTS_2 : 134|5@1+ (1,0) [0|3] "" XXX
SG_ ALERTS_3 : 139|4@1+ (1,0) [0|15] "" XXX
SG_ ALERTS_4 : 143|9@1+ (1,0) [0|511] "" XXX
SG_ ALERTS_5 : 152|5@1+ (1,0) [0|7] "" XXX
SG_ MUTE : 157|3@1+ (1,0) [0|7] "" XXX
SG_ SOUNDS_1 : 160|4@1+ (1,0) [0|3] "" XXX
SG_ SOUNDS_2 : 164|4@1+ (1,0) [0|3] "" XXX
SG_ SOUNDS_3 : 168|4@1+ (1,0) [0|15] "" XXX
SG_ SOUNDS_4 : 172|3@1+ (1,0) [0|7] "" XXX
SG_ ZEROS_6 : 175|1@0+ (1,0) [0|1] "" XXX
SG_ ZEROS_7 : 176|5@1+ (1,0) [0|31] "" XXX
SG_ SETSPEED_HUD : 181|3@1+ (1,0) [0|3] "" XXX
SG_ DISTANCE_LEAD : 184|5@1+ (1,0) [0|31] "" XXX
SG_ DISTANCE_CAR : 189|3@1+ (1,0) [0|7] "" XXX
SG_ DISTANCE_SPACING : 192|4@1+ (1,0) [0|15] "" XXX
SG_ DISTANCE : 196|4@1+ (1,0) [0|7] "" XXX
SG_ SETSPEED_SPEED : 200|8@1+ (1,0) [0|255] "" XXX
SG_ SETSPEED : 208|4@1+ (1,0) [0|3] "" XXX
SG_ HDA_ICON : 212|4@1+ (1,0) [0|3] "" XXX
SG_ SLA_ICON : 216|4@1+ (1,0) [0|15] "" XXX
SG_ NAV_ICON : 220|4@1+ (1,0) [0|3] "" XXX
SG_ LFA_ICON : 224|4@1+ (1,0) [0|3] "" XXX
SG_ LCA_LEFT_ICON : 228|4@1+ (1,0) [0|15] "" XXX
SG_ LCA_RIGHT_ICON : 232|4@1+ (1,0) [0|15] "" XXX
SG_ BACKGROUND : 236|4@1+ (1,0) [0|15] "" XXX
SG_ DAW_ICON : 240|3@1+ (1,0) [0|7] "" XXX
SG_ CAR_CIRCLE : 243|3@1+ (1,0) [0|7] "" XXX
SG_ ZEROS_8 : 246|2@1+ (1,0) [0|3] "" XXX
SG_ ZEROS_9 : 248|8@1+ (1,0) [0|255] "" XXX

BO_ 354 MSG_162: 32 CCNC
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ SPEEDLIMIT_STYLE : 24|4@1+ (1,0) [0|7] "" XXX
SG_ SPEEDLIMIT_FLASH : 28|4@1+ (1,0) [0|15] "" XXX
SG_ SPEEDLIMIT : 32|8@1+ (1,0) [0|255] "" XXX
SG_ SIGNS : 40|8@1+ (1,0) [0|15] "" XXX
SG_ SPEEDLIMIT_WEATHER : 48|4@1+ (1,0) [0|15] "" XXX
SG_ VIBRATE : 52|3@1+ (1,0) [0|7] "" XXX
SG_ ZEROS_1 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ ZEROS_2 : 56|8@1+ (1,0) [0|255] "" XXX
SG_ LEAD : 64|5@1+ (1,0) [0|31] "" XXX
SG_ LEAD_DISTANCE : 69|11@1+ (1,0) [0|2047] "" XXX
SG_ LEAD_LATERAL : 80|7@1+ (1,0) [0|127] "" XXX
SG_ ZEROS_3 : 87|1@0+ (1,0) [0|1] "" XXX
SG_ LEAD_ALT : 88|5@1+ (1,0) [0|31] "" XXX
SG_ LEAD_ALT_DISTANCE : 93|11@1+ (1,0) [0|2047] "" XXX
SG_ LEAD_ALT_LATERAL : 104|7@1+ (1,0) [0|127] "" XXX
SG_ ZEROS_4 : 111|1@0+ (1,0) [0|1] "" XXX
SG_ LEAD_LEFT : 112|5@1+ (1,0) [0|31] "" XXX
SG_ LEAD_LEFT_DISTANCE : 117|11@1+ (1,0) [0|2047] "" XXX
SG_ LEAD_LEFT_LATERAL : 128|7@1+ (1,0) [0|127] "" XXX
SG_ ZEROS_5 : 135|1@0+ (1,0) [0|1] "" XXX
SG_ LEAD_RIGHT : 136|5@1+ (1,0) [0|31] "" XXX
SG_ LEAD_RIGHT_DISTANCE : 141|11@1+ (1,0) [0|2047] "" XXX
SG_ LEAD_RIGHT_LATERAL : 152|7@1+ (1,0) [0|127] "" XXX
SG_ ZEROS_6 : 159|1@0+ (1,0) [0|1] "" XXX
SG_ ZEROS_7 : 160|8@1+ (1,0) [0|255] "" XXX
SG_ ZEROS_8 : 168|8@1+ (1,0) [0|255] "" XXX
SG_ ZEROS_9 : 176|8@1+ (1,0) [0|255] "" XXX
SG_ ZEROS_10 : 184|8@1+ (1,0) [0|255] "" XXX
SG_ ZEROS_11 : 192|8@1+ (1,0) [0|255] "" XXX
SG_ ZEROS_12 : 200|8@1+ (1,0) [0|255] "" XXX
SG_ ZEROS_13 : 208|5@1+ (1,0) [0|31] "" XXX
SG_ FAULT_FSS : 213|3@1+ (1,0) [0|7] "" XXX
SG_ FAULT_FCA : 216|3@1+ (1,0) [0|7] "" XXX
SG_ FAULT_LSS : 219|3@1+ (1,0) [0|7] "" XXX
SG_ FAULT_SLA : 222|3@1+ (1,0) [0|7] "" XXX
SG_ FAULT_DAW : 225|3@1+ (1,0) [0|7] "" XXX
SG_ FAULT_HBA : 228|3@1+ (1,0) [0|7] "" XXX
SG_ FAULT_SCC : 231|3@1+ (1,0) [0|7] "" XXX
SG_ FAULT_LFA : 234|3@1+ (1,0) [0|7] "" XXX
SG_ FAULT_HDA : 237|3@1+ (1,0) [0|7] "" XXX
SG_ FAULT_LCA : 240|3@1+ (1,0) [0|7] "" XXX
SG_ FAULT_HDP : 243|3@1+ (1,0) [0|7] "" XXX
SG_ FAULT_DAS : 246|3@1+ (1,0) [0|7] "" XXX
SG_ FAULT_ESS : 249|3@1+ (1,0) [0|7] "" XXX
SG_ ZEROS_14 : 252|4@1+ (1,0) [0|15] "" XXX

CM_ 272 "Alternative LKAS message, used on cars such as 2023 Ioniq 6, 2nd gen Kona. Matches LKAS except size is 32 bytes";
CM_ 676 "Contains signals with detailed lane line information. Used by ADAS ECU on HDA 2 vehicles to operate LFA.";
CM_ 866 "Contains signals with detailed lane line information. Used by ADAS ECU on HDA 2 vehicles to operate LFA. Used on cars that use message 272.";
Expand Down
Loading