Compare commits

..

22 Commits

Author SHA1 Message Date
James Vecellio-Grant
3d63ed8cd6 Delete tools/profile_params.py 2026-01-05 07:58:24 -08:00
discountchubbs
debe933d79 how'd that get pushed down on git merge so nasty 2026-01-05 07:56:23 -08:00
discountchubbs
ebdfc60cb5 Merge remote-tracking branch 'origin/paramwatcher' into watcher
# Conflicts:
#	selfdrive/ui/sunnypilot/layouts/settings/settings.py
#	selfdrive/ui/sunnypilot/ui_state.py
2026-01-05 07:00:49 -08:00
James Vecellio-Grant
72bc73d4fe Merge branch 'paramwatcher' into watcher 2025-12-13 07:17:49 -08:00
James Vecellio-Grant
6e06bcb14f Merge branch 'paramwatcher' into watcher 2025-12-11 06:54:40 -08:00
discountchubbs
b737989e64 not needed 2025-12-08 05:54:50 -08:00
James Vecellio-Grant
5fbc358fd5 Merge branch 'paramwatcher' into watcher 2025-12-08 05:54:18 -08:00
James Vecellio
fdde1aa6a1 this is hindsight 2025-12-07 19:26:36 -08:00
discountchubbs
961b2a2d30 drive back the darkness 2025-12-07 18:20:50 -08:00
discountchubbs
f3d39d481a wat 2025-12-07 17:13:58 -08:00
James Vecellio-Grant
6e037d80ff Merge branch 'paramwatcher' into watcher 2025-12-07 17:13:06 -08:00
James Vecellio-Grant
b3ff268f89 Merge branch 'paramwatcher' into watcher 2025-12-07 14:05:37 -08:00
James Vecellio-Grant
5901c9b41f Merge branch 'paramwatcher' into watcher 2025-12-07 11:45:20 -08:00
discountchubbs
18f8956e0e params 2025-12-07 11:23:49 -08:00
discountchubbs
0aa6f22c26 watch 2025-12-07 11:15:58 -08:00
James Vecellio-Grant
c90f262ce7 Merge branch 'paramwatcher' into watcher 2025-12-07 11:08:48 -08:00
discountchubbs
4a189f828a oopsie 2025-12-07 10:13:36 -08:00
James Vecellio-Grant
072e18faef Merge branch 'paramwatcher' into watcher 2025-12-07 10:12:56 -08:00
discountchubbs
34e02b6ae5 Revert "Merge remote-tracking branch 'origin/paramwatcher' into watcher"
This reverts commit c98cc5d40a, reversing
changes made to 4a0d8063e5.
2025-12-07 10:03:04 -08:00
discountchubbs
c98cc5d40a Merge remote-tracking branch 'origin/paramwatcher' into watcher 2025-12-07 10:02:55 -08:00
discountchubbs
4a0d8063e5 Merge remote-tracking branch 'origin/paramwatcher' into watcher 2025-12-07 10:02:41 -08:00
James Vecellio-Grant
483894cfc8 Merge branch 'master' into watcher 2025-12-07 09:59:04 -08:00
11 changed files with 84 additions and 18 deletions

View File

