|  |  |  | @ -4,33 +4,81 @@ | 
			
		
	
		
			
				
					|  |  |  |  | #include <algorithm> | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #include <QPainter> | 
			
		
	
		
			
				
					|  |  |  |  | #include <QStackedLayout> | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | BodyWindow::BodyWindow(QWidget *parent) : fuel_filter(1.0, 5., 1. / UI_FREQ), QLabel(parent) { | 
			
		
	
		
			
				
					|  |  |  |  | #include "selfdrive/common/params.h" | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | RecordButton::RecordButton(QWidget *parent) : QPushButton(parent) { | 
			
		
	
		
			
				
					|  |  |  |  |   setCheckable(true); | 
			
		
	
		
			
				
					|  |  |  |  |   setChecked(false); | 
			
		
	
		
			
				
					|  |  |  |  |   setFixedSize(148, 148); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void RecordButton::paintEvent(QPaintEvent *event) { | 
			
		
	
		
			
				
					|  |  |  |  |   QPainter p(this); | 
			
		
	
		
			
				
					|  |  |  |  |   p.setRenderHint(QPainter::Antialiasing); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   QPoint center(width() / 2, height() / 2); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   QColor bg(isChecked() ? "#FFFFFF" : "#404040"); | 
			
		
	
		
			
				
					|  |  |  |  |   QColor accent(isChecked() ? "#FF0000" : "#FFFFFF"); | 
			
		
	
		
			
				
					|  |  |  |  |   if (isDown()) { | 
			
		
	
		
			
				
					|  |  |  |  |     accent.setAlphaF(0.7); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   p.setPen(Qt::NoPen); | 
			
		
	
		
			
				
					|  |  |  |  |   p.setBrush(bg); | 
			
		
	
		
			
				
					|  |  |  |  |   p.drawEllipse(center, 74, 74); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   p.setPen(QPen(accent, 6)); | 
			
		
	
		
			
				
					|  |  |  |  |   p.setBrush(Qt::NoBrush); | 
			
		
	
		
			
				
					|  |  |  |  |   p.drawEllipse(center, 42, 42); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   p.setPen(Qt::NoPen); | 
			
		
	
		
			
				
					|  |  |  |  |   p.setBrush(accent); | 
			
		
	
		
			
				
					|  |  |  |  |   p.drawEllipse(center, 22, 22); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | BodyWindow::BodyWindow(QWidget *parent) : fuel_filter(1.0, 5., 1. / UI_FREQ), QWidget(parent) { | 
			
		
	
		
			
				
					|  |  |  |  |   QStackedLayout *layout = new QStackedLayout(this); | 
			
		
	
		
			
				
					|  |  |  |  |   layout->setStackingMode(QStackedLayout::StackAll); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   QWidget *w = new QWidget; | 
			
		
	
		
			
				
					|  |  |  |  |   QVBoxLayout *vlayout = new QVBoxLayout(w); | 
			
		
	
		
			
				
					|  |  |  |  |   vlayout->setMargin(45); | 
			
		
	
		
			
				
					|  |  |  |  |   layout->addWidget(w); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   // face
 | 
			
		
	
		
			
				
					|  |  |  |  |   face = new QLabel(); | 
			
		
	
		
			
				
					|  |  |  |  |   face->setAlignment(Qt::AlignCenter); | 
			
		
	
		
			
				
					|  |  |  |  |   layout->addWidget(face); | 
			
		
	
		
			
				
					|  |  |  |  |   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); | 
			
		
	
		
			
				
					|  |  |  |  |   // record button
 | 
			
		
	
		
			
				
					|  |  |  |  |   btn = new RecordButton(this); | 
			
		
	
		
			
				
					|  |  |  |  |   vlayout->addWidget(btn, 0, Qt::AlignBottom | Qt::AlignRight); | 
			
		
	
		
			
				
					|  |  |  |  |   QObject::connect(btn, &QPushButton::clicked, [=](bool checked) { | 
			
		
	
		
			
				
					|  |  |  |  |     Params().putBool("EnableLogging", checked); | 
			
		
	
		
			
				
					|  |  |  |  |   }); | 
			
		
	
		
			
				
					|  |  |  |  |   w->raise(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   QObject::connect(uiState(), &UIState::uiUpdate, this, &BodyWindow::updateState); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void BodyWindow::paintEvent(QPaintEvent *event) { | 
			
		
	
		
			
				
					|  |  |  |  |   QLabel::paintEvent(event); | 
			
		
	
		
			
				
					|  |  |  |  |   //QLabel::paintEvent(event);
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   QPainter p(this); | 
			
		
	
		
			
				
					|  |  |  |  |   p.setRenderHint(QPainter::Antialiasing); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   p.translate(width() - 136, 16); | 
			
		
	
		
			
				
					|  |  |  |  |   p.fillRect(rect(), QColor(0, 0, 0)); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   // battery outline + detail
 | 
			
		
	
		
			
				
					|  |  |  |  |   p.translate(width() - 136, 16); | 
			
		
	
		
			
				
					|  |  |  |  |   const QColor gray = QColor("#737373"); | 
			
		
	
		
			
				
					|  |  |  |  |   p.setBrush(Qt::NoBrush); | 
			
		
	
		
			
				
					|  |  |  |  |   p.setPen(QPen(gray, 4, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); | 
			
		
	
	
		
			
				
					|  |  |  | @ -79,9 +127,9 @@ void BodyWindow::updateState(const UIState &s) { | 
			
		
	
		
			
				
					|  |  |  |  |   // 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(); | 
			
		
	
		
			
				
					|  |  |  |  |   if (m != face->movie()) { | 
			
		
	
		
			
				
					|  |  |  |  |     face->setMovie(m); | 
			
		
	
		
			
				
					|  |  |  |  |     face->movie()->start(); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   update(); | 
			
		
	
	
		
			
				
					|  |  |  | 
 |