use crate::command::{Command, DataInterval, DataPolarity};
use crate::config::Config;
use crate::interface::DisplayInterface;
use hal;
pub const MAX_GATE_OUTPUTS: u16 = 296;
pub const MAX_SOURCE_OUTPUTS: u8 = 160;
pub struct Dimensions {
pub rows: u16,
pub cols: u8,
}
#[derive(Clone, Copy)]
pub enum Rotation {
Rotate0,
Rotate90,
Rotate180,
Rotate270,
}
impl Default for Rotation {
fn default() -> Self {
Rotation::Rotate0
}
}
pub struct Display<I>
where
I: DisplayInterface,
{
interface: I,
config: Config,
}
impl<I> Display<I>
where
I: DisplayInterface,
{
pub fn new(interface: I, config: Config) -> Self {
Self { interface, config }
}
pub fn reset<D: hal::delay::DelayNs>(&mut self, delay: &mut D) -> Result<(), I::Error> {
self.interface.reset(delay);
self.init(delay)
}
fn init<D: hal::delay::DelayNs>(&mut self, delay: &mut D) -> Result<(), I::Error> {
self.config.power_setting.execute(&mut self.interface)?;
self.config
.booster_soft_start
.execute(&mut self.interface)?;
Command::PowerOn.execute(&mut self.interface)?;
delay.delay_ms(200);
self.config.panel_setting.execute(&mut self.interface)?;
Command::VCOMDataIntervalSetting(0x0, DataPolarity::Both, DataInterval::V10)
.execute(&mut self.interface)?;
self.config.pll.execute(&mut self.interface)?;
Command::VCMDCSetting(0xA).execute(&mut self.interface)?;
delay.delay_ms(20);
Command::ResolutionSetting(self.config.dimensions.cols, self.config.dimensions.rows)
.execute(&mut self.interface)?;
Ok(())
}
pub fn signal_update(&mut self) -> Result<(), I::Error> {
Command::DisplayRefresh.execute(&mut self.interface)
}
fn power_down(&mut self) -> Result<(), I::Error> {
self.interface.busy_wait();
Command::VCOMDataIntervalSetting(0x0, DataPolarity::BWOnly, DataInterval::V10)
.execute(&mut self.interface)?;
Command::VCMDCSetting(0).execute(&mut self.interface)?;
Command::PowerOff.execute(&mut self.interface)
}
pub fn deep_sleep(&mut self) -> Result<(), I::Error> {
self.power_down()?;
Command::DeepSleep.execute(&mut self.interface)
}
pub fn rows(&self) -> u16 {
self.config.dimensions.rows
}
pub fn cols(&self) -> u8 {
self.config.dimensions.cols
}
pub fn rotation(&self) -> Rotation {
self.config.rotation
}
pub fn interface(&mut self) -> &mut I {
&mut self.interface
}
}