--- 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) :