use crate::color::EpdColor;
use core::marker::Sized;
use embedded_hal::{
blocking::{delay::*, serial::Write},
digital::v2::*,
serial::Read,
};
pub(crate) trait Command {
fn address(self) -> u8;
}
#[derive(Debug)]
pub enum Error<E, F, G> {
SerialR(E),
SerialW(F),
GpioE(G),
Timeout,
}
pub(crate) trait InternalWiAdditions<E, F, G, SERIAL, WAKE, RST>
where
SERIAL: Write<u8, Error = F> + Read<u8, Error = E>,
WAKE: OutputPin<Error = G>,
RST: OutputPin<Error = G>,
{
fn init<DELAY: DelayMs<u16>>(
&mut self,
serial: &mut SERIAL,
delay: &mut DELAY,
) -> Result<(), Error<E, F, G>>;
fn wake<DELAY: DelayMs<u16>>(
&mut self,
serial: &mut SERIAL,
delay: &mut DELAY,
) -> Result<(), Error<E, F, G>>;
}
pub trait WaveshareDisplay<E, F, G, SERIAL, WAKE, RST>
where
SERIAL: Write<u8, Error = F> + Read<u8, Error = E>,
WAKE: OutputPin<Error = G>,
RST: OutputPin<Error = G>,
{
fn new<DELAY: DelayMs<u16>>(
serial: &mut SERIAL,
wake: WAKE,
rst: RST,
delay: &mut DELAY,
) -> Result<Self, Error<E, F, G>>
where
Self: Sized;
fn sleep(&mut self, serial: &mut SERIAL) -> Result<(), Error<E, F, G>>;
fn wake_up<DELAY: DelayMs<u16>>(
&mut self,
serial: &mut SERIAL,
delay: &mut DELAY,
) -> Result<(), Error<E, F, G>>;
fn set_background_color(&mut self, color: EpdColor);
fn set_foreground_color(&mut self, color: EpdColor);
fn width(&self) -> u32;
fn height(&self) -> u32;
fn update_frame<DELAY: DelayMs<u16>>(
&mut self,
serial: &mut SERIAL,
buffer: &[EpdColor],
delay: &mut DELAY,
) -> Result<(), Error<E, F, G>>;
fn display_frame(&mut self, serial: &mut SERIAL) -> Result<(), Error<E, F, G>>;
fn clear_frame(&mut self, serial: &mut SERIAL) -> Result<(), Error<E, F, G>>;
}