36
36
__version__ = "0.0.0-auto.0"
37
37
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_DotStar.git"
38
38
39
+ # Pixel color order constants
40
+ RGB = (0 , 1 , 2 )
41
+ RBG = (0 , 2 , 1 )
42
+ GRB = (1 , 0 , 2 )
43
+ GBR = (1 , 2 , 0 )
44
+ BRG = (2 , 0 , 1 )
45
+ BGR = (2 , 1 , 0 )
46
+
47
+
39
48
class DotStar :
40
49
"""
41
50
A sequence of dotstars.
@@ -46,6 +55,9 @@ class DotStar:
46
55
:param float brightness: Brightness of the pixels between 0.0 and 1.0
47
56
:param bool auto_write: True if the dotstars should immediately change when
48
57
set. If False, `show` must be called explicitly.
58
+ :param tuple pixel_order: Set the pixel order on the strip - different
59
+ strips implement this differently. If you send red, and it looks blue
60
+ or green on the strip, modify this! It should be one of the values above
49
61
50
62
51
63
Example for Gemma M0:
@@ -63,7 +75,7 @@ class DotStar:
63
75
time.sleep(2)
64
76
"""
65
77
66
- def __init__ (self , clock , data , n , * , brightness = 1.0 , auto_write = True ):
78
+ def __init__ (self , clock , data , n , * , brightness = 1.0 , auto_write = True , pixel_order = BGR ):
67
79
self ._spi = None
68
80
try :
69
81
self ._spi = busio .SPI (clock , MOSI = data )
@@ -84,7 +96,7 @@ def __init__(self, clock, data, n, *, brightness=1.0, auto_write=True):
84
96
self .end_header_size += 1
85
97
self ._buf = bytearray (n * 4 + self .start_header_size + self .end_header_size )
86
98
self .end_header_index = len (self ._buf ) - self .end_header_size
87
-
99
+ self . pixel_order = pixel_order
88
100
# Four empty bytes to start.
89
101
for i in range (self .start_header_size ):
90
102
self ._buf [i ] = 0x00
@@ -125,23 +137,18 @@ def __repr__(self):
125
137
126
138
def _set_item (self , index , value ):
127
139
offset = index * 4 + self .start_header_size
128
- r = 0
129
- g = 0
130
- b = 0
140
+ rbg = value
131
141
if isinstance (value , int ):
132
- r = value >> 16
133
- g = (value >> 8 ) & 0xff
134
- b = value & 0xff
135
- else :
136
- r , g , b = value
142
+ rgb = (value >> 16 , (value >> 8 ) & 0xff , value & 0xff )
143
+
137
144
# Each pixel starts with 0xFF, then red/green/blue. Although the data
138
145
# sheet suggests using a global brightness in the first byte, we don't
139
146
# do that because it causes further issues with persistence of vision
140
147
# projects.
141
148
self ._buf [offset ] = 0xff # redundant; should already be set
142
- self ._buf [offset + 1 ] = b
143
- self ._buf [offset + 2 ] = g
144
- self ._buf [offset + 3 ] = r
149
+ self ._buf [offset + 1 ] = rgb [ self . pixel_order [ 0 ]]
150
+ self ._buf [offset + 2 ] = rgb [ self . pixel_order [ 1 ]]
151
+ self ._buf [offset + 3 ] = rgb [ self . pixel_order [ 2 ]]
145
152
146
153
def __setitem__ (self , index , val ):
147
154
if isinstance (index , slice ):
@@ -220,7 +227,7 @@ def show(self):
220
227
for i in range (self .start_header_size ):
221
228
buf [i ] = 0x00
222
229
for i in range (self .start_header_size , self .end_header_index ):
223
- buf [i ] = self ._buf [i ] if i % 4 == 0 else int (self ._buf [i ] * self ._brightness )
230
+ buf [i ] = self ._buf [i ] if i % 4 == 0 else int (self ._buf [i ] * self ._brightness )
224
231
# Four 0xff bytes at the end.
225
232
for i in range (self .end_header_index , len (buf )):
226
233
buf [i ] = 0xff
0 commit comments