# HG changeset patch # User Tero Marttila # Date 1397238393 -10800 # Node ID 3c25f32c92fa78050819847a8bdf152bf9d8cfdf # Parent 2957be8573b9fc3849aa60c42865a9491bfcb5e4 dmx: implement __setitem__ diff -r 2957be8573b9 -r 3c25f32c92fa 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) :