From f6197651f4b2c5e28f3730eb3ded20cd8944d2d9 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Sun, 19 Apr 2026 11:10:39 -0500 Subject: [PATCH] comms error? --- starpilot/common/starpilot_variables.py | 8 +++++++- .../common/tests/test_starpilot_variables.py | 20 +++++++++++++++++++ starpilot/controls/starpilot_planner.py | 8 ++++++-- starpilot/starpilot_process.py | 17 +++++++++++++--- 4 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 starpilot/common/tests/test_starpilot_variables.py diff --git a/starpilot/common/starpilot_variables.py b/starpilot/common/starpilot_variables.py index 2e9898523..054ba9928 100644 --- a/starpilot/common/starpilot_variables.py +++ b/starpilot/common/starpilot_variables.py @@ -281,7 +281,13 @@ def default_ev_tuning_enabled(CP): return bool(ev_vehicle) def get_starpilot_toggles(sm=messaging.SubMaster(["starpilotPlan"])): - toggles = process_starpilot_toggles(sm["starpilotPlan"].starpilotToggles) + toggles_text = sm["starpilotPlan"].starpilotToggles + if toggles_text: + get_starpilot_toggles._last_toggles_text = toggles_text + else: + toggles_text = getattr(get_starpilot_toggles, "_last_toggles_text", "") + + toggles = process_starpilot_toggles(toggles_text) # Force drive-state controls must be authoritative from params so they # apply immediately even if starpilotPlan publication is temporarily stale. diff --git a/starpilot/common/tests/test_starpilot_variables.py b/starpilot/common/tests/test_starpilot_variables.py new file mode 100644 index 000000000..1d564177b --- /dev/null +++ b/starpilot/common/tests/test_starpilot_variables.py @@ -0,0 +1,20 @@ +from types import SimpleNamespace + +from openpilot.starpilot.common import starpilot_variables as spv + + +def test_get_starpilot_toggles_uses_last_non_empty_broadcast(monkeypatch): + params = SimpleNamespace(get_bool=lambda _key: False) + monkeypatch.setattr(spv.get_starpilot_toggles, "_params", params, raising=False) + monkeypatch.delattr(spv.get_starpilot_toggles, "_last_toggles_text", raising=False) + + payload = '{"always_on_lateral": true, "vision_speed_limit_detection": true}' + sm_with_toggles = {"starpilotPlan": SimpleNamespace(starpilotToggles=payload)} + sm_without_toggles = {"starpilotPlan": SimpleNamespace(starpilotToggles="")} + + first = spv.get_starpilot_toggles(sm_with_toggles) + second = spv.get_starpilot_toggles(sm_without_toggles) + + assert first.always_on_lateral is True + assert second.always_on_lateral is True + assert second.vision_speed_limit_detection is True diff --git a/starpilot/controls/starpilot_planner.py b/starpilot/controls/starpilot_planner.py index c185e94db..a6cb09bee 100644 --- a/starpilot/controls/starpilot_planner.py +++ b/starpilot/controls/starpilot_planner.py @@ -32,6 +32,10 @@ def _sanitize_json_value(value): return value +def serialize_starpilot_toggles(starpilot_toggles): + return json.dumps(_sanitize_json_value(vars(starpilot_toggles)), allow_nan=False) + + class StarPilotPlanner: def __init__(self, error_log, ThemeManager): self.params = Params(return_defaults=True) @@ -152,7 +156,7 @@ class StarPilotPlanner: self.tracking_lead_filter.update(following_lead) return self.tracking_lead_filter.x >= THRESHOLD - def publish(self, theme_updated, sm, pm, starpilot_toggles): + def publish(self, theme_updated, sm, pm, starpilot_toggles, serialized_toggles=""): starpilot_plan_send = messaging.new_message("starpilotPlan") starpilot_plan_send.valid = sm.all_checks(service_list=["carState", "controlsState", "selfdriveState", "radarState"]) starpilotPlan = starpilot_plan_send.starpilotPlan @@ -178,7 +182,7 @@ class StarPilotPlanner: starpilotPlan.starpilotEvents = self.starpilot_events.events.to_msg() - starpilotPlan.starpilotToggles = json.dumps(_sanitize_json_value(vars(starpilot_toggles)), allow_nan=False) + starpilotPlan.starpilotToggles = serialized_toggles if sm["starpilotCarState"].trafficModeEnabled: starpilotPlan.increasedStoppedDistance = 0 diff --git a/starpilot/starpilot_process.py b/starpilot/starpilot_process.py index 4822fe7f7..55f38c808 100644 --- a/starpilot/starpilot_process.py +++ b/starpilot/starpilot_process.py @@ -24,12 +24,13 @@ from openpilot.starpilot.common.safe_mode import ( ) from openpilot.starpilot.common.starpilot_utilities import ThreadManager, flash_panda, is_url_pingable, lock_doors, use_konik_server from openpilot.starpilot.common.starpilot_variables import ERROR_LOGS_PATH, StarPilotVariables -from openpilot.starpilot.controls.starpilot_planner import StarPilotPlanner +from openpilot.starpilot.controls.starpilot_planner import StarPilotPlanner, serialize_starpilot_toggles from openpilot.starpilot.system.starpilot_stats import send_stats from openpilot.starpilot.system.starpilot_tracking import StarPilotTracking ASSET_CHECK_RATE = (1 / DT_MDL) DRIVE_STATS_SYNC_RATE = 30 +TOGGLE_BROADCAST_INTERVAL_FRAMES = int(1 / DT_MDL) UPDATE_CHECK_INTERVAL_SECONDS = 60 * 60 @@ -181,6 +182,8 @@ def starpilot_thread(): thread_manager = ThreadManager() starpilot_toggles = starpilot_variables.starpilot_toggles + serialized_starpilot_toggles = serialize_starpilot_toggles(starpilot_toggles) + toggle_broadcast_pending = True drive_stats_session = requests.Session() next_drive_stats_sync = 0.0 @@ -211,6 +214,8 @@ def starpilot_thread(): starpilot_planner.shutdown() starpilot_toggles = update_toggles(starpilot_variables, started, theme_manager, thread_manager, time_validated, params, starpilot_toggles) + serialized_starpilot_toggles = serialize_starpilot_toggles(starpilot_toggles) + toggle_broadcast_pending = True transition_offroad(starpilot_planner, theme_manager, thread_manager, time_validated, sm, params, starpilot_toggles) run_update_checks = True @@ -221,13 +226,17 @@ def starpilot_thread(): transition_onroad(error_log) if started and sm.updated["modelV2"]: + broadcast_toggles = toggle_broadcast_pending or (rate_keeper.frame % TOGGLE_BROADCAST_INTERVAL_FRAMES == 0) starpilot_planner.update(now, time_validated, sm, starpilot_toggles) - starpilot_planner.publish(theme_manager.theme_updated, sm, pm, starpilot_toggles) + starpilot_planner.publish(theme_manager.theme_updated, sm, pm, starpilot_toggles, + serialized_starpilot_toggles if broadcast_toggles else "") + if broadcast_toggles: + toggle_broadcast_pending = False starpilot_tracking.update(now, time_validated, sm, starpilot_toggles) elif not started: starpilot_plan_send = messaging.new_message("starpilotPlan") - starpilot_plan_send.starpilotPlan.starpilotToggles = json.dumps(vars(starpilot_toggles)) + starpilot_plan_send.starpilotPlan.starpilotToggles = serialized_starpilot_toggles starpilot_plan_send.starpilotPlan.themeUpdated = theme_manager.theme_updated pm.send("starpilotPlan", starpilot_plan_send) @@ -256,6 +265,8 @@ def starpilot_thread(): if params_memory.get_bool("StarPilotTogglesUpdated") or theme_manager.theme_updated: starpilot_toggles = update_toggles(starpilot_variables, started, theme_manager, thread_manager, time_validated, params, starpilot_toggles) + serialized_starpilot_toggles = serialize_starpilot_toggles(starpilot_toggles) + toggle_broadcast_pending = True periodic_update_due = monotonic_now >= next_periodic_update_check if periodic_update_due: