diff --git a/Cargo.lock b/Cargo.lock index 9019747..d2ac0e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,34 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + +[[package]] +name = "airquamon_domain" +version = "0.1.0" + +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + [[package]] name = "atomic-polyfill" version = "0.1.11" @@ -23,6 +51,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + [[package]] name = "basic-toml" version = "0.1.4" @@ -44,12 +78,24 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d7e60934ceec538daadb9d8432424ed043a904d8e0243f3c6446bce549a46ac" +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +[[package]] +name = "bytemuck" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" + [[package]] name = "byteorder" version = "1.5.0" @@ -62,12 +108,60 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + [[package]] name = "critical-section" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + [[package]] name = "darling" version = "0.20.3" @@ -103,6 +197,33 @@ dependencies = [ "syn 2.0.38", ] +[[package]] +name = "deflate" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" +dependencies = [ + "adler32", + "byteorder", +] + +[[package]] +name = "display_themes" +version = "0.1.0" +dependencies = [ + "airquamon_domain", + "embedded-graphics 0.8.1", + "embedded-graphics-simulator", + "epd-waveshare", + "heapless", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + [[package]] name = "embedded-can" version = "0.4.1" @@ -167,6 +288,19 @@ dependencies = [ "byteorder", ] +[[package]] +name = "embedded-graphics-simulator" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "684467a8b75b1314d913b78a338ebdeac93f421206d85c87876193fc81dc4556" +dependencies = [ + "base64", + "embedded-graphics 0.8.1", + "image", + "ouroboros", + "sdl2", +] + [[package]] name = "embedded-hal" version = "0.2.7" @@ -230,7 +364,7 @@ source = "git+https://github.com/esp-rs/esp-hal.git?rev=33bfe80d958911f4d0b43adb dependencies = [ "basic-toml", "bitfield", - "bitflags", + "bitflags 2.4.1", "cfg-if", "critical-section", "embedded-can", @@ -307,6 +441,8 @@ dependencies = [ name = "esp32c3_nostd" version = "0.1.0" dependencies = [ + "airquamon_domain", + "display_themes", "embedded-graphics 0.8.1", "embedded-hal 1.0.0-rc.1", "epd-waveshare", @@ -360,6 +496,16 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" +[[package]] +name = "gif" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3edd93c6756b4dfaf2709eafcc345ba2636565295c198a9cfbf75fa5e3e00b06" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "hash32" version = "0.2.1" @@ -400,6 +546,25 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "image" +version = "0.23.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "gif", + "jpeg-decoder", + "num-iter", + "num-rational", + "num-traits", + "png", + "scoped_threadpool", + "tiff", +] + [[package]] name = "indexmap" version = "2.0.2" @@ -410,6 +575,27 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "jpeg-decoder" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" +dependencies = [ + "rayon", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" + [[package]] name = "litrs" version = "0.4.1" @@ -461,6 +647,15 @@ version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + [[package]] name = "micromath" version = "1.1.1" @@ -473,6 +668,25 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39617bc909d64b068dcffd0e3e31679195b5576d0c83fadc52690268cc2b2b55" +[[package]] +name = "miniz_oxide" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" +dependencies = [ + "adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + [[package]] name = "nb" version = "0.1.3" @@ -488,6 +702,38 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.17" @@ -517,12 +763,47 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ouroboros" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1358bd1558bd2a083fed428ffeda486fbfb323e698cdda7794259d592ca72db" +dependencies = [ + "aliasable", + "ouroboros_macro", +] + +[[package]] +name = "ouroboros_macro" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" +dependencies = [ + "Inflector", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "paste" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +[[package]] +name = "png" +version = "0.16.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "deflate", + "miniz_oxide 0.3.7", +] + [[package]] name = "proc-macro-crate" version = "2.0.0" @@ -574,6 +855,26 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "riscv" version = "0.10.1" @@ -627,12 +928,41 @@ dependencies = [ "sensirion-i2c", ] +[[package]] +name = "scoped_threadpool" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sdl2" +version = "0.35.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7959277b623f1fb9e04aea73686c3ca52f01b2145f8ea16f4ff30d8b7623b1a" +dependencies = [ + "bitflags 1.3.2", + "lazy_static", + "libc", + "sdl2-sys", +] + +[[package]] +name = "sdl2-sys" +version = "0.35.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3586be2cf6c0a8099a79a12b4084357aa9b3e0b0d7980e3b67aaf7a9d55f9f0" +dependencies = [ + "cfg-if", + "libc", + "version-compare", +] + [[package]] name = "semver" version = "1.0.20" @@ -733,6 +1063,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tiff" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437" +dependencies = [ + "jpeg-decoder", + "miniz_oxide 0.4.4", + "weezl", +] + [[package]] name = "toml_datetime" version = "0.6.3" @@ -762,6 +1103,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002" +[[package]] +name = "version-compare" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" + [[package]] name = "version_check" version = "0.9.4" @@ -774,6 +1121,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +[[package]] +name = "weezl" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" + [[package]] name = "winnow" version = "0.5.17" diff --git a/Cargo.toml b/Cargo.toml index 62450db..4a87ff0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,8 @@ [workspace] members = [ - "esp32c3_nostd" + "esp32c3_nostd", + "display_themes", + "airquamon_domain" ] resolver = "2" diff --git a/airquamon_domain/Cargo.toml b/airquamon_domain/Cargo.toml new file mode 100644 index 0000000..278fab0 --- /dev/null +++ b/airquamon_domain/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "airquamon_domain" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/airquamon_domain/src/lib.rs b/airquamon_domain/src/lib.rs new file mode 100644 index 0000000..fed986c --- /dev/null +++ b/airquamon_domain/src/lib.rs @@ -0,0 +1,7 @@ +#![no_std] + +pub struct Data { + pub co2: u16, + pub temperature: f32, + pub humidity: f32, +} diff --git a/display_themes/Cargo.toml b/display_themes/Cargo.toml new file mode 100644 index 0000000..c6257a7 --- /dev/null +++ b/display_themes/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "display_themes" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +embedded-graphics = "0.8" +heapless = "0.7.16" +airquamon_domain = { path = "../airquamon_domain" } +epd-waveshare = { path = "/home/brendan/dev/projects/epd-waveshare" } + +[dev-dependencies] +embedded-graphics-simulator = "0.5.0" +epd-waveshare = { path = "/home/brendan/dev/projects/epd-waveshare", features = ["graphics"] } diff --git a/display_themes/examples/simulate_theme_1.rs b/display_themes/examples/simulate_theme_1.rs new file mode 100644 index 0000000..b754007 --- /dev/null +++ b/display_themes/examples/simulate_theme_1.rs @@ -0,0 +1,26 @@ +use embedded_graphics::prelude::*; +use embedded_graphics_simulator::{SimulatorDisplay, Window, OutputSettingsBuilder}; +use epd_waveshare::color::TriColor; +use display_themes::{Theme, Theme1}; +use airquamon_domain::Data; + + +fn main() -> Result<(), core::convert::Infallible> { + let mut display = SimulatorDisplay::::new(Size::new(296, 128)); + + let data = Data{ + co2: 459, + temperature: 20.59, + humidity: 57.42, + }; + + let mut theme1 = Theme1::new(); + theme1.draw(&data, &mut display).unwrap(); + + let output_settings = OutputSettingsBuilder::new() + .scale(2) + .build(); + Window::new("Airquamon Simulator", &output_settings).show_static(&display); + + Ok(()) +} diff --git a/display_themes/src/lib.rs b/display_themes/src/lib.rs new file mode 100644 index 0000000..ea3e43f --- /dev/null +++ b/display_themes/src/lib.rs @@ -0,0 +1,14 @@ +#![no_std] + +use airquamon_domain::Data; +use embedded_graphics::prelude::*; + +mod theme_1; +pub use theme_1::Theme1; + +pub trait Theme +where +COLOR: PixelColor, +{ + fn draw>(&mut self, data: &Data, display: &mut DRAWTARGET) -> Result<(), DRAWTARGET::Error>; +} \ No newline at end of file diff --git a/display_themes/src/theme_1.rs b/display_themes/src/theme_1.rs new file mode 100644 index 0000000..a56c0df --- /dev/null +++ b/display_themes/src/theme_1.rs @@ -0,0 +1,51 @@ +use crate::Theme; +use airquamon_domain::Data; +use embedded_graphics::{ + mono_font::MonoTextStyleBuilder, + prelude::*, + primitives::{Line, PrimitiveStyle}, + text::{Baseline, Text, TextStyleBuilder}, +}; +use epd_waveshare::color::TriColor; +use heapless::String; +use core::fmt::Write; + +pub struct Theme1 { + display_text: String<60>, +} + +impl Theme1 { + pub fn new() -> Self { + Theme1 { + display_text: String::new(), + } + } +} + +impl Theme for Theme1 +{ + fn draw>(&mut self, data: &Data, display: &mut DRAWTARGET) -> Result<(), DRAWTARGET::Error> { + self.display_text.clear(); + write!(self.display_text, "CO2: {0} ppm | {1:#.2} °C | {2:#.2} %", data.co2, data.temperature, data.humidity).expect("Error occurred while trying to write in String"); + let _ = Line::new(Point::new(5, 50), Point::new(291, 50)) + .into_styled(PrimitiveStyle::with_stroke(TriColor::Chromatic, 4)) + .draw(display); + draw_text(display, &self.display_text, 5, 10)?; + Ok(()) + } +} + +fn draw_text(display: &mut DRAWTARGET, text: &str, x: i32, y: i32) -> Result<(), DRAWTARGET::Error> +where + DRAWTARGET: DrawTarget { + let style = MonoTextStyleBuilder::new() + .font(&embedded_graphics::mono_font::ascii::FONT_8X13_BOLD) + .text_color(TriColor::Black) + .background_color(TriColor::White) + .build(); + + let text_style = TextStyleBuilder::new().baseline(Baseline::Top).build(); + + Text::with_text_style(text, Point::new(x, y), style, text_style).draw(display)?; + Ok(()) +} \ No newline at end of file diff --git a/.cargo/config.toml b/esp32c3_nostd/.cargo/config.toml similarity index 100% rename from .cargo/config.toml rename to esp32c3_nostd/.cargo/config.toml diff --git a/esp32c3_nostd/Cargo.toml b/esp32c3_nostd/Cargo.toml index c12a32d..d0700a4 100644 --- a/esp32c3_nostd/Cargo.toml +++ b/esp32c3_nostd/Cargo.toml @@ -6,6 +6,8 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +airquamon_domain = { path = "../airquamon_domain" } +display_themes = { path = "../display_themes" } esp32c3-hal = { git = "https://github.com/esp-rs/esp-hal.git", rev = "33bfe80d958911f4d0b43adb89cca34b5dce1676", features = ["eh1"] } esp-hal-common = { git = "https://github.com/esp-rs/esp-hal.git", rev = "33bfe80d958911f4d0b43adb89cca34b5dce1676", features = ["esp32c3", "eh1"] } esp-backtrace = { version = "0.8.0", features = ["esp32c3", "panic-handler", "exception-handler", "print-uart"] } diff --git a/esp32c3_nostd/src/main.rs b/esp32c3_nostd/src/main.rs index 835a11a..f0055f7 100644 --- a/esp32c3_nostd/src/main.rs +++ b/esp32c3_nostd/src/main.rs @@ -17,16 +17,11 @@ use esp32c3_hal::{ use embedded_hal::spi::SpiDevice; use embedded_hal::delay::DelayUs; use scd4x::scd4x::Scd4x; -use embedded_graphics::{ - mono_font::MonoTextStyleBuilder, - prelude::*, - primitives::{Line, PrimitiveStyle}, - text::{Baseline, Text, TextStyleBuilder}, -}; +use embedded_graphics::prelude::*; use epd_waveshare::{epd2in9b_v3::*, prelude::*, color::{TriColor, ColorType}, graphics}; -use heapless::String; -use core::fmt::{Write as FmtWrite}; -use log::{info, error}; +use log::info; +use airquamon_domain::Data; +use display_themes::{Theme, Theme1}; #[entry] fn main() -> ! { @@ -94,7 +89,7 @@ fn main() -> ! { draw_target: display, epd: epd, delay: delay, - display_text: String::new(), + theme: Theme1::new(), }; sensor.wake_up(); @@ -141,7 +136,7 @@ fn main() -> ! { info!("updating display"); - display.draw(Data { + display.draw(&Data { co2: data.co2, temperature: data.temperature, humidity: data.humidity, @@ -152,12 +147,6 @@ fn main() -> ! { } } -struct Data { - pub co2: u16, - pub temperature: f32, - pub humidity: f32, -} - trait Buffer { fn buffer(&self) -> &[u8]; } @@ -197,52 +186,42 @@ impl< } } -struct Display +struct Display where SPI: SpiDevice, EPD: WaveshareThreeColorDisplayV2, DRAWTARGET: DrawTarget + ChromaticBuffer, - DELAY: DelayUs + DELAY: DelayUs, + THEME: Theme { spi: SPI, epd: EPD, draw_target: DRAWTARGET, delay: DELAY, - display_text: String<60>, + theme: THEME, } trait DisplayTheme { type Error; - fn draw(&mut self, data: Data) -> Result<(), Self::Error>; - fn draw_text(&mut self, text: &str) -> Result<(), Self::Error>; + fn draw(&mut self, data: &Data) -> Result<(), Self::Error>; } -impl DisplayTheme for Display +impl DisplayTheme for Display where SPI: SpiDevice, EPD: WaveshareThreeColorDisplayV2, SPI: SpiDevice, DRAWTARGET: DrawTarget + ChromaticBuffer, - DELAY: DelayUs + DELAY: DelayUs, + THEME: Theme { type Error = SPI::Error; - fn draw(&mut self, data: Data) -> Result<(), Self::Error> { - self.display_text.clear(); - write!(self.display_text, "CO2: {0} ppm | {1:#.2} °C | {2:#.2} %", data.co2, data.temperature, data.humidity).expect("Error occurred while trying to write in String"); - let _ = Line::new(Point::new(5, 50), Point::new(291, 50)) - .into_styled(PrimitiveStyle::with_stroke(TriColor::Chromatic, 4)) - .draw(&mut self.draw_target); - draw_text(&mut self.draw_target, &self.display_text, 5, 10); - draw_to_epd(&mut self.spi, &mut self.epd, &mut self.draw_target, &mut self.delay)?; - Ok(()) - } - - fn draw_text(&mut self, text: &str) -> Result<(), Self::Error> { - draw_text(&mut self.draw_target, text, 5, 10); + fn draw(&mut self, data: &Data) -> Result<(), Self::Error> { + let _ = self.theme.draw(data, &mut self.draw_target); draw_to_epd(&mut self.spi, &mut self.epd, &mut self.draw_target, &mut self.delay)?; Ok(()) } @@ -268,19 +247,3 @@ where epd.sleep(spi, delay)?; Ok(()) } - - - -fn draw_text(display: &mut DRAWTARGET, text: &str, x: i32, y: i32) -where - DRAWTARGET: DrawTarget { - let style = MonoTextStyleBuilder::new() - .font(&embedded_graphics::mono_font::ascii::FONT_8X13_BOLD) - .text_color(TriColor::Black) - .background_color(TriColor::White) - .build(); - - let text_style = TextStyleBuilder::new().baseline(Baseline::Top).build(); - - let _ = Text::with_text_style(text, Point::new(x, y), style, text_style).draw(display); -} \ No newline at end of file