From 6d1cf97da44494850d10b8a92d81a3bf28e00022 Mon Sep 17 00:00:00 2001 From: FrogAi <91348155+FrogAi@users.noreply.github.com> Date: Tue, 27 Feb 2024 16:34:47 -0700 Subject: [PATCH] Rotating steering wheel in onroad UI Added toggle to rotate the steering wheel in the top right corner of the onroad UI. --- common/params.cc | 1 + .../assets/toggle_icons/icon_rotate.png | Bin 0 -> 41150 bytes selfdrive/ui/qt/onroad.cc | 29 +++++++++++++++++- selfdrive/ui/qt/onroad.h | 2 ++ selfdrive/ui/ui.cc | 5 +++ selfdrive/ui/ui.h | 2 ++ 6 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 selfdrive/frogpilot/assets/toggle_icons/icon_rotate.png diff --git a/common/params.cc b/common/params.cc index 84120e5..e6b2f53 100644 --- a/common/params.cc +++ b/common/params.cc @@ -340,6 +340,7 @@ std::unordered_map keys = { {"RoadEdgesWidth", PERSISTENT}, {"RoadName", PERSISTENT}, {"RoadNameUI", PERSISTENT}, + {"RotatingWheel", PERSISTENT}, {"SchedulePending", PERSISTENT}, {"SearchInput", PERSISTENT}, {"SilentMode", PERSISTENT}, diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_rotate.png b/selfdrive/frogpilot/assets/toggle_icons/icon_rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..1503308e59f6ffd7ee2b2bc1688bb2d5253ca4cf GIT binary patch literal 41150 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 literal 0 HcmV?d00001 diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index b2af00f..724d0f4 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -29,6 +29,21 @@ static void drawIcon(QPainter &p, const QPoint ¢er, const QPixmap &img, cons p.setOpacity(1.0); } +static void drawIconRotate(QPainter &p, const QPoint ¢er, const QPixmap &img, const QBrush &bg, float opacity, const int angle) { + p.setRenderHint(QPainter::Antialiasing); + p.setOpacity(1.0); // bg dictates opacity of ellipse + p.setPen(Qt::NoPen); + p.setBrush(bg); + p.drawEllipse(center, btn_size / 2, btn_size / 2); + p.save(); + p.translate(center); + p.rotate(-angle); + p.setOpacity(opacity); + p.drawPixmap(-QPoint(img.width() / 2, img.height() / 2), img); + p.setOpacity(1.0); + p.restore(); +} + OnroadWindow::OnroadWindow(QWidget *parent) : QWidget(parent), scene(uiState()->scene) { QVBoxLayout *main_layout = new QVBoxLayout(this); main_layout->setMargin(UI_BORDER_SIZE); @@ -363,7 +378,15 @@ void ExperimentalButton::updateState(const UIState &s, bool leadInfo) { } // FrogPilot variables + rotatingWheel = scene.rotating_wheel; + y_offset = leadInfo ? 10 : 0; + + // Update the icon so the steering wheel rotates in real time + if (rotatingWheel && steeringAngleDeg != scene.steering_angle_deg) { + steeringAngleDeg = scene.steering_angle_deg; + update(); + } } void ExperimentalButton::paintEvent(QPaintEvent *event) { @@ -371,7 +394,11 @@ void ExperimentalButton::paintEvent(QPaintEvent *event) { QPixmap img = experimental_mode ? experimental_img : engage_img; if (!(scene.show_driver_camera || scene.map_open && scene.full_map)) { - drawIcon(p, QPoint(btn_size / 2, btn_size / 2 + y_offset), img, QColor(0, 0, 0, 166), (isDown() || !(engageable || scene.always_on_lateral_active)) ? 0.6 : 1.0); + if (rotatingWheel) { + drawIconRotate(p, QPoint(btn_size / 2, btn_size / 2 + y_offset), img, QColor(0, 0, 0, 166), (isDown() || !(engageable || scene.always_on_lateral_active)) ? 0.6 : 1.0, steeringAngleDeg); + } else { + drawIcon(p, QPoint(btn_size / 2, btn_size / 2 + y_offset), img, QColor(0, 0, 0, 166), (isDown() || !(engageable || scene.always_on_lateral_active)) ? 0.6 : 1.0); + } } } diff --git a/selfdrive/ui/qt/onroad.h b/selfdrive/ui/qt/onroad.h index e56be95..b293cdb 100644 --- a/selfdrive/ui/qt/onroad.h +++ b/selfdrive/ui/qt/onroad.h @@ -77,6 +77,8 @@ private: // FrogPilot variables UIScene &scene; + bool rotatingWheel; + int steeringAngleDeg; int y_offset; }; diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index 6c71546..71c4c06 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -237,6 +237,9 @@ static void update_state(UIState *s) { if (scene.pedals_on_ui) { scene.standstill = carState.getStandstill(); } + if (scene.rotating_wheel) { + scene.steering_angle_deg = carState.getSteeringAngleDeg(); + } } if (sm.updated("controlsState")) { auto controlsState = sm["controlsState"].getControlsState(); @@ -346,6 +349,8 @@ void ui_update_frogpilot_params(UIState *s) { scene.full_map = quality_of_life_visuals && params.getBool("FullMap"); scene.hide_speed = quality_of_life_visuals && params.getBool("HideSpeed"); scene.hide_speed_ui = scene.hide_speed && params.getBool("HideSpeedUI"); + + scene.rotating_wheel = params.getBool("RotatingWheel"); } void UIState::updateStatus() { diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 8d29556..1868771 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -205,6 +205,7 @@ typedef struct UIScene { bool reverse_cruise; bool reverse_cruise_ui; bool road_name_ui; + bool rotating_wheel; bool show_driver_camera; bool standstill; bool tethering_enabled; @@ -234,6 +235,7 @@ typedef struct UIScene { int desired_follow; int obstacle_distance; int obstacle_distance_stock; + int steering_angle_deg; int stopped_equivalence; QPolygonF track_adjacent_vertices[6];