diff --git a/Cargo.lock b/Cargo.lock index 22f91fc..4692653 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,6 +21,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "arrayvec" version = "0.7.6" @@ -180,6 +186,15 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "castaway" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" +dependencies = [ + "rustversion", +] + [[package]] name = "cfg-if" version = "1.0.1" @@ -193,7 +208,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" dependencies = [ "termcolor", - "unicode-width", + "unicode-width 0.1.14", +] + +[[package]] +name = "compact_str" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", ] [[package]] @@ -393,6 +422,15 @@ dependencies = [ "defmt 0.3.100", ] +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", +] + [[package]] name = "diff" version = "0.1.13" @@ -698,6 +736,15 @@ dependencies = [ "defmt 0.3.100", ] +[[package]] +name = "embedded-graphics-unicodefonts" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef96f7e6453093b9ffc738fb025f1a14c31f7f67a5d587db99beb23ab8b433a" +dependencies = [ + "embedded-graphics", +] + [[package]] name = "embedded-hal" version = "0.2.7" @@ -844,6 +891,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "futures" version = "0.3.31" @@ -972,6 +1025,11 @@ name = "hashbrown" version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "heapless" @@ -983,6 +1041,12 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.5.2" @@ -1014,6 +1078,25 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "indoc" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" + +[[package]] +name = "instability" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d" +dependencies = [ + "darling", + "indoc", + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "is-terminal" version = "0.4.16" @@ -1034,6 +1117,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.14.0" @@ -1043,6 +1135,12 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + [[package]] name = "js-sys" version = "0.3.77" @@ -1053,6 +1151,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "kasuari" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def1b67294a9fdc95eeeeafd1209c7a1b8a82aa0bf80ac2ab2a7d0318e9c7622" +dependencies = [ + "hashbrown", + "thiserror 2.0.12", +] + [[package]] name = "keccak" version = "0.1.5" @@ -1147,6 +1255,15 @@ dependencies = [ "libc", ] +[[package]] +name = "line-clipping" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51a1679740111eb63b7b4cb3c97b1d5d9f82e142292a25edcfdb4120a48b3880" +dependencies = [ + "bitflags 2.9.1", +] + [[package]] name = "litrs" version = "0.4.1" @@ -1169,6 +1286,15 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +[[package]] +name = "lru" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f8cc7106155f10bdf99a6f379688f543ad6596a415375b36a59a054ceda1198" +dependencies = [ + "hashbrown", +] + [[package]] name = "memchr" version = "2.7.5" @@ -1181,6 +1307,17 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3c8dda44ff03a2f238717214da50f65d5a53b45cd213a7370424ffdb6fae815" +[[package]] +name = "mousefood" +version = "0.2.1" +source = "git+https://github.com/j-g00da/mousefood#e2b4985c986a2b9c3786aa73f388a24a87e0198d" +dependencies = [ + "embedded-graphics", + "embedded-graphics-unicodefonts", + "ratatui-core", + "thiserror 2.0.12", +] + [[package]] name = "nb" version = "0.1.3" @@ -1202,6 +1339,12 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-traits" version = "0.2.19" @@ -1354,10 +1497,14 @@ dependencies = [ "embedded-hal-async", "embedded-hal-bus", "embedded-sdmmc", + "mousefood", "panic-probe", "portable-atomic", + "ratatui", + "spin", "st7365p-lcd", "static_cell", + "talc", "trouble-host", ] @@ -1470,6 +1617,12 @@ dependencies = [ "critical-section", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "precomputed-hash" version = "0.1.1" @@ -1546,6 +1699,56 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +[[package]] +name = "ratatui" +version = "0.30.0-alpha.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63bfff7501cc6892821f54f1133661e0534413342c8e8efbb41af0ffccdcea45" +dependencies = [ + "instability", + "ratatui-core", + "ratatui-widgets", +] + +[[package]] +name = "ratatui-core" +version = "0.1.0-alpha.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353047185fbfb81ee05a3f8c573956adb2aa9a505da47fb150c18388806f5e22" +dependencies = [ + "bitflags 2.9.1", + "compact_str", + "hashbrown", + "indoc", + "itertools 0.14.0", + "kasuari", + "lru", + "strum", + "thiserror 2.0.12", + "unicode-segmentation", + "unicode-truncate", + "unicode-width 0.2.0", +] + +[[package]] +name = "ratatui-widgets" +version = "0.3.0-alpha.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fab55e77e0421bb88944cc0262317688e039d0e58518195f13a6e689f3e22f42" +dependencies = [ + "bitflags 2.9.1", + "hashbrown", + "indoc", + "instability", + "itertools 0.14.0", + "line-clipping", + "ratatui-core", + "strum", + "time", + "unicode-segmentation", + "unicode-width 0.2.0", +] + [[package]] name = "redox_syscall" version = "0.5.13" @@ -1650,6 +1853,12 @@ version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + [[package]] name = "same-file" version = "1.0.6" @@ -1726,6 +1935,15 @@ dependencies = [ "rgb", ] +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" +dependencies = [ + "lock_api", +] + [[package]] name = "st7365p-lcd" version = "0.10.0" @@ -1741,6 +1959,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "static_cell" version = "2.1.1" @@ -1768,6 +1992,28 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.104", +] + [[package]] name = "syn" version = "1.0.109" @@ -1790,6 +2036,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "talc" +version = "4.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ae828aa394de34c7de08f522d1b86bd1c182c668d27da69caadda00590f26d" +dependencies = [ + "lock_api", +] + [[package]] name = "term" version = "0.7.0" @@ -1860,6 +2115,24 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + [[package]] name = "tiny-keccak" version = "2.0.2" @@ -1914,12 +2187,35 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-truncate" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fbf03860ff438702f3910ca5f28f8dac63c1c11e7efb5012b8b175493606330" +dependencies = [ + "itertools 0.13.0", + "unicode-segmentation", + "unicode-width 0.2.0", +] + [[package]] name = "unicode-width" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + [[package]] name = "unicode-xid" version = "0.2.6" diff --git a/Cargo.toml b/Cargo.toml index 4fa8de1..1b3ec44 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -65,6 +65,8 @@ cortex-m = { version = "0.7.7" } cortex-m-rt = "0.7.5" panic-probe = "0.3" portable-atomic = { version = "1.11", features = ["critical-section"] } +static_cell = "2.1.1" +talc = "4.4.3" defmt = { version = "0.3", optional = true } defmt-rtt = "0.4.2" @@ -73,5 +75,9 @@ embedded-graphics = { version = "0.8.1" } embedded-sdmmc = { git = "https://github.com/Be-ing/embedded-sdmmc-rs", branch = "bisync", default-features = false } # st7365p-lcd = { git = "https://github.com/legitcamper/st7365p-lcd-rs" } st7365p-lcd = { path = "../ST7365P-lcd-rs" } +mousefood = "0.2.1" +ratatui = { version = "0.30.0-alpha.4", default-features = false } +spin = "0.10.0" -static_cell = "2.1.1" +[patch.crates-io] +mousefood = { git = "https://github.com/j-g00da/mousefood" } diff --git a/src/display.rs b/src/display.rs index fe3f2b0..91cbf9e 100644 --- a/src/display.rs +++ b/src/display.rs @@ -8,9 +8,11 @@ use embedded_graphics::{ Drawable, Pixel, pixelcolor::{Rgb565, raw::RawU16}, prelude::{DrawTarget, OriginDimensions, Point, Primitive, RawData, RgbColor, Size}, - primitives::{PrimitiveStyle, Rectangle}, + primitives::{PrimitiveStyle, Rectangle, StyledDrawable}, }; use embedded_hal_bus::spi::ExclusiveDevice; +use mousefood::prelude::*; +use ratatui::{Frame, Terminal, widgets::Paragraph}; use st7365p_lcd::{Orientation, ST7365P}; #[embassy_executor::task] @@ -26,24 +28,39 @@ pub async fn display_task( Output::new(data, Level::Low), Some(Output::new(reset, Level::High)), true, - false, + true, 320, 320, ); + display.set_offset(0, 0); display.init(&mut Delay).unwrap(); - display.set_orientation(&Orientation::Landscape).unwrap(); - let mut virtual_display = VirtualDisplay::new(display, 320 / 2, 320 / 2); + display.set_orientation(&Orientation::Portrait).unwrap(); + display.set_address_window(0, 0, 319, 319).unwrap(); - let thin_stroke = PrimitiveStyle::with_stroke(Rgb565::RED, 20); + // Rectangle::new(Point::new(0, 0), Size::new(1, 1)) + // .draw_styled(&PrimitiveStyle::with_fill(Rgb565::GREEN), &mut display) + // .unwrap(); - Rectangle::new(Point::new(10, 10), Size::new(100, 100)) - .into_styled(thin_stroke) - .draw(&mut virtual_display) - .unwrap(); + // Rectangle::new(Point::new(319, 319), Size::new(1, 1)) + // .draw_styled(&PrimitiveStyle::with_fill(Rgb565::GREEN), &mut display) + // .unwrap(); + + let mut virtual_display = VirtualDisplay::new(display, 320, 320); + + let backend = EmbeddedBackend::new(&mut virtual_display, EmbeddedBackendConfig::default()); + let mut terminal = Terminal::new(backend).unwrap(); loop { - Timer::after_millis(500).await; + terminal.draw(draw).unwrap(); } + // loop { + // Timer::after_millis(100).await + // } +} + +fn draw(frame: &mut Frame) { + let greeting = Paragraph::new("Hello World!"); + frame.render_widget(greeting, frame.area()); } /// simple abstraction over real display & resolution to reduce frame buffer size @@ -65,13 +82,13 @@ impl VirtualDisplay { Output<'static>, Output<'static>, >, - new_width: u32, - new_height: u32, + width: u32, + height: u32, ) -> Self { Self { display, - width: new_width, - height: new_height, + width: width / 2, + height: height / 2, } } } @@ -85,22 +102,15 @@ impl DrawTarget for VirtualDisplay { I: IntoIterator>, { for Pixel(coord, color) in pixels.into_iter() { - // Check bounds on the *virtual* (already reduced) resolution - if coord.x >= 0 - && coord.y >= 0 - && coord.x < self.width as i32 - && coord.y < self.height as i32 - { - let px = coord.x as u16 * 2; - let py = coord.y as u16 * 2; - let raw_color = RawU16::from(color).into_inner(); + let px = coord.x as u16 * 2; + let py = coord.y as u16 * 2; + let raw_color = RawU16::from(color).into_inner(); - // Draw the 2x2 block on the underlying hardware - self.display.set_pixel(px, py, raw_color)?; - self.display.set_pixel(px + 1, py, raw_color)?; - self.display.set_pixel(px, py + 1, raw_color)?; - self.display.set_pixel(px + 1, py + 1, raw_color)?; - } + // Draw the 2x2 block on the underlying hardware + self.display.set_pixel(px, py, raw_color)?; + self.display.set_pixel(px + 1, py, raw_color)?; + self.display.set_pixel(px, py + 1, raw_color)?; + self.display.set_pixel(px + 1, py + 1, raw_color)?; } Ok(()) } diff --git a/src/main.rs b/src/main.rs index 1ffcbd8..a226433 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,6 +22,7 @@ use embassy_time::Timer; use embedded_hal_bus::spi::ExclusiveDevice; use embedded_sdmmc::asynchronous::{File, SdCard, ShortFileName, VolumeIdx, VolumeManager}; use static_cell::StaticCell; +use talc::*; mod peripherals; use peripherals::{keyboard::KeyEvent, peripherals_task}; @@ -32,6 +33,16 @@ embassy_rp::bind_interrupts!(struct Irqs { I2C1_IRQ => i2c::InterruptHandler; }); +static mut ARENA: [u8; 400_000] = [0; 400_000]; + +#[global_allocator] +static ALLOCATOR: Talck, ClaimOnOom> = Talc::new(unsafe { + // if we're in a hosted environment, the Rust runtime may allocate before + // main() is called, so we need to initialize the arena automatically + ClaimOnOom::new(Span::from_array(core::ptr::addr_of!(ARENA).cast_mut())) +}) +.lock(); + #[embassy_executor::main] async fn main(spawner: Spawner) { let p = embassy_rp::init(Default::default());