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.
		
		
		
		
		
			
		
			
				
					
					
						
							186 lines
						
					
					
						
							5.1 KiB
						
					
					
				
			
		
		
	
	
							186 lines
						
					
					
						
							5.1 KiB
						
					
					
				#include <QDebug>
 | 
						|
#include <QTimer>
 | 
						|
#include <QVBoxLayout>
 | 
						|
 | 
						|
#include "system/hardware/hw.h"
 | 
						|
#include "selfdrive/ui/qt/util.h"
 | 
						|
#include "selfdrive/ui/qt/qt_window.h"
 | 
						|
#include "selfdrive/ui/qt/setup/updater.h"
 | 
						|
#include "selfdrive/ui/qt/network/networking.h"
 | 
						|
 | 
						|
Updater::Updater(const QString &updater_path, const QString &manifest_path, QWidget *parent)
 | 
						|
  : updater(updater_path), manifest(manifest_path), QStackedWidget(parent) {
 | 
						|
 | 
						|
  assert(updater.size());
 | 
						|
  assert(manifest.size());
 | 
						|
 | 
						|
  // initial prompt screen
 | 
						|
  prompt = new QWidget;
 | 
						|
  {
 | 
						|
    QVBoxLayout *layout = new QVBoxLayout(prompt);
 | 
						|
    layout->setContentsMargins(100, 250, 100, 100);
 | 
						|
 | 
						|
    QLabel *title = new QLabel(tr("Update Required"));
 | 
						|
    title->setStyleSheet("font-size: 80px; font-weight: bold;");
 | 
						|
    layout->addWidget(title);
 | 
						|
 | 
						|
    layout->addSpacing(75);
 | 
						|
 | 
						|
    QLabel *desc = new QLabel(tr("An operating system update is required. Connect your device to Wi-Fi for the fastest update experience. The download size is approximately 1GB."));
 | 
						|
    desc->setWordWrap(true);
 | 
						|
    desc->setStyleSheet("font-size: 65px;");
 | 
						|
    layout->addWidget(desc);
 | 
						|
 | 
						|
    layout->addStretch();
 | 
						|
 | 
						|
    QHBoxLayout *hlayout = new QHBoxLayout;
 | 
						|
    hlayout->setSpacing(30);
 | 
						|
    layout->addLayout(hlayout);
 | 
						|
 | 
						|
    QPushButton *connect = new QPushButton(tr("Connect to Wi-Fi"));
 | 
						|
    connect->setObjectName("navBtn");
 | 
						|
    QObject::connect(connect, &QPushButton::clicked, [=]() {
 | 
						|
      setCurrentWidget(wifi);
 | 
						|
    });
 | 
						|
    hlayout->addWidget(connect);
 | 
						|
 | 
						|
    QPushButton *install = new QPushButton(tr("Install"));
 | 
						|
    install->setObjectName("navBtn");
 | 
						|
    install->setStyleSheet(R"(
 | 
						|
      QPushButton {
 | 
						|
        background-color: #465BEA;
 | 
						|
      }
 | 
						|
      QPushButton:pressed {
 | 
						|
        background-color: #3049F4;
 | 
						|
      }
 | 
						|
    )");
 | 
						|
    QObject::connect(install, &QPushButton::clicked, this, &Updater::installUpdate);
 | 
						|
    hlayout->addWidget(install);
 | 
						|
  }
 | 
						|
 | 
						|
  // wifi connection screen
 | 
						|
  wifi = new QWidget;
 | 
						|
  {
 | 
						|
    QVBoxLayout *layout = new QVBoxLayout(wifi);
 | 
						|
    layout->setContentsMargins(100, 100, 100, 100);
 | 
						|
 | 
						|
    Networking *networking = new Networking(this, false);
 | 
						|
    networking->setStyleSheet("Networking { background-color: #292929; border-radius: 13px; }");
 | 
						|
    layout->addWidget(networking, 1);
 | 
						|
 | 
						|
    QPushButton *back = new QPushButton(tr("Back"));
 | 
						|
    back->setObjectName("navBtn");
 | 
						|
    back->setStyleSheet("padding-left: 60px; padding-right: 60px;");
 | 
						|
    QObject::connect(back, &QPushButton::clicked, [=]() {
 | 
						|
      setCurrentWidget(prompt);
 | 
						|
    });
 | 
						|
    layout->addWidget(back, 0, Qt::AlignLeft);
 | 
						|
  }
 | 
						|
 | 
						|
  // progress screen
 | 
						|
  progress = new QWidget;
 | 
						|
  {
 | 
						|
    QVBoxLayout *layout = new QVBoxLayout(progress);
 | 
						|
    layout->setContentsMargins(150, 330, 150, 150);
 | 
						|
    layout->setSpacing(0);
 | 
						|
 | 
						|
    text = new QLabel(tr("Loading..."));
 | 
						|
    text->setStyleSheet("font-size: 90px; font-weight: 600;");
 | 
						|
    layout->addWidget(text, 0, Qt::AlignTop);
 | 
						|
 | 
						|
    layout->addSpacing(100);
 | 
						|
 | 
						|
    bar = new QProgressBar();
 | 
						|
    bar->setRange(0, 100);
 | 
						|
    bar->setTextVisible(false);
 | 
						|
    bar->setFixedHeight(72);
 | 
						|
    layout->addWidget(bar, 0, Qt::AlignTop);
 | 
						|
 | 
						|
    layout->addStretch();
 | 
						|
 | 
						|
    reboot = new QPushButton(tr("Reboot"));
 | 
						|
    reboot->setObjectName("navBtn");
 | 
						|
    reboot->setStyleSheet("padding-left: 60px; padding-right: 60px;");
 | 
						|
    QObject::connect(reboot, &QPushButton::clicked, [=]() {
 | 
						|
      Hardware::reboot();
 | 
						|
    });
 | 
						|
    layout->addWidget(reboot, 0, Qt::AlignLeft);
 | 
						|
    reboot->hide();
 | 
						|
 | 
						|
    layout->addStretch();
 | 
						|
  }
 | 
						|
 | 
						|
  addWidget(prompt);
 | 
						|
  addWidget(wifi);
 | 
						|
  addWidget(progress);
 | 
						|
 | 
						|
  setStyleSheet(R"(
 | 
						|
    * {
 | 
						|
      color: white;
 | 
						|
      outline: none;
 | 
						|
      font-family: Inter;
 | 
						|
    }
 | 
						|
    Updater {
 | 
						|
      color: white;
 | 
						|
      background-color: black;
 | 
						|
    }
 | 
						|
    QPushButton#navBtn {
 | 
						|
      height: 160;
 | 
						|
      font-size: 55px;
 | 
						|
      font-weight: 400;
 | 
						|
      border-radius: 10px;
 | 
						|
      background-color: #333333;
 | 
						|
    }
 | 
						|
    QPushButton#navBtn:pressed {
 | 
						|
      background-color: #444444;
 | 
						|
    }
 | 
						|
    QProgressBar {
 | 
						|
      border: none;
 | 
						|
      background-color: #292929;
 | 
						|
    }
 | 
						|
    QProgressBar::chunk {
 | 
						|
      background-color: #364DEF;
 | 
						|
    }
 | 
						|
  )");
 | 
						|
}
 | 
						|
 | 
						|
