|
|
|
#include "selfdrive/ui/qt/body.h"
|
|
|
|
|
|
|
|
#include <cmath>
|
|
|
|
|
|
|
|
#include <QPainter>
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
setAttribute(Qt::WA_TransparentForMouseEvents, true);
|
|
|
|
|
|
|
|
QObject::connect(uiState(), &UIState::uiUpdate, this, &BodyWindow::updateState);
|
|
|
|
}
|
|
|
|
|
|
|
|
void BodyWindow::paintEvent(QPaintEvent *event) {
|
|
|
|
QLabel::paintEvent(event);
|
|
|
|
|
|
|
|
QPainter p(this);
|
|
|
|
p.setRenderHint(QPainter::Antialiasing);
|
|
|
|
p.setPen(Qt::NoPen);
|
|
|
|
|
|
|
|
// draw battery level
|
|
|
|
const int offset = 90;
|
|
|
|
const int radius = 60 / 2;
|
|
|
|
const int levels = 5;
|
|
|
|
const float interval = 1. / levels;
|
|
|
|
for (int i = 0; i < levels; i++) {
|
|
|
|
float level = 1.0 - (i+1)*interval;
|
|
|
|
float perc = (fuel >= level) ? 1.0 : 0.35;
|
|
|
|
|
|
|
|
p.setBrush(QColor(255, 255, 255, 255 * perc));
|
|
|
|
QPoint pt(width() - (i*offset + offset / 2), offset / 2);
|
|
|
|
p.drawEllipse(pt, radius, radius);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void BodyWindow::updateState(const UIState &s) {
|
|
|
|
if (!isVisible()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const SubMaster &sm = *(s.sm);
|
|
|
|
auto cs = sm["carState"].getCarState();
|
|
|
|
|
|
|
|
fuel = cs.getFuelGauge();
|
|
|
|
|
|
|
|
// TODO: use carState.standstill when that's fixed
|
|
|
|
const bool standstill = std::abs(cs.getVEgo()) < 0.01;
|
|
|
|
QMovie *m = standstill ? sleep : awake;
|
|
|
|
if (m != movie()) {
|
|
|
|
setMovie(m);
|
|
|
|
movie()->start();
|
|
|
|
}
|
|
|
|
|
|
|
|
update();
|
|
|
|
}
|