use crate::command;
use crate::command::*;
use crate::config::Config;
use crate::interface::DisplayInterface;
pub const MAX_GATE_OUTPUTS: u16 = 680;
pub const MAX_SOURCE_OUTPUTS: u16 = 960;
#[cfg(feature = "defmt")]
#[derive(defmt::Format)]
pub struct Dimensions {
pub rows: u16,
pub cols: u16,
}
#[derive(Clone, Copy, Debug, PartialEq)]
#[cfg(feature = "defmt")]
#[derive(defmt::Format)]
pub enum Rotation {
Rotate0,
Rotate90,
Rotate180,
Rotate270,
}
#[derive(Clone, Copy, Debug, PartialEq)]
#[cfg(feature = "defmt")]
#[derive(defmt::Format)]
pub enum DisplayUpdateMode {
Fast = 0xFF,
Slow = 0xF7,
}
impl Default for Rotation {
fn default() -> Self {
Rotation::Rotate0
}
}
pub struct BasicDisplay<I, SPI>
where
SPI: embedded_hal::spi::SpiDevice,
I: DisplayInterface + DisplayCommands<SPI>,
{
pub(crate) interface: I, pub(crate) config: Config, _phantom: core::marker::PhantomData<SPI>, }
impl<I, SPI> BasicDisplay<I, SPI>
where
I: DisplayInterface + DisplayCommands<SPI>,
SPI: embedded_hal::spi::SpiDevice,
{
pub fn new(interface: I, config: Config) -> Self {
Self {
interface,
config,
_phantom: core::marker::PhantomData,
}
}
pub fn reset<D: embedded_hal::delay::DelayNs>(
&mut self,
delay: &mut D,
) -> Result<(), <I as DisplayInterface>::Error> {
self.interface.reset_hardware(delay);
self.interface
.reset_software()
.expect("Failed to soft-reset the device");
self.interface.busy_wait();
self.init()
}
pub fn init(&mut self) -> Result<(), <I as DisplayInterface>::Error> {
self.interface
.auto_write_ram_black_and_white_regular_pattern(0xF7)
.expect("Failed to fill BW RAM");
self.interface
.auto_write_ram_red_regular_pattern(0xF7)
.expect("Failed to fill RED RAM");
self.interface
.set_driver_output_control_from_width(self.config.dimensions.rows)
.expect("Failed to set gate control");
self.interface
.set_data_entry_mode(
DataEntryMode::IncrementXIncrementY,
IncrementAxis::Horizontal,
)
.expect("Failed to set data entry mode");
self.interface
.set_ram_address_based_on_size(self.config.dimensions.rows, self.config.dimensions.cols)
.expect("Failed to set RAM address");
self.interface
.set_border_waveform_control(
command::WaveformVDBOption::Transition,
command::VDBFixedLevelSetting::VSS,
command::VDBGSTransitionSetting::LUT1,
)
.expect("Failed to set waveform control");
self.interface
.set_temperature_sensor(command::TemperatureSensor::Internal)
.expect("Failed to set temp sensor");
self.interface
.update_display_option2(0xFF)
.expect("Failed to load waveform LUT");
self.interface
.refresh_display()
.expect("Failed to refresh self.interfacelay");
self.interface.busy_wait();
Ok(())
}
pub fn update(
&mut self,
bw_buffer: Option<&[u8]>,
red_buffer: Option<&[u8]>,
update_mode: DisplayUpdateMode,
) -> Result<(), <I as DisplayInterface>::Error> {
if let Some(buffer) = bw_buffer {
self.interface
.set_ram_x_count(0)
.expect("Failed to set RAM address for x");
self.interface
.set_ram_y_count(0)
.expect("Failed to set RAM address for y");
self.interface
.write_ram_black_and_white(buffer)
.expect("Failed to write black and white RAM buffer");
}
if let Some(buffer) = red_buffer {
self.interface
.set_ram_x_count(0)
.expect("Failed to set RAM address for x");
self.interface
.set_ram_y_count(0)
.expect("Failed to set RAM address for y");
self.interface
.write_ram_red(buffer)
.expect("Failed to write RED RAM buffer");
}
self.interface
.update_display_option2(update_mode as u8)
.unwrap();
self.interface
.refresh_display()
.expect("Failed to refresh the display");
Ok(())
}
pub fn rows(&self) -> u16 {
self.config.dimensions.rows
}
pub fn cols(&self) -> u16 {
self.config.dimensions.cols
}
pub fn rotation(&self) -> Rotation {
self.config.rotation
}
}