qmsk.dmx.control: switch to readline() based __iter__, with __call__(poll=True) and **opts
authorTero Marttila <terom@paivola.fi>
Mon, 02 Jun 2014 18:26:41 +0300
changeset 87 2179a4e28aba
parent 86 61925fb4947e
child 88 c923295ee520
qmsk.dmx.control: switch to readline() based __iter__, with __call__(poll=True) and **opts
qmsk/dmx/control.py
--- a/qmsk/dmx/control.py	Fri May 02 00:10:14 2014 +0300
+++ b/qmsk/dmx/control.py	Mon Jun 02 18:26:41 2014 +0300
@@ -45,6 +45,10 @@
         self.io.read(1)
 
     def _arg (self, arg) :
+        """
+            Format given value as a protocol argument.
+        """
+
         if isinstance(arg, str) :
             value, = arg
             value = ord(value)
@@ -58,7 +62,23 @@
         else :
             raise ValueError(value)
 
-    def __call__ (self, cmd, *args) :
+    def __iter__ (self) :
+        """
+            Read command responses back.
+        """
+        
+        while True:
+            yield self.io.readline()
+
+    def __call__ (self, cmd, *args, **opts) :
+        """
+
+            <chr> [<int> [...]]
+        """
+
+        # XXX:
+        poll = opts.pop('poll', True)
+
         out = cmd + ' ' + ' '.join(self._arg(arg) for arg in args) + '\r'
         
         log.info("%s", out)
@@ -66,15 +86,17 @@
         self.io.write(out)
         self.io.flush()
 
-        ret = self.io.read(len(out))
+        if poll:
+            for ret in self:
+                break
 
-        if '!' in ret :
-            raise DMXCommandError(cmd=out, out=ret)
+            if '!' in ret :
+                raise DMXCommandError(cmd=out, out=ret)
 
-        elif '?' in ret :
-            raise DMXUnknownCommandError(cmd=cmd)
+            elif '?' in ret :
+                raise DMXUnknownCommandError(cmd=cmd)
 
-    def clear (self) :
+    def clear (self, **opts) :
         """
             Set dmx = [ ]
 
@@ -82,46 +104,50 @@
             For most lights, this seems to be equivalent to losing the DMX signal, and they retain their old state.
         """
 
-        self('c')
+        self('c', **opts)
 
-    def zero (self) :
+    def zero (self, **opts) :
         """
             Set dmx = [0, ...]
 
             Uses the maximum DMX packet length available.
         """
 
-        self('z')
+        self('z', **opts)
 
-    def out (self, *values) :
+    def out (self, *values, **opts) :
         """
             Set dmx = (value, ...)
         """
 
-        self('o', *values)
+        self('o', *values, **opts)
 
-    def set (self, start, *values) :
+    def set (self, start, *values, **opts) :
         """
             Set dmx[start:] = value
         """
 
-        self('s', start, *values)
+        self('s', start, *values, **opts)
 
-    def fill (self, start, end, *values) :
+    def fill (self, start, end, *values, **opts) :
         """
             Set dmx[start:end] to repetitions of (value, ...)
         """
 
-        self('f', start, end, *values)
+        self('f', start, end, *values, **opts)
 
-    def range (self, start, stop, step, value) :
+    def range (self, start, stop, step, value, **opts) :
         """
             Set dmx[start:end:step] = value
         """
 
-        self('r', start, stop, step, value)
+        self('r', start, stop, step, value, **opts)
 
     def __setitem__ (self, index, value) :
+        """
+            Magic indexing.
+        """
+
         if isinstance(value, collections.Sequence) :
             values = tuple(value)
         else :