From 77db3e506c802e87940e761e9c6fdbe78175f4b4 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Tue, 14 Jul 2026 17:57:12 -0500 Subject: [PATCH] aol --- .../opendbc/safety/modes/hyundai_common.h | 1 - opendbc_repo/opendbc/safety/modes/nissan.h | 11 +++-- .../opendbc/safety/tests/hyundai_common.py | 22 +++++++++ .../opendbc/safety/tests/test_nissan.py | 19 +++++++- starpilot/controls/starpilot_card.py | 12 ----- .../controls/tests/test_starpilot_card.py | 48 ++----------------- 6 files changed, 51 insertions(+), 62 deletions(-) diff --git a/opendbc_repo/opendbc/safety/modes/hyundai_common.h b/opendbc_repo/opendbc/safety/modes/hyundai_common.h index dba7431d7..aeeeaee09 100644 --- a/opendbc_repo/opendbc/safety/modes/hyundai_common.h +++ b/opendbc_repo/opendbc/safety/modes/hyundai_common.h @@ -199,7 +199,6 @@ void hyundai_common_acc_main_on_sync(void) { if (acc_main_on_mismatches >= 3U) { acc_main_on = false; - lkas_on = false; } } else { acc_main_on_mismatches = 0U; diff --git a/opendbc_repo/opendbc/safety/modes/nissan.h b/opendbc_repo/opendbc/safety/modes/nissan.h index 1bcdbc105..3f3aed63f 100644 --- a/opendbc_repo/opendbc/safety/modes/nissan.h +++ b/opendbc_repo/opendbc/safety/modes/nissan.h @@ -4,6 +4,12 @@ static bool nissan_alt_eps = false; +static void nissan_rx_all_hook(const CANPacket_t *msg) { + if ((msg->addr == 0x1B6U) && (msg->bus == (nissan_alt_eps ? 2U : 1U))) { + acc_main_on = GET_BIT(msg, 36U); + } +} + static void nissan_rx_hook(const CANPacket_t *msg) { if (msg->bus == (nissan_alt_eps ? 1U : 0U)) { @@ -51,10 +57,6 @@ static void nissan_rx_hook(const CANPacket_t *msg) { pcm_cruise_check(cruise_engaged); } - if ((msg->addr == 0x1B6U) && (msg->bus == (nissan_alt_eps ? 2U : 1U))) { - acc_main_on = GET_BIT(msg, 36U); - } - if ((msg->addr == 0x239U) && (msg->bus == 0U)) { acc_main_on = GET_BIT(msg, 17U); } @@ -140,6 +142,7 @@ static safety_config nissan_init(uint16_t param) { const safety_hooks nissan_hooks = { .init = nissan_init, + .rx_all = nissan_rx_all_hook, .rx = nissan_rx_hook, .tx = nissan_tx_hook, }; diff --git a/opendbc_repo/opendbc/safety/tests/hyundai_common.py b/opendbc_repo/opendbc/safety/tests/hyundai_common.py index f33c5bd39..803195b51 100644 --- a/opendbc_repo/opendbc/safety/tests/hyundai_common.py +++ b/opendbc_repo/opendbc/safety/tests/hyundai_common.py @@ -208,6 +208,28 @@ class HyundaiLongitudinalBase(common.LongitudinalAccelSafetyTest): class HyundaiAolLkasOnEngageBase: + def test_acc_main_sync_does_not_clear_aol_lkas_latch(self): + try: + tx_acc_state_msg = self._tx_acc_state_msg(False) + except NotImplementedError as err: + raise unittest.SkipTest("ACC main TX state message not implemented") from err + + self.safety.set_alternative_experience(ALTERNATIVE_EXPERIENCE.ALWAYS_ON_LATERAL) + + self._rx(self._button_msg(Buttons.NONE, main_button=0)) + self._rx(self._button_msg(Buttons.NONE, main_button=1)) + self._rx(self._button_msg(Buttons.NONE, main_button=0)) + self._rx(self._button_msg(Buttons.SET)) + self._rx(self._button_msg(Buttons.NONE)) + + self.safety.set_controls_allowed(False) + for _ in range(3): + self._tx(tx_acc_state_msg) + self.assertFalse(self.safety.get_acc_main_on()) + + self._set_prev_torque(0) + self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_RATE_UP))) + def test_aol_lkas_auto_enables_on_set_engagement(self): torque_cmd = self.MAX_RATE_UP diff --git a/opendbc_repo/opendbc/safety/tests/test_nissan.py b/opendbc_repo/opendbc/safety/tests/test_nissan.py index b2f05901a..0acb7c648 100755 --- a/opendbc_repo/opendbc/safety/tests/test_nissan.py +++ b/opendbc_repo/opendbc/safety/tests/test_nissan.py @@ -3,6 +3,7 @@ import unittest from opendbc.car.nissan.values import NissanSafetyFlags from opendbc.car.structs import CarParams +from opendbc.safety import ALTERNATIVE_EXPERIENCE from opendbc.safety.tests.libsafety import libsafety_py import opendbc.safety.tests.common as common from opendbc.safety.tests.common import CANPackerSafety @@ -17,6 +18,7 @@ class TestNissanSafety(common.CarSafetyTest, common.AngleSteeringSafetyTest): EPS_BUS = 0 CRUISE_BUS = 2 + PRO_PILOT_BUS = 1 # Angle control limits STEER_ANGLE_MAX = 600 # deg, reasonable limit @@ -82,7 +84,21 @@ class TestNissanSafety(common.CarSafetyTest, common.AngleSteeringSafetyTest): def _toggle_aol(self, toggle_on): # PRO_PILOT, CRUISE_ON is the main on button for X-Trail/Rogue/Altima values = {"CRUISE_ON": 1 if toggle_on else 0} - return self.packer.make_can_msg_panda("PRO_PILOT", 2, values) + return self.packer.make_can_msg_panda("PRO_PILOT", self.PRO_PILOT_BUS, values) + + def test_aol_remains_allowed_after_cruise_cancel(self): + self.safety.set_alternative_experience(ALTERNATIVE_EXPERIENCE.ALWAYS_ON_LATERAL) + self._rx(self._toggle_aol(True)) + self._rx(self._pcm_status_msg(True)) + self.assertTrue(self.safety.get_controls_allowed()) + + self._rx(self._pcm_status_msg(False)) + self.assertFalse(self.safety.get_controls_allowed()) + + self._reset_angle_measurement(0) + self._reset_speed_measurement(1) + self._set_prev_desired_angle(0) + self.assertTrue(self._tx(self._angle_cmd_msg(angle=self.ANGLE_RATE_UP[0] / 2.0, enabled=True))) class TestNissanSafetyAltEpsBus(TestNissanSafety): @@ -90,6 +106,7 @@ class TestNissanSafetyAltEpsBus(TestNissanSafety): EPS_BUS = 1 CRUISE_BUS = 1 + PRO_PILOT_BUS = 2 def setUp(self): self.packer = CANPackerSafety("nissan_x_trail_2017_generated") diff --git a/starpilot/controls/starpilot_card.py b/starpilot/controls/starpilot_card.py index 442ab0741..474167b05 100644 --- a/starpilot/controls/starpilot_card.py +++ b/starpilot/controls/starpilot_card.py @@ -40,10 +40,6 @@ class StarPilotCard: self.hyundai_preserve_aol_across_reverse = getattr(self.CP, "carFingerprint", None) == HYUNDAI_CAR.HYUNDAI_SONATA_HYBRID self.hyundai_aol_needs_engagement = self.CP.brand == "hyundai" and not (hyundai_flags & HyundaiFlags.CANFD) and not kia_forte_non_scc self.hyundai_aol_ready = False - # Nissan's angle-control EPS can fault if AOL starts while the wheel is at a - # large parking angle. Require one normal openpilot engagement before AOL. - self.nissan_aol_needs_engagement = self.CP.brand == "nissan" - self.nissan_aol_ready = False self.prev_active = False self.prev_cruise_enabled = False self.decel_pressed = False @@ -130,13 +126,6 @@ class StarPilotCard: elif sm["selfdriveState"].active or carState.cruiseState.enabled: self.hyundai_aol_ready = True - if self.nissan_aol_needs_engagement: - if carState.gearShifter in NON_DRIVING_GEARS: - self.nissan_aol_ready = False - self.always_on_lateral_allowed = False - elif sm["selfdriveState"].active: - self.nissan_aol_ready = True - if button_aol_supported: for be, be_type in zip(carState.buttonEvents, button_event_types, strict=False): if be_type == ButtonType.lkas and be.pressed and starpilot_toggles.always_on_lateral_lkas: @@ -178,7 +167,6 @@ class StarPilotCard: self.always_on_lateral_enabled = self.always_on_lateral_allowed and self.always_on_lateral_set self.always_on_lateral_enabled &= carState.gearShifter not in NON_DRIVING_GEARS self.always_on_lateral_enabled &= not self.hyundai_aol_needs_engagement or self.hyundai_aol_ready - self.always_on_lateral_enabled &= not self.nissan_aol_needs_engagement or self.nissan_aol_ready self.always_on_lateral_enabled &= sm["starpilotPlan"].lateralCheck self.always_on_lateral_enabled &= sm["liveCalibration"].calPerc >= 1 alert_types = sm["selfdriveState"].alertType + sm["starpilotSelfdriveState"].alertType diff --git a/starpilot/controls/tests/test_starpilot_card.py b/starpilot/controls/tests/test_starpilot_card.py index 6e8784ed9..0f1b99d0d 100644 --- a/starpilot/controls/tests/test_starpilot_card.py +++ b/starpilot/controls/tests/test_starpilot_card.py @@ -215,7 +215,7 @@ def test_hyundai_aol_does_not_auto_start_from_cruise_availability(monkeypatch, t assert ret.alwaysOnLateralEnabled is False -def test_nissan_aol_requires_normal_engagement(monkeypatch, tmp_path): +def test_nissan_main_aol_can_start_before_normal_engagement(monkeypatch, tmp_path): monkeypatch.setattr(spc, "Params", FakeParams) monkeypatch.setattr(spc, "is_FrogsGoMoo", lambda: False) monkeypatch.setattr(spc, "ERROR_LOGS_PATH", tmp_path) @@ -224,53 +224,13 @@ def test_nissan_aol_requires_normal_engagement(monkeypatch, tmp_path): SimpleNamespace(brand="nissan"), SimpleNamespace(alternativeExperience=spc.ALTERNATIVE_EXPERIENCE.ALWAYS_ON_LATERAL), ) - assert card.nissan_aol_needs_engagement is True - assert card.nissan_aol_ready is False - starpilot_car_state = SimpleNamespace(distancePressed=False) - sm = make_sm() - toggles = make_toggles(always_on_lateral=True, main_cruise_aol_toggle=True, lkas_allowed_for_aol=True) - car_state = make_car_state(available=True, button_events=[SimpleNamespace(type=spc.ButtonType.mainCruise, pressed=True)]) - ret = card.update(car_state, starpilot_car_state, sm, toggles) + ret = card.update(make_car_state(available=True), SimpleNamespace(distancePressed=False), make_sm(), + make_toggles(always_on_lateral=True, always_on_lateral_main=True)) + assert ret.alwaysOnLateralAllowed is True - assert ret.alwaysOnLateralEnabled is False - - sm["selfdriveState"].active = True - ret = card.update(make_car_state(available=True, enabled=True), starpilot_car_state, sm, toggles) assert ret.alwaysOnLateralEnabled is True - sm["selfdriveState"].active = False - ret = card.update(make_car_state(available=True), starpilot_car_state, sm, toggles) - assert ret.alwaysOnLateralEnabled is True - - -def test_nissan_aol_engagement_latch_resets_out_of_drive(monkeypatch, tmp_path): - monkeypatch.setattr(spc, "Params", FakeParams) - monkeypatch.setattr(spc, "is_FrogsGoMoo", lambda: False) - monkeypatch.setattr(spc, "ERROR_LOGS_PATH", tmp_path) - - card = spc.StarPilotCard( - SimpleNamespace(brand="nissan"), - SimpleNamespace(alternativeExperience=spc.ALTERNATIVE_EXPERIENCE.ALWAYS_ON_LATERAL), - ) - starpilot_car_state = SimpleNamespace(distancePressed=False) - sm = make_sm() - sm["selfdriveState"].active = True - toggles = make_toggles(always_on_lateral=True, always_on_lateral_main=True) - - ret = card.update(make_car_state(available=True, enabled=True), starpilot_car_state, sm, toggles) - assert ret.alwaysOnLateralEnabled is True - - sm["selfdriveState"].active = False - park_state = make_car_state(available=True) - park_state.gearShifter = spc.GearShifter.park - ret = card.update(park_state, starpilot_car_state, sm, toggles) - assert ret.alwaysOnLateralEnabled is False - assert card.nissan_aol_ready is False - - ret = card.update(make_car_state(available=True), starpilot_car_state, sm, toggles) - assert ret.alwaysOnLateralEnabled is False - def test_hyundai_canfd_lkas_button_can_toggle_aol_before_engagement(monkeypatch, tmp_path): monkeypatch.setattr(spc, "Params", FakeParams)