From e78b2760cad97a8a730efe63ba3973783eee865c Mon Sep 17 00:00:00 2001 From: James <91348155+FrogAi@users.noreply.github.com> Date: Wed, 17 Dec 2025 18:21:33 -0700 Subject: [PATCH] Display the turn signal/blind spot status in the screen's border --- frogpilot/ui/qt/onroad/frogpilot_onroad.cc | 49 ++++++++++++++++++++++ frogpilot/ui/qt/onroad/frogpilot_onroad.h | 13 ++++++ 2 files changed, 62 insertions(+) diff --git a/frogpilot/ui/qt/onroad/frogpilot_onroad.cc b/frogpilot/ui/qt/onroad/frogpilot_onroad.cc index 04e75d2a..88ec8504 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_onroad.cc +++ b/frogpilot/ui/qt/onroad/frogpilot_onroad.cc @@ -1,6 +1,10 @@ #include "frogpilot/ui/qt/onroad/frogpilot_onroad.h" FrogPilotOnroadWindow::FrogPilotOnroadWindow(QWidget *parent) : QWidget(parent) { + signalTimer = new QTimer(this); + QObject::connect(signalTimer, &QTimer::timeout, [this] { + flickerActive = !flickerActive; + }); } void FrogPilotOnroadWindow::resizeEvent(QResizeEvent *event) { @@ -15,9 +19,15 @@ void FrogPilotOnroadWindow::updateState(const UIState &s, const FrogPilotUIState const cereal::CarState::Reader &carState = sm["carState"].getCarState(); const cereal::CarControl::Reader &carControl = fpsm["carControl"].getCarControl(); + blindSpotLeft = carState.getLeftBlindspot(); + blindSpotRight = carState.getRightBlindspot(); torque = -carControl.getActuators().getTorque(); + turnSignalLeft = carState.getLeftBlinker(); + turnSignalRight = carState.getRightBlinker(); + showBlindspot = (blindSpotLeft || blindSpotRight) && frogpilot_toggles.value("blind_spot_metrics").toBool(); showFPS = frogpilot_toggles.value("show_fps").toBool(); + showSignal = (turnSignalLeft || turnSignalRight) && frogpilot_toggles.value("signal_metrics").toBool(); showSteering = frogpilot_toggles.value("steering_metrics").toBool(); if (showSteering) { @@ -28,6 +38,32 @@ void FrogPilotOnroadWindow::updateState(const UIState &s, const FrogPilotUIState } } + if (showBlindspot || showSignal) { + std::function getBorderColor = [&](bool blindSpot, bool turnSignal) { + if (turnSignal && showSignal) { + if (blindSpot) { + return flickerActive ? bg_colors[STATUS_TRAFFIC_MODE_ENABLED] : bg_colors[STATUS_CEM_DISABLED]; + } else { + return flickerActive ? bg_colors[STATUS_CEM_DISABLED] : bg; + } + } else if (blindSpot && showBlindspot) { + return bg_colors[STATUS_TRAFFIC_MODE_ENABLED]; + } else { + return bg; + } + }; + + leftBorderColor = getBorderColor(blindSpotLeft, turnSignalLeft); + rightBorderColor = getBorderColor(blindSpotRight, turnSignalRight); + + int interval = showBlindspot ? 250 : 500; + if (!signalTimer->isActive() || signalTimer->interval() != interval) { + signalTimer->start(interval); + } + } else if (signalTimer->isActive()) { + signalTimer->stop(); + } + if (showFPS) { static float avgFPS = 0.0f; static float maxFPS = 0.0f; @@ -63,6 +99,10 @@ void FrogPilotOnroadWindow::paintEvent(QPaintEvent *event) { paintSteeringTorqueBorder(p); } + if (showBlindspot || showSignal) { + paintTurnSignalBorder(p); + } + if (showFPS) { paintFPS(p); } @@ -99,3 +139,12 @@ void FrogPilotOnroadWindow::paintSteeringTorqueBorder(QPainter &p) { p.restore(); } + +void FrogPilotOnroadWindow::paintTurnSignalBorder(QPainter &p) { + p.save(); + + p.fillRect(rect.x(), rect.y(), rect.width() / 2, rect.height(), leftBorderColor); + p.fillRect(rect.x() + rect.width() / 2, rect.y(), rect.width() / 2, rect.height(), rightBorderColor); + + p.restore(); +} diff --git a/frogpilot/ui/qt/onroad/frogpilot_onroad.h b/frogpilot/ui/qt/onroad/frogpilot_onroad.h index fb7d7e82..1d3ff49b 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_onroad.h +++ b/frogpilot/ui/qt/onroad/frogpilot_onroad.h @@ -22,17 +22,30 @@ private: void paintEvent(QPaintEvent *event); void paintFPS(QPainter &p); void paintSteeringTorqueBorder(QPainter &p); + void paintTurnSignalBorder(QPainter &p); void resizeEvent(QResizeEvent *event); + bool blindSpotLeft; + bool blindSpotRight; + bool flickerActive; + bool showBlindspot; bool showFPS; + bool showSignal; bool showSteering; + bool turnSignalLeft; + bool turnSignalRight; float smoothedSteer; float torque; + QColor leftBorderColor; + QColor rightBorderColor; + QRect rect; QRegion marginRegion; QString fpsDisplayString; + + QTimer *signalTimer; };