From f087ceff51326aac0b65ef349e0258f78ea42668 Mon Sep 17 00:00:00 2001 From: James <91348155+FrogAi@users.noreply.github.com> Date: Mon, 1 Dec 2025 12:00:00 -0700 Subject: [PATCH] Pause Steering --- frogpilot/assets/other_images/turn_icon.png | Bin 0 -> 37447 bytes frogpilot/controls/frogpilot_card.py | 4 ++ frogpilot/controls/frogpilot_planner.py | 2 + .../qt/onroad/frogpilot_annotated_camera.cc | 42 +++++++++++++++++- .../ui/qt/onroad/frogpilot_annotated_camera.h | 4 ++ selfdrive/controls/controlsd.py | 2 +- 6 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 frogpilot/assets/other_images/turn_icon.png diff --git a/frogpilot/assets/other_images/turn_icon.png b/frogpilot/assets/other_images/turn_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6b1377976d836d9664c027331d35163dfdcc7d04 GIT binary patch literal 37447 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 bdjX literal 0 HcmV?d00001 diff --git a/frogpilot/controls/frogpilot_card.py b/frogpilot/controls/frogpilot_card.py index b3cad5f7c..eca6e388a 100644 --- a/frogpilot/controls/frogpilot_card.py +++ b/frogpilot/controls/frogpilot_card.py @@ -20,6 +20,7 @@ class FrogPilotCard: self.decel_pressed = False self.distancePressed_previously = False self.force_coast = False + self.pause_lateral = False self.pause_longitudinal = False self.gap_counter = 0 @@ -37,6 +38,8 @@ class FrogPilotCard: self.handle_experimental_mode(sm, frogpilot_toggles) elif sm["carControl"].longActive and getattr(frogpilot_toggles, f"force_coast_via_{key}"): self.force_coast = not self.force_coast + elif getattr(frogpilot_toggles, f"pause_lateral_via_{key}"): + self.pause_lateral = not self.pause_lateral elif sm["carControl"].longActive and getattr(frogpilot_toggles, f"pause_longitudinal_via_{key}"): self.pause_longitudinal = not self.pause_longitudinal @@ -103,6 +106,7 @@ class FrogPilotCard: frogpilotCarState.distanceLongPressed = self.very_long_press_threshold > self.gap_counter >= self.long_press_threshold frogpilotCarState.distanceVeryLongPressed = self.gap_counter >= self.very_long_press_threshold frogpilotCarState.forceCoast = self.force_coast + frogpilotCarState.pauseLateral = self.pause_lateral frogpilotCarState.pauseLongitudinal = self.pause_longitudinal return frogpilotCarState diff --git a/frogpilot/controls/frogpilot_planner.py b/frogpilot/controls/frogpilot_planner.py index 7cb686f52..e1a393eb6 100644 --- a/frogpilot/controls/frogpilot_planner.py +++ b/frogpilot/controls/frogpilot_planner.py @@ -93,7 +93,9 @@ class FrogPilotPlanner: self.lateral_acceleration = v_ego**2 * sm["controlsState"].curvature + self.lateral_check = v_ego >= frogpilot_toggles.pause_lateral_below_speed self.lateral_check |= sm["carState"].standstill + self.lateral_check &= not sm["frogpilotCarState"].pauseLateral self.model_length = sm["modelV2"].position.x[-1] diff --git a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc index 917fa298e..dc7894158 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc +++ b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc @@ -12,6 +12,7 @@ FrogPilotAnnotatedCameraWidget::FrogPilotAnnotatedCameraWidget(QWidget *parent) pausedIcon = loadPixmap("../../frogpilot/assets/other_images/paused_icon.png", {widget_size, widget_size}); speedIcon = loadPixmap("../../frogpilot/assets/other_images/speed_icon.png", {widget_size, widget_size}); stopSignImg = loadPixmap("../../frogpilot/assets/other_images/stop_sign.png", {btn_size, btn_size}); + turnIcon = loadPixmap("../../frogpilot/assets/other_images/turn_icon.png", {widget_size, widget_size}); loadGif("../../frogpilot/assets/other_images/curve_icon.gif", cemCurveIcon, QSize(widget_size, widget_size), this); loadGif("../../frogpilot/assets/other_images/lead_icon.gif", cemLeadIcon, QSize(widget_size, widget_size), this); @@ -159,6 +160,7 @@ void FrogPilotAnnotatedCameraWidget::updateState(const UIState &s, const FrogPil forceCoast = frogpilotCarState.getForceCoast(); laneWidthLeft = frogpilotPlan.getLaneWidthLeft(); laneWidthRight = frogpilotPlan.getLaneWidthRight(); + lateralPaused = frogpilotCarState.getPauseLateral(); longitudinalPaused = frogpilotCarState.getPauseLongitudinal(); redLight = frogpilotPlan.getRedLight(); roadCurvature = frogpilotPlan.getRoadCurvature(); @@ -231,6 +233,13 @@ void FrogPilotAnnotatedCameraWidget::paintFrogPilotWidgets(QPainter &p, UIState } } + if (!hideBottomIcons && lateralPaused) { + paintLateralPaused(p); + } else { + lateralPausedPosition.setX(0); + lateralPausedPosition.setY(0); + } + if (!hideBottomIcons && (forceCoast || longitudinalPaused)) { paintLongitudinalPaused(p); } @@ -527,6 +536,35 @@ void FrogPilotAnnotatedCameraWidget::paintCurveSpeedControlTraining(QPainter &p) p.restore(); } +void FrogPilotAnnotatedCameraWidget::paintLateralPaused(QPainter &p) { + if (dmIconPosition == QPoint(0, 0)) { + return; + } + + p.save(); + + if (cemStatusPosition != QPoint(0, 0)) { + lateralPausedPosition = cemStatusPosition; + } else { + lateralPausedPosition.rx() = dmIconPosition.x(); + lateralPausedPosition.ry() = dmIconPosition.y() - widget_size / 2; + } + lateralPausedPosition.rx() += rightHandDM ? -UI_BORDER_SIZE - widget_size - UI_BORDER_SIZE : UI_BORDER_SIZE + widget_size + UI_BORDER_SIZE; + + QRect lateralWidget(lateralPausedPosition, QSize(widget_size, widget_size)); + + p.setBrush(blackColor(166)); + p.setPen(QPen(QColor(bg_colors[STATUS_TRAFFIC_MODE_ENABLED]), 10)); + p.drawRoundedRect(lateralWidget, 24, 24); + + p.setOpacity(0.5); + p.drawPixmap(lateralWidget, turnIcon); + p.setOpacity(0.75); + p.drawPixmap(lateralWidget, pausedIcon); + + p.restore(); +} + void FrogPilotAnnotatedCameraWidget::paintLeadMetrics(QPainter &p, bool adjacent, QPointF *chevron, const cereal::RadarState::LeadData::Reader &lead_data) { float leadDistance = lead_data.getDRel() + (adjacent ? std::abs(lead_data.getYRel()) : 0.0f); float leadSpeed = std::max(lead_data.getVLead(), 0.0f); @@ -602,7 +640,9 @@ void FrogPilotAnnotatedCameraWidget::paintLongitudinalPaused(QPainter &p) { p.save(); QPoint longitudinalIconPosition; - if (cemStatusPosition != QPoint(0, 0)) { + if (lateralPausedPosition != QPoint(0, 0)) { + longitudinalIconPosition = lateralPausedPosition; + } else if (cemStatusPosition != QPoint(0, 0)) { longitudinalIconPosition = cemStatusPosition; } else { longitudinalIconPosition.rx() = dmIconPosition.x(); diff --git a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h index ff4a849d1..9e2ed12bc 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h +++ b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h @@ -61,6 +61,7 @@ private: void paintCompass(QPainter &p); void paintCurveSpeedControl(QPainter &p); void paintCurveSpeedControlTraining(QPainter &p); + void paintLateralPaused(QPainter &p); void paintLongitudinalPaused(QPainter &p); void paintPedalIcons(QPainter &p); void paintRadarTracks(QPainter &p); @@ -79,6 +80,7 @@ private: bool cscTraining; bool experimentalMode; bool forceCoast; + bool lateralPaused; bool longitudinalPaused; bool redLight; @@ -118,9 +120,11 @@ private: QPixmap pausedIcon; QPixmap speedIcon; QPixmap stopSignImg; + QPixmap turnIcon; QPoint cemStatusPosition; QPoint compassPosition; + QPoint lateralPausedPosition; QSharedPointer cemCurveIcon; QSharedPointer cemLeadIcon; diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index f65102e8f..930a8a593 100644 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -116,7 +116,7 @@ class Controls: standstill = abs(CS.vEgo) <= max(self.CP.minSteerSpeed, 0.3) or CS.standstill CC.latActive = (self.sm['selfdriveState'].active or self.sm['frogpilotCarState'].alwaysOnLateralEnabled) and not CS.steerFaultTemporary and not CS.steerFaultPermanent and \ (not standstill or self.CP.steerAtStandstill) and self.sm['frogpilotPlan'].lateralCheck - CC.longActive = CC.enabled and not any(e.overrideLongitudinal for e in self.sm['onroadEvents']) and self.CP.openpilotLongitudinalControl + CC.longActive = CC.enabled and not any(e.overrideLongitudinal for e in self.sm['onroadEvents']) and not self.sm['frogpilotCarState'].pauseLongitudinal and self.CP.openpilotLongitudinalControl actuators = CC.actuators actuators.longControlState = self.LoC.long_control_state