From 19b62e3bdcde9c1a32bf6aacc3ad8fc55cd82707 Mon Sep 17 00:00:00 2001 From: FrogAi <91348155+FrogAi@users.noreply.github.com> Date: Sat, 8 Jun 2024 13:18:31 -0700 Subject: [PATCH] Visuals - Custom Onroad UI - Pedals Being Pressed Display the brake and gas pedals on the onroad UI below the steering wheel icon. --- selfdrive/car/chrysler/carstate.py | 2 + selfdrive/car/honda/carstate.py | 6 ++ selfdrive/car/hyundai/carstate.py | 4 + selfdrive/car/subaru/carstate.py | 4 + selfdrive/car/toyota/carstate.py | 2 + selfdrive/car/volkswagen/carstate.py | 4 + .../assets/other_images/brake_pedal.png | Bin 0 -> 6522 bytes .../assets/other_images/gas_pedal.png | Bin 0 -> 11278 bytes selfdrive/ui/qt/onroad/annotated_camera.cc | 71 +++++++++++++++++- selfdrive/ui/qt/onroad/annotated_camera.h | 24 ++++++ selfdrive/ui/ui.cc | 6 ++ selfdrive/ui/ui.h | 6 ++ 12 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 selfdrive/frogpilot/assets/other_images/brake_pedal.png create mode 100644 selfdrive/frogpilot/assets/other_images/gas_pedal.png diff --git a/selfdrive/car/chrysler/carstate.py b/selfdrive/car/chrysler/carstate.py index 0e2a82bf2..3085a320a 100644 --- a/selfdrive/car/chrysler/carstate.py +++ b/selfdrive/car/chrysler/carstate.py @@ -104,6 +104,8 @@ class CarState(CarStateBase): self.button_counter = cp.vl[self.button_message]["COUNTER"] # FrogPilot CarState functions + fp_ret.brakeLights = bool(cp.vl["ESP_1"]["BRAKE_PRESSED_ACC"]) + self.lkas_previously_enabled = self.lkas_enabled if self.CP.carFingerprint in RAM_CARS: self.lkas_enabled = cp.vl["Center_Stack_2"]["LKAS_Button"] or cp.vl["Center_Stack_1"]["LKAS_Button"] diff --git a/selfdrive/car/honda/carstate.py b/selfdrive/car/honda/carstate.py index 5bbbf7740..253a0ae93 100644 --- a/selfdrive/car/honda/carstate.py +++ b/selfdrive/car/honda/carstate.py @@ -274,6 +274,12 @@ class CarState(CarStateBase): ret.rightBlindspot = cp_body.vl["BSM_STATUS_RIGHT"]["BSM_ALERT"] == 1 # FrogPilot CarState functions + brake_light_cars = (CAR.HONDA_CIVIC, CAR.HONDA_ODYSSEY, CAR.HONDA_ODYSSEY_CHN, CAR.HONDA_CRV_5G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, + CAR.HONDA_CIVIC_BOSCH_DIESEL, CAR.HONDA_CRV_HYBRID, CAR.ACURA_RDX_3G, CAR.HONDA_E) + + if self.CP.carFingerprint in brake_light_cars or (self.CP.carFingerprint in HONDA_BOSCH and self.CP.carFingerprint not in HONDA_BOSCH_RADARLESS): + fp_ret.brakeLights = bool(cp.vl["ACC_CONTROL"]['BRAKE_LIGHTS'] != 0 or ret.brake > 0.4) if not self.CP.openpilotLongitudinalControl else bool(ret.brake > 0.4) + self.prev_distance_button = self.distance_button self.distance_button = self.cruise_setting == 3 diff --git a/selfdrive/car/hyundai/carstate.py b/selfdrive/car/hyundai/carstate.py index 4149dec39..a9663a9d9 100644 --- a/selfdrive/car/hyundai/carstate.py +++ b/selfdrive/car/hyundai/carstate.py @@ -190,6 +190,8 @@ class CarState(CarStateBase): self.main_enabled = not self.main_enabled # FrogPilot CarState functions + fp_ret.brakeLights = bool(cp.vl["TCS13"]["BrakeLight"]) + fp_ret.dashboardSpeedLimit = self.calculate_speed_limit(cp, cp_cam) * speed_conv self.prev_distance_button = self.distance_button @@ -286,6 +288,8 @@ class CarState(CarStateBase): else cp_cam.vl["CAM_0x2a4"]) # FrogPilot CarState functions + fp_ret.brakeLights = bool(cp.vl["TCS"]["DriverBraking"]) + fp_ret.dashboardSpeedLimit = self.calculate_speed_limit(cp, cp_cam) * speed_factor self.prev_distance_button = self.distance_button diff --git a/selfdrive/car/subaru/carstate.py b/selfdrive/car/subaru/carstate.py index 9c96076ae..8553a3616 100644 --- a/selfdrive/car/subaru/carstate.py +++ b/selfdrive/car/subaru/carstate.py @@ -129,7 +129,10 @@ class CarState(CarStateBase): # FrogPilot CarState functions self.lkas_previously_enabled = self.lkas_enabled if self.car_fingerprint not in PREGLOBAL_CARS: + fp_ret.brakeLights = bool(cp_cam.vl["ES_DashStatus"]["Brake_Lights"]) self.lkas_enabled = cp_cam.vl["ES_LKAS_State"]["LKAS_Dash_State"] + else: + fp_ret.brakeLights = bool(cp_cam.vl["ES_Brake"]["Cruise_Brake_Lights"]) return ret, fp_ret @@ -202,6 +205,7 @@ class CarState(CarStateBase): messages = [ ("ES_DashStatus", 20), ("ES_Distance", 20), + ("ES_Brake", 20), ] else: messages = [ diff --git a/selfdrive/car/toyota/carstate.py b/selfdrive/car/toyota/carstate.py index a9a9e6c96..4faa40019 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -209,6 +209,8 @@ class CarState(CarStateBase): self.distance_button = cp.vl["SDSU"]["FD_BUTTON"] # FrogPilot CarState functions + fp_ret.brakeLights = bool(cp.vl["ESP_CONTROL"]["BRAKE_LIGHTS_ACC"]) + self.cruise_decreased_previously = self.cruise_decreased self.cruise_decreased = self.pcm_acc_status == 10 self.cruise_increased_previously = self.cruise_increased diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index db9c61243..4a6122093 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -154,6 +154,8 @@ class CarState(CarStateBase): self.upscale_lead_car_signal = bool(pt_cp.vl["Kombi_03"]["KBI_Variante"]) # FrogPilot CarState functions + fp_ret.brakeLights = bool(pt_cp.vl["ESP_05"]['ESP_Status_Bremsdruck']) + self.prev_distance_button = self.distance_button self.distance_button = bool(pt_cp.vl["GRA_ACC_01"]["GRA_Verstellung_Zeitluecke"]) @@ -258,6 +260,8 @@ class CarState(CarStateBase): ret.espDisabled = bool(pt_cp.vl["Bremse_1"]["ESP_Passiv_getastet"]) # FrogPilot CarState functions + fp_ret.brakeLights = bool(pt_cp.vl["Motor_2"]['Bremstestschalter']) + self.prev_distance_button = self.distance_button self.distance_button = bool(pt_cp.vl["GRA_Neu"]["GRA_Zeitluecke"]) diff --git a/selfdrive/frogpilot/assets/other_images/brake_pedal.png b/selfdrive/frogpilot/assets/other_images/brake_pedal.png new file mode 100644 index 0000000000000000000000000000000000000000..9c0ee24d1842f20e3edb37b8b9aeac036d902ab4 GIT binary patch literal 6522 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 literal 0 HcmV?d00001 diff --git a/selfdrive/frogpilot/assets/other_images/gas_pedal.png b/selfdrive/frogpilot/assets/other_images/gas_pedal.png new file mode 100644 index 0000000000000000000000000000000000000000..754a0bbf7226b1a596bbca2153e3da047abcce98 GIT binary patch literal 11278 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 B#QXpN literal 0 HcmV?d00001 diff --git a/selfdrive/ui/qt/onroad/annotated_camera.cc b/selfdrive/ui/qt/onroad/annotated_camera.cc index 37942a86b..32f44b86e 100644 --- a/selfdrive/ui/qt/onroad/annotated_camera.cc +++ b/selfdrive/ui/qt/onroad/annotated_camera.cc @@ -17,8 +17,21 @@ AnnotatedCameraWidget::AnnotatedCameraWidget(VisionStreamType type, QWidget* par main_layout->setMargin(UI_BORDER_SIZE); main_layout->setSpacing(0); + QHBoxLayout *buttons_layout = new QHBoxLayout(); + buttons_layout->setSpacing(0); + experimental_btn = new ExperimentalButton(this); - main_layout->addWidget(experimental_btn, 0, Qt::AlignTop | Qt::AlignRight); + buttons_layout->addWidget(experimental_btn); + + QVBoxLayout *top_right_layout = new QVBoxLayout(); + top_right_layout->setSpacing(0); + top_right_layout->addLayout(buttons_layout); + + pedal_icons = new PedalIcons(this); + top_right_layout->addWidget(pedal_icons, 0, Qt::AlignRight); + + main_layout->addLayout(top_right_layout, 0); + main_layout->setAlignment(top_right_layout, Qt::AlignTop | Qt::AlignRight); map_settings_btn = new MapSettingsButton(this); main_layout->addWidget(map_settings_btn, 0, Qt::AlignBottom | Qt::AlignRight); @@ -642,6 +655,12 @@ void AnnotatedCameraWidget::paintFrogPilotWidgets(QPainter &painter, const UISce bottom_layout->setAlignment(distance_btn, (rightHandDM ? Qt::AlignRight : Qt::AlignLeft) | Qt::AlignBottom); } + bool enablePedalIcons = scene.pedals_on_ui; + pedal_icons->setVisible(enablePedalIcons); + if (enablePedalIcons) { + pedal_icons->updateState(scene); + } + reverseCruise = scene.reverse_cruise; speedLimitController = scene.speed_limit_controller; @@ -755,6 +774,56 @@ void Compass::paintEvent(QPaintEvent *event) { } } +PedalIcons::PedalIcons(QWidget *parent) : QWidget(parent) { + setFixedSize(btn_size, btn_size); + + brake_pedal_img = loadPixmap("../frogpilot/assets/other_images/brake_pedal.png", QSize(img_size, img_size)); + gas_pedal_img = loadPixmap("../frogpilot/assets/other_images/gas_pedal.png", QSize(img_size, img_size)); +} + +void PedalIcons::updateState(const UIScene &scene) { + acceleration = scene.acceleration; + brakeLightOn = scene.brake_lights_on; + dynamicPedals = scene.dynamic_pedals_on_ui; + standstill = scene.standstill; + staticPedals = scene.static_pedals_on_ui; + + accelerating = acceleration > 0.25f; + decelerating = acceleration < -0.25f; + + if (accelerating || decelerating) { + update(); + } +} + +void PedalIcons::paintEvent(QPaintEvent *event) { + QPainter p(this); + p.setRenderHint(QPainter::Antialiasing); + + int totalWidth = 2 * img_size; + int startX = (width() - totalWidth) / 2; + + int brakeX = startX + img_size / 2; + int gasX = startX + img_size; + + float brakeOpacity = 1.0f; + float gasOpacity = 1.0f; + + if (dynamicPedals) { + brakeOpacity = standstill ? 1.0f : decelerating ? std::max(0.25f, std::abs(acceleration)) : 0.25f; + gasOpacity = accelerating ? std::max(0.25f, acceleration) : 0.25f; + } else if (staticPedals) { + brakeOpacity = standstill || brakeLightOn || acceleration < -0.5f ? 1.0f : 0.25f; + gasOpacity = !standstill && acceleration > 0 ? 1.0f : 0.25f; + } + + p.setOpacity(brakeOpacity); + p.drawPixmap(brakeX, (height() - img_size) / 2, brake_pedal_img); + + p.setOpacity(gasOpacity); + p.drawPixmap(gasX, (height() - img_size) / 2, gas_pedal_img); +} + void AnnotatedCameraWidget::drawSLCConfirmation(QPainter &p) { p.save(); diff --git a/selfdrive/ui/qt/onroad/annotated_camera.h b/selfdrive/ui/qt/onroad/annotated_camera.h index f8d28b9c4..d36789a61 100644 --- a/selfdrive/ui/qt/onroad/annotated_camera.h +++ b/selfdrive/ui/qt/onroad/annotated_camera.h @@ -29,6 +29,29 @@ private: QPixmap staticElements; }; +class PedalIcons : public QWidget { + Q_OBJECT + +public: + explicit PedalIcons(QWidget *parent = 0); + void updateState(const UIScene &scene); + +private: + void paintEvent(QPaintEvent *event) override; + + QPixmap brake_pedal_img; + QPixmap gas_pedal_img; + + bool accelerating; + bool brakeLightOn; + bool decelerating; + bool dynamicPedals; + bool standstill; + bool staticPedals; + + float acceleration; +}; + class AnnotatedCameraWidget : public CameraWidget { Q_OBJECT @@ -76,6 +99,7 @@ private: Compass *compass_img; DistanceButton *distance_btn; + PedalIcons *pedal_icons; QHBoxLayout *bottom_layout; diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index 8f5c4e8e4..d9e9a11c5 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -222,6 +222,8 @@ static void update_state(UIState *s) { scene.blind_spot_left = carState.getLeftBlindspot(); scene.blind_spot_right = carState.getRightBlindspot(); scene.parked = carState.getGearShifter() == cereal::CarState::GearShifter::PARK; + scene.reverse = carState.getGearShifter() == cereal::CarState::GearShifter::REVERSE; + scene.standstill = carState.getStandstill() && !scene.reverse; } if (sm.updated("controlsState")) { auto controlsState = sm["controlsState"].getControlsState(); @@ -240,6 +242,7 @@ static void update_state(UIState *s) { } if (sm.updated("frogpilotCarState")) { auto frogpilotCarState = sm["frogpilotCarState"].getFrogpilotCarState(); + scene.brake_lights_on = frogpilotCarState.getBrakeLights(); scene.traffic_mode_active = frogpilotCarState.getTrafficModeActive(); } if (sm.updated("frogpilotPlan")) { @@ -314,6 +317,9 @@ void ui_update_frogpilot_params(UIState *s, Params ¶ms) { scene.adjacent_path_metrics = scene.adjacent_path && params.getBool("AdjacentPathMetrics"); scene.blind_spot_path = custom_paths && params.getBool("BlindSpotPath"); scene.compass = custom_onroad_ui && params.getBool("Compass"); + scene.pedals_on_ui = custom_onroad_ui && params.getBool("PedalsOnUI"); + scene.dynamic_pedals_on_ui = scene.pedals_on_ui && params.getBool("DynamicPedalsOnUI"); + scene.static_pedals_on_ui = scene.pedals_on_ui && params.getBool("StaticPedalsOnUI"); scene.disable_smoothing_mtsc = params.getBool("MTSCEnabled") && params.getBool("DisableMTSCSmoothing"); scene.disable_smoothing_vtsc = params.getBool("VisionTurnControl") && params.getBool("DisableVTSCSmoothing"); diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 22a4043d0..778f49305 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -129,10 +129,12 @@ typedef struct UIScene { bool blind_spot_left; bool blind_spot_path; bool blind_spot_right; + bool brake_lights_on; bool compass; bool conditional_experimental; bool disable_smoothing_mtsc; bool disable_smoothing_vtsc; + bool dynamic_pedals_on_ui; bool enabled; bool experimental_mode; bool experimental_mode_via_screen; @@ -142,6 +144,8 @@ typedef struct UIScene { bool online; bool onroad_distance_button; bool parked; + bool pedals_on_ui; + bool reverse; bool reverse_cruise; bool reverse_cruise_ui; bool right_hand_drive; @@ -152,6 +156,8 @@ typedef struct UIScene { bool speed_limit_changed; bool speed_limit_controller; bool speed_limit_overridden; + bool standstill; + bool static_pedals_on_ui; bool tethering_enabled; bool traffic_mode; bool traffic_mode_active;