bin/dmx.py
changeset 73 3c25f32c92fa
parent 71 24f00b561a4a
child 74 9031dafa39d6
equal deleted inserted replaced
72:2957be8573b9 73:3c25f32c92fa
     1 #!/usr/bin/env python
     1 #!/usr/bin/env python
     2 
     2 
       
     3 import collections
     3 import serial
     4 import serial
     4 import time
     5 import time
     5 
     6 
     6 import logging; log = logging.getLogger('dmx')
     7 import logging; log = logging.getLogger('dmx')
     7 
     8 
    21     """
    22     """
    22         Unknown command: {cmd!r}
    23         Unknown command: {cmd!r}
    23     """
    24     """
    24 
    25 
    25 class DMX (object) :
    26 class DMX (object) :
       
    27     """
       
    28         Arudino-based DMX controller using src/hello-dmx.c over the serial port.
       
    29     """
       
    30 
    26     SERIAL = '/dev/arduino'
    31     SERIAL = '/dev/arduino'
    27     SERIAL_BAUD = 9600
    32     SERIAL_BAUD = 9600
    28     SERIAL_TIMEOUT = 1.0
    33     SERIAL_TIMEOUT = 1.0
    29 
    34 
    30     @classmethod
    35     @classmethod
    37         # XXX: bug
    42         # XXX: bug
    38         self.io.write('\r')
    43         self.io.write('\r')
    39         self.io.flush()
    44         self.io.flush()
    40         self.io.read(1)
    45         self.io.read(1)
    41 
    46 
       
    47     def _arg (self, arg) :
       
    48         if isinstance(arg, str) :
       
    49             value, = arg
       
    50             value = ord(value)
       
    51         elif isinstance(arg, int) :
       
    52             value = arg
       
    53         else :
       
    54             raise ValueError(arg)
       
    55 
       
    56         if 0 <= value <= 255 :
       
    57             return str(value)
       
    58         else :
       
    59             raise ValueError(value)
       
    60 
    42     def __call__ (self, cmd, *args) :
    61     def __call__ (self, cmd, *args) :
    43         out = cmd + ' ' + ' '.join(str(arg) for arg in args) + '\r'
    62         out = cmd + ' ' + ' '.join(self._arg(arg) for arg in args) + '\r'
    44         
    63         
    45         log.info("%s", out)
    64         log.info("%s", out)
    46         
    65         
    47         self.io.write(out)
    66         self.io.write(out)
    48         self.io.flush()
    67         self.io.flush()
   100             Set dmx[start:end:step] = value
   119             Set dmx[start:end:step] = value
   101         """
   120         """
   102 
   121 
   103         self('r', start, stop, step, value)
   122         self('r', start, stop, step, value)
   104 
   123 
       
   124     def __setitem__ (self, index, value) :
       
   125         if isinstance(value, collections.Sequence) :
       
   126             values = tuple(value)
       
   127         else :
       
   128             values = (value, )
       
   129 
       
   130         if isinstance(index, slice) :
       
   131             if index.start and index.stop and index.step :
       
   132                 # XXX: single
       
   133                 self.range(index.start, index.stop, index.step, value)
       
   134 
       
   135             elif index.start and index.stop :
       
   136                 self.fill(index.start, index.stop, *values)
       
   137 
       
   138             elif index.start :
       
   139                 self.set(index.start, *values)
       
   140 
       
   141             else :
       
   142                 raise IndexError("invalid slice: %s" % (index, ))
       
   143         
       
   144         else :
       
   145             # simple set
       
   146             self.set(index, *values)
       
   147 
   105 import argparse
   148 import argparse
   106 
   149 
   107 def main (argv) :
   150 def main (argv) :
   108     parser = argparse.ArgumentParser()
   151     parser = argparse.ArgumentParser()
   109     parser.add_argument('--serial', default=DMX.SERIAL,
   152     parser.add_argument('--serial', default=DMX.SERIAL,