mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-02-19 08:53:54 +08:00
UI: body support (#24079)
* body ui template
* faces
* abs
* not raw
* auto switch
* check that
* no smoosh
* cmath
old-commit-hash: b51deb97d1
This commit is contained in:
@@ -446,6 +446,7 @@ selfdrive/assets/.gitignore
|
||||
selfdrive/assets/assets.qrc
|
||||
selfdrive/assets/*.png
|
||||
selfdrive/assets/*.svg
|
||||
selfdrive/assets/body/*
|
||||
selfdrive/assets/fonts/*.ttf
|
||||
selfdrive/assets/icons/*
|
||||
selfdrive/assets/images/*
|
||||
|
||||
3
selfdrive/assets/body/awake.gif
Normal file
3
selfdrive/assets/body/awake.gif
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a4b3f7e9bc5cf058c3daaca23f99c0aafe4324eb4b2e0f8ccb3759b252a8101d
|
||||
size 69319
|
||||
3
selfdrive/assets/body/sleep.gif
Normal file
3
selfdrive/assets/body/sleep.gif
Normal file
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:3481857356714833aa196a89c47de3246dd395a51fbfd9e0dff53058c109ced8
|
||||
size 400908
|
||||
@@ -56,7 +56,7 @@ qt_env.Program("qt/text", ["qt/text.cc"], LIBS=qt_libs)
|
||||
qt_env.Program("qt/spinner", ["qt/spinner.cc"], LIBS=qt_libs)
|
||||
|
||||
# build main UI
|
||||
qt_src = ["main.cc", "ui.cc", "qt/sidebar.cc", "qt/onroad.cc",
|
||||
qt_src = ["main.cc", "ui.cc", "qt/sidebar.cc", "qt/onroad.cc", "qt/body.cc",
|
||||
"qt/window.cc", "qt/home.cc", "qt/offroad/settings.cc",
|
||||
"qt/offroad/onboarding.cc", "qt/offroad/driverview.cc"]
|
||||
qt_env.Program("_ui", qt_src + [asset_obj], LIBS=qt_libs)
|
||||
|
||||
34
selfdrive/ui/qt/body.cc
Normal file
34
selfdrive/ui/qt/body.cc
Normal file
@@ -0,0 +1,34 @@
|
||||
#include "selfdrive/ui/qt/body.h"
|
||||
|
||||
#include <cmath>
|
||||
|
||||
BodyWindow::BodyWindow(QWidget *parent) : QLabel(parent) {
|
||||
awake = new QMovie("../assets/body/awake.gif");
|
||||
awake->setCacheMode(QMovie::CacheAll);
|
||||
sleep = new QMovie("../assets/body/sleep.gif");
|
||||
sleep->setCacheMode(QMovie::CacheAll);
|
||||
|
||||
QPalette p(Qt::black);
|
||||
setPalette(p);
|
||||
setAutoFillBackground(true);
|
||||
|
||||
setAlignment(Qt::AlignCenter);
|
||||
|
||||
QObject::connect(uiState(), &UIState::uiUpdate, this, &BodyWindow::updateState);
|
||||
}
|
||||
|
||||
void BodyWindow::updateState(const UIState &s) {
|
||||
if (!isVisible()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const SubMaster &sm = *(s.sm);
|
||||
|
||||
// TODO: use carState.standstill when that's fixed
|
||||
const bool standstill = std::abs(sm["carState"].getCarState().getVEgo()) < 0.01;
|
||||
QMovie *m = standstill ? sleep : awake;
|
||||
if (m != movie()) {
|
||||
setMovie(m);
|
||||
movie()->start();
|
||||
}
|
||||
}
|
||||
19
selfdrive/ui/qt/body.h
Normal file
19
selfdrive/ui/qt/body.h
Normal file
@@ -0,0 +1,19 @@
|
||||
#pragma once
|
||||
|
||||
#include <QMovie>
|
||||
#include <QLabel>
|
||||
|
||||
#include "selfdrive/ui/ui.h"
|
||||
|
||||
class BodyWindow : public QLabel {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
BodyWindow(QWidget* parent = 0);
|
||||
|
||||
private:
|
||||
QMovie *awake, *sleep;
|
||||
|
||||
private slots:
|
||||
void updateState(const UIState &s);
|
||||
};
|
||||
@@ -30,12 +30,16 @@ HomeWindow::HomeWindow(QWidget* parent) : QWidget(parent) {
|
||||
onroad = new OnroadWindow(this);
|
||||
slayout->addWidget(onroad);
|
||||
|
||||
body = new BodyWindow(this);
|
||||
slayout->addWidget(body);
|
||||
|
||||
driver_view = new DriverViewWindow(this);
|
||||
connect(driver_view, &DriverViewWindow::done, [=] {
|
||||
showDriverView(false);
|
||||
});
|
||||
slayout->addWidget(driver_view);
|
||||
setAttribute(Qt::WA_NoSystemBackground);
|
||||
QObject::connect(uiState(), &UIState::uiUpdate, this, &HomeWindow::updateState);
|
||||
QObject::connect(uiState(), &UIState::offroadTransition, this, &HomeWindow::offroadTransition);
|
||||
}
|
||||
|
||||
@@ -43,6 +47,15 @@ void HomeWindow::showSidebar(bool show) {
|
||||
sidebar->setVisible(show);
|
||||
}
|
||||
|
||||
void HomeWindow::updateState(const UIState &s) {
|
||||
const SubMaster &sm = *(s.sm);
|
||||
|
||||
// switch to the body UI
|
||||
if (onroad->isVisible() && sm["carParams"].getCarParams().getCarName() == "body") {
|
||||
slayout->setCurrentWidget(body);
|
||||
}
|
||||
}
|
||||
|
||||
void HomeWindow::offroadTransition(bool offroad) {
|
||||
sidebar->setVisible(offroad);
|
||||
if (offroad) {
|
||||
@@ -64,7 +77,7 @@ void HomeWindow::showDriverView(bool show) {
|
||||
|
||||
void HomeWindow::mousePressEvent(QMouseEvent* e) {
|
||||
// Handle sidebar collapsing
|
||||
if (onroad->isVisible() && (!sidebar->isVisible() || e->x() > sidebar->width())) {
|
||||
if ((onroad->isVisible() || body->isVisible()) && (!sidebar->isVisible() || e->x() > sidebar->width())) {
|
||||
sidebar->setVisible(!sidebar->isVisible() && !onroad->isMapVisible());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <QWidget>
|
||||
|
||||
#include "selfdrive/ui/qt/offroad/driverview.h"
|
||||
#include "selfdrive/ui/qt/body.h"
|
||||
#include "selfdrive/ui/qt/onroad.h"
|
||||
#include "selfdrive/ui/qt/sidebar.h"
|
||||
#include "selfdrive/ui/qt/widgets/offroad_alerts.h"
|
||||
@@ -55,6 +56,10 @@ private:
|
||||
Sidebar *sidebar;
|
||||
OffroadHome *home;
|
||||
OnroadWindow *onroad;
|
||||
BodyWindow *body;
|
||||
DriverViewWindow *driver_view;
|
||||
QStackedLayout *slayout;
|
||||
|
||||
private slots:
|
||||
void updateState(const UIState &s);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user