ioniq tests

This commit is contained in:
firestar5683
2026-04-26 14:38:27 -05:00
parent 962e0d740a
commit 71528fd547
40 changed files with 77 additions and 13 deletions
Binary file not shown.
@@ -19,6 +19,7 @@ MAX_ANGLE = 85
MAX_ANGLE_FRAMES = 89
MAX_ANGLE_CONSECUTIVE_FRAMES = 2
CANFD_BLINDSPOT_STATUS_STALE_NS = 200_000_000
IONIQ_6_LANE_CHANGE_UI_MIN_SPEED = 20 * CV.MPH_TO_MS
def process_hud_alert(enabled, fingerprint, hud_control):
@@ -223,6 +224,9 @@ class CarController(CarControllerBase):
if self.frame % 5 == 0 and (not lka_steering or lka_steering_long):
can_sends.append(hyundaicanfd.create_lfahda_cluster(self.packer, self.CAN, CC.enabled))
if self.CP.carFingerprint == CAR.HYUNDAI_IONIQ_6 and self.long_active_ecu and CC.enabled and CS.out.vEgo >= IONIQ_6_LANE_CHANGE_UI_MIN_SPEED:
can_sends.append(hyundaicanfd.create_ioniq_6_lane_change_status(self.CAN, self.frame, CC.leftBlinker, CC.rightBlinker))
# blinkers
if lka_steering and self.CP.flags & HyundaiFlags.ENABLE_BLINKERS:
can_sends.extend(hyundaicanfd.create_spas_messages(self.packer, self.CAN, CC.leftBlinker, CC.rightBlinker))
+6 -2
View File
@@ -307,8 +307,12 @@ class CarState(CarStateBase):
cp.vl["BLINDSPOTS_FRONT_CORNER_2"]["SIDE_DETECT_STATE"])
if self.CP.enableBsm:
if self.CP.carFingerprint == CAR.HYUNDAI_IONIQ_6:
ret.leftBlindspot = cp.vl["BLINDSPOTS_REAR_CORNERS"]["LEFT_MB"] != 0 or self.left_blindspot_from_radar
ret.rightBlindspot = cp.vl["BLINDSPOTS_REAR_CORNERS"]["MORE_LEFT_PROB"] != 0 or self.right_blindspot_from_radar
ret.leftBlindspot = (cp.vl["BLINDSPOTS_REAR_CORNERS"]["FL_INDICATOR"] != 0 or
cp.vl["BLINDSPOTS_REAR_CORNERS"]["FL_INDICATOR_ALT"] != 0 or
self.left_blindspot_from_radar)
ret.rightBlindspot = (cp.vl["BLINDSPOTS_REAR_CORNERS"]["FR_INDICATOR"] != 0 or
cp.vl["BLINDSPOTS_REAR_CORNERS"]["FR_INDICATOR_ALT"] != 0 or
self.right_blindspot_from_radar)
else:
ret.leftBlindspot = cp.vl["BLINDSPOTS_REAR_CORNERS"]["FL_INDICATOR"] != 0
ret.rightBlindspot = cp.vl["BLINDSPOTS_REAR_CORNERS"]["FR_INDICATOR"] != 0
@@ -1,6 +1,6 @@
import copy
import numpy as np
from opendbc.car import CanBusBase
from opendbc.car import CanBusBase, CanData
from opendbc.car.crc import CRC16_XMODEM
from opendbc.car.hyundai.values import HyundaiFlags
@@ -196,12 +196,38 @@ def create_lfahda_cluster(packer, CAN, enabled):
return packer.make_can_msg("LFAHDA_CLUSTER", CAN.ECAN, values)
IONIQ_6_LANE_CHANGE_UI_ADDR = 0x120
IONIQ_6_LANE_CHANGE_UI_TEMPLATE = bytearray.fromhex("0000000000000005ffd9671f46454645d90200000000000000000a0000002040")
IONIQ_6_LANE_CHANGE_UI_BASE = (0x45, 0xD9)
IONIQ_6_LANE_CHANGE_UI_RIGHT = (0x45, 0xDA)
IONIQ_6_LANE_CHANGE_UI_LEFT = (0x46, 0xDD)
def create_ioniq_6_lane_change_status(CAN, counter: int, left_blinker: bool, right_blinker: bool):
dat = bytearray(IONIQ_6_LANE_CHANGE_UI_TEMPLATE)
dat[2] = counter & 0xFF
state = IONIQ_6_LANE_CHANGE_UI_BASE
if left_blinker:
state = IONIQ_6_LANE_CHANGE_UI_LEFT
elif right_blinker:
state = IONIQ_6_LANE_CHANGE_UI_RIGHT
dat[15], dat[16] = state
dat[0:2] = hkg_can_fd_checksum(IONIQ_6_LANE_CHANGE_UI_ADDR, None, dat).to_bytes(2, "little")
return CanData(IONIQ_6_LANE_CHANGE_UI_ADDR, bytes(dat), CAN.ECAN)
def create_blindspot_status_messages(packer, CAN, rear_values, front_corner_values, left_blindspot=False, right_blindspot=False):
# Reuse the last known-good payload but regenerate the rolling counter/checksum.
rear = {k: v for k, v in rear_values.items() if k not in ("CHECKSUM", "COUNTER")}
front = {k: v for k, v in front_corner_values.items() if k not in ("CHECKSUM", "COUNTER")}
rear["LEFT_MB"] = int(left_blindspot)
rear["MORE_LEFT_PROB"] = int(right_blindspot)
rear["FL_INDICATOR"] = int(left_blindspot)
rear["FR_INDICATOR"] = int(right_blindspot)
rear["FL_INDICATOR_ALT"] = int(left_blindspot)
rear["FR_INDICATOR_ALT"] = int(right_blindspot)
if "NEW_SIGNAL_3" not in front:
front["NEW_SIGNAL_3"] = 1
@@ -277,8 +277,37 @@ class TestHyundaiFingerprint:
assert parser.vl["BLINDSPOTS_FRONT_CORNER_1"]["COUNTER"] == 0
assert parser.vl["BLINDSPOTS_REAR_CORNERS"]["LEFT_MB"] == 1
assert parser.vl["BLINDSPOTS_REAR_CORNERS"]["MORE_LEFT_PROB"] == 0
assert parser.vl["BLINDSPOTS_REAR_CORNERS"]["FL_INDICATOR"] == 1
assert parser.vl["BLINDSPOTS_REAR_CORNERS"]["FR_INDICATOR"] == 0
assert parser.vl["BLINDSPOTS_REAR_CORNERS"]["FL_INDICATOR_ALT"] == 1
assert parser.vl["BLINDSPOTS_REAR_CORNERS"]["FR_INDICATOR_ALT"] == 0
assert parser.vl["BLINDSPOTS_FRONT_CORNER_1"]["NEW_SIGNAL_3"] == 1
def test_ioniq_6_lane_change_ui_helper_regenerates_checksum_and_state(self):
CP = CarParams.new_message()
CP.carFingerprint = CAR.HYUNDAI_IONIQ_6
CP.flags = int(HyundaiFlags.CANFD | HyundaiFlags.CANFD_LKA_STEERING)
can_bus = CanBus(CP)
base_msg = hyundaicanfd.create_ioniq_6_lane_change_status(can_bus, 0x12, left_blinker=False, right_blinker=False)
right_msg = hyundaicanfd.create_ioniq_6_lane_change_status(can_bus, 0x34, left_blinker=False, right_blinker=True)
left_msg = hyundaicanfd.create_ioniq_6_lane_change_status(can_bus, 0x56, left_blinker=True, right_blinker=False)
assert base_msg[0] == 0x120
assert base_msg[2] == can_bus.ECAN
assert base_msg[1][2] == 0x12
assert right_msg[1][2] == 0x34
assert left_msg[1][2] == 0x56
assert hyundaicanfd.hkg_can_fd_checksum(base_msg[0], None, bytearray(base_msg[1])) == int.from_bytes(base_msg[1][:2], "little")
assert hyundaicanfd.hkg_can_fd_checksum(right_msg[0], None, bytearray(right_msg[1])) == int.from_bytes(right_msg[1][:2], "little")
assert hyundaicanfd.hkg_can_fd_checksum(left_msg[0], None, bytearray(left_msg[1])) == int.from_bytes(left_msg[1][:2], "little")
assert (base_msg[1][15], base_msg[1][16]) == hyundaicanfd.IONIQ_6_LANE_CHANGE_UI_BASE
assert (right_msg[1][15], right_msg[1][16]) == hyundaicanfd.IONIQ_6_LANE_CHANGE_UI_RIGHT
assert (left_msg[1][15], left_msg[1][16]) == hyundaicanfd.IONIQ_6_LANE_CHANGE_UI_LEFT
def test_ioniq_6_blindspot_radar_state_decode(self):
assert decode_ioniq_6_blindspot_radar_state(0x02) == (False, False)
assert decode_ioniq_6_blindspot_radar_state(0x0A) == (False, True)
@@ -289,6 +289,7 @@ static safety_config hyundai_canfd_init(uint16_t param) {
HYUNDAI_CANFD_LFA_STEERING_COMMON_TX_MSGS(1)
HYUNDAI_CANFD_SCC_CONTROL_COMMON_TX_MSGS(1, true)
HYUNDAI_CANFD_BLINDSPOT_DASH_TX_MSGS(1)
{0x120, 1, 32, .check_relay = false}, // IONIQ_6 lane change UI
{0x51, 0, 32, .check_relay = false}, // ADRV_0x51
{0x730, 1, 8, .check_relay = false}, // tester present for ADAS ECU disable
{0x160, 1, 16, .check_relay = false}, // ADRV_0x160
@@ -450,7 +450,7 @@ class TestHyundaiCanfdLKASteeringAltEV(TestHyundaiCanfdBase):
class TestHyundaiCanfdLKASteeringLongEV(HyundaiLongitudinalBase, TestHyundaiCanfdLKASteeringEV):
TX_MSGS = [[0x50, 0], [0x1CF, 1], [0x2A4, 0], [0x51, 0], [0x730, 1], [0x12a, 1], [0x160, 1],
TX_MSGS = [[0x50, 0], [0x120, 1], [0x1CF, 1], [0x2A4, 0], [0x51, 0], [0x730, 1], [0x12a, 1], [0x160, 1],
[0x1ba, 1], [0x1e0, 1], [0x1e5, 1], [0x1a0, 1], [0x1ea, 1], [0x200, 1], [0x345, 1], [0x1da, 1]]
RELAY_MALFUNCTION_ADDRS = {0: (0x50, 0x2a4), 1: (0x1a0,)} # LKAS, CAM_0x2A4, SCC_CONTROL
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1,2 +1,2 @@
extern const uint8_t gitversion[19];
const uint8_t gitversion[19] = "DEV-9f1a9298-DEBUG";
const uint8_t gitversion[19] = "DEV-962e0d74-DEBUG";
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
DEV-9f1a9298-DEBUG
DEV-962e0d74-DEBUG
+7 -7
View File
@@ -204,7 +204,7 @@ GENESIS_G90_UNWIND_FRICTION_REDUCTION_RIGHT = 0.16
IONIQ_6_LATERAL_TESTING_GROUND_ID = testing_ground.id_5
IONIQ_6_LATERAL_TESTING_GROUND_VARIANT = "C"
IONIQ_6_FF_GAIN_LEFT = 0.050
IONIQ_6_FF_GAIN_RIGHT = 0.004
IONIQ_6_FF_GAIN_RIGHT = 0.000
IONIQ_6_FF_ONSET = 0.10
IONIQ_6_FF_ONSET_WIDTH = 0.04
IONIQ_6_FF_CUTOFF = 0.52
@@ -212,22 +212,22 @@ IONIQ_6_FF_CUTOFF_WIDTH = 0.12
IONIQ_6_TRANSITION_SPEED = 10.0
IONIQ_6_PHASE_SCALE = 0.10
IONIQ_6_TURN_IN_BOOST_LEFT = 0.52
IONIQ_6_TURN_IN_BOOST_RIGHT = 0.40
IONIQ_6_TURN_IN_BOOST_RIGHT = 0.36
IONIQ_6_UNWIND_TAPER_LEFT = 0.60
IONIQ_6_UNWIND_TAPER_RIGHT = 1.18
IONIQ_6_UNWIND_TAPER_RIGHT = 1.24
IONIQ_6_FRICTION_MULT = 0.995
IONIQ_6_FRICTION_LAT_RISE = 0.20
IONIQ_6_FRICTION_JERK_RISE = 0.24
IONIQ_6_TURN_IN_THRESHOLD_REDUCTION_LEFT = 0.12
IONIQ_6_TURN_IN_THRESHOLD_REDUCTION_RIGHT = 0.10
IONIQ_6_UNWIND_THRESHOLD_INCREASE_LEFT = 0.42
IONIQ_6_UNWIND_THRESHOLD_INCREASE_RIGHT = 1.02
IONIQ_6_UNWIND_THRESHOLD_INCREASE_RIGHT = 1.08
IONIQ_6_TURN_IN_FRICTION_BOOST_LEFT = 0.05
IONIQ_6_TURN_IN_FRICTION_BOOST_RIGHT = 0.04
IONIQ_6_UNWIND_FRICTION_REDUCTION_LEFT = 0.36
IONIQ_6_UNWIND_FRICTION_REDUCTION_RIGHT = 0.82
IONIQ_6_CENTER_TAPER_MAX = 0.015
IONIQ_6_CENTER_TAPER_LAT = 0.06
IONIQ_6_UNWIND_FRICTION_REDUCTION_RIGHT = 0.88
IONIQ_6_CENTER_TAPER_MAX = 0.018
IONIQ_6_CENTER_TAPER_LAT = 0.07
IONIQ_6_CENTER_TAPER_LAT_WIDTH = 0.02
IONIQ_6_CENTER_TAPER_SPEED = 18.0
IONIQ_6_CENTER_TAPER_SPEED_WIDTH = 2.5