use embedded_hal::{
delay::DelayNs,
digital::{InputPin, OutputPin},
};
use crate::{
command::{Command, CommandSet, State},
utils::{BitOps, BitState},
};
mod i2c_sender;
mod parallel_sender;
pub use i2c_sender::I2cSender;
pub use parallel_sender::ParallelSender;
pub trait IfReadable<const READABLE: bool> {}
impl<T> IfReadable<false> for T where T: OutputPin {}
impl<T> IfReadable<true> for T where T: OutputPin + InputPin {}
pub trait SendCommand<Delayer: DelayNs, const READABLE: bool> {
fn send(&mut self, command: Command) -> Option<u8>;
fn delay_and_send(
&mut self,
command_set: CommandSet,
delayer: &mut Delayer,
delay_us: u32,
) -> Option<u8> {
delayer.delay_us(delay_us);
self.send(command_set.into())
}
fn wait_and_send(
&mut self,
command_set: CommandSet,
delayer: &mut Delayer,
poll_interval_us: u32,
) -> Option<u8> {
self.wait_for_idle(delayer, poll_interval_us);
let res = self.send(command_set.into());
if !READABLE
&& (command_set == CommandSet::ClearDisplay || command_set == CommandSet::ReturnHome)
{
self.wait_for_idle(delayer, poll_interval_us.max(1520));
}
res
}
fn wait_for_idle(&mut self, delayer: &mut Delayer, poll_interval_us: u32) {
if READABLE {
while self.check_busy() {
delayer.delay_us(poll_interval_us);
}
} else {
delayer.delay_us(poll_interval_us);
}
}
fn check_busy(&mut self) -> bool {
if READABLE {
let busy_state = self
.send(CommandSet::ReadBusyFlagAndAddress.into())
.unwrap();
matches!(busy_state.check_bit(7), BitState::Set)
} else {
false
}
}
fn get_actual_backlight(&mut self) -> State {
State::default()
}
#[allow(unused_variables)]
fn set_actual_backlight(&mut self, backlight: State) {}
}