pull/35960/head
Maxime Desroches 1 week ago
parent 477239fe81
commit 7294d9dea7
  1. 34
      system/ui/setup.py

@ -3,6 +3,7 @@ import os
import re import re
import threading import threading
import time import time
import queue
import urllib.request import urllib.request
from urllib.parse import urlparse from urllib.parse import urlparse
from enum import IntEnum from enum import IntEnum
@ -55,6 +56,7 @@ class SetupState(IntEnum):
DOWNLOADING = 5 DOWNLOADING = 5
DOWNLOAD_FAILED = 6 DOWNLOAD_FAILED = 6
CUSTOM_SOFTWARE_WARNING = 7 CUSTOM_SOFTWARE_WARNING = 7
INSTALLING = 8
class Setup(Widget): class Setup(Widget):
@ -66,10 +68,12 @@ class Setup(Widget):
self.wifi_connected = threading.Event() self.wifi_connected = threading.Event()
self.stop_network_check_thread = threading.Event() self.stop_network_check_thread = threading.Event()
self.failed_url = "" self.failed_url = ""
self.installing_progress = queue.Queue()
self.failed_reason = "" self.failed_reason = ""
self.download_url = "" self.download_url = ""
self.download_progress = 0 self.download_progress = 0
self.download_thread = None self.download_thread = None
self.install_thread = None
self.wifi_manager = WifiManagerWrapper() self.wifi_manager = WifiManagerWrapper()
self.wifi_ui = WifiManagerUI(self.wifi_manager) self.wifi_ui = WifiManagerUI(self.wifi_manager)
self.keyboard = Keyboard() self.keyboard = Keyboard()
@ -143,6 +147,8 @@ class Setup(Widget):
self.render_downloading(rect) self.render_downloading(rect)
elif self.state == SetupState.DOWNLOAD_FAILED: elif self.state == SetupState.DOWNLOAD_FAILED:
self.render_download_failed(rect) self.render_download_failed(rect)
elif self.state == SetupState.INSTALLING:
self.render_installing(rect)
def _low_voltage_continue_button_callback(self): def _low_voltage_continue_button_callback(self):
self.state = SetupState.GETTING_STARTED self.state = SetupState.GETTING_STARTED
@ -276,6 +282,15 @@ class Setup(Widget):
def render_downloading(self, rect: rl.Rectangle): def render_downloading(self, rect: rl.Rectangle):
self._downloading_body_label.render(rl.Rectangle(rect.x, rect.y + rect.height / 2 - TITLE_FONT_SIZE / 2, rect.width, TITLE_FONT_SIZE)) self._downloading_body_label.render(rl.Rectangle(rect.x, rect.y + rect.height / 2 - TITLE_FONT_SIZE / 2, rect.width, TITLE_FONT_SIZE))
def render_installing(self, rect: rl.Rectangle):
rl.draw_text_ex(gui_app.font(), "Finishing setup...", (150, 290), 110, 0, rl.WHITE)
bar = rl.Rectangle(150, 570, gui_app.width - 300, 72)
rl.draw_rectangle_rec(bar, rl.Color(41, 41, 41, 255))
progress = max(0, min(self.installing_progress.get(), 100))
bar.width *= (progress / 100.0)
rl.draw_rectangle_rec(bar, rl.Color(70, 91, 234, 255))
rl.draw_text_ex(gui_app.font(), f"{progress}%", (150, 670), 85, 0, rl.WHITE)
def render_download_failed(self, rect: rl.Rectangle): def render_download_failed(self, rect: rl.Rectangle):
self._download_failed_title_label.render(rl.Rectangle(rect.x + 117, rect.y + 185, rect.width - 117, TITLE_FONT_SIZE)) self._download_failed_title_label.render(rl.Rectangle(rect.x + 117, rect.y + 185, rect.width - 117, TITLE_FONT_SIZE))
self._download_failed_url_label.set_text(self.failed_url) self._download_failed_url_label.set_text(self.failed_url)
@ -317,30 +332,39 @@ class Setup(Widget):
def use_openpilot(self): def use_openpilot(self):
if os.path.isdir(CACHE_PATH): if os.path.isdir(CACHE_PATH):
self.state = SetupState.INSTALLING
self.install_thread = threading.Thread(target=self._install_thread, daemon=True)
self.install_thread.start()
else:
self.state = SetupState.NETWORK_SETUP
self.stop_network_check_thread.clear()
self.start_network_check()
def _install_thread(self):
self.installing_progress.put(0)
shutil.rmtree(TMP_INSTALL_PATH, ignore_errors=True) shutil.rmtree(TMP_INSTALL_PATH, ignore_errors=True)
shutil.rmtree(INSTALL_PATH, ignore_errors=True) shutil.rmtree(INSTALL_PATH, ignore_errors=True)
shutil.copytree(CACHE_PATH, TMP_INSTALL_PATH, symlinks=True) shutil.copytree(CACHE_PATH, TMP_INSTALL_PATH, symlinks=True)
self.installing_progress.put(20)
run_cmd(["git", "remote", "set-branches", "--add", "origin", BRANCH], TMP_INSTALL_PATH) run_cmd(["git", "remote", "set-branches", "--add", "origin", BRANCH], TMP_INSTALL_PATH)
run_cmd_default(["git", "update-ref", f"refs/remotes/origin/{BRANCH}", "refs/remotes/origin/release3-staging"], cwd=TMP_INSTALL_PATH) run_cmd_default(["git", "update-ref", f"refs/remotes/origin/{BRANCH}", "refs/remotes/origin/release3-staging"], cwd=TMP_INSTALL_PATH)
run_cmd(["git", "checkout", BRANCH], TMP_INSTALL_PATH) run_cmd(["git", "checkout", BRANCH], TMP_INSTALL_PATH)
self.installing_progress.put(50)
run_cmd(["git", "reset", "--hard", f"origin/{BRANCH}"], TMP_INSTALL_PATH) run_cmd(["git", "reset", "--hard", f"origin/{BRANCH}"], TMP_INSTALL_PATH)
run_cmd(["git", "submodule", "update", "--init"], TMP_INSTALL_PATH) run_cmd(["git", "submodule", "update", "--init"], TMP_INSTALL_PATH)
run_cmd(["git", "remote", "set-branches", "--add", "origin", BRANCH], TMP_INSTALL_PATH) run_cmd(["git", "remote", "set-branches", "--add", "origin", BRANCH], TMP_INSTALL_PATH)
shutil.move(TMP_INSTALL_PATH, INSTALL_PATH) shutil.move(TMP_INSTALL_PATH, INSTALL_PATH)
self.installing_progress.put(90)
with open(TMP_CONTINUE_PATH, "w") as f: with open(TMP_CONTINUE_PATH, "w") as f:
f.write(CONTINUE) f.write(CONTINUE)
run_cmd(["chmod", "+x", TMP_CONTINUE_PATH]) run_cmd(["chmod", "+x", TMP_CONTINUE_PATH])
shutil.move(TMP_CONTINUE_PATH, CONTINUE_PATH) shutil.move(TMP_CONTINUE_PATH, CONTINUE_PATH)
self.installing_progress.put(100)
gui_app.request_close() gui_app.request_close()
else:
self.state = SetupState.NETWORK_SETUP
self.stop_network_check_thread.clear()
self.start_network_check()
def download(self, url: str): def download(self, url: str):
# autocomplete incomplete URLs # autocomplete incomplete URLs

Loading…
Cancel
Save