Skip to content

Commit e1d3b10

Browse files
dhalberttannewt
authored andcommitted
Fix brightness for single pixels. Fix __getitem__ for slices.
__getitem__ was referring to .bpp, which didn't exist. Not sure what was wrong with brightness, but I cleaned up the code a bit. Tested on a Gemma and on a DotStar strip.
1 parent a6251c9 commit e1d3b10

File tree

1 file changed

+24
-28
lines changed

1 file changed

+24
-28
lines changed

adafruit_dotstar.py

+24-28
Original file line numberDiff line numberDiff line change
@@ -72,33 +72,32 @@ def __init__(self, clock, data, n, brightness=1.0, auto_write=True):
7272
self.cpin.direction = digitalio.Direction.OUTPUT
7373
self.cpin.value = False
7474
self.n = n
75-
self.start_header = 4
75+
self.start_header_size = 4
7676
# Supply one extra clock cycle for each two pixels in the strip.
77-
self.end_header = n // 16
77+
self.end_header_size = n // 16
7878
if n % 16 != 0:
79-
self.end_header += 1
80-
self.buf = bytearray(n * 4 + self.start_header + self.end_header)
79+
self.end_header_size += 1
80+
self.buf = bytearray(n * 4 + self.start_header_size + self.end_header_size)
81+
self.end_header_index = len(self.buf) - self.end_header_size;
8182

8283
# Four empty bytes to start.
83-
for i in range(self.start_header):
84+
for i in range(self.start_header_size):
8485
self.buf[i] = 0x00
8586
# Mark the beginnings of each pixel.
86-
for i in range(n):
87-
self.buf[self.start_header + 4 * i] = 0xff
87+
for i in range(self.start_header_size, self.end_header_index, 4):
88+
self.buf[i] = 0xff
8889
# 0xff bytes at the end.
89-
for i in range(self.end_header):
90-
self.buf[len(self.buf) - 1 - i] = 0xff
90+
for i in range(self.end_header_index, len(self.buf)):
91+
self.buf[i] = 0xff
9192
self.brightness = brightness
9293
self.auto_write = auto_write
9394

9495
def deinit(self):
9596
"""Blank out the DotStars and release the resources."""
9697
self.auto_write = False
97-
for i in range(self.start_header, len(self.buf) - self.end_header):
98-
# Preserve the pixel markers.
99-
if i % 4 == 0:
100-
continue
101-
self.buf[i] = 0
98+
for i in range(self.start_header_size, self.end_header_index):
99+
if i % 4 != 0:
100+
self.buf[i] = 0
102101
self.show()
103102
if self.spi:
104103
self.spi.deinit()
@@ -116,7 +115,7 @@ def __repr__(self):
116115
return "[" + ", ".join([str(x) for x in self]) + "]"
117116

118117
def _set_item(self, index, value):
119-
offset = index * 4 + self.start_header
118+
offset = index * 4 + self.start_header_size
120119
r = 0
121120
g = 0
122121
b = 0
@@ -130,7 +129,7 @@ def _set_item(self, index, value):
130129
# sheet suggests using a global brightness in the first byte, we don't
131130
# do that because it causes further issues with persistence of vision
132131
# projects.
133-
self.buf[offset] = 0xff
132+
self.buf[offset] = 0xff # redundant; should already be set
134133
self.buf[offset + 1] = b
135134
self.buf[offset + 2] = g
136135
self.buf[offset + 3] = r
@@ -154,16 +153,16 @@ def __setitem__(self, index, val):
154153
def __getitem__(self, index):
155154
if isinstance(index, slice):
156155
out = []
157-
for in_i in range(*index.indices(len(self.buf) // self.bpp)):
158-
out.append(tuple(self.buf[in_i * 4 + (3 - i) + self.start_header]
156+
for in_i in range(*index.indices(len(self.buf) // 4)):
157+
out.append(tuple(self.buf[in_i * 4 + (3 - i) + self.start_header_size]
159158
for i in range(3)))
160159
return out
161160
if index < 0:
162161
index += len(self)
163162
if index >= self.n or index < 0:
164163
raise IndexError
165164
offset = index * 4
166-
return tuple(self.buf[offset + (3 - i) + self.start_header]
165+
return tuple(self.buf[offset + (3 - i) + self.start_header_size]
167166
for i in range(3))
168167

169168
def __len__(self):
@@ -205,18 +204,15 @@ def show(self):
205204
# Create a second output buffer if we need to compute brightness
206205
buf = self.buf
207206
if self.brightness < 1.0:
208-
buf = bytearray(self.n * 4 + self.start_header + self.end_header)
207+
buf = bytearray(self.buf)
209208
# Four empty bytes to start.
210-
for i in range(self.start_header):
209+
for i in range(self.start_header_size):
211210
buf[i] = 0x00
212-
for i in range(self.start_header, len(self.buf) - self.end_header - 1):
213-
if i % 4 == 0:
214-
buf[i] = self.buf[i]
215-
continue
216-
buf[i] = int(self.buf[i] * self._brightness)
211+
for i in range(self.start_header_size, self.end_header_index):
212+
buf[i] = self.buf[i] if i %4 == 0 else int(self.buf[i] * self._brightness)
217213
# Four 0xff bytes at the end.
218-
for i in range(self.end_header):
219-
buf[len(self.buf) - 4 + i] = 0xff
214+
for i in range(self.end_header_index, len(buf)):
215+
buf[i] = 0xff
220216

221217
if self.spi:
222218
self.spi.write(buf)

0 commit comments

Comments
 (0)