From 9ddeaa88702d742e01864370a432c8c3ebe0c697 Mon Sep 17 00:00:00 2001 From: Felipe Balbi Date: Mon, 28 Apr 2025 08:01:46 +0300 Subject: [PATCH 1/3] rp235x: update smart-leds to 0.4 No functional changes. --- examples/rp235x/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/rp235x/Cargo.toml b/examples/rp235x/Cargo.toml index 345a915afe..017d9d99f0 100644 --- a/examples/rp235x/Cargo.toml +++ b/examples/rp235x/Cargo.toml @@ -43,7 +43,7 @@ embedded-graphics = "0.8.1" mipidsi = "0.8.0" display-interface = "0.5.0" byte-slice-cast = { version = "1.2.0", default-features = false } -smart-leds = "0.3.0" +smart-leds = "0.4.0" heapless = "0.8" usbd-hid = "0.8.1" From 4b1292576044d9d483651b5006311bab7ffbc1ce Mon Sep 17 00:00:00 2001 From: Felipe Balbi Date: Mon, 28 Apr 2025 08:06:28 +0300 Subject: [PATCH 2/3] embassy-rp: accept an iterator of RGB8 colors instead of an array This change will let us make use of `gamma()` and `brightness` iterator adapters to compute gamma correction and desired maximum brightness levels. --- embassy-rp/src/pio_programs/ws2812.rs | 12 +++++++++--- examples/rp/src/bin/pio_ws2812.rs | 4 ++-- examples/rp235x/src/bin/pio_ws2812.rs | 4 ++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/embassy-rp/src/pio_programs/ws2812.rs b/embassy-rp/src/pio_programs/ws2812.rs index 578937e11d..d5fca20882 100644 --- a/embassy-rp/src/pio_programs/ws2812.rs +++ b/embassy-rp/src/pio_programs/ws2812.rs @@ -97,11 +97,17 @@ impl<'d, P: Instance, const S: usize, const N: usize> PioWs2812<'d, P, S, N> { } /// Write a buffer of [smart_leds::RGB8] to the ws2812 string - pub async fn write(&mut self, colors: &[RGB8; N]) { + pub async fn write(&mut self, iterator: T) + where + T: IntoIterator, + I: Into, + { // Precompute the word bytes from the colors let mut words = [0u32; N]; - for i in 0..N { - let word = (u32::from(colors[i].g) << 24) | (u32::from(colors[i].r) << 16) | (u32::from(colors[i].b) << 8); + + for (i, c) in iterator.into_iter().enumerate() { + let color = c.into(); + let word = (u32::from(color.g) << 24) | (u32::from(color.r) << 16) | (u32::from(color.b) << 8); words[i] = word; } diff --git a/examples/rp/src/bin/pio_ws2812.rs b/examples/rp/src/bin/pio_ws2812.rs index d1fcfc471a..a8bdf3120f 100644 --- a/examples/rp/src/bin/pio_ws2812.rs +++ b/examples/rp/src/bin/pio_ws2812.rs @@ -49,7 +49,7 @@ async fn main(_spawner: Spawner) { // Thing plus: 8 // Adafruit Feather: 16; Adafruit Feather+RFM95: 4 let program = PioWs2812Program::new(&mut common); - let mut ws2812 = PioWs2812::new(&mut common, sm0, p.DMA_CH0, p.PIN_16, &program); + let mut ws2812: PioWs2812<'_, PIO0, 0, NUM_LEDS> = PioWs2812::new(&mut common, sm0, p.DMA_CH0, p.PIN_16, &program); // Loop forever making RGB values and pushing them out to the WS2812. let mut ticker = Ticker::every(Duration::from_millis(10)); @@ -60,7 +60,7 @@ async fn main(_spawner: Spawner) { data[i] = wheel((((i * 256) as u16 / NUM_LEDS as u16 + j as u16) & 255) as u8); debug!("R: {} G: {} B: {}", data[i].r, data[i].g, data[i].b); } - ws2812.write(&data).await; + ws2812.write(data.into_iter()).await; ticker.next().await; } diff --git a/examples/rp235x/src/bin/pio_ws2812.rs b/examples/rp235x/src/bin/pio_ws2812.rs index 42694c5278..146ae8513e 100644 --- a/examples/rp235x/src/bin/pio_ws2812.rs +++ b/examples/rp235x/src/bin/pio_ws2812.rs @@ -49,7 +49,7 @@ async fn main(_spawner: Spawner) { // Thing plus: 8 // Adafruit Feather: 16; Adafruit Feather+RFM95: 4 let program = PioWs2812Program::new(&mut common); - let mut ws2812 = PioWs2812::new(&mut common, sm0, p.DMA_CH0, p.PIN_16, &program); + let mut ws2812: PioWs2812<'_, PIO0, 0, NUM_LEDS> = PioWs2812::new(&mut common, sm0, p.DMA_CH0, p.PIN_16, &program); // Loop forever making RGB values and pushing them out to the WS2812. let mut ticker = Ticker::every(Duration::from_millis(10)); @@ -60,7 +60,7 @@ async fn main(_spawner: Spawner) { data[i] = wheel((((i * 256) as u16 / NUM_LEDS as u16 + j as u16) & 255) as u8); debug!("R: {} G: {} B: {}", data[i].r, data[i].g, data[i].b); } - ws2812.write(&data).await; + ws2812.write(data.into_iter()).await; ticker.next().await; } From 4b488292473345d09045bda82c5b88c3e47d15ce Mon Sep 17 00:00:00 2001 From: Felipe Balbi Date: Mon, 28 Apr 2025 08:13:50 +0300 Subject: [PATCH 3/3] embassy-rp: implement SmartLedsWriteAsync --- embassy-rp/src/pio_programs/ws2812.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/embassy-rp/src/pio_programs/ws2812.rs b/embassy-rp/src/pio_programs/ws2812.rs index d5fca20882..6bef5b4830 100644 --- a/embassy-rp/src/pio_programs/ws2812.rs +++ b/embassy-rp/src/pio_programs/ws2812.rs @@ -1,8 +1,10 @@ //! [ws2812](https://www.sparkfun.com/datasheets/LCD/HD44780.pdf) +use core::convert::Infallible; + use embassy_time::Timer; use fixed::types::U24F8; -use smart_leds::RGB8; +use smart_leds::{SmartLedsWriteAsync, RGB8}; use crate::clocks::clk_sys_freq; use crate::dma::{AnyChannel, Channel}; @@ -117,3 +119,17 @@ impl<'d, P: Instance, const S: usize, const N: usize> PioWs2812<'d, P, S, N> { Timer::after_micros(55).await; } } + +impl<'d, P: Instance, const S: usize, const N: usize> SmartLedsWriteAsync for PioWs2812<'d, P, S, N> { + type Error = Infallible; + type Color = RGB8; + + async fn write(&mut self, iterator: T) -> Result<(), Self::Error> + where + T: IntoIterator, + I: Into, + { + self.write(iterator).await; + Ok(()) + } +}