mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-07-13 13:22:22 +08:00
Driving Personality Button
This commit is contained in:
@@ -1 +1,76 @@
|
||||
#include "frogpilot/ui/qt/onroad/frogpilot_buttons.h"
|
||||
|
||||
DrivingPersonalityButton::DrivingPersonalityButton(QWidget *parent) : QPushButton(parent) {
|
||||
setFixedSize(btn_size + UI_BORDER_SIZE, btn_size);
|
||||
|
||||
QObject::connect(frogpilotUIState(), &FrogPilotUIState::themeUpdated, this, &DrivingPersonalityButton::updateTheme);
|
||||
QObject::connect(this, &QPushButton::pressed, [this] {params_memory.putBool("OnroadDistanceButtonPressed", true);});
|
||||
QObject::connect(this, &QPushButton::released, [this] {params_memory.putBool("OnroadDistanceButtonPressed", false);});
|
||||
}
|
||||
|
||||
void DrivingPersonalityButton::showEvent(QShowEvent *event) {
|
||||
updateTheme();
|
||||
}
|
||||
|
||||
void DrivingPersonalityButton::updateTheme() {
|
||||
for (QMap<int, QPair<QPixmap, QSharedPointer<QMovie>>>::iterator it = icon_map.begin(); it != icon_map.end(); ++it) {
|
||||
QSharedPointer<QMovie> &movie = it.value().second;
|
||||
if (!movie.isNull()) {
|
||||
QObject::disconnect(movie.data(), nullptr, this, nullptr);
|
||||
movie->stop();
|
||||
}
|
||||
}
|
||||
|
||||
icon_map.clear();
|
||||
|
||||
QPixmap traffic_img, aggressive_img, standard_img, relaxed_img;
|
||||
QSharedPointer<QMovie> traffic_gif, aggressive_gif, standard_gif, relaxed_gif;
|
||||
|
||||
loadImage("../../frogpilot/assets/active_theme/distance_icons/traffic", traffic_img, traffic_gif, QSize(btn_size, btn_size), this);
|
||||
loadImage("../../frogpilot/assets/active_theme/distance_icons/aggressive", aggressive_img, aggressive_gif, QSize(btn_size, btn_size), this);
|
||||
loadImage("../../frogpilot/assets/active_theme/distance_icons/standard", standard_img, standard_gif, QSize(btn_size, btn_size), this);
|
||||
loadImage("../../frogpilot/assets/active_theme/distance_icons/relaxed", relaxed_img, relaxed_gif, QSize(btn_size, btn_size), this);
|
||||
|
||||
icon_map.insert(0, qMakePair(traffic_img, traffic_gif));
|
||||
icon_map.insert(1, qMakePair(aggressive_img, aggressive_gif));
|
||||
icon_map.insert(2, qMakePair(standard_img, standard_gif));
|
||||
icon_map.insert(3, qMakePair(relaxed_img, relaxed_gif));
|
||||
|
||||
theme_updated = true;
|
||||
}
|
||||
|
||||
void DrivingPersonalityButton::updateState(const UIState &s, const FrogPilotUIState &fs) {
|
||||
const UIScene &scene = s.scene;
|
||||
|
||||
const SubMaster &fpsm = *(fs.sm);
|
||||
|
||||
const cereal::FrogPilotCarState::Reader &frogpilotCarState = fpsm["frogpilotCarState"].getFrogpilotCarState();
|
||||
|
||||
bool new_traffic_mode_active = frogpilotCarState.getTrafficModeEnabled();
|
||||
|
||||
int new_personality = static_cast<int>(scene.personality) + 1;
|
||||
|
||||
bool state_changed = (traffic_mode_active != new_traffic_mode_active) ||
|
||||
(personality != new_personality && !new_traffic_mode_active);
|
||||
|
||||
if (!state_changed && !theme_updated) {
|
||||
return;
|
||||
}
|
||||
|
||||
traffic_mode_active = new_traffic_mode_active;
|
||||
|
||||
personality = new_personality;
|
||||
|
||||
theme_updated = false;
|
||||
|
||||
QPair<QPixmap, QSharedPointer<QMovie>> icon = icon_map.value(traffic_mode_active ? 0 : personality);
|
||||
currentImg = icon.first;
|
||||
currentGif = icon.second.data();
|
||||
}
|
||||
|
||||
void DrivingPersonalityButton::paintEvent(QPaintEvent *event) {
|
||||
QPainter p(this);
|
||||
p.setRenderHint(QPainter::Antialiasing);
|
||||
|
||||
drawIcon(p, rect().center() + QPoint(UI_BORDER_SIZE / 2, 0), currentGif ? currentGif->currentPixmap() : currentImg, Qt::transparent, 1.0);
|
||||
}
|
||||
|
||||
@@ -1,3 +1,30 @@
|
||||
#pragma once
|
||||
|
||||
#include "selfdrive/ui/qt/onroad/buttons.h"
|
||||
|
||||
class DrivingPersonalityButton : public QPushButton {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit DrivingPersonalityButton(QWidget *parent = 0);
|
||||
|
||||
void updateState(const UIState &s, const FrogPilotUIState &fs);
|
||||
|
||||
private:
|
||||
void paintEvent(QPaintEvent *event) override;
|
||||
void showEvent(QShowEvent *event) override;
|
||||
void updateTheme();
|
||||
|
||||
bool theme_updated;
|
||||
bool traffic_mode_active;
|
||||
|
||||
int personality;
|
||||
|
||||
Params params_memory{"", true};
|
||||
|
||||
QMap<int, QPair<QPixmap, QSharedPointer<QMovie>>> icon_map;
|
||||
|
||||
QMovie *currentGif;
|
||||
|
||||
QPixmap currentImg;
|
||||
};
|
||||
|
||||
@@ -319,9 +319,12 @@ class CarInterfaceBase(ABC):
|
||||
self.CS.out = ret
|
||||
|
||||
# FrogPilot variables
|
||||
self.distance_button = bool(self.CS.distance_button)
|
||||
prev_distance_button = self.distance_button
|
||||
self.distance_button = self.params_memory.get_bool("OnroadDistanceButtonPressed")
|
||||
if self.distance_button != prev_distance_button:
|
||||
ret.buttonEvents = create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise})
|
||||
|
||||
fp_ret.distancePressed = self.distance_button
|
||||
fp_ret.distancePressed = self.distance_button or bool(self.CS.distance_button)
|
||||
fp_ret.ecoGear |= ret.gearShifter == GearShifter.eco
|
||||
fp_ret.sportGear |= ret.gearShifter == GearShifter.sport
|
||||
|
||||
|
||||
@@ -21,6 +21,8 @@ AnnotatedCameraWidget::AnnotatedCameraWidget(VisionStreamType type, QWidget *par
|
||||
main_layout->addWidget(experimental_btn, 0, Qt::AlignTop | Qt::AlignRight);
|
||||
|
||||
// FrogPilot variables
|
||||
personality_btn = new DrivingPersonalityButton(this);
|
||||
personality_btn->setVisible(false);
|
||||
}
|
||||
|
||||
void AnnotatedCameraWidget::updateState(const UIState &s, const FrogPilotUIState &fs) {
|
||||
@@ -34,6 +36,15 @@ void AnnotatedCameraWidget::updateState(const UIState &s, const FrogPilotUIState
|
||||
const cereal::CarState::Reader &carState = sm["carState"].getCarState();
|
||||
|
||||
frogpilot_nvg->experimentalButtonPosition = QPoint(experimental_btn->x(), experimental_btn->y());
|
||||
|
||||
bool onroad_distance_btn_enabled = frogpilot_nvg->dmIconPosition != QPoint(0, 0) && !frogpilot_nvg->hideBottomIcons && frogpilot_toggles.value("onroad_distance_button").toBool();
|
||||
personality_btn->setVisible(onroad_distance_btn_enabled);
|
||||
if (onroad_distance_btn_enabled) {
|
||||
personality_btn->move(frogpilot_nvg->rightHandDM ? width() - UI_BORDER_SIZE - personality_btn->width() - (UI_BORDER_SIZE / 2) : UI_BORDER_SIZE, frogpilot_nvg->dmIconPosition.y() - personality_btn->height() / 2);
|
||||
personality_btn->updateState(s, fs);
|
||||
}
|
||||
|
||||
dmon.onroad_distance_btn_enabled = onroad_distance_btn_enabled;
|
||||
}
|
||||
|
||||
void AnnotatedCameraWidget::initializeGL() {
|
||||
|
||||
@@ -38,6 +38,7 @@ private:
|
||||
bool wide_cam_requested = false;
|
||||
|
||||
// FrogPilot variables
|
||||
DrivingPersonalityButton *personality_btn;
|
||||
|
||||
protected:
|
||||
void paintGL() override;
|
||||
|
||||
@@ -74,6 +74,14 @@ void DriverMonitorRenderer::draw(QPainter &painter, const QRect &surface_rect) {
|
||||
float opacity = is_active ? 0.65f : 0.2f;
|
||||
|
||||
// FrogPilot variables
|
||||
if (onroad_distance_btn_enabled) {
|
||||
if (is_rhd) {
|
||||
x -= UI_BORDER_SIZE + (btn_size + UI_BORDER_SIZE) + UI_BORDER_SIZE;
|
||||
} else {
|
||||
x += UI_BORDER_SIZE + (btn_size + UI_BORDER_SIZE) + UI_BORDER_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
if (frogpilot_toggles.value("road_name_ui").toBool()) {
|
||||
y -= UI_BORDER_SIZE;
|
||||
}
|
||||
|
||||
@@ -15,6 +15,8 @@ public:
|
||||
// FrogPilot variables
|
||||
FrogPilotAnnotatedCameraWidget *frogpilot_nvg;
|
||||
|
||||
bool onroad_distance_btn_enabled;
|
||||
|
||||
QJsonObject frogpilot_toggles;
|
||||
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user