Panel - init

This commit is contained in:
Rick Lan
2025-04-09 12:10:47 +08:00
parent 461109b4f6
commit e2cc9945df
6 changed files with 333 additions and 2 deletions

View File

@@ -118,4 +118,5 @@ inline static std::unordered_map<std::string, uint32_t> keys = {
{"UpdaterLastFetchTime", PERSISTENT},
{"Version", PERSISTENT},
{"dp_device_last_log", CLEAR_ON_MANAGER_START},
{"dp_device_reset_conf", CLEAR_ON_MANAGER_START},
};

View File

@@ -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"]

View File

@@ -0,0 +1,295 @@
#include "selfdrive/ui/qt/offroad/dp_panel.h"
void DPPanel::add_toyota_toggles() {
std::vector<std::tuple<QString, QString, QString>> 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<std::tuple<QString, QString, QString>> 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<std::tuple<QString, QString, QString>> 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<std::tuple<QString, QString, QString>> 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<std::tuple<QString, QString, QString>> 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<std::tuple<QString, QString, QString>> 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<std::tuple<QString, QString, QString>> 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<cereal::CarParams>();
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 &param_name, const QString &param_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 &param) {
toggles[param.toStdString()]->showDescription();
}

View File

@@ -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 &param);
private:
Params params;
ParamWatcher *fs_watch;
std::map<std::string, ParamControl*> 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;
};

View File

@@ -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);

View File

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