use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum BacklightMode {
None,
Automatic,
TemporaryManual,
PermanentManual,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum BacklightStatus {
DisabledBySoftware,
DisabledByCriticalBattery,
AlsAutomatic,
AlsSaturated,
TemporaryManual,
PermanentManual,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct BacklightState {
pub enabled: bool,
pub mode: BacklightMode,
pub status: BacklightStatus,
pub current_level: u8,
pub nb_levels: u8,
}
impl BacklightState {
#[must_use]
pub fn is_dark(self) -> bool {
!self.enabled
|| self.current_level == 0
|| matches!(
self.status,
BacklightStatus::DisabledBySoftware
| BacklightStatus::DisabledByCriticalBattery
| BacklightStatus::AlsSaturated
)
}
}
#[cfg(test)]
mod tests {
use super::*;
fn lit() -> BacklightState {
BacklightState {
enabled: true,
mode: BacklightMode::Automatic,
status: BacklightStatus::AlsAutomatic,
current_level: 4,
nb_levels: 8,
}
}
#[test]
fn a_lit_backlight_is_not_dark() {
assert!(!lit().is_dark());
}
#[test]
fn software_disable_reads_as_dark() {
let state = BacklightState {
enabled: false,
status: BacklightStatus::DisabledBySoftware,
..lit()
};
assert!(state.is_dark());
}
#[test]
fn a_zero_level_reads_as_dark_even_while_enabled() {
let state = BacklightState {
current_level: 0,
..lit()
};
assert!(state.is_dark());
}
#[test]
fn a_saturated_ambient_sensor_reads_as_dark() {
let state = BacklightState {
status: BacklightStatus::AlsSaturated,
..lit()
};
assert!(state.is_dark());
}
}