working dynamically loaded app
This commit is contained in:
78
Cargo.lock
generated
78
Cargo.lock
generated
@@ -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",
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
.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::<String>(),
|
||||
display.bounding_box().center() + Point::new(0, 15),
|
||||
character_style,
|
||||
Alignment::Center,
|
||||
)
|
||||
.draw(&mut display)
|
||||
.unwrap();
|
||||
let text = text.iter().cloned().collect::<String>();
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user