32
32
bitloop:
33
33
pull ifempty [1] ; don't start outputting HIGH unless data is available (always-low part)
34
34
mov pins, ~ null [3] ; always-high part
35
- out pins, 8 [4] ; variable part
35
+ {} ; variable part
36
36
mov pins, null ; always-low part (last cycle is the 'pull ifempty' after wrap)
37
37
38
38
jmp y--, bitloop ; always-low part
46
46
jmp top
47
47
"""
48
48
49
- _ASSEMBLED = adafruit_pioasm .assemble (_PROGRAM )
50
49
51
50
# Pixel color order constants
52
51
RGB = "RGB"
@@ -110,7 +109,7 @@ def __init__(
110
109
brightness = 1.0 ,
111
110
auto_write = True ,
112
111
pixel_order = None ,
113
- ):
112
+ ): # pylint: disable=too-many-locals
114
113
if n % num_strands :
115
114
raise ValueError ("Length must be a multiple of num_strands" )
116
115
if not pixel_order :
@@ -124,25 +123,48 @@ def __init__(
124
123
n , brightness = brightness , byteorder = pixel_order , auto_write = auto_write
125
124
)
126
125
127
- data_len = bpp * n * 8 // num_strands
126
+ if num_strands == 1 :
127
+ data_len = bpp * n
128
+ pack = ">L"
129
+ osr = False
130
+ loop_count = 8 * data_len
131
+ else :
132
+ data_len = bpp * n * 8 // num_strands
133
+ pack = "<L"
134
+ osr = True
135
+ loop_count = data_len
128
136
padding_count = - data_len % 4
129
137
138
+ self ._num_strands = num_strands
130
139
self ._data = bytearray (8 + data_len + padding_count )
131
140
self ._data32 = memoryview (self ._data ).cast ("L" )
132
- self ._transposed = memoryview (self ._data )[4 : 4 + data_len ]
133
- self ._data [:4 ] = struct .pack ("<L" , data_len - 1 )
134
- self ._data [- 4 :] = struct .pack ("<L" , 3840 * 2 )
141
+ self ._pixels = memoryview (self ._data )[4 : 4 + data_len ]
142
+ self ._data [:4 ] = struct .pack (pack , loop_count - 1 )
143
+ self ._data [- 4 :] = struct .pack (pack , 3840 )
135
144
136
145
self ._num_strands = num_strands
137
146
147
+ if num_strands == 8 :
148
+ variable_part = "out pins, 8 [4] ; variable part"
149
+ elif num_strands == 1 :
150
+ variable_part = "out pins, 1 [4] ; variable part"
151
+ else :
152
+ variable_part = f"""
153
+ out pins, { num_strands } [3] ; variable part
154
+ out x, { 8 - num_strands } ; variable part
155
+ """
156
+
157
+ program = _PROGRAM .format (variable_part )
158
+ assembled = adafruit_pioasm .assemble (program )
159
+
138
160
self ._sm = rp2pio .StateMachine (
139
- _ASSEMBLED ,
161
+ assembled ,
140
162
frequency = 800_000 * 16 ,
141
163
first_out_pin = data0 ,
142
- out_pin_count = 8 ,
164
+ out_pin_count = num_strands ,
143
165
first_set_pin = data0 ,
144
166
auto_pull = False ,
145
- out_shift_right = True ,
167
+ out_shift_right = osr ,
146
168
)
147
169
148
170
def deinit (self ):
@@ -177,5 +199,9 @@ def num_strands(self):
177
199
def _transmit (self , buffer ):
178
200
while self ._sm .pending :
179
201
pass
180
- bitops .bit_transpose (buffer , self ._transposed , self ._num_strands )
181
- self ._sm .background_write (self ._data32 )
202
+ if self .num_strands == 1 :
203
+ self ._pixels [:] = buffer
204
+ self ._sm .background_write (self ._data32 , swap = True )
205
+ else :
206
+ bitops .bit_transpose (buffer , self ._pixels , self ._num_strands )
207
+ self ._sm .background_write (self ._data32 )
0 commit comments