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"),