Add MX-T40 BLE desktop controller and protocol documentation
Checks / tests (ubuntu-latest, 3.11) (push) Canceled after 0s
Checks / tests (ubuntu-latest, 3.14) (push) Canceled after 0s
Checks / tests (windows-latest, 3.11) (push) Canceled after 0s
Checks / tests (windows-latest, 3.14) (push) Canceled after 0s
Checks / package (push) Canceled after 0s
Checks / tests (ubuntu-latest, 3.11) (push) Canceled after 0s
Checks / tests (ubuntu-latest, 3.14) (push) Canceled after 0s
Checks / tests (windows-latest, 3.11) (push) Canceled after 0s
Checks / tests (windows-latest, 3.14) (push) Canceled after 0s
Checks / package (push) Canceled after 0s
This commit is contained in:
38 files changed
+2344
No files matched your search
@@ -0,0 +1,63 @@
|
||||
"""Exercise the connection state machine with a scripted serial peer."""
|
||||
|
||||
import queue
|
||||
import sys
|
||||
import types
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
|
||||
from controller.link import Link
|
||||
|
||||
|
||||
class HandshakeTests(unittest.TestCase):
|
||||
def run_peer(self, malformed=False):
|
||||
events = queue.Queue()
|
||||
link = Link("COM7", events)
|
||||
packets = []
|
||||
# Replay actual device ACK + CONNECT_INFO, then a link-complete ACK.
|
||||
# Peer data sequence 0x1d is independent of our outbound sequence 1.
|
||||
info = (
|
||||
bytes.fromhex("00 bb 01 1d 00 01 02 20")
|
||||
if malformed
|
||||
else bytes.fromhex("00 bb 01 1d 00 0b 02 10 01 34 30 04 01 02 04 05 01 b0")
|
||||
)
|
||||
reads = iter(
|
||||
(bytes.fromhex("00 bb 00 01 00 00 01"), info, bytes.fromhex("00 bb 00 02 00 00 02"))
|
||||
)
|
||||
|
||||
class Peer:
|
||||
def __enter__(self):
|
||||
return self
|
||||
|
||||
def __exit__(self, *args):
|
||||
pass
|
||||
|
||||
def write(self, data):
|
||||
packets.append(data)
|
||||
return len(data)
|
||||
|
||||
def read(self, size):
|
||||
try:
|
||||
return next(reads)
|
||||
except StopIteration:
|
||||
link.stop()
|
||||
return b""
|
||||
|
||||
with patch.dict(
|
||||
sys.modules, {"serial": types.SimpleNamespace(Serial=lambda *a, **k: Peer())}
|
||||
):
|
||||
link.run()
|
||||
return packets, list(events.queue)
|
||||
|
||||
def test_waits_for_peer_before_ready(self):
|
||||
packets, events = self.run_peer()
|
||||
self.assertEqual([p[6:-1] for p in packets], [b"\x01", b"\x04"])
|
||||
self.assertEqual(packets[1], bytes.fromhex("00 bb 01 02 00 01 04 08"))
|
||||
self.assertEqual(sum(kind == "ready" for kind, _ in events), 1)
|
||||
self.assertFalse(any(kind == "error" for kind, _ in events))
|
||||
|
||||
def test_malformed_info_never_enables_controls(self):
|
||||
packets, events = self.run_peer(malformed=True)
|
||||
self.assertEqual(len(packets), 1)
|
||||
self.assertFalse(any(kind == "ready" for kind, _ in events))
|
||||
self.assertTrue(any(kind == "error" for kind, _ in events))
|
||||
Reference in new issue
Block a user