From e2cc9945dfd0e1f3ef92b13201031310c4019b6e Mon Sep 17 00:00:00 2001 From: Rick Lan Date: Wed, 9 Apr 2025 12:10:47 +0800 Subject: [PATCH] Panel - init --- common/params_keys.h | 1 + selfdrive/ui/SConscript | 2 +- selfdrive/ui/qt/offroad/dp_panel.cc | 295 ++++++++++++++++++++++++++++ selfdrive/ui/qt/offroad/dp_panel.h | 31 +++ selfdrive/ui/qt/offroad/settings.cc | 2 + system/manager/manager.py | 4 +- 6 files changed, 333 insertions(+), 2 deletions(-) create mode 100644 selfdrive/ui/qt/offroad/dp_panel.cc create mode 100644 selfdrive/ui/qt/offroad/dp_panel.h diff --git a/common/params_keys.h b/common/params_keys.h index 28b87c2c1..b576f1a97 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -118,4 +118,5 @@ inline static std::unordered_map keys = { {"UpdaterLastFetchTime", PERSISTENT}, {"Version", PERSISTENT}, {"dp_device_last_log", CLEAR_ON_MANAGER_START}, + {"dp_device_reset_conf", CLEAR_ON_MANAGER_START}, }; diff --git a/selfdrive/ui/SConscript b/selfdrive/ui/SConscript index 657b97597..a03ff3c42 100644 --- a/selfdrive/ui/SConscript +++ b/selfdrive/ui/SConscript @@ -28,7 +28,7 @@ qt_libs = [widgets, qt_util] + base_libs qt_src = ["main.cc", "ui.cc", "qt/sidebar.cc", "qt/body.cc", "qt/window.cc", "qt/home.cc", "qt/offroad/settings.cc", - "qt/offroad/software_settings.cc", "qt/offroad/developer_panel.cc", "qt/offroad/onboarding.cc", + "qt/offroad/software_settings.cc", "qt/offroad/developer_panel.cc", "qt/offroad/onboarding.cc", "qt/offroad/dp_panel.cc", "qt/offroad/driverview.cc", "qt/offroad/experimental_mode.cc", "qt/offroad/firehose.cc", "qt/onroad/onroad_home.cc", "qt/onroad/annotated_camera.cc", "qt/onroad/model.cc", "qt/onroad/buttons.cc", "qt/onroad/alerts.cc", "qt/onroad/driver_monitoring.cc", "qt/onroad/hud.cc"] diff --git a/selfdrive/ui/qt/offroad/dp_panel.cc b/selfdrive/ui/qt/offroad/dp_panel.cc new file mode 100644 index 000000000..548b02be5 --- /dev/null +++ b/selfdrive/ui/qt/offroad/dp_panel.cc @@ -0,0 +1,295 @@ +#include "selfdrive/ui/qt/offroad/dp_panel.h" + +void DPPanel::add_toyota_toggles() { + std::vector> toggle_defs{ + { + "", + QString::fromUtf8("🐉 ") + tr("Toyota / Lexus"), + "", + }, + }; + + QWidget *label = nullptr; + bool has_toggle = false; + + for (auto &[param, title, desc] : toggle_defs) { + if (param.isEmpty()) { + label = new LabelControl(title, ""); + addItem(label); + continue; + } + + has_toggle = true; + auto toggle = new ParamControl(param, title, desc, "", this); + bool locked = params.getBool((param + "Lock").toStdString()); + toggle->setEnabled(!locked); + addItem(toggle); + toggles[param.toStdString()] = toggle; + } + + // If no toggles were added, hide the label + if (!has_toggle && label) { + label->hide(); + } +} + +void DPPanel::add_vag_toggles() { + std::vector> toggle_defs{ + { + "", + QString::fromUtf8("🐉 ") + tr("VW / Audi / Skoda"), + "", + }, + }; + + QWidget *label = nullptr; + bool has_toggle = false; + + for (auto &[param, title, desc] : toggle_defs) { + if (param.isEmpty()) { + label = new LabelControl(title, ""); + addItem(label); + continue; + } + + has_toggle = true; + auto toggle = new ParamControl(param, title, desc, "", this); + bool locked = params.getBool((param + "Lock").toStdString()); + toggle->setEnabled(!locked); + addItem(toggle); + toggles[param.toStdString()] = toggle; + } + + // If no toggles were added, hide the label + if (!has_toggle && label) { + label->hide(); + } +} + +void DPPanel::add_mazda_toggles() { + std::vector> toggle_defs{ + { + "", + QString::fromUtf8("🐉 ") + tr("Mazda"), + "", + }, + }; + + QWidget *label = nullptr; + bool has_toggle = false; + + for (auto &[param, title, desc] : toggle_defs) { + if (param.isEmpty()) { + label = new LabelControl(title, ""); + addItem(label); + continue; + } + + has_toggle = true; + auto toggle = new ParamControl(param, title, desc, "", this); + bool locked = params.getBool((param + "Lock").toStdString()); + toggle->setEnabled(!locked); + addItem(toggle); + toggles[param.toStdString()] = toggle; + } + + // If no toggles were added, hide the label + if (!has_toggle && label) { + label->hide(); + } +} + +void DPPanel::add_lateral_toggles() { + std::vector> toggle_defs{ + { + "", + QString::fromUtf8("🐉 ") + tr("Lateral Ctrl"), + "", + }, + }; + + QWidget *label = nullptr; + bool has_toggle = false; + + for (auto &[param, title, desc] : toggle_defs) { + if (param.isEmpty()) { + label = new LabelControl(title, ""); + addItem(label); + continue; + } + + has_toggle = true; + auto toggle = new ParamControl(param, title, desc, "", this); + bool locked = params.getBool((param + "Lock").toStdString()); + toggle->setEnabled(!locked); + addItem(toggle); + toggles[param.toStdString()] = toggle; + } + + // If no toggles were added, hide the label + if (!has_toggle && label) { + label->hide(); + } +} + +void DPPanel::add_longitudinal_toggles() { + std::vector> toggle_defs{ + { + "", + QString::fromUtf8("🐉 ") + tr("Longitudinal Ctrl"), + "", + }, + }; + + QWidget *label = nullptr; + bool has_toggle = false; + + for (auto &[param, title, desc] : toggle_defs) { + if (param.isEmpty()) { + label = new LabelControl(title, ""); + addItem(label); + continue; + } + + has_toggle = true; + auto toggle = new ParamControl(param, title, desc, "", this); + bool locked = params.getBool((param + "Lock").toStdString()); + toggle->setEnabled(!locked); + addItem(toggle); + toggles[param.toStdString()] = toggle; + } + + // If no toggles were added, hide the label + if (!has_toggle && label) { + label->hide(); + } +} + +void DPPanel::add_ui_toggles() { + std::vector> toggle_defs{ + { + "", + QString::fromUtf8("🐉 ") + tr("UI"), + "", + }, + }; + + QWidget *label = nullptr; + bool has_toggle = false; + + for (auto &[param, title, desc] : toggle_defs) { + if (param.isEmpty()) { + label = new LabelControl(title, ""); + addItem(label); + continue; + } + + has_toggle = true; + auto toggle = new ParamControl(param, title, desc, "", this); + bool locked = params.getBool((param + "Lock").toStdString()); + toggle->setEnabled(!locked); + addItem(toggle); + toggles[param.toStdString()] = toggle; + } + + // If no toggles were added, hide the label + if (!has_toggle && label) { + label->hide(); + } +} + +void DPPanel::add_device_toggles() { + std::vector> toggle_defs{ + { + "", + QString::fromUtf8("🐉 ") + tr("Device"), + "", + }, + }; + + QWidget *label = nullptr; + bool has_toggle = false; + + for (auto &[param, title, desc] : toggle_defs) { + if (param.isEmpty()) { + label = new LabelControl(title, ""); + addItem(label); + continue; + } + + has_toggle = true; + auto toggle = new ParamControl(param, title, desc, "", this); + bool locked = params.getBool((param + "Lock").toStdString()); + toggle->setEnabled(!locked); + addItem(toggle); + toggles[param.toStdString()] = toggle; + } + + // If no toggles were added, hide the label + if (!has_toggle && label) { + label->hide(); + } +} + +DPPanel::DPPanel(SettingsWindow *parent) : ListWidget(parent) { + auto cp_bytes = params.get("CarParamsPersistent"); + if (!cp_bytes.empty()) { + AlignedBuffer aligned_buf; + capnp::FlatArrayMessageReader cmsg(aligned_buf.align(cp_bytes.data(), cp_bytes.size())); + cereal::CarParams::Reader CP = cmsg.getRoot(); + brand = QString::fromStdString(CP.getBrand()); + vehicle_has_long_ctrl = hasLongitudinalControl(CP); + vehicle_has_radar_unavailable = CP.getRadarUnavailable(); + } + + if (brand == "toyota") { + add_toyota_toggles(); + } else if (brand == "volkswagen") { + add_vag_toggles(); + } else if (brand == "mazda") { + add_mazda_toggles(); + } + add_lateral_toggles(); + add_longitudinal_toggles(); + add_ui_toggles(); + add_device_toggles(); + + auto resetBtn = new ButtonControl(tr("Reset dragonpilot settings"), tr("RESET")); + connect(resetBtn, &ButtonControl::clicked, [&]() { + if (ConfirmationDialog::confirm(tr("Are you sure you want to reset all settings?"), tr("Reset"), this)) { + params.putBool("dp_device_reset_conf", true); + } + }); + addItem(resetBtn); + + fs_watch = new ParamWatcher(this); + QObject::connect(fs_watch, &ParamWatcher::paramChanged, [=](const QString ¶m_name, const QString ¶m_value) { + updateStates(); + }); + + connect(uiState(), &UIState::offroadTransition, [=](bool offroad) { + is_onroad = !offroad; + updateStates(); + }); + + updateStates(); +} + +void DPPanel::showEvent(QShowEvent *event) { + updateStates(); +} + +void DPPanel::updateStates() { + // do fs_watch here + + if (!isVisible()) { + return; + } + + // do state change logic here + +} + +void DPPanel::expandToggleDescription(const QString ¶m) { + toggles[param.toStdString()]->showDescription(); +} diff --git a/selfdrive/ui/qt/offroad/dp_panel.h b/selfdrive/ui/qt/offroad/dp_panel.h new file mode 100644 index 000000000..87095c73b --- /dev/null +++ b/selfdrive/ui/qt/offroad/dp_panel.h @@ -0,0 +1,31 @@ +#pragma once + +#include "selfdrive/ui/qt/offroad/settings.h" + +class DPPanel : public ListWidget { + Q_OBJECT +public: + explicit DPPanel(SettingsWindow *parent); + +public slots: + void expandToggleDescription(const QString ¶m); + +private: + Params params; + ParamWatcher *fs_watch; + std::map toggles; + QString brand; + bool is_onroad = false; + bool vehicle_has_long_ctrl; + bool vehicle_has_radar_unavailable; + + void add_toyota_toggles(); + void add_vag_toggles(); + void add_mazda_toggles(); + void add_lateral_toggles(); + void add_longitudinal_toggles(); + void add_ui_toggles(); + void add_device_toggles(); + void updateStates(); + void showEvent(QShowEvent *event) override; +}; diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 0960e8ec0..d0babde7d 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -15,6 +15,7 @@ #include "selfdrive/ui/qt/widgets/scrollview.h" #include "selfdrive/ui/qt/offroad/developer_panel.h" #include "selfdrive/ui/qt/offroad/firehose.h" +#include "selfdrive/ui/qt/offroad/dp_panel.h" TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) { // param, title, desc, icon @@ -399,6 +400,7 @@ SettingsWindow::SettingsWindow(QWidget *parent) : QFrame(parent) { {tr("Software"), new SoftwarePanel(this)}, {tr("Firehose"), new FirehosePanel(this)}, {tr("Developer"), new DeveloperPanel(this)}, + {"DP", new DPPanel(this)}, }; nav_btns = new QButtonGroup(this); diff --git a/system/manager/manager.py b/system/manager/manager.py index 3513ba79b..9fe81947f 100755 --- a/system/manager/manager.py +++ b/system/manager/manager.py @@ -165,8 +165,10 @@ 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", "dp_device_reset_conf"): if params.get_bool(param): + if param == "dp_device_reset_conf": + os.system("rm -fr /data/params/d/dp_*") shutdown = True params.put("LastManagerExitReason", f"{param} {datetime.datetime.now()}") cloudlog.warning(f"Shutting down manager - {param} set")