From a29810ec837988b87a127b51d3d85885545cce97 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Wed, 16 Apr 2025 16:19:51 +0100 Subject: [PATCH] revert changes to consumers --- system/athena/registration.py | 38 ++++++----------------- system/manager/build.py | 57 +++++++++++++---------------------- system/manager/manager.py | 5 +-- 3 files changed, 34 insertions(+), 66 deletions(-) diff --git a/system/athena/registration.py b/system/athena/registration.py index 435fe8086a..964fbff51e 100755 --- a/system/athena/registration.py +++ b/system/athena/registration.py @@ -3,37 +3,23 @@ import time import json import jwt from pathlib import Path -import threading -import pyray as rl from datetime import datetime, timedelta, UTC from openpilot.common.api import api_get from openpilot.common.params import Params +from openpilot.common.spinner import Spinner from openpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert from openpilot.system.hardware import HARDWARE, PC from openpilot.system.hardware.hw import Paths from openpilot.common.swaglog import cloudlog -from openpilot.system.ui.spinner import Spinner -from openpilot.system.ui.lib.application import gui_app -UNREGISTERED_DONGLE_ID = "UnregisteredDevice" -spinner: Spinner | None = None +UNREGISTERED_DONGLE_ID = "UnregisteredDevice" def is_registered_device() -> bool: dongle = Params().get("DongleId", encoding='utf-8') return dongle not in (None, UNREGISTERED_DONGLE_ID) -def _show_spinner_window(end_evt: threading.Event): - global spinner - gui_app.init_window("registering device") - spinner = Spinner() - while not end_evt.is_set(): - rl.begin_drawing() - rl.clear_background(rl.BLACK) - spinner.render() - rl.end_drawing() - gui_app.close() def register(show_spinner=False) -> str | None: """ @@ -58,12 +44,9 @@ def register(show_spinner=False) -> str | None: dongle_id = UNREGISTERED_DONGLE_ID cloudlog.warning(f"missing public key: {pubkey}") elif dongle_id is None: - global spinner - spinner_thread = None if show_spinner: - end_evt = threading.Event() - spinner_thread = threading.Thread(target=_show_spinner_window, args=(end_evt,)) - spinner_thread.start() + spinner = Spinner() + spinner.update("registering device") # Create registration token, in the future, this key will make JWTs directly with open(Paths.persist_root()+"/comma/id_rsa.pub") as f1, open(Paths.persist_root()+"/comma/id_rsa") as f2: @@ -82,8 +65,8 @@ def register(show_spinner=False) -> str | None: cloudlog.exception("Error getting imei, trying again...") time.sleep(1) - if time.monotonic() - start_time > 60 and spinner: - spinner.set_text(f"registering device - serial: {serial}, IMEI: ({imei1}, {imei2})") + if time.monotonic() - start_time > 60 and show_spinner: + spinner.update(f"registering device - serial: {serial}, IMEI: ({imei1}, {imei2})") backoff = 0 start_time = time.monotonic() @@ -106,12 +89,11 @@ def register(show_spinner=False) -> str | None: backoff = min(backoff + 1, 15) time.sleep(backoff) - if time.monotonic() - start_time > 60 and spinner: - spinner.set_text(f"registering device - serial: {serial}, IMEI: ({imei1}, {imei2})") + if time.monotonic() - start_time > 60 and show_spinner: + spinner.update(f"registering device - serial: {serial}, IMEI: ({imei1}, {imei2})") - if spinner_thread: - end_evt.set() - spinner_thread.join() + if show_spinner: + spinner.close() if dongle_id: params.put("DongleId", dongle_id) diff --git a/system/manager/build.py b/system/manager/build.py index ad86a86f76..93c0546c85 100755 --- a/system/manager/build.py +++ b/system/manager/build.py @@ -1,18 +1,15 @@ #!/usr/bin/env python3 import os import subprocess -import select from pathlib import Path -import pyray as rl # NOTE: Do NOT import anything here that needs be built (e.g. params) from openpilot.common.basedir import BASEDIR +from openpilot.common.spinner import Spinner +from openpilot.common.text_window import TextWindow from openpilot.system.hardware import HARDWARE, AGNOS from openpilot.common.swaglog import cloudlog, add_file_handler from openpilot.system.version import get_build_metadata -from openpilot.system.ui.lib.application import gui_app -from openpilot.system.ui.spinner import Spinner -from openpilot.system.ui.text import TextWindow MAX_CACHE_SIZE = 4e9 if "CI" in os.environ else 2e9 CACHE_DIR = Path("/data/scons_cache" if AGNOS else "/tmp/scons_cache") @@ -20,50 +17,39 @@ CACHE_DIR = Path("/data/scons_cache" if AGNOS else "/tmp/scons_cache") TOTAL_SCONS_NODES = 3130 MAX_BUILD_PROGRESS = 100 -def build(dirty: bool = False, minimal: bool = False) -> None: +def build(spinner: Spinner, dirty: bool = False, minimal: bool = False) -> None: env = os.environ.copy() env['SCONS_PROGRESS'] = "1" - nproc = os.cpu_count() or 2 + nproc = os.cpu_count() + if nproc is None: + nproc = 2 extra_args = ["--minimal"] if minimal else [] - CI = os.getenv("CI") is not None + if AGNOS: HARDWARE.set_power_save(False) os.sched_setaffinity(0, range(8)) # ensure we can use the isolcpus cores # building with all cores can result in using too # much memory, so retry with less parallelism - if not CI: - gui_app.init_window("Spinner") - spinner = Spinner() compile_output: list[bytes] = [] for n in (nproc, nproc/2, 1): compile_output.clear() scons: subprocess.Popen = subprocess.Popen(["scons", f"-j{int(n)}", "--cache-populate", *extra_args], cwd=BASEDIR, env=env, stderr=subprocess.PIPE) assert scons.stderr is not None - os.set_blocking(scons.stderr.fileno(), False) # Non-blocking reads # Read progress from stderr and update spinner - if not CI: - spinner.set_text("0") while scons.poll() is None: try: - if not CI: - rl.begin_drawing() - rl.clear_background(rl.BLACK) - spinner.render() - rl.end_drawing() - - if scons.stderr in select.select([scons.stderr], [], [], 0.02)[0]: - line = scons.stderr.readline() - if not line: - continue + line = scons.stderr.readline() + if line is None: + continue line = line.rstrip() + prefix = b'progress: ' if line.startswith(prefix): - if not CI: - i = int(line[len(prefix):]) - spinner.set_text(str(int(MAX_BUILD_PROGRESS * min(1., i / TOTAL_SCONS_NODES)))) + i = int(line[len(prefix):]) + spinner.update_progress(MAX_BUILD_PROGRESS * min(1., i / TOTAL_SCONS_NODES), 100.) elif len(line): compile_output.append(line) print(line.decode('utf8', 'replace')) @@ -76,7 +62,7 @@ def build(dirty: bool = False, minimal: bool = False) -> None: if scons.returncode != 0: # Read remaining output if scons.stderr is not None: - compile_output += [line for line in scons.stderr.read().split(b'\n') if not line.startswith(b'progress')] + compile_output += scons.stderr.read().split(b'\n') # Build failed log errors error_s = b"\n".join(compile_output).decode('utf8', 'replace') @@ -84,13 +70,10 @@ def build(dirty: bool = False, minimal: bool = False) -> None: cloudlog.error("scons build failed\n" + error_s) # Show TextWindow - if not CI: - text_window = TextWindow("openpilot failed to build\n \n" + error_s) - while True: - rl.begin_drawing() - rl.clear_background(rl.BLACK) - text_window.render() - rl.end_drawing() + spinner.close() + if not os.getenv("CI"): + with TextWindow("openpilot failed to build\n \n" + error_s) as t: + t.wait_for_exit() exit(1) # enforce max cache size @@ -105,5 +88,7 @@ def build(dirty: bool = False, minimal: bool = False) -> None: if __name__ == "__main__": + spinner = Spinner() + spinner.update_progress(0, 100) build_metadata = get_build_metadata() - build(build_metadata.openpilot.is_dirty, minimal = AGNOS) + build(spinner, build_metadata.openpilot.is_dirty, minimal = AGNOS) diff --git a/system/manager/manager.py b/system/manager/manager.py index 2e0791b886..89e5a472f2 100755 --- a/system/manager/manager.py +++ b/system/manager/manager.py @@ -9,6 +9,7 @@ from cereal import log import cereal.messaging as messaging import openpilot.system.sentry as sentry from openpilot.common.params import Params, ParamKeyType +from openpilot.common.text_window import TextWindow from openpilot.system.hardware import HARDWARE from openpilot.system.manager.helpers import unblock_stdout, write_onroad_params, save_bootlog from openpilot.system.manager.process import ensure_running @@ -17,7 +18,6 @@ from openpilot.system.athena.registration import register, UNREGISTERED_DONGLE_I from openpilot.common.swaglog import cloudlog, add_file_handler from openpilot.system.version import get_build_metadata, terms_version, training_version from openpilot.system.hardware.hw import Paths -from openpilot.system.ui.text import show_text_in_window def manager_init() -> None: @@ -221,7 +221,8 @@ if __name__ == "__main__": # Show last 3 lines of traceback error = traceback.format_exc(-3) error = "Manager failed to start\n\n" + error - show_text_in_window(error) + with TextWindow(error) as t: + t.wait_for_exit() raise