32
32
33
33
import digitalio
34
34
from neopixel_write import neopixel_write
35
+ try :
36
+ from pixelbuf import PixelBuf
37
+ except :
38
+ PixelBuf = None
39
+
35
40
36
41
__version__ = "0.0.0-auto.0"
37
42
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel.git"
@@ -97,12 +102,20 @@ def __init__(self, pin, n, *, bpp=3, brightness=1.0, auto_write=True, pixel_orde
97
102
else :
98
103
self .order = pixel_order
99
104
self .bpp = len (self .order )
100
- self .buf = bytearray (self .n * self .bpp )
101
105
# Set auto_write to False temporarily so brightness setter does _not_
102
106
# call show() while in __init__.
103
107
self .auto_write = False
104
- self .brightness = brightness
105
108
self .auto_write = auto_write
109
+ if PixelBuf :
110
+ print ("PB INIT" )
111
+ self .buf = PixelBuf (self .n , bytearray (self .n * self .bpp ),
112
+ bpp = self .bpp , brightness = brightness ,
113
+ rawbuf = bytearray (self .n * self .bpp ))
114
+ NeoPixel .__setitem__ = NeoPixel .__setitem_pb__
115
+ NeoPixel .__getitem__ = NeoPixel .__getitem_pb__
116
+ else :
117
+ self .buf = bytearray (self .n * self .bpp )
118
+ self .brightness = brightness
106
119
107
120
def deinit (self ):
108
121
"""Blank out the NeoPixels and release the pin."""
@@ -169,6 +182,15 @@ def __setitem__(self, index, val):
169
182
if self .auto_write :
170
183
self .show ()
171
184
185
+ def __setitem_pb__ (self , index , val ):
186
+ if isinstance (index , slice ):
187
+ self .buf [index .start :index .stop :index .step ] = val
188
+ else :
189
+ self .buf [index ] = val
190
+
191
+ if self .auto_write :
192
+ self .show ()
193
+
172
194
def __getitem__ (self , index ):
173
195
if isinstance (index , slice ):
174
196
out = []
@@ -184,18 +206,29 @@ def __getitem__(self, index):
184
206
return tuple (self .buf [offset + self .order [i ]]
185
207
for i in range (self .bpp ))
186
208
209
+ def __getitem_pb__ (self , index ):
210
+ if isinstance (index , slice ):
211
+ return self .buf [index .start :index .stop :index .step ]
212
+ else :
213
+ return self .buf [index ]
214
+
187
215
def __len__ (self ):
188
216
return len (self .buf ) // self .bpp
189
217
190
218
@property
191
219
def brightness (self ):
192
220
"""Overall brightness of the pixel"""
221
+ if PixelBuf :
222
+ return self .buf .brightness
193
223
return self ._brightness
194
224
195
225
@brightness .setter
196
226
def brightness (self , brightness ):
197
227
# pylint: disable=attribute-defined-outside-init
198
- self ._brightness = min (max (brightness , 0.0 ), 1.0 )
228
+ if PixelBuf :
229
+ self .buf .brightness = brightness
230
+ else :
231
+ self ._brightness = min (max (brightness , 0.0 ), 1.0 )
199
232
if self .auto_write :
200
233
self .show ()
201
234
@@ -221,7 +254,9 @@ def show(self):
221
254
222
255
The colors may or may not be showing after this function returns because
223
256
it may be done asynchronously."""
224
- if self .brightness > 0.99 :
257
+ if PixelBuf :
258
+ neopixel_write (self .pin , self .buf .buf )
259
+ elif self .brightness > 0.99 :
225
260
neopixel_write (self .pin , self .buf )
226
261
else :
227
262
neopixel_write (self .pin , bytearray ([int (i * self .brightness ) for i in self .buf ]))
0 commit comments