Rotating steering wheel in onroad UI

Added toggle to rotate the steering wheel in the top right corner of the onroad UI.
This commit is contained in:
FrogAi 2024-02-27 16:34:47 -07:00
parent 81fd194894
commit ebc707e4f5
6 changed files with 38 additions and 1 deletions

View File

@ -336,6 +336,7 @@ std::unordered_map<std::string, uint32_t> keys = {
{"RoadEdgesWidth", PERSISTENT},
{"RoadName", PERSISTENT},
{"RoadNameUI", PERSISTENT},
{"RotatingWheel", PERSISTENT},
{"SchedulePending", PERSISTENT},
{"SearchInput", PERSISTENT},
{"SilentMode", PERSISTENT},

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

@ -29,6 +29,21 @@ static void drawIcon(QPainter &p, const QPoint &center, const QPixmap &img, cons
p.setOpacity(1.0);
}
static void drawIconRotate(QPainter &p, const QPoint &center, 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);
}
}
}

View File

@ -77,6 +77,8 @@ private:
// FrogPilot variables
UIScene &scene;
bool rotatingWheel;
int steeringAngleDeg;
int y_offset;
};

View File

@ -235,6 +235,9 @@ static void update_state(UIState *s) {
scene.acceleration = carState.getAEgo();
scene.standstill = carState.getStandstill();
}
if (scene.rotating_wheel) {
scene.steering_angle_deg = carState.getSteeringAngleDeg();
}
}
if (sm.updated("controlsState")) {
auto controlsState = sm["controlsState"].getControlsState();
@ -343,6 +346,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() {

View File

@ -204,6 +204,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;
@ -232,6 +233,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];