|
|
|
|
@ -33,11 +33,11 @@
|
|
|
|
|
//! .draw(&mut display);
|
|
|
|
|
//!
|
|
|
|
|
//! // Display updated frame
|
|
|
|
|
//!epd.update_frame(&mut spi, &display.buffer())?;
|
|
|
|
|
//!epd.display_frame(&mut spi)?;
|
|
|
|
|
//!epd.update_frame(&mut spi, &display.buffer(), &mut delay)?;
|
|
|
|
|
//!epd.display_frame(&mut spi, &mut delay)?;
|
|
|
|
|
//!
|
|
|
|
|
//!// Set the EPD to sleep
|
|
|
|
|
//!epd.sleep(&mut spi)?;
|
|
|
|
|
//!epd.sleep(&mut spi, &mut delay)?;
|
|
|
|
|
//!# Ok(())
|
|
|
|
|
//!# }
|
|
|
|
|
//!```
|
|
|
|
|
@ -83,28 +83,25 @@ pub use crate::epd2in9_v2::graphics::Display2in9;
|
|
|
|
|
|
|
|
|
|
/// Epd2in9 driver
|
|
|
|
|
///
|
|
|
|
|
pub struct Epd2in9<SPI, CS, BUSY, DC, RST> { |
|
|
|
|
pub struct Epd2in9<SPI, CS, BUSY, DC, RST, DELAY> { |
|
|
|
|
/// SPI
|
|
|
|
|
interface: DisplayInterface<SPI, CS, BUSY, DC, RST>, |
|
|
|
|
interface: DisplayInterface<SPI, CS, BUSY, DC, RST, DELAY>, |
|
|
|
|
/// Color
|
|
|
|
|
background_color: Color, |
|
|
|
|
/// Refresh LUT
|
|
|
|
|
refresh: RefreshLut, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl<SPI, CS, BUSY, DC, RST> Epd2in9<SPI, CS, BUSY, DC, RST> |
|
|
|
|
impl<SPI, CS, BUSY, DC, RST, DELAY> Epd2in9<SPI, CS, BUSY, DC, RST, DELAY> |
|
|
|
|
where |
|
|
|
|
SPI: Write<u8>, |
|
|
|
|
CS: OutputPin, |
|
|
|
|
BUSY: InputPin, |
|
|
|
|
DC: OutputPin, |
|
|
|
|
RST: OutputPin, |
|
|
|
|
DELAY: DelayMs<u8>, |
|
|
|
|
{ |
|
|
|
|
fn init<DELAY: DelayMs<u8>>( |
|
|
|
|
&mut self, |
|
|
|
|
spi: &mut SPI, |
|
|
|
|
delay: &mut DELAY, |
|
|
|
|
) -> Result<(), SPI::Error> { |
|
|
|
|
fn init(&mut self, spi: &mut SPI, delay: &mut DELAY) -> Result<(), SPI::Error> { |
|
|
|
|
self.interface.reset(delay, 2); |
|
|
|
|
|
|
|
|
|
self.wait_until_idle(); |
|
|
|
|
@ -136,14 +133,15 @@ where
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl<SPI, CS, BUSY, DC, RST> WaveshareDisplay<SPI, CS, BUSY, DC, RST> |
|
|
|
|
for Epd2in9<SPI, CS, BUSY, DC, RST> |
|
|
|
|
impl<SPI, CS, BUSY, DC, RST, DELAY> WaveshareDisplay<SPI, CS, BUSY, DC, RST, DELAY> |
|
|
|
|
for Epd2in9<SPI, CS, BUSY, DC, RST, DELAY> |
|
|
|
|
where |
|
|
|
|
SPI: Write<u8>, |
|
|
|
|
CS: OutputPin, |
|
|
|
|
BUSY: InputPin, |
|
|
|
|
DC: OutputPin, |
|
|
|
|
RST: OutputPin, |
|
|
|
|
DELAY: DelayMs<u8>, |
|
|
|
|
{ |
|
|
|
|
type DisplayColor = Color; |
|
|
|
|
fn width(&self) -> u32 { |
|
|
|
|
@ -154,7 +152,7 @@ where
|
|
|
|
|
HEIGHT |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn new<DELAY: DelayMs<u8>>( |
|
|
|
|
fn new( |
|
|
|
|
spi: &mut SPI, |
|
|
|
|
cs: CS, |
|
|
|
|
busy: BUSY, |
|
|
|
|
@ -175,7 +173,7 @@ where
|
|
|
|
|
Ok(epd) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn sleep(&mut self, spi: &mut SPI) -> Result<(), SPI::Error> { |
|
|
|
|
fn sleep(&mut self, spi: &mut SPI, _delay: &mut DELAY) -> Result<(), SPI::Error> { |
|
|
|
|
self.wait_until_idle(); |
|
|
|
|
// 0x00 for Normal mode (Power on Reset), 0x01 for Deep Sleep Mode
|
|
|
|
|
self.interface |
|
|
|
|
@ -183,16 +181,17 @@ where
|
|
|
|
|
Ok(()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn wake_up<DELAY: DelayMs<u8>>( |
|
|
|
|
&mut self, |
|
|
|
|
spi: &mut SPI, |
|
|
|
|
delay: &mut DELAY, |
|
|
|
|
) -> Result<(), SPI::Error> { |
|
|
|
|
fn wake_up(&mut self, spi: &mut SPI, delay: &mut DELAY) -> Result<(), SPI::Error> { |
|
|
|
|
self.init(spi, delay)?; |
|
|
|
|
Ok(()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn update_frame(&mut self, spi: &mut SPI, buffer: &[u8]) -> Result<(), SPI::Error> { |
|
|
|
|
fn update_frame( |
|
|
|
|
&mut self, |
|
|
|
|
spi: &mut SPI, |
|
|
|
|
buffer: &[u8], |
|
|
|
|
_delay: &mut DELAY, |
|
|
|
|
) -> Result<(), SPI::Error> { |
|
|
|
|
self.wait_until_idle(); |
|
|
|
|
self.interface.cmd_with_data(spi, Command::WriteRam, buffer) |
|
|
|
|
} |
|
|
|
|
@ -215,7 +214,7 @@ where
|
|
|
|
|
Ok(()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn display_frame(&mut self, spi: &mut SPI) -> Result<(), SPI::Error> { |
|
|
|
|
fn display_frame(&mut self, spi: &mut SPI, _delay: &mut DELAY) -> Result<(), SPI::Error> { |
|
|
|
|
self.wait_until_idle(); |
|
|
|
|
// Enable clock signal, Enable Analog, Load temperature value, DISPLAY with DISPLAY Mode 1, Disable Analog, Disable OSC
|
|
|
|
|
self.interface |
|
|
|
|
@ -225,13 +224,18 @@ where
|
|
|
|
|
Ok(()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn update_and_display_frame(&mut self, spi: &mut SPI, buffer: &[u8]) -> Result<(), SPI::Error> { |
|
|
|
|
self.update_frame(spi, buffer)?; |
|
|
|
|
self.display_frame(spi)?; |
|
|
|
|
fn update_and_display_frame( |
|
|
|
|
&mut self, |
|
|
|
|
spi: &mut SPI, |
|
|
|
|
buffer: &[u8], |
|
|
|
|
delay: &mut DELAY, |
|
|
|
|
) -> Result<(), SPI::Error> { |
|
|
|
|
self.update_frame(spi, buffer, delay)?; |
|
|
|
|
self.display_frame(spi, delay)?; |
|
|
|
|
Ok(()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn clear_frame(&mut self, spi: &mut SPI) -> Result<(), SPI::Error> { |
|
|
|
|
fn clear_frame(&mut self, spi: &mut SPI, _delay: &mut DELAY) -> Result<(), SPI::Error> { |
|
|
|
|
self.wait_until_idle(); |
|
|
|
|
|
|
|
|
|
// clear the ram with the background color
|
|
|
|
|
@ -265,13 +269,14 @@ where
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl<SPI, CS, BUSY, DC, RST> Epd2in9<SPI, CS, BUSY, DC, RST> |
|
|
|
|
impl<SPI, CS, BUSY, DC, RST, DELAY> Epd2in9<SPI, CS, BUSY, DC, RST, DELAY> |
|
|
|
|
where |
|
|
|
|
SPI: Write<u8>, |
|
|
|
|
CS: OutputPin, |
|
|
|
|
BUSY: InputPin, |
|
|
|
|
DC: OutputPin, |
|
|
|
|
RST: OutputPin, |
|
|
|
|
DELAY: DelayMs<u8>, |
|
|
|
|
{ |
|
|
|
|
fn wait_until_idle(&mut self) { |
|
|
|
|
self.interface.wait_until_idle(IS_BUSY_LOW); |
|
|
|
|
@ -343,14 +348,15 @@ where
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl<SPI, CS, BUSY, DC, RST> QuickRefresh<SPI, CS, BUSY, DC, RST> |
|
|
|
|
for Epd2in9<SPI, CS, BUSY, DC, RST> |
|
|
|
|
impl<SPI, CS, BUSY, DC, RST, DELAY> QuickRefresh<SPI, CS, BUSY, DC, RST> |
|
|
|
|
for Epd2in9<SPI, CS, BUSY, DC, RST, DELAY> |
|
|
|
|
where |
|
|
|
|
SPI: Write<u8>, |
|
|
|
|
CS: OutputPin, |
|
|
|
|
BUSY: InputPin, |
|
|
|
|
DC: OutputPin, |
|
|
|
|
RST: OutputPin, |
|
|
|
|
DELAY: DelayMs<u8>, |
|
|
|
|
{ |
|
|
|
|
/// To be followed immediately by `update_new_frame`.
|
|
|
|
|
fn update_old_frame(&mut self, spi: &mut SPI, buffer: &[u8]) -> Result<(), SPI::Error> { |
|
|
|
|
|