Remember custom personality graphs and correct default resets

This commit is contained in:
AngusBell97
2026-09-12 15:25:07 +01:00
committed by firestar5683
parent a51205e302
commit ab6c97fef8
11 changed files with 413 additions and 55 deletions
@@ -38,7 +38,7 @@ from openpilot.starpilot.common.longitudinal_personality_profiles import (
def test_document_is_versioned_disabled_and_declares_exact_axes_and_units():
document = profile_document(default_personality_profiles(False), enabled=False)
assert document["schemaVersion"] == PROFILE_SCHEMA_VERSION == 2
assert document["schemaVersion"] == PROFILE_SCHEMA_VERSION == 3
assert document["enabled"] is False
assert document["axes"] == {
"acceleration": {
@@ -455,7 +455,7 @@ def test_following_custom_initialisation_uses_effective_legacy_curve():
def test_v2_uses_one_shared_ten_mph_custom_axis():
assert PROFILE_SCHEMA_VERSION == 2
assert PROFILE_SCHEMA_VERSION == 3
expected = tuple(range(0, 91, 10))
assert ACCELERATION_SPEEDS_MPH == expected
assert BRAKING_SPEEDS_MPH == expected
@@ -537,7 +537,7 @@ def test_exact_v1_document_migrates_whole_or_not_at_all():
migrated = lpp.migrate_profile_document(legacy)
assert migrated is not None
assert migrated["schemaVersion"] == 2
assert migrated["schemaVersion"] == PROFILE_SCHEMA_VERSION
assert migrated["enabled"] is True
migrated_acceleration = migrated["profiles"]["aggressive"]["acceleration"]
assert migrated_acceleration["preset"] == "custom"
@@ -0,0 +1,54 @@
import json
from copy import deepcopy
import pytest
from openpilot.starpilot.common import longitudinal_personality_profiles as lpp
@pytest.mark.parametrize("personality", lpp.PERSONALITY_IDS)
@pytest.mark.parametrize("category,preset", [("acceleration", "eco"), ("braking", "sport"), ("following", "far")])
def test_custom_survives_preset_changes_serialization_and_reload(personality, category, preset):
profiles = lpp.default_personality_profiles(False)
curve = [round(1.0 + i * 0.05, 4) for i in range(10)]
profiles = lpp.update_personality_profile(profiles, personality, category, "custom", curve, False)
other_profiles = deepcopy(profiles)
for selected in (preset, "dom_default", preset):
profiles = lpp.update_personality_profile(profiles, personality, category, selected, [], False)
profiles = lpp.load_personality_profiles(lpp.serialize_personality_profiles(profiles, False, enabled=True), False)
assert profiles[personality][category] == {"preset": selected, "curve": curve}
if selected != "dom_default":
assert lpp.category_curve(category, profiles[personality][category], False) == lpp.category_curve(category, {"preset": selected, "curve": []}, False)
seed = lpp.initial_custom_curve(category, profiles[personality][category], False, False, legacy_curve=[2.0] * 10)
profiles = lpp.update_personality_profile(profiles, personality, category, "custom", seed, False)
assert profiles == other_profiles
def test_switching_preserves_high_points_and_legacy_runtime_only_for_custom():
profiles = lpp.default_personality_profiles(False)
saved = {"preset": "custom", "curve": [4.0] * 10, "legacyCurve": [5.0] * 7}
profiles["aggressive"]["acceleration"] = deepcopy(saved)
profiles = lpp.update_personality_profile(profiles, "aggressive", "acceleration", "eco", [], False)
assert profiles["aggressive"]["acceleration"]["legacyCurve"] == saved["legacyCurve"]
assert lpp.interpolate_category_curve("acceleration", 12, profiles["aggressive"]["acceleration"], False) == lpp.interpolate_category_curve("acceleration", 12, {"preset": "eco", "curve": []}, False)
profiles = lpp.update_personality_profile(profiles, "aggressive", "acceleration", "custom", [4.0] * 10, False)
assert profiles["aggressive"]["acceleration"] == saved
def test_v2_load_is_lossless_and_next_write_uses_new_version():
document = lpp.profile_document(lpp.default_personality_profiles(False), enabled=True)
document["schemaVersion"] = 2
document["profiles"]["standard"]["acceleration"] = {"preset": "custom", "curve": [4.0] * 10}
loaded = lpp.strict_profile_document(document)
assert loaded is not None
assert loaded["profiles"] == document["profiles"]
assert json.loads(lpp.serialize_personality_profiles(loaded["profiles"], False, enabled=True))["schemaVersion"] > 2
document["profiles"]["standard"]["acceleration"]["preset"] = "eco"
assert lpp.strict_profile_document(document) is None # v2 never allowed dormant curves
@pytest.mark.parametrize("curve", [[True] * 10, [float("nan")] * 10, [1.0] * 9, [7.0] * 10])
def test_dormant_curves_are_validated(curve):
profiles = lpp.default_personality_profiles(False)
profiles["standard"]["acceleration"] = {"preset": "eco", "curve": curve}
assert lpp.strict_profile_document(lpp.profile_document(profiles, enabled=True)) is None