From 6907410750cad7207c01b3c30faaf3fcdf4ed86b Mon Sep 17 00:00:00 2001 From: FrogAi <91348155+FrogAi@users.noreply.github.com> Date: Tue, 27 Feb 2024 16:34:47 -0700 Subject: [PATCH] "Soft" reboot button Add function to perform a "soft" reboot for quicker reboots. Co-Authored-By: CHaucke89 <132518562+chaucke89@users.noreply.github.com> --- common/params.cc | 1 + selfdrive/manager/manager.py | 5 ++++- selfdrive/ui/qt/offroad/settings.cc | 23 +++++++++++++++++++++-- selfdrive/ui/qt/offroad/settings.h | 1 + system/hardware/base.h | 1 + system/hardware/base.py | 4 ++++ system/hardware/pc/hardware.py | 3 +++ system/hardware/tici/hardware.h | 7 +++++++ system/hardware/tici/hardware.py | 8 ++++++++ 9 files changed, 50 insertions(+), 3 deletions(-) diff --git a/common/params.cc b/common/params.cc index 5de1b3f..5c5c550 100644 --- a/common/params.cc +++ b/common/params.cc @@ -258,6 +258,7 @@ std::unordered_map keys = { {"DisableOnroadUploads", PERSISTENT}, {"DisableOpenpilotLongitudinal", PERSISTENT}, {"DisengageVolume", PERSISTENT}, + {"DoSoftReboot", CLEAR_ON_MANAGER_START}, {"DragonPilotTune", PERSISTENT}, {"DriverCamera", PERSISTENT}, {"DriveStats", PERSISTENT}, diff --git a/selfdrive/manager/manager.py b/selfdrive/manager/manager.py index 5e2f618..42a5521 100644 --- a/selfdrive/manager/manager.py +++ b/selfdrive/manager/manager.py @@ -415,7 +415,7 @@ def manager_thread() -> None: # Exit main loop when uninstall/shutdown/reboot is needed shutdown = False - for param in ("DoUninstall", "DoShutdown", "DoReboot"): + for param in ("DoUninstall", "DoShutdown", "DoReboot", "DoSoftReboot"): if params.get_bool(param): shutdown = True params.put("LastManagerExitReason", f"{param} {datetime.datetime.now()}") @@ -491,6 +491,9 @@ def main() -> None: if params.get_bool("DoUninstall"): cloudlog.warning("uninstalling") HARDWARE.uninstall() + elif params.get_bool("DoSoftReboot"): + cloudlog.warning("softreboot") + HARDWARE.soft_reboot() elif params.get_bool("DoReboot"): cloudlog.warning("reboot") HARDWARE.reboot() diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index bf9de1c..05c6b0f 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -507,6 +507,11 @@ DevicePanel::DevicePanel(SettingsWindow *parent) : ListWidget(parent) { power_layout->addWidget(reboot_btn); QObject::connect(reboot_btn, &QPushButton::clicked, this, &DevicePanel::reboot); + QPushButton *softreboot_btn = new QPushButton(tr("Soft Reboot")); + softreboot_btn->setObjectName("softreboot_btn"); + power_layout->addWidget(softreboot_btn); + QObject::connect(softreboot_btn, &QPushButton::clicked, this, &DevicePanel::softreboot); + QPushButton *poweroff_btn = new QPushButton(tr("Power Off")); poweroff_btn->setObjectName("poweroff_btn"); power_layout->addWidget(poweroff_btn); @@ -517,8 +522,10 @@ DevicePanel::DevicePanel(SettingsWindow *parent) : ListWidget(parent) { } setStyleSheet(R"( - #reboot_btn { height: 120px; border-radius: 15px; background-color: #393939; } - #reboot_btn:pressed { background-color: #4a4a4a; } + #softreboot_btn { height: 120px; border-radius: 15px; background-color: #e2e22c; } + #softreboot_btn:pressed { background-color: #ffe224; } + #reboot_btn { height: 120px; border-radius: 15px; background-color: #e2872c; } + #reboot_btn:pressed { background-color: #ff9724; } #poweroff_btn { height: 120px; border-radius: 15px; background-color: #E22C2C; } #poweroff_btn:pressed { background-color: #FF2424; } )"); @@ -562,6 +569,18 @@ void DevicePanel::reboot() { } } +void DevicePanel::softreboot() { + if (!uiState()->engaged()) { + if (ConfirmationDialog::confirm(tr("Are you sure you want to soft reboot?"), tr("Soft Reboot"), this)) { + if (!uiState()->engaged()) { + params.putBool("DoSoftReboot", true); + } + } + } else { + ConfirmationDialog::alert(tr("Disengage to Soft Reboot"), this); + } +} + void DevicePanel::poweroff() { if (!uiState()->engaged()) { if (ConfirmationDialog::confirm(tr("Are you sure you want to power off?"), tr("Power Off"), this)) { diff --git a/selfdrive/ui/qt/offroad/settings.h b/selfdrive/ui/qt/offroad/settings.h index 9ab4112..6b58a98 100644 --- a/selfdrive/ui/qt/offroad/settings.h +++ b/selfdrive/ui/qt/offroad/settings.h @@ -60,6 +60,7 @@ signals: private slots: void poweroff(); void reboot(); + void softreboot(); void updateCalibDescription(); private: diff --git a/system/hardware/base.h b/system/hardware/base.h index dc2282a..6fe65f8 100644 --- a/system/hardware/base.h +++ b/system/hardware/base.h @@ -26,6 +26,7 @@ public: } static void reboot() {} + static void soft_reboot() {} static void poweroff() {} static void set_brightness(int percent) {} static void set_display_power(bool on) {} diff --git a/system/hardware/base.py b/system/hardware/base.py index 7434bb6..527518a 100644 --- a/system/hardware/base.py +++ b/system/hardware/base.py @@ -30,6 +30,10 @@ class HardwareBase(ABC): def reboot(self, reason=None): pass + @abstractmethod + def soft_reboot(self): + pass + @abstractmethod def uninstall(self): pass diff --git a/system/hardware/pc/hardware.py b/system/hardware/pc/hardware.py index 719e272..704d65a 100644 --- a/system/hardware/pc/hardware.py +++ b/system/hardware/pc/hardware.py @@ -19,6 +19,9 @@ class Pc(HardwareBase): def reboot(self, reason=None): print("REBOOT!") + + def soft_reboot(self): + print("SOFT REBOOT!") def uninstall(self): print("uninstall") diff --git a/system/hardware/tici/hardware.h b/system/hardware/tici/hardware.h index e553a66..2d3cc72 100644 --- a/system/hardware/tici/hardware.h +++ b/system/hardware/tici/hardware.h @@ -50,6 +50,13 @@ public: } static void reboot() { std::system("sudo reboot"); } + static void soft_reboot() { + std::system("echo 894000.i2c | sudo tee /sys/bus/platform/drivers/i2c_geni/unbind"); + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + std::system("echo 894000.i2c | sudo tee /sys/bus/platform/drivers/i2c_geni/bind"); + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + std::system("sudo systemctl restart comma"); + } static void poweroff() { std::system("sudo poweroff"); } static void set_brightness(int percent) { std::string max = util::read_file("/sys/class/backlight/panel0-backlight/max_brightness"); diff --git a/system/hardware/tici/hardware.py b/system/hardware/tici/hardware.py index 5bb1032..ae3f086 100644 --- a/system/hardware/tici/hardware.py +++ b/system/hardware/tici/hardware.py @@ -134,6 +134,14 @@ class Tici(HardwareBase): def reboot(self, reason=None): subprocess.check_output(["sudo", "reboot"]) + def soft_reboot(self): + # Reload the touchscreen driver to reset touch_count and avoid triggering a system reset prompt + sudo_write("894000.i2c", "/sys/bus/platform/drivers/i2c_geni/unbind") + time.sleep(0.5) + sudo_write("894000.i2c", "/sys/bus/platform/drivers/i2c_geni/bind") + time.sleep(0.5) + os.system("sudo systemctl restart comma") + def uninstall(self): Path("/data/__system_reset__").touch() os.sync()