From 07ff72472636237d7c47addfce4d8bbbda98e9d2 Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Fri, 12 Nov 2021 18:10:34 +0100 Subject: [PATCH] Move shutdown/reboot handling to manager (#22882) * Move shutdown/reboot handling to manager * more logging * check enagaged * Apply suggestions from code review Co-authored-by: Adeeb Shihadeh --- selfdrive/common/params.cc | 2 ++ selfdrive/manager/manager.py | 20 ++++++++++++++++---- selfdrive/ui/qt/offroad/settings.cc | 22 ++++++++++++++++++---- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/selfdrive/common/params.cc b/selfdrive/common/params.cc index 17fe1a25ae..7e65ec128c 100644 --- a/selfdrive/common/params.cc +++ b/selfdrive/common/params.cc @@ -100,6 +100,8 @@ std::unordered_map keys = { {"DisableRadar", PERSISTENT}, // WARNING: THIS DISABLES AEB {"DisableUpdates", PERSISTENT}, {"DongleId", PERSISTENT}, + {"DoReboot", CLEAR_ON_MANAGER_START}, + {"DoShutdown", CLEAR_ON_MANAGER_START}, {"DoUninstall", CLEAR_ON_MANAGER_START}, {"EnableWideCamera", CLEAR_ON_MANAGER_START}, {"EndToEndToggle", PERSISTENT}, diff --git a/selfdrive/manager/manager.py b/selfdrive/manager/manager.py index 49c223a9e6..af0340af2a 100755 --- a/selfdrive/manager/manager.py +++ b/selfdrive/manager/manager.py @@ -158,9 +158,14 @@ def manager_thread(): msg.managerState.processes = [p.get_process_state_msg() for p in managed_processes.values()] pm.send('managerState', msg) - # TODO: let UI handle this - # Exit main loop when uninstall is needed - if params.get_bool("DoUninstall"): + # Exit main loop when uninstall/shutdown/reboot is needed + shutdown = False + for param in ("DoUninstall", "DoShutdown", "DoReboot"): + if params.get_bool(param): + cloudlog.warning(f"Shutting down manager - {param} set") + shutdown = True + + if shutdown: break @@ -189,9 +194,16 @@ def main(): finally: manager_cleanup() - if Params().get_bool("DoUninstall"): + params = Params() + if params.get_bool("DoUninstall"): cloudlog.warning("uninstalling") HARDWARE.uninstall() + elif params.get_bool("DoReboot"): + cloudlog.warning("reboot") + HARDWARE.reboot() + elif params.get_bool("DoShutdown"): + cloudlog.warning("shutdown") + HARDWARE.shutdown() if __name__ == "__main__": diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 5528996e77..a7916171ef 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -167,8 +167,15 @@ DevicePanel::DevicePanel(QWidget* parent) : ListWidget(parent) { reboot_btn->setObjectName("reboot_btn"); power_layout->addWidget(reboot_btn); QObject::connect(reboot_btn, &QPushButton::clicked, [=]() { - if (ConfirmationDialog::confirm("Are you sure you want to reboot?", this)) { - Hardware::reboot(); + if (QUIState::ui_state.status == UIStatus::STATUS_DISENGAGED) { + if (ConfirmationDialog::confirm("Are you sure you want to reboot?", this)) { + // Check engaged again in case it changed while the dialog was open + if (QUIState::ui_state.status == UIStatus::STATUS_DISENGAGED) { + Params().putBool("DoReboot", true); + } + } + } else { + ConfirmationDialog::alert("Disengage to Reboot", this); } }); @@ -176,8 +183,15 @@ DevicePanel::DevicePanel(QWidget* parent) : ListWidget(parent) { poweroff_btn->setObjectName("poweroff_btn"); power_layout->addWidget(poweroff_btn); QObject::connect(poweroff_btn, &QPushButton::clicked, [=]() { - if (ConfirmationDialog::confirm("Are you sure you want to power off?", this)) { - Hardware::poweroff(); + if (QUIState::ui_state.status == UIStatus::STATUS_DISENGAGED) { + if (ConfirmationDialog::confirm("Are you sure you want to power off?", this)) { + // Check engaged again in case it changed while the dialog was open + if (QUIState::ui_state.status == UIStatus::STATUS_DISENGAGED) { + Params().putBool("DoShutdown", true); + } + } + } else { + ConfirmationDialog::alert("Disengage to Power Off", this); } });