diff --git a/common/params_keys.h b/common/params_keys.h index cac9099d72..ba20acdaab 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -223,6 +223,7 @@ inline static std::unordered_map keys = { {"CustomPersonalities", {PERSISTENT, BOOL, "0", "0", 2}}, {"CancelButtonControl", {PERSISTENT, INT, "1", "0", 2}}, {"CancelButtonControlsMigrated", {PERSISTENT, BOOL, "0", "0"}}, + {"AOLLKASMigratedToButtonControl", {PERSISTENT, BOOL, "0", "0"}}, {"TrafficPersonalityProfile", {PERSISTENT, BOOL, "1", "1", 2}}, {"AggressivePersonalityProfile", {PERSISTENT, BOOL, "1", "1", 2}}, {"StandardPersonalityProfile", {PERSISTENT, BOOL, "1", "1", 2}}, @@ -368,6 +369,7 @@ inline static std::unordered_map keys = { {"LongitudinalTune", {PERSISTENT, BOOL, "1", "0", 0}}, {"LoudBlindspotAlert", {PERSISTENT, BOOL, "0", "0", 0}}, {"LowVoltageShutdown", {PERSISTENT, FLOAT, "11.8", "11.8", 3}}, + {"MainCruiseButtonControl", {PERSISTENT, INT, "9", "9", 2}}, {"ManualUpdateInitiated", {CLEAR_ON_MANAGER_START, BOOL, "0", "0"}}, {"AMapKey1", {PERSISTENT | DONT_LOG, STRING, "", "", 0}}, {"AMapKey2", {PERSISTENT | DONT_LOG, STRING, "", "", 0}}, diff --git a/opendbc_repo/opendbc/car/interfaces.py b/opendbc_repo/opendbc/car/interfaces.py index da1cf5b3b7..9a2774a87c 100644 --- a/opendbc_repo/opendbc/car/interfaces.py +++ b/opendbc_repo/opendbc/car/interfaces.py @@ -243,7 +243,8 @@ class CarInterfaceBase(ABC): if hyundai_has_lda_button: fp_ret.safetyConfigs[-1].safetyParam |= HyundaiStarPilotSafetyFlags.HAS_LDA_BUTTON.value - if params.get_bool("AlwaysOnLateral") and params.get_bool("AlwaysOnLateralLKAS"): + # LKASButtonControl == 9 means BUTTON_FUNCTIONS["AOL_TOGGLE"] in starpilot_variables. + if params.get_bool("AlwaysOnLateral") and params.get_int("LKASButtonControl") == 9: fp_ret.safetyConfigs[-1].safetyParam |= HyundaiStarPilotSafetyFlags.AOL_LKAS_ON_ENGAGE.value elif platform in TOYOTA: fp_ret.canUsePedal = not CP.autoResumeSng diff --git a/selfdrive/ui/layouts/settings/starpilot/lateral.py b/selfdrive/ui/layouts/settings/starpilot/lateral.py index 5c2b43f143..de1d15199e 100644 --- a/selfdrive/ui/layouts/settings/starpilot/lateral.py +++ b/selfdrive/ui/layouts/settings/starpilot/lateral.py @@ -150,11 +150,6 @@ class StarPilotLateralLayout(_SettingsPage): subtitle=tr_noop("Keep lateral control active even without openpilot engaged."), get_state=lambda: self._params.get_bool("AlwaysOnLateral"), set_state=lambda s: _confirm_reboot_toggle(self._params, "AlwaysOnLateral", s) if s else self._params.put_bool("AlwaysOnLateral", False)), - SettingRow("AlwaysOnLateralLKAS", "toggle", tr_noop("Enable With LKAS"), - subtitle="", - get_state=lambda: self._params.get_bool("AlwaysOnLateralLKAS"), - set_state=lambda s: self._params.put_bool("AlwaysOnLateralLKAS", s), - visible=lambda: self._params.get_bool("AlwaysOnLateral") and starpilot_state.car_state.lkasAllowedForAOL), SettingRow("PauseAOLOnBrake", "value", tr_noop("Pause Below"), subtitle="", get_value=lambda: f"{self._params.get_int('PauseAOLOnBrake')} mph", diff --git a/selfdrive/ui/layouts/settings/starpilot/vehicle.py b/selfdrive/ui/layouts/settings/starpilot/vehicle.py index 7647f3ab30..121b67fe04 100644 --- a/selfdrive/ui/layouts/settings/starpilot/vehicle.py +++ b/selfdrive/ui/layouts/settings/starpilot/vehicle.py @@ -49,6 +49,8 @@ ACTION_OPTIONS = [ {"id": 6, "name": tr_noop("Toggle Traffic"), "requires_longitudinal": True}, {"id": 7, "name": tr_noop("Toggle Switchback")}, {"id": 8, "name": tr_noop("Create Bookmark")}, + {"id": 9, "name": tr_noop("Toggle Always On Lateral")}, + {"id": 10, "name": tr_noop("Adopt Current Speed Limit")}, ] ACTION_NAMES = [o["name"] for o in ACTION_OPTIONS] ACTION_IDS = {o["name"]: o["id"] for o in ACTION_OPTIONS} @@ -144,8 +146,8 @@ class VehicleSettingsManagerView(AetherInteractiveMixin, Widget): if cs.isHKGCanFd and cs.hasOpenpilotLongitudinal: count += 1 return tr("{} settings").format(count) if tab_id == "controls": - count = 7 - if not cs.isSubaru and not (cs.lkasAllowedForAOL and self._controller._params.get_bool("AlwaysOnLateral") and self._controller._params.get_bool("AlwaysOnLateralLKAS")): + count = 8 + if not cs.isSubaru: count += 1 if cs.hasModeStarButtons: count += 6 return tr("{} buttons").format(count) @@ -426,9 +428,11 @@ class VehicleSettingsManagerView(AetherInteractiveMixin, Widget): for key in ("CancelButtonControl", "LongCancelButtonControl", "VeryLongCancelButtonControl"): rows.append({"target_id": f"select:{key}", "type": "select", "title": tr(self._controller._action_title(key)), "get_value": lambda k=key: self._controller._get_action_name(k), "pill_width": 140}) - if not cs.isSubaru and not (cs.lkasAllowedForAOL and self._controller._params.get_bool("AlwaysOnLateral") and self._controller._params.get_bool("AlwaysOnLateralLKAS")): + if not cs.isSubaru: rows.append({"target_id": "select:LKASButtonControl", "type": "select", "title": tr("LKAS Button"), "get_value": lambda: self._controller._get_action_name("LKASButtonControl"), "pill_width": 140}) + rows.append({"target_id": "select:MainCruiseButtonControl", "type": "select", "title": tr("CC Main Button"), + "get_value": lambda: self._controller._get_action_name("MainCruiseButtonControl"), "pill_width": 140}) if cs.hasModeStarButtons: for key in ("ModeButtonControl", "LongModeButtonControl", "VeryLongModeButtonControl", "StarButtonControl", "LongStarButtonControl", "VeryLongStarButtonControl"): @@ -453,6 +457,7 @@ class StarPilotVehicleSettingsLayout(_SettingsPage): "VeryLongCancelButtonControl": "Cancel (Very Long)", "VeryLongDistanceButtonControl": "Distance (Very Long)", "LKASButtonControl": "LKAS Button", + "MainCruiseButtonControl": "CC Main Button", "ModeButtonControl": "Mode Button", "LongModeButtonControl": "Mode (Long Press)", "VeryLongModeButtonControl": "Mode (Very Long)", @@ -468,7 +473,14 @@ class StarPilotVehicleSettingsLayout(_SettingsPage): def _get_available_actions(self, key: str | None = None) -> list[str]: cs = starpilot_state.car_state - return [tr(o["name"]) for o in ACTION_OPTIONS if cs.hasOpenpilotLongitudinal or not o.get("requires_longitudinal", False)] + if key == "MainCruiseButtonControl": + allowed_ids = {0, 9, 10} + return [tr(o["name"]) for o in ACTION_OPTIONS if o["id"] in allowed_ids] + allowed_ids = set(range(9)) + if key == "LKASButtonControl" and cs.lkasAllowedForAOL: + allowed_ids.add(9) + return [tr(o["name"]) for o in ACTION_OPTIONS + if o["id"] in allowed_ids and (cs.hasOpenpilotLongitudinal or not o.get("requires_longitudinal", False))] def _on_toggle(self, param_key: str): if param_key == "DisableOpenpilotLongitudinal": diff --git a/starpilot/common/starpilot_variables.py b/starpilot/common/starpilot_variables.py index 9211902a7b..3a95154ff2 100644 --- a/starpilot/common/starpilot_variables.py +++ b/starpilot/common/starpilot_variables.py @@ -135,6 +135,8 @@ BUTTON_FUNCTIONS = { "TRAFFIC_MODE": 6, "SWITCHBACK_MODE": 7, "BOOKMARK": 8, + "AOL_TOGGLE": 9, + "SLC_ADOPT": 10, } CANCEL_BUTTON_MIGRATION_KEY = "CancelButtonControlsMigrated" @@ -144,6 +146,8 @@ CANCEL_BUTTON_MAPPINGS = ( ("VeryLongDistanceButtonControl", "VeryLongCancelButtonControl"), ) +AOL_LKAS_MIGRATION_KEY = "AOLLKASMigratedToButtonControl" + DEVELOPER_SIDEBAR_METRICS = { "NONE": 0, "ACCELERATION_CURRENT": 1, @@ -341,12 +345,26 @@ def migrate_cancel_button_controls(params: Params | None = None) -> bool: params.put_bool(CANCEL_BUTTON_MIGRATION_KEY, True) return True + +def migrate_aol_lkas_to_button_control(params: Params | None = None) -> bool: + params = params or Params(return_defaults=True) + if params.get_bool(AOL_LKAS_MIGRATION_KEY): + return False + + if params.get_bool("AlwaysOnLateral") and params.get_bool("AlwaysOnLateralLKAS"): + params.put_int("LKASButtonControl", BUTTON_FUNCTIONS["AOL_TOGGLE"]) + + params.put_bool(AOL_LKAS_MIGRATION_KEY, True) + return True + + class StarPilotVariables: def __init__(self): self.params = Params(return_defaults=True) self.params_raw = Params() self.params_memory = Params(memory=True) migrate_cancel_button_controls(self.params) + migrate_aol_lkas_to_button_control(self.params) self.starpilot_toggles = SimpleNamespace() toggle = self.starpilot_toggles @@ -665,10 +683,15 @@ class StarPilotVariables: toggle.warningImmediate_volume = max(self.get_value("WarningImmediateVolume", cast=float, condition=toggle.alert_volume_controller, default=25), 25) toggle.always_on_lateral = self.get_value("AlwaysOnLateral") - toggle.always_on_lateral_lkas = toggle.always_on_lateral and toggle.lkas_allowed_for_aol and self.get_value("AlwaysOnLateralLKAS") + lkas_button_assigned_to_aol = self.get_value("LKASButtonControl", cast=float) == BUTTON_FUNCTIONS["AOL_TOGGLE"] + toggle.always_on_lateral_lkas = toggle.always_on_lateral and toggle.lkas_allowed_for_aol and lkas_button_assigned_to_aol toggle.always_on_lateral_main = toggle.always_on_lateral and not prohibited_main_aol and not toggle.always_on_lateral_lkas toggle.always_on_lateral_pause_speed = self.get_value("PauseAOLOnBrake", cast=float, condition=toggle.always_on_lateral) + main_cruise_button_control = self.get_value("MainCruiseButtonControl", cast=float) + toggle.main_cruise_aol_toggle = main_cruise_button_control == BUTTON_FUNCTIONS["AOL_TOGGLE"] + toggle.main_cruise_slc_adopt = main_cruise_button_control == BUTTON_FUNCTIONS["SLC_ADOPT"] + toggle.automatic_updates = self.get_value("AutomaticUpdates") and not BACKUP_PATH.is_file() car_model = normalize_legacy_car_model(self.params.get("CarModel")) diff --git a/starpilot/controls/starpilot_card.py b/starpilot/controls/starpilot_card.py index 6ab88336f6..50e64f2d87 100644 --- a/starpilot/controls/starpilot_card.py +++ b/starpilot/controls/starpilot_card.py @@ -85,9 +85,6 @@ 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: @@ -96,12 +93,9 @@ 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: - # 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: + if starpilot_toggles.main_cruise_aol_toggle or starpilot_toggles.always_on_lateral_main: self.always_on_lateral_allowed = not self.always_on_lateral_allowed - elif starpilot_toggles.speed_limit_controller: + elif starpilot_toggles.main_cruise_slc_adopt and starpilot_toggles.speed_limit_controller: self.params_memory.put_bool("SLCAdoptSpeedLimit", True) elif starpilot_toggles.always_on_lateral_main: if pacifica_hybrid_aol_requires_set_press(self.CP.carFingerprint, self.CP.pcmCruise): diff --git a/starpilot/controls/tests/test_starpilot_card.py b/starpilot/controls/tests/test_starpilot_card.py index c3de753570..ea5d25f067 100644 --- a/starpilot/controls/tests/test_starpilot_card.py +++ b/starpilot/controls/tests/test_starpilot_card.py @@ -55,6 +55,8 @@ def make_toggles(**overrides): "experimental_mode_via_lkas": False, "force_coast_via_lkas": False, "lkas_allowed_for_aol": False, + "main_cruise_aol_toggle": False, + "main_cruise_slc_adopt": False, "pause_lateral_via_lkas": False, "pause_longitudinal_via_lkas": False, "speed_limit_controller": False, @@ -116,7 +118,7 @@ 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): +def test_hyundai_main_cruise_button_toggles_aol_when_assigned_to_aol(monkeypatch, tmp_path): monkeypatch.setattr(spc, "Params", FakeParams) monkeypatch.setattr(spc, "is_FrogsGoMoo", lambda: False) monkeypatch.setattr(spc, "ERROR_LOGS_PATH", tmp_path) @@ -126,7 +128,7 @@ def test_hyundai_main_cruise_button_toggles_aol_while_lkas_mode_is_enabled(monke 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) + toggles = make_toggles(always_on_lateral=True, always_on_lateral_lkas=True, main_cruise_aol_toggle=True) ret = card.update(car_state, starpilot_car_state, sm, toggles) assert ret.alwaysOnLateralAllowed is True @@ -135,6 +137,26 @@ def test_hyundai_main_cruise_button_toggles_aol_while_lkas_mode_is_enabled(monke assert ret.alwaysOnLateralAllowed is False +def test_hyundai_main_cruise_button_adopts_slc_when_assigned_to_slc(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, + main_cruise_slc_adopt=True, speed_limit_controller=True) + + initial_allowed = card.always_on_lateral_allowed + card.update(car_state, starpilot_car_state, sm, toggles) + + assert card.always_on_lateral_allowed is initial_allowed + assert card.params_memory.get_bool("SLCAdoptSpeedLimit") is True + + 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) diff --git a/starpilot/system/the_pond/assets/components/tools/device_settings_layout.json b/starpilot/system/the_pond/assets/components/tools/device_settings_layout.json index 796002ea5f..0a407a9608 100644 --- a/starpilot/system/the_pond/assets/components/tools/device_settings_layout.json +++ b/starpilot/system/the_pond/assets/components/tools/device_settings_layout.json @@ -97,14 +97,6 @@ "ui_type": "toggle", "is_parent_toggle": true }, - { - "key": "AlwaysOnLateralLKAS", - "label": "Enable With LKAS", - "description": "Enable \"Always On Lateral\" whenever \"LKAS\" is on, even when openpilot is not engaged.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "AlwaysOnLateral" - }, { "key": "PauseAOLOnBrake", "label": "Pause on Brake Press Below", @@ -2693,6 +2685,31 @@ { "value": 8, "label": "Create Bookmark" + }, + { + "value": 9, + "label": "Toggle Always On Lateral" + } + ] + }, + { + "key": "MainCruiseButtonControl", + "label": "CC Main Button", + "description": "Action performed when the cruise control main button is pressed.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "No Action" + }, + { + "value": 9, + "label": "Toggle Always On Lateral" + }, + { + "value": 10, + "label": "Adopt Current Speed Limit" } ] }, diff --git a/starpilot/ui/qt/offroad/lateral_settings.cc b/starpilot/ui/qt/offroad/lateral_settings.cc index a5d5d9791b..5552684284 100644 --- a/starpilot/ui/qt/offroad/lateral_settings.cc +++ b/starpilot/ui/qt/offroad/lateral_settings.cc @@ -42,7 +42,6 @@ StarPilotLateralPanel::StarPilotLateralPanel(StarPilotSettingsWindow *parent, bo {"ForceTorqueController", tr("Force Torque Controller"), tr("Use torque-based steering control instead of angle-based control for smoother lane keeping, especially in curves."), ""}, {"AlwaysOnLateral", tr("Always On Lateral"), tr("openpilot's steering remains active even when the accelerator or brake pedals are pressed."), "../../starpilot/assets/toggle_icons/icon_always_on_lateral.png"}, - {"AlwaysOnLateralLKAS", tr("Enable With LKAS"), tr("Enable \"Always On Lateral\" whenever \"LKAS\" is on, even when openpilot is not engaged."), ""}, {"PauseAOLOnBrake", tr("Pause on Brake Press Below"), tr("Pause \"Always On Lateral\" below the set speed while the brake pedal is pressed."), ""}, {"LaneChanges", tr("Lane Changes"), tr("Allow openpilot to change lanes."), "../../starpilot/assets/toggle_icons/icon_lane.png"}, @@ -358,11 +357,7 @@ void StarPilotLateralPanel::updateToggles() { bool setVisible = showAllToggles || parent->tuningLevel >= parent->starpilotToggleLevels[key].toDouble(); if (!showAllToggles) { - if (key == "AlwaysOnLateralLKAS") { - setVisible &= parent->lkasAllowedForAOL; - } - - else if (key == "ForceAutoTune") { + if (key == "ForceAutoTune") { setVisible &= !parent->hasAutoTune; setVisible &= !parent->isAngleCar; setVisible &= parent->isTorqueCar || forcingTorqueController || usingNNFF; diff --git a/starpilot/ui/qt/offroad/lateral_settings.h b/starpilot/ui/qt/offroad/lateral_settings.h index 5bf83e39ca..9693989e03 100644 --- a/starpilot/ui/qt/offroad/lateral_settings.h +++ b/starpilot/ui/qt/offroad/lateral_settings.h @@ -25,7 +25,7 @@ private: std::map toggles; QSet advancedLateralTuneKeys = {"ForceAutoTune", "ForceAutoTuneOff", "ForceTorqueController", "SteerDelay", "SteerFriction", "SteerLatAccel", "SteerKP", "SteerRatio"}; - QSet aolKeys = {"AlwaysOnLateralLKAS", "PauseAOLOnBrake"}; + QSet aolKeys = {"PauseAOLOnBrake"}; QSet laneChangeKeys = {"LaneChangeSmoothing", "LaneChangeTime", "LaneDetectionWidth", "MinimumLaneChangeSpeed", "NudgelessLaneChange", "OneLaneChange"}; QSet lateralTuneKeys = {"NNFF", "NNFFLite", "TurnDesires", "NavDesiresAllowed"}; QSet qolKeys = {"PauseLateralSpeed", "LateralResumeDelay"}; diff --git a/starpilot/ui/qt/offroad/wheel_settings.cc b/starpilot/ui/qt/offroad/wheel_settings.cc index 1e95cce726..f706030a0c 100644 --- a/starpilot/ui/qt/offroad/wheel_settings.cc +++ b/starpilot/ui/qt/offroad/wheel_settings.cc @@ -30,8 +30,24 @@ QMap getMergedWheelFunctionsMap() { return functionsMap; } -QString getWheelFunctionLabel(Params ¶ms, const QString &key) { - const QMap functionsMap = getMergedWheelFunctionsMap(); +QMap getMainCruiseFunctionsMap() { + return { + {0, QObject::tr("No Action")}, + {9, QObject::tr("Toggle Always On Lateral")}, + {10, QObject::tr("Adopt Current Speed Limit")}, + }; +} + +QString getWheelFunctionLabel(Params ¶ms, const QString &key, bool lkasAllowedForAOL = false) { + QMap functionsMap; + if (key == "MainCruiseButtonControl") { + functionsMap = getMainCruiseFunctionsMap(); + } else { + functionsMap = getMergedWheelFunctionsMap(); + if (key == "LKASButtonControl" && lkasAllowedForAOL) { + functionsMap[9] = QObject::tr("Toggle Always On Lateral"); + } + } return functionsMap.value(params.getInt(key.toStdString()), QObject::tr("No Action")); } @@ -63,6 +79,7 @@ StarPilotWheelPanel::StarPilotWheelPanel(StarPilotSettingsWindow *parent, bool f {"VeryLongCancelButtonControl", tr("Cancel Button (Very Long Press)"), tr("Action performed when the remapped \"Cancel\" button is pressed for more than 2.5 seconds."), "../../starpilot/assets/toggle_icons/icon_mute.png"}, {"VeryLongDistanceButtonControl", tr("Distance Button (Very Long Press)"), tr("Action performed when the \"Distance\" button is pressed for more than 2.5 seconds."), "../../starpilot/assets/toggle_icons/icon_mute.png"}, {"LKASButtonControl", tr("LKAS Button"), tr("Action performed when the \"LKAS\" button is pressed."), "../../starpilot/assets/toggle_icons/icon_mute.png"}, + {"MainCruiseButtonControl", tr("CC Main Button"), tr("Action performed when the cruise control main button is pressed."), "../../starpilot/assets/toggle_icons/icon_mute.png"}, {"ModeButtonControl", tr("Mode Button"), tr("Action performed when the \"Mode\" button is pressed."), "../../starpilot/assets/toggle_icons/icon_mute.png"}, {"LongModeButtonControl", tr("Mode Button (Long Press)"), tr("Action performed when the \"Mode\" button is pressed for more than 0.5 seconds."), "../../starpilot/assets/toggle_icons/icon_mute.png"}, {"VeryLongModeButtonControl", tr("Mode Button (Very Long Press)"), tr("Action performed when the \"Mode\" button is pressed for more than 2.5 seconds."), "../../starpilot/assets/toggle_icons/icon_mute.png"}, @@ -74,11 +91,19 @@ StarPilotWheelPanel::StarPilotWheelPanel(StarPilotSettingsWindow *parent, bool f for (const auto &[param, title, desc, icon] : wheelToggles) { ButtonControl *wheelToggle = new ButtonControl(title, tr("SELECT"), desc); QObject::connect(wheelToggle, &ButtonControl::clicked, [key = param, parent, wheelToggle, this]() { - QMap functionsMap = getWheelFunctionsMap(); - if (parent->hasOpenpilotLongitudinal) { - const QMap longitudinalFunctionsMap = getLongitudinalWheelFunctionsMap(); - for (auto it = longitudinalFunctionsMap.constBegin(); it != longitudinalFunctionsMap.constEnd(); ++it) { - functionsMap[it.key()] = it.value(); + QMap functionsMap; + if (key == "MainCruiseButtonControl") { + functionsMap = getMainCruiseFunctionsMap(); + } else { + functionsMap = getWheelFunctionsMap(); + if (parent->hasOpenpilotLongitudinal) { + const QMap longitudinalFunctionsMap = getLongitudinalWheelFunctionsMap(); + for (auto it = longitudinalFunctionsMap.constBegin(); it != longitudinalFunctionsMap.constEnd(); ++it) { + functionsMap[it.key()] = it.value(); + } + } + if (key == "LKASButtonControl" && parent->lkasAllowedForAOL) { + functionsMap[9] = tr("Toggle Always On Lateral"); } } @@ -89,7 +114,7 @@ StarPilotWheelPanel::StarPilotWheelPanel(StarPilotSettingsWindow *parent, bool f updateStarPilotToggles(); } }); - wheelToggle->setValue(getWheelFunctionLabel(params, param)); + wheelToggle->setValue(getWheelFunctionLabel(params, param, parent->lkasAllowedForAOL)); toggles[param] = wheelToggle; @@ -118,7 +143,6 @@ void StarPilotWheelPanel::updateToggles() { if (!showAllToggles && key == "LKASButtonControl") { setVisible &= !parent->isSubaru; - setVisible &= !parent->lkasAllowedForAOL || !(params.getBool("AlwaysOnLateral") && params.getBool("AlwaysOnLateralLKAS")); } if (!showAllToggles && ( @@ -146,7 +170,7 @@ void StarPilotWheelPanel::updateToggles() { } if (ButtonControl *wheelToggle = qobject_cast(toggle)) { - wheelToggle->setValue(getWheelFunctionLabel(params, key)); + wheelToggle->setValue(getWheelFunctionLabel(params, key, parent->lkasAllowedForAOL)); } toggle->setVisible(setVisible);