From e63383570ef40df9f8d4d6cf2e58f97184e43705 Mon Sep 17 00:00:00 2001 From: eraden Date: Mon, 16 Sep 2024 18:26:56 +0200 Subject: [PATCH] Column iter --- maze/src/lib.rs | 62 ++++++++++++++++++++++++++++++++++++++++++++++++- src/main.rs | 32 +++++++++++++++---------- 2 files changed, 81 insertions(+), 13 deletions(-) diff --git a/maze/src/lib.rs b/maze/src/lib.rs index e936ab7..69d90d7 100644 --- a/maze/src/lib.rs +++ b/maze/src/lib.rs @@ -501,12 +501,63 @@ impl BinaryMap { Direction::South => self.at(player.0, player.1 + 1) != MazePart::Wall, } } + + pub fn lines(&self) -> impl Iterator { + self.0.windows(X) + } + + /// 0 1 2 + /// 0 + /// 1 + /// 2 + /// + /// Column 1 (0,0) (0,1) (0,2) + /// Column 2 (1,0) (1,1) (1,2) + pub fn columns(&self) -> ColumnIter { + ColumnIter::(&self.0, 0) + } +} + +pub struct ColumnIter<'grid, const X: usize, const Y: usize, T>(&'grid [T], usize); + +impl<'grid, const X: usize, const Y: usize, T: Clone> Iterator for ColumnIter<'grid, X, Y, T> { + type Item = [T; Y]; + + fn next(&mut self) -> Option { + let x = self.1; + if x == X { + return None; + } + self.1 += 1; + + Some(core::array::from_fn(move |y| self.0[x + (y * X)].clone())) + } +} + +#[cfg(test)] +mod column_iter_tests { + use super::*; + + #[test] + fn check() { + let grid = [ + 1, 2, 3, // + 4, 5, 6, // + 7, 8, 9, // + 10, 11, 12, // + ]; + let mut it = ColumnIter::<3, 4, u8>(&grid, 0); + assert_eq!(it.next(), Some([1, 4, 7, 10])); + assert_eq!(it.next(), Some([2, 5, 8, 11])); + assert_eq!(it.next(), Some([3, 6, 9, 12])); + assert_eq!(it.next(), None); + } } pub struct BinaryMapVisitor; impl BinaryMapVisitor { - fn format(&self, grid: &Grid, buffer: &mut [MazePart]) { + pub fn format(&self, grid: &Grid, buffer: &mut [MazePart]) { let mut bw = BufWriter::new(buffer); bw.push(MazePart::Wall); @@ -606,6 +657,15 @@ mod print_tests { AsciiBroad.format(&mut grid, &mut result); println!("{result}"); } + + #[test] + fn production_maze_60_60() { + let mut trng = rand::thread_rng(); + let mut grid = Grid::<60, 60, 3600>::new(); + RecursiveDivision.generate(&mut grid, &mut trng); + let mut map = BinaryMap::<122, 122, 14884>::new(); + BinaryMapVisitor.format(&mut grid, &mut map.0); + } } #[cfg(test)] diff --git a/src/main.rs b/src/main.rs index b4c3c23..550e7ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,9 +24,10 @@ use esp_hal::{ system::SystemControl, }; use heapless::String; +use maze::{BinaryMap, BinaryMapVisitor}; use profont::PROFONT_24_POINT; -use weact_studio_epd::{graphics::Display290BlackWhite, Color}; -use weact_studio_epd::{graphics::DisplayRotation, WeActStudio290BlackWhiteDriver}; +use weact_studio_epd::{graphics::Display290TriColor, TriColor}; +use weact_studio_epd::{graphics::DisplayRotation, WeActStudio290TriColorDriver}; #[entry] fn main() -> ! { @@ -76,12 +77,12 @@ fn main() -> ! { // Setup EPD log::info!("Intializing EPD..."); - let mut driver = WeActStudio290BlackWhiteDriver::new(spi_interface, busy, rst, delay); - let mut display = Display290BlackWhite::new(); + let mut driver = WeActStudio290TriColorDriver::new(spi_interface, busy, rst, delay); + let mut display = Display290TriColor::new(); display.set_rotation(DisplayRotation::Rotate90); driver.init().unwrap(); - let style = MonoTextStyle::new(&PROFONT_24_POINT, Color::Black); + let style = MonoTextStyle::new(&PROFONT_24_POINT, TriColor::Black); let _ = Text::with_text_style( "Hello World!", Point::new(8, 68), @@ -101,7 +102,7 @@ fn main() -> ! { log::info!("Wake up!"); driver.wake_up().unwrap(); - display.clear(Color::White); + display.clear(TriColor::White); let mut string_buf = String::<30>::new(); write!(string_buf, "Hello World {}!", n).unwrap(); @@ -121,15 +122,22 @@ fn main() -> ! { } } -#[derive(Debug, Default)] struct MazeGame { - maze: Option>, + map: maze::BinaryMap<122, 122, 14884>, } impl MazeGame { - pub fn start(&mut self, trng: &mut Trng) { - let mut maze = maze::Grid::new(); - maze::RecursiveDivision.generate(&mut maze, trng); - self.maze = Some(maze); + pub fn new() -> Self { + Self { + map: maze::BinaryMap::new(), + } } + + pub fn start(&mut self, trng: &mut Trng) { + let mut grid = maze::Grid::<60, 60, 3600>::new(); + maze::RecursiveDivision.generate(&mut grid, trng); + BinaryMapVisitor.format(&mut grid, &mut self.map.0); + } + + pub fn draw(&self, dispay: Display290TriColor) {} }