From b5e647b0d01e32be62862c32eb0c00c14e32333f Mon Sep 17 00:00:00 2001 From: Michael Beaumont Date: Fri, 27 Mar 2020 18:38:39 +0100 Subject: [PATCH] Rename red to chromatic, rename epd2in9b to epd2in9bc --- src/color.rs | 4 +- src/epd1in54b/mod.rs | 16 ++++- src/{epd2in9b => epd2in9bc}/command.rs | 2 +- src/{epd2in9b => epd2in9bc}/graphics.rs | 14 ++-- src/{epd2in9b => epd2in9bc}/mod.rs | 87 +++++++++++++------------ src/lib.rs | 2 +- src/traits.rs | 14 +++- 7 files changed, 83 insertions(+), 56 deletions(-) rename src/{epd2in9b => epd2in9bc}/command.rs (93%) rename src/{epd2in9b => epd2in9bc}/graphics.rs (77%) rename src/{epd2in9b => epd2in9bc}/mod.rs (86%) diff --git a/src/color.rs b/src/color.rs index 3f70397..a1e5ec7 100644 --- a/src/color.rs +++ b/src/color.rs @@ -24,8 +24,8 @@ pub enum TriColor { Black, /// White color White, - /// Red color - Red, + /// Chromatic color + Chromatic, } //TODO: Rename get_bit_value to bit() and get_byte_value to byte() ? diff --git a/src/epd1in54b/mod.rs b/src/epd1in54b/mod.rs index 9244093..dd74a19 100644 --- a/src/epd1in54b/mod.rs +++ b/src/epd1in54b/mod.rs @@ -101,8 +101,13 @@ where &mut self, spi: &mut SPI, black: &[u8], - red: &[u8], + chromatic: &[u8], ) -> Result<(), SPI::Error> { + self.update_achromatic_frame(spi, black)?; + self.update_chromatic_frame(spi, chromatic) + } + + fn update_achromatic_frame(&mut self, spi: &mut SPI, black: &[u8]) -> Result<(), SPI::Error> { self.wait_until_idle(); self.send_resolution(spi)?; @@ -113,10 +118,17 @@ where let expanded = expand_bits(*b); self.interface.data(spi, &expanded)?; } + Ok(()) + } + fn update_chromatic_frame( + &mut self, + spi: &mut SPI, + chromatic: &[u8], + ) -> Result<(), SPI::Error> { self.interface .cmd(spi, Command::DATA_START_TRANSMISSION_2)?; - self.interface.data(spi, red)?; + self.interface.data(spi, chromatic)?; Ok(()) } } diff --git a/src/epd2in9b/command.rs b/src/epd2in9bc/command.rs similarity index 93% rename from src/epd2in9b/command.rs rename to src/epd2in9bc/command.rs index a268fa7..a389a6f 100644 --- a/src/epd2in9b/command.rs +++ b/src/epd2in9bc/command.rs @@ -1,4 +1,4 @@ -//! SPI Commands for the Waveshare 2.9" red E-Ink Display +//! SPI Commands for the Waveshare 2.9" (B/C) E-Ink Display use crate::traits; #[allow(dead_code)] diff --git a/src/epd2in9b/graphics.rs b/src/epd2in9bc/graphics.rs similarity index 77% rename from src/epd2in9b/graphics.rs rename to src/epd2in9bc/graphics.rs index f354e96..16d12d1 100644 --- a/src/epd2in9b/graphics.rs +++ b/src/epd2in9bc/graphics.rs @@ -1,26 +1,26 @@ -use crate::epd2in9b::{DEFAULT_BACKGROUND_COLOR, HEIGHT, NUM_DISPLAY_BITS, WIDTH}; +use crate::epd2in9bc::{DEFAULT_BACKGROUND_COLOR, HEIGHT, NUM_DISPLAY_BITS, WIDTH}; use crate::graphics::{Display, DisplayRotation}; use embedded_graphics::pixelcolor::BinaryColor; use embedded_graphics::prelude::*; -/// Full size buffer for use with the 2in9b EPD +/// Full size buffer for use with the 2in9b/c EPD /// /// Can also be manually constructed and be used together with VarDisplay -pub struct Display2in9b { +pub struct Display2in9bc { buffer: [u8; NUM_DISPLAY_BITS as usize], rotation: DisplayRotation, } -impl Default for Display2in9b { +impl Default for Display2in9bc { fn default() -> Self { - Display2in9b { + Display2in9bc { buffer: [DEFAULT_BACKGROUND_COLOR.get_byte_value(); NUM_DISPLAY_BITS as usize], rotation: DisplayRotation::default(), } } } -impl DrawTarget for Display2in9b { +impl DrawTarget for Display2in9bc { type Error = core::convert::Infallible; fn draw_pixel(&mut self, pixel: Pixel) -> Result<(), Self::Error> { @@ -32,7 +32,7 @@ impl DrawTarget for Display2in9b { } } -impl Display for Display2in9b { +impl Display for Display2in9bc { fn buffer(&self) -> &[u8] { &self.buffer } diff --git a/src/epd2in9b/mod.rs b/src/epd2in9bc/mod.rs similarity index 86% rename from src/epd2in9b/mod.rs rename to src/epd2in9bc/mod.rs index 6327530..a857f69 100644 --- a/src/epd2in9b/mod.rs +++ b/src/epd2in9bc/mod.rs @@ -1,5 +1,4 @@ -//! A simple Driver for the Waveshare 2.9" (B) E-Ink Display via SPI - +//! A simple Driver for the Waveshare 2.9" (B/C) E-Ink Display via SPI use embedded_hal::{ blocking::{delay::*, spi::Write}, digital::v2::*, @@ -10,11 +9,11 @@ use crate::traits::{ InternalWiAdditions, RefreshLUT, WaveshareDisplay, WaveshareThreeColorDisplay, }; -/// Width of epd2in9b in pixels +/// Width of epd2in9bc in pixels pub const WIDTH: u32 = 128; -/// Height of epd2in9b in pixels +/// Height of epd2in9bc in pixels pub const HEIGHT: u32 = 296; -/// Default background color (white) of epd2in9b display +/// Default background color (white) of epd2in9bc display pub const DEFAULT_BACKGROUND_COLOR: Color = Color::White; const NUM_DISPLAY_BITS: u32 = WIDTH * HEIGHT / 8; @@ -23,7 +22,7 @@ const IS_BUSY_LOW: bool = true; const VCOM_DATA_INTERVAL: u8 = 0x07; const WHITE_BORDER: u8 = 0x70; const BLACK_BORDER: u8 = 0x30; -const RED_BORDER: u8 = 0xb0; +const CHROMATIC_BORDER: u8 = 0xb0; const FLOATING_BORDER: u8 = 0xF0; use crate::color::{Color, TriColor}; @@ -34,16 +33,16 @@ use self::command::Command; #[cfg(feature = "graphics")] mod graphics; #[cfg(feature = "graphics")] -pub use self::graphics::Display2in9b; +pub use self::graphics::Display2in9bc; -/// EPD2in9b driver -pub struct EPD2in9b { +/// EPD2in9bc driver +pub struct EPD2in9bc { interface: DisplayInterface, color: Color, } impl InternalWiAdditions - for EPD2in9b + for EPD2in9bc where SPI: Write, CS: OutputPin, @@ -90,7 +89,7 @@ where } impl WaveshareThreeColorDisplay - for EPD2in9b + for EPD2in9bc where SPI: Write, CS: OutputPin, @@ -102,15 +101,41 @@ where &mut self, spi: &mut SPI, black: &[u8], - red: &[u8], + chromatic: &[u8], ) -> Result<(), SPI::Error> { - self.update_mono_frame(spi, black)?; - self.update_red_frame(spi, red) + self.update_achromatic_frame(spi, black)?; + self.update_chromatic_frame(spi, chromatic) + } + + /// Update only the black/white data of the display. + /// + /// Finish by calling `update_chromatic_frame`. + fn update_achromatic_frame(&mut self, spi: &mut SPI, black: &[u8]) -> Result<(), SPI::Error> { + self.interface + .cmd(spi, Command::DATA_START_TRANSMISSION_1)?; + self.interface.data(spi, black)?; + Ok(()) + } + + /// Update only chromatic data of the display. + /// + /// This data takes precedence over the black/white data. + fn update_chromatic_frame( + &mut self, + spi: &mut SPI, + chromatic: &[u8], + ) -> Result<(), SPI::Error> { + self.interface + .cmd(spi, Command::DATA_START_TRANSMISSION_2)?; + self.interface.data(spi, chromatic)?; + + self.wait_until_idle(); + Ok(()) } } impl WaveshareDisplay - for EPD2in9b + for EPD2in9bc where SPI: Write, CS: OutputPin, @@ -129,7 +154,7 @@ where let interface = DisplayInterface::new(cs, busy, dc, rst); let color = DEFAULT_BACKGROUND_COLOR; - let mut epd = EPD2in9b { interface, color }; + let mut epd = EPD2in9bc { interface, color }; epd.init(spi, delay)?; @@ -183,7 +208,7 @@ where self.interface.data(spi, &buffer)?; - // Clear the red layer + // Clear the chromatic layer let color = self.color.get_byte_value(); self.interface @@ -231,7 +256,7 @@ where self.interface.data_x_times(spi, color, NUM_DISPLAY_BITS)?; - // Clear the red + // Clear the chromatic self.interface .cmd(spi, Command::DATA_START_TRANSMISSION_2)?; self.interface.data_x_times(spi, color, NUM_DISPLAY_BITS)?; @@ -253,7 +278,7 @@ where } } -impl EPD2in9b +impl EPD2in9bc where SPI: Write, CS: OutputPin, @@ -298,7 +323,7 @@ where let border = match color { TriColor::Black => BLACK_BORDER, TriColor::White => WHITE_BORDER, - TriColor::Red => RED_BORDER, + TriColor::Chromatic => CHROMATIC_BORDER, }; self.cmd_with_data( spi, @@ -306,26 +331,4 @@ where &[border | VCOM_DATA_INTERVAL], ) } - - /// Update only the black/white data of the display. - /// - /// Finish by calling `update_red_frame`. - pub fn update_mono_frame(&mut self, spi: &mut SPI, black: &[u8]) -> Result<(), SPI::Error> { - self.interface - .cmd(spi, Command::DATA_START_TRANSMISSION_1)?; - self.interface.data(spi, black)?; - Ok(()) - } - - /// Update only red data of the display. - /// - /// This data takes precedence over the black/white data. - pub fn update_red_frame(&mut self, spi: &mut SPI, red: &[u8]) -> Result<(), SPI::Error> { - self.interface - .cmd(spi, Command::DATA_START_TRANSMISSION_2)?; - self.interface.data(spi, red)?; - - self.wait_until_idle(); - Ok(()) - } } diff --git a/src/lib.rs b/src/lib.rs index 52edc10..0d65364 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -75,7 +75,7 @@ mod interface; pub mod epd1in54; pub mod epd1in54b; pub mod epd2in9; -pub mod epd2in9b; +pub mod epd2in9bc; pub mod epd4in2; pub mod epd7in5; pub mod epd7in5_v2; diff --git a/src/traits.rs b/src/traits.rs index eed2672..52a7337 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -69,8 +69,20 @@ where &mut self, spi: &mut SPI, black: &[u8], - color: &[u8], + chromatic: &[u8], ) -> Result<(), SPI::Error>; + + /// Update only the black/white data of the display. + /// + /// This must be finished by calling `update_chromatic_frame`. + fn update_achromatic_frame(&mut self, spi: &mut SPI, black: &[u8]) -> Result<(), SPI::Error>; + + /// Update only the chromatic data of the display. + /// + /// This should be preceded by a call to `update_achromatic_frame`. + /// This data takes precedence over the black/white data. + fn update_chromatic_frame(&mut self, spi: &mut SPI, chromatic: &[u8]) + -> Result<(), SPI::Error>; } /// All the functions to interact with the EPDs