use crate::ddc_types::{InputSource, MonitorCapabilities, PowerState};
use crate::error::DdcError;
pub struct DisplayDevice {
pub info: String,
pub inner: Box<dyn DdcControl>,
}
pub trait DdcControl: Send + Sync {
fn get_vcp_feature(&self, code: u8) -> Result<(u32, u32), DdcError>;
fn set_vcp_feature(&self, code: u8, value: u32) -> Result<(), DdcError>;
fn get_capabilities(&self) -> Result<MonitorCapabilities, DdcError> {
let (b_cur, b_max) = self.get_vcp_feature(0x10)?;
let (c_cur, c_max) = self.get_vcp_feature(0x12)?;
Ok(MonitorCapabilities {
brightness: b_cur,
brightness_max: b_max,
contrast: c_cur,
contrast_max: c_max,
})
}
fn set_power(&self, state: PowerState) -> Result<(), DdcError> {
self.set_vcp_feature(0xD6, state as u32)
}
fn set_input(&self, source: InputSource) -> Result<(), DdcError> {
self.set_vcp_feature(0x60, source as u32)
}
fn set_brightness(&self, value: u32) -> Result<(), DdcError> {
self.set_vcp_feature(0x10, value)
}
}