diff --git a/selfdrive/hardware/tici/hardware.py b/selfdrive/hardware/tici/hardware.py index f7e804a150..07a075c892 100644 --- a/selfdrive/hardware/tici/hardware.py +++ b/selfdrive/hardware/tici/hardware.py @@ -1,5 +1,6 @@ import os import subprocess +from pathlib import Path from cereal import log from selfdrive.hardware.base import HardwareBase @@ -46,8 +47,9 @@ class Tici(HardwareBase): subprocess.check_output(["sudo", "reboot"]) def uninstall(self): - # TODO: implement uninstall. reboot to factory reset? - pass + Path("/data/__system_reset__").touch() + os.sync() + self.reboot() def get_serial(self): return self.get_cmdline()['androidboot.serialno'] diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 4e650a0c4e..8f3b2b71b5 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -125,33 +125,40 @@ QWidget * device_panel() { Params params = Params(); std::vector> labels = { {"Dongle ID", params.get("DongleId", false)}, - //{"Serial Number", "abcdefghijk"}, }; - for (auto l : labels) { + // get serial number + //std::string cmdline = util::read_file("/proc/cmdline"); + //auto delim = cmdline.find("serialno="); + //if (delim != std::string::npos) { + // labels.push_back({"Serial", cmdline.substr(delim, cmdline.find(" ", delim))}); + //} + + for (auto &l : labels) { QString text = QString::fromStdString(l.first + ": " + l.second); device_layout->addWidget(new QLabel(text)); } + // TODO: show current calibration values QPushButton *clear_cal_btn = new QPushButton("Reset Calibration"); device_layout->addWidget(clear_cal_btn); QObject::connect(clear_cal_btn, &QPushButton::released, [=]() { Params().delete_db_value("CalibrationParams"); }); - std::map power_btns = { - {"Power Off", "sudo poweroff"}, - {"Reboot", "sudo reboot"}, - }; - - for (auto b : power_btns) { - QPushButton *btn = new QPushButton(QString::fromStdString(b.first)); - device_layout->addWidget(btn); + QPushButton *poweroff_btn = new QPushButton("Power Off"); + device_layout->addWidget(poweroff_btn); + QPushButton *reboot_btn = new QPushButton("Reboot"); + device_layout->addWidget(reboot_btn); #ifdef __aarch64__ - QObject::connect(btn, &QPushButton::released, - [=]() {std::system(b.second);}); + QObject::connect(poweroff_btn, &QPushButton::released, [=]() { std::system("sudo poweroff"); }); + QObject::connect(reboot_btn, &QPushButton::released, [=]() { std::system("sudo reboot"); }); #endif - } + + // TODO: add confirmation dialog + QPushButton *uninstall_btn = new QPushButton("Uninstall openpilot"); + device_layout->addWidget(uninstall_btn); + QObject::connect(uninstall_btn, &QPushButton::released, [=]() { Params().write_db_value("DoUninstall", "1"); }); QWidget *widget = new QWidget; widget->setLayout(device_layout);