Skip to content

Commit

Permalink
driver/pyvisadriver: add driver to support PyVISA
Browse files Browse the repository at this point in the history
Add driver and resource to support controlling test instruments using the
PyVISA package.

Signed-off-by: Kasper Revsbech <[email protected]>
  • Loading branch information
krevsbech authored and Emantor committed Jan 22, 2021
1 parent c050c73 commit 20d6c60
Show file tree
Hide file tree
Showing 11 changed files with 123 additions and 0 deletions.
2 changes: 2 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ New Features in 0.3.0
- ``labgrid-client`` now respects the ``LG_HOSTNAME`` and ``LG_USERNAME``
environment variables to set the hostname and username when accessing
resources.
- PyVISA support added, allowing to use PyVISA controlled test equipment from
Labgrid.

Breaking changes in 0.3.0
~~~~~~~~~~~~~~~~~~~~~~~~~
Expand Down
1 change: 1 addition & 0 deletions dev-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ psutil==5.6.6
-r xena-requirements.txt
-r graph-requirements.txt
-r docker-requirements.txt
-r pyvisa-requirements.txt
28 changes: 28 additions & 0 deletions doc/configuration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -627,6 +627,23 @@ A XenaManager resource describes a Xena Manager instance which is the instance t
Used by:
- `XenaDriver`_

PyVISADevice
~~~~~~~~~~~~
A PyVISADevice resource describes a test stimuli device controlled by PyVISA.
Such device could be a signal generator.

.. code-block:: yaml
PyVISADevice:
type: "TCPIP"
url: "192.168.110.11"
- type (str): device resource type following the pyVISA resource syntax, e.g. ASRL, TCPIP...
- url (str): device identifier on selected resource, e.g. <ip> for TCPIP resource

Used by:
- `PyVISADriver`_

RemotePlace
~~~~~~~~~~~
A RemotePlace describes a set of resources attached to a labgrid remote place.
Expand Down Expand Up @@ -1796,6 +1813,17 @@ Binds to:
Implements:
- :any:`DigitalOutputProtocol`

PyVISADriver
~~~~~~~~~~~~
The PyVISADriver uses a PyVISADevice resource to control test equipment manageable by PyVISA.

Binds to:
pyvisa_resource:
- `PyVISADevice`_

Implements:
- None yet

Strategies
----------

Expand Down
9 changes: 9 additions & 0 deletions examples/pyvisa/env.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
targets:
main:
resources:
PyVISADevice:
type: "TCPIP"
url: "192.168.110.11"
drivers:
PyVISADriver:
name: "PyVisa_device"
15 changes: 15 additions & 0 deletions examples/pyvisa/pyvisa_example.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import pytest


@pytest.fixture()
def signal_generator(target):
return target.get_driver('PyVISADriver').get_session()


def test_with_signal_generator_example(signal_generator):
signal_generator.write('*RST')

# Setup channel 1
signal_generator.write('C1:BSWV WVTP,SQUARE,HLEV,5,LLEV,0,DUTY,50')
# Switch on channel 1
signal_generator.write('C1:OUTP ON,LOAD,HZ,PLRT,NOR')
1 change: 1 addition & 0 deletions labgrid/driver/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,4 @@
from .xenadriver import XenaDriver
from .dockerdriver import DockerDriver
from .lxaiobusdriver import LXAIOBusPIODriver
from .pyvisadriver import PyVISADriver
33 changes: 33 additions & 0 deletions labgrid/driver/pyvisadriver.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from importlib import import_module
import attr

from ..factory import target_factory
from .common import Driver


@target_factory.reg_driver
@attr.s(eq=False)
class PyVISADriver(Driver):
"""The PyVISADriver provides a transparent layer to the PyVISA module allowing to get a pyvisa resource
Args:
bindings (dict): driver to use with PyVISA
"""
bindings = {"pyvisa_resource": "PyVISADevice"}

def __attrs_post_init__(self):
super().__attrs_post_init__()
_py_pyvisa_module = import_module('pyvisa')
self._pyvisa_resource_manager = _py_pyvisa_module.ResourceManager()
self.pyvisa_device = None

def on_activate(self):
device_identifier = '{}::{}::INSTR'.format(self.pyvisa_resource.type, self.pyvisa_resource.url)
self.pyvisa_device = self._pyvisa_resource_manager.open_resource(device_identifier)

def on_deactivate(self):
self.pyvisa_device = None

@Driver.check_active
def get_session(self):
return self.pyvisa_device
1 change: 1 addition & 0 deletions labgrid/resource/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@
from .flashrom import Flashrom, NetworkFlashrom
from .docker import DockerManager, DockerDaemon, DockerConstants
from .lxaiobus import LXAIOBusPIO
from .pyvisa import PyVISADevice
17 changes: 17 additions & 0 deletions labgrid/resource/pyvisa.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import attr

from ..factory import target_factory
from .common import Resource


@target_factory.reg_resource
@attr.s(eq=False)
class PyVISADevice(Resource):
"""The PyVISADevice describes a test stimuli device controlled with PyVISA
Args:
type (str): device resource type following the pyVISA resource syntax, e.g. ASRL, TCPIP...
url (str): device identifier on selected resource, e.g. <ip> for TCPIP resource
"""
type = attr.ib(validator=attr.validators.instance_of(str))
url = attr.ib(validator=attr.validators.instance_of(str))
2 changes: 2 additions & 0 deletions pyvisa-requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pyvisa==1.10.1
PyVISA-py==0.4.1
14 changes: 14 additions & 0 deletions tests/test_pyvisa.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from labgrid.resource.pyvisa import PyVISADevice
from labgrid.driver.pyvisadriver import PyVISADriver


def test_pyvisa_resource(target):
PyVISADevice(target, name=None, type='TCPIP', url='127.0.0.1')


def test_resource_driver(target, mocker):
PyVISADevice(target, name=None, type='TCPIP', url='127.0.0.1')
driver = PyVISADriver(target, name=None)

mocker.patch('pyvisa.ResourceManager.open_resource', return_value=None)
target.activate(driver)

0 comments on commit 20d6c60

Please sign in to comment.