comparison 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
comparison
equal deleted inserted replaced
1070:1630e50d9842 1071:9a8897fac103
7 import pigpio 7 import pigpio
8 except ImportError: 8 except ImportError:
9 pigpio = None 9 pigpio = None
10 import w1thermsensor 10 import w1thermsensor
11 try: 11 try:
12 import NeoPixel 12 import neopixel
13 except ImportError: 13 except ImportError:
14 NeoPixel = None 14 neopixel = None
15
16 def setupPwm(pi, pinNumber, hz=8000):
17 pi.set_mode(pinNumber, pigpio.OUTPUT)
18 # see http://abyz.co.uk/rpi/pigpio/cif.html#gpioCfgClock
19 # and http://abyz.co.uk/rpi/pigpio/cif.html#gpioSetPWMfrequency
20 actual = pi.set_PWM_frequency(pinNumber, hz)
21 if actual != hz:
22 raise ValueError('pwm actual=%s' % actual)
23 pi.set_PWM_dutycycle(pinNumber, 0)
15 24
16 import sys 25 import sys
17 26
18 log = logging.getLogger() 27 log = logging.getLogger()
19 ROOM = Namespace('http://projects.bigasterisk.com/room/') 28 ROOM = Namespace('http://projects.bigasterisk.com/room/')
190 self.rgb = map(int, [r, g, b]) 199 self.rgb = map(int, [r, g, b])
191 self.value = '#000000' 200 self.value = '#000000'
192 201
193 def setup(self): 202 def setup(self):
194 for i in self.rgb: 203 for i in self.rgb:
195 self.pi.set_mode(i, pigpio.OUTPUT) 204 setupPwm(self.pi, i)
196 self.pi.set_PWM_frequency(i, 200)
197 self.pi.set_PWM_dutycycle(i, 0)
198 205
199 def hostStatements(self): 206 def hostStatements(self):
200 return [(self.uri, ROOM['color'], Literal(self.value))] 207 return [(self.uri, ROOM['color'], Literal(self.value))]
201 208
202 def outputPatterns(self): 209 def outputPatterns(self):
348 355
349 def hostStateInit(self): 356 def hostStateInit(self):
350 self.value = 0 357 self.value = 0
351 358
352 def setup(self): 359 def setup(self):
353 self.pi.set_mode(self.pinNumber, pigpio.OUTPUT) 360 setupPwm(self.pi, self.pinNumber)
354 self.pi.set_PWM_frequency(self.pinNumber, 200)
355 self.pi.set_PWM_dutycycle(self.pinNumber, 0)
356 361
357 def outputPatterns(self): 362 def outputPatterns(self):
358 return [(self.uri, ROOM['brightness'], None)] 363 return [(self.uri, ROOM['brightness'], None)]
359 364
360 def sendOutput(self, statements): 365 def sendOutput(self, statements):
413 418
414 def hostStateInit(self): 419 def hostStateInit(self):
415 px = self.graph.value(self.uri, ROOM['pixels']) 420 px = self.graph.value(self.uri, ROOM['pixels'])
416 self.pixelUris = list(self.graph.items(px)) 421 self.pixelUris = list(self.graph.items(px))
417 self.values = dict((uri, Literal('#000000')) for uri in self.pixelUris) 422 self.values = dict((uri, Literal('#000000')) for uri in self.pixelUris)
423 colorOrder, stripType = self.getColorOrder(self.graph, self.uri)
418 self.replace = {'ledArray': 'leds_%s' % self.pinNumber, 424 self.replace = {'ledArray': 'leds_%s' % self.pinNumber,
419 'ledCount': len(self.pixelUris), 425 'ledCount': len(self.pixelUris),
420 'pin': self.pinNumber, 426 'pin': self.pinNumber,
421 'ledType': 'WS2812', 427 'ledType': 'WS2812',
428 'colorOrder': colorOrder
422 } 429 }
423 self.neo = NeoPixel.NeoPixel(len(self.values)) 430 self.neo = neopixel.Adafruit_NeoPixel(len(self.values), pin=18, strip_type=stripType)
424 self.neo.begin() 431 self.neo.begin()
425 432
433 def getColorOrder(self, graph, uri):
434 colorOrder = graph.value(uri, ROOM['colorOrder'],
435 default=ROOM['ledColorOrder/RGB'])
436 head, tail = str(colorOrder).rsplit('/', 1)
437 if head != str(ROOM['ledColorOrder']):
438 raise NotImplementedError('%r colorOrder %r' % (uri, colorOrder))
439 stripType = getattr(neopixel.ws, 'WS2811_STRIP_%s' % tail)
440 return colorOrder, stripType
441
426 def _rgbFromHex(self, h): 442 def _rgbFromHex(self, h):
427 rrggbb = h.lstrip('#') 443 rrggbb = h.lstrip('#')
428 return [int(x, 16) for x in [rrggbb[0:2], rrggbb[2:4], rrggbb[4:6]]] 444 return [int(x, 16) for x in [rrggbb[0:2], rrggbb[2:4], rrggbb[4:6]]]
429 445
430 def sendOutput(self, statements): 446 def sendOutput(self, statements):
433 raise ValueError(pred) 449 raise ValueError(pred)
434 rgb = self._rgbFromHex(color) 450 rgb = self._rgbFromHex(color)
435 if px not in self.values: 451 if px not in self.values:
436 raise ValueError(px) 452 raise ValueError(px)
437 self.values[px] = Literal(color) 453 self.values[px] = Literal(color)
438 self.neo.setPixelColor(self.pixelUris.index(px), rgb[0], rgb[1], rgb[2]) 454 self.neo.setPixelColorRGB(self.pixelUris.index(px), rgb[0], rgb[1], rgb[2])
439 self.neo.show() 455 self.neo.show()
440 456
441 def hostStatements(self): 457 def hostStatements(self):
442 return [(uri, ROOM['color'], hexCol) 458 return [(uri, ROOM['color'], hexCol)
443 for uri, hexCol in self.values.items()] 459 for uri, hexCol in self.values.items()]