69 lines
2.0 KiB
Rust
69 lines
2.0 KiB
Rust
#![no_std]
|
|||
|
|
#![no_main]
|
||
|
|
|
||
|
|
mod backlight;
|
||
|
|
mod led;
|
||
|
|
|
||
|
|
use esp_backtrace as _;
|
||
|
|
use esp_bootloader_esp_idf::esp_app_desc;
|
||
|
|
use esp_hal::ledc::timer::{self, TimerIFace};
|
||
|
|
use esp_hal::ledc::{LSGlobalClkSource, Ledc, LowSpeed};
|
||
|
|
use esp_hal::{init, rmt::Rmt, time::Rate, Config};
|
||
|
|
use esp_println::println;
|
||
|
|
use smart_leds::hsv::{hsv2rgb, Hsv};
|
||
|
|
use smart_leds::{brightness, gamma};
|
||
|
|
|
||
|
|
esp_app_desc!();
|
||
|
|
|
||
|
|
#[esp_hal::main]
|
||
|
|
fn main() -> ! {
|
||
|
|
let peripherals = init(Config::default());
|
||
|
|
|
||
|
|
let mut led = {
|
||
|
|
let rmt = Rmt::new(peripherals.RMT, Rate::from_mhz(80)).expect("Failed to init RMT");
|
||
|
|
led::RgbLed::new(rmt.channel0, peripherals.GPIO8).expect("Failed to init RGB LED")
|
||
|
|
};
|
||
|
|
|
||
|
|
let mut ledc = Ledc::new(peripherals.LEDC);
|
||
|
|
ledc.set_global_slow_clock(LSGlobalClkSource::APBClk);
|
||
|
|
let mut timer = ledc.timer::<LowSpeed>(timer::Number::Timer0);
|
||
|
|
timer
|
||
|
|
.configure(timer::config::Config {
|
||
|
|
duty: timer::config::Duty::Duty8Bit,
|
||
|
|
clock_source: timer::LSClockSource::APBClk,
|
||
|
|
frequency: Rate::from_khz(5),
|
||
|
|
})
|
||
|
|
.expect("Failed to configure backlight timer");
|
||
|
|
let mut backlight =
|
||
|
|
backlight::LcdBacklight::new(&timer, peripherals.GPIO22).expect("Failed to init backlight");
|
||
|
|
|
||
|
|
let delay = esp_hal::delay::Delay::new();
|
||
|
|
|
||
|
|
let levels = [1.0f32, 0.75, 0.5, 0.25, 0.0, 0.5];
|
||
|
|
let mut level_idx = 0;
|
||
|
|
|
||
|
|
loop {
|
||
|
|
for hue in 0..=255 {
|
||
|
|
let rgb = hsv2rgb(Hsv {
|
||
|
|
hue,
|
||
|
|
sat: 255,
|
||
|
|
val: 255,
|
||
|
|
});
|
||
|
|
let lit = brightness(gamma(core::iter::once(rgb)), 40)
|
||
|
|
.next()
|
||
|
|
.unwrap();
|
||
|
|
led.set_rgb(lit).unwrap();
|
||
|
|
|
||
|
|
if hue % 32 == 0 {
|
||
|
|
println!("hue {hue}: ({}, {}, {})", lit.r, lit.g, lit.b);
|
||
|
|
}
|
||
|
|
|
||
|
|
delay.delay_millis(10);
|
||
|
|
}
|
||
|
|
|
||
|
|
let level = levels[level_idx % levels.len()];
|
||
|
|
backlight.set_level(level).unwrap();
|
||
|
|
println!("backlight level: {level}");
|
||
|
|
level_idx += 1;
|
||
|
|
}
|
||
|
|
}
|