This commit is contained in:
2025-09-13 13:57:41 -06:00
parent 70ecbcafc3
commit 1994d74a17
12 changed files with 154 additions and 139 deletions

View File

@@ -3,11 +3,16 @@ use embassy_rp::{
peripherals::{PIN_13, PIN_14, PIN_15, SPI1},
spi::{Async, Spi},
};
use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, mutex::Mutex};
use embassy_sync::{
blocking_mutex::raw::CriticalSectionRawMutex, lazy_lock::LazyLock, mutex::Mutex,
};
use embassy_time::{Delay, Timer};
use embedded_graphics::{
draw_target::DrawTarget,
pixelcolor::{Rgb565, RgbColor},
};
use embedded_hal_bus::spi::ExclusiveDevice;
use st7365p_lcd::{FrameBuffer, ST7365P};
use static_cell::StaticCell;
type DISPLAY = ST7365P<
ExclusiveDevice<Spi<'static, SPI1, Async>, Output<'static>, Delay>,
@@ -20,8 +25,8 @@ pub const SCREEN_WIDTH: usize = 320;
pub const SCREEN_HEIGHT: usize = 320;
type FB = FrameBuffer<SCREEN_WIDTH, SCREEN_HEIGHT, { SCREEN_WIDTH * SCREEN_HEIGHT }>;
static FRAMEBUFFER_CELL: StaticCell<FB> = StaticCell::new();
pub static FRAMEBUFFER: Mutex<CriticalSectionRawMutex, Option<&'static mut FB>> = Mutex::new(None);
pub static FRAMEBUFFER: LazyLock<Mutex<CriticalSectionRawMutex, FB>> =
LazyLock::new(|| Mutex::new(FrameBuffer::new()));
pub async fn init_display(
spi: Spi<'static, SPI1, Async>,
@@ -38,27 +43,27 @@ pub async fn init_display(
true,
Delay,
);
let framebuffer = FRAMEBUFFER_CELL.init(FrameBuffer::new());
let mut fb = FRAMEBUFFER.get().lock().await;
display.init().await.unwrap();
display.set_custom_orientation(0x40).await.unwrap();
framebuffer.draw(&mut display).await.unwrap();
display.draw(&mut fb).await.unwrap();
display.set_on().await.unwrap();
FRAMEBUFFER.lock().await.replace(framebuffer);
display
}
pub async fn clear_fb() {
let mut fb = FRAMEBUFFER.get().lock().await;
let fb = &mut *fb;
fb.clear(Rgb565::BLACK).unwrap();
}
pub async fn display_handler(mut display: DISPLAY) {
loop {
let fb: &mut FB = {
let mut guard = FRAMEBUFFER.lock().await;
guard.take().unwrap() // take ownership
}; // guard dropped
fb.partial_draw_batched(&mut display).await.unwrap();
// Put it back
FRAMEBUFFER.lock().await.replace(fb);
{
let mut fb = FRAMEBUFFER.get().lock().await;
display.partial_draw_batched(&mut fb).await.unwrap();
}
Timer::after_millis(32).await; // 30 fps
}