1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
//! A generic display interface
//!
//! This crate contains an error type and traits to implement for bus interface drivers drivers to
//! be consumed by display drivers. It abstracts over the different communication methods available
//! to drive a display and allows a driver writer to focus on driving the display itself and only
//! have to implement a single interface.
#![no_std]
#![allow(async_fn_in_trait)]
pub mod prelude;
/// A ubiquitous error type for all kinds of problems which could happen when communicating with a
/// display
#[derive(Clone, Debug)]
#[cfg_attr(feature = "defmt-03", derive(defmt::Format))]
#[non_exhaustive]
pub enum DisplayError {
/// Invalid data format selected for interface selected
InvalidFormatError,
/// Unable to write to bus
BusWriteError,
/// Unable to assert or de-assert data/command switching signal
DCError,
/// Unable to assert chip select signal
CSError,
/// The requested DataFormat is not implemented by this display interface implementation
DataFormatNotImplemented,
/// Unable to assert or de-assert reset signal
RSError,
/// Attempted to write to a non-existing pixel outside the display's bounds
OutOfBoundsError,
}
/// DI specific data format wrapper around slices of various widths
/// Display drivers need to implement non-trivial conversions (e.g. with padding)
/// as the hardware requires.
#[non_exhaustive]
pub enum DataFormat<'a> {
/// Slice of unsigned bytes
U8(&'a [u8]),
/// Slice of unsigned 16bit values with the same endianness as the system, not recommended
U16(&'a [u16]),
/// Slice of unsigned 16bit values to be sent in big endian byte order
U16BE(&'a mut [u16]),
/// Slice of unsigned 16bit values to be sent in little endian byte order
U16LE(&'a mut [u16]),
/// Iterator over unsigned bytes
U8Iter(&'a mut dyn Iterator<Item = u8>),
/// Iterator over unsigned 16bit values to be sent in big endian byte order
U16BEIter(&'a mut dyn Iterator<Item = u16>),
/// Iterator over unsigned 16bit values to be sent in little endian byte order
U16LEIter(&'a mut dyn Iterator<Item = u16>),
}
/// This trait implements a write-only interface for a display which has separate data and command
/// modes. It is the responsibility of implementations to activate the correct mode in their
/// implementation when corresponding method is called.
pub trait WriteOnlyDataCommand {
/// Send a batch of commands to display
fn send_commands(&mut self, cmd: DataFormat<'_>) -> Result<(), DisplayError>;
/// Send pixel data to display
fn send_data(&mut self, buf: DataFormat<'_>) -> Result<(), DisplayError>;
}
/// This trait implements a write-only interface for a display which has separate data and command
/// modes. It is the responsibility of implementations to activate the correct mode in their
/// implementation when corresponding method is called.
pub trait AsyncWriteOnlyDataCommand {
/// Send a batch of commands to display
async fn send_commands(&mut self, cmd: DataFormat<'_>) -> Result<(), DisplayError>;
/// Send pixel data to display
async fn send_data(&mut self, buf: DataFormat<'_>) -> Result<(), DisplayError>;
}