--- a/pygpibtoolkit/gpibcontroller.py Mon Feb 25 18:38:27 2008 +0100 +++ b/pygpibtoolkit/gpibcontroller.py Mon Feb 25 19:50:49 2008 +0100 @@ -5,10 +5,26 @@ import sys import threading import time +from inspect import isclass + +from serial.serialutil import SerialException from prologix import GPIB, GPIB_CONTROLLER, GPIB_DEVICE +from pygpibtoolkit.pygpib import AbstractCommand + +class AbstractGPIBDeviceMetaclass(type): + def __new__(mcs, name, bases, classdict): + new_cls = type.__new__(mcs, name, bases, classdict) + module = sys.modules[new_cls.__module__] + for pname, param in module.__dict__.items(): + if isclass(param) and issubclass(param, AbstractCommand) and param.__module__ == new_cls.__module__: + setattr(new_cls, pname, param()) + return new_cls class AbstractGPIBDevice(object): + __metaclass__ = AbstractGPIBDeviceMetaclass _accepts = [] + _cmd_register = None # to be defined in son classes + @classmethod def accepts(cls, idn): return idn in cls._accepts @@ -18,6 +34,29 @@ self._address = address self._controller = controller + self._registry = self._cmd_register() # singleton + self._cache = {} + for pname, param in self.__class__.__dict__.items(): + if isinstance(param, AbstractCommand) and not param._readonly: + self._cache[pname] = param._init_value + + def _get(self, name): + assert name in self._registry + if name in self._cache: + if self._cache[name] is None: + # where to get the info? + # ... compute value + value = self._registry[name].get_value(self._cnx) + self._cache[name] = value + return self._cache[name] + + def _set(self, name, value): + assert name in self._registry + res = self._registry[name].set_value(self._cnx, value) + if name in self._cache: + self._cache[name] = value + return res + def manage_srq(self): pass @@ -69,7 +108,10 @@ """ def __init__(self, device="/dev/ttyUSB0", controller_address=21): self._address = controller_address - self._cnx = GPIB(device) + try: + self._cnx = GPIB(device) + except SerialException: + self._cnx = None self._devices = {} self._setup_threading_system() @@ -92,7 +134,7 @@ self._loop_interrupter.set() def _check_srq(self): - if self._cnx.check_srq(): + if self._cnx and self._cnx.check_srq(): addrs = sorted(self._devices.keys()) polled = self._cnx.poll(addrs) for add in addrs: