Source code for ptb.synth_protocol

import logging
import asyncio

from .adf4350 import ADF4350

logger = logging.getLogger(__name__)


[docs]class SynthProtocol(ADF4350): """Protocol for the PTB synthesizer (ADF4350-based)""" poll_interval = .01 def do(self, cmd): assert len(cmd) < 64 logger.debug("do %s", cmd) self._writeline(cmd) async def ask(self, cmd): self.do(cmd) ret = await self._readline() logger.debug("ret %s", ret) return ret async def read(self, n): ret = await self._read(n) return ret.decode()
[docs] async def version(self): """Return the hardware/firmware version. Returns: str: Version string. """ self.do("version") return (await self.read(7)).strip()
def _fmt_regs(self, regs): return "{:08x}{:08x}{:08x}{:08x}{:08x}{:08x}".format(*regs)
[docs] async def start(self, regs=None): """Send the six registers to the synthesizer. Args: regs (list(int), optional): 32 bit register values (reg5 down to reg0). If no register values are passed, then the ones calculated by :meth:`set_frequency` are used. """ if regs is None: regs = reversed(self._regs) cmd = "start{}".format(self._fmt_regs(regs)) assert len(cmd) == 5 + 6*8 self.do(cmd) ret = await self.read(4).strip() if ret != "ok": raise ValueError("start failed", ret)
[docs] async def save(self, regs=None): """Save the six registers to the EEPROM. That data is loaded on boot of the synthesizer. Args: regs (list(int), optional): 32 bit register values (reg5 down to reg0). If no register values are passed, then the ones calculated by :meth:`set_frequency` are used. """ if regs is None: regs = reversed(self._regs) cmd = "save {}".format(self._fmt_regs(regs)) assert len(cmd) == 5 + 6*8 self.do(cmd) ret = await self.read(4).strip() if ret != "ok": raise ValueError("save failed", ret)
def _writeline(self, cmd): raise NotImplemented async def _readline(self): raise NotImplemented async def ping(self): try: await self.version() except asyncio.CancelledError: raise except: logger.warning("ping failed", exc_info=True) return False return True