diff --git a/src/color.rs b/src/color.rs index edee7e8..fdab855 100644 --- a/src/color.rs +++ b/src/color.rs @@ -1,3 +1,6 @@ + +use embedded_graphics::prelude::*; + /// Only for the B/W Displays atm #[derive(Clone, Copy, PartialEq, Debug)] pub enum Color { @@ -22,6 +25,14 @@ impl Color { } } + fn from_u8(val: u8) -> Self { + match val { + 0 => Color::Black, + 1 => Color::White, + e => panic!("DisplayColor only parses 0 and 1 (Black and White) and not `{}`", e), + } + } + /// Get the color encoding of a specific bit in a byte /// /// input is the byte where one bit is gonna be selected @@ -73,3 +84,45 @@ impl Color { } } } + +impl PixelColor for Color {} + +impl From for Color { + fn from(value: u8) -> Self { + Color::from_u8(value) + } +} + + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn from_u8() { + assert_eq!(Color::Black, Color::from(0u8)); + assert_eq!(Color::White, Color::from(1u8)); + } + + // test all values aside from 0 and 1 which all should panic + #[test] + fn from_u8_panic() { + for val in 2..=u8::max_value() { + let result = std::panic::catch_unwind(|| Color::from(val)); + assert!(result.is_err()); + } + } + + #[test] + fn u8_conversion_black() { + assert_eq!(Color::from(Color::Black.get_bit_value()), Color::Black); + assert_eq!(Color::from(0u8).get_bit_value(), 0u8); + } + + #[test] + fn u8_conversion_white() { + assert_eq!(Color::from(Color::White.get_bit_value()), Color::White); + assert_eq!(Color::from(1u8).get_bit_value(), 1u8); + } +} diff --git a/src/drawing.rs b/src/drawing.rs index e1e6542..97c3ef7 100644 --- a/src/drawing.rs +++ b/src/drawing.rs @@ -1,4 +1,5 @@ use color::Color; +use embedded_graphics::prelude::*; /// Displayrotation #[derive(Clone, Copy)] @@ -12,9 +13,9 @@ pub enum DisplayRotation { /// Rotate 270 degrees clockwise Rotate270, } -impl Default for Displayorientation { +impl Default for DisplayRotation { fn default() -> Self { - Displayorientation::Rotate0 + DisplayRotation::Rotate0 } } @@ -39,15 +40,15 @@ pub trait Buffer { pub struct DisplayEink42BlackWhite { buffer: [u8; 400 * 300 / 8], - rotation: Displayorientation, //TODO: check embedded_graphics for orientation + rotation: DisplayRotation, //TODO: check embedded_graphics for orientation } impl Default for DisplayEink42BlackWhite { fn default() -> Self { - use epd4in2::constants::*; + use epd4in2::constants::{DEFAULT_BACKGROUND_COLOR, WIDTH, HEIGHT}; DisplayEink42BlackWhite { buffer: [ - DEFAULT_BACKGROUND_COLOR.get_full_byte(), - WIDTH * HEIGHT / 8 + DEFAULT_BACKGROUND_COLOR.get_byte_value(); + WIDTH as usize * HEIGHT as usize / 8 ], rotation: DisplayRotation::default() } @@ -63,14 +64,15 @@ impl Drawing for DisplayEink42BlackWhite { where T: Iterator> { + use epd4in2::constants::{DEFAULT_BACKGROUND_COLOR, WIDTH, HEIGHT}; for Pixel(UnsignedCoord(x,y), color) in item_pixels { let (idx, bit) = match self.rotation { - Displayorientation::Rotate0 | Displayorientation::Rotate180 => ( - (x as usize / 8 + (self.width as usize / 8) * y as usize), + DisplayRotation::Rotate0 | DisplayRotation::Rotate180 => ( + (x as usize / 8 + (WIDTH as usize / 8) * y as usize), 0x80 >> (x % 8), ), - Displayorientation::Rotate90 | Displayorientation::Rotate270 => ( - y as usize / 8 * self.width as usize + x as usize, + DisplayRotation::Rotate90 | DisplayRotation::Rotate270 => ( + y as usize / 8 * WIDTH as usize + x as usize, 0x80 >> (y % 8), ), }; @@ -79,7 +81,7 @@ impl Drawing for DisplayEink42BlackWhite { return; } - match color { + match Color::from(color) { Color::Black => { self.buffer[idx] &= !bit; } diff --git a/src/epd4in2/mod.rs b/src/epd4in2/mod.rs index 640fa6f..4d6dd53 100644 --- a/src/epd4in2/mod.rs +++ b/src/epd4in2/mod.rs @@ -55,7 +55,7 @@ use traits::{WaveshareDisplay, InternalWiAdditions}; use interface::DisplayInterface; //The Lookup Tables for the Display -mod constants; +pub(crate) mod constants; //TODO: Limit to crate::drawing use self::constants::*; use color::Color; diff --git a/src/lib.rs b/src/lib.rs index fb9c8dc..3c9623b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -50,6 +50,8 @@ use hal::spi::{Mode, Phase, Polarity}; #[cfg(feature = "graphics")] pub mod drawing; +pub(crate) mod drawing_old; + mod traits; pub use traits::{WaveshareDisplay}; @@ -79,7 +81,6 @@ pub use epd2in9::EPD2in9; pub(crate) mod type_a; extern crate embedded_graphics; -use embedded_graphics; //TODO: test spi mode /// SPI mode -