Files
DynaLab/test/minimal_connector.py

113 lines
3.2 KiB
Python

# minimal_connector.py
from __future__ import annotations
import asyncio
import uuid
from dynalab_protocol.models import (
ConnectorHello,
DynaLabHello,
HandshakeAccepted,
HandshakeRejected,
Heartbeat,
SignalDescriptor,
machine_timestamp_ms,
)
from dynalab_protocol.wire import read_message, write_message
HOST = "127.0.0.1"
PORT = 8765
async def main() -> None:
reader, writer = await asyncio.open_connection(HOST, PORT)
dynalab_hello: DynaLabHello
handshake: HandshakeAccepted
peer = writer.get_extra_info("peername")
print(f"Connected to DynaLab at {peer}")
try:
message = await asyncio.wait_for(read_message(reader), timeout=5.0)
if not isinstance(message, DynaLabHello):
raise ValueError(f"Expected dynalab_hello, received {message.type}")
dynalab_hello = message
print(f"Received DynaLab Hello\n {dynalab_hello}")
signals: list[SignalDescriptor] = [
SignalDescriptor(
id=uuid.uuid4(), name="lambda", type="number", min_value=0, max_value=5
),
SignalDescriptor(
id=uuid.uuid4(), name="torque", type="number", min_value=0, max_value=10
),
SignalDescriptor(
id=uuid.uuid4(), name="RPM", type="number", min_value=0, max_value=6000
),
SignalDescriptor(
id=uuid.uuid4(),
name="temperature",
type="number",
min_value=0,
max_value=120,
),
SignalDescriptor(
id=uuid.uuid4(),
name="voltage",
type="number",
min_value=0,
max_value=20,
),
SignalDescriptor(
id=uuid.uuid4(),
name="current",
type="number",
min_value=0,
max_value=50,
),
]
connector_hello = ConnectorHello(
connector_uuid=uuid.uuid4(),
connector_name="Minimal Connector",
connector_version="a0.0.1",
signals=signals,
)
await write_message(writer, connector_hello)
message = await asyncio.wait_for(read_message(reader), timeout=5.0)
if isinstance(message, HandshakeAccepted):
handshake = message
print(f"Received connection handshake: {handshake}")
elif isinstance(message, HandshakeRejected):
print(f"Connector handshake rejected: {message.reason}")
return
while True:
message = await read_message(reader)
print(f"Received {message}")
if isinstance(message, Heartbeat):
if message.sequence < 10:
message.return_timestamp = machine_timestamp_ms()
await write_message(writer, message)
except asyncio.CancelledError:
raise
finally:
print("Disconnecting")
writer.close()
await writer.wait_closed()
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
print("\nConnector stopped")