working dynamically loaded app

This commit is contained in:
2025-09-14 20:46:43 -06:00
parent d934036965
commit 505450c8b8
6 changed files with 104 additions and 35 deletions

78
Cargo.lock generated
View File

@@ -18,7 +18,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"abi_sys", "abi_sys",
"embassy-time 0.5.0", "embassy-time 0.5.0",
"embedded-graphics", "embedded-graphics 0.8.1",
"shared", "shared",
"spin", "spin",
"talc", "talc",
@@ -28,7 +28,7 @@ dependencies = [
name = "abi_sys" name = "abi_sys"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"embedded-graphics", "embedded-graphics 0.8.1",
"shared", "shared",
] ]
@@ -226,7 +226,7 @@ name = "calculator"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"abi", "abi",
"embedded-graphics", "embedded-graphics 0.8.1",
] ]
[[package]] [[package]]
@@ -801,6 +801,19 @@ dependencies = [
"embedded-io-async", "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]] [[package]]
name = "embedded-graphics" name = "embedded-graphics"
version = "0.8.1" version = "0.8.1"
@@ -810,9 +823,19 @@ dependencies = [
"az", "az",
"byteorder", "byteorder",
"defmt 0.3.100", "defmt 0.3.100",
"embedded-graphics-core", "embedded-graphics-core 0.4.0",
"float-cmp", "float-cmp 0.9.0",
"micromath", "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]] [[package]]
@@ -893,7 +916,7 @@ version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a90553247f2b05c59ac7894ea13d830636c2b1203fa03bff400eddbd1fa9f52" checksum = "9a90553247f2b05c59ac7894ea13d830636c2b1203fa03bff400eddbd1fa9f52"
dependencies = [ dependencies = [
"embedded-graphics", "embedded-graphics 0.8.1",
"embedded-layout-macros", "embedded-layout-macros",
] ]
@@ -921,6 +944,16 @@ dependencies = [
"heapless", "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]] [[package]]
name = "embedded-storage" name = "embedded-storage"
version = "0.3.1" version = "0.3.1"
@@ -943,7 +976,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "005680edc0d075af5e02d5788ca291737bd9aba7fc404ae031cc9dfa715e5f7d" checksum = "005680edc0d075af5e02d5788ca291737bd9aba7fc404ae031cc9dfa715e5f7d"
dependencies = [ dependencies = [
"az", "az",
"embedded-graphics", "embedded-graphics 0.8.1",
"object-chain", "object-chain",
] ]
@@ -992,6 +1025,15 @@ version = "0.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" 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]] [[package]]
name = "float-cmp" name = "float-cmp"
version = "0.9.0" version = "0.9.0"
@@ -1262,7 +1304,7 @@ dependencies = [
"embassy-sync 0.7.2", "embassy-sync 0.7.2",
"embassy-time 0.5.0", "embassy-time 0.5.0",
"embassy-usb", "embassy-usb",
"embedded-graphics", "embedded-graphics 0.8.1",
"embedded-hal 0.2.7", "embedded-hal 0.2.7",
"embedded-hal 1.0.0", "embedded-hal 1.0.0",
"embedded-hal-async", "embedded-hal-async",
@@ -1396,6 +1438,12 @@ version = "2.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
[[package]]
name = "micromath"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc4010833aea396656c2f91ee704d51a6f1329ec2ab56ffd00bfd56f7481ea94"
[[package]] [[package]]
name = "micromath" name = "micromath"
version = "2.1.0" version = "2.1.0"
@@ -1970,6 +2018,16 @@ dependencies = [
"rgb", "rgb",
] ]
[[package]]
name = "snake"
version = "0.1.0"
dependencies = [
"abi",
"embedded-graphics 0.8.1",
"embedded-snake",
"rand_core 0.6.4",
]
[[package]] [[package]]
name = "spin" name = "spin"
version = "0.10.0" version = "0.10.0"
@@ -1995,7 +2053,7 @@ version = "0.11.0"
source = "git+https://github.com/legitcamper/st7365p-lcd-rs?rev=1d15123929fa7ef73d5d6aead7faf1bba50ce915#1d15123929fa7ef73d5d6aead7faf1bba50ce915" source = "git+https://github.com/legitcamper/st7365p-lcd-rs?rev=1d15123929fa7ef73d5d6aead7faf1bba50ce915#1d15123929fa7ef73d5d6aead7faf1bba50ce915"
dependencies = [ dependencies = [
"bitvec", "bitvec",
"embedded-graphics-core", "embedded-graphics-core 0.4.0",
"embedded-hal 1.0.0", "embedded-hal 1.0.0",
"embedded-hal-async", "embedded-hal-async",
"heapless", "heapless",

View File

@@ -44,7 +44,7 @@ pub type SleepAbi = extern "Rust" fn(ms: u64);
pub fn sleep(ms: u64) { pub fn sleep(ms: u64) {
unsafe { 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); let f: SleepAbi = core::mem::transmute(ptr);
f(ms); f(ms);
} }

View File

@@ -9,6 +9,7 @@ use embassy_time::{Delay, Timer};
use embedded_graphics::{ use embedded_graphics::{
draw_target::DrawTarget, draw_target::DrawTarget,
pixelcolor::{Rgb565, RgbColor}, pixelcolor::{Rgb565, RgbColor},
prelude::Dimensions,
}; };
use embedded_hal_bus::spi::ExclusiveDevice; use embedded_hal_bus::spi::ExclusiveDevice;
use st7365p_lcd::ST7365P; use st7365p_lcd::ST7365P;
@@ -48,8 +49,11 @@ pub async fn init_display(
display display
} }
pub async fn clear_fb() { pub fn clear_fb() {
unsafe { FRAMEBUFFER.clear(Rgb565::BLACK).unwrap() } let bounds = unsafe { FRAMEBUFFER.bounding_box() };
unsafe {
let _ = FRAMEBUFFER.fill_solid(&bounds, Rgb565::BLACK);
}
} }
pub async fn display_handler(mut display: DISPLAY) { pub async fn display_handler(mut display: DISPLAY) {

View File

@@ -29,7 +29,7 @@ static mut BUFFER: [u16; SIZE] = [0; SIZE];
static mut DIRTY_TILES: LazyLock<Vec<AtomicBool, TILE_COUNT>> = LazyLock::new(|| { static mut DIRTY_TILES: LazyLock<Vec<AtomicBool, TILE_COUNT>> = LazyLock::new(|| {
let mut tiles = Vec::new(); let mut tiles = Vec::new();
for _ in 0..TILE_COUNT { for _ in 0..TILE_COUNT {
tiles.push(AtomicBool::new(true)); tiles.push(AtomicBool::new(true)).unwrap();
} }
tiles tiles
}); });

View File

@@ -143,7 +143,7 @@ async fn userland_task() {
*state = TaskState::Kernel; *state = TaskState::Kernel;
} }
// clear_fb().await; // blocks future exec? // clear_fb();
defmt::info!("Executing Binary"); defmt::info!("Executing Binary");
entry().await; entry().await;

View File

@@ -26,41 +26,48 @@ pub async fn main() {
let character_style = MonoTextStyle::new(&FONT_6X10, Rgb565::RED); 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<Rectangle> = None;
loop { loop {
// First, clear the text area if dirty {
let text_area = Rectangle::new( if let Some(bounds) = last_bounds {
display.bounding_box().center() + Point::new(0, 0), Rectangle::new(bounds.top_left, bounds.size)
Size::new(320, 320),
);
Rectangle::new(text_area.top_left, text_area.size)
.into_styled(PrimitiveStyle::with_fill(Rgb565::BLACK)) .into_styled(PrimitiveStyle::with_fill(Rgb565::BLACK))
.draw(&mut display) .draw(&mut display)
.unwrap(); .unwrap();
}
Text::with_alignment( let text = text.iter().cloned().collect::<String>();
&text.iter().cloned().collect::<String>(), let aligned_text = Text::with_alignment(
display.bounding_box().center() + Point::new(0, 15), &text,
display.bounding_box().center(),
character_style, character_style,
Alignment::Center, Alignment::Center,
) );
.draw(&mut display) last_bounds = Some(aligned_text.bounding_box());
.unwrap();
aligned_text.draw(&mut display).unwrap();
dirty = false;
}
if let Some(event) = get_key() { if let Some(event) = get_key() {
print("User got event"); dirty = true;
match event.key { match event.key {
KeyCode::Char(ch) => { KeyCode::Char(ch) => {
text.push(ch); text.push(ch);
} }
KeyCode::Del => {
text.clear();
}
KeyCode::Backspace => { KeyCode::Backspace => {
text.pop(); text.pop();
} }
KeyCode::Esc => return,
_ => (), _ => (),
} }
} }
sleep(1000)
} }
} }