diff service/piNode/devices.py @ 1071:9a8897fac103

neopixel lib change. factor out pwm setup and try another pwm rate Ignore-this: 870f68d8297c6387be35b452058f0b97 darcs-hash:3d0aaef22b809485659f0ec829b340e3b312f863
author drewp <drewp@bigasterisk.com>
date Thu, 14 Apr 2016 00:13:06 -0700
parents dfb284fb025c
children 4685fbd208d1
line wrap: on
line diff
--- a/service/piNode/devices.py	Thu Apr 14 00:11:12 2016 -0700
+++ b/service/piNode/devices.py	Thu Apr 14 00:13:06 2016 -0700
@@ -9,9 +9,18 @@
     pigpio = None
 import w1thermsensor
 try:
-    import NeoPixel
+    import neopixel
 except ImportError:
-    NeoPixel = None
+    neopixel = None
+
+def setupPwm(pi, pinNumber, hz=8000):
+    pi.set_mode(pinNumber, pigpio.OUTPUT)
+    # see http://abyz.co.uk/rpi/pigpio/cif.html#gpioCfgClock
+    # and http://abyz.co.uk/rpi/pigpio/cif.html#gpioSetPWMfrequency
+    actual = pi.set_PWM_frequency(pinNumber, hz)
+    if actual != hz:
+        raise ValueError('pwm actual=%s' % actual)
+    pi.set_PWM_dutycycle(pinNumber, 0)
 
 import sys
 
@@ -192,9 +201,7 @@
             
     def setup(self):
         for i in self.rgb:
-            self.pi.set_mode(i, pigpio.OUTPUT)
-            self.pi.set_PWM_frequency(i, 200)
-            self.pi.set_PWM_dutycycle(i, 0)
+            setupPwm(self.pi, i)
             
     def hostStatements(self):
         return [(self.uri, ROOM['color'], Literal(self.value))]
@@ -350,9 +357,7 @@
         self.value = 0
     
     def setup(self):
-        self.pi.set_mode(self.pinNumber, pigpio.OUTPUT)
-        self.pi.set_PWM_frequency(self.pinNumber, 200)
-        self.pi.set_PWM_dutycycle(self.pinNumber, 0)
+        setupPwm(self.pi, self.pinNumber)
 
     def outputPatterns(self):
         return [(self.uri, ROOM['brightness'], None)]
@@ -415,14 +420,25 @@
         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 = NeoPixel.NeoPixel(len(self.values))
+        self.neo = neopixel.Adafruit_NeoPixel(len(self.values), pin=18, strip_type=stripType)
         self.neo.begin()
-    
+
+    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 = getattr(neopixel.ws, 'WS2811_STRIP_%s' % tail)
+        return colorOrder, stripType
+        
     def _rgbFromHex(self, h):
         rrggbb = h.lstrip('#')
         return [int(x, 16) for x in [rrggbb[0:2], rrggbb[2:4], rrggbb[4:6]]]
@@ -435,7 +451,7 @@
         if px not in self.values:
             raise ValueError(px)
         self.values[px] = Literal(color)
-        self.neo.setPixelColor(self.pixelUris.index(px), rgb[0], rgb[1], rgb[2])
+        self.neo.setPixelColorRGB(self.pixelUris.index(px), rgb[0], rgb[1], rgb[2])
         self.neo.show()
 
     def hostStatements(self):