|
|
|
@ -2,7 +2,7 @@ use crate::traits::Command;
|
|
|
|
|
use core::marker::PhantomData; |
|
|
|
|
use embedded_hal::{ |
|
|
|
|
blocking::{delay::*, spi::Write}, |
|
|
|
|
digital::*, |
|
|
|
|
digital::v2::*, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/// The Connection Interface of all (?) Waveshare EPD-Devices
|
|
|
|
@ -43,7 +43,7 @@ where
|
|
|
|
|
/// Enables direct interaction with the device with the help of [data()](DisplayInterface::data())
|
|
|
|
|
pub(crate) fn cmd<T: Command>(&mut self, spi: &mut SPI, command: T) -> Result<(), SPI::Error> { |
|
|
|
|
// low for commands
|
|
|
|
|
self.dc.set_low(); |
|
|
|
|
let _ = self.dc.set_low(); |
|
|
|
|
|
|
|
|
|
// Transfer the command over spi
|
|
|
|
|
self.write(spi, &[command.address()]) |
|
|
|
@ -54,7 +54,7 @@ where
|
|
|
|
|
/// Enables direct interaction with the device with the help of [command()](EPD4in2::command())
|
|
|
|
|
pub(crate) fn data(&mut self, spi: &mut SPI, data: &[u8]) -> Result<(), SPI::Error> { |
|
|
|
|
// high for data
|
|
|
|
|
self.dc.set_high(); |
|
|
|
|
let _ = self.dc.set_high(); |
|
|
|
|
|
|
|
|
|
// Transfer data (u8-array) over spi
|
|
|
|
|
self.write(spi, data) |
|
|
|
@ -83,7 +83,7 @@ where
|
|
|
|
|
repetitions: u32, |
|
|
|
|
) -> Result<(), SPI::Error> { |
|
|
|
|
// high for data
|
|
|
|
|
self.dc.set_high(); |
|
|
|
|
let _ = self.dc.set_high(); |
|
|
|
|
// Transfer data (u8) over spi
|
|
|
|
|
for _ in 0..repetitions { |
|
|
|
|
self.write(spi, &[val])?; |
|
|
|
@ -94,7 +94,7 @@ where
|
|
|
|
|
// spi write helper/abstraction function
|
|
|
|
|
fn write(&mut self, spi: &mut SPI, data: &[u8]) -> Result<(), SPI::Error> { |
|
|
|
|
// activate spi with cs low
|
|
|
|
|
self.cs.set_low(); |
|
|
|
|
let _ = self.cs.set_low(); |
|
|
|
|
|
|
|
|
|
// transfer spi data
|
|
|
|
|
// Be careful!! Linux has a default limit of 4096 bytes per spi transfer
|
|
|
|
@ -108,7 +108,7 @@ where
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// deativate spi with cs high
|
|
|
|
|
self.cs.set_high(); |
|
|
|
|
let _ = self.cs.set_high(); |
|
|
|
|
|
|
|
|
|
Ok(()) |
|
|
|
|
} |
|
|
|
@ -138,7 +138,7 @@ where
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// Checks if device is still busy
|
|
|
|
|
///
|
|
|
|
|
///
|
|
|
|
|
/// This is normally handled by the more complicated commands themselves,
|
|
|
|
|
/// but in the case you send data and commands directly you might need to check
|
|
|
|
|
/// if the device is still busy
|
|
|
|
@ -151,7 +151,7 @@ where
|
|
|
|
|
/// Most likely there was a mistake with the 2in9 busy connection
|
|
|
|
|
/// //TODO: use the #cfg feature to make this compile the right way for the certain types
|
|
|
|
|
pub(crate) fn is_busy(&self, is_busy_low: bool) -> bool { |
|
|
|
|
(is_busy_low && self.busy.is_low()) || (!is_busy_low && self.busy.is_high()) |
|
|
|
|
(is_busy_low && self.busy.is_low().unwrap_or(false)) || (!is_busy_low && self.busy.is_high().unwrap_or(false)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// Resets the device.
|
|
|
|
@ -160,10 +160,10 @@ where
|
|
|
|
|
///
|
|
|
|
|
/// TODO: Takes at least 400ms of delay alone, can it be shortened?
|
|
|
|
|
pub(crate) fn reset<DELAY: DelayMs<u8>>(&mut self, delay: &mut DELAY) { |
|
|
|
|
self.rst.set_low(); |
|
|
|
|
let _ = self.rst.set_low(); |
|
|
|
|
//TODO: why 200ms? (besides being in the arduino version)
|
|
|
|
|
delay.delay_ms(200); |
|
|
|
|
self.rst.set_high(); |
|
|
|
|
let _ = self.rst.set_high(); |
|
|
|
|
//TODO: same as 3 lines above
|
|
|
|
|
delay.delay_ms(200); |
|
|
|
|
} |
|
|
|
|