优化前端,优化前端指令,优化自定义控制

This commit is contained in:
minghanchen
2026-08-24 09:40:16 +08:00
parent fff7657fea
commit 8d05815773
130 changed files with 5543 additions and 2206 deletions
+82 -17
View File
@@ -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}