#include "selfdrive/ui/qt/body.h" #include #include 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(); }