void Updater::installUpdate() {
 | 
						|
  setCurrentWidget(progress);
 | 
						|
  QObject::connect(&proc, &QProcess::readyReadStandardOutput, this, &Updater::readProgress);
 | 
						|
  QObject::connect(&proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, &Updater::updateFinished);
 | 
						|
  proc.setProcessChannelMode(QProcess::ForwardedErrorChannel);
 | 
						|
  proc.start(updater, {"--swap", manifest});
 | 
						|
}
 | 
						|
 | 
						|
void Updater::readProgress() {
 | 
						|
  auto lines = QString(proc.readAllStandardOutput());
 | 
						|
  for (const QString &line : lines.trimmed().split("\n")) {
 | 
						|
    auto parts = line.split(":");
 | 
						|
    if (parts.size() == 2) {
 | 
						|
      text->setText(parts[0]);
 | 
						|
      bar->setValue((int)parts[1].toDouble());
 | 
						|
    } else {
 | 
						|
      qDebug() << line;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  update();
 | 
						|
}
 | 
						|
 | 
						|
void Updater::updateFinished(int exitCode, QProcess::ExitStatus exitStatus) {
 | 
						|
  qDebug() << "finished with " << exitCode;
 | 
						|
  if (exitCode == 0) {
 | 
						|
    Hardware::reboot();
 | 
						|
  } else {
 | 
						|
    text->setText(tr("Update failed"));
 | 
						|
    reboot->show();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char *argv[]) {
 | 
						|
  initApp(argc, argv);
 | 
						|
  QApplication a(argc, argv);
 | 
						|
  Updater updater(argv[1], argv[2]);
 | 
						|
  setMainWindow(&updater);
 | 
						|
  a.installEventFilter(&updater);
 | 
						|
  return a.exec();
 | 
						|
}
 | 
						|
 |