forked from M-Labs/artiq
coredevice: add moninj protocol driver
This commit is contained in:
parent
e82ce3ea28
commit
990b8152f6
|
@ -0,0 +1,69 @@
|
||||||
|
import asyncio
|
||||||
|
import logging
|
||||||
|
import struct
|
||||||
|
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class MonInjComm:
|
||||||
|
def __init__(self, monitor_cb, injection_status_cb, disconnect_cb=None):
|
||||||
|
self.monitor_cb = monitor_cb
|
||||||
|
self.injection_status_cb = injection_status_cb
|
||||||
|
self.disconnect_cb = disconnect_cb
|
||||||
|
|
||||||
|
async def connect(self, host, port=1383):
|
||||||
|
self._reader, self._writer = await asyncio.open_connection(host, port)
|
||||||
|
try:
|
||||||
|
self._writer.write(b"ARTIQ moninj\n")
|
||||||
|
self._receive_task = asyncio.ensure_future(self._receive_cr())
|
||||||
|
except:
|
||||||
|
self._writer.close()
|
||||||
|
del self._reader
|
||||||
|
del self._writer
|
||||||
|
raise
|
||||||
|
|
||||||
|
async def close(self):
|
||||||
|
self.disconnect_cb = None
|
||||||
|
try:
|
||||||
|
self._receive_task.cancel()
|
||||||
|
try:
|
||||||
|
await asyncio.wait_for(self._receive_task, None)
|
||||||
|
except asyncio.CancelledError:
|
||||||
|
pass
|
||||||
|
finally:
|
||||||
|
self._writer.close()
|
||||||
|
del self._reader
|
||||||
|
del self._writer
|
||||||
|
|
||||||
|
def monitor(self, enable, channel, probe):
|
||||||
|
packet = struct.pack(">bblb", 0, enable, channel, probe)
|
||||||
|
self._writer.write(packet)
|
||||||
|
|
||||||
|
def inject(self, channel, override, value):
|
||||||
|
packet = struct.pack(">blbb", 1, channel, override, value)
|
||||||
|
self._writer.write(packet)
|
||||||
|
|
||||||
|
def get_injection_status(self, channel, override):
|
||||||
|
packet = struct.pack(">blb", 2, channel, override)
|
||||||
|
self._writer.write(packet)
|
||||||
|
|
||||||
|
async def _receive_cr(self):
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
ty = await self.reader.read(1)
|
||||||
|
if not ty:
|
||||||
|
return
|
||||||
|
if ty == "\x00":
|
||||||
|
payload = await self.reader.read(9)
|
||||||
|
channel, probe, value = struct.unpack(">lbl", payload)
|
||||||
|
self.monitor_cb(channel, probe, value)
|
||||||
|
elif ty == "\x01":
|
||||||
|
payload = await self.reader.read(6)
|
||||||
|
channel, override, value = struct.unpack(">lbb", payload)
|
||||||
|
self.injection_status_cb(channel, override, value)
|
||||||
|
else:
|
||||||
|
raise ValueError("Unknown packet type", ty)
|
||||||
|
finally:
|
||||||
|
if self.disconnect_cb is not None:
|
||||||
|
self.disconnect_cb()
|
Loading…
Reference in New Issue