use display_interface::{DataFormat::U8, DisplayError, WriteOnlyDataCommand};
pub enum Command {
DisplayOff,
DisplayOn,
ColumnAddress {
start: u8,
end: u8,
},
RowAddress {
start: u8,
end: u8,
},
Contrast(u8),
SetRemap(u8),
StartLine(u8),
Offset(u8),
DisplayModeNormal,
MuxRatio(u8),
PhaseLength(u8),
FrontClockDivider(u8),
FunctionSelectionA(u8),
SecondPreChargePeriod(u8),
ComVoltageLevel(u8),
PreChargeVoltage(u8),
FunctionSelectionB(u8),
CommandLock(u8),
}
impl Command {
pub(crate) fn send<DI>(self, display: &mut DI) -> Result<(), DisplayError>
where
DI: WriteOnlyDataCommand,
{
let (data, len) = match self {
Self::DisplayOn => ([0xAF, 0, 0], 1),
Self::DisplayOff => ([0xAE, 0, 0], 1),
Self::ColumnAddress { start, end } => ([0x15, start, end], 3),
Self::RowAddress { start, end } => ([0x75, start, end], 3),
Self::Contrast(value) => ([0x81, value, 0], 2),
Self::SetRemap(value) => ([0xA0, value, 0], 2),
Self::StartLine(value) => ([0xA1, value, 0], 2),
Self::Offset(value) => ([0xA2, value, 0], 2),
Self::DisplayModeNormal => ([0xA4, 0, 0], 1),
Self::MuxRatio(value) => ([0xA8, value, 0], 2),
Self::PhaseLength(value) => ([0xB1, value, 0], 2),
Self::FrontClockDivider(value) => ([0xB3, value, 0], 2),
Self::FunctionSelectionA(value) => ([0xAB, value, 0], 2),
Self::SecondPreChargePeriod(value) => ([0xB6, value, 0], 2),
Self::ComVoltageLevel(value) => ([0xBE, value, 0], 2),
Self::PreChargeVoltage(value) => ([0xBC, value, 0], 2),
Self::FunctionSelectionB(value) => ([0xD5, value, 0], 2),
Self::CommandLock(value) => ([0xFD, value, 0], 2),
};
display.send_commands(U8(&data[0..len]))
}
}