This commit is contained in:
firestar5683
2026-05-05 11:11:10 -05:00
parent d9676ca194
commit 5e0447df1e
4 changed files with 67 additions and 5 deletions
@@ -54,6 +54,10 @@ IONIQ_6_STOP_RELEASE_JERK_V = [3.6 * IONIQ_6_RESPONSE_MULTIPLIER,
4.2 * IONIQ_6_RESPONSE_MULTIPLIER,
4.8 * IONIQ_6_RESPONSE_MULTIPLIER]
IONIQ_6_IPEDAL_PRESS_SEND_COUNT = 6
IONIQ_6_IPEDAL_LATCH_PRESS_SEND_COUNT = 10
IONIQ_6_IPEDAL_REGEN_STATE = 0x50
IONIQ_6_IPEDAL_REGEN_STATE_2_PENDING = 0x01
IONIQ_6_IPEDAL_PROGRESS_RETRY_WAIT_FRAMES = 10
IONIQ_6_IPEDAL_RETRY_WAIT_FRAMES = 30
@@ -242,6 +246,8 @@ class CarController(CarControllerBase):
self._ioniq_6_always_ipedal_retry_frame = 0
self._ioniq_6_always_ipedal_counter = 0
self._ioniq_6_always_ipedal_startup_park_done = False
self._ioniq_6_last_ipedal_regen_state = 0
self._ioniq_6_last_ipedal_regen_state_2 = 0
self._ioniq_6_last_gear = structs.CarState.GearShifter.unknown
self._genesis_g90_long_tuning = GenesisG90LongitudinalTuningState()
@@ -261,10 +267,16 @@ class CarController(CarControllerBase):
if self.CP.carFingerprint != CAR.HYUNDAI_IONIQ_6 or not getattr(starpilot_toggles, "always_ipedal", False):
self._reset_ioniq_6_always_ipedal()
self._ioniq_6_always_ipedal_startup_park_done = False
self._ioniq_6_last_ipedal_regen_state = int(getattr(CS, "ipedal_regen_state", 0))
self._ioniq_6_last_ipedal_regen_state_2 = int(getattr(CS, "ipedal_regen_state_2", 0))
self._ioniq_6_last_gear = CS.out.gearShifter
return can_sends
gear = CS.out.gearShifter
regen_state = int(getattr(CS, "ipedal_regen_state", 0))
regen_state_2 = int(getattr(CS, "ipedal_regen_state_2", 0))
regen_state_changed = regen_state != self._ioniq_6_last_ipedal_regen_state or regen_state_2 != self._ioniq_6_last_ipedal_regen_state_2
ipedal_latch_pending = regen_state == IONIQ_6_IPEDAL_REGEN_STATE and regen_state_2 == IONIQ_6_IPEDAL_REGEN_STATE_2_PENDING
drive = gear == structs.CarState.GearShifter.drive
park = gear == structs.CarState.GearShifter.park
drive_edge = drive and self._ioniq_6_last_gear != structs.CarState.GearShifter.drive
@@ -287,7 +299,8 @@ class CarController(CarControllerBase):
if target_gear and self._ioniq_6_always_ipedal_pending and not CS.ipedal_active and not CC.enabled:
if self._ioniq_6_always_ipedal_press_remaining == 0 and self.frame >= self._ioniq_6_always_ipedal_retry_frame:
self._ioniq_6_always_ipedal_press_remaining = IONIQ_6_IPEDAL_PRESS_SEND_COUNT
self._ioniq_6_always_ipedal_press_remaining = IONIQ_6_IPEDAL_LATCH_PRESS_SEND_COUNT if ipedal_latch_pending \
else IONIQ_6_IPEDAL_PRESS_SEND_COUNT
self._ioniq_6_always_ipedal_counter = hyundaicanfd.get_ioniq_6_cruise_buttons_next_counter(CS.buttons_counter)
if self._ioniq_6_always_ipedal_press_remaining > 0 and self.frame % 2 == 0:
@@ -297,8 +310,11 @@ class CarController(CarControllerBase):
self._ioniq_6_always_ipedal_counter)
self._ioniq_6_always_ipedal_press_remaining -= 1
if self._ioniq_6_always_ipedal_press_remaining == 0:
self._ioniq_6_always_ipedal_retry_frame = self.frame + IONIQ_6_IPEDAL_RETRY_WAIT_FRAMES
retry_wait_frames = IONIQ_6_IPEDAL_PROGRESS_RETRY_WAIT_FRAMES if regen_state_changed else IONIQ_6_IPEDAL_RETRY_WAIT_FRAMES
self._ioniq_6_always_ipedal_retry_frame = self.frame + retry_wait_frames
self._ioniq_6_last_ipedal_regen_state = regen_state
self._ioniq_6_last_ipedal_regen_state_2 = regen_state_2
self._ioniq_6_last_gear = gear
return can_sends
+11 -2
View File
@@ -24,6 +24,8 @@ BUTTONS_DICT = {Buttons.RES_ACCEL: ButtonType.accelCruise, Buttons.SET_DECEL: Bu
IONIQ_6_BLINDSPOT_RIGHT_MASK = 0x08
IONIQ_6_BLINDSPOT_LEFT_MASK = 0x10
IONIQ_6_IPEDAL_INTERMEDIATE_REGEN_STATE = 0x50
IONIQ_6_IPEDAL_INTERMEDIATE_REGEN_STATE_2 = 0x01
IONIQ_6_IPEDAL_REGEN_STATE = 0x50
IONIQ_6_IPEDAL_REGEN_STATE_2 = 0x03
@@ -49,6 +51,10 @@ def decode_ioniq_6_ipedal_state(regen_state: int, regen_state_2: int) -> bool:
return int(regen_state) == IONIQ_6_IPEDAL_REGEN_STATE and int(regen_state_2) == IONIQ_6_IPEDAL_REGEN_STATE_2
def decode_ioniq_6_ipedal_intermediate_state(regen_state: int, regen_state_2: int) -> bool:
return int(regen_state) == IONIQ_6_IPEDAL_INTERMEDIATE_REGEN_STATE and int(regen_state_2) == IONIQ_6_IPEDAL_INTERMEDIATE_REGEN_STATE_2
class CarState(CarStateBase):
@staticmethod
def get_canfd_blinker_sig_names(car_fingerprint, use_alt_lamp: bool) -> tuple[str, str]:
@@ -69,6 +75,8 @@ class CarState(CarStateBase):
self.cancel_button_enable_in_progress = False
self.cruise_buttons_msg = {}
self.ipedal_active = False
self.ipedal_regen_state = 0
self.ipedal_regen_state_2 = 0
self.gear_msg_canfd = "ACCELERATOR" if CP.flags & HyundaiFlags.EV else \
"GEAR_ALT" if CP.flags & HyundaiFlags.CANFD_ALT_GEARS else \
@@ -397,8 +405,9 @@ class CarState(CarStateBase):
ret.cruiseState.nonAdaptive = cp.vl["MANUAL_SPEED_LIMIT_ASSIST"]["MSLA_ENABLED"] == 1
if self.CP.carFingerprint == CAR.HYUNDAI_IONIQ_6:
msla = cp.vl["MANUAL_SPEED_LIMIT_ASSIST"]
# Tolerate older/stale DBCs that do not yet expose the inferred regen state signals.
self.ipedal_active = decode_ioniq_6_ipedal_state(msla.get("EV_REGEN_STATE", 0), msla.get("EV_REGEN_STATE_2", 0))
self.ipedal_regen_state = int(msla.get("EV_REGEN_STATE", 0))
self.ipedal_regen_state_2 = int(msla.get("EV_REGEN_STATE_2", 0))
self.ipedal_active = decode_ioniq_6_ipedal_state(self.ipedal_regen_state, self.ipedal_regen_state_2)
prev_cruise_buttons = self.cruise_buttons[-1]
prev_main_buttons = self.main_buttons[-1]
@@ -9,7 +9,8 @@ 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 CarController, Ioniq6LongitudinalTuningState, GenesisG90LongitudinalTuningState, \
update_ioniq_6_longitudinal_tuning, update_genesis_g90_longitudinal_tuning
from opendbc.car.hyundai.carstate import CarState, decode_ioniq_6_blindspot_radar_state, decode_ioniq_6_ipedal_state
from opendbc.car.hyundai.carstate import CarState, decode_ioniq_6_blindspot_radar_state, decode_ioniq_6_ipedal_intermediate_state, \
decode_ioniq_6_ipedal_state
from opendbc.car.hyundai.interface import CarInterface
from opendbc.car.hyundai import hyundaican, hyundaicanfd
from opendbc.car.hyundai.hyundaicanfd import CanBus
@@ -296,6 +297,8 @@ class TestHyundaiFingerprint:
def test_ioniq_6_ipedal_state_decode(self):
assert not decode_ioniq_6_ipedal_state(0x3C, 0x01)
assert not decode_ioniq_6_ipedal_state(0x50, 0x01)
assert decode_ioniq_6_ipedal_intermediate_state(0x50, 0x01)
assert decode_ioniq_6_ipedal_state(0x50, 0x03)
def test_ioniq_6_msla_regen_signals_decode(self):
@@ -394,6 +397,38 @@ class TestHyundaiFingerprint:
assert not controller._ioniq_6_always_ipedal_pending
assert controller._ioniq_6_always_ipedal_press_remaining == 0
def test_ioniq_6_always_ipedal_uses_stronger_followup_pull_for_intermediate_latch_state(self):
toggles = get_test_toggles()
toggles.always_ipedal = True
CP = CarInterface.get_params(CAR.HYUNDAI_IONIQ_6, gen_empty_fingerprint(), [], True, False, False, toggles)
controller = CarController(DBC[CP.carFingerprint], CP)
cs = SimpleNamespace(
out=SimpleNamespace(gearShifter=structs.CarState.GearShifter.drive),
ipedal_active=False,
ipedal_regen_state=0x50,
ipedal_regen_state_2=0x01,
buttons_counter=5,
cruise_buttons_msg={
"_CHECKSUM": 0,
"COUNTER": 5,
"CRUISE_BUTTONS": 0,
"ADAPTIVE_CRUISE_MAIN_BTN": 0,
"NORMAL_CRUISE_MAIN_BTN": 0,
"LDA_BTN": 0,
"RIGHT_PADDLE": 0,
"LEFT_PADDLE": 0,
"SET_ME_1": 1,
},
)
cc = SimpleNamespace(enabled=False)
controller._ioniq_6_last_gear = structs.CarState.GearShifter.reverse
sends = controller._update_ioniq_6_always_ipedal(cc, cs, toggles)
assert sends
assert controller._ioniq_6_always_ipedal_press_remaining == 9
def test_ioniq_6_longitudinal_params_match_canfd_tune(self):
toggles = get_test_toggles()
CP = CarInterface.get_params(CAR.HYUNDAI_IONIQ_6, gen_empty_fingerprint(), [], True, False, False, toggles)
@@ -823,7 +823,9 @@ BO_ 736 MANUAL_SPEED_LIMIT_ASSIST: 32 XXX
SG_ MSLA_STATUS : 26|2@1+ (1,0) [0|3] "" XXX
SG_ MSLA_ENABLED : 38|1@1+ (1,0) [0|1] "" XXX
SG_ MAX_SPEED : 55|8@0+ (1,0) [0|255] "" XXX
SG_ EV_REGEN_STATE : 104|8@1+ (1,0) [0|255] "" XXX
SG_ MAX_SPEED_COPY : 144|8@1+ (1,0) [0|255] "" XXX
SG_ EV_REGEN_STATE_2 : 184|8@1+ (1,0) [0|255] "" XXX
BO_ 837 ADRV_0x345: 8 ADRV
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX