use embedded_graphics_core::pixelcolor::Rgb565;
use embedded_graphics_framebuf::{FrameBuf, backends::DMACapableFrameBufferBackend};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DisplayError {
Busy,
HardwareError,
InvalidBuffer,
}
pub trait DisplayBackend<const W: usize, const H: usize, FB>
where
FB: DMACapableFrameBufferBackend<Color = Rgb565>,
{
fn start_dma_transfer(
&mut self,
framebuffer: &FrameBuf<Rgb565, FB>,
) -> Result<(), DisplayError>;
fn wait_for_dma(&mut self);
fn is_dma_ready(&self) -> bool;
fn present(&mut self, framebuffer: &FrameBuf<Rgb565, FB>) -> Result<(), DisplayError> {
self.wait_for_dma();
self.start_dma_transfer(framebuffer)
}
}
pub struct SimulatorBackend {
}
impl SimulatorBackend {
pub fn new() -> Self {
Self {}
}
}
impl Default for SimulatorBackend {
fn default() -> Self {
Self::new()
}
}
impl<const W: usize, const H: usize, FB> DisplayBackend<W, H, FB> for SimulatorBackend
where
FB: DMACapableFrameBufferBackend<Color = Rgb565>,
{
fn start_dma_transfer(
&mut self,
_framebuffer: &FrameBuf<Rgb565, FB>,
) -> Result<(), DisplayError> {
Ok(())
}
fn wait_for_dma(&mut self) {
}
fn is_dma_ready(&self) -> bool {
true
}
}
#[cfg(test)]
mod tests {
extern crate std;
use super::*;
use embedded_graphics_framebuf::backends::EndianCorrectedBuffer;
type TestBackend = EndianCorrectedBuffer<'static, Rgb565>;
#[test]
fn test_simulator_backend_creation() {
let backend = SimulatorBackend::new();
assert!(<SimulatorBackend as DisplayBackend<
320,
240,
TestBackend,
>>::is_dma_ready(&backend));
}
#[test]
fn test_simulator_backend_always_ready() {
let mut backend = SimulatorBackend::new();
assert!(<SimulatorBackend as DisplayBackend<
320,
240,
TestBackend,
>>::is_dma_ready(&backend));
<SimulatorBackend as DisplayBackend<320, 240, TestBackend>>::wait_for_dma(&mut backend);
assert!(<SimulatorBackend as DisplayBackend<
320,
240,
TestBackend,
>>::is_dma_ready(&backend));
}
}