use crate::display::DisplayVariant;
use display_interface::{AsyncWriteOnlyDataCommand, DisplayError};
use crate::command::{Command, VcomhLevel};
#[derive(Debug, Clone, Copy)]
pub struct Ssd1309_128_64 {}
impl DisplayVariant for Ssd1309_128_64 {
const WIDTH: u8 = 128;
const HEIGHT: u8 = 64;
async fn init_column_mode<DI>(
iface: &mut DI,
) -> Result<(), DisplayError>
where
DI: AsyncWriteOnlyDataCommand,
{
init_column_mode_common(iface, Self::dimensions()).await?;
Command::DisplayOffset(0).send(iface).await?;
Command::ComPinConfig(true).send(iface).await?;
Ok(())
}
}
pub async fn init_column_mode_common<DI>(
iface: &mut DI,
dimensions: (u8, u8),
) -> Result<(), DisplayError>
where
DI: AsyncWriteOnlyDataCommand,
{
let (_, display_height) = dimensions;
Command::DisplayOn(false).send(iface).await?;
Command::DisplayClockDiv(0x8, 0x0).send(iface).await?;
Command::Multiplex(display_height - 1).send(iface).await?;
Command::StartLine(0).send(iface).await?;
Command::ChargePump(true).send(iface).await?;
Command::Contrast(0x80).send(iface).await?;
Command::PreChargePeriod(0x1, 0xF).send(iface).await?;
Command::VcomhDeselect(VcomhLevel::Auto).send(iface).await?;
Command::AllOn(false).send(iface).await?;
Command::Invert(false).send(iface).await?;
Command::DisplayOn(true).send(iface).await?;
Ok(())
}