use crate::models::Model;
mod orientation;
pub(crate) use orientation::MemoryMapping;
pub use orientation::{InvalidAngleError, Orientation, Rotation};
#[derive(Clone)]
#[non_exhaustive]
pub struct ModelOptions {
pub color_order: ColorOrder,
pub orientation: Orientation,
pub invert_colors: ColorInversion,
pub refresh_order: RefreshOrder,
pub display_size: (u16, u16),
pub display_offset: (u16, u16),
}
impl ModelOptions {
pub fn full_size<M: Model>() -> Self {
Self {
color_order: ColorOrder::default(),
orientation: Orientation::default(),
invert_colors: ColorInversion::default(),
refresh_order: RefreshOrder::default(),
display_size: M::FRAMEBUFFER_SIZE,
display_offset: (0, 0),
}
}
pub fn with_all(display_size: (u16, u16), display_offset: (u16, u16)) -> Self {
Self {
color_order: ColorOrder::default(),
orientation: Orientation::default(),
invert_colors: ColorInversion::default(),
refresh_order: RefreshOrder::default(),
display_size,
display_offset,
}
}
#[allow(dead_code)]
pub(crate) fn display_size(&self) -> (u16, u16) {
if self.orientation.rotation.is_horizontal() {
self.display_size
} else {
(self.display_size.1, self.display_size.0)
}
}
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum ColorInversion {
#[default]
Normal,
Inverted,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum VerticalRefreshOrder {
#[default]
TopToBottom,
BottomToTop,
}
impl VerticalRefreshOrder {
#[must_use]
pub const fn flip(self) -> Self {
match self {
Self::TopToBottom => Self::BottomToTop,
Self::BottomToTop => Self::TopToBottom,
}
}
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum HorizontalRefreshOrder {
#[default]
LeftToRight,
RightToLeft,
}
impl HorizontalRefreshOrder {
#[must_use]
pub const fn flip(self) -> Self {
match self {
Self::LeftToRight => Self::RightToLeft,
Self::RightToLeft => Self::LeftToRight,
}
}
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct RefreshOrder {
pub vertical: VerticalRefreshOrder,
pub horizontal: HorizontalRefreshOrder,
}
impl RefreshOrder {
pub const fn new(vertical: VerticalRefreshOrder, horizontal: HorizontalRefreshOrder) -> Self {
Self {
vertical,
horizontal,
}
}
#[must_use]
pub const fn flip_vertical(self) -> Self {
Self {
vertical: self.vertical.flip(),
..self
}
}
#[must_use]
pub const fn flip_horizontal(self) -> Self {
Self {
horizontal: self.horizontal.flip(),
..self
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum TearingEffect {
Off,
Vertical,
HorizontalAndVertical,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum ColorOrder {
#[default]
Rgb,
Bgr,
}