diff --git a/Cargo.lock b/Cargo.lock index da195fa..ed6152d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -68,6 +68,16 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "cc" +version = "1.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44" +dependencies = [ + "find-msvc-tools", + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.3" @@ -122,6 +132,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "723dce4e9f25b6e6c5f35628e144794e5b459216ed7da97b7c4b66cdb3fa82ca" +[[package]] +name = "find-msvc-tools" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" + [[package]] name = "hash32" version = "0.3.1" @@ -198,12 +214,52 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "stable_deref_trait" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "stackalloc" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b5b7088084b7f78305a42468c9a3693918620f0b8ec86260f1132dc0521e78" +dependencies = [ + "cc", + "rustc_version", +] + [[package]] name = "syn" version = "1.0.109" @@ -225,6 +281,7 @@ dependencies = [ "embedded-hal 1.0.0", "mipidsi", "panic-halt", + "stackalloc", "ufmt", ] diff --git a/Cargo.toml b/Cargo.toml index 637f70a..f7a64bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ atmega-hal = { git = "https://github.com/Rahix/avr-hal?tab=readme-ov-file", rev= ufmt = "0.2.0" mipidsi = "0.9.0" embedded-graphics-core = "0.4.0" +stackalloc = { version = "1.2.1", features = ["no_std"] } # nb = "1.1.0" # pwm-pca9685 = "1.0.0" # infrared = "0.14.1" diff --git a/src/main.rs b/src/main.rs index 05d609f..19afeab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,9 +4,11 @@ #![no_std] #![no_main] #![feature(iter_array_chunks)] +#![feature(const_slice_make_iter)] +#![feature(slice_as_chunks)] use atmega_hal::{ - Adc, Usart, + Adc, Eeprom, Usart, port::{Pin, mode}, spi::{self, Settings}, usart::Baudrate, @@ -42,6 +44,9 @@ fn main() -> ! { Baudrate::::new(57600), ); + // let eeprom = Eeprom::new(dp.EEPROM); + // ufmt::uwriteln!(serial, "Eeprom capacity: {}", eeprom.capacity()).unwrap(); + let cs = pins.pb2.into_output(); let (mut spi, mut cs) = spi::Spi::new( dp.SPI, diff --git a/src/qoi.rs b/src/qoi.rs index 886cc9b..cebbae4 100644 --- a/src/qoi.rs +++ b/src/qoi.rs @@ -1,4 +1,7 @@ -use core::slice::Iter; +use core::{ + hint::black_box, + slice::{Chunks, Iter}, +}; use atmega_hal::{ Atmega, Usart, @@ -13,9 +16,57 @@ use crate::{ display::{Color, Display, Position, Rgb565, Writeable}, }; +#[repr(u8)] +enum NonBssByte { + V = 1, +} + +pub struct NonBss { + _hack: NonBssByte, + pub buf: Buf, +} + +impl NonBss<[u8; N]> { + pub const fn new(buf: [u8; N]) -> Self { + Self { + _hack: NonBssByte::V, + buf, + } + } +} + +macro_rules! non_bss_statics {( + $( + $(#$attr:tt)* + $pub:vis + static ref $NAME:ident : [$u8:ty] = *include_bytes!($($args:tt)*); + )* +) => ( + $( + + $(#$attr)* + $pub + const $NAME: &[u8] = { + static $NAME: NonBss<[$u8; ::core::include_bytes!($($args)*).len()]> = + NonBss::new(*::core::include_bytes!($($args)*)); + &$NAME.buf + }; + )* +)} + // https://qoiformat.org/qoi-specification.pdf -const LARGE: &[u8; 1966] = include_bytes!("../images/large.qoi"); -const SHEEP: &[u8; 852] = include_bytes!("../images/sheep.qoi"); +// static LARGE: [u8; 1966] = *include_bytes!("../images/large.qoi"); +// static SHEEP: [u8; 852] = *include_bytes!("../images/sheep.qoi"); + +non_bss_statics! { + static ref SHEEP: [u8] = *include_bytes!("../images/sheep.qoi"); + static ref LARGE: [u8] = *include_bytes!("../images/large.qoi"); +} + +// const LARGE_C1: [u8; 512] = LARGE.as_chunks().0[0]; +// const LARGE_C2: [u8; 512] = LARGE.as_chunks().0[1]; +// const LARGE_C3: [u8; 512] = LARGE.as_chunks().0[2]; +// const LARGE_C4: &[u8] = LARGE.as_chunks::<512>().1; #[derive(Debug, uDebug)] pub enum QoiErr { @@ -23,35 +74,38 @@ pub enum QoiErr { UnexpectedEOF, } -#[derive(Default)] -struct LargeIter { - index: usize, -} +// #[derive(Default)] +// struct LargeIter { +// index: usize, +// } -impl Iterator for LargeIter { - type Item = u8; +// impl Iterator for LargeIter { +// type Item = u8; - fn next(&mut self) -> Option { - if self.index >= N { - return None; - } - let old_idx = self.index; - self.index += 1; - Some(SHEEP[old_idx]) - } -} +// fn next(&mut self) -> Option { +// if self.index >= N { +// return None; +// } +// let old_idx = self.index; +// self.index += 1; +// Some(SHEEP[old_idx]) +// } +// } pub fn draw_image( serial: &mut Usart, Pin, CoreClock>, display: &mut Display, position: Position, ) -> Result<(), QoiErr> { - let mut iter = LargeIter::<852>::default(); + let a = LARGE[black_box(50)]; + ufmt::uwriteln!(serial, "Successfully read QOI header {}", a).unwrap(); + + let mut iter = SHEEP.iter().map(|v| *v); if let (Some(113), Some(111), Some(105), Some(102)) = (iter.next(), iter.next(), iter.next(), iter.next()) { - fn next(iter: &mut LargeIter) -> Result { + fn next(iter: &mut dyn Iterator) -> Result { iter.next().ok_or(QoiErr::UnexpectedEOF) }