use core::marker::PhantomData;
use embedded_hal::delay::DelayNs;
use crate::traits::{ColorChannel, EpdController, EpdPanel};
pub struct EpdDriver<BUS, CONTROLLER, PANEL> {
bus: BUS,
controller: CONTROLLER,
_panel: PhantomData<PANEL>,
}
impl<BUS, CONTROLLER, PANEL> EpdDriver<BUS, CONTROLLER, PANEL>
where
CONTROLLER: EpdController<BUS>,
PANEL: EpdPanel,
{
pub fn new(bus: BUS, controller: CONTROLLER) -> Self {
Self {
bus,
controller,
_panel: PhantomData,
}
}
pub fn bus(&self) -> &BUS {
&self.bus
}
pub fn bus_mut(&mut self) -> &mut BUS {
&mut self.bus
}
pub fn controller(&self) -> &CONTROLLER {
&self.controller
}
pub fn controller_mut(&mut self) -> &mut CONTROLLER {
&mut self.controller
}
pub fn split_mut(&mut self) -> (&mut BUS, &mut CONTROLLER) {
(&mut self.bus, &mut self.controller)
}
pub fn width(&self) -> u32 {
PANEL::WIDTH
}
pub fn height(&self) -> u32 {
PANEL::HEIGHT
}
pub fn init<DELAY: DelayNs>(&mut self, delay: &mut DELAY) -> Result<(), CONTROLLER::Error> {
self.controller.init_sequence(&mut self.bus, delay)
}
pub fn set_window(
&mut self,
x_start: u32,
y_start: u32,
x_end: u32,
y_end: u32,
) -> Result<(), CONTROLLER::Error> {
self.controller
.set_window(&mut self.bus, x_start, y_start, x_end, y_end)
}
pub fn set_cursor(&mut self, x: u32, y: u32) -> Result<(), CONTROLLER::Error> {
self.controller.set_cursor(&mut self.bus, x, y)
}
pub fn write_frame(
&mut self,
channel: ColorChannel,
data: &[u8],
) -> Result<(), CONTROLLER::Error> {
self.controller.write_frame(&mut self.bus, channel, data)
}
pub fn clear_frame(
&mut self,
channel: ColorChannel,
pattern_byte: u8,
) -> Result<(), CONTROLLER::Error> {
let total_bytes = PANEL::WIDTH.div_ceil(8) as usize * PANEL::HEIGHT as usize;
self.controller
.write_frame_pattern(&mut self.bus, channel, pattern_byte, total_bytes)
}
pub fn refresh<DELAY: DelayNs>(&mut self, delay: &mut DELAY) -> Result<(), CONTROLLER::Error> {
self.controller.trigger_refresh(&mut self.bus, delay)
}
pub fn sleep<DELAY: DelayNs>(&mut self, delay: &mut DELAY) -> Result<(), CONTROLLER::Error> {
self.controller.sleep(&mut self.bus, delay)
}
}
pub struct EpdBuilder<CONTROLLER, PANEL> {
controller: CONTROLLER,
_panel: PhantomData<PANEL>,
}
impl<CONTROLLER, PANEL> EpdBuilder<CONTROLLER, PANEL> {
pub fn new(controller: CONTROLLER) -> Self {
Self {
controller,
_panel: PhantomData,
}
}
pub fn build<BUS>(self, bus: BUS) -> EpdDriver<BUS, CONTROLLER, PANEL>
where
CONTROLLER: EpdController<BUS>,
PANEL: EpdPanel,
{
EpdDriver::new(bus, self.controller)
}
}