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 = [
"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",

View File

@@ -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);
}

View File

@@ -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) {

View File

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

View File

@@ -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;

View File

@@ -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<Rectangle> = 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)
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::<String>(),
display.bounding_box().center() + Point::new(0, 15),
let text = text.iter().cloned().collect::<String>();
let aligned_text = Text::with_alignment(
&text,
display.bounding_box().center(),
character_style,
Alignment::Center,
)
.draw(&mut display)
.unwrap();
);
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)
}
}