From 5b5e7fa3b53ba8ea9225ef3b01adcfd3ee3e537a Mon Sep 17 00:00:00 2001 From: FrogAi <91348155+FrogAi@users.noreply.github.com> Date: Wed, 3 Apr 2024 13:18:38 -0700 Subject: [PATCH] Device Management Added toggles to customize the device shut down time, disable logging, disable uploads, disable internet connection check, and set a custom battery threshold check to help prevent battery drain. --- common/params.cc | 7 +++ selfdrive/controls/controlsd.py | 6 ++- .../icon_wifi_uploading_disabled.svg | 6 +++ .../assets/toggle_icons/icon_device.png | Bin 0 -> 25414 bytes .../ui/qt/offroad/control_settings.cc | 50 ++++++++++++++++++ .../ui/qt/offroad/control_settings.h | 2 +- selfdrive/manager/process_config.py | 21 +++++--- selfdrive/thermald/power_monitoring.py | 9 +++- selfdrive/thermald/thermald.py | 6 ++- selfdrive/ui/qt/offroad/settings.cc | 2 + selfdrive/ui/qt/widgets/offroad_alerts.cc | 13 +++++ selfdrive/ui/qt/widgets/offroad_alerts.h | 1 + selfdrive/ui/qt/widgets/wifi.cc | 31 ++++++++++- selfdrive/updated/updated.py | 3 ++ 14 files changed, 144 insertions(+), 13 deletions(-) create mode 100644 selfdrive/frogpilot/assets/other_images/icon_wifi_uploading_disabled.svg create mode 100644 selfdrive/frogpilot/assets/toggle_icons/icon_device.png diff --git a/common/params.cc b/common/params.cc index 6936f0d86..84d837a9c 100644 --- a/common/params.cc +++ b/common/params.cc @@ -247,6 +247,8 @@ std::unordered_map keys = { {"CustomTheme", PERSISTENT}, {"CydiaTune", PERSISTENT}, {"DecelerationProfile", PERSISTENT}, + {"DeviceManagement", PERSISTENT}, + {"DeviceShutdown", PERSISTENT}, {"DisengageVolume", PERSISTENT}, {"DynamicPathWidth", PERSISTENT}, {"EngageVolume", PERSISTENT}, @@ -256,11 +258,16 @@ std::unordered_map keys = { {"HideAOLStatusBar", PERSISTENT}, {"HideCEMStatusBar", PERSISTENT}, {"HideLeadMarker", PERSISTENT}, + {"IncreaseThermalLimits", PERSISTENT}, {"LaneLinesWidth", PERSISTENT}, {"LateralTune", PERSISTENT}, {"LongitudinalTune", PERSISTENT}, + {"LowVoltageShutdown", PERSISTENT}, {"ManualUpdateInitiated", PERSISTENT}, {"ModelUI", PERSISTENT}, + {"NoLogging", PERSISTENT}, + {"NoUploads", PERSISTENT}, + {"OfflineMode", PERSISTENT}, {"PathEdgeWidth", PERSISTENT}, {"PathWidth", PERSISTENT}, {"PauseAOLOnBrake", PERSISTENT}, diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index edd133e66..db2ea1b21 100644 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -245,7 +245,8 @@ class Controls: # Create events for temperature, disk space, and memory if self.sm['deviceState'].thermalStatus >= ThermalStatus.red: - self.events.add(EventName.overheat) + if not self.increase_thermal_limits or self.sm['deviceState'].thermalStatus == ThermalStatus.danger: + self.events.add(EventName.overheat) if self.sm['deviceState'].freeSpacePercent < 7 and not SIMULATION: # under 7% of space free no enable allowed self.events.add(EventName.outOfSpace) @@ -922,6 +923,9 @@ class Controls: frog_sounds = custom_sounds == 1 self.goat_scream = frog_sounds and self.params.get_bool("GoatScream") + device_management = self.params.get_bool("DeviceManagement") + self.increase_thermal_limits = device_management and self.params.get_bool("IncreaseThermalLimits") + lateral_tune = self.params.get_bool("LateralTune") longitudinal_tune = self.CP.openpilotLongitudinalControl and self.params.get_bool("LongitudinalTune") diff --git a/selfdrive/frogpilot/assets/other_images/icon_wifi_uploading_disabled.svg b/selfdrive/frogpilot/assets/other_images/icon_wifi_uploading_disabled.svg new file mode 100644 index 000000000..156052556 --- /dev/null +++ b/selfdrive/frogpilot/assets/other_images/icon_wifi_uploading_disabled.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_device.png b/selfdrive/frogpilot/assets/toggle_icons/icon_device.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f44076fbe825f8abeae8d0c925b9ac7f3436bf GIT binary patch literal 25414 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 hJo6{`H$UkwsetVisible(deviceManagementKeys.find(key.c_str()) != deviceManagementKeys.end()); + } + }); + toggle = deviceManagementToggle; + } else if (param == "DeviceShutdown") { + std::map shutdownLabels; + for (int i = 0; i <= 33; ++i) { + shutdownLabels[i] = i == 0 ? tr("5 mins") : i <= 3 ? QString::number(i * 15) + tr(" mins") : QString::number(i - 3) + (i == 4 ? tr(" hour") : tr(" hours")); + } + toggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 33, shutdownLabels, this, false); + } else if (param == "LowVoltageShutdown") { + toggle = new FrogPilotParamValueControl(param, title, desc, icon, 11.8, 12.5, std::map(), this, false, tr(" volts"), 1, 0.01); + } else if (param == "LateralTune") { FrogPilotParamManageControl *lateralTuneToggle = new FrogPilotParamManageControl(param, title, desc, icon, this); QObject::connect(lateralTuneToggle, &FrogPilotParamManageControl::manageButtonClicked, this, [this]() { @@ -218,6 +244,30 @@ FrogPilotControlsPanel::FrogPilotControlsPanel(SettingsWindow *parent) : FrogPil } }); + QObject::connect(toggles["IncreaseThermalLimits"], &ToggleControl::toggleFlipped, [this]() { + if (params.getBool("IncreaseThermalLimits")) { + FrogPilotConfirmationDialog::toggleAlert( + tr("WARNING: This can cause premature wear or damage by running the device over comma's recommended temperature limits!"), + tr("I understand the risks."), this); + } + }); + + QObject::connect(toggles["NoLogging"], &ToggleControl::toggleFlipped, [this]() { + if (params.getBool("NoLogging")) { + FrogPilotConfirmationDialog::toggleAlert( + tr("WARNING: This will prevent your drives from being recorded and the data will be unobtainable!"), + tr("I understand the risks."), this); + } + }); + + QObject::connect(toggles["NoUploads"], &ToggleControl::toggleFlipped, [this]() { + if (params.getBool("NoUploads")) { + FrogPilotConfirmationDialog::toggleAlert( + tr("WARNING: This will prevent your drives from appearing on comma connect which may impact debugging and support!"), + tr("I understand the risks."), this); + } + }); + std::set rebootKeys = {"AlwaysOnLateral", "AlwaysOnLateralMain"}; for (const QString &key : rebootKeys) { QObject::connect(toggles[key.toStdString().c_str()], &ToggleControl::toggleFlipped, [this]() { diff --git a/selfdrive/frogpilot/ui/qt/offroad/control_settings.h b/selfdrive/frogpilot/ui/qt/offroad/control_settings.h index 348f434c0..bd5d4fe2b 100644 --- a/selfdrive/frogpilot/ui/qt/offroad/control_settings.h +++ b/selfdrive/frogpilot/ui/qt/offroad/control_settings.h @@ -33,7 +33,7 @@ private: std::set aolKeys = {"AlwaysOnLateralMain", "HideAOLStatusBar", "PauseAOLOnBrake"}; std::set conditionalExperimentalKeys = {"CECurves", "CECurvesLead", "CENavigation", "CESignal", "CESlowerLead", "CEStopLights", "HideCEMStatusBar"}; - std::set deviceManagementKeys = {}; + std::set deviceManagementKeys = {"DeviceShutdown", "IncreaseThermalLimits", "LowVoltageShutdown", "NoLogging", "NoUploads", "OfflineMode"}; std::set experimentalModeActivationKeys = {}; std::set laneChangeKeys = {}; std::set lateralTuneKeys = {}; diff --git a/selfdrive/manager/process_config.py b/selfdrive/manager/process_config.py index f4f700652..6a8144010 100644 --- a/selfdrive/manager/process_config.py +++ b/selfdrive/manager/process_config.py @@ -42,21 +42,28 @@ def only_offroad(started, params, CP: car.CarParams) -> bool: return not started # FrogPilot functions +def allow_logging(started, params, CP: car.CarParams) -> bool: + allow_logging = not (params.get_bool("DeviceManagement") and params.get_bool("NoLogging")) + return allow_logging and logging(started, params, CP) + +def allow_uploads(started, params, CP: car.CarParams) -> bool: + allow_uploads = not (params.get_bool("DeviceManagement") and params.get_bool("NoUploads")) + return allow_uploads procs = [ DaemonProcess("manage_athenad", "selfdrive.athena.manage_athenad", "AthenadPid"), NativeProcess("camerad", "system/camerad", ["./camerad"], driverview), - NativeProcess("logcatd", "system/logcatd", ["./logcatd"], only_onroad), - NativeProcess("proclogd", "system/proclogd", ["./proclogd"], only_onroad), - PythonProcess("logmessaged", "system.logmessaged", always_run), + NativeProcess("logcatd", "system/logcatd", ["./logcatd"], allow_logging), + NativeProcess("proclogd", "system/proclogd", ["./proclogd"], allow_logging), + PythonProcess("logmessaged", "system.logmessaged", allow_logging), PythonProcess("micd", "system.micd", iscar), PythonProcess("timed", "system.timed", always_run, enabled=not PC), PythonProcess("dmonitoringmodeld", "selfdrive.modeld.dmonitoringmodeld", driverview, enabled=(not PC or WEBCAM)), - NativeProcess("encoderd", "system/loggerd", ["./encoderd"], only_onroad), + NativeProcess("encoderd", "system/loggerd", ["./encoderd"], allow_logging), NativeProcess("stream_encoderd", "system/loggerd", ["./encoderd", "--stream"], notcar), - NativeProcess("loggerd", "system/loggerd", ["./loggerd"], logging), + NativeProcess("loggerd", "system/loggerd", ["./loggerd"], allow_logging), NativeProcess("modeld", "selfdrive/modeld", ["./modeld"], only_onroad), NativeProcess("mapsd", "selfdrive/navd", ["./mapsd"], only_onroad), PythonProcess("navmodeld", "selfdrive.modeld.navmodeld", only_onroad), @@ -82,8 +89,8 @@ procs = [ PythonProcess("thermald", "selfdrive.thermald.thermald", always_run), PythonProcess("tombstoned", "selfdrive.tombstoned", always_run, enabled=not PC), PythonProcess("updated", "selfdrive.updated.updated", only_offroad, enabled=not PC), - PythonProcess("uploader", "system.loggerd.uploader", always_run), - PythonProcess("statsd", "selfdrive.statsd", always_run), + PythonProcess("uploader", "system.loggerd.uploader", allow_uploads), + PythonProcess("statsd", "selfdrive.statsd", allow_logging), # debug procs NativeProcess("bridge", "cereal/messaging", ["./bridge"], notcar), diff --git a/selfdrive/thermald/power_monitoring.py b/selfdrive/thermald/power_monitoring.py index d9bc8e2a4..7936f8914 100644 --- a/selfdrive/thermald/power_monitoring.py +++ b/selfdrive/thermald/power_monitoring.py @@ -37,6 +37,11 @@ class PowerMonitoring: self.car_battery_capacity_uWh = max((CAR_BATTERY_CAPACITY_uWh / 10), int(car_battery_capacity_uWh)) # FrogPilot variables + device_management = self.params.get_bool("DeviceManagement") + device_shutdown_setting = self.params.get_int("DeviceShutdown") if device_management else 33 + # If the toggle is set for < 1 hour, configure by 15 minute increments + self.device_shutdown_time = (device_shutdown_setting - 3) * 3600 if device_shutdown_setting >= 4 else device_shutdown_setting * (60 * 15) + self.low_voltage_shutdown = self.params.get_float("LowVoltageShutdown") if device_management else VBATT_PAUSE_CHARGING # Calculation tick def calculate(self, voltage: int | None, ignition: bool): @@ -116,9 +121,9 @@ class PowerMonitoring: now = time.monotonic() should_shutdown = False offroad_time = (now - offroad_timestamp) - low_voltage_shutdown = (self.car_voltage_mV < (VBATT_PAUSE_CHARGING * 1e3) and + low_voltage_shutdown = (self.car_voltage_mV < (self.low_voltage_shutdown * 1e3) and offroad_time > VOLTAGE_SHUTDOWN_MIN_OFFROAD_TIME_S) - should_shutdown |= offroad_time > MAX_TIME_OFFROAD_S + should_shutdown |= offroad_time > self.device_shutdown_time should_shutdown |= low_voltage_shutdown should_shutdown |= (self.car_battery_capacity_uWh <= 0) should_shutdown &= not ignition diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index 9a744f041..da1d09e7c 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -204,6 +204,10 @@ def thermald_thread(end_event, hw_queue) -> None: fan_controller = None + # FrogPilot variables + device_management = params.get_bool("DeviceManagement") + offline_mode = device_management and params.get_bool("OfflineMode") + while not end_event.is_set(): sm.update(PANDA_STATES_TIMEOUT) @@ -296,7 +300,7 @@ def thermald_thread(end_event, hw_queue) -> None: # **** starting logic **** - startup_conditions["up_to_date"] = params.get("Offroad_ConnectivityNeeded") is None or params.get_bool("DisableUpdates") or params.get_bool("SnoozeUpdate") + startup_conditions["up_to_date"] = params.get("Offroad_ConnectivityNeeded") is None or params.get_bool("DisableUpdates") or params.get_bool("SnoozeUpdate") or offline_mode startup_conditions["not_uninstalling"] = not params.get_bool("DoUninstall") startup_conditions["accepted_terms"] = params.get("HasAcceptedTerms") == terms_version diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 5f78e2512..07312eef8 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -158,6 +158,8 @@ void TogglesPanel::showEvent(QShowEvent *event) { void TogglesPanel::updateToggles() { auto disengage_on_accelerator_toggle = toggles["DisengageOnAccelerator"]; disengage_on_accelerator_toggle->setVisible(!params.getBool("AlwaysOnLateral")); + auto driver_camera_toggle = toggles["RecordFront"]; + driver_camera_toggle->setVisible(!(params.getBool("DeviceManagement") && params.getBool("NoLogging") && params.getBool("NoUploads"))); auto experimental_mode_toggle = toggles["ExperimentalMode"]; auto op_long_toggle = toggles["ExperimentalLongitudinalEnabled"]; diff --git a/selfdrive/ui/qt/widgets/offroad_alerts.cc b/selfdrive/ui/qt/widgets/offroad_alerts.cc index 74ece36d1..f1cde0961 100644 --- a/selfdrive/ui/qt/widgets/offroad_alerts.cc +++ b/selfdrive/ui/qt/widgets/offroad_alerts.cc @@ -32,6 +32,18 @@ AbstractAlert::AbstractAlert(bool hasRebootBtn, QWidget *parent) : QFrame(parent footer_layout->addWidget(dismiss_btn, 0, Qt::AlignBottom | Qt::AlignLeft); QObject::connect(dismiss_btn, &QPushButton::clicked, this, &AbstractAlert::dismiss); + disable_check_btn = new QPushButton(tr("Disable Internet Check")); + disable_check_btn->setVisible(false); + disable_check_btn->setFixedSize(625, 125); + footer_layout->addWidget(disable_check_btn, 1, Qt::AlignBottom | Qt::AlignCenter); + QObject::connect(disable_check_btn, &QPushButton::clicked, [=]() { + params.putBool("SnoozeUpdate", true); + params.putBool("DeviceManagement", true); + params.putBool("OfflineMode", true); + }); + QObject::connect(disable_check_btn, &QPushButton::clicked, this, &AbstractAlert::dismiss); + disable_check_btn->setStyleSheet(R"(color: white; background-color: #4F4F4F;)"); + snooze_btn = new QPushButton(tr("Snooze Update")); snooze_btn->setVisible(false); snooze_btn->setFixedSize(550, 125); @@ -107,6 +119,7 @@ int OffroadAlert::refresh() { label->setVisible(!text.isEmpty()); alertCount += !text.isEmpty(); } + disable_check_btn->setVisible(!alerts["Offroad_ConnectivityNeeded"]->text().isEmpty()); snooze_btn->setVisible(!alerts["Offroad_ConnectivityNeeded"]->text().isEmpty()); return alertCount; } diff --git a/selfdrive/ui/qt/widgets/offroad_alerts.h b/selfdrive/ui/qt/widgets/offroad_alerts.h index ace2e7545..abeafd225 100644 --- a/selfdrive/ui/qt/widgets/offroad_alerts.h +++ b/selfdrive/ui/qt/widgets/offroad_alerts.h @@ -15,6 +15,7 @@ class AbstractAlert : public QFrame { protected: AbstractAlert(bool hasRebootBtn, QWidget *parent = nullptr); + QPushButton *disable_check_btn; QPushButton *snooze_btn; QVBoxLayout *scrollable_layout; Params params; diff --git a/selfdrive/ui/qt/widgets/wifi.cc b/selfdrive/ui/qt/widgets/wifi.cc index 9c5289a22..591c1ce7c 100644 --- a/selfdrive/ui/qt/widgets/wifi.cc +++ b/selfdrive/ui/qt/widgets/wifi.cc @@ -81,6 +81,34 @@ WiFiPromptWidget::WiFiPromptWidget(QWidget *parent) : QFrame(parent) { } stack->addWidget(uploading); + QWidget *notUploading = new QWidget; + QVBoxLayout *not_uploading_layout = new QVBoxLayout(notUploading); + not_uploading_layout->setContentsMargins(64, 56, 64, 56); + not_uploading_layout->setSpacing(36); + { + QHBoxLayout *title_layout = new QHBoxLayout; + { + QLabel *title = new QLabel(tr("Uploading disabled")); + title->setStyleSheet("font-size: 64px; font-weight: 600;"); + title->setWordWrap(true); + title->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); + title_layout->addWidget(title); + title_layout->addStretch(); + + QLabel *icon = new QLabel; + QPixmap pixmap("../frogpilot/assets/other_images/icon_wifi_uploading_disabled.svg"); + icon->setPixmap(pixmap.scaledToWidth(120, Qt::SmoothTransformation)); + title_layout->addWidget(icon); + } + not_uploading_layout->addLayout(title_layout); + + QLabel *desc = new QLabel(tr("Toggle off the 'Disable Uploading' toggle to enable uploads.")); + desc->setStyleSheet("font-size: 48px; font-weight: 400;"); + desc->setWordWrap(true); + not_uploading_layout->addWidget(desc); + } + stack->addWidget(notUploading); + setStyleSheet(R"( WiFiPromptWidget { background-color: #333333; @@ -99,5 +127,6 @@ void WiFiPromptWidget::updateState(const UIState &s) { auto network_type = sm["deviceState"].getDeviceState().getNetworkType(); auto uploading = network_type == cereal::DeviceState::NetworkType::WIFI || network_type == cereal::DeviceState::NetworkType::ETHERNET; - stack->setCurrentIndex(uploading ? 1 : 0); + bool uploading_disabled = params.getBool("DeviceManagement") && params.getBool("NoUploads"); + stack->setCurrentIndex(uploading_disabled ? 2 : uploading ? 1 : 0); } diff --git a/selfdrive/updated/updated.py b/selfdrive/updated/updated.py index c2010c90e..f17be3f41 100755 --- a/selfdrive/updated/updated.py +++ b/selfdrive/updated/updated.py @@ -237,6 +237,7 @@ class Updater: self._has_internet: bool = False # FrogPilot variables + self.offline_mode = self.params.get_bool("DeviceManagement") and self.params.get_bool("OfflineMode") @property def has_internet(self) -> bool: @@ -326,6 +327,8 @@ class Updater: set_offroad_alert(alert, False) now = datetime.datetime.utcnow() + if self.offline_mode: + last_update = now dt = now - last_update if failed_count > 15 and exception is not None and self.has_internet: if is_tested_branch():