Manager: cover forced road-state transitions

Co-authored-by: pharmacomaniac <blittle65@gmail.com>
This commit is contained in:
pharmacomaniac
2026-09-10 16:30:43 -05:00
parent 14da2ebbd9
commit 49940935a9
3 changed files with 63 additions and 11 deletions
@@ -753,6 +753,22 @@ def test_force_offroad_toggle_rejects_when_not_parked(monkeypatch):
assert fake_params.writes == []
def test_force_offroad_can_be_disabled_without_live_park(monkeypatch):
client, fake_params = _params_client(monkeypatch, {
"ForceOffroad": True,
"ForceOnroad": False,
"IsOnroad": False,
}, "tici")
monkeypatch.setattr(the_galaxy, "_get_vehicle_parked", lambda: False)
response = client.put("/api/params", json={"key": "ForceOffroad", "value": False})
assert response.status_code == 200
assert response.get_json()["updated"] == {"ForceOffroad": False, "ForceOnroad": False}
assert fake_params.values["ForceOffroad"] is False
assert fake_params.values["ForceOnroad"] is False
def test_curve_speed_controller_reset_clears_learned_data_offroad(monkeypatch):
client, fake_params = _params_client(monkeypatch, {
"IsOnroad": False,
Regular → Executable
+11 -11
View File
@@ -1115,6 +1115,16 @@ def manager_cleanup() -> None:
cloudlog.info("everything is dead")
def reset_onroad_transition_params(params, params_memory, force_onroad: bool) -> None:
"""Clear stale card-readiness state before a forced onroad restart."""
if force_onroad:
params.remove("ControlsReady")
params.remove("FirmwareQueryDone")
else:
params.clear_all(ParamKeyFlag.CLEAR_ON_ONROAD_TRANSITION)
params_memory.clear_all(ParamKeyFlag.CLEAR_ON_ONROAD_TRANSITION)
def manager_thread() -> None:
manager_thread_start = time.monotonic()
last_timing = _log_boot_timing("manager_thread", "start", manager_thread_start, manager_thread_start)
@@ -1164,17 +1174,7 @@ def manager_thread() -> None:
started = sm['deviceState'].started
if started and not started_prev:
# ForceOnroad skips the normal onroad parameter reset.
if starpilot_toggles.force_onroad:
# These flags stay set after card exits.
# Clear them so pandad doesn't think card finished init on restart.
params.remove("ControlsReady")
params.remove("FirmwareQueryDone")
else:
params.clear_all(ParamKeyFlag.CLEAR_ON_ONROAD_TRANSITION)
# StarPilot variables
params_memory.clear_all(ParamKeyFlag.CLEAR_ON_ONROAD_TRANSITION)
reset_onroad_transition_params(params, params_memory, starpilot_toggles.force_onroad)
elif not started and started_prev:
params.clear_all(ParamKeyFlag.CLEAR_ON_OFFROAD_TRANSITION)
+36
View File
@@ -74,6 +74,42 @@ class FileBackedFakeParams:
Path(self.get_param_path(key)).unlink(missing_ok=True)
class TransitionParams:
def __init__(self):
self.removals = []
self.clears = []
def remove(self, key):
self.removals.append(key)
def clear_all(self, flags):
self.clears.append(flags)
def test_force_onroad_resets_card_readiness_flags():
params = TransitionParams()
params_memory = TransitionParams()
manager.reset_onroad_transition_params(params, params_memory, force_onroad=True)
assert params.removals == ["ControlsReady", "FirmwareQueryDone"]
assert params.clears == []
assert params_memory.removals == []
assert params_memory.clears == []
def test_normal_onroad_transition_clears_transition_flags():
params = TransitionParams()
params_memory = TransitionParams()
manager.reset_onroad_transition_params(params, params_memory, force_onroad=False)
assert params.removals == []
assert params.clears == [manager.ParamKeyFlag.CLEAR_ON_ONROAD_TRANSITION]
assert params_memory.removals == []
assert params_memory.clears == [manager.ParamKeyFlag.CLEAR_ON_ONROAD_TRANSITION]
def test_navigation_selected_while_already_offroad_is_not_tracked_for_cleanup(tmp_path):
params = FileBackedFakeParams(tmp_path / "params", {
"ClearNavOnOffroad": True,