IQ.Pilot Release Commit @ 27f668a

This commit is contained in:
IQ.Lvbs CI [bot]
2026-09-03 18:17:35 -05:00
parent 7745f48100
commit 1b2f28290b
69 changed files with 728 additions and 193 deletions

View File

@@ -6,13 +6,17 @@ from iqpilot.common.params import Params, UnknownKeyName
from iqpilot.selfdrive.longitudinal_settings import (
LONGITUDINAL_MODE_DYNAMIC,
LONGITUDINAL_MODE_PILOT,
LONGITUDINAL_MODE_STOCK,
PERSONALITY_VALUES,
apply_longitudinal_mode,
get_follow_distance_state,
get_longitudinal_mode,
longitudinal_mode_needs_cycle,
next_longitudinal_mode,
set_valid_personality,
)
from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigButton, BigMultiToggle, BigToggle, BigParamControl
from iqpilot.selfdrive.ui.ui_state import ui_state
from iqpilot.system.ui.lib.multilang import tr
@@ -138,24 +142,48 @@ class IQModeSelector(BigMultiToggle):
super().__init__(tr("IQ Mode"), self._display_options)
self._params = Params()
self._mode_callback = mode_callback
self._mode = LONGITUDINAL_MODE_STOCK
self._iq_modes_available = False
self.refresh()
self.set_enabled(lambda: self._next() != self._mode)
def _index(self) -> int:
return get_longitudinal_mode(self._params)
def is_dynamic(self) -> bool:
return self._index() == 2
return self._mode == LONGITUDINAL_MODE_DYNAMIC
def _toyota_factory_long_forced(self) -> bool:
cp = ui_state.CP
return bool(cp is not None and cp.brand == "toyota" and self._params.get_bool("IQToyotaFactoryLong"))
def _read_iq_modes_available(self) -> bool:
cp = ui_state.CP
alpha_available = bool(cp is not None and cp.alphaLongitudinalAvailable)
return alpha_available or self._params.get_bool("AlphaLongitudinalEnabled") or self._toyota_factory_long_forced()
def _next(self) -> int:
return next_longitudinal_mode(self._mode, ui_state.is_onroad(), self._iq_modes_available)
def refresh(self):
self.set_value(self._display_options[self._index()])
self._mode = self._index()
self._iq_modes_available = self._read_iq_modes_available()
self.set_value(self._display_options[self._mode])
def _apply(self, idx: int):
previous = self._mode
toyota_forced = self._toyota_factory_long_forced()
apply_longitudinal_mode(self._params, idx)
self._params.put_bool("OnroadCycleRequested", True)
if idx != LONGITUDINAL_MODE_STOCK and toyota_forced:
self._params.put_bool("IQToyotaFactoryLong", False)
if longitudinal_mode_needs_cycle(previous, idx) or (idx != LONGITUDINAL_MODE_STOCK and toyota_forced):
self._params.put_bool("OnroadCycleRequested", True)
def _handle_mouse_release(self, mouse_pos):
nxt = (self._index() + 1) % len(self.OPTIONS)
nxt = self._next()
if nxt == self._mode:
return
self._apply(nxt)
self.set_value(self._display_options[nxt])
self.refresh()
if self._mode_callback:
self._mode_callback()

View File

@@ -128,6 +128,8 @@ class ModelsLayoutMici(NavScroller):
self._big = BigButton(tr("big model"))
self._big.set_click_callback(self._show_big_models)
self._small_on_mac = BigParamControl(tr("active model on eMac"), "IQEmacSmallModel", toggle_callback=self._small_on_mac_toggled)
self._cancel = BigButton(tr("stop download"))
self._cancel.set_click_callback(self._cancel_model_request)
self._cancel.set_visible(self._is_downloading)
@@ -158,7 +160,8 @@ 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._big, self._cancel, self._supercombo, self._vision, self._policy, self._redownload, self._refresh, self._clear,
self._main_items = [self._current, self._big, self._small_on_mac, 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)
@@ -394,9 +397,28 @@ class ModelsLayoutMici(NavScroller):
except (TypeError, ValueError):
return None
def _small_on_mac_toggled(self, checked: bool) -> None:
p = ui_state.params
if checked:
p.put_bool("IQEmacEnabled", True)
else:
p.put_bool("IQEmacEnabled", bool(p.get("IQEmacModel")))
def _small_on_mac_value(self) -> str:
try:
active = self.model_manager.activeBundle
name = _display_model_name(active) if active and active.ref else ""
except Exception:
name = ""
return f"{name} ({tr('eMac')})" if name else tr("active model")
def _big_model_value(self) -> str:
p = ui_state.params
dock = bool(getattr(ui_state.sm["deviceState"], "egpuDockPresent", False))
if p.get_bool("IQEmacEnabled") and p.get_bool("IQEmacSmallModel"):
progress = self._big_setup_progress()
value = self._small_on_mac_value()
return f"{value} {int(progress * 100)}%" if progress is not None and progress < 1.0 else value
if not p.get_bool("IQEmacEnabled") and not dock:
return tr("Off")
key = p.get("IQEmacModel")
@@ -577,5 +599,5 @@ class ModelsLayoutMici(NavScroller):
def show_event(self):
super().show_event()
for w in (self._steer_delay, self._sw_delay, self._lane_turn, self._lane_speed):
for w in (self._steer_delay, self._sw_delay, self._lane_turn, self._lane_speed, self._small_on_mac):
w.refresh()