move spinner to thread

pull/35003/head
deanlee 1 month ago
parent 1095ff47dd
commit 805ee4d999
  1. 82
      system/athena/registration.py

@ -2,9 +2,9 @@
import time import time
import json import json
import jwt import jwt
import pyray as rl
from pathlib import Path from pathlib import Path
from concurrent.futures import ThreadPoolExecutor import threading
import pyray as rl
from datetime import datetime, timedelta, UTC from datetime import datetime, timedelta, UTC
from openpilot.common.api import api_get from openpilot.common.api import api_get
@ -12,32 +12,30 @@ from openpilot.common.params import Params
from openpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert from openpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert
from openpilot.system.hardware import HARDWARE, PC from openpilot.system.hardware import HARDWARE, PC
from openpilot.system.hardware.hw import Paths from openpilot.system.hardware.hw import Paths
from openpilot.system.ui.lib.application import gui_app
from openpilot.system.ui.spinner import Spinner
from openpilot.common.swaglog import cloudlog 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" UNREGISTERED_DONGLE_ID = "UnregisteredDevice"
spinner: Spinner | None = None
def is_registered_device() -> bool: def is_registered_device() -> bool:
dongle = Params().get("DongleId", encoding='utf-8') dongle = Params().get("DongleId", encoding='utf-8')
return dongle not in (None, UNREGISTERED_DONGLE_ID) return dongle not in (None, UNREGISTERED_DONGLE_ID)
def _get_dongle_id() -> str | None: def _show_spinner_window(end_evt: threading.Event):
dongle_id: str | None = Params().get("DongleId", encoding='utf8') global spinner
if dongle_id is None and Path(Paths.persist_root()+"/comma/dongle_id").is_file(): gui_app.init_window("registering device")
# not all devices will have this; added early in comma 3X production (2/28/24) spinner = Spinner()
with open(Paths.persist_root()+"/comma/dongle_id") as f: while not end_evt.is_set():
dongle_id = f.read().strip() rl.begin_drawing()
rl.clear_background(rl.BLACK)
pubkey = Path(Paths.persist_root()+"/comma/id_rsa.pub") spinner.render()
if not pubkey.is_file(): rl.end_drawing()
dongle_id = UNREGISTERED_DONGLE_ID gui_app.close()
cloudlog.warning(f"missing public key: {pubkey}")
return dongle_id
def do_register(spinner = None, done_event=None) -> str | None: def register(show_spinner=False) -> str | None:
""" """
All devices built since March 2024 come with all All devices built since March 2024 come with all
info stored in /persist/. This is kept around info stored in /persist/. This is kept around
@ -47,6 +45,26 @@ def do_register(spinner = None, done_event=None) -> str | None:
of dongle ID to some endpoints, this can be removed of dongle ID to some endpoints, this can be removed
entirely. entirely.
""" """
params = Params()
dongle_id: str | None = params.get("DongleId", encoding='utf8')
if dongle_id is None and Path(Paths.persist_root()+"/comma/dongle_id").is_file():
# not all devices will have this; added early in comma 3X production (2/28/24)
with open(Paths.persist_root()+"/comma/dongle_id") as f:
dongle_id = f.read().strip()
pubkey = Path(Paths.persist_root()+"/comma/id_rsa.pub")
if not pubkey.is_file():
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()
# Create registration token, in the future, this key will make JWTs directly # 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: with open(Paths.persist_root()+"/comma/id_rsa.pub") as f1, open(Paths.persist_root()+"/comma/id_rsa") as f2:
public_key = f1.read() public_key = f1.read()
@ -67,7 +85,6 @@ def do_register(spinner = None, done_event=None) -> str | None:
if time.monotonic() - start_time > 60 and spinner: if time.monotonic() - start_time > 60 and spinner:
spinner.set_text(f"registering device - serial: {serial}, IMEI: ({imei1}, {imei2})") spinner.set_text(f"registering device - serial: {serial}, IMEI: ({imei1}, {imei2})")
dongle_id = None
backoff = 0 backoff = 0
start_time = time.monotonic() start_time = time.monotonic()
while True: while True:
@ -92,29 +109,12 @@ def do_register(spinner = None, done_event=None) -> str | None:
if time.monotonic() - start_time > 60 and spinner: if time.monotonic() - start_time > 60 and spinner:
spinner.set_text(f"registering device - serial: {serial}, IMEI: ({imei1}, {imei2})") spinner.set_text(f"registering device - serial: {serial}, IMEI: ({imei1}, {imei2})")
return dongle_id if spinner_thread:
end_evt.set()
def register(show_spinner=False) -> str | None: spinner_thread.join()
dongle_id = _get_dongle_id()
if not dongle_id:
if show_spinner:
with ThreadPoolExecutor(max_workers=1) as executor:
gui_app.init_window("Register")
spinner = Spinner()
spinner.set_text("registering device")
future = executor.submit(do_register, spinner)
while not future.done():
rl.begin_drawing()
rl.clear_background(rl.BLACK)
spinner.render()
rl.end_drawing()
gui_app.close()
dongle_id = future.result()
else:
dongle_id = do_register()
if dongle_id: if dongle_id:
Params().put("DongleId", dongle_id) params.put("DongleId", dongle_id)
set_offroad_alert("Offroad_UnofficialHardware", (dongle_id == UNREGISTERED_DONGLE_ID) and not PC) set_offroad_alert("Offroad_UnofficialHardware", (dongle_id == UNREGISTERED_DONGLE_ID) and not PC)
return dongle_id return dongle_id

Loading…
Cancel
Save