Skip to content

Commit 7f53fec

Browse files
committed
neopixel setting fixed
1 parent 7806f2e commit 7f53fec

File tree

1 file changed

+51
-14
lines changed

1 file changed

+51
-14
lines changed

adafruit_seesaw/neopixel.py

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,21 +39,33 @@
3939
_NEOPIXEL_BUF = const(0x04)
4040
_NEOPIXEL_SHOW = const(0x05)
4141

42-
class Neopixel:
42+
# Pixel color order constants
43+
RGB = (0, 1, 2)
44+
"""Red Green Blue"""
45+
GRB = (1, 0, 2)
46+
"""Green Red Blue"""
47+
RGBW = (0, 1, 2, 3)
48+
"""Red Green Blue White"""
49+
GRBW = (1, 0, 2, 3)
50+
"""Green Red Blue White"""
51+
52+
class NeoPixel:
4353
def __init__(self, seesaw, pin, n, *, bpp=3, brightness=1.0, auto_write=True, pixel_order=None):
54+
# TODO: brightness not yet implemented.
4455
self._seesaw = seesaw
4556
self._pin = pin
4657
self._bpp = bpp
47-
self._auto_write = auto_write
48-
self._pixel_order = pixel_order
58+
self.auto_write = auto_write
4959
self._n = n
5060
self._brightness = brightness
61+
self._pixel_order = GRBW if pixel_order is None else pixel_order
5162

5263
cmd = bytearray([pin])
5364
self._seesaw.write(_NEOPIXEL_BASE, _NEOPIXEL_PIN, cmd)
5465
cmd = struct.pack(">H", n*self._bpp)
5566
self._seesaw.write(_NEOPIXEL_BASE, _NEOPIXEL_BUF_LENGTH, cmd)
5667

68+
5769
@property
5870
def brightness(self):
5971
pass
@@ -68,26 +80,51 @@ def deinit(self):
6880
def __len__(self):
6981
return self._n
7082

71-
def __setitem__(self, key, value):
72-
cmd = bytearray(6)
73-
cmd[:2] = struct.pack(">H", key * self._bpp)
74-
cmd[2:] = struct.pack(">I", value)
83+
def __setitem__(self, key, color):
84+
cmd = bytearray(2 + self._bpp)
85+
struct.pack_into(">H", cmd, 0, key * self._bpp)
86+
if isinstance(color, int):
87+
w = color >> 24
88+
r = (color >> 16) & 0xff
89+
g = (color >> 8) & 0xff
90+
b = color & 0xff
91+
else:
92+
if self._bpp == 3:
93+
r, g, b = color
94+
else:
95+
r, g, b, w = color
96+
97+
# If all components are the same and we have a white pixel then use it
98+
# instead of the individual components.
99+
if self._bpp == 4 and r == g == b:
100+
w = r
101+
r = 0
102+
g = 0
103+
b = 0
104+
105+
# Store colors in correct slots
106+
cmd[2 + self._pixel_order[0]] = r
107+
cmd[2 + self._pixel_order[1]] = g
108+
cmd[2 + self._pixel_order[2]] = b
109+
if self._bpp == 4:
110+
cmd[2 + self._pixel_order[3]] = w
111+
75112
self._seesaw.write(_NEOPIXEL_BASE, _NEOPIXEL_BUF, cmd)
76-
if self._auto_write:
113+
if self.auto_write:
77114
self.show()
78115

79116
def __getitem__(self, key):
80117
pass
81118

82119
def fill(self, color):
83-
cmd = bytearray(self._n*self._bpp+2)
120+
# Suppress auto_write while filling.
121+
current_auto_write = self.auto_write
122+
self.auto_write = False
84123
for i in range(self._n):
85-
cmd[self._bpp*i+2:] = struct.pack(">I", color)
86-
87-
self._seesaw.write(_NEOPIXEL_BASE, _NEOPIXEL_BUF, cmd)
88-
89-
if self._auto_write:
124+
self[i] = color
125+
if current_auto_write:
90126
self.show()
127+
self.auto_write = current_auto_write
91128

92129
def show(self):
93130
self._seesaw.write(_NEOPIXEL_BASE, _NEOPIXEL_SHOW)

0 commit comments

Comments
 (0)