use crate::framebuffer::DmaReadyFramebuffer;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DisplayError {
Busy,
HardwareError,
InvalidBuffer,
}
pub trait DisplayBackend<const W: usize, const H: usize> {
fn start_dma_transfer(
&mut self,
framebuffer: &DmaReadyFramebuffer<W, H>,
) -> Result<(), DisplayError>;
fn wait_for_dma(&mut self);
fn is_dma_ready(&self) -> bool;
fn present(&mut self, framebuffer: &DmaReadyFramebuffer<W, H>) -> 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> DisplayBackend<W, H> for SimulatorBackend {
fn start_dma_transfer(
&mut self,
_framebuffer: &DmaReadyFramebuffer<W, H>,
) -> 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::*;
#[test]
fn test_simulator_backend_creation() {
let backend = SimulatorBackend::new();
assert!(<SimulatorBackend as DisplayBackend<320, 240>>::is_dma_ready(&backend));
}
#[test]
fn test_simulator_backend_always_ready() {
let mut backend = SimulatorBackend::new();
assert!(<SimulatorBackend as DisplayBackend<320, 240>>::is_dma_ready(&backend));
<SimulatorBackend as DisplayBackend<320, 240>>::wait_for_dma(&mut backend);
assert!(<SimulatorBackend as DisplayBackend<320, 240>>::is_dma_ready(&backend));
}
#[test]
fn test_simulator_backend_transfers() {
let mut backend = SimulatorBackend::new();
let mut fb_data = [0u16; 320 * 240];
let framebuffer: DmaReadyFramebuffer<320, 240> =
DmaReadyFramebuffer::new(fb_data.as_mut_ptr() as *mut core::ffi::c_void, false);
assert!(
<SimulatorBackend as DisplayBackend<320, 240>>::start_dma_transfer(
&mut backend,
&framebuffer
)
.is_ok()
);
assert!(<SimulatorBackend as DisplayBackend<320, 240>>::is_dma_ready(&backend));
assert!(
<SimulatorBackend as DisplayBackend<320, 240>>::present(&mut backend, &framebuffer)
.is_ok()
);
}
}