feat: integrate cabin CAN and verified dynamic seat modes

This commit is contained in:
vee
2026-08-04 17:51:38 +08:00
parent 155fbb59ba
commit dc7c91800e
99 changed files with 51897 additions and 3618 deletions
+100
View File
@@ -69,6 +69,8 @@ class ModeProfileRegistryTests(unittest.TestCase):
"electric_beach_chair",
"queen_passenger_driving",
"calf_decompression_float",
"rocking_horse",
"dynamic_cradle",
}
denza_modes = registry.public_modes(vehicle_id="denza_n7")
denza_ids = {mode["id"] for mode in denza_modes}
@@ -88,6 +90,104 @@ class ModeProfileRegistryTests(unittest.TestCase):
"calf_decompression_float",
)
def test_dynamic_modes_preserve_exact_timelines_and_native_mode_ids(self) -> None:
registry = ModeProfileRegistry(REPOSITORY_ROOT / "config" / "modes")
profiles = {
profile.id: profile
for profile in registry.profiles()
if profile.id in {"rocking_horse", "dynamic_cradle"}
}
horse = profiles["rocking_horse"]
self.assertIsNotNone(horse.timeline)
assert horse.timeline is not None
self.assertEqual(horse.timeline.repeat, "until_stopped_or_timeout")
self.assertEqual(horse.timeline.max_runtime_ms, 600_000)
self.assertIsNone(horse.timeline.cycle_duration_ms)
self.assertEqual(
[(phase.id, phase.duration_ms) for phase in horse.timeline.phases],
[("rock_forward", None), ("rock_backward", None)],
)
self.assertEqual(
horse.timeline.entry["targets"]["longitudinal"]["hall_pulse"],
320,
)
self.assertEqual(
[phase.completion for phase in horse.timeline.phases],
["all_targets_reached", "all_targets_reached"],
)
self.assertEqual([phase.timeout_ms for phase in horse.timeline.phases], [15_000, 15_000])
self.assertEqual(horse.timeline.phases[0].motion["final_approach_hall_pulses"], 8)
self.assertTrue(horse.timeline.phases[0].motion["continuous_four_axis_cruise"])
self.assertEqual(
horse.timeline.phases[0].targets["cushion_tilt"]["hall_pulse"],
250,
)
self.assertEqual(
horse.timeline.phases[1].targets["cushion_tilt"]["hall_pulse"],
130,
)
self.assertEqual(
horse.timeline.phases[0].motion["cruise_duty_percent"]["cushion_tilt"],
90,
)
self.assertEqual(
horse.timeline.phases[0].targets["longitudinal"]["hall_pulse"],
270,
)
self.assertEqual(
horse.timeline.phases[1].targets["longitudinal"]["hall_pulse"],
370,
)
self.assertEqual(
horse.timeline.phases[0].motion["cruise_duty_percent"]["longitudinal"],
90,
)
cradle = profiles["dynamic_cradle"]
self.assertIsNotNone(cradle.timeline)
assert cradle.timeline is not None
self.assertEqual(cradle.timeline.repeat, "until_stopped_or_timeout")
self.assertEqual(cradle.timeline.max_runtime_ms, 600_000)
self.assertIsNone(cradle.timeline.cycle_duration_ms)
self.assertEqual(
[(phase.id, phase.duration_ms) for phase in cradle.timeline.phases],
[("forward", None), ("return", None)],
)
self.assertEqual(
cradle.timeline.entry["targets"]["longitudinal"]["hall_pulse"],
391,
)
self.assertEqual(
[phase.completion for phase in cradle.timeline.phases],
["all_targets_reached", "all_targets_reached"],
)
self.assertEqual(
[phase.timeout_ms for phase in cradle.timeline.phases],
[30_000, 30_000],
)
self.assertEqual(
cradle.timeline.phases[0].motion["final_approach_hall_pulses"],
12,
)
self.assertTrue(
cradle.timeline.phases[0].motion["continuous_four_axis_cruise"]
)
self.assertNotIn("clearance_lead", cradle.timeline.phases[0].motion)
requests = {
profile.id: registry.requests_for_profiles([profile])[0]
for profile in (horse, cradle)
}
self.assertEqual(
requests["rocking_horse"]["parameters"],
[{"name": "mode_id", "value": 1}],
)
self.assertEqual(
requests["dynamic_cradle"]["parameters"],
[{"name": "mode_id", "value": 2}],
)
def test_denza_mode_positions_use_corrected_n7_zero_points(self) -> None:
registry = ModeProfileRegistry(REPOSITORY_ROOT / "config" / "modes")
expected_positions = {