diff --git a/starpilot/controls/starpilot_card.py b/starpilot/controls/starpilot_card.py index 38710063e..6ab88336f 100644 --- a/starpilot/controls/starpilot_card.py +++ b/starpilot/controls/starpilot_card.py @@ -85,6 +85,9 @@ class StarPilotCard: def update(self, carState, starpilotCarState, sm, starpilot_toggles): self.switchback_mode_enabled = self.params_memory.get_bool("SwitchbackModeEnabled") + hyundai_main_cruise_can_toggle_aol = self.CP.brand == "hyundai" and starpilot_toggles.always_on_lateral and ( + starpilot_toggles.always_on_lateral_lkas or starpilot_toggles.always_on_lateral_main + ) if self.CP.brand == "hyundai" or starpilot_toggles.lkas_allowed_for_aol: for be in carState.buttonEvents: @@ -93,7 +96,10 @@ class StarPilotCard: if carState.cruiseState.enabled or self.pause_lateral: self.pause_lateral = not self.always_on_lateral_allowed elif be.type == ButtonType.mainCruise and be.pressed: - if starpilot_toggles.always_on_lateral_main: + # Hyundai owners use both the LKAS button and the cruise main button + # as AOL engage inputs. Keep the safety-derived LKAS capability while + # still honoring the cruise main button as a shared AOL toggle. + if hyundai_main_cruise_can_toggle_aol or starpilot_toggles.always_on_lateral_main: self.always_on_lateral_allowed = not self.always_on_lateral_allowed elif starpilot_toggles.speed_limit_controller: self.params_memory.put_bool("SLCAdoptSpeedLimit", True) diff --git a/starpilot/controls/tests/test_starpilot_card.py b/starpilot/controls/tests/test_starpilot_card.py index 0dcb9cbb8..c3de75357 100644 --- a/starpilot/controls/tests/test_starpilot_card.py +++ b/starpilot/controls/tests/test_starpilot_card.py @@ -43,6 +43,7 @@ def make_sm(): def make_toggles(**overrides): defaults = { + "always_on_lateral": False, "always_on_lateral_lkas": False, "always_on_lateral_main": False, "always_on_lateral_pause_speed": 0.0, @@ -107,7 +108,7 @@ def test_hyundai_lkas_button_still_toggles_aol_with_cruise_button_events(monkeyp ]) starpilot_car_state = SimpleNamespace(distancePressed=False) sm = make_sm() - toggles = make_toggles(always_on_lateral_lkas=True) + toggles = make_toggles(always_on_lateral=True, always_on_lateral_lkas=True) ret = card.update(car_state, starpilot_car_state, sm, toggles) @@ -115,6 +116,25 @@ def test_hyundai_lkas_button_still_toggles_aol_with_cruise_button_events(monkeyp assert ret.pauseLateral is False +def test_hyundai_main_cruise_button_toggles_aol_while_lkas_mode_is_enabled(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="hyundai"), SimpleNamespace(alternativeExperience=0)) + + car_state = make_car_state(button_events=[SimpleNamespace(type=spc.ButtonType.mainCruise, pressed=True)]) + starpilot_car_state = SimpleNamespace(distancePressed=False) + sm = make_sm() + toggles = make_toggles(always_on_lateral=True, always_on_lateral_lkas=True) + + ret = card.update(car_state, starpilot_car_state, sm, toggles) + assert ret.alwaysOnLateralAllowed is True + + ret = card.update(car_state, starpilot_car_state, sm, toggles) + assert ret.alwaysOnLateralAllowed is False + + def test_honda_lkas_button_pauses_lateral_when_cruise_is_active(monkeypatch, tmp_path): monkeypatch.setattr(spc, "Params", FakeParams) monkeypatch.setattr(spc, "is_FrogsGoMoo", lambda: False)