Skip to content

Commit 37f95df

Browse files
authored
Merge pull request #22 from caternuson/tunable_kawrgs
Make things tunable via kwargs
2 parents 3000907 + 05c2d9b commit 37f95df

File tree

1 file changed

+30
-12
lines changed

1 file changed

+30
-12
lines changed

neopixel_spi.py

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,13 @@ class NeoPixel_SPI(_pixelbuf.PixelBuf):
7979
:param float brightness: Brightness of the pixels between 0.0 and 1.0 where 1.0 is full
8080
brightness
8181
:param bool auto_write: True if the neopixels should immediately change when set. If False,
82-
`show` must be called explicitly.
82+
``show`` must be called explicitly.
8383
:param tuple pixel_order: Set the pixel color channel order. GRBW is set by default.
84+
:param int frequency: SPI bus frequency. For 800kHz NeoPixels, use 6400000 (default).
85+
For 400kHz, use 3200000.
86+
:param float reset_time: Reset low level time in seconds. Default is 80e-6.
87+
:param byte bit0: Bit pattern to set timing for a NeoPixel 0 bit.
88+
:param byte bit1: Bit pattern to set timing for a NeoPixel 1 bit.
8489
8590
Example:
8691
@@ -93,11 +98,19 @@ class NeoPixel_SPI(_pixelbuf.PixelBuf):
9398
pixels.fill(0xff0000)
9499
"""
95100

96-
FREQ = 6400000 # 800kHz * 8, actual may be different
97-
TRST = 80e-6 # Reset code low level time
98-
99101
def __init__(
100-
self, spi, n, *, bpp=3, brightness=1.0, auto_write=True, pixel_order=None
102+
self,
103+
spi,
104+
n,
105+
*,
106+
bpp=3,
107+
brightness=1.0,
108+
auto_write=True,
109+
pixel_order=None,
110+
frequency=6400000,
111+
reset_time=80e-6,
112+
bit0=0b11000000,
113+
bit1=0b11110000
101114
):
102115

103116
# configure bpp and pixel_order
@@ -109,17 +122,22 @@ def __init__(
109122
order_list = [RGBW[order] for order in pixel_order]
110123
pixel_order = "".join(order_list)
111124

125+
# neopixel stuff
126+
self._bit0 = bit0
127+
self._bit1 = bit1
128+
self._trst = reset_time
129+
112130
# set up SPI related stuff
113-
self._spi = SPIDevice(spi, baudrate=self.FREQ)
131+
self._spi = SPIDevice(spi, baudrate=frequency)
114132
with self._spi as spibus:
115133
try:
116134
# get actual SPI frequency
117135
freq = spibus.frequency
118136
except AttributeError:
119137
# use nominal
120-
freq = self.FREQ
121-
self._reset = bytes([0] * round(freq * self.TRST / 8))
122-
self.spibuf = bytearray(8 * n * bpp)
138+
freq = frequency
139+
self._reset = bytes([0] * round(freq * self._trst / 8))
140+
self._spibuf = bytearray(8 * n * bpp)
123141

124142
# everything else taken care of by base class
125143
super().__init__(
@@ -149,7 +167,7 @@ def _transmit(self, buffer):
149167
with self._spi as spi:
150168
# write out special byte sequence surrounded by RESET
151169
# leading RESET needed for cases where MOSI rests HI
152-
spi.write(self._reset + self.spibuf + self._reset)
170+
spi.write(self._reset + self._spibuf + self._reset)
153171

154172
def _transmogrify(self, buffer):
155173
"""Turn every BIT of buf into a special BYTE pattern."""
@@ -158,7 +176,7 @@ def _transmogrify(self, buffer):
158176
# MSB first
159177
for i in range(7, -1, -1):
160178
if byte >> i & 0x01:
161-
self.spibuf[k] = 0b11110000 # A NeoPixel 1 bit
179+
self._spibuf[k] = self._bit1 # A NeoPixel 1 bit
162180
else:
163-
self.spibuf[k] = 0b11000000 # A NeoPixel 0 bit
181+
self._spibuf[k] = self._bit0 # A NeoPixel 0 bit
164182
k += 1

0 commit comments

Comments
 (0)