lcd driver

This commit is contained in:
2026-09-07 22:13:21 -05:00
parent 9141629a58
commit 3ad59eac09
5 changed files with 278 additions and 22 deletions
+77 -22
View File
@@ -2,14 +2,23 @@
#![no_main]
mod backlight;
mod display;
mod framebuffer;
mod led;
use embedded_graphics::draw_target::DrawTarget;
use embedded_graphics::pixelcolor::Rgb565;
use embedded_graphics::prelude::*;
use embedded_graphics::primitives::{PrimitiveStyle, Rectangle, Triangle};
use esp_backtrace as _;
use esp_bootloader_esp_idf::esp_app_desc;
use esp_hal::{init, rmt::Rmt, time::Rate, Config};
use esp_println::println;
use smart_leds::hsv::{hsv2rgb, Hsv};
use smart_leds::{brightness, gamma};
use smart_leds::RGB8;
const SAT: u8 = 200;
const VAL: u8 = 200;
esp_app_desc!();
@@ -26,34 +35,80 @@ fn main() -> ! {
backlight::setup_timer(peripherals.LEDC).expect("Failed to init backlight timer");
let mut backlight =
backlight::LcdBacklight::new(&timer, peripherals.GPIO22).expect("Failed to init backlight");
backlight.set_level(0.5).unwrap();
let mut buffer = [0u8; 4096];
let mut lcd = display::init(
peripherals.SPI2,
peripherals.GPIO7,
peripherals.GPIO6,
peripherals.GPIO15,
peripherals.GPIO14,
peripherals.GPIO21,
&mut buffer,
);
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;
println!("LCD {}x{} initialized", display::WIDTH, display::HEIGHT);
lcd.clear(Rgb565::BLACK).unwrap();
let mut fb = framebuffer::Framebuffer;
let screen = Rectangle::new(Point::zero(), Size::new(display::WIDTH, display::HEIGHT));
let mut pts = [
Point::new(86, 20),
Point::new(61, 50),
Point::new(111, 50),
];
let mut vx: i32 = 3;
let mut vy: i32 = 2;
let mut frame = 0u32;
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();
let hue = (frame % 256) as u8;
let lit = hsv2rgb(Hsv {
hue,
sat: SAT,
val: VAL,
});
led.set_rgb(RGB8::new(0,0,0)).unwrap();
let accent = Rgb565::new(lit.r / 8, lit.g / 4, lit.b / 8);
if hue % 32 == 0 {
println!("hue {hue}: ({}, {}, {})", lit.r, lit.g, lit.b);
}
delay.delay_millis(10);
for p in &mut pts {
p.x += vx;
p.y += vy;
}
let level = levels[level_idx % levels.len()];
backlight.set_level(level).unwrap();
println!("backlight level: {level}");
level_idx += 1;
let min_x = pts.iter().map(|p| p.x).min().unwrap();
let max_x = pts.iter().map(|p| p.x).max().unwrap();
let min_y = pts.iter().map(|p| p.y).min().unwrap();
let max_y = pts.iter().map(|p| p.y).max().unwrap();
if min_x <= 0 || max_x >= display::WIDTH as i32 {
vx = -vx;
}
if min_y <= 0 || max_y >= display::HEIGHT as i32 {
vy = -vy;
}
fb.clear();
Triangle::new(pts[0], pts[1], pts[2])
.into_styled(PrimitiveStyle::with_fill(accent))
.draw(&mut fb)
.unwrap();
lcd.fill_contiguous(&screen, fb.pixels().iter().cloned())
.unwrap();
if frame % 32 == 0 {
println!(
"frame {frame}: apex=({}, {}), v=({}, {}), hue={hue}",
pts[0].x, pts[0].y, vx, vy
);
}
frame = frame.wrapping_add(1);
//delay.delay_millis(30);
}
}