From c248f307f86350e16734bb427a6a1c7750618b8a Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 20 Sep 2025 01:59:07 -0400 Subject: [PATCH] ui: Speed Limit Warning (#1263) * ui: Speed Limit Warning * missed * behind toggle * missed * reorder * fix type --- .../settings/longitudinal/speed_limit/helpers.h | 2 ++ .../longitudinal/speed_limit/speed_limit_settings.cc | 1 + .../longitudinal/speed_limit/speed_limit_settings.h | 10 +++++++--- selfdrive/ui/sunnypilot/qt/onroad/hud.cc | 12 +++++++----- selfdrive/ui/sunnypilot/ui.cc | 2 +- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/helpers.h b/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/helpers.h index 55764372c..22cdd8c63 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/helpers.h +++ b/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/helpers.h @@ -37,9 +37,11 @@ inline const QString SpeedLimitSourcePolicyTexts[]{ enum class SpeedLimitMode { OFF, INFORMATION, + WARNING, }; inline const QString SpeedLimitModeTexts[]{ QObject::tr("Off"), QObject::tr("Information"), + QObject::tr("Warning"), }; diff --git a/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.cc index 2bacbace7..6f4883361 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.cc @@ -27,6 +27,7 @@ SpeedLimitSettings::SpeedLimitSettings(QWidget *parent) : QStackedWidget(parent) std::vector speed_limit_mode_texts{ SpeedLimitModeTexts[static_cast(SpeedLimitMode::OFF)], SpeedLimitModeTexts[static_cast(SpeedLimitMode::INFORMATION)], + SpeedLimitModeTexts[static_cast(SpeedLimitMode::WARNING)], }; speed_limit_mode_settings = new ButtonParamControlSP( "SpeedLimitMode", diff --git a/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.h b/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.h index ebffcf65e..f83f45055 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.h +++ b/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.h @@ -55,15 +55,19 @@ private: static QString modeDescription(SpeedLimitMode mode = SpeedLimitMode::OFF) { QString off_str = tr("⦿ Off: Disables the Speed Limit functions."); QString info_str = tr("⦿ Information: Displays the current road's speed limit."); + QString warning_str = tr("⦿ Warning: Provides a warning when exceeding the current road's speed limit."); - if (mode == SpeedLimitMode::INFORMATION) { + if (mode == SpeedLimitMode::WARNING) { + warning_str = "" + warning_str + ""; + } else if (mode == SpeedLimitMode::INFORMATION) { info_str = "" + info_str + ""; } else { off_str = "" + off_str + ""; } - return QString("%1
%2") + return QString("%1
%2
%3") .arg(off_str) - .arg(info_str); + .arg(info_str) + .arg(warning_str); } }; diff --git a/selfdrive/ui/sunnypilot/qt/onroad/hud.cc b/selfdrive/ui/sunnypilot/qt/onroad/hud.cc index 47ba0590d..71bdd92ca 100644 --- a/selfdrive/ui/sunnypilot/qt/onroad/hud.cc +++ b/selfdrive/ui/sunnypilot/qt/onroad/hud.cc @@ -328,7 +328,10 @@ void HudRendererSP::drawStandstillTimer(QPainter &p, int x, int y) { } void HudRendererSP::drawSpeedLimitSigns(QPainter &p) { - QString speedLimitStr = speedLimit > 0 ? QString::number(std::nearbyint(speedLimit)) : "---"; + int speedLimitRounded = std::nearbyint(speedLimit); + bool overspeed = speedLimitRounded < std::nearbyint(speed) && speedLimitRounded > 0; + bool speedLimitWarningEnabled = speedLimitMode == SpeedLimitMode::WARNING; + QString speedLimitStr = speedLimit > 0 ? QString::number(speedLimitRounded) : "---"; // Offset display text QString speedLimitSubText = ""; @@ -344,6 +347,8 @@ void HudRendererSP::drawSpeedLimitSigns(QPainter &p) { QRect sign_rect(sign_x, sign_y, sign_width, sign_height); int alpha = 255; + QColor red_color = QColor(255, 0, 0, alpha); + QColor speed_color = (speedLimitWarningEnabled && overspeed) ? red_color : QColor(0, 0, 0, alpha); if (is_metric) { // EU Vienna Convention style circular sign @@ -364,9 +369,8 @@ void HudRendererSP::drawSpeedLimitSigns(QPainter &p) { // Red border ring with color coding QRect red_ring = circle_rect; - QColor ring_color = QColor(255, 0, 0, alpha); - p.setBrush(ring_color); + p.setBrush(red_color); p.drawEllipse(red_ring); // Center white circle for text @@ -378,7 +382,6 @@ void HudRendererSP::drawSpeedLimitSigns(QPainter &p) { // Speed value, smaller font for 3+ digits int font_size = (speedLimitStr.size() >= 3) ? 70 : 85; p.setFont(InterFont(font_size, QFont::Bold)); - QColor speed_color = QColor(0, 0, 0, alpha); p.setPen(speed_color); p.drawText(center_circle, Qt::AlignCenter, speedLimitStr); @@ -424,7 +427,6 @@ void HudRendererSP::drawSpeedLimitSigns(QPainter &p) { // Speed value with color coding p.setFont(InterFont(90, QFont::Bold)); - QColor speed_color = QColor(0, 0, 0, alpha); p.setPen(speed_color); p.drawText(inner_rect.adjusted(0, 80, 0, 0), Qt::AlignTop | Qt::AlignHCenter, speedLimitStr); diff --git a/selfdrive/ui/sunnypilot/ui.cc b/selfdrive/ui/sunnypilot/ui.cc index 7f83e5ea7..7b582a834 100644 --- a/selfdrive/ui/sunnypilot/ui.cc +++ b/selfdrive/ui/sunnypilot/ui.cc @@ -53,7 +53,7 @@ void ui_update_params_sp(UIStateSP *s) { auto params = Params(); s->scene.dev_ui_info = std::atoi(params.get("DevUIInfo").c_str()); s->scene.standstill_timer = params.getBool("StandstillTimer"); - s->scene.speed_limit_mode = params.getBool("SpeedLimitMode"); + s->scene.speed_limit_mode = std::atoi(params.get("SpeedLimitMode").c_str()); } DeviceSP::DeviceSP(QObject *parent) : Device(parent) {