use bitfield::bitfield;
pub mod frame;
pub mod row;
pub use frame::DmaFrameBuffer;
pub(crate) use crate::{INTER_ROW_BLANK, LEAD_BLANK_DELAY, TRAIL_BLANK_DELAY};
#[cfg(feature = "invert-oe")]
pub(crate) const OE_ACTIVE: u16 = 0b1_0000_0000;
#[cfg(feature = "invert-oe")]
pub(crate) const OE_BLANK: u16 = 0;
#[cfg(not(feature = "invert-oe"))]
pub(crate) const OE_ACTIVE: u16 = 0;
#[cfg(not(feature = "invert-oe"))]
pub(crate) const OE_BLANK: u16 = 0b1_0000_0000;
#[inline]
pub(crate) const fn map_index(i: usize) -> usize {
#[cfg(feature = "esp32-ordering")]
{
i ^ 1
}
#[cfg(not(feature = "esp32-ordering"))]
{
i
}
}
#[allow(clippy::absurd_extreme_comparisons)]
#[inline]
pub(crate) const fn make_data_template<const COLS: usize>(addr: u8) -> [Entry; COLS] {
let mut data = [Entry::new(); COLS];
let mut i = 0;
while i < COLS {
let mut entry = Entry::new();
entry.0 = addr as u16 | OE_BLANK;
if i == COLS - 1 {
entry.0 |= 0b0010_0000; } else if i >= TRAIL_BLANK_DELAY && i < COLS.saturating_sub(LEAD_BLANK_DELAY + 1) {
entry.0 = (entry.0 & !0b1_0000_0000) | OE_ACTIVE;
}
data[map_index(i)] = entry;
i += 1;
}
data
}
bitfield! {
#[derive(Clone, Copy, Default, PartialEq)]
#[repr(transparent)]
pub(crate) struct Entry(u16);
pub(crate) dummy2, set_dummy2: 15;
pub(crate) blu2, set_blu2: 14;
pub(crate) grn2, set_grn2: 13;
pub(crate) red2, set_red2: 12;
pub(crate) blu1, set_blu1: 11;
pub(crate) grn1, set_grn1: 10;
pub(crate) red1, set_red1: 9;
pub(crate) output_enable, set_output_enable: 8;
pub(crate) dummy1, set_dummy1: 7;
pub(crate) dummy0, set_dummy0: 6;
pub(crate) latch, set_latch: 5;
pub(crate) addr, set_addr: 4, 0;
}
impl core::fmt::Debug for Entry {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_tuple("Entry")
.field(&format_args!("{:#x}", self.0))
.finish()
}
}
impl Entry {
pub(crate) const fn new() -> Self {
Self(OE_BLANK)
}
pub(crate) const fn from_raw(val: u16) -> Self {
Self(val)
}
#[allow(dead_code)]
pub(crate) const fn raw(self) -> u16 {
self.0
}
pub(crate) fn mask_raw(&mut self, mask: u16) {
self.0 &= mask;
}
const COLOR0_MASK: u16 = 0b0000_1110_0000_0000; const COLOR1_MASK: u16 = 0b0111_0000_0000_0000;
#[inline]
pub(crate) fn set_color0_bits(&mut self, bits: u8) {
let bits16 = u16::from(bits) << 9;
self.0 = (self.0 & !Self::COLOR0_MASK) | (bits16 & Self::COLOR0_MASK);
}
#[inline]
pub(crate) fn set_color1_bits(&mut self, bits: u8) {
let bits16 = u16::from(bits) << 12;
self.0 = (self.0 & !Self::COLOR1_MASK) | (bits16 & Self::COLOR1_MASK);
}
}