diff --git a/openpilot/selfdrive/ui/sunnypilot/layouts/settings/models.py b/openpilot/selfdrive/ui/sunnypilot/layouts/settings/models.py index 44f3451ba3..bb788509e1 100644 --- a/openpilot/selfdrive/ui/sunnypilot/layouts/settings/models.py +++ b/openpilot/selfdrive/ui/sunnypilot/layouts/settings/models.py @@ -10,11 +10,10 @@ import time import pyray as rl from openpilot.cereal import custom -from openpilot.sunnypilot.models.fetcher import ModelFetcher, get_cached_bundles from openpilot.sunnypilot.models.helpers import ACTIVE_BUNDLE_KEYS, get_selected_bundle, resolve_bundle_by_ref from openpilot.common.constants import CV from openpilot.selfdrive.ui.ui_state import device, ui_state -from openpilot.selfdrive.ui.sunnypilot.model_info import model_info +from openpilot.selfdrive.ui.sunnypilot.model_info import active_source, bundles_for_source, model_info from openpilot.system.ui.lib.multilang import tr from openpilot.system.ui.lib.application import gui_app from openpilot.system.ui.widgets import DialogResult, Widget @@ -207,12 +206,7 @@ class ModelsLayout(Widget): ui_state.params.put("ModelManager_DownloadRef", selected_bundle.ref) def _resolve_selected_bundle(self, ref): - """Finds the bundle for a ref across both hardware manifests.""" - active = ModelFetcher.active_source(ui_state.sm["deviceState"].chestnutPresent) - source_bundles = { - source: self.model_manager.availableBundles if source == active else get_cached_bundles(ui_state.params, source) - for source in ("qcom", "usbgpu") - } + source_bundles = {source: bundles_for_source(source) for source in ("qcom", "usbgpu")} resolved = resolve_bundle_by_ref(ref, source_bundles) return resolved[0] if resolved else None @@ -236,11 +230,10 @@ class ModelsLayout(Widget): return folders_list def _handle_current_model_clicked(self): - self._open_source_dialog(ModelFetcher.active_source(ui_state.sm["deviceState"].chestnutPresent)) + self._open_source_dialog(active_source()) def _handle_other_model_clicked(self): - active = ModelFetcher.active_source(ui_state.sm["deviceState"].chestnutPresent) - self._open_source_dialog("qcom" if active == "usbgpu" else "usbgpu") + self._open_source_dialog("qcom" if active_source() == "usbgpu" else "usbgpu") def _open_source_dialog(self, source): """Opens the picker for one hardware: its model folders plus the Default reset entry.""" @@ -256,9 +249,7 @@ class ModelsLayout(Widget): gui_app.push_widget(self.model_dialog) def _source_folders(self, favorites, source): - """Default reset entry on top, then the hardware's model folders.""" - active = ModelFetcher.active_source(ui_state.sm["deviceState"].chestnutPresent) - bundles = self.model_manager.availableBundles if source == active else get_cached_bundles(ui_state.params, source) + bundles = bundles_for_source(source) if not bundles: return [] folders_list = [TreeFolder("", [TreeNode("Default", {'display_name': "Default"})])] diff --git a/openpilot/selfdrive/ui/sunnypilot/mici/layouts/models.py b/openpilot/selfdrive/ui/sunnypilot/mici/layouts/models.py index 4d456bdb76..e6a9b17a09 100644 --- a/openpilot/selfdrive/ui/sunnypilot/mici/layouts/models.py +++ b/openpilot/selfdrive/ui/sunnypilot/mici/layouts/models.py @@ -8,11 +8,10 @@ import pyray as rl from openpilot.cereal import custom from openpilot.selfdrive.ui.mici.widgets.dialog import BigDialog -from openpilot.sunnypilot.models.fetcher import ModelFetcher, get_cached_bundles from openpilot.sunnypilot.models.helpers import ACTIVE_BUNDLE_KEYS from openpilot.selfdrive.ui.mici.widgets.button import BigButton from openpilot.selfdrive.ui.ui_state import ui_state, device -from openpilot.selfdrive.ui.sunnypilot.model_info import model_info +from openpilot.selfdrive.ui.sunnypilot.model_info import bundles_for_source, model_info from openpilot.system.ui.lib.application import FontWeight, gui_app from openpilot.system.ui.lib.multilang import tr from openpilot.system.ui.widgets import Widget @@ -111,16 +110,12 @@ class ModelsLayoutMici(NavScroller): favs = ui_state.params.get("ModelManager_Favs") favorites = set(favs.split(';')) if favs else set() - active = ModelFetcher.active_source(ui_state.sm["deviceState"].chestnutPresent) - if source != active: - bundles = get_cached_bundles(ui_state.params, source) - if not bundles: - gui_app.push_widget(BigDialog(title=tr("No models available"), - description=tr("No models are available for this hardware yet. Connect to the internet and refresh the model list."))) - return - else: - bundles = self.model_manager.availableBundles + bundles = bundles_for_source(source) + if not bundles: + gui_app.push_widget(BigDialog(title=tr("No models available"), + description=tr("No models are available for this hardware yet. Connect to the internet and refresh the model list."))) + return folders = self._get_grouped_bundles(bundles, favorites) folder_buttons = [] @@ -155,13 +150,8 @@ class ModelsLayoutMici(NavScroller): return favs = ui_state.params.get("ModelManager_Favs") favorites = set(favs.split(';')) if favs else set() - active = ModelFetcher.active_source(ui_state.sm["deviceState"].chestnutPresent) - if source != active: - bundles = get_cached_bundles(ui_state.params, source) - else: - bundles = self.model_manager.availableBundles - folders = self._get_grouped_bundles(bundles, favorites) + folders = self._get_grouped_bundles(bundles_for_source(source), favorites) bundles = sorted(folders.get(folder_name, []), key=lambda b: b.index, reverse=True) btns = [] diff --git a/openpilot/selfdrive/ui/sunnypilot/model_info.py b/openpilot/selfdrive/ui/sunnypilot/model_info.py index 5222ef70c6..ce0d1cdf79 100644 --- a/openpilot/selfdrive/ui/sunnypilot/model_info.py +++ b/openpilot/selfdrive/ui/sunnypilot/model_info.py @@ -5,15 +5,26 @@ This file is part of sunnypilot and is licensed under the MIT License. See the LICENSE.md file in the root directory for more details. """ from openpilot.selfdrive.ui.ui_state import ui_state +from openpilot.sunnypilot.models.fetcher import get_cached_bundles from openpilot.sunnypilot.models.helpers import get_active_source, get_selected_bundle from openpilot.sunnypilot.models.model_name import DEFAULT_BIG_MODEL, DEFAULT_MODEL +def active_source() -> str: + return get_active_source(usbgpu=ui_state.usbgpu, + usbgpu_active=ui_state.usbgpu_active, usbgpu_loading=ui_state.usbgpu_loading, + offroad=ui_state.is_offroad()) + + +def bundles_for_source(source: str): + if source == active_source(): + return ui_state.sm["modelManagerSP"].availableBundles + return get_cached_bundles(ui_state.params, source) + + def model_info() -> tuple[str, str, str]: """returns (active source, active model name, other model name)""" - source = get_active_source(usbgpu=ui_state.usbgpu, - usbgpu_active=ui_state.usbgpu_active, usbgpu_loading=ui_state.usbgpu_loading, - offroad=ui_state.is_offroad()) + source = active_source() other = "qcom" if source == "usbgpu" else "usbgpu" active_bundle = get_selected_bundle(ui_state.params, source) other_bundle = get_selected_bundle(ui_state.params, other)