#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
#[non_exhaustive]
pub struct SolarStatus {
pub battery_level: u8,
pub light_level: u16,
}
impl SolarStatus {
fn from_payload(payload: &[u8; 16]) -> Self {
Self {
battery_level: payload[0],
light_level: u16::from_be_bytes([payload[1], payload[2]]),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
#[non_exhaustive]
pub enum SolarEvent {
Battery(SolarStatus),
LightMeasure(SolarStatus),
CheckLightButton(SolarStatus),
}
pub(super) fn decode_event(sub_id: u8, payload: &[u8; 16]) -> Option<SolarEvent> {
let status = SolarStatus::from_payload(payload);
match sub_id {
0 => Some(SolarEvent::Battery(status)),
1 => Some(SolarEvent::LightMeasure(status)),
2 => Some(SolarEvent::CheckLightButton(status)),
_ => None,
}
}