You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					178 lines
				
				6.2 KiB
			
		
		
			
		
	
	
					178 lines
				
				6.2 KiB
			| 
								 
											5 years ago
										 
									 | 
							
								#include "common/util.h"
							 | 
						||
| 
								 | 
							
								#include "sidebar.hpp"
							 | 
						||
| 
								 | 
							
								#include "qt_window.hpp"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								StatusWidget::StatusWidget(QString label, QString msg, QColor c, QWidget* parent) : QFrame(parent) {
							 | 
						||
| 
								 | 
							
								  layout.setSpacing(0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if(msg.length() > 0){
							 | 
						||
| 
								 | 
							
								    layout.setContentsMargins(50, 24, 16, 24);
							 | 
						||
| 
								 | 
							
								    status.setAlignment(Qt::AlignLeft | Qt::AlignHCenter);
							 | 
						||
| 
								 | 
							
								    status.setStyleSheet(R"(font-size: 65px; font-weight: 500;)");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    substatus.setAlignment(Qt::AlignLeft | Qt::AlignHCenter);
							 | 
						||
| 
								 | 
							
								    substatus.setStyleSheet(R"(font-size: 30px; font-weight: 400;)");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    layout.addWidget(&status, 0, Qt::AlignLeft);
							 | 
						||
| 
								 | 
							
								    layout.addWidget(&substatus, 0, Qt::AlignLeft);
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    layout.setContentsMargins(40, 24, 16, 24);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    status.setAlignment(Qt::AlignCenter);
							 | 
						||
| 
								 | 
							
								    status.setStyleSheet(R"(font-size: 38px; font-weight: 500;)");
							 | 
						||
| 
								 | 
							
								    layout.addWidget(&status, 0, Qt::AlignCenter);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  update(label, msg, c);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  setMinimumHeight(124);
							 | 
						||
| 
								 | 
							
								  setStyleSheet("background-color: transparent;");
							 | 
						||
| 
								 | 
							
								  setLayout(&layout);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void StatusWidget::paintEvent(QPaintEvent *e){
							 | 
						||
| 
								 | 
							
								  QPainter p(this);
							 | 
						||
| 
								 | 
							
								  p.setRenderHint(QPainter::Antialiasing, true);
							 | 
						||
| 
								 | 
							
								  p.setPen(QPen(QColor(0xb2b2b2), 3, Qt::SolidLine, Qt::FlatCap));
							 | 
						||
| 
								 | 
							
								  // origin at 1.5,1.5 because qt issues with pixel perfect borders
							 | 
						||
| 
								 | 
							
								  p.drawRoundedRect(QRectF(1.5, 1.5, size().width()-3, size().height()-3), 30, 30);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  p.setPen(Qt::NoPen);
							 | 
						||
| 
								 | 
							
								  p.setBrush(color);
							 | 
						||
| 
								 | 
							
								  p.setClipRect(0,0,25+6,size().height()-6,Qt::ClipOperation::ReplaceClip);
							 | 
						||
| 
								 | 
							
								  p.drawRoundedRect(QRectF(6, 6, size().width()-12, size().height()-12), 25, 25);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void StatusWidget::update(QString label, QString msg, QColor c) {
							 | 
						||
| 
								 | 
							
								  status.setText(label);
							 | 
						||
| 
								 | 
							
								  substatus.setText(msg);
							 | 
						||
| 
								 | 
							
								  color = c;
							 | 
						||
| 
								 | 
							
								  return;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								SignalWidget::SignalWidget(QString text, int strength, QWidget* parent) : QFrame(parent), _strength(strength) {
							 | 
						||
| 
								 | 
							
								  layout.setMargin(0);
							 | 
						||
| 
								 | 
							
								  layout.setSpacing(0);
							 | 
						||
| 
								 | 
							
								  layout.insertSpacing(0, 45);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  label.setText(text);
							 | 
						||
| 
								 | 
							
								  layout.addWidget(&label, 0, Qt::AlignLeft);
							 | 
						||
| 
								 | 
							
								  label.setStyleSheet(R"(font-size: 35px; font-weight: 400;)");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  setFixedWidth(177);
							 | 
						||
| 
								 | 
							
								  setLayout(&layout);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void SignalWidget::paintEvent(QPaintEvent *e){
							 | 
						||
| 
								 | 
							
								  QPainter p(this);
							 | 
						||
| 
								 | 
							
								  p.setRenderHint(QPainter::Antialiasing, true);
							 | 
						||
| 
								 | 
							
								  p.setPen(Qt::NoPen);
							 | 
						||
| 
								 | 
							
								  p.setBrush(Qt::white);
							 | 
						||
| 
								 | 
							
								  for (int i = 0; i < 5 ; i++){
							 | 
						||
| 
								 | 
							
								    if(i == _strength){
							 | 
						||
| 
								 | 
							
								      p.setPen(Qt::NoPen);
							 | 
						||
| 
								 | 
							
								      p.setBrush(Qt::darkGray);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    p.drawEllipse(QRectF(_dotspace * i, _top, _dia, _dia));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void SignalWidget::update(QString text, int strength){
							 | 
						||
| 
								 | 
							
								  label.setText(text);
							 | 
						||
| 
								 | 
							
								  _strength = strength;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Sidebar::Sidebar(QWidget* parent) : QFrame(parent) {
							 | 
						||
| 
								 | 
							
								  QVBoxLayout* layout = new QVBoxLayout();
							 | 
						||
| 
								 | 
							
								  layout->setContentsMargins(25, 50, 25, 50);
							 | 
						||
| 
								 | 
							
								  layout->setSpacing(35);
							 | 
						||
| 
								 | 
							
								  setFixedSize(300, vwp_h);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  QPushButton *s_btn = new QPushButton;
							 | 
						||
| 
								 | 
							
								  s_btn->setStyleSheet(R"(
							 | 
						||
| 
								 | 
							
								    border-image: url(../assets/images/button_settings.png);
							 | 
						||
| 
								 | 
							
								  )");
							 | 
						||
| 
								 | 
							
								  s_btn->setFixedSize(200, 117);
							 | 
						||
| 
								 | 
							
								  layout->addWidget(s_btn, 0, Qt::AlignHCenter);
							 | 
						||
| 
								 | 
							
								  QObject::connect(s_btn, &QPushButton::pressed, this, &Sidebar::openSettings);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  signal = new SignalWidget("--", 0, this);
							 | 
						||
| 
								 | 
							
								  layout->addWidget(signal, 0, Qt::AlignTop | Qt::AlignHCenter);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  temp = new StatusWidget("0°C", "TEMP", QColor(255, 255, 255), this);
							 | 
						||
| 
								 | 
							
								  layout->addWidget(temp, 0, Qt::AlignTop);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  panda = new StatusWidget("NO\nPANDA", "", QColor(201, 34, 49), this);
							 | 
						||
| 
								 | 
							
								  layout->addWidget(panda, 0, Qt::AlignTop);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  connect = new StatusWidget("CONNECT\nOFFLINE", "",  QColor(218, 202, 37), this);
							 | 
						||
| 
								 | 
							
								  layout->addWidget(connect, 0, Qt::AlignTop);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  QImage image = QImageReader("../assets/images/button_home.png").read();
							 | 
						||
| 
								 | 
							
								  QLabel *comma = new QLabel(this);
							 | 
						||
| 
								 | 
							
								  comma->setPixmap(QPixmap::fromImage(image));
							 | 
						||
| 
								 | 
							
								  comma->setAlignment(Qt::AlignCenter);
							 | 
						||
| 
								 | 
							
								  layout->addWidget(comma, 1, Qt::AlignHCenter | Qt::AlignVCenter);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  layout->addStretch(1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  setStyleSheet(R"(
							 | 
						||
| 
								 | 
							
								    Sidebar {
							 | 
						||
| 
								 | 
							
								      background-color: #393939;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    * {
							 | 
						||
| 
								 | 
							
								      color: white;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  )");
							 | 
						||
| 
								 | 
							
								  setLayout(layout);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Sidebar::update(const UIState &s){
							 | 
						||
| 
								 | 
							
								  static std::map<NetStatus, std::pair<QString, QColor>> connectivity_map = {
							 | 
						||
| 
								 | 
							
								    {NET_ERROR, {"CONNECT\nERROR", COLOR_DANGER}},
							 | 
						||
| 
								 | 
							
								    {NET_CONNECTED, {"CONNECT\nONLINE", COLOR_GOOD}},
							 | 
						||
| 
								 | 
							
								    {NET_DISCONNECTED, {"CONNECT\nOFFLINE", COLOR_WARNING}},
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								  auto net_params = connectivity_map[s.scene.athenaStatus];
							 | 
						||
| 
								 | 
							
								  connect->update(net_params.first, "", net_params.second);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  static std::map<cereal::DeviceState::ThermalStatus, QColor> temp_severity_map = {
							 | 
						||
| 
								 | 
							
								        {cereal::DeviceState::ThermalStatus::GREEN, COLOR_GOOD},
							 | 
						||
| 
								 | 
							
								        {cereal::DeviceState::ThermalStatus::YELLOW, COLOR_WARNING},
							 | 
						||
| 
								 | 
							
								        {cereal::DeviceState::ThermalStatus::RED, COLOR_DANGER},
							 | 
						||
| 
								 | 
							
								        {cereal::DeviceState::ThermalStatus::DANGER, COLOR_DANGER}};
							 | 
						||
| 
								 | 
							
								  QString temp_val = QString("%1 °C").arg((int)s.scene.deviceState.getAmbientTempC());
							 | 
						||
| 
								 | 
							
								  temp->update(temp_val, "TEMP", temp_severity_map[s.scene.deviceState.getThermalStatus()]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  static std::map<cereal::DeviceState::NetworkType, const char *> network_type_map = {
							 | 
						||
| 
								 | 
							
								      {cereal::DeviceState::NetworkType::NONE, "--"},
							 | 
						||
| 
								 | 
							
								      {cereal::DeviceState::NetworkType::WIFI, "WiFi"},
							 | 
						||
| 
								 | 
							
								      {cereal::DeviceState::NetworkType::CELL2_G, "2G"},
							 | 
						||
| 
								 | 
							
								      {cereal::DeviceState::NetworkType::CELL3_G, "3G"},
							 | 
						||
| 
								 | 
							
								      {cereal::DeviceState::NetworkType::CELL4_G, "4G"},
							 | 
						||
| 
								 | 
							
								      {cereal::DeviceState::NetworkType::CELL5_G, "5G"}};
							 | 
						||
| 
								 | 
							
								  const char *network_type = network_type_map[s.scene.deviceState.getNetworkType()];
							 | 
						||
| 
								 | 
							
								  static std::map<cereal::DeviceState::NetworkStrength, int> network_strength_map = {
							 | 
						||
| 
								 | 
							
								      {cereal::DeviceState::NetworkStrength::UNKNOWN, 1},
							 | 
						||
| 
								 | 
							
								      {cereal::DeviceState::NetworkStrength::POOR, 2},
							 | 
						||
| 
								 | 
							
								      {cereal::DeviceState::NetworkStrength::MODERATE, 3},
							 | 
						||
| 
								 | 
							
								      {cereal::DeviceState::NetworkStrength::GOOD, 4},
							 | 
						||
| 
								 | 
							
								      {cereal::DeviceState::NetworkStrength::GREAT, 5}};
							 | 
						||
| 
								 | 
							
								  const int img_idx = s.scene.deviceState.getNetworkType() == cereal::DeviceState::NetworkType::NONE ? 0 : network_strength_map[s.scene.deviceState.getNetworkStrength()];
							 | 
						||
| 
								 | 
							
								  signal->update(network_type, img_idx);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  QColor panda_color = COLOR_GOOD;
							 | 
						||
| 
								 | 
							
								  QString panda_message = "VEHICLE\nONLINE";
							 | 
						||
| 
								 | 
							
								  if (s.scene.pandaType == cereal::PandaState::PandaType::UNKNOWN) {
							 | 
						||
| 
								 | 
							
								    panda_color = COLOR_DANGER;
							 | 
						||
| 
								 | 
							
								    panda_message = "NO\nPANDA";
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								#ifdef QCOM2
							 | 
						||
| 
								 | 
							
								  else if (s.scene.started) {
							 | 
						||
| 
								 | 
							
								    panda_color = s.scene.gpsOK ? COLOR_GOOD : COLOR_WARNING;
							 | 
						||
| 
								 | 
							
								    panda_message = QString("SAT CNT\n%1").arg(s.scene.satelliteCount);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								  panda->update(panda_message, "", panda_color);
							 | 
						||
| 
								 | 
							
								}
							 |