-
Notifications
You must be signed in to change notification settings - Fork 1
/
led.py
76 lines (64 loc) · 2.42 KB
/
led.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import colour
from PIL import ImageColor
from fakepixel import Fake_NeoPixel
try:
from neopixel import Adafruit_NeoPixel, Color, ws
realpixels = True
except ImportError:
from fakepixel import Color, ws
realpixels = False
def col(c, gamma=None):
if not isinstance(c, tuple):
c = ImageColor.getrgb(c)
if gamma:
c = tuple(int(((i / 255.0) ** gamma) * 255) for i in c)
return Color(*c[:3])
class LEDStrip:
STRIPS = {'rgb': ws.WS2811_STRIP_RGB,
'rbg': ws.WS2811_STRIP_RBG,
'grb': ws.WS2811_STRIP_GRB,
'gbr': ws.WS2811_STRIP_GBR,
'brg': ws.WS2811_STRIP_BRG,
'bgr': ws.WS2811_STRIP_BGR,
'rgbw': ws.SK6812_STRIP_RGBW}
def __init__(self, kind, leds, freq, pin, dma, channel, strip, invert, bright, gamma, debug):
# bg: solid, gradient, fade
# fg: drop, flash, sparkle
strip_type = self.STRIPS[strip]
self._gamma = gamma
if kind == 'real' or (kind == 'auto' and realpixels):
if not realpixels:
raise Exception("Can't load library for real pixels")
self.leds = Adafruit_NeoPixel(leds, pin, freq, dma, invert,
bright, channel, strip_type)
else:
self.leds = Fake_NeoPixel(leds, pin, freq, dma, invert,
bright, channel, strip_type, debug)
# Intialize the library (must be called once before other functions).
self.leds.begin()
def brightness(self, bright):
self.leds.setBrightness(bright)
self._display()
def gamma(self, val):
self._gamma = val
self._display()
def clear(self):
self.solid('#000')
def solid(self, colour):
n = self.leds.numPixels()
c = col(colour, self._gamma)
self.leds.setPixelColor(slice(0, n), [c]*n)
self._display()
def gradient(self, colour1, colour2):
n = self.leds.numPixels()
pix = [col(c, self._gamma) for c in colour.Color(colour1).range_to(colour2, n)]
self.leds.setPixelColor(slice(0, n), pix)
self._display()
def image(self, image):
data = image.getdata()
n = min(self.leds.numPixels(), len(data))
pix = [col(c, self._gamma) for c in data]
self.leds.setPixelColor(slice(0, n), pix)
self._display()
def _display(self):
self.leds.show()