IQ.Pilot Release Commit @ 763bad7

This commit is contained in:
IQ.Lvbs CI [bot]
2026-08-29 19:58:49 -05:00
parent ee1dca77c7
commit 99807e037f
41 changed files with 876 additions and 57 deletions

View File

@@ -104,6 +104,16 @@ class MiciHomeLayout(Widget):
self._iqstandard_txt = gui_app.texture("icons_mici/iqstandard_mode_mici.png", 48, 48)
self._mode_txt = None
self._mic_txt = gui_app.texture("icons_mici/microphone.png", 32, 46)
self._egpu_txt = gui_app.texture("icons_mici/egpu.png", 62, 46)
self._egpu_green_txt = gui_app.texture("icons_mici/egpu_green.png", 62, 46)
self._egpu_orange_txt = gui_app.texture("icons_mici/egpu_orange.png", 78, 46)
self._mac_txt = gui_app.texture("icons_mici/mac.png", 62, 46)
self._mac_green_txt = gui_app.texture("icons_mici/mac_green.png", 62, 46)
self._mac_orange_txt = gui_app.texture("icons_mici/mac_orange.png", 78, 46)
self._egpu_state: str | None = None
self._mac_state: str | None = None
self._egpu_progress = 0.0
self._mac_progress = 0.0
self._net_type = NETWORK_TYPES.get(NetworkType.none)
self._net_strength = 0
@@ -176,6 +186,37 @@ class MiciHomeLayout(Widget):
self._version_text = self._get_version_text()
self._last_refresh = rl.get_time()
self._update_params()
self._update_dock_status()
def _update_dock_status(self):
p = ui_state.params
egpu_present = bool(getattr(ui_state.sm['deviceState'], "egpuDockPresent", False))
if not egpu_present:
self._egpu_state = None
elif any(p.get_bool(k) for k in ("Offroad_EgpuPcieUnavailable", "Offroad_EgpuOverheated",
"Offroad_EgpuFansObstructed", "Offroad_EgpuUpdateFailed",
"Offroad_EgpuNotDetected")):
self._egpu_state = "orange"
elif p.get_bool("UsbGpuLoading") and not p.get_bool("UsbGpuCompiled"):
self._egpu_state = "compiling"
try:
self._egpu_progress = max(0.0, min(1.0, float(p.get("UsbGpuSetupProgress") or 0.0)))
except (TypeError, ValueError):
self._egpu_progress = 0.0
elif p.get_bool("Offroad_EgpuUsbSlow") or p.get_bool("Offroad_EgpuUncompiled"):
self._egpu_state = "grey"
else:
self._egpu_state = "green"
mac_present = p.get_bool("MacModelPresent") or p.get_bool("MacModelReachable")
if not mac_present:
self._mac_state = None
elif p.get_bool("MacModelFault"):
self._mac_state = "orange"
elif p.get_bool("MacModelReady") or p.get_bool("MacModelActive"):
self._mac_state = "green"
else:
self._mac_state = "grey"
def _update_network_status(self, device_state):
self._net_type = device_state.networkType
@@ -330,6 +371,33 @@ class MiciHomeLayout(Widget):
int(self._rect.y + self.rect.height - self._mic_txt.height / 2 - Y_CENTER), rl.Color(255, 255, 255, 255))
last_x += self._mic_txt.width + ITEM_SPACING
for state, base, green, orange, progress in (
(self._egpu_state, self._egpu_txt, self._egpu_green_txt, self._egpu_orange_txt, self._egpu_progress),
(self._mac_state, self._mac_txt, self._mac_green_txt, self._mac_orange_txt, self._mac_progress)):
if state is None:
continue
y_top = int(self._rect.y + self.rect.height - base.height / 2 - Y_CENTER)
if state == "compiling":
self._draw_compile_gauge(int(last_x), y_top, base, green, progress)
last_x += base.width + ITEM_SPACING
continue
if state == "green":
tex, tint = green, rl.Color(255, 255, 255, 255)
elif state == "orange":
tex, tint = orange, rl.Color(255, 255, 255, 255)
else:
tex, tint = base, rl.Color(165, 165, 170, 235)
rl.draw_texture(tex, int(last_x), y_top, tint)
last_x += tex.width + ITEM_SPACING
def _draw_compile_gauge(self, x: int, y_top: int, base, fill, progress: float):
rl.draw_texture(base, x, y_top, rl.Color(165, 165, 170, 235))
fill_h = int(base.height * max(0.0, min(1.0, progress)))
if fill_h > 0:
rl.begin_scissor_mode(x, y_top + base.height - fill_h, base.width, fill_h)
rl.draw_texture(fill, x, y_top, rl.Color(255, 255, 255, 255))
rl.end_scissor_mode()
def _draw_cellular_cluster(self, start_x: float, spacing: int, y_center: int, connected: bool) -> float:
draw_net_txt = {0: self._cell_none_txt,
2: self._cell_low_txt,

View File

@@ -4,6 +4,7 @@ Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed
import os
import re
import threading
import time
import pyray as rl
@@ -38,6 +39,31 @@ def _display_model_name(bundle) -> str:
return bundle.internalName if getattr(bundle, "internalName", "") else bundle.displayName
def _big_options() -> list[tuple[str, str]]:
try:
from iqpilot.selfdrive.iqmodeld.emac_model_meta import big_models
return big_models(ui_state.params)
except Exception:
return []
def _big_label(key: str) -> str:
for name, display in _big_options():
if name == key:
return display
return key or "lebrowski"
def _refresh_big_catalog() -> None:
def worker():
try:
from iqpilot.selfdrive.iqmodeld.emac_model_meta import refresh_catalog
refresh_catalog(ui_state.params)
except Exception:
pass
threading.Thread(target=worker, daemon=True).start()
class _ModelSelectPanel(NavScroller):
"""A throwaway scroller panel (folder list or bundle list) pushed onto the nav stack."""
def __init__(self, items):
@@ -99,6 +125,9 @@ class ModelsLayoutMici(NavScroller):
self._current = BigButton(tr("active model"))
self._current.set_click_callback(self._show_folders)
self._big = BigButton(tr("big model"))
self._big.set_click_callback(self._show_big_models)
self._cancel = BigButton(tr("stop download"))
self._cancel.set_click_callback(self._cancel_model_request)
self._cancel.set_visible(self._is_downloading)
@@ -129,7 +158,7 @@ class ModelsLayoutMici(NavScroller):
self._lane_speed = MappedParamToggle(tr("lane turn speed"), "IQLaneTurnValue", [tr("slow"), tr("normal"), tr("fast")], _LANE_TURN_VALUES)
self._lane_speed.set_visible(lambda: self._lane_turn._checked)
self._main_items = [self._current, self._cancel, self._supercombo, self._vision, self._policy, self._redownload, self._refresh, self._clear,
self._main_items = [self._current, self._big, self._cancel, self._supercombo, self._vision, self._policy, self._redownload, self._refresh, self._clear,
self._steer_delay, self._sw_delay, self._lane_turn, self._lane_speed]
self._scroller.add_widgets(self._main_items)
@@ -326,6 +355,55 @@ class ModelsLayoutMici(NavScroller):
btns = [_ModelButton(b, self._select_model, self._toggle_favorite, b.ref in favorites) for b in bundles]
gui_app.push_widget(_ModelSelectPanel(btns))
def _show_big_models(self):
options = _big_options()
if len(options) <= 1:
_refresh_big_catalog()
off = BigButton(tr("Off"))
off.set_click_callback(lambda: self._select_big(None))
btns = [off]
for key, display in options:
btn = BigButton(display)
btn.set_click_callback(lambda k=key: self._select_big(k))
btns.append(btn)
gui_app.push_widget(_ModelSelectPanel(btns))
def _select_big(self, key):
if key is None:
ui_state.params.put_bool("IQEmacEnabled", False)
else:
ui_state.params.put("IQEmacModel", key)
ui_state.params.put_bool("IQEmacEnabled", True)
gui_app.pop_widgets_to(self)
def _big_setup_progress(self) -> float | None:
p = ui_state.params
if p.get_bool("IQEmacEnabled"):
raw = p.get("MacModelDownloadProgress")
loading = not p.get_bool("MacModelReady")
else:
raw = p.get("UsbGpuSetupProgress")
loading = p.get_bool("UsbGpuLoading") and not p.get_bool("UsbGpuCompiled")
if not loading:
return None
try:
return max(0.0, min(1.0, float(raw)))
except (TypeError, ValueError):
return None
def _big_model_value(self) -> str:
p = ui_state.params
dock = bool(getattr(ui_state.sm["deviceState"], "egpuDockPresent", False))
if not p.get_bool("IQEmacEnabled") and not dock:
return tr("Off")
key = p.get("IQEmacModel")
key = key.decode() if isinstance(key, bytes) else (key or "")
label = _big_label(key)
progress = self._big_setup_progress()
if progress is not None and progress < 1.0:
return f"{label} {int(progress * 100)}%"
return label
def _generation_changed(self, bundle) -> bool:
try:
active = self.model_manager.activeBundle
@@ -360,6 +438,7 @@ class ModelsLayoutMici(NavScroller):
self._handle_bundle_download_progress()
self._current.set_value(self._current_model_value())
self._current.set_enabled(ui_state.is_offroad())
self._big.set_value(self._big_model_value())
target = self._redownload_target_bundle()
self._redownload.set_value(_display_model_name(target) if target else "")