dmx: implement __setitem__
authorTero Marttila <terom@paivola.fi>
Fri, 11 Apr 2014 20:46:33 +0300
changeset 73 3c25f32c92fa
parent 72 2957be8573b9
child 74 9031dafa39d6
dmx: implement __setitem__
bin/dmx.py
--- a/bin/dmx.py	Fri Apr 11 20:46:25 2014 +0300
+++ b/bin/dmx.py	Fri Apr 11 20:46:33 2014 +0300
@@ -1,5 +1,6 @@
 #!/usr/bin/env python
 
+import collections
 import serial
 import time
 
@@ -23,6 +24,10 @@
     """
 
 class DMX (object) :
+    """
+        Arudino-based DMX controller using src/hello-dmx.c over the serial port.
+    """
+
     SERIAL = '/dev/arduino'
     SERIAL_BAUD = 9600
     SERIAL_TIMEOUT = 1.0
@@ -39,8 +44,22 @@
         self.io.flush()
         self.io.read(1)
 
+    def _arg (self, arg) :
+        if isinstance(arg, str) :
+            value, = arg
+            value = ord(value)
+        elif isinstance(arg, int) :
+            value = arg
+        else :
+            raise ValueError(arg)
+
+        if 0 <= value <= 255 :
+            return str(value)
+        else :
+            raise ValueError(value)
+
     def __call__ (self, cmd, *args) :
-        out = cmd + ' ' + ' '.join(str(arg) for arg in args) + '\r'
+        out = cmd + ' ' + ' '.join(self._arg(arg) for arg in args) + '\r'
         
         log.info("%s", out)
         
@@ -102,6 +121,30 @@
 
         self('r', start, stop, step, value)
 
+    def __setitem__ (self, index, value) :
+        if isinstance(value, collections.Sequence) :
+            values = tuple(value)
+        else :
+            values = (value, )
+
+        if isinstance(index, slice) :
+            if index.start and index.stop and index.step :
+                # XXX: single
+                self.range(index.start, index.stop, index.step, value)
+
+            elif index.start and index.stop :
+                self.fill(index.start, index.stop, *values)
+
+            elif index.start :
+                self.set(index.start, *values)
+
+            else :
+                raise IndexError("invalid slice: %s" % (index, ))
+        
+        else :
+            # simple set
+            self.set(index, *values)
+
 import argparse
 
 def main (argv) :