@@ -105,6 +105,15 @@ def __init__(self, num, pin, freq_hz=800000, dma=10, invert=False,
105
105
# Grab the led data array.
106
106
self ._led_data = _LED_Data (self ._channel , num )
107
107
108
+ # Create a PixelSubStrip and delegate these methods to it
109
+ self .main_strip = self .PixelSubStrip (self , 0 , num = num )
110
+ self .setPixelColor = self .main_strip .setPixelColor
111
+ self .setPixelColorRGB = self .main_strip .setPixelColorRGB
112
+ self .setBrightness = self .main_strip .setBrightness
113
+ self .getBrightness = self .main_strip .getBrightness
114
+ self .getPixels = self .main_strip .getPixels
115
+ self .getPixelColor = self .main_strip .getPixelColor
116
+
108
117
# Substitute for __del__, traps an exit condition and cleans up properly
109
118
atexit .register (self ._cleanup )
110
119
@@ -137,55 +146,109 @@ def show(self):
137
146
str_resp = ws .ws2811_get_return_t_str (resp )
138
147
raise RuntimeError ('ws2811_render failed with code {0} ({1})' .format (resp , str_resp ))
139
148
140
- def setPixelColor (self , n , color ):
141
- """Set LED at position n to the provided 24-bit color value (in RGB order).
142
- """
143
- self ._led_data [n ] = color
144
-
145
- def setPixelColorRGB (self , n , red , green , blue , white = 0 ):
146
- """Set LED at position n to the provided red, green, and blue color.
147
- Each color component should be a value from 0 to 255 (where 0 is the
148
- lowest intensity and 255 is the highest intensity).
149
- """
150
- self .setPixelColor (n , Color (red , green , blue , white ))
151
-
152
- def getBrightness (self ):
153
- return ws .ws2811_channel_t_brightness_get (self ._channel )
154
-
155
- def setBrightness (self , brightness ):
156
- """Scale each LED in the buffer by the provided brightness. A brightness
157
- of 0 is the darkest and 255 is the brightest.
158
- """
159
- ws .ws2811_channel_t_brightness_set (self ._channel , brightness )
160
-
161
- def getPixels (self ):
162
- """Return an object which allows access to the LED display data as if
163
- it were a sequence of 24-bit RGB values.
164
- """
165
- return self ._led_data
166
-
167
149
def numPixels (self ):
168
150
"""Return the number of pixels in the display."""
169
151
return ws .ws2811_channel_t_count_get (self ._channel )
170
152
171
- def getPixelColor (self , n ):
172
- """Get the 24-bit RGB color value for the LED at position n."""
173
- return self ._led_data [n ]
153
+ def createPixelSubStrip (self , first , last = None , num = None ):
154
+ """Create a PixelSubStrip starting with pixel `first`
155
+ Either specify the `num` of pixels or the `last` pixel.
156
+
157
+ All the methods of a PixelSubStrip are available on PixelStrip
158
+ objects.
174
159
175
- def getPixelColorRGB (self , n ):
176
- c = lambda : None
177
- setattr (c , 'r' , self ._led_data [n ] >> 16 & 0xff )
178
- setattr (c , 'g' , self ._led_data [n ] >> 8 & 0xff )
179
- setattr (c , 'b' , self ._led_data [n ] & 0xff )
180
- return c
160
+ Note: PixelSubStrips are not prevented from overlappping
161
+ """
162
+ if last :
163
+ if last > self .numPixels ():
164
+ raise self .InvalidStrip (f"Too many pixels ({ last } )."
165
+ f"Strip only has { self .numPixels ()} ." )
166
+ return self .PixelSubStrip (self , first , last = last )
167
+ if num :
168
+ if first + num > self .numPixels ():
169
+ raise self .InvalidStrip (f"Too many pixels ({ first + num } )."
170
+ f"Strip only has { self .numPixels ()} ." )
171
+ return self .PixelSubStrip (self , first , num = num )
172
+ raise self .InvalidStrip ("Need num or last to create a PixelSubStrip" )
173
+
174
+ class InvalidStrip (Exception ):
175
+ pass
181
176
182
- def getPixelColorRGBW (self , n ):
183
- c = lambda : None
184
- setattr (c , 'w' , self ._led_data [n ] >> 24 & 0xff )
185
- setattr (c , 'r' , self ._led_data [n ] >> 16 & 0xff )
186
- setattr (c , 'g' , self ._led_data [n ] >> 8 & 0xff )
187
- setattr (c , 'b' , self ._led_data [n ] & 0xff )
188
- return c
177
+ class PixelSubStrip :
178
+ """A PixelSubStrip handles a subset of the pixels in a PixelStrip
179
+
180
+ strip = PixelStrip(...)
181
+ strip1 = strip.createPixelSubStrip(0, num=10) # controls first 10 pixels
182
+ strip2 = strip.createPixelSubStrip(10, num=10) # controls next 10 pixels
183
+ """
184
+ def __init__ (self , strip , first , last = None , num = None ):
185
+ self .strip = strip
186
+ self .first = first
187
+ if last :
188
+ self .last = last
189
+ self .num = last - first
190
+ elif num :
191
+ self .last = first + num
192
+ self .num = num
193
+ else :
194
+ raise self .InvalidStrip ("Must specify number or last pixel to "
195
+ "create a PixelSubStrip" )
196
+
197
+ def setPixelColor (self , n , color ):
198
+ """Set LED at position n to the provided 24-bit color value (in RGB order).
199
+ """
200
+ self .strip ._led_data [self .first + n ] = color
201
+
202
+ def setPixelColorRGB (self , n , red , green , blue , white = 0 ):
203
+ """Set LED at position n to the provided red, green, and blue color.
204
+ Each color component should be a value from 0 to 255 (where 0 is the
205
+ lowest intensity and 255 is the highest intensity).
206
+ """
207
+ # No translation to n - do that in the called method
208
+ self .setPixelColor (n , Color (red , green , blue , white ))
209
+
210
+ def getBrightness (self ):
211
+ return ws .ws2811_channel_t_brightness_get (self .strip ._channel )
212
+
213
+ def setBrightness (self , brightness ):
214
+ """Scale each LED in the buffer by the provided brightness. A brightness
215
+ of 0 is the darkest and 255 is the brightest.
216
+
217
+ This method affects all pixels in all PixelSubStrips.
218
+ """
219
+ ws .ws2811_channel_t_brightness_set (self .strip ._channel , brightness )
220
+
221
+ def getPixels (self ):
222
+ """Return an object which allows access to the LED display data as if
223
+ it were a sequence of 24-bit RGB values.
224
+ """
225
+ return self .strip ._led_data
226
+
227
+ def getPixelColor (self , n ):
228
+ """Get the 24-bit RGB color value for the LED at position n."""
229
+ return self .strip ._led_data [self .first + n ]
230
+
231
+ def getPixelColorRGB (self , n ):
232
+ c = lambda : None
233
+ setattr (c , 'r' , self .strip ._led_data [self .first + n ] >> 16 & 0xff )
234
+ setattr (c , 'g' , self .strip ._led_data [self .first + n ] >> 8 & 0xff )
235
+ setattr (c , 'b' , self .strip ._led_data [self .first + n ] & 0xff )
236
+ return c
237
+
238
+ def numPixels (self ):
239
+ """Return the number of pixels in the strip."""
240
+ return self .num
241
+
242
+ def getPixelColorRGBW (self , n ):
243
+ c = lambda : None
244
+ setattr (c , 'w' , self .strip ._led_data [self .first + n ] >> 24 & 0xff )
245
+ setattr (c , 'r' , self .strip ._led_data [self .first + n ] >> 16 & 0xff )
246
+ setattr (c , 'g' , self .strip ._led_data [self .first + n ] >> 8 & 0xff )
247
+ setattr (c , 'b' , self .strip ._led_data [self .first + n ] & 0xff )
248
+ return c
249
+
250
+ def show (self ):
251
+ self .strip .show ()
189
252
190
253
# Shim for back-compatibility
191
254
class Adafruit_NeoPixel (PixelStrip ):
0 commit comments