pub struct WS2812Driver<const N: u8, const L: usize, PINS: Pins<N, L>>{ /* private fields */ }
Expand description
A WS2812 Neopixel LED Strip driver based on the i.MX RT FlexIO module
Implementations§
Source§impl<const N: u8, const L: usize, PINS: Pins<N, L>> WS2812Driver<N, L, PINS>
impl<const N: u8, const L: usize, PINS: Pins<N, L>> WS2812Driver<N, L, PINS>
Sourcepub fn init(flexio: Instance<N>, pins: PINS) -> Result<Self, WS2812InitError>
pub fn init(flexio: Instance<N>, pins: PINS) -> Result<Self, WS2812InitError>
Initializes the FlexIO driver.
IMPORTANT! Make sure that the clock input of the FlexIO instance is at 16MHz prior to calling this function.
Note that not all amounts of pins are always supported. The limiting factor is most likely the number of FlexIO timers; we need two timers plus an additional two per pin.
For example, if the FlexIO instance has 8 timers, it supports up to 3 pins.
Sourcepub fn take_interrupt_handler(
&mut self,
storage: &'static mut Option<InterruptHandlerData<N>>,
) -> InterruptHandler<N>
pub fn take_interrupt_handler( &mut self, storage: &'static mut Option<InterruptHandlerData<N>>, ) -> InterruptHandler<N>
Take the interrupt handler callback from the driver.
§Arguments
storage
- Static memory required by the function to work. SeeInterruptHandlerData
for more information.
For correct functionality of write_dma()
in
waker-based async runtimes (like RTIC 2), it is required to invoke the returned
InterruptHandler
every time an interrupt of the given FlexIO peripheral happens.
Sourcepub fn write(&mut self, data: [&mut dyn PixelStreamRef; L])
pub fn write(&mut self, data: [&mut dyn PixelStreamRef; L])
Writes pixels to an LED strip.
If the strips are of different length, the shorter ones will be padded
with 0
to match the longest strip.
For technical reasons, an additional [0, 0, 0]
pixel will be added at
the of the transmission.
Sourcepub async fn write_dma<F, R, const N2: usize, const P: usize>(
&mut self,
data: &PreprocessedPixels<N2, L, P>,
dma: &mut Channel,
dma_signal_id: u32,
concurrent_action: F,
) -> Result<WriteDmaResult<R>, Error>where
F: Future<Output = R>,
pub async fn write_dma<F, R, const N2: usize, const P: usize>(
&mut self,
data: &PreprocessedPixels<N2, L, P>,
dma: &mut Channel,
dma_signal_id: u32,
concurrent_action: F,
) -> Result<WriteDmaResult<R>, Error>where
F: Future<Output = R>,
Writes pixels to an LED strip.
In contrast to write()
, this one performs the actual copy
via DMA, whilst allowing for something else (like the next frame) to be
computed concurrently.
§Arguments
data
- Preprocessed pixel data to send to the LED stripsdma
- The dma channel that should be used to transmit the datadma_signal_id
- The signal the FlexIO unit uses to communicate with the DMA. This is chip specific and must therefore be supplied by the user. The value can be found in the reference manual.concurrent_action
- A function that will be executed while the pixels get transferred. Typically used to render the next frame, so it can be transmitted afterwards without a delay, to achieve the maximum possible framerate.
For technical reasons, an additional [0, 0, 0]
pixel will be added at
the of the transmission.
Sourcepub fn write_dma_blocking<F, R, const N2: usize, const P: usize>(
&mut self,
data: &PreprocessedPixels<N2, L, P>,
dma: &mut Channel,
dma_signal_id: u32,
concurrent_action: F,
) -> Result<WriteDmaResult<R>, Error>where
F: FnOnce() -> R,
pub fn write_dma_blocking<F, R, const N2: usize, const P: usize>(
&mut self,
data: &PreprocessedPixels<N2, L, P>,
dma: &mut Channel,
dma_signal_id: u32,
concurrent_action: F,
) -> Result<WriteDmaResult<R>, Error>where
F: FnOnce() -> R,
Same as write_dma()
, but blocks until completion.
Do not use this function in an async context as it will busy-wait internally.
Auto Trait Implementations§
impl<const N: u8, const L: usize, PINS> !Freeze for WS2812Driver<N, L, PINS>
impl<const N: u8, const L: usize, PINS> !RefUnwindSafe for WS2812Driver<N, L, PINS>
impl<const N: u8, const L: usize, PINS> !Send for WS2812Driver<N, L, PINS>
impl<const N: u8, const L: usize, PINS> !Sync for WS2812Driver<N, L, PINS>
impl<const N: u8, const L: usize, PINS> Unpin for WS2812Driver<N, L, PINS>where
PINS: Unpin,
impl<const N: u8, const L: usize, PINS> !UnwindSafe for WS2812Driver<N, L, PINS>
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters
when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self
into C
, using the provided parameters.Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle
.Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other
into Self
, while performing the appropriate scaling,
rounding and clamping.Source§impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T
.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters
when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self
into C
, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Source§impl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self
into T
, while performing the appropriate scaling,
rounding and clamping.Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors
fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds
error is returned which contains
the unclamped color. Read more