Source code for fluidlab.interfaces.usbtmc_inter

"""Interface with Linux USBTMC (:mod:`fluidlab.interface.usbtmc_inter`)
=======================================================================

This interface provides basic interface with USBTMC device. It uses the
linux devices at /dev/usbtmc[0-9], and thus makes use of the usbtmc
linux kernel support.
This is different from other modules, like python-usbtmc or pyvisa-py,
which disable the kernel usbtmc support and address the device directly.

This module is much simpler and merely rely on os.open and ioctl.

Note: on some instruments, the USB port is actually a USB-serial converter.
In that case, use SerialInterface, not LinuxUSBTMCInterface.

Provides:

.. autoclass:: USBTMCInterface
   :members:
   :private-members:

"""

import os
from pathlib import Path

from fluidlab.interfaces import QueryInterface


[docs]class USBTMCInterface(QueryInterface): def __init__(self, device=0, **kwargs): """ Create a new USBTMCInterface. Input argument ============== device: Path('/dev/usbtmc0'), str or bytes '/dev/usbtmc0' or device number (e.g. 0) """ super().__init__() if isinstance(device, bytes): device = device.decode("ascii") if isinstance(device, Path): device = device.as_posix() if isinstance(device, int): device = f"/dev/usbtmc{device:d}" self.devname = device self.write_termination = b"\n" self.read_termination = b"\n" def __str__(self): return f'USBTMCInterface("{self.devame:}")' def __repr__(self): return str(self) def _open(self): self.dev = os.open(self.devname, os.O_RDWR) def _close(self): os.close(self.dev) self.dev = None self.devname = None def _write(self, message, tracing=False, verbose=False): # On prend a priori des bytes, mais si on nous donne un str # on convertit à condition que ce soit du pur ascii if isinstance(message, str): message = message.encode("ascii") if not message.endswith(self.write_termination): message += self.write_termination os.write(self.dev, message) def readline(self, maxbytes=1024): msg = os.read(self.dev, maxbytes) if msg.endswith(self.read_termination): N = len(msg) - len(self.read_termination) + 1 msg = msg[:N] return msg def _read(self, maxbytes=1024, tracing=False, verbose=False): # Par compatibilité avec les autres interfaces, on renvoie # un str (à condition ascii). # Si c'est un appareil qui renvoie autre chose que de l'ascii # utiliser readline. return self.readline(maxbytes).decode("ascii")