优化无线/有线CAN,以及控制指令解析
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import subprocess
|
||||
import sys
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
from cognitive_agent.application.native_can_runtime import NativeCanRuntime
|
||||
from cognitive_agent.generated.can_semantic_protocol import (
|
||||
CAN0_SUPPORTED_CAPABILITIES,
|
||||
CAN1_SUPPORTED_CAPABILITIES,
|
||||
PROTOCOL_SOURCE_SHA256,
|
||||
frame,
|
||||
match_semantic_command,
|
||||
payload_variant,
|
||||
)
|
||||
from seat_domain import T2GSeatCompiler
|
||||
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[2]
|
||||
|
||||
|
||||
class SharedCanSemanticProtocolTests(unittest.TestCase):
|
||||
def test_checked_in_python_and_cpp_views_are_current(self) -> None:
|
||||
completed = subprocess.run(
|
||||
[sys.executable, "tools/generate_can_semantic_protocol.py", "--check"],
|
||||
cwd=ROOT,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
check=False,
|
||||
)
|
||||
self.assertEqual(completed.returncode, 0, completed.stderr)
|
||||
self.assertEqual(len(PROTOCOL_SOURCE_SHA256), 64)
|
||||
|
||||
def test_generated_matcher_routes_both_channels_and_rejects_bad_axes(self) -> None:
|
||||
cases = {
|
||||
"seat passenger basin relative up 10": ("can0.seat.relative", 0),
|
||||
"seat passenger legrest position 100": ("can0.seat.position", 0),
|
||||
"ac fan 2": ("can1.climate.fan", 1),
|
||||
"outlet passenger-right close": ("can1.outlet.switch", 1),
|
||||
"seat driver horizontal forward 500": ("can1.seat.driver_axis", 1),
|
||||
}
|
||||
for command, expected in cases.items():
|
||||
with self.subTest(command=command):
|
||||
matched = match_semantic_command(command)
|
||||
self.assertIsNotNone(matched)
|
||||
assert matched is not None
|
||||
self.assertEqual((matched["id"], matched["channel"]), expected)
|
||||
for command in (
|
||||
"seat passenger basin relative forward 10",
|
||||
"seat driver height forward 500",
|
||||
"ac fan 8",
|
||||
"door vehicle lock",
|
||||
):
|
||||
with self.subTest(command=command):
|
||||
self.assertIsNone(match_semantic_command(command))
|
||||
|
||||
def test_outlet_static_payload_and_transport_have_one_generated_source(self) -> None:
|
||||
metadata = frame("can1.outlet.switch")
|
||||
self.assertEqual(metadata["frame_id"], "0x4EF")
|
||||
self.assertEqual(metadata["format"], "can_fd")
|
||||
self.assertTrue(metadata["brs"])
|
||||
self.assertEqual(metadata["repeat"], {"kind": "fixed", "count": 3, "period_ms": 100})
|
||||
self.assertEqual(metadata["feedback_ids"], ["0x4BB", "0x37B"])
|
||||
self.assertEqual(
|
||||
payload_variant("can1.outlet.switch", "passenger-right:close"),
|
||||
bytes.fromhex("03 FF FF FF FF 08 00 00"),
|
||||
)
|
||||
|
||||
runtime = NativeCanRuntime(ROOT)
|
||||
spec = runtime._outlet_switch_frame( # noqa: SLF001 - protocol contract test
|
||||
"passenger_right", {"state": "close"}
|
||||
)
|
||||
self.assertEqual(spec.frame_id, 0x4EF)
|
||||
self.assertEqual(spec.payload, bytes.fromhex("03 FF FF FF FF 08 00 00"))
|
||||
self.assertEqual(spec.repeat_count, 3)
|
||||
self.assertEqual(spec.period_ms, 100)
|
||||
self.assertEqual(spec.feedback_ids, (0x4BB, 0x37B))
|
||||
|
||||
def test_python_capability_sets_and_can0_plan_contract_are_generated(self) -> None:
|
||||
runtime = NativeCanRuntime(ROOT)
|
||||
self.assertEqual(runtime.supported_capabilities, CAN1_SUPPORTED_CAPABILITIES)
|
||||
self.assertIn("seat.set_longitudinal_position", CAN0_SUPPORTED_CAPABILITIES)
|
||||
contract = T2GSeatCompiler._protocol_contract( # noqa: SLF001
|
||||
"can0.seat.position", "move"
|
||||
)
|
||||
self.assertEqual(contract["frame_id"], "0x300")
|
||||
self.assertEqual(contract["repeat"]["count"], 1)
|
||||
self.assertEqual(contract["feedback_ids"], ["0x301", "0x302"])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user