diff --git a/common/libcommon.a b/common/libcommon.a index caf26e0f..22312eff 100644 Binary files a/common/libcommon.a and b/common/libcommon.a differ diff --git a/common/params_keys.h b/common/params_keys.h index fa60d66b..c4a3a7b8 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -450,6 +450,7 @@ inline static std::unordered_map keys = { {"SignalAnimation", {PERSISTENT, STRING, "frog", "stock", 0}}, {"SignalMetrics", {PERSISTENT, BOOL, "0", "0", 3}}, {"SignalToDownload", {CLEAR_ON_MANAGER_START, STRING, "", ""}}, + {"SimpleMode", {PERSISTENT, BOOL, "0", "0", 0}}, {"SLCConfirmation", {PERSISTENT, BOOL, "0", "0", 0}}, {"SLCConfirmationHigher", {PERSISTENT, BOOL, "0", "0", 0}}, {"SLCConfirmationLower", {PERSISTENT, BOOL, "0", "0", 0}}, diff --git a/common/params_pyx.so b/common/params_pyx.so index 0556c5b0..1d7c4ae2 100755 Binary files a/common/params_pyx.so and b/common/params_pyx.so differ diff --git a/panda/board/obj/gitversion.h b/panda/board/obj/gitversion.h index 205bc782..c3f9a45f 100644 --- a/panda/board/obj/gitversion.h +++ b/panda/board/obj/gitversion.h @@ -1,2 +1,2 @@ extern const uint8_t gitversion[19]; -const uint8_t gitversion[19] = "DEV-2b280bd5-DEBUG"; +const uint8_t gitversion[19] = "DEV-a0ae1eea-DEBUG"; diff --git a/panda/board/obj/version b/panda/board/obj/version index 1b4cbaa7..1a1822b1 100644 --- a/panda/board/obj/version +++ b/panda/board/obj/version @@ -1 +1 @@ -DEV-2b280bd5-DEBUG \ No newline at end of file +DEV-a0ae1eea-DEBUG \ No newline at end of file diff --git a/selfdrive/ui/qt/home.cc b/selfdrive/ui/qt/home.cc index a01c9019..fe5de147 100644 --- a/selfdrive/ui/qt/home.cc +++ b/selfdrive/ui/qt/home.cc @@ -176,22 +176,43 @@ OffroadHome::OffroadHome(QWidget* parent) : QFrame(parent) { home_layout->setContentsMargins(0, 0, 0, 0); home_layout->setSpacing(30); - // left: stack of DriveStats / DriveSummary - QWidget *left_widget = new QWidget(this); - QStackedLayout *left_stack = new QStackedLayout(left_widget); - left_stack->setContentsMargins(0, 0, 0, 0); + // left: stock prime card in simple mode, StarPilot drive stats otherwise + left_widget = new QStackedWidget(this); - left_stack->addWidget(new DriveStats()); - StarPilotDriveSummary *drive_summary = new StarPilotDriveSummary(this); - left_stack->addWidget(drive_summary); - - QObject::connect(drive_summary, &StarPilotDriveSummary::panelClosed, [left_stack]() { - left_stack->setCurrentIndex(0); + stock_left_widget = new QStackedWidget(this); + QVBoxLayout *left_prime_layout = new QVBoxLayout(); + left_prime_layout->setContentsMargins(0, 0, 0, 0); + QWidget *prime_user = new PrimeUserWidget(); + prime_user->setStyleSheet(R"( + border-radius: 10px; + background-color: #333333; + )"); + left_prime_layout->addWidget(prime_user); + left_prime_layout->addStretch(); + stock_left_widget->addWidget(new LayoutWidget(left_prime_layout)); + stock_left_widget->addWidget(new PrimeAdWidget); + stock_left_widget->setStyleSheet("border-radius: 10px;"); + QObject::connect(uiState()->prime_state, &PrimeState::changed, this, [this]() { + stock_left_widget->setCurrentIndex(uiState()->prime_state->isSubscribed() ? 0 : 1); }); - QObject::connect(uiState(), &UIState::offroadTransition, [left_stack](bool offroad) { + left_widget->addWidget(stock_left_widget); + + QWidget *custom_left_widget = new QWidget(this); + custom_left_stack = new QStackedLayout(custom_left_widget); + custom_left_stack->setContentsMargins(0, 0, 0, 0); + custom_left_stack->addWidget(new DriveStats()); + StarPilotDriveSummary *drive_summary = new StarPilotDriveSummary(this); + custom_left_stack->addWidget(drive_summary); + left_widget->addWidget(custom_left_widget); + left_widget->setCurrentIndex(params.getBool("SimpleMode") ? 0 : 1); + + QObject::connect(drive_summary, &StarPilotDriveSummary::panelClosed, [this]() { + custom_left_stack->setCurrentIndex(0); + }); + QObject::connect(uiState(), &UIState::offroadTransition, [this](bool offroad) { static bool previouslyOnroad = false; - if (offroad && previouslyOnroad) { - left_stack->setCurrentIndex(1); + if (offroad && previouslyOnroad && !params.getBool("SimpleMode")) { + custom_left_stack->setCurrentIndex(1); } previouslyOnroad = !offroad; }); @@ -199,7 +220,7 @@ OffroadHome::OffroadHome(QWidget* parent) : QFrame(parent) { home_layout->addWidget(left_widget, 1); // right: ExperimentalModeButton, SetupWidget, Random Events Summary - QStackedWidget *right_widget = new QStackedWidget(this); + right_widget = new QStackedWidget(this); right_widget->setFixedWidth(750); QWidget *default_right = new QWidget(this); @@ -224,9 +245,10 @@ OffroadHome::OffroadHome(QWidget* parent) : QFrame(parent) { QObject::connect(random_events_summary, &StarPilotDriveSummary::panelClosed, [=]() { right_widget->setCurrentIndex(0); }); - QObject::connect(uiState(), &UIState::offroadTransition, [right_widget](bool offroad) { + QObject::connect(uiState(), &UIState::offroadTransition, [this](bool offroad) { static bool previouslyOnroad = false; - if (offroad && previouslyOnroad && starpilotUIState()->starpilot_scene.starpilot_toggles.value("random_events").toBool()) { + if (offroad && previouslyOnroad && !params.getBool("SimpleMode") && + starpilotUIState()->starpilot_scene.starpilot_toggles.value("random_events").toBool()) { right_widget->setCurrentIndex(1); } previouslyOnroad = !offroad; @@ -302,13 +324,25 @@ void OffroadHome::refresh() { StarPilotUIState &fs = *starpilotUIState(); StarPilotUIScene &starpilot_scene = fs.starpilot_scene; QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; + const bool simple_mode = params.getBool("SimpleMode"); + + stock_left_widget->setCurrentIndex(uiState()->prime_state->isSubscribed() ? 0 : 1); + left_widget->setCurrentIndex(simple_mode ? 0 : 1); + if (simple_mode) { + custom_left_stack->setCurrentIndex(0); + right_widget->setCurrentIndex(0); + } date->setText(QLocale(uiState()->language.mid(5)).toString(QDateTime::currentDateTime(), "dddd, MMMM d")); - date->setVisible(util::system_time_valid()); + date->setVisible(util::system_time_valid() && !simple_mode); - QString versionText = getVersion().left(14).trimmed(); - if (!versionText.startsWith("v", Qt::CaseInsensitive)) { - versionText.prepend("v"); + if (simple_mode) { + version->setText(getBrand() + " " + QString::fromStdString(params.get("UpdaterCurrentDescription"))); + } else { + QString versionText = getVersion().left(14).trimmed(); + if (!versionText.startsWith("v", Qt::CaseInsensitive)) { + versionText.prepend("v"); + } + version->setText(getBrand() + " - " + versionText + " - " + cleanModelName(starpilot_toggles.value("model_name").toString())); } - version->setText(getBrand() + " - " + versionText + " - " + cleanModelName(starpilot_toggles.value("model_name").toString())); } diff --git a/selfdrive/ui/qt/home.h b/selfdrive/ui/qt/home.h index 36bb20a4..f0931b39 100644 --- a/selfdrive/ui/qt/home.h +++ b/selfdrive/ui/qt/home.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -43,6 +44,10 @@ private: QPushButton* update_notif; ElidedLabel* date; + QStackedWidget *left_widget; + QStackedWidget *stock_left_widget; + QStackedLayout *custom_left_stack; + QStackedWidget *right_widget; }; class HomeWindow : public QWidget { diff --git a/selfdrive/ui/qt/offroad/moc_settings.cc b/selfdrive/ui/qt/offroad/moc_settings.cc index 8b2813a5..a18d00dd 100644 --- a/selfdrive/ui/qt/offroad/moc_settings.cc +++ b/selfdrive/ui/qt/offroad/moc_settings.cc @@ -528,8 +528,8 @@ void DevicePanel::showDriverView() QMetaObject::activate(this, &staticMetaObject, 1, nullptr); } struct qt_meta_stringdata_TogglesPanel_t { - QByteArrayData data[11]; - char stringdata0[109]; + QByteArrayData data[13]; + char stringdata0[135]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ @@ -543,16 +543,19 @@ QT_MOC_LITERAL(1, 13, 12), // "updateMetric" QT_MOC_LITERAL(2, 26, 0), // "" QT_MOC_LITERAL(3, 27, 6), // "metric" QT_MOC_LITERAL(4, 34, 7), // "bootRun" -QT_MOC_LITERAL(5, 42, 23), // "expandToggleDescription" -QT_MOC_LITERAL(6, 66, 5), // "param" -QT_MOC_LITERAL(7, 72, 14), // "scrollToToggle" -QT_MOC_LITERAL(8, 87, 11), // "updateState" -QT_MOC_LITERAL(9, 99, 7), // "UIState" -QT_MOC_LITERAL(10, 107, 1) // "s" +QT_MOC_LITERAL(5, 42, 17), // "simpleModeChanged" +QT_MOC_LITERAL(6, 60, 7), // "enabled" +QT_MOC_LITERAL(7, 68, 23), // "expandToggleDescription" +QT_MOC_LITERAL(8, 92, 5), // "param" +QT_MOC_LITERAL(9, 98, 14), // "scrollToToggle" +QT_MOC_LITERAL(10, 113, 11), // "updateState" +QT_MOC_LITERAL(11, 125, 7), // "UIState" +QT_MOC_LITERAL(12, 133, 1) // "s" }, "TogglesPanel\0updateMetric\0\0metric\0" - "bootRun\0expandToggleDescription\0param\0" + "bootRun\0simpleModeChanged\0enabled\0" + "expandToggleDescription\0param\0" "scrollToToggle\0updateState\0UIState\0s" }; #undef QT_MOC_LITERAL @@ -563,30 +566,32 @@ static const uint qt_meta_data_TogglesPanel[] = { 8, // revision 0, // classname 0, 0, // classinfo - 5, 14, // methods + 6, 14, // methods 0, 0, // properties 0, 0, // enums/sets 0, 0, // constructors 0, // flags - 2, // signalCount + 3, // signalCount // signals: name, argc, parameters, tag, flags - 1, 2, 39, 2, 0x06 /* Public */, - 1, 1, 44, 2, 0x26 /* Public | MethodCloned */, + 1, 2, 44, 2, 0x06 /* Public */, + 1, 1, 49, 2, 0x26 /* Public | MethodCloned */, + 5, 1, 52, 2, 0x06 /* Public */, // slots: name, argc, parameters, tag, flags - 5, 1, 47, 2, 0x0a /* Public */, - 7, 1, 50, 2, 0x0a /* Public */, - 8, 1, 53, 2, 0x08 /* Private */, + 7, 1, 55, 2, 0x0a /* Public */, + 9, 1, 58, 2, 0x0a /* Public */, + 10, 1, 61, 2, 0x08 /* Private */, // signals: parameters QMetaType::Void, QMetaType::Bool, QMetaType::Bool, 3, 4, QMetaType::Void, QMetaType::Bool, 3, + QMetaType::Void, QMetaType::Bool, 6, // slots: parameters - QMetaType::Void, QMetaType::QString, 6, - QMetaType::Void, QMetaType::QString, 6, - QMetaType::Void, 0x80000000 | 9, 10, + QMetaType::Void, QMetaType::QString, 8, + QMetaType::Void, QMetaType::QString, 8, + QMetaType::Void, 0x80000000 | 11, 12, 0 // eod }; @@ -599,9 +604,10 @@ void TogglesPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id switch (_id) { case 0: _t->updateMetric((*reinterpret_cast< bool(*)>(_a[1])),(*reinterpret_cast< bool(*)>(_a[2]))); break; case 1: _t->updateMetric((*reinterpret_cast< bool(*)>(_a[1]))); break; - case 2: _t->expandToggleDescription((*reinterpret_cast< const QString(*)>(_a[1]))); break; - case 3: _t->scrollToToggle((*reinterpret_cast< const QString(*)>(_a[1]))); break; - case 4: _t->updateState((*reinterpret_cast< const UIState(*)>(_a[1]))); break; + case 2: _t->simpleModeChanged((*reinterpret_cast< bool(*)>(_a[1]))); break; + case 3: _t->expandToggleDescription((*reinterpret_cast< const QString(*)>(_a[1]))); break; + case 4: _t->scrollToToggle((*reinterpret_cast< const QString(*)>(_a[1]))); break; + case 5: _t->updateState((*reinterpret_cast< const UIState(*)>(_a[1]))); break; default: ; } } else if (_c == QMetaObject::IndexOfMethod) { @@ -613,6 +619,13 @@ void TogglesPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id return; } } + { + using _t = void (TogglesPanel::*)(bool ); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&TogglesPanel::simpleModeChanged)) { + *result = 2; + return; + } + } } } @@ -645,13 +658,13 @@ int TogglesPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 5) + if (_id < 6) qt_static_metacall(this, _c, _id, _a); - _id -= 5; + _id -= 6; } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 5) + if (_id < 6) *reinterpret_cast(_a[0]) = -1; - _id -= 5; + _id -= 6; } return _id; } @@ -662,6 +675,13 @@ void TogglesPanel::updateMetric(bool _t1, bool _t2) void *_a[] = { nullptr, const_cast(reinterpret_cast(&_t1)), const_cast(reinterpret_cast(&_t2)) }; QMetaObject::activate(this, &staticMetaObject, 0, _a); } + +// SIGNAL 2 +void TogglesPanel::simpleModeChanged(bool _t1) +{ + void *_a[] = { nullptr, const_cast(reinterpret_cast(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 2, _a); +} struct qt_meta_stringdata_SoftwarePanel_t { QByteArrayData data[1]; char stringdata0[14]; diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index f19559ca..6c508d9d 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -48,6 +48,13 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) { "../assets/icons/warning.png", true, }, + { + "SimpleMode", + tr("Simple Mode"), + tr("Use a more stock-like Qt interface by hiding most branch-specific UI, theme, sound, and alert styling. This only changes presentation and does not change driving behavior."), + "../assets/icons/settings.png", + false, + }, { "DisengageOnAccelerator", tr("Disengage on Accelerator Pedal"), @@ -122,6 +129,13 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) { }); } + if (param == "SimpleMode") { + QObject::connect(toggle, &ParamControl::toggleFlipped, this, [this](bool state) { + updateToggles(); + emit simpleModeChanged(state); + }); + } + addItem(toggle); toggles[param.toStdString()] = toggle; @@ -172,6 +186,7 @@ void TogglesPanel::showEvent(QShowEvent *event) { void TogglesPanel::updateToggles() { const bool showAllToggles = params.getBool("ShowAllToggles"); const bool safe_mode = params.getBool("SafeMode"); + const bool simple_mode = params.getBool("SimpleMode"); if (safe_mode) { if (params.getBool("ExperimentalMode")) { params.putBool("ExperimentalMode", false); @@ -251,6 +266,11 @@ void TogglesPanel::updateToggles() { experimental_mode_toggle->setVisible(showAllToggles || !starpilot_toggles.value("conditional_experimental_mode").toBool()); auto record_audio_toggle = toggles["RecordAudio"]; record_audio_toggle->setVisible(showAllToggles || !starpilot_toggles.value("no_logging").toBool()); + + auto safe_mode_toggle = toggles["SafeMode"]; + if (safe_mode_toggle != nullptr) { + safe_mode_toggle->setVisible(!simple_mode); + } } GalaxyQRPopup::GalaxyQRPopup(const QString &url, QWidget *parent) : DialogBase(parent) { @@ -694,6 +714,13 @@ SettingsWindow::SettingsWindow(QWidget *parent) : QFrame(parent) { QObject::connect(developerPanel, &DeveloperPanel::showAllTogglesChanged, [this]() { updateDeveloperToggle(params.getInt("TuningLevel")); }); + QObject::connect(toggles, &TogglesPanel::simpleModeChanged, [this](bool enabled) { + updateDeveloperToggle(params.getInt("TuningLevel")); + if (enabled && panel_widget->currentIndex() < nav_btns->buttons().size() && + nav_btns->buttons()[panel_widget->currentIndex()]->text() == tr("StarPilot")) { + setCurrentPanel(2); + } + }); QList> panels = { {tr("Device"), device}, @@ -831,7 +858,8 @@ void SettingsWindow::updateDeveloperToggle(int tuningLevel) { for (QAbstractButton *btn : nav_btns->buttons()) { if (btn->text() == tr("Developer")) { btn->setVisible(tuningLevel >= 3 || params.getBool("ShowAllToggles")); - break; + } else if (btn->text() == tr("StarPilot")) { + btn->setVisible(!params.getBool("SimpleMode")); } } } diff --git a/selfdrive/ui/qt/offroad/settings.h b/selfdrive/ui/qt/offroad/settings.h index 5ef631a6..bb048f1e 100644 --- a/selfdrive/ui/qt/offroad/settings.h +++ b/selfdrive/ui/qt/offroad/settings.h @@ -102,6 +102,7 @@ public: signals: void updateMetric(bool metric, bool bootRun=false); + void simpleModeChanged(bool enabled); public slots: void expandToggleDescription(const QString ¶m); diff --git a/selfdrive/ui/qt/onroad/alerts.cc b/selfdrive/ui/qt/onroad/alerts.cc index b64cf699..0bfd6552 100644 --- a/selfdrive/ui/qt/onroad/alerts.cc +++ b/selfdrive/ui/qt/onroad/alerts.cc @@ -109,11 +109,23 @@ void OnroadAlerts::paintEvent(QPaintEvent *event) { QRect r = QRect(0 + margin, height() - h + margin, width() - margin*2, h - margin*2); QPainter p(this); + const bool simple_mode = starpilot_toggles.value("simple_mode").toBool(); + QColor alert_color; + if (simple_mode) { + cereal::SelfdriveState::AlertStatus status = alert.status; + if (status == static_cast(cereal::StarPilotSelfdriveState::AlertStatus::STARPILOT)) { + status = cereal::SelfdriveState::AlertStatus::NORMAL; + } + alert_color = alert_colors.value(status, alert_colors.value(cereal::SelfdriveState::AlertStatus::NORMAL)); + } else { + alert_color = starpilot_alert_colors.value(static_cast(alert.status), + alert_colors.value(cereal::SelfdriveState::AlertStatus::NORMAL)); + } // draw background + gradient p.setPen(Qt::NoPen); p.setCompositionMode(QPainter::CompositionMode_SourceOver); - p.setBrush(QBrush(starpilot_alert_colors[static_cast(alert.status)])); + p.setBrush(QBrush(alert_color)); p.drawRoundedRect(r, radius, radius); QLinearGradient g(0, r.y(), 0, r.bottom()); diff --git a/selfdrive/ui/qt/onroad/buttons.cc b/selfdrive/ui/qt/onroad/buttons.cc index 99bce3f2..37fb599c 100644 --- a/selfdrive/ui/qt/onroad/buttons.cc +++ b/selfdrive/ui/qt/onroad/buttons.cc @@ -93,7 +93,9 @@ void ExperimentalButton::showEvent(QShowEvent *event) { } void ExperimentalButton::updateBackgroundColor() { - if (isDown() || !engageable) { + if (starpilot_toggles.value("simple_mode").toBool()) { + background_color = QColor(0, 0, 0, 166); + } else if (isDown() || !engageable) { background_color = QColor(0, 0, 0, 166); } else if (starpilot_scene.switchback_mode_enabled) { background_color = bg_colors[STATUS_SWITCHBACK_MODE_ENABLED]; diff --git a/selfdrive/ui/qt/sidebar.cc b/selfdrive/ui/qt/sidebar.cc index 20b87a68..ae5d2404 100644 --- a/selfdrive/ui/qt/sidebar.cc +++ b/selfdrive/ui/qt/sidebar.cc @@ -61,19 +61,20 @@ void Sidebar::mousePressEvent(QMouseEvent *event) { StarPilotUIState *fs = starpilotUIState(); StarPilotUIScene &starpilot_scene = fs->starpilot_scene; QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; + const bool simple_mode = starpilot_toggles.value("simple_mode").toBool(); - if (cpuRect.contains(pos) && starpilot_toggles.value("developer_ui").toBool()) { + if (!simple_mode && cpuRect.contains(pos) && starpilot_toggles.value("developer_ui").toBool()) { showChip = (showChip + 1) % 3; params.putBool("ShowCPU", showChip == 1); params.putBool("ShowGPU", showChip == 2); - } else if (memoryRect.contains(pos) && starpilot_toggles.value("developer_ui").toBool()) { + } else if (!simple_mode && memoryRect.contains(pos) && starpilot_toggles.value("developer_ui").toBool()) { showMemory = (showMemory + 1) % 4; params.putBool("ShowMemoryUsage", showMemory == 1); params.putBool("ShowStorageLeft", showMemory == 2); params.putBool("ShowStorageUsed", showMemory == 3); - } else if (tempRect.contains(pos) && starpilot_toggles.value("developer_ui").toBool()) { + } else if (!simple_mode && tempRect.contains(pos) && starpilot_toggles.value("developer_ui").toBool()) { showTemp = (showTemp + 1) % 3; params.putBool("Fahrenheit", showTemp == 2); @@ -118,6 +119,12 @@ void Sidebar::updateState(const UIState &s, const StarPilotUIState &fs) { const StarPilotUIScene &starpilot_scene = fs.starpilot_scene; const QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; + const bool simple_mode = starpilot_toggles.value("simple_mode").toBool(); + static bool previous_simple_mode = simple_mode; + if (previous_simple_mode != simple_mode) { + updateTheme(); + previous_simple_mode = simple_mode; + } const SubMaster &fpsm = *(fs.sm); @@ -140,28 +147,29 @@ void Sidebar::updateState(const UIState &s, const StarPilotUIState &fs) { ItemStatus connectStatus; auto last_ping = deviceState.getLastAthenaPingTime(); if (desktop_force_online) { - connectStatus = ItemStatus{{tr("CONNECT"), tr("ONLINE")}, QColor(starpilot_toggles.value("sidebar_color3").toString())}; + connectStatus = ItemStatus{{tr("CONNECT"), tr("ONLINE")}, simple_mode ? good_color : QColor(starpilot_toggles.value("sidebar_color3").toString())}; } else if (last_ping == 0) { connectStatus = ItemStatus{{tr("CONNECT"), tr("OFFLINE")}, warning_color}; } else { connectStatus = nanos_since_boot() - last_ping < 80e9 - ? ItemStatus{{tr("CONNECT"), tr("ONLINE")}, QColor(starpilot_toggles.value("sidebar_color3").toString())} + ? ItemStatus{{tr("CONNECT"), tr("ONLINE")}, simple_mode ? good_color : QColor(starpilot_toggles.value("sidebar_color3").toString())} : ItemStatus{{tr("CONNECT"), tr("ERROR")}, danger_color}; } setProperty("connectStatus", QVariant::fromValue(connectStatus)); int maxTempC = deviceState.getMaxTempC(); QString max_temp = starpilot_toggles.value("fahrenheit").toBool() ? QString::number(maxTempC * 9 / 5 + 32) + "°F" : QString::number(maxTempC) + "°C"; - ItemStatus tempStatus = {{tr("TEMP"), starpilot_toggles.value("numerical_temp").toBool() ? max_temp : tr("HIGH")}, danger_color}; + ItemStatus tempStatus = {{tr("TEMP"), simple_mode ? tr("HIGH") : (starpilot_toggles.value("numerical_temp").toBool() ? max_temp : tr("HIGH"))}, danger_color}; auto ts = deviceState.getThermalStatus(); if (ts == cereal::DeviceState::ThermalStatus::GREEN) { - tempStatus = {{tr("TEMP"), starpilot_toggles.value("numerical_temp").toBool() ? max_temp : tr("GOOD")}, QColor(starpilot_toggles.value("sidebar_color1").toString())}; + tempStatus = {{tr("TEMP"), simple_mode ? tr("GOOD") : (starpilot_toggles.value("numerical_temp").toBool() ? max_temp : tr("GOOD"))}, + simple_mode ? good_color : QColor(starpilot_toggles.value("sidebar_color1").toString())}; } else if (ts == cereal::DeviceState::ThermalStatus::YELLOW) { - tempStatus = {{tr("TEMP"), starpilot_toggles.value("numerical_temp").toBool() ? max_temp : tr("OK")}, warning_color}; + tempStatus = {{tr("TEMP"), simple_mode ? tr("OK") : (starpilot_toggles.value("numerical_temp").toBool() ? max_temp : tr("OK"))}, warning_color}; } setProperty("tempStatus", QVariant::fromValue(tempStatus)); - ItemStatus pandaStatus = {{tr("VEHICLE"), tr("ONLINE")}, QColor(starpilot_toggles.value("sidebar_color2").toString())}; + ItemStatus pandaStatus = {{tr("VEHICLE"), tr("ONLINE")}, simple_mode ? good_color : QColor(starpilot_toggles.value("sidebar_color2").toString())}; if (s.scene.pandaType == cereal::PandaState::PandaType::UNKNOWN) { pandaStatus = {{tr("NO"), tr("PANDA")}, danger_color}; } @@ -169,7 +177,7 @@ void Sidebar::updateState(const UIState &s, const StarPilotUIState &fs) { setProperty("recordingAudio", s.scene.recording_audio); - if (starpilot_toggles.value("cpu_metrics").toBool() || starpilot_toggles.value("gpu_metrics").toBool()) { + if (!simple_mode && (starpilot_toggles.value("cpu_metrics").toBool() || starpilot_toggles.value("gpu_metrics").toBool())) { capnp::List::Reader cpu_loads = deviceState.getCpuUsagePercent(); int cpu_usage = cpu_loads.size() != 0 ? std::accumulate(cpu_loads.begin(), cpu_loads.end(), 0) / cpu_loads.size() : 0; int gpu_usage = deviceState.getGpuUsagePercent(); @@ -186,7 +194,7 @@ void Sidebar::updateState(const UIState &s, const StarPilotUIState &fs) { setProperty("chipStatus", QVariant::fromValue(chipStatus)); } - if (starpilot_toggles.value("memory_metrics").toBool() || starpilot_toggles.value("storage_left_metrics").toBool() || starpilot_toggles.value("storage_used_metrics").toBool()) { + if (!simple_mode && (starpilot_toggles.value("memory_metrics").toBool() || starpilot_toggles.value("storage_left_metrics").toBool() || starpilot_toggles.value("storage_used_metrics").toBool())) { int free_space = deviceState.getFreeSpacePercent(); int memory_usage = deviceState.getMemoryUsagePercent(); int storage_left = starpilotDeviceState.getFreeSpace(); @@ -240,9 +248,10 @@ void Sidebar::paintEvent(QPaintEvent *event) { StarPilotUIState *fs = starpilotUIState(); StarPilotUIScene &starpilot_scene = fs->starpilot_scene; QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; + const bool simple_mode = starpilot_toggles.value("simple_mode").toBool(); // network - if (starpilot_toggles.value("ip_metrics").toBool()) { + if (!simple_mode && starpilot_toggles.value("ip_metrics").toBool()) { p.setPen(QColor(0xff, 0xff, 0xff)); p.save(); p.setFont(InterFont(30)); @@ -270,7 +279,10 @@ void Sidebar::paintEvent(QPaintEvent *event) { // metrics drawMetric(p, temp_status.first, temp_status.second, 338); - if (starpilot_toggles.value("cpu_metrics").toBool() || starpilot_toggles.value("gpu_metrics").toBool()) { + if (simple_mode) { + drawMetric(p, panda_status.first, panda_status.second, 496); + drawMetric(p, connect_status.first, connect_status.second, 654); + } else if (starpilot_toggles.value("cpu_metrics").toBool() || starpilot_toggles.value("gpu_metrics").toBool()) { drawMetric(p, chip_status.first, chip_status.second, 496); } else { drawMetric(p, panda_status.first, panda_status.second, 496); @@ -289,6 +301,24 @@ void Sidebar::showEvent(QShowEvent *event) { } void Sidebar::updateTheme() { + auto clearMovie = [](QSharedPointer &movie) { + if (!movie.isNull()) { + movie->stop(); + movie.reset(); + } + }; + + if (starpilotUIState()->starpilot_scene.starpilot_toggles.value("simple_mode").toBool()) { + clearMovie(home_gif); + clearMovie(flag_gif); + clearMovie(settings_gif); + + home_img = loadPixmap("../assets/images/button_home.png", home_btn.size()); + flag_img = loadPixmap("../assets/images/button_flag.png", home_btn.size()); + settings_img = loadPixmap("../assets/images/button_settings.png", settings_btn.size(), Qt::IgnoreAspectRatio); + return; + } + loadImage("../../starpilot/assets/active_theme/icons/button_home", home_img, home_gif, home_btn.size(), this); loadImage("../../starpilot/assets/active_theme/icons/button_flag", flag_img, flag_gif, home_btn.size(), this); loadImage("../../starpilot/assets/active_theme/icons/button_settings", settings_img, settings_gif, settings_btn.size(), this); diff --git a/selfdrive/ui/ui b/selfdrive/ui/ui index a619857d..4ab85d97 100755 Binary files a/selfdrive/ui/ui and b/selfdrive/ui/ui differ diff --git a/starpilot/common/starpilot_variables.py b/starpilot/common/starpilot_variables.py index a4023681..835a6df2 100644 --- a/starpilot/common/starpilot_variables.py +++ b/starpilot/common/starpilot_variables.py @@ -530,6 +530,7 @@ class StarPilotVariables: toggle.force_offroad = self.params.get_bool("ForceOffroad") toggle.force_onroad = self.params.get_bool("ForceOnroad") toggle.safe_mode = self.params.get_bool("SafeMode") + toggle.simple_mode = self.params.get_bool("SimpleMode") toggle.is_metric = self.params.get_bool("IsMetric") distance_conversion = 1 if toggle.is_metric else CV.FOOT_TO_METER @@ -971,6 +972,91 @@ class StarPilotVariables: toggle.startup_alert_top = self.get_value("StartupMessageTop", cast=str, default="") toggle.startup_alert_bottom = self.get_value("StartupMessageBottom", cast=str, default="") + if toggle.simple_mode: + toggle.alert_volume_controller = False + + toggle.color_scheme = "stock" + toggle.current_holiday_theme = "stock" + toggle.holiday_themes = False + toggle.distance_icons = "stock" + toggle.icon_pack = "stock" + toggle.signal_icons = "stock" + toggle.sound_pack = "stock" + toggle.random_themes = False + toggle.wheel_image = "stock" + + toggle.hide_alerts = False + toggle.hide_lead_marker = False + toggle.hide_max_speed = False + toggle.hide_speed = False + toggle.hide_speed_limit = False + toggle.use_wheel_speed = False + + toggle.acceleration_path = False + toggle.adjacent_paths = False + toggle.blind_spot_path = False + toggle.compass = False + toggle.pedals_on_ui = False + toggle.dynamic_pedals_on_ui = False + toggle.static_pedals_on_ui = False + toggle.rotating_wheel = False + + toggle.cem_status = False + toggle.csc_status = False + toggle.model_ui = False + toggle.dynamic_path_width = False + toggle.road_name_ui = False + toggle.show_speed_limits = False + toggle.speed_limit_vienna = False + toggle.speed_limit_sources = False + toggle.camera_view = 0 + toggle.driver_camera_in_reverse = False + toggle.onroad_distance_button = False + toggle.stopped_timer = False + toggle.rainbow_path = False + toggle.random_events = False + toggle.screen_recorder = False + toggle.show_speed_limit_offset = False + + toggle.developer_ui = False + toggle.blind_spot_metrics = False + toggle.signal_metrics = False + toggle.steering_metrics = False + toggle.show_fps = False + toggle.adjacent_path_metrics = False + toggle.lead_info = False + toggle.numerical_temp = False + toggle.fahrenheit = False + toggle.cpu_metrics = False + toggle.gpu_metrics = False + toggle.ip_metrics = False + toggle.memory_metrics = False + toggle.storage_left_metrics = False + toggle.storage_used_metrics = False + toggle.use_si_metrics = False + toggle.developer_sidebar = False + toggle.developer_sidebar_metric1 = None + toggle.developer_sidebar_metric2 = None + toggle.developer_sidebar_metric3 = None + toggle.developer_sidebar_metric4 = None + toggle.developer_sidebar_metric5 = None + toggle.developer_sidebar_metric6 = None + toggle.developer_sidebar_metric7 = None + toggle.adjacent_lead_tracking = False + toggle.radar_tracks = False + toggle.show_stopping_point = False + toggle.show_stopping_point_metrics = False + + toggle.goat_scream_alert = False + toggle.goat_scream_critical_alerts = False + toggle.green_light_alert = False + toggle.lead_departing_alert = False + toggle.loud_blindspot_alert = False + toggle.speed_limit_changed_alert = False + + toggle.startup_alert_top = "Be ready to take over at any time" + toggle.startup_alert_bottom = "Always keep hands on wheel and eyes on road" + toggle.subaru_sng = self.get_value("SubaruSNG", condition=toggle.car_make == "subaru" and not (CP.flags & SubaruFlags.GLOBAL_GEN2 or CP.flags & SubaruFlags.HYBRID)) toggle.tethering_config = self.get_value("TetheringEnabled", cast=float) diff --git a/starpilot/system/the_pond/assets/components/tools/device_settings_layout.json b/starpilot/system/the_pond/assets/components/tools/device_settings_layout.json index 7f3b2581..ccd51048 100644 --- a/starpilot/system/the_pond/assets/components/tools/device_settings_layout.json +++ b/starpilot/system/the_pond/assets/components/tools/device_settings_layout.json @@ -1794,6 +1794,14 @@ "data_type": "bool", "ui_type": "toggle", "parent_key": "QOLVisuals" + }, + { + "key": "SimpleMode", + "label": "Simple Mode", + "description": "Use a more stock-like presentation by hiding most branch-specific UI, theme, sound, and alert styling. This only changes presentation and does not change driving behavior.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "QOLVisuals" } ] }, diff --git a/starpilot/ui/qt/onroad/starpilot_annotated_camera.cc b/starpilot/ui/qt/onroad/starpilot_annotated_camera.cc index 126bcaaf..d1758462 100644 --- a/starpilot/ui/qt/onroad/starpilot_annotated_camera.cc +++ b/starpilot/ui/qt/onroad/starpilot_annotated_camera.cc @@ -247,6 +247,11 @@ void StarPilotAnnotatedCameraWidget::updateState(const UIState &s, const StarPil } void StarPilotAnnotatedCameraWidget::mousePressEvent(QMouseEvent *mouseEvent) { + if (starpilot_toggles.value("simple_mode").toBool()) { + mouseEvent->ignore(); + return; + } + if (speedLimitChanged && newSpeedLimitRect.contains(mouseEvent->pos())) { params_memory.putBool("SpeedLimitAccepted", true); mouseEvent->accept(); @@ -257,6 +262,15 @@ void StarPilotAnnotatedCameraWidget::mousePressEvent(QMouseEvent *mouseEvent) { } void StarPilotAnnotatedCameraWidget::paintStarPilotWidgets(QPainter &p, UIState &s) { + if (starpilot_toggles.value("simple_mode").toBool()) { + cemStatusPosition = QPoint(0, 0); + compassPosition = QPoint(0, 0); + lateralPausedPosition = QPoint(0, 0); + newSpeedLimitRect = QRect(); + speedLimitHeight = 0; + return; + } + if (!hideBottomIcons && starpilot_toggles.value("cem_status").toBool()) { paintCEMStatus(p); } else { diff --git a/starpilot/ui/starpilot_ui.cc b/starpilot/ui/starpilot_ui.cc index a1a78ff6..79aa1240 100644 --- a/starpilot/ui/starpilot_ui.cc +++ b/starpilot/ui/starpilot_ui.cc @@ -89,6 +89,7 @@ StarPilotUIState::StarPilotUIState(QObject *parent) : QObject(parent) { {"sidebar_color1", "#FFFFFFFF"}, {"sidebar_color2", "#FFFFFFFF"}, {"sidebar_color3", "#FFFFFFFF"}, + {"simple_mode", false}, {"standby_mode", false}, {"tethering_config", 0}, };