@@ -1,4 +1,3 @@
from openpilot.common.params import Params
from openpilot.selfdrive.ui.widgets.ssh_key import ssh_key_item
from openpilot.selfdrive.ui.ui_state import ui_state
from openpilot.system.ui.widgets import Widget
@@ -35,7 +34,7 @@ DESCRIPTIONS = {
class DeveloperLayout(Widget):
def __init__(self):
super().__init__()
self._params = Params()
self._params = ui_state.params
self._is_release = self._params.get_bool("IsReleaseBranch")
# Build items and keep references for callbacks/state updates

View File

@@ -3,7 +3,6 @@ import math
from cereal import messaging, log
from openpilot.common.basedir import BASEDIR
from openpilot.common.params import Params
from openpilot.common.swaglog import cloudlog
from openpilot.selfdrive.ui.onroad.driver_camera_dialog import DriverCameraDialog
from openpilot.selfdrive.ui.ui_state import ui_state
@@ -35,7 +34,7 @@ class DeviceLayout(Widget):
def __init__(self):
super().__init__()
self._params = Params()
self._params = ui_state.params
self._select_language_dialog: MultiOptionDialog | None = None
self._driver_camera: DriverCameraDialog | None = None
self._pair_device_dialog: PairingDialog | None = None

View File

@@ -1,5 +1,5 @@
from cereal import log
from openpilot.common.params import Params, UnknownKeyName
from openpilot.common.params import UnknownKeyName
from openpilot.system.ui.widgets import Widget
from openpilot.system.ui.widgets.list_view import multiple_button_item, toggle_item
from openpilot.system.ui.widgets.scroller_tici import Scroller
@@ -41,7 +41,7 @@ DESCRIPTIONS = {
class TogglesLayout(Widget):
def __init__(self):
super().__init__()
self._params = Params()
self._params = ui_state.params
self._is_release = self._params.get_bool("IsReleaseBranch")
# param, title, desc, icon, needs_restart
@@ -198,11 +198,6 @@ class TogglesLayout(Widget):
self._update_experimental_mode_icon()
# TODO: make a param control list item so we don't need to manage internal state as much here
# refresh toggles from params to mirror external changes
for param in self._toggle_defs:
self._toggles[param].action_item.set_state(self._params.get_bool(param))
# these toggles need restart, block while engaged
for toggle_def in self._toggle_defs:
if self._toggle_defs[toggle_def][3] and toggle_def not in self._locked_toggles:

View File

@@ -226,9 +226,7 @@ class ModelsLayout(Widget):
turn_desire: bool = ui_state.params.get_bool("LaneTurnDesire")
live_delay: bool = ui_state.params.get_bool("LagdToggle")
self.lane_turn_desire_toggle.action_item.set_state(turn_desire)
self.lane_turn_value_control.set_visible(turn_desire and advanced_controls)
self.lagd_toggle.action_item.set_state(live_delay)
self.delay_control.set_visible(not live_delay and advanced_controls)
new_step = int(round(100 / CV.MPH_TO_KPH)) if ui_state.is_metric else 100
if self.lane_turn_value_control.action_item.value_change_step != new_step:

View File

@@ -28,6 +28,7 @@ from openpilot.system.ui.lib.application import gui_app, MousePos
from openpilot.system.ui.lib.multilang import tr_noop
from openpilot.system.ui.lib.text_measure import measure_text_cached
from openpilot.system.ui.lib.wifi_manager import WifiManager
from openpilot.selfdrive.ui.ui_state import ui_state
from openpilot.system.ui.sunnypilot.lib.styles import style
from openpilot.system.ui.widgets import Widget
from openpilot.system.ui.widgets.scroller_tici import Scroller
@@ -196,6 +197,10 @@ class SettingsLayoutSP(OP.SettingsLayout):
return False
def set_current_panel(self, panel_type: OP.PanelType):
super().set_current_panel(panel_type)
ui_state.set_active_layout(self._panels[self._current_panel].instance)
def show_event(self):
super().show_event()
self._panels[self._current_panel].instance.show_event()

View File

@@ -336,7 +336,6 @@ class SunnylinkLayout(Widget):
self._sunnylink_enabled = ui_state.params.get_bool("SunnylinkEnabled")
self._sunnylink_toggle.set_right_value(tr("Dongle ID") + ": " + self._get_sunnylink_dongle_id())
self._sunnylink_toggle.action_item.set_enabled(not ui_state.is_onroad())
self._sunnylink_toggle.action_item.set_state(self._sunnylink_enabled)
self._sunnylink_uploader_toggle.action_item.set_enabled(self._sunnylink_enabled)
self.handle_backup_restore_progress()

View File

@@ -55,5 +55,4 @@ class HyundaiSettings(BrandSettings):
self.longitudinal_tuning_item.action_item.set_enabled(not longitudinal_tuning_disabled)
self.longitudinal_tuning_item.set_description(long_tuning_desc)
self.longitudinal_tuning_item.show_description(True)
self.longitudinal_tuning_item.action_item.set_selected_button(tuning_param)
self.longitudinal_tuning_item.set_visible(self.alpha_long_available)

View File

@@ -0,0 +1,41 @@
"""
Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
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.
"""
def update_item_from_param(item, key, params):
if not (action := getattr(item, 'action_item', None)):
return
if hasattr(action, 'set_state'):
action.set_state(params.get_bool(key))
elif hasattr(action, 'set_value'):
action.set_value(params.get(key, return_default=True))
else:
try:
val = int(params.get(key, return_default=True))
if hasattr(action, 'selected_button'):
action.selected_button = val
if hasattr(action, 'current_value'):
action.current_value = val
except (ValueError, TypeError):
pass
def sync_layout_params(layout, param_name, params):
targets = []
if toggles := getattr(layout, '_toggles', None):
targets.extend([(item, k) for k, item in toggles.items()])
items = getattr(layout, 'items', []) or getattr(getattr(layout, '_scroller', None), '_items', [])
for item in items:
action = getattr(item, 'action_item', None)
if key := getattr(action, 'param_key', None) or getattr(getattr(action, 'toggle', None), 'param_key', None):
targets.append((item, key))
for item, key in targets:
if param_name is None or key == param_name:
update_item_from_param(item, key, params)

View File

@@ -5,8 +5,11 @@ 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 cereal import messaging, log, custom
from openpilot.common.params import Params
from openpilot.common.swaglog import cloudlog
from openpilot.sunnypilot.common.params import Params
from openpilot.sunnypilot.sunnylink.sunnylink_state import SunnylinkState
from openpilot.selfdrive.ui.sunnypilot.ui_helpers import sync_layout_params
OpenpilotState = log.SelfdriveState.OpenpilotState
MADSState = custom.ModularAssistiveDrivingSystem.ModularAssistiveDrivingSystemState
@@ -15,12 +18,24 @@ MADSState = custom.ModularAssistiveDrivingSystem.ModularAssistiveDrivingSystemSt
class UIStateSP:
def __init__(self):
self.params = Params()
self.params.add_watcher(self.on_param_change)
self.params.start()
self.sm_services_ext = [
"modelManagerSP", "selfdriveStateSP", "longitudinalPlanSP", "backupManagerSP",
"gpsLocation", "liveTorqueParameters", "carStateSP", "liveMapDataSP", "carParamsSP", "liveDelay"
]
self.sunnylink_state = SunnylinkState()
self.active_layout = None
self.changed_params = set()
def set_active_layout(self, layout):
self.active_layout = layout
if layout:
sync_layout_params(layout, None, self.params)
def on_param_change(self, param_name):
self.changed_params.add(param_name)
self.custom_interactive_timeout: int = self.params.get("InteractivityTimeout", return_default=True)
self.global_brightness_override: int = self.params.get("Brightness", return_default=True)
@@ -31,6 +46,17 @@ class UIStateSP:
else:
self.sunnylink_state.stop()
if not self.params.is_watching():
cloudlog.warning("ParamWatcher thread died, restarting...")
self.params.start()
if self.changed_params:
while self.changed_params:
self.changed_params.pop()
if self.active_layout:
sync_layout_params(self.active_layout, None, self.params)
@staticmethod
def update_status(ss, ss_sp, onroad_evt) -> str:
state = ss.state

View File

@@ -6,7 +6,6 @@ from collections.abc import Callable
from enum import Enum
from cereal import messaging, car, log
from openpilot.common.filter_simple import FirstOrderFilter
from openpilot.common.params import Params
from openpilot.common.swaglog import cloudlog
from openpilot.selfdrive.ui.lib.prime_state import PrimeState
from openpilot.system.ui.lib.application import gui_app
@@ -36,7 +35,6 @@ class UIState(UIStateSP):
def _initialize(self):
UIStateSP.__init__(self)
self.params = Params()
self.sm = messaging.SubMaster(
[
"modelV2",

View File

@@ -19,6 +19,7 @@ from openpilot.system.ui.widgets.list_view import ListItem, ToggleAction, ItemAc
from openpilot.system.ui.widgets.scroller_tici import LineSeparator, LINE_COLOR, LINE_PADDING
from openpilot.system.ui.sunnypilot.lib.styles import style
from openpilot.system.ui.sunnypilot.widgets.option_control import OptionControlSP, LABEL_WIDTH
from openpilot.selfdrive.ui.ui_state import ui_state
class Spacer(Widget):
@@ -321,6 +322,9 @@ def simple_button_item_sp(button_text: str | Callable[[], str], callback: Callab
def toggle_item_sp(title: str | Callable[[], str], description: str | Callable[[], str] | None = None, initial_state: bool = False,
callback: Callable | None = None, icon: str = "", enabled: bool | Callable[[], bool] = True, param: str | None = None) -> ListItemSP:
if param is None and hasattr(ui_state.params, 'last_accessed_param') and ui_state.params.last_accessed_param:
param = ui_state.params.last_accessed_param
ui_state.params.last_accessed_param = None
action = ToggleActionSP(initial_state=initial_state, enabled=enabled, callback=callback, param=param)
return ListItemSP(title=title, description=description, action_item=action, icon=icon, callback=callback)
@@ -328,6 +332,9 @@ def toggle_item_sp(title: str | Callable[[], str], description: str | Callable[[
def multiple_button_item_sp(title: str | Callable[[], str], description: str | Callable[[], str], buttons: list[str | Callable[[], str]],
selected_index: int = 0, button_width: int = style.BUTTON_ACTION_WIDTH, callback: Callable = None,
icon: str = "", param: str | None = None, inline: bool = False) -> ListItemSP:
if param is None and hasattr(ui_state.params, 'last_accessed_param') and ui_state.params.last_accessed_param:
param = ui_state.params.last_accessed_param
ui_state.params.last_accessed_param = None
action = MultipleButtonActionSP(buttons, button_width, selected_index, callback=callback, param=param)
return ListItemSP(title=title, description=description, icon=icon, action_item=action, inline=inline)