pygpibtoolkit/gpibcontroller.py

changeset 54
5c1a312830e7
parent 53
8e32c806fcdd
child 57
7013c4bebc7b
--- 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:

mercurial