优化前端,优化前端指令,优化自定义控制
This commit is contained in:
@@ -33,8 +33,12 @@ class _FakeBus:
|
||||
self.send_attempts: list[tuple[int, bytes, bool, bool]] = []
|
||||
self.sent: list[CanFrame] = []
|
||||
self.events: list[str] = []
|
||||
self.debug_commands: list[str] = []
|
||||
self.closed = False
|
||||
|
||||
def set_debug_command(self, command: str) -> None:
|
||||
self.debug_commands.append(command)
|
||||
|
||||
def send(
|
||||
self,
|
||||
arbitration_id: int,
|
||||
@@ -326,7 +330,7 @@ class VerifiedBodyCanTests(unittest.TestCase):
|
||||
self.assertEqual(vehicle[0]["capability"], "door.set_vehicle_lock")
|
||||
self.assertEqual(vehicle[0]["target"], "vehicle")
|
||||
|
||||
def test_legacy_rear_lock_is_retired_before_compile(self) -> None:
|
||||
def test_rear_lock_compiles_only_the_matrix_backed_second_row_request(self) -> None:
|
||||
action = {
|
||||
"domain": "door",
|
||||
"capability": "door.set_rear_lock",
|
||||
@@ -335,23 +339,55 @@ class VerifiedBodyCanTests(unittest.TestCase):
|
||||
"parameters": {"state": "lock"},
|
||||
}
|
||||
catalog_entry = self.runtime.capabilities[action["capability"]]
|
||||
self.assertEqual(catalog_entry["execution_support"], "observational_only")
|
||||
self.assertFalse(catalog_entry["physical_control_supported"])
|
||||
self.assertNotIn(action["capability"], self.runtime.supported_capabilities)
|
||||
self.assertFalse(self.runtime.supports(action))
|
||||
with self.assertRaisesRegex(
|
||||
NativeCanCompileError,
|
||||
r"unsupported.*current CH1.*0x32B.*observational only",
|
||||
):
|
||||
self.runtime.build_function_config(
|
||||
"door", [action], "retired-rear-lock", "local_rules"
|
||||
)
|
||||
with self.assertRaisesRegex(
|
||||
NativeCanCompileError, r"unsupported.*current CH1.*observational only"
|
||||
):
|
||||
self.runtime._frame_specs({"capability": action["capability"]})
|
||||
self.assertEqual(
|
||||
catalog_entry["execution_support"], "matrix_candidate_with_feedback"
|
||||
)
|
||||
self.assertTrue(catalog_entry["physical_control_supported"])
|
||||
self.assertIn(action["capability"], self.runtime.supported_capabilities)
|
||||
self.assertTrue(self.runtime.supports(action))
|
||||
cases = (
|
||||
("lock", "0A 40 00 00 00 00 00 00"),
|
||||
("unlock", "0A 80 00 00 00 00 00 00"),
|
||||
)
|
||||
for state, payload in cases:
|
||||
with self.subTest(state=state):
|
||||
command = self.compile_action(
|
||||
"door", "door.set_rear_lock", "rear", {"state": state}
|
||||
)
|
||||
self.assertEqual(command["signals"]["frame_id"], "0x32B")
|
||||
self.assertEqual(command["signals"]["data_hex"], payload)
|
||||
self.assertFalse(command["signals"]["is_fd"])
|
||||
self.assertFalse(command["signals"]["bitrate_switch"])
|
||||
self.assertNotIn("repeat", command)
|
||||
self.assertEqual(command["signals"]["feedback_ids"], "0x407")
|
||||
self.assertEqual(
|
||||
command["signals"]["expected_feedback"], f"rear_lock:{state}"
|
||||
)
|
||||
exact = _parse_exact_command(f"door rear {state}")
|
||||
self.assertEqual(exact[0]["capability"], "door.set_rear_lock")
|
||||
self.assertEqual(exact[0]["target"], "rear")
|
||||
|
||||
self.assertEqual(_parse_exact_command("door rear lock"), [])
|
||||
def test_climate_cycle_uses_verified_1de_bits_and_404_feedback(self) -> None:
|
||||
cases = (
|
||||
("internal", "00 00 08 00 00 00 00 00"),
|
||||
("external", "00 00 10 00 00 00 00 00"),
|
||||
)
|
||||
for mode, payload in cases:
|
||||
with self.subTest(mode=mode):
|
||||
command = self.compile_action(
|
||||
"climate",
|
||||
"climate.set_cycle_mode",
|
||||
"vehicle",
|
||||
{"mode": mode},
|
||||
)
|
||||
self.assertEqual(command["signals"]["frame_id"], "0x1DE")
|
||||
self.assertEqual(command["signals"]["data_hex"], payload)
|
||||
self.assertEqual(command["repeat"], {"count": 3, "period_ms": 100})
|
||||
self.assertEqual(command["signals"]["feedback_ids"], "0x404")
|
||||
self.assertEqual(
|
||||
command["signals"]["expected_feedback"],
|
||||
f"climate_cycle:{mode}",
|
||||
)
|
||||
|
||||
def test_ambient_controls_use_only_verified_3fc_layouts(self) -> None:
|
||||
cases = (
|
||||
@@ -426,6 +462,10 @@ class VerifiedBodyCanTests(unittest.TestCase):
|
||||
self.assertFalse(command["signals"]["is_fd"])
|
||||
self.assertEqual(command["signals"]["feedback_ids"], "0x41A")
|
||||
self.assertEqual(command["signals"]["special_handler"], "shade_preset")
|
||||
self.assertEqual(
|
||||
command["signals"]["debug_command"],
|
||||
f"shade position {position}",
|
||||
)
|
||||
|
||||
arbitrary = self.compile_action(
|
||||
"roof", "roof.set_shade_position", "vehicle", {"position_pct": 37}
|
||||
@@ -433,10 +473,35 @@ class VerifiedBodyCanTests(unittest.TestCase):
|
||||
self.assertEqual(arbitrary["signals"]["frame_id"], "0x431")
|
||||
self.assertNotEqual(arbitrary["signals"]["frame_id"], "0x4F5")
|
||||
self.assertEqual(arbitrary["signals"]["special_handler"], "shade_position")
|
||||
self.assertEqual(arbitrary["signals"]["debug_command"], "shade position 37")
|
||||
special = arbitrary["signals"]["special_parameters"]
|
||||
self.assertIn('"fresh_feedback_timeout_ms": 2500', special)
|
||||
self.assertIn('"stop_data_hex": "40 00 00 00 00 00 00 00"', special)
|
||||
|
||||
def test_executor_attaches_compiled_debug_command_to_mqtt_style_bus(self) -> None:
|
||||
config = self.runtime.build_function_config(
|
||||
"roof",
|
||||
[
|
||||
{
|
||||
"domain": "roof",
|
||||
"capability": "roof.set_shade_position",
|
||||
"target": "vehicle",
|
||||
"operation": "set",
|
||||
"parameters": {"position_pct": 100},
|
||||
}
|
||||
],
|
||||
"shade-debug-command",
|
||||
"local_rules",
|
||||
)
|
||||
plan = self.runtime.compile(config)
|
||||
bus = _FakeBus([self.shade_feedback(100, motion=1)])
|
||||
executor = NativeCanExecutor(lambda: bus, feedback_timeout_ms=1)
|
||||
|
||||
report = executor.execute(self.runtime, plan, config)
|
||||
|
||||
self.assertEqual(report["spec"]["status"], "succeeded")
|
||||
self.assertEqual(bus.debug_commands, ["shade position 100"])
|
||||
|
||||
def test_shade_preset_executor_waits_for_authoritative_target(self) -> None:
|
||||
command = self.compile_action(
|
||||
"roof", "roof.set_shade_position", "vehicle", {"position_pct": 100}
|
||||
|
||||
Reference in New Issue
Block a user