From 47833ed73a3a2263b3c60a39137e201637387c96 Mon Sep 17 00:00:00 2001 From: James Vecellio-Grant <159560811+Discountchubbs@users.noreply.github.com> Date: Sat, 19 Jul 2025 06:01:39 -0700 Subject: [PATCH] ui: Disable Updates Toggle (#1040) * Disable Updates * Add default to manager.py * Add enabled state and alternate descriptions --------- Co-authored-by: Nayan Co-authored-by: DevTekVE --- .../qt/offroad/settings/software_panel.cc | 36 +++++++++++++++++++ .../qt/offroad/settings/software_panel.h | 6 ++++ system/manager/manager.py | 1 + 3 files changed, 43 insertions(+) diff --git a/selfdrive/ui/sunnypilot/qt/offroad/settings/software_panel.cc b/selfdrive/ui/sunnypilot/qt/offroad/settings/software_panel.cc index 9430d02ba..7bef7ed20 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/settings/software_panel.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/settings/software_panel.cc @@ -18,6 +18,18 @@ SoftwarePanelSP::SoftwarePanelSP(QWidget *parent) : SoftwarePanel(parent) { searchBranches(d.text()); } }); + + // Disable Updates toggle + disableUpdatesToggle = new ParamControl("DisableUpdates", + tr("Disable Updates"), + tr("When enabled, software updates will be disabled. This requires a reboot to take effect."), + "../assets/icons/icon_warning.png", + this); + disableUpdatesToggle->showDescription(); + addItem(disableUpdatesToggle); + connect(disableUpdatesToggle, &ParamControl::toggleFlipped, this, &SoftwarePanelSP::handleDisableUpdatesToggled); + connect(uiState(), &UIState::offroadTransition, this, &SoftwarePanelSP::updateDisableUpdatesToggle); + updateDisableUpdatesToggle(!uiState()->scene.started); } /** @@ -49,3 +61,27 @@ void SoftwarePanelSP::searchBranches(const QString &query) { checkForUpdates(); } } + +void SoftwarePanelSP::handleDisableUpdatesToggled(bool state) { + if (ConfirmationDialog::confirm(tr("%1 updates requires a reboot.
Reboot now?") + .arg(state ? "Disabling" : "Enabling"), tr("Reboot"), this)) { + params.putBool("DoReboot", true); + } else { + params.putBool("DisableUpdates", !state); + disableUpdatesToggle->refresh(); + } +} + +void SoftwarePanelSP::updateDisableUpdatesToggle(bool offroad) { + bool enabled = offroad; + disableUpdatesToggle->setEnabled(enabled); + disableUpdatesToggle->setDescription(enabled + ? tr("When enabled, software updates will be disabled.
This requires a reboot to take effect.") + : tr("Please enable always offroad mode or turn off vehicle to adjust these toggles")); +} + +void SoftwarePanelSP::showEvent(QShowEvent *event) { + SoftwarePanel::showEvent(event); + updateDisableUpdatesToggle(!uiState()->scene.started); + disableUpdatesToggle->showDescription(); +} diff --git a/selfdrive/ui/sunnypilot/qt/offroad/settings/software_panel.h b/selfdrive/ui/sunnypilot/qt/offroad/settings/software_panel.h index 56d8b9be5..efaa836a2 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/settings/software_panel.h +++ b/selfdrive/ui/sunnypilot/qt/offroad/settings/software_panel.h @@ -19,4 +19,10 @@ public: private: void searchBranches(const QString &query); + ParamControl *disableUpdatesToggle = nullptr; + void handleDisableUpdatesToggled(bool state); +private slots: + void updateDisableUpdatesToggle(bool offroad); +protected: + void showEvent(QShowEvent *event) override; }; diff --git a/system/manager/manager.py b/system/manager/manager.py index b68207b69..922640de8 100755 --- a/system/manager/manager.py +++ b/system/manager/manager.py @@ -54,6 +54,7 @@ def manager_init() -> None: ("CustomAccLongPressIncrement", "5"), ("CustomAccShortPressIncrement", "1"), ("DeviceBootMode", "0"), + ("DisableUpdates", "0"), ("DynamicExperimentalControl", "0"), ("HyundaiLongitudinalTuning", "0"), ("InteractivityTimeout", "0"),