From 3443a443ced2692a08550b5ab5cb8cffead9fced Mon Sep 17 00:00:00 2001 From: FrogAi <91348155+FrogAi@users.noreply.github.com> Date: Fri, 18 Aug 2023 23:36:19 -0700 Subject: [PATCH] Onroad compass Added toggle for an onroad compass. --- common/params.cc | 1 + selfdrive/assets/images/compass_inner.png | Bin 0 -> 43168 bytes selfdrive/assets/offroad/icon_compass.png | Bin 0 -> 57802 bytes selfdrive/ui/qt/offroad/frogpilot_settings.cc | 1 + selfdrive/ui/qt/onroad.cc | 106 +++++++++++++++++- selfdrive/ui/qt/onroad.h | 6 + selfdrive/ui/ui.cc | 4 + selfdrive/ui/ui.h | 2 + 8 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 selfdrive/assets/images/compass_inner.png create mode 100644 selfdrive/assets/offroad/icon_compass.png diff --git a/common/params.cc b/common/params.cc index 50050805c72d8e0..1d9411956fe638c 100644 --- a/common/params.cc +++ b/common/params.cc @@ -100,6 +100,7 @@ std::unordered_map keys = { {"CarParamsCache", CLEAR_ON_MANAGER_START}, {"CarParamsPersistent", PERSISTENT}, {"CarVin", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION}, + {"Compass", PERSISTENT}, {"CompletedTrainingVersion", PERSISTENT}, {"ControlsReady", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION}, {"CurrentBootlog", PERSISTENT}, diff --git a/selfdrive/assets/images/compass_inner.png b/selfdrive/assets/images/compass_inner.png new file mode 100644 index 0000000000000000000000000000000000000000..aa2d45196b39ca547b96b3bb50d0ede28451301c GIT binary patch literal 43168 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 JtaD0e0sxv8bKC#` literal 0 HcmV?d00001 diff --git a/selfdrive/assets/offroad/icon_compass.png b/selfdrive/assets/offroad/icon_compass.png new file mode 100644 index 0000000000000000000000000000000000000000..dd241e0a953242b9a6a3d6523ca2ea4ea2c3a2bb GIT binary patch literal 57802 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 toggles = { {"FrogTheme", "FrogPilot Theme", "Enable the beloved FrogPilot Theme! Disable toggle to revert back to the stock openpilot theme.", "../assets/images/frog_button_home.png"}, + {"Compass", "Compass", "Add a compass to the onroad UI that indicates your current driving direction.", "../assets/offroad/icon_compass.png"}, {"CustomRoadUI", "Custom Road UI", "Customize the road UI to your liking.", "../assets/offroad/icon_road.png"}, {"NumericalTemp", "Numerical Temperature Gauge", "Replace openpilot's 'GOOD', 'OK', and 'HIGH' temperature statuses with numerical values.\n\nTap the gauge to switch between Celsius and Fahrenheit.", "../assets/offroad/icon_temp.png"}, {"RotatingWheel", "Rotating Steering Wheel", "The steering wheel in top right corner of the onroad UI rotates alongside your physical steering wheel.", "../assets/offroad/icon_rotate.png"}, diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index 166bd26d1ebc3e1..9f4b45f5d12871f 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -335,7 +335,10 @@ AnnotatedCameraWidget::AnnotatedCameraWidget(VisionStreamType type, QWidget* par main_layout->addWidget(experimental_btn, 0, Qt::AlignTop | Qt::AlignRight); map_settings_btn = new MapSettingsButton(this); - main_layout->addWidget(map_settings_btn, 0, Qt::AlignBottom | Qt::AlignRight); + const bool flip_side = rightHandDM || compass; + const bool move_up = false; + const bool move_up_top = compass && (!muteDM); + main_layout->addWidget(map_settings_btn, 0, (flip_side ? Qt::AlignLeft : Qt::AlignRight) | (move_up ? Qt::AlignCenter : move_up_top ? Qt::AlignTop : Qt::AlignBottom)); dm_img = loadPixmap("../assets/img_driver_face.png", {img_size + 5, img_size + 5}); @@ -349,6 +352,7 @@ AnnotatedCameraWidget::AnnotatedCameraWidget(VisionStreamType type, QWidget* par } // FrogPilot images + compass_inner_img = loadPixmap("../assets/images/compass_inner.png", {img_size, img_size}); engage_img = loadPixmap("../assets/img_chffr_wheel.png", {img_size, img_size}); experimental_img = loadPixmap("../assets/img_experimental.svg", {img_size, img_size}); @@ -422,12 +426,17 @@ void AnnotatedCameraWidget::updateState(const UIState &s) { // hide map settings button for alerts and flip for right hand DM if (map_settings_btn->isEnabled()) { map_settings_btn->setVisible(!hideBottomIcons); - main_layout->setAlignment(map_settings_btn, (rightHandDM ? Qt::AlignLeft : Qt::AlignRight) | Qt::AlignBottom); + const bool flip_side = rightHandDM || compass; + const bool move_up = false; + const bool move_up_top = compass && (!muteDM); + main_layout->setAlignment(map_settings_btn, (flip_side ? Qt::AlignLeft : Qt::AlignRight) | (move_up ? Qt::AlignCenter : move_up_top ? Qt::AlignTop : Qt::AlignBottom)); } // FrogPilot properties + setProperty("bearingDeg", s.scene.bearing_deg); setProperty("blindSpotLeft", s.scene.blind_spot_left); setProperty("blindSpotRight", s.scene.blind_spot_right); + setProperty("compass", s.scene.compass); setProperty("experimentalMode", s.scene.experimental_mode); setProperty("frogColors", s.scene.frog_colors); setProperty("muteDM", s.scene.mute_dm); @@ -539,6 +548,11 @@ void AnnotatedCameraWidget::drawHud(QPainter &p) { p.restore(); + // Compass + if (compass && !hideBottomIcons) { + drawCompass(p); + } + // Rotating steering wheel if (rotatingWheel) { const auto &scene = uiState()->scene; @@ -899,6 +913,94 @@ void AnnotatedCameraWidget::showEvent(QShowEvent *event) { // FrogPilot widgets +void AnnotatedCameraWidget::drawCompass(QPainter &p) { + p.save(); + + // Variable declarations + constexpr int circle_size = 250; + constexpr int circle_offset = circle_size / 2; + constexpr int degreeLabelOffset = circle_offset + 25; + constexpr int inner_compass = btn_size / 2; + int x = !rightHandDM ? rect().right() - btn_size / 2 - (UI_BORDER_SIZE * 2) - 10 : btn_size / 2 + (UI_BORDER_SIZE * 2) + 10; + const int y = rect().bottom() - 20 - 140; + + // Enable Antialiasing + p.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); + + // Configure the circles + p.setPen(QPen(Qt::white, 2)); + const auto drawCircle = [&](const int offset, const QBrush brush = Qt::NoBrush) { + p.setOpacity(1.0); + p.setBrush(brush); + p.drawEllipse(x - offset, y - offset, offset * 2, offset * 2); + }; + + // Draw the circle background and white inner circle + drawCircle(circle_offset, blackColor(100)); + + // Rotate and draw the compass_inner_img image + p.save(); + p.translate(x, y); + p.rotate(bearingDeg); + p.drawPixmap(-compass_inner_img.width() / 2, -compass_inner_img.height() / 2, compass_inner_img); + p.restore(); + + // Draw the cardinal directions + const auto drawDirection = [&](const QString &text, const int from, const int to, const int align) { + // Move the "E" and "W" directions a bit closer to the middle so they're more uniform + const int offset = (text == "E") ? -5 : ((text == "W") ? 5 : 0); + // Set the opacity based on whether the direction label is currently being pointed at + p.setOpacity((bearingDeg >= from && bearingDeg < to) ? 1.0 : 0.2); + p.drawText(QRect(x - inner_compass + offset, y - inner_compass, btn_size, btn_size), align, text); + }; + p.setFont(InterFont(25, QFont::Bold)); + drawDirection("N", 0, 68, Qt::AlignTop | Qt::AlignHCenter); + drawDirection("E", 23, 158, Qt::AlignRight | Qt::AlignVCenter); + drawDirection("S", 113, 248, Qt::AlignBottom | Qt::AlignHCenter); + drawDirection("W", 203, 338, Qt::AlignLeft | Qt::AlignVCenter); + drawDirection("N", 293, 360, Qt::AlignTop | Qt::AlignHCenter); + + // Draw the white circle outlining the cardinal directions + drawCircle(inner_compass + 5); + + // Draw the white circle outlining the bearing degrees + drawCircle(degreeLabelOffset); + + // Draw the black background for the bearing degrees + QPainterPath outerCircle, innerCircle; + outerCircle.addEllipse(x - degreeLabelOffset, y - degreeLabelOffset, degreeLabelOffset * 2, degreeLabelOffset * 2); + innerCircle.addEllipse(x - circle_offset, y - circle_offset, circle_size, circle_size); + p.setOpacity(1.0); + p.fillPath(outerCircle.subtracted(innerCircle), Qt::black); + + // Draw the degree lines and bearing degrees + const auto drawCompassElements = [&](const int angle) { + const bool isCardinalDirection = angle % 90 == 0; + const int lineLength = isCardinalDirection ? 15 : 10; + const bool isBold = abs(angle - static_cast(bearingDeg)) <= 7; + + // Set the current bearing degree value to bold + p.setFont(QFont("Inter", 8, isBold ? QFont::Bold : QFont::Normal)); + p.setPen(QPen(Qt::white, isCardinalDirection ? 3 : 1)); + + // Place the elements in their respective spots around their circles + p.save(); + p.translate(x, y); + p.rotate(angle); + p.drawLine(0, -(circle_size / 2 - lineLength), 0, -(circle_size / 2)); + p.translate(0, -(circle_size / 2 + 12)); + p.rotate(-angle); + p.drawText(QRect(-20, -10, 40, 20), Qt::AlignCenter, QString::number(angle)); + p.restore(); + }; + + for (int i = 0; i < 360; i += 15) { + drawCompassElements(i); + } + + p.restore(); +} + void AnnotatedCameraWidget::drawStatusBar(QPainter &p) { p.save(); diff --git a/selfdrive/ui/qt/onroad.h b/selfdrive/ui/qt/onroad.h index 868bd9b822211a3..1905af2e00527b8 100644 --- a/selfdrive/ui/qt/onroad.h +++ b/selfdrive/ui/qt/onroad.h @@ -93,10 +93,12 @@ class AnnotatedCameraWidget : public CameraWidget { // FrogPilot properties Q_PROPERTY(bool blindSpotLeft MEMBER blindSpotLeft); Q_PROPERTY(bool blindSpotRight MEMBER blindSpotRight); + Q_PROPERTY(bool compass MEMBER compass); Q_PROPERTY(bool experimentalMode MEMBER experimentalMode); Q_PROPERTY(bool frogColors MEMBER frogColors); Q_PROPERTY(bool muteDM MEMBER muteDM); Q_PROPERTY(bool rotatingWheel MEMBER rotatingWheel); + Q_PROPERTY(int bearingDeg MEMBER bearingDeg); Q_PROPERTY(int steeringAngleDeg MEMBER steeringAngleDeg); Q_PROPERTY(int steeringWheel MEMBER steeringWheel); @@ -110,6 +112,7 @@ class AnnotatedCameraWidget : public CameraWidget { void drawText(QPainter &p, int x, int y, const QString &text, int alpha = 255); // FrogPilot widgets + void drawCompass(QPainter &p); void drawStatusBar(QPainter &p); QVBoxLayout *main_layout; @@ -137,12 +140,15 @@ class AnnotatedCameraWidget : public CameraWidget { // FrogPilot variables bool blindSpotLeft; bool blindSpotRight; + bool compass; bool experimentalMode; bool frogColors; bool muteDM; bool rotatingWheel; + int bearingDeg; int steeringAngleDeg; int steeringWheel; + QPixmap compass_inner_img; QPixmap engage_img; QPixmap experimental_img; std::map wheel_images; diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index ff737b6b169cc2b..5103228032a935b 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -234,6 +234,9 @@ static void update_state(UIState *s) { } if (sm.updated("gpsLocationExternal")) { const auto gpsLocationExternal = sm["gpsLocationExternal"].getGpsLocationExternal(); + if (scene.compass) { + scene.bearing_deg = gpsLocationExternal.getBearingDeg(); + } } if (sm.updated("lateralPlan")) { const auto lateralPlan = sm["lateralPlan"].getLateralPlan(); @@ -267,6 +270,7 @@ void ui_update_params(UIState *s) { scene.default_params_set = params.getBool("DefaultParamsSet"); } if (!toggles_checked && scene.default_params_set) { + scene.compass = params.getBool("Compass"); scene.custom_road_ui = params.getBool("CustomRoadUI"); scene.blind_spot_path = scene.custom_road_ui && params.getBool("BlindSpotPath"); scene.frog_theme = params.getBool("FrogTheme"); diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 76162c6ccaab687..fb80d1187ddb187 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -147,6 +147,7 @@ typedef struct UIScene { bool blind_spot_left; bool blind_spot_path; bool blind_spot_right; + bool compass; bool custom_road_ui; bool default_params_set; bool enabled; @@ -165,6 +166,7 @@ typedef struct UIScene { float path_edge_width; float path_width; float road_edge_width; + int bearing_deg; int screen_brightness; int steering_angle_deg; int steering_wheel;