From 505450c8b8a9d28ea958c947e492f29758f37a82 Mon Sep 17 00:00:00 2001 From: sawyer bristol Date: Sun, 14 Sep 2025 20:46:43 -0600 Subject: [PATCH] working dynamically loaded app --- Cargo.lock | 78 ++++++++++++++++++++++++++++---- abi_sys/src/lib.rs | 2 +- kernel/src/display.rs | 8 +++- kernel/src/framebuffer.rs | 2 +- kernel/src/main.rs | 2 +- user-apps/calculator/src/main.rs | 47 +++++++++++-------- 6 files changed, 104 insertions(+), 35 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a4e1b7f..22bdab6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18,7 +18,7 @@ version = "0.1.0" dependencies = [ "abi_sys", "embassy-time 0.5.0", - "embedded-graphics", + "embedded-graphics 0.8.1", "shared", "spin", "talc", @@ -28,7 +28,7 @@ dependencies = [ name = "abi_sys" version = "0.1.0" dependencies = [ - "embedded-graphics", + "embedded-graphics 0.8.1", "shared", ] @@ -226,7 +226,7 @@ name = "calculator" version = "0.1.0" dependencies = [ "abi", - "embedded-graphics", + "embedded-graphics 0.8.1", ] [[package]] @@ -801,6 +801,19 @@ dependencies = [ "embedded-io-async", ] +[[package]] +name = "embedded-graphics" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "750082c65094fbcc4baf9ba31583ce9a8bb7f52cadfb96f6164b1bc7f922f32b" +dependencies = [ + "az", + "byteorder", + "embedded-graphics-core 0.3.3", + "float-cmp 0.8.0", + "micromath 1.1.1", +] + [[package]] name = "embedded-graphics" version = "0.8.1" @@ -810,9 +823,19 @@ dependencies = [ "az", "byteorder", "defmt 0.3.100", - "embedded-graphics-core", - "float-cmp", - "micromath", + "embedded-graphics-core 0.4.0", + "float-cmp 0.9.0", + "micromath 2.1.0", +] + +[[package]] +name = "embedded-graphics-core" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b1239db5f3eeb7e33e35bd10bd014e7b2537b17e071f726a09351431337cfa" +dependencies = [ + "az", + "byteorder", ] [[package]] @@ -893,7 +916,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a90553247f2b05c59ac7894ea13d830636c2b1203fa03bff400eddbd1fa9f52" dependencies = [ - "embedded-graphics", + "embedded-graphics 0.8.1", "embedded-layout-macros", ] @@ -921,6 +944,16 @@ dependencies = [ "heapless", ] +[[package]] +name = "embedded-snake" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af598ad20b839c26b95be615a94619a069303ec776a58aef6dc0e86cf7eabbb8" +dependencies = [ + "embedded-graphics 0.7.1", + "rand_core 0.6.4", +] + [[package]] name = "embedded-storage" version = "0.3.1" @@ -943,7 +976,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "005680edc0d075af5e02d5788ca291737bd9aba7fc404ae031cc9dfa715e5f7d" dependencies = [ "az", - "embedded-graphics", + "embedded-graphics 0.8.1", "object-chain", ] @@ -992,6 +1025,15 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" +[[package]] +name = "float-cmp" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1267f4ac4f343772758f7b1bdcbe767c218bbab93bb432acbf5162bbf85a6c4" +dependencies = [ + "num-traits", +] + [[package]] name = "float-cmp" version = "0.9.0" @@ -1262,7 +1304,7 @@ dependencies = [ "embassy-sync 0.7.2", "embassy-time 0.5.0", "embassy-usb", - "embedded-graphics", + "embedded-graphics 0.8.1", "embedded-hal 0.2.7", "embedded-hal 1.0.0", "embedded-hal-async", @@ -1396,6 +1438,12 @@ version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +[[package]] +name = "micromath" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc4010833aea396656c2f91ee704d51a6f1329ec2ab56ffd00bfd56f7481ea94" + [[package]] name = "micromath" version = "2.1.0" @@ -1970,6 +2018,16 @@ dependencies = [ "rgb", ] +[[package]] +name = "snake" +version = "0.1.0" +dependencies = [ + "abi", + "embedded-graphics 0.8.1", + "embedded-snake", + "rand_core 0.6.4", +] + [[package]] name = "spin" version = "0.10.0" @@ -1995,7 +2053,7 @@ version = "0.11.0" source = "git+https://github.com/legitcamper/st7365p-lcd-rs?rev=1d15123929fa7ef73d5d6aead7faf1bba50ce915#1d15123929fa7ef73d5d6aead7faf1bba50ce915" dependencies = [ "bitvec", - "embedded-graphics-core", + "embedded-graphics-core 0.4.0", "embedded-hal 1.0.0", "embedded-hal-async", "heapless", diff --git a/abi_sys/src/lib.rs b/abi_sys/src/lib.rs index 35f8a57..60e7131 100644 --- a/abi_sys/src/lib.rs +++ b/abi_sys/src/lib.rs @@ -44,7 +44,7 @@ pub type SleepAbi = extern "Rust" fn(ms: u64); pub fn sleep(ms: u64) { unsafe { - let ptr = CALL_ABI_TABLE[CallAbiTable::Print as usize]; + let ptr = CALL_ABI_TABLE[CallAbiTable::Sleep as usize]; let f: SleepAbi = core::mem::transmute(ptr); f(ms); } diff --git a/kernel/src/display.rs b/kernel/src/display.rs index ff18142..14698b2 100644 --- a/kernel/src/display.rs +++ b/kernel/src/display.rs @@ -9,6 +9,7 @@ use embassy_time::{Delay, Timer}; use embedded_graphics::{ draw_target::DrawTarget, pixelcolor::{Rgb565, RgbColor}, + prelude::Dimensions, }; use embedded_hal_bus::spi::ExclusiveDevice; use st7365p_lcd::ST7365P; @@ -48,8 +49,11 @@ pub async fn init_display( display } -pub async fn clear_fb() { - unsafe { FRAMEBUFFER.clear(Rgb565::BLACK).unwrap() } +pub fn clear_fb() { + let bounds = unsafe { FRAMEBUFFER.bounding_box() }; + unsafe { + let _ = FRAMEBUFFER.fill_solid(&bounds, Rgb565::BLACK); + } } pub async fn display_handler(mut display: DISPLAY) { diff --git a/kernel/src/framebuffer.rs b/kernel/src/framebuffer.rs index 11a832e..402551c 100644 --- a/kernel/src/framebuffer.rs +++ b/kernel/src/framebuffer.rs @@ -29,7 +29,7 @@ static mut BUFFER: [u16; SIZE] = [0; SIZE]; static mut DIRTY_TILES: LazyLock> = LazyLock::new(|| { let mut tiles = Vec::new(); for _ in 0..TILE_COUNT { - tiles.push(AtomicBool::new(true)); + tiles.push(AtomicBool::new(true)).unwrap(); } tiles }); diff --git a/kernel/src/main.rs b/kernel/src/main.rs index a773373..7f208a8 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -143,7 +143,7 @@ async fn userland_task() { *state = TaskState::Kernel; } - // clear_fb().await; // blocks future exec? + // clear_fb(); defmt::info!("Executing Binary"); entry().await; diff --git a/user-apps/calculator/src/main.rs b/user-apps/calculator/src/main.rs index a50f9f7..6808c7e 100644 --- a/user-apps/calculator/src/main.rs +++ b/user-apps/calculator/src/main.rs @@ -26,41 +26,48 @@ pub async fn main() { let character_style = MonoTextStyle::new(&FONT_6X10, Rgb565::RED); - let mut text = vec!['H', 'E', 'L', 'L', 'O']; + let mut text = vec!['T', 'y', 'p', 'e']; + let mut dirty = true; + let mut last_bounds: Option = None; loop { - // First, clear the text area - let text_area = Rectangle::new( - display.bounding_box().center() + Point::new(0, 0), - Size::new(320, 320), - ); - Rectangle::new(text_area.top_left, text_area.size) - .into_styled(PrimitiveStyle::with_fill(Rgb565::BLACK)) - .draw(&mut display) - .unwrap(); + if dirty { + if let Some(bounds) = last_bounds { + Rectangle::new(bounds.top_left, bounds.size) + .into_styled(PrimitiveStyle::with_fill(Rgb565::BLACK)) + .draw(&mut display) + .unwrap(); + } - Text::with_alignment( - &text.iter().cloned().collect::(), - display.bounding_box().center() + Point::new(0, 15), - character_style, - Alignment::Center, - ) - .draw(&mut display) - .unwrap(); + let text = text.iter().cloned().collect::(); + let aligned_text = Text::with_alignment( + &text, + display.bounding_box().center(), + character_style, + Alignment::Center, + ); + last_bounds = Some(aligned_text.bounding_box()); + + aligned_text.draw(&mut display).unwrap(); + dirty = false; + } if let Some(event) = get_key() { - print("User got event"); + dirty = true; match event.key { KeyCode::Char(ch) => { text.push(ch); } + KeyCode::Del => { + text.clear(); + } KeyCode::Backspace => { text.pop(); } + KeyCode::Esc => return, _ => (), } } - sleep(1000) } }