import asyncio import logging import struct from enum import Enum from sipyco.keepalive import async_open_connection __all__ = ["TTLProbe", "TTLOverride", "CommMonInj"] logger = logging.getLogger(__name__) class TTLProbe(Enum): level = 0 oe = 1 class TTLOverride(Enum): en = 0 level = 1 oe = 2 class CommMonInj: 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 async_open_connection( host, port, after_idle=1, interval=1, max_fails=3, ) 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 def wait_terminate(self): return self._receive_task 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_probe(self, enable, channel, probe): packet = struct.pack("