#![no_std]
#![no_main]
use core::cfg_select;
use esp_backtrace as _;
use esp_hal::{delay::Delay, rmt::Rmt, time::Rate};
use esp_hal_smartled::{RmtSmartLeds, buffer_size, color_order};
use smart_leds::{
RGB8, SmartLedsWrite, brightness, gamma,
hsv::{Hsv, hsv2rgb},
};
esp_bootloader_esp_idf::esp_app_desc!();
#[esp_hal::main]
fn main() -> ! {
let peripherals = esp_hal::init(esp_hal::Config::default());
cfg_select! {
feature = "esp32" => {
let led_pin = peripherals.GPIO33;
}
feature = "esp32c3" => {
let led_pin = peripherals.GPIO8;
}
any(feature = "esp32c6", feature = "esp32h2") => {
let led_pin = peripherals.GPIO8;
}
feature = "esp32s2" => {
let led_pin = peripherals.GPIO18;
}
feature = "esp32s3" => {
let led_pin = peripherals.GPIO48;
}
}
cfg_select! {
feature = "esp32h2" => {
let freq = Rate::from_mhz(32);
}
_ => {
let freq = Rate::from_mhz(80);
}
}
const COUNT: usize = 60;
type LedColor = RGB8;
let mut led = {
let rmt = Rmt::new(peripherals.RMT, freq).expect("Failed to initialize RMT0");
RmtSmartLeds::<{ buffer_size::<LedColor>(COUNT) }, _, LedColor, color_order::Grb>::new_with_memsize(
esp_hal_smartled::WS2812_TIMING,
rmt.channel0,
led_pin,
2,
)
.unwrap()
};
let delay = Delay::new();
let mut color = Hsv {
hue: 0,
sat: 255,
val: 255,
};
let mut data = [hsv2rgb(color); COUNT];
let mut start_hue = 0;
loop {
start_hue += 1;
for hue in 0..(COUNT as u8) {
color.hue = hue.wrapping_add(start_hue);
data[hue as usize] = hsv2rgb(color);
}
led.write(brightness(gamma(data.iter().cloned()), 10))
.unwrap();
delay.delay_millis(5);
}
}