From d2155d90f7debabfa4a574dcf64400a82c27dba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Wed, 21 Jun 2023 12:12:07 +0200 Subject: [PATCH] feat: add Czech map representation with RGB8 --- src/main.rs | 4 ++ src/map.rs | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 src/map.rs diff --git a/src/main.rs b/src/main.rs index aa6cc2f..9d80953 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,8 @@ #![no_main] mod strip; +mod map; + use embedded_hal::serial::{Read, Write}; use esp_backtrace as _; use esp_println::println; @@ -11,6 +13,7 @@ use hal::uart::TxRxPins; use nb::block; use nb::Error::{WouldBlock, Other}; use smart_leds::{RGB8, SmartLedsWrite}; +use crate::map::Map; use crate::strip::StripTiming; const LEDS_COUNT: usize = 72; const COMMAND_BUFFER: usize = 200; @@ -80,6 +83,7 @@ fn main() -> ! { ); let mut rgb_data: [RGB8; 72] = [RGB8 { r: 0, g: 0, b: 0 }; 72]; + let mut map = map::Map::new(&map::INDEX_MAP, &mut rgb_data); loop { } diff --git a/src/map.rs b/src/map.rs new file mode 100644 index 0000000..4a37f5b --- /dev/null +++ b/src/map.rs @@ -0,0 +1,142 @@ +use core::slice::{Iter, IterMut}; +use smart_leds::RGB8; + +pub const INDEX_MAP : [&str; 72] = [ + "DECIN", + "LIBEREC", + "JABLONEC_NAD_NISOU", + "ÚSTI_NAD_LABEM", + "CESKA_LIPA", + "SEMILY", + "TEPLICE", + "TRUTNOV", + "LITOMERICE", + "MOST", + "CHOMUTOV", + "JICIN", + "NACHOD", + "MLADA_BOLESLAV", + "MELNIK", + "LOUNY", + "KARLOVY_VARY", + "JESENIK", + "HRADEC_KRALOVE", + "SOKOLOV", + "NYMBURK", + "RYCHNOV_NAD_KNEZNOU", + "KLADNO", + "RAKOVNIK", + "CHEB", + "BRUNTAL", + "PRAHA", + "PARDUBICE", + "KOLIN", + "ÚSTI_NAD_ORLICI", + "OPAVA", + "SUMPERK", + "BEROUN", + "KUTNA_HORA", + "CHRUDIM", + "KARVINA", + "OSTRAVA-MESTO", + "TACHOV", + "SVITAVY", + "BENESOV", + "PLZEN-MESTO", + "ROKYCANY", + "FRYDEK-MISTEK", + "PRIBRAM", + "NOVY_JICIN", + "OLOMOUC", + "HAVLICKŮV_BROD", + "ZĎAR_NAD_SAZAVOU", + "PREROV", + "PROSTEJOV", + "DOMAZLICE", + "PELHRIMOV", + "TABOR", + "JIHLAVA", + "KLATOVY", + "BLANSKO", + "VSETIN", + "KROMERIZ", + "PISEK", + "VYSKOV", + "STRAKONICE", + "ZLIN", + "TREBIC", + "BRNO", + "JINDRICHUV_HRADEC", + "UHERSKÉ_HRADISTE", + "PRACHATICE", + "CESKE_BUDEJOVICE", + "HODONIN", + "ZNOJMO", + "CESKY_KRUMLOV", + "BRECLAV", +]; + +pub struct Map<'d> { + index_map: &'d [&'d str], + data: &'d mut [RGB8] +} + +pub enum Error { + NotFound +} + +impl<'d> Map<'d> { + pub fn new(index_map: &'d [&'d str], data: &'d mut [RGB8]) -> Self { + Map { + index_map, + data + } + } + + pub fn get_index_by_name(&self, name: &[char]) -> Result { + for (i, current) in self.index_map.iter().enumerate() { + if current.len() != name.len() { + continue; + } + + let mut matches = true; + for (j, c) in current.chars().enumerate() { + if name[j] != c { + matches = false; + break; + } + } + + if matches { + return Ok(i); + } + } + + return Err(Error::NotFound); + } + + pub fn set_rgb(&mut self, index: usize, r: Option, g: Option, b: Option) -> Result<(), Error> { + let original = self.data[index]; + if self.data.len() <= index { + return Err(Error::NotFound) + } + + self.data[index] = RGB8 { + r: r.unwrap_or(original.r), + g: g.unwrap_or(original.g), + b: b.unwrap_or(original.b), + }; + + Ok(()) + } + + pub fn set_rgb_by_name(&mut self, name: &[char], r: Option, g: Option, b: Option) -> Result<(), Error> { + let index = self.get_index_by_name(name)?; + self.set_rgb(index, r, g, b) + } + + pub fn get_map(&self) -> Iter { + return self.data.iter(); + } + pub fn get_map_mut(&mut self) -> IterMut { return self.data.iter_mut(); } +} \ No newline at end of file -- 2.48.1