feat: integrate cabin CAN and verified dynamic seat modes
This commit is contained in:
@@ -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 = {
|
||||
|
||||
Reference in New Issue
Block a user