diff service/piNode/devices.py @ 1143:d1bc88f67969

RgbPixelsAnimation and docker build updates Ignore-this: c79e4a64bb5ad8683aa837839e79785b darcs-hash:bcc0201b2aaf3a1f1f689a6437eef8298970c58a
author drewp <drewp@bigasterisk.com>
date Sat, 03 Mar 2018 18:09:34 -0800
parents 1e43ec4a5f23
children d36863e09095
line wrap: on
line diff
--- a/service/piNode/devices.py	Sat Mar 03 18:08:03 2018 -0800
+++ b/service/piNode/devices.py	Sat Mar 03 18:09:34 2018 -0800
@@ -18,8 +18,14 @@
     import pigpio
 except ImportError:
     pigpio = None
-import w1thermsensor
-import rpi_ws281x
+try:
+    import w1thermsensor
+except Exception:
+    w1thermsensor = None
+try:
+    import rpi_ws281x
+except ImportError:
+    rpi_ws281x = None
 
 def setupPwm(pi, pinNumber, hz=8000):
     pi.set_mode(pinNumber, pigpio.OUTPUT)
@@ -498,56 +504,38 @@
     deviceType = ROOM['RgbPixels']
 
     def hostStateInit(self):
-        px = self.graph.value(self.uri, ROOM['pixels'])
-        self.pixelUris = list(self.graph.items(px))
-        self.values = dict((uri, Literal('#000000')) for uri in self.pixelUris)
-        colorOrder, stripType = self.getColorOrder(self.graph, self.uri)
-        self.replace = {'ledArray': 'leds_%s' % self.pinNumber,
-                        'ledCount': len(self.pixelUris),
-                        'pin': self.pinNumber,
-                        'ledType': 'WS2812',
-                        'colorOrder': colorOrder
-        }
-        self.neo = rpi_ws281x.Adafruit_NeoPixel(len(self.values), pin=18)
+        self.anim = RgbPixelsAnimation(self.graph, self.uri, self.updateOutput)
+        self.neo = rpi_ws281x.Adafruit_NeoPixel(self.anim.maxIndex() - 1, pin=18)
         self.neo.begin()
+        
+        colorOrder, stripType = self.anim.getColorOrder(self.graph, self.uri)
+      
+    def sendOutput(self, statements):
+        self.anim.onStatements(statements)
 
-    def getColorOrder(self, graph, uri):
-        colorOrder = graph.value(uri, ROOM['colorOrder'],
-                                 default=ROOM['ledColorOrder/RGB'])
-        head, tail = str(colorOrder).rsplit('/', 1)
-        if head != str(ROOM['ledColorOrder']):
-            raise NotImplementedError('%r colorOrder %r' % (uri, colorOrder))
-        stripType = None
-        return colorOrder, stripType
+    def updateOutput(self):
+        if 0:
+            for _, _, sg in self.anim.groups.values():
+                print sg.uri, sg.current
+            print list(self.anim.currentColors())
+            return
         
-    def _rgbFromHex(self, h):
-        rrggbb = h.lstrip('#')
-        return [int(x, 16) for x in [rrggbb[0:2], rrggbb[2:4], rrggbb[4:6]]]
-    
-    def sendOutput(self, statements):
-        px, pred, color = statements[0]
-        if pred != ROOM['color']:
-            raise ValueError(pred)
-        rgb = self._rgbFromHex(color)
-        if px not in self.values:
-            raise ValueError(px)
-        self.values[px] = Literal(color)
-        self.neo.setPixelColorRGB(self.pixelUris.index(px), rgb[0], rgb[1], rgb[2])
+        for idx, (r, g, b) in self.anim.currentColors():
+            self.neo.setPixelColorRGB(idx, r, g, b)
         self.neo.show()
 
+    def poll(self):
+        self.anim.step()
+        return []
+
     def hostStatements(self):
-        return [(uri, ROOM['color'], hexCol)
-                for uri, hexCol in self.values.items()]
+        return self.anim.hostStatements()
         
     def outputPatterns(self):
-        return [(px, ROOM['color'], None) for px in self.pixelUris]
+        return self.anim.outputPatterns()
 
     def outputWidgets(self):
-        return [{
-            'element': 'output-rgb',
-            'subj': px,
-            'pred': ROOM['color'],
-        } for px in self.pixelUris]
+        return self.anim.outputWidgets()
 
 @register
 class Lcd8544(DeviceType):