Merge branch 'main' into dma_solution

pull/25/head
Greg 2025-04-13 20:57:31 -04:00
commit ea8b554cee
1 zmienionych plików z 14 dodań i 3 usunięć

Wyświetl plik

@ -1,5 +1,5 @@
import array, time import array, time
from machine import Pin from machine import Pin, enable_irq, disable_irq
import rp2 import rp2
@ -73,7 +73,7 @@ class Neopixel:
# 'brightnessvalue', # brightness scale factor 1..255 # 'brightnessvalue', # brightness scale factor 1..255
# ] # ]
def __init__(self, num_leds, state_machine, pin, mode="RGB", delay=0.0003): def __init__(self, num_leds, state_machine, pin, mode="RGB", delay=0.0003, critical=False):
""" """
Constructor for library class Constructor for library class
@ -83,6 +83,8 @@ class Neopixel:
:param mode: [default: "RGB"] mode and order of bits representing the color value. :param mode: [default: "RGB"] mode and order of bits representing the color value.
This can be any order of RGB or RGBW (neopixels are usually GRB) This can be any order of RGB or RGBW (neopixels are usually GRB)
:param delay: [default: 0.0001] delay used for latching of leds when sending data :param delay: [default: 0.0001] delay used for latching of leds when sending data
:param critical: [default: False] if True, disable interrupts while sending data to the PIO
This will eliminate glitching tearing, but could be a problem is have other high priority interrupts
""" """
self.pixels = array.array("I", [0] * num_leds) self.pixels = array.array("I", [0] * num_leds)
self.mode = mode self.mode = mode
@ -104,6 +106,7 @@ class Neopixel:
self.dma = rp2.DMA() self.dma = rp2.DMA()
DATA_REQUEST_INDEX = (pin << 3) + state_machine DATA_REQUEST_INDEX = (pin << 3) + state_machine
self.dma_ctrl = self.dma.pack_ctrl(size=2, inc_write=False, treq_sel=DATA_REQUEST_INDEX) self.dma_ctrl = self.dma.pack_ctrl(size=2, inc_write=False, treq_sel=DATA_REQUEST_INDEX)
self.critical = critical
def brightness(self, brightness=None): def brightness(self, brightness=None):
""" """
@ -345,6 +348,11 @@ class Neopixel:
if self.W_in_mode: if self.W_in_mode:
cut = 0 cut = 0
if self.critical:
irq_state = disable_irq()
self.sm.put(self.pixels, cut)
data = array.array('I',self.pixels) data = array.array('I',self.pixels)
for i,_ in enumerate(data): for i,_ in enumerate(data):
data[i] <<= cut data[i] <<= cut
@ -358,6 +366,9 @@ class Neopixel:
while self.dma.active(): while self.dma.active():
pass pass
if self.critical:
enable_irq(irq_state)
time.sleep(self.delay) time.sleep(self.delay)
def fill(self, rgb_w, how_bright=None): def fill(self, rgb_w, how_bright=None):