use display_interface::{DataFormat, DisplayError, WriteOnlyDataCommand};
#[derive(Debug)]
#[allow(dead_code)]
pub enum Command {
Unlock,
SetColumnAddress(u8, u8),
SetRowAddress(u8, u8),
SetDisplayClock(u8),
SetMuxRatio(u8),
SetDisplayOffset(u8),
SetStartLine(u8),
SetRemapFormat(u8, u8),
SetGPIO(u8),
SetFunctionSelection(u8),
SetDisplayEnhancementA(u8, u8),
SetContrastCurrent(u8),
SetMasterCurrent(u8),
SetLinearGrayScaleTable,
SetPhaseLength(u8),
SetDisplayEnhancementB(u8, u8),
SetPrechargeVoltage(u8),
SetPrechargePeriod(u8),
SetVCOMH(u8),
NormalDisplayMode,
AllPixelsOn,
AllPixelsOff,
ExitPartialDisplay,
WriteRAM,
DisplayOn,
DisplayOff,
}
impl Command {
pub fn send<DI>(self, iface: &mut DI) -> Result<(), DisplayError>
where
DI: WriteOnlyDataCommand,
{
let mut handle_command = |data: &[u8]| {
let _ = iface.send_commands(DataFormat::U8(&data[0..1]));
if data.len() > 1 {
let _ = iface.send_data(DataFormat::U8(&data[1..data.len()]));
}
};
match self {
Command::Unlock => handle_command(&[0xFD, 0x12]),
Command::SetColumnAddress(a, b) => handle_command(&[0x15, a, b]),
Command::SetRowAddress(a, b) => handle_command(&[0x75, a, b]),
Command::SetDisplayClock(a) => handle_command(&[0xB3, a]),
Command::SetMuxRatio(a) => handle_command(&[0xCA, a]),
Command::SetDisplayOffset(a) => handle_command(&[0xA2, a]),
Command::SetStartLine(a) => handle_command(&[0xA1, a]),
Command::SetRemapFormat(a, b) => handle_command(&[0xA0, a, b]),
Command::SetGPIO(a) => handle_command(&[0xB5, a]),
Command::SetFunctionSelection(a) => handle_command(&[0xAB, a]),
Command::SetDisplayEnhancementA(a, b) => handle_command(&[0xB4, a, b]),
Command::SetContrastCurrent(a) => handle_command(&[0xC1, a]),
Command::SetMasterCurrent(a) => handle_command(&[0xC7, a]),
Command::SetLinearGrayScaleTable => handle_command(&[0xB9]),
Command::SetPhaseLength(a) => handle_command(&[0xB1, a]),
Command::SetDisplayEnhancementB(a, b) => handle_command(&[0xD1, a, b]),
Command::SetPrechargeVoltage(a) => handle_command(&[0xBB, a]),
Command::SetPrechargePeriod(a) => handle_command(&[0xB6, a]),
Command::SetVCOMH(a) => handle_command(&[0xBE, a]),
Command::NormalDisplayMode => handle_command(&[0xA6]),
Command::AllPixelsOff => handle_command(&[0xA4]),
Command::AllPixelsOn => handle_command(&[0xA5]),
Command::ExitPartialDisplay => handle_command(&[0xA9]),
Command::WriteRAM => handle_command(&[0x5C]),
Command::DisplayOn => handle_command(&[0xAF]),
Command::DisplayOff => handle_command(&[0xAE]),
};
Ok(())
}
}