use crate::model::capabilities::DisplayCapabilities;
#[cfg(not(any(feature = "alloc", feature = "std")))]
use crate::model::capabilities::ModeSink;
use crate::model::diagnostics::EdidWarning;
#[cfg(any(feature = "alloc", feature = "std"))]
use crate::model::diagnostics::ParseWarning;
#[cfg(any(feature = "alloc", feature = "std"))]
use crate::model::extension::ExtensionHandler;
#[cfg(any(feature = "alloc", feature = "std"))]
use crate::model::prelude::{Arc, Vec};
mod descriptors;
mod header;
pub(crate) mod timings;
pub(crate) use header::{decode_color_bit_depth, decode_manufacture_date};
#[cfg(not(any(feature = "alloc", feature = "std")))]
pub(super) fn decode_base_modes(base: &[u8; 128], sink: &mut dyn ModeSink) {
timings::decode_established_timings(base, sink);
timings::decode_standard_timings(base, sink);
timings::decode_detailed_timings(base, sink);
descriptors::decode_descriptors_modes(base, sink);
}
#[cfg(not(any(feature = "alloc", feature = "std")))]
pub(super) fn decode_base_block(
base: &[u8; 128],
caps: &mut DisplayCapabilities,
warn: &mut dyn ModeSink,
) {
if !header::decode_header_fields(base, caps) {
warn.push_warning(EdidWarning::InvalidManufacturerId);
}
descriptors::decode_descriptors_meta(base, caps);
}
#[cfg(any(feature = "alloc", feature = "std"))]
#[derive(Debug)]
pub struct BaseBlockHandler;
#[cfg(any(feature = "alloc", feature = "std"))]
impl ExtensionHandler for BaseBlockHandler {
fn process(
&self,
blocks: &[&[u8; 128]],
caps: &mut DisplayCapabilities,
warnings: &mut Vec<ParseWarning>,
) {
let Some(base) = blocks.first() else { return };
if !header::decode_header_fields(base, caps) {
warnings.push(Arc::new(EdidWarning::InvalidManufacturerId));
}
descriptors::decode_descriptors_meta(base, caps);
descriptors::decode_descriptors_modes(base, caps);
timings::decode_established_timings(base, caps);
timings::decode_standard_timings(base, caps);
for i in 0..4u8 {
let offset = 0x36 + (i as usize * 18);
timings::decode_dtd_slot(&base[offset..offset + 18], caps, i);
}
}
}