From 45eead8dcdf4c96e725ce941ae199b9dce02e270 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Tue, 14 Jul 2026 01:15:35 -0500 Subject: [PATCH] nighty night --- common/libcommon.a | Bin 764376 -> 764376 bytes common/params_keys.h | 12 ++-- common/params_pyx.so | Bin 837400 -> 837400 bytes .../opendbc/car/toyota/carcontroller.py | 10 ++- opendbc_repo/opendbc/car/toyota/interface.py | 9 +++ .../opendbc/car/toyota/tests/test_toyota.py | 39 +++++++++-- starpilot/navigation/mapd_wrapper.py | 38 +++++++---- starpilot/navigation/test_mapd_wrapper.py | 61 ++++++++++++++---- system/manager/launch_param_migrations.py | 52 ++++++++++++++- .../test/test_launch_param_migrations.py | 51 +++++++++++++++ 10 files changed, 235 insertions(+), 37 deletions(-) diff --git a/common/libcommon.a b/common/libcommon.a index 4e3ea38e24542c370b43b97455b2a6d260c85156..c245bbb3236ae4385383b9a0061c6af958fd10aa 100644 GIT binary patch delta 48384 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

>G5l~wk?A_%61 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 keys = { {"FLMActiveProfileId", {PERSISTENT, STRING, "", "", 2}}, {"FLMTrialBaseline", {PERSISTENT | DONT_LOG, JSON, "{}", "{}"}}, {"FLMTrialApplied", {PERSISTENT, BOOL, "0", "0", 2}}, - {"FPSCounter", {PERSISTENT, BOOL, "1", "0", 3}}, + {"FPSCounter", {PERSISTENT, BOOL, "0", "0", 3}}, {"GalaxyDashboardStats", {PERSISTENT | DONT_LOG, JSON, "{}", "{}"}}, {"StarPilotApiToken", {PERSISTENT | DONT_LOG, STRING, "", "", 0}}, {"StarPilotCarParams", {CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION, BYTES, "", ""}}, @@ -448,7 +448,7 @@ inline static std::unordered_map keys = { {"NoUploads", {PERSISTENT, BOOL, "0", "0", 2}}, {"NudgelessLaneChange", {PERSISTENT, BOOL, "0", "0", 0}}, {"NudgelessLaneChangeOnlyWhenEngaged", {PERSISTENT, BOOL, "0", "0", 1}}, - {"NumericalTemp", {PERSISTENT, BOOL, "1", "0", 3}}, + {"NumericalTemp", {PERSISTENT, BOOL, "0", "0", 3}}, {"Offset1", {PERSISTENT, FLOAT, "5.0", "0.0", 0}}, {"Offset2", {PERSISTENT, FLOAT, "5.0", "0.0", 0}}, {"Offset3", {PERSISTENT, FLOAT, "5.0", "0.0", 0}}, @@ -520,11 +520,11 @@ inline static std::unordered_map keys = { {"SetSpeedOffset", {PERSISTENT, FLOAT, "0.0", "0.0", 2}}, {"ShowCEMStatus", {PERSISTENT, BOOL, "1", "0", 2}}, {"ShowCCMStatus", {PERSISTENT, BOOL, "0", "0", 2}}, - {"ShowCPU", {PERSISTENT, BOOL, "1", "0", 3}}, + {"ShowCPU", {PERSISTENT, BOOL, "0", "0", 3}}, {"ShowCSCStatus", {PERSISTENT, BOOL, "1", "0", 2}}, {"ShowGPU", {PERSISTENT, BOOL, "0", "0", 3}}, {"ShowIP", {PERSISTENT, BOOL, "0", "0", 3}}, - {"ShowMemoryUsage", {PERSISTENT, BOOL, "1", "0", 3}}, + {"ShowMemoryUsage", {PERSISTENT, BOOL, "0", "0", 3}}, {"ShowModeStatusBanner", {PERSISTENT, BOOL, "1", "0", 2}}, {"ShownToggleDescriptions", {PERSISTENT, JSON, "{}", "{}"}}, {"ShowSLCOffset", {PERSISTENT, BOOL, "1", "0", 0}}, @@ -534,7 +534,7 @@ inline static std::unordered_map keys = { {"ShowStoppingPointMetrics", {PERSISTENT, BOOL, "1", "0", 3}}, {"ShowStorageLeft", {PERSISTENT, BOOL, "0", "0", 3}}, {"ShowStorageUsed", {PERSISTENT, BOOL, "0", "0", 3}}, - {"SidebarMetrics", {PERSISTENT, BOOL, "1", "0", 3}}, + {"SidebarMetrics", {PERSISTENT, BOOL, "0", "0", 3}}, {"SidebarOpen", {PERSISTENT, BOOL, "0", "0", 0}}, {"SignalAnimation", {PERSISTENT, STRING, "stock", "stock", 0}}, {"SignalMetrics", {PERSISTENT, BOOL, "0", "0", 3}}, @@ -567,7 +567,7 @@ inline static std::unordered_map keys = { {"SpeedLimitSources", {PERSISTENT, BOOL, "0", "0", 3}}, {"VisionSpeedLimitAutoBookmark", {PERSISTENT, BOOL, "0", "0", 0}}, {"VisionSpeedLimitAutoPreserveSegment", {PERSISTENT, BOOL, "0", "0", 0}}, - {"VisionSpeedLimitDetection", {PERSISTENT, BOOL, "0", "0", 0}}, + {"VisionSpeedLimitDetection", {PERSISTENT, BOOL, "1", "0", 0}}, {"VisionSpeedLimitTrainingCollector", {PERSISTENT, BOOL, "1", "1", 0}}, {"StandardFollow", {PERSISTENT, FLOAT, "1.45", "1.45", 2}}, {"StandardFollowHigh", {PERSISTENT, FLOAT, "1.2", "1.2", 2}}, diff --git a/common/params_pyx.so b/common/params_pyx.so index 3714fe7f2f2e537021ff5de5693d1eed3e5a07a8..60e34851d4088ffd074616f7be10237c305e9682 100755 GIT binary patch delta 39345 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 delta 39257 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 O{cZlg|NQ%|#{UE1v#1>a diff --git a/opendbc_repo/opendbc/car/toyota/carcontroller.py b/opendbc_repo/opendbc/car/toyota/carcontroller.py index 47c0583a3..8a4e41701 100644 --- a/opendbc_repo/opendbc/car/toyota/carcontroller.py +++ b/opendbc_repo/opendbc/car/toyota/carcontroller.py @@ -52,12 +52,18 @@ LOCK_CMD = b"\x40\x05\x30\x11\x00\x80\x00\x00" UNLOCK_CMD = b"\x40\x05\x30\x11\x00\x40\x00\x00" +def is_ths_hybrid(CP) -> bool: + return CP.carFingerprint == CAR.TOYOTA_PRIUS or ( + CP.carFingerprint == CAR.TOYOTA_CAMRY and bool(CP.flags & ToyotaFlags.HYBRID.value) + ) + + def get_long_tune(CP, params): kiBP = [2., 5.] kiV = [0.5, 0.25] k_f = 1.0 - if CP.carFingerprint == CAR.TOYOTA_PRIUS: + if is_ths_hybrid(CP): k_f = 0.8 elif CP.carFingerprint not in TSS2_CAR: kiBP = [0., 5., 35.] @@ -440,7 +446,7 @@ class CarController(CarControllerBase): else: # constantly slowly unwind integral to recover from large temporary errors unwind_rate = ACCEL_PID_UNWIND - if self.CP.carFingerprint == CAR.TOYOTA_PRIUS and pcm_accel_cmd * self.long_pid.i < 0.0: + if is_ths_hybrid(self.CP) and pcm_accel_cmd * self.long_pid.i < 0.0: unwind_rate *= PRIUS_INTEGRAL_MISMATCH_UNWIND self.long_pid.i -= unwind_rate * float(np.sign(self.long_pid.i)) diff --git a/opendbc_repo/opendbc/car/toyota/interface.py b/opendbc_repo/opendbc/car/toyota/interface.py index b59acb1c0..95b156274 100644 --- a/opendbc_repo/opendbc/car/toyota/interface.py +++ b/opendbc_repo/opendbc/car/toyota/interface.py @@ -158,6 +158,8 @@ class CarInterface(CarInterfaceBase): ret.minEnableSpeed = -1. if (stop_and_go or ret.enableGasInterceptorDEPRECATED) else MIN_ACC_SPEED prius_long_defaults = candidate == CAR.TOYOTA_PRIUS and ret.openpilotLongitudinalControl + camry_hybrid_long_defaults = (candidate == CAR.TOYOTA_CAMRY and ret.openpilotLongitudinalControl and + bool(ret.flags & ToyotaFlags.HYBRID.value)) if candidate in TSS2_CAR or ret.enableGasInterceptorDEPRECATED or prius_long_defaults: ret.flags |= ToyotaFlags.RAISED_ACCEL_LIMIT.value @@ -170,6 +172,13 @@ class CarInterface(CarInterfaceBase): if ret.flags & ToyotaFlags.HYBRID.value: ret.longitudinalActuatorDelay = 0.05 + if camry_hybrid_long_defaults: + # The THS eCVT responds much faster than the legacy non-TSS2 ICE tune. + ret.longitudinalActuatorDelay = 0.05 + ret.vEgoStopping = 0.25 + ret.vEgoStarting = 0.25 + ret.stoppingDecelRate = 0.3 + if ret.enableGasInterceptorDEPRECATED: # Pedal/SDSU Toyotas feel best with a softer final stop clamp. ret.longitudinalActuatorDelay = max(ret.longitudinalActuatorDelay, 0.2) diff --git a/opendbc_repo/opendbc/car/toyota/tests/test_toyota.py b/opendbc_repo/opendbc/car/toyota/tests/test_toyota.py index 9f7df7e55..dc10379ec 100644 --- a/opendbc_repo/opendbc/car/toyota/tests/test_toyota.py +++ b/opendbc_repo/opendbc/car/toyota/tests/test_toyota.py @@ -8,7 +8,7 @@ from opendbc.can import CANPacker, CANParser from opendbc.car.structs import CarParams from opendbc.car.fw_versions import build_fw_dict from opendbc.car.toyota import toyotacan -from opendbc.car.toyota.carcontroller import CarController, get_prius_positive_feedforward_scale, limit_interceptor_pcm_accel, \ +from opendbc.car.toyota.carcontroller import CarController, get_long_tune, get_prius_positive_feedforward_scale, limit_interceptor_pcm_accel, \ limit_interceptor_stopping_accel, limit_no_lead_cruise_sign_flip, \ limit_prius_stopping_accel, update_permit_braking from opendbc.car.toyota.carstate import calculate_interceptor_gas_pressed @@ -82,7 +82,7 @@ class TestToyotaInterfaces: assert abs(car_params.vEgoStopping - 0.25) < 1e-6 assert abs(car_params.vEgoStarting - 0.25) < 1e-6 - def test_camry_continental_radar_keeps_standard_longitudinal_tune(self): + def test_camry_hybrid_continental_radar_uses_ths_longitudinal_tune(self): fingerprint = {bus: ({0x2FF: 8} if bus == 0 else {}) for bus in range(8)} hybrid_fw = [CarParams.CarFw(ecu=Ecu.hybrid, address=0x7D2, fwVersion=b"test")] car_params = CarInterface.get_params( @@ -98,17 +98,44 @@ class TestToyotaInterfaces: assert car_params.openpilotLongitudinalControl assert not car_params.radarUnavailable assert abs(car_params.radarTimeStepDEPRECATED - 0.1) < 1e-6 - assert abs(car_params.longitudinalActuatorDelay - 0.15) < 1e-6 - assert abs(car_params.vEgoStopping - 0.5) < 1e-6 - assert abs(car_params.vEgoStarting - 0.5) < 1e-6 - assert abs(car_params.stoppingDecelRate - 0.8) < 1e-6 + assert abs(car_params.longitudinalActuatorDelay - 0.05) < 1e-6 + assert abs(car_params.vEgoStopping - 0.25) < 1e-6 + assert abs(car_params.vEgoStarting - 0.25) < 1e-6 + assert abs(car_params.stoppingDecelRate - 0.3) < 1e-6 assert not car_params.flags & ToyotaFlags.NO_STOP_TIMER.value + controller = get_long_tune(car_params, SimpleNamespace(ACCEL_MIN=-3.5, ACCEL_MAX=2.0)) + controller.speed = 0.0 + assert controller.k_i == pytest.approx(0.5) + assert controller.k_f == pytest.approx(0.8) + radar_interface = RadarInterface(car_params) assert radar_interface.radar_acc_tssp assert radar_interface.rcp is not None assert radar_interface.pt_cp is not None + def test_camry_ice_keeps_legacy_longitudinal_tune(self): + fingerprint = {bus: ({0x2FF: 8} if bus == 0 else {}) for bus in range(8)} + car_params = CarInterface.get_params( + CAR.TOYOTA_CAMRY, + fingerprint, + [], + alpha_long=True, + is_release=False, + docs=False, + starpilot_toggles=SimpleNamespace(), + ) + + assert not car_params.flags & ToyotaFlags.HYBRID.value + assert car_params.longitudinalActuatorDelay == pytest.approx(0.15) + assert car_params.vEgoStopping == pytest.approx(0.5) + assert car_params.stoppingDecelRate == pytest.approx(0.8) + + controller = get_long_tune(car_params, SimpleNamespace(ACCEL_MIN=-3.5, ACCEL_MAX=2.0)) + controller.speed = 0.0 + assert controller.k_i == pytest.approx(3.6) + assert controller.k_f == pytest.approx(1.0) + def test_camry_continental_radar_converts_absolute_target_speed(self): radar_interface = RadarInterface.__new__(RadarInterface) radar_interface.CP = SimpleNamespace(wheelSpeedFactor=1.0) diff --git a/starpilot/navigation/mapd_wrapper.py b/starpilot/navigation/mapd_wrapper.py index 2a8ab6f51..ad2fc4163 100644 --- a/starpilot/navigation/mapd_wrapper.py +++ b/starpilot/navigation/mapd_wrapper.py @@ -10,6 +10,7 @@ from collections import defaultdict, deque from pathlib import Path from openpilot.common.basedir import BASEDIR +from openpilot.common.params import Params from openpilot.common.swaglog import cloudlog MAPD_DIR = Path(BASEDIR) / "starpilot/navigation" @@ -19,6 +20,8 @@ RESTART_DELAY_S = 0.25 MISSING_TILE_BACKOFF_S = 30.0 FAILURE_WINDOW_S = 3.0 FAILURE_THRESHOLD = 3 +MISSING_COVERAGE_EXIT_CODE = 3 +ROAD_STATE_POLL_S = 1.0 def extract_bounds_filename(line: str) -> str | None: @@ -75,25 +78,19 @@ class CorruptTileMonitor: def quarantine_offline_tile(filename: str) -> Path | None: tile_path = Path(filename) try: - relative_path = tile_path.relative_to(OFFLINE_ROOT) + tile_path.relative_to(OFFLINE_ROOT) except ValueError: cloudlog.warning(f"mapd_wrapper refusing to quarantine unexpected path: {filename}") return None - quarantine_path = tile_path if tile_path.is_file() else None - if quarantine_path is None and len(relative_path.parts) >= 2: - archive_path = OFFLINE_ROOT / relative_path.parts[0] / f"{relative_path.parts[1]}.tar.gz" - if archive_path.is_file(): - quarantine_path = archive_path - - if quarantine_path is None: + if not tile_path.is_file(): return None - quarantined = quarantine_path.with_name(f"{quarantine_path.name}.corrupt.{int(time.time())}") + quarantined = tile_path.with_name(f"{tile_path.name}.corrupt.{int(time.time())}") try: - quarantine_path.rename(quarantined) + tile_path.rename(quarantined) except OSError: - cloudlog.exception(f"mapd_wrapper failed to quarantine offline data: {quarantine_path}") + cloudlog.exception(f"mapd_wrapper failed to quarantine offline data: {tile_path}") return None return quarantined @@ -145,6 +142,15 @@ def run_mapd_once() -> int: for line in proc.stdout: print(line, end="") bad_tile = monitor.observe(line) + + # mapd reports an unmarshal failure even when no offline tile is installed. + # Stop its resulting hot loop until the next onroad process cycle. + missing_tile = monitor.current_filename + if is_offline_read_error(line) and missing_tile is not None and not Path(missing_tile).is_file(): + cloudlog.info(f"mapd_wrapper has no offline tile for {missing_tile}; stopping mapd until the next drive") + terminate_child(proc) + return MISSING_COVERAGE_EXIT_CODE + if bad_tile is None: continue @@ -170,7 +176,14 @@ def run_mapd_once() -> int: return proc.wait() +def wait_for_road_state_change(params: Params) -> None: + initial_onroad = params.get_bool("IsOnroad") + while params.get_bool("IsOnroad") == initial_onroad: + time.sleep(ROAD_STATE_POLL_S) + + def main() -> None: + params = Params() while True: exit_code = run_mapd_once() if exit_code == 1: @@ -179,6 +192,9 @@ def main() -> None: if exit_code == 2: time.sleep(MISSING_TILE_BACKOFF_S) continue + if exit_code == MISSING_COVERAGE_EXIT_CODE: + wait_for_road_state_change(params) + continue raise SystemExit(exit_code) diff --git a/starpilot/navigation/test_mapd_wrapper.py b/starpilot/navigation/test_mapd_wrapper.py index e0a148d8e..a3ce7a16b 100644 --- a/starpilot/navigation/test_mapd_wrapper.py +++ b/starpilot/navigation/test_mapd_wrapper.py @@ -4,7 +4,7 @@ import subprocess from pathlib import Path -from openpilot.starpilot.navigation.mapd_wrapper import CorruptTileMonitor, quarantine_offline_tile, terminate_child +from openpilot.starpilot.navigation.mapd_wrapper import CorruptTileMonitor, quarantine_offline_tile, run_mapd_once, terminate_child, wait_for_road_state_change def _loading_line(filename: str) -> str: @@ -43,21 +43,60 @@ def test_quarantine_offline_tile_renames_file(tmp_path, monkeypatch): assert Path(quarantined).name.startswith(f"{tile.name}.corrupt.") -def test_quarantine_offline_tile_renames_backing_archive(tmp_path, monkeypatch): +def test_quarantine_offline_tile_ignores_missing_file(tmp_path, monkeypatch): offline_root = tmp_path / "offline" - archive = offline_root / "34/-88.tar.gz" - archive.parent.mkdir(parents=True) - archive.write_text("bad archive") - virtual_tile = offline_root / "34/-88/34.750000_-87.750000_35.000000_-87.500000" + missing_tile = offline_root / "34/-88/34.750000_-87.750000_35.000000_-87.500000" monkeypatch.setitem(quarantine_offline_tile.__globals__, "OFFLINE_ROOT", offline_root) - quarantined = quarantine_offline_tile(virtual_tile.as_posix()) + assert quarantine_offline_tile(missing_tile.as_posix()) is None - assert quarantined is not None - assert not archive.exists() - assert Path(quarantined).exists() - assert Path(quarantined).name.startswith(f"{archive.name}.corrupt.") + +def test_run_mapd_once_stops_for_missing_offline_coverage(tmp_path, monkeypatch): + missing_tile = tmp_path / "offline/36/-98/37.500000_-98.000000_37.750000_-97.750000" + output = [] + for _ in range(4): + output.extend((_loading_line(missing_tile.as_posix()), _error_line())) + + class CompletedProcess: + pid = 123 + + def __init__(self): + self.stdout = iter(f"{line}\n" for line in output) + self.terminated = False + + def poll(self): + return 0 if self.terminated else None + + def terminate(self): + self.terminated = True + + def wait(self, timeout=None): + return 0 + + proc = CompletedProcess() + monkeypatch.setitem(run_mapd_once.__globals__, "OFFLINE_ROOT", tmp_path / "offline") + monkeypatch.setattr(subprocess, "Popen", lambda *args, **kwargs: proc) + monkeypatch.setattr("signal.signal", lambda *args: None) + + assert run_mapd_once() == 3 + assert proc.terminated + + +def test_missing_coverage_waits_for_road_state_change(monkeypatch): + class Params: + states = iter((True, True, False)) + + def get_bool(self, key): + assert key == "IsOnroad" + return next(self.states) + + sleeps = [] + monkeypatch.setattr("time.sleep", sleeps.append) + + wait_for_road_state_change(Params()) + + assert sleeps == [1.0] def test_terminate_child_tolerates_wedged_process(): diff --git a/system/manager/launch_param_migrations.py b/system/manager/launch_param_migrations.py index 4d47478ff..12ee4a536 100644 --- a/system/manager/launch_param_migrations.py +++ b/system/manager/launch_param_migrations.py @@ -10,6 +10,15 @@ LONG_PITCH_KEY = "LongPitch" STEER_KP_KEY = "SteerKP" STEER_KP_STOCK_KEY = "SteerKPStock" USE_OLD_UI_KEY = "UseOldUI" +VISION_SPEED_LIMIT_DETECTION_KEY = "VisionSpeedLimitDetection" +DEVELOPER_METRIC_DISPLAY_KEYS = ( + "FPSCounter", + "ShowCPU", + "ShowGPU", + "NumericalTemp", + "ShowMemoryUsage", + "SidebarMetrics", +) DEFAULT_STEER_KP = 0.6 LEGACY_STEER_KP = 0.7 @@ -20,6 +29,8 @@ BRANCH_DEFAULTS_MIGRATION_MARKER = ".starpilot_branch_defaults_migrations_v1" ACCELERATION_PROFILE_MIGRATION_MARKER = ".starpilot_acceleration_profile_default_v1" USE_OLD_UI_MIGRATION_MARKER = ".starpilot_use_old_ui_migration_v2" LATERAL_METHOD_REBRAND_MIGRATION_MARKER = ".starpilot_lateral_method_rebrand_v1" +VISION_SPEED_LIMIT_DETECTION_MIGRATION_MARKER = ".starpilot_vision_speed_limit_detection_v1" +DEVELOPER_METRIC_DISPLAY_MIGRATION_MARKER = ".starpilot_developer_metric_display_off_v1" MARKER_DIRNAME = ".starpilot_param_migrations" LATERAL_METHOD_PARAM_SUFFIXES = ( @@ -99,6 +110,14 @@ def _lateral_method_rebrand_marker_path(params: ParamsLike) -> Path: return _marker_dir_path(params) / LATERAL_METHOD_REBRAND_MIGRATION_MARKER +def _vision_speed_limit_detection_marker_path(params: ParamsLike) -> Path: + return _marker_dir_path(params) / VISION_SPEED_LIMIT_DETECTION_MIGRATION_MARKER + + +def _developer_metric_display_marker_path(params: ParamsLike) -> Path: + return _marker_dir_path(params) / DEVELOPER_METRIC_DISPLAY_MIGRATION_MARKER + + def _marker_dir_path(params: ParamsLike) -> Path: params_path = Path(params.get_param_path()) # Params.clear_all() removes unknown files inside the params directory, so @@ -208,11 +227,36 @@ def _apply_lateral_method_rebrand_migration(params: ParamsLike, marker: Path) -> marker.touch() +def _apply_vision_speed_limit_detection_migration(params: ParamsLike, marker: Path) -> None: + if marker.exists(): + return + + marker.parent.mkdir(parents=True, exist_ok=True) + + params.put_bool(VISION_SPEED_LIMIT_DETECTION_KEY, True) + + marker.touch() + + +def _apply_developer_metric_display_migration(params: ParamsLike, marker: Path) -> None: + if marker.exists(): + return + + marker.parent.mkdir(parents=True, exist_ok=True) + + for key in DEVELOPER_METRIC_DISPLAY_KEYS: + params.put_bool(key, False) + + marker.touch() + + def apply_launch_param_migrations(params: ParamsLike, marker_path: Path | None = None, branch_defaults_marker_path: Path | None = None, acceleration_profile_marker_path: Path | None = None, use_old_ui_marker_path: Path | None = None, - lateral_method_rebrand_marker_path: Path | None = None) -> None: + lateral_method_rebrand_marker_path: Path | None = None, + vision_speed_limit_detection_marker_path: Path | None = None, + developer_metric_display_marker_path: Path | None = None) -> None: _apply_legacy_launch_param_migrations(params, marker_path or _default_marker_path(params)) # Keep branch-default rollout on its own marker so older installs that already # have the legacy marker still receive this one-time param reset. @@ -224,6 +268,12 @@ def apply_launch_param_migrations(params: ParamsLike, marker_path: Path | None = _apply_lateral_method_rebrand_migration( params, lateral_method_rebrand_marker_path or _lateral_method_rebrand_marker_path(params) ) + _apply_vision_speed_limit_detection_migration( + params, vision_speed_limit_detection_marker_path or _vision_speed_limit_detection_marker_path(params) + ) + _apply_developer_metric_display_migration( + params, developer_metric_display_marker_path or _developer_metric_display_marker_path(params) + ) def main() -> int: diff --git a/system/manager/test/test_launch_param_migrations.py b/system/manager/test/test_launch_param_migrations.py index d514bcb19..c26184cdf 100644 --- a/system/manager/test/test_launch_param_migrations.py +++ b/system/manager/test/test_launch_param_migrations.py @@ -3,12 +3,15 @@ from pathlib import Path from openpilot.system.manager.launch_param_migrations import ( ACCELERATION_PROFILE_MIGRATION_MARKER, BRANCH_DEFAULTS_MIGRATION_MARKER, + DEVELOPER_METRIC_DISPLAY_KEYS, + DEVELOPER_METRIC_DISPLAY_MIGRATION_MARKER, DEFAULT_STEER_KP, LAUNCH_PARAM_MIGRATION_MARKER, LATERAL_METHOD_REBRAND_MIGRATION_MARKER, MARKER_DIRNAME, STANDARD_ACCELERATION_PROFILE, USE_OLD_UI_MIGRATION_MARKER, + VISION_SPEED_LIMIT_DETECTION_MIGRATION_MARKER, apply_launch_param_migrations, ) @@ -258,3 +261,51 @@ def test_apply_launch_param_migrations_preserves_active_lateral_method_trial(tmp assert params.get(f"FLM{suffix}") == value assert not Path(params.get_param_path(f"{legacy_prefix}{suffix}")).exists() assert marker_path(tmp_path, LATERAL_METHOD_REBRAND_MIGRATION_MARKER).is_file() + + +def test_apply_launch_param_migrations_enables_vision_speed_limit_detection_once(tmp_path): + params = FileBackedFakeParams(tmp_path / "params") + params.put_bool("VisionSpeedLimitDetection", False) + params.put("SLCPriority1", "Dashboard") + params.put("SLCPriority2", "Map Data") + + apply_launch_param_migrations(params) + + assert params.get_bool("VisionSpeedLimitDetection") + assert params.get("SLCPriority1") == "Dashboard" + assert params.get("SLCPriority2") == "Map Data" + assert marker_path(tmp_path, VISION_SPEED_LIMIT_DETECTION_MIGRATION_MARKER).is_file() + + +def test_apply_launch_param_migrations_does_not_reenable_vision_speed_limit_detection_after_marker(tmp_path): + params = FileBackedFakeParams(tmp_path / "params") + params.put_bool("VisionSpeedLimitDetection", False) + marker_path(tmp_path, VISION_SPEED_LIMIT_DETECTION_MIGRATION_MARKER).touch() + + apply_launch_param_migrations(params) + + assert not params.get_bool("VisionSpeedLimitDetection") + + +def test_apply_launch_param_migrations_disables_developer_metric_display_once(tmp_path): + params = FileBackedFakeParams(tmp_path / "params") + for key in DEVELOPER_METRIC_DISPLAY_KEYS: + params.put_bool(key, True) + + apply_launch_param_migrations(params) + + for key in DEVELOPER_METRIC_DISPLAY_KEYS: + assert not params.get_bool(key) + assert marker_path(tmp_path, DEVELOPER_METRIC_DISPLAY_MIGRATION_MARKER).is_file() + + +def test_apply_launch_param_migrations_preserves_developer_metric_display_after_marker(tmp_path): + params = FileBackedFakeParams(tmp_path / "params") + for key in DEVELOPER_METRIC_DISPLAY_KEYS: + params.put_bool(key, True) + marker_path(tmp_path, DEVELOPER_METRIC_DISPLAY_MIGRATION_MARKER).touch() + + apply_launch_param_migrations(params) + + for key in DEVELOPER_METRIC_DISPLAY_KEYS: + assert params.get_bool(key)