|
|
|
@ -1,14 +1,15 @@ |
|
|
|
|
#!/usr/bin/env python3 |
|
|
|
|
import os |
|
|
|
|
import pyray as rl |
|
|
|
|
import sys |
|
|
|
|
import threading |
|
|
|
|
from enum import IntEnum |
|
|
|
|
|
|
|
|
|
import pyray as rl |
|
|
|
|
|
|
|
|
|
from openpilot.system.hardware import PC |
|
|
|
|
from openpilot.system.ui.lib.application import gui_app, FontWeight |
|
|
|
|
from openpilot.system.ui.widgets import Widget |
|
|
|
|
from openpilot.system.ui.widgets.button import gui_button, ButtonStyle |
|
|
|
|
from openpilot.system.ui.widgets.button import Button, ButtonStyle |
|
|
|
|
from openpilot.system.ui.widgets.label import gui_label, gui_text_box |
|
|
|
|
|
|
|
|
|
NVME = "/dev/nvme0n1" |
|
|
|
@ -31,8 +32,15 @@ class ResetState(IntEnum): |
|
|
|
|
class Reset(Widget): |
|
|
|
|
def __init__(self, mode): |
|
|
|
|
super().__init__() |
|
|
|
|
self.mode = mode |
|
|
|
|
self.reset_state = ResetState.NONE |
|
|
|
|
self._mode = mode |
|
|
|
|
self._reset_state = ResetState.NONE |
|
|
|
|
self._cancel_button = Button("Cancel", self._cancel_callback) |
|
|
|
|
self._confirm_button = Button("Confirm", self._confirm, button_style=ButtonStyle.PRIMARY) |
|
|
|
|
self._reboot_button = Button("Reboot", lambda: os.system("sudo reboot")) |
|
|
|
|
self._render_status = True |
|
|
|
|
|
|
|
|
|
def _cancel_callback(self): |
|
|
|
|
self._render_status = False |
|
|
|
|
|
|
|
|
|
def _do_erase(self): |
|
|
|
|
if PC: |
|
|
|
@ -50,10 +58,10 @@ class Reset(Widget): |
|
|
|
|
if rm == 0 or fmt == 0: |
|
|
|
|
os.system("sudo reboot") |
|
|
|
|
else: |
|
|
|
|
self.reset_state = ResetState.FAILED |
|
|
|
|
self._reset_state = ResetState.FAILED |
|
|
|
|
|
|
|
|
|
def start_reset(self): |
|
|
|
|
self.reset_state = ResetState.RESETTING |
|
|
|
|
self._reset_state = ResetState.RESETTING |
|
|
|
|
threading.Timer(0.1, self._do_erase).start() |
|
|
|
|
|
|
|
|
|
def _render(self, rect: rl.Rectangle): |
|
|
|
@ -61,42 +69,38 @@ class Reset(Widget): |
|
|
|
|
gui_label(label_rect, "System Reset", 100, font_weight=FontWeight.BOLD) |
|
|
|
|
|
|
|
|
|
text_rect = rl.Rectangle(rect.x + 140, rect.y + 140, rect.width - 280, rect.height - 90 - 100) |
|
|
|
|
gui_text_box(text_rect, self.get_body_text(), 90) |
|
|
|
|
gui_text_box(text_rect, self._get_body_text(), 90) |
|
|
|
|
|
|
|
|
|
button_height = 160 |
|
|
|
|
button_spacing = 50 |
|
|
|
|
button_top = rect.y + rect.height - button_height |
|
|
|
|
button_width = (rect.width - button_spacing) / 2.0 |
|
|
|
|
|
|
|
|
|
if self.reset_state != ResetState.RESETTING: |
|
|
|
|
if self.mode == ResetMode.RECOVER or self.reset_state == ResetState.FAILED: |
|
|
|
|
if gui_button(rl.Rectangle(rect.x, button_top, button_width, button_height), "Reboot"): |
|
|
|
|
os.system("sudo reboot") |
|
|
|
|
elif self.mode == ResetMode.USER_RESET: |
|
|
|
|
if gui_button(rl.Rectangle(rect.x, button_top, button_width, button_height), "Cancel"): |
|
|
|
|
return False |
|
|
|
|
if self._reset_state != ResetState.RESETTING: |
|
|
|
|
if self._mode == ResetMode.RECOVER or self._reset_state == ResetState.FAILED: |
|
|
|
|
self._reboot_button.render(rl.Rectangle(rect.x, button_top, rect.width, button_height)) |
|
|
|
|
elif self._mode == ResetMode.USER_RESET: |
|
|
|
|
self._cancel_button.render(rl.Rectangle(rect.x, button_top, button_width, button_height)) |
|
|
|
|
|
|
|
|
|
if self.reset_state != ResetState.FAILED: |
|
|
|
|
if gui_button(rl.Rectangle(rect.x + button_width + 50, button_top, button_width, button_height), |
|
|
|
|
"Confirm", button_style=ButtonStyle.PRIMARY): |
|
|
|
|
self.confirm() |
|
|
|
|
if self._reset_state != ResetState.FAILED: |
|
|
|
|
self._confirm_button.render(rl.Rectangle(rect.x + button_width + 50, button_top, button_width, button_height)) |
|
|
|
|
|
|
|
|
|
return True |
|
|
|
|
return self._render_status |
|
|
|
|
|
|
|
|
|
def confirm(self): |
|
|
|
|
if self.reset_state == ResetState.CONFIRM: |
|
|
|
|
def _confirm(self): |
|
|
|
|
if self._reset_state == ResetState.CONFIRM: |
|
|
|
|
self.start_reset() |
|
|
|
|
else: |
|
|
|
|
self.reset_state = ResetState.CONFIRM |
|
|
|
|
self._reset_state = ResetState.CONFIRM |
|
|
|
|
|
|
|
|
|
def get_body_text(self): |
|
|
|
|
if self.reset_state == ResetState.CONFIRM: |
|
|
|
|
def _get_body_text(self): |
|
|
|
|
if self._reset_state == ResetState.CONFIRM: |
|
|
|
|
return "Are you sure you want to reset your device?" |
|
|
|
|
if self.reset_state == ResetState.RESETTING: |
|
|
|
|
if self._reset_state == ResetState.RESETTING: |
|
|
|
|
return "Resetting device...\nThis may take up to a minute." |
|
|
|
|
if self.reset_state == ResetState.FAILED: |
|
|
|
|
if self._reset_state == ResetState.FAILED: |
|
|
|
|
return "Reset failed. Reboot to try again." |
|
|
|
|
if self.mode == ResetMode.RECOVER: |
|
|
|
|
if self._mode == ResetMode.RECOVER: |
|
|
|
|
return "Unable to mount data partition. Partition may be corrupted. Press confirm to erase and reset your device." |
|
|
|
|
return "System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot." |
|
|
|
|
|
|
|
|
|