use core::fmt;
use super::HardwareDoorbellParty;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[serde(deny_unknown_fields)]
pub struct HardwareDoorbellPeripheral {
pub name: String,
pub page: u32,
pub r#type: HardwareDoorbellPeripheralType,
pub length: u32,
pub parties: Vec<HardwareDoorbellParty>,
pub party_page: u32,
pub channels: u32,
pub channel_page: u32,
#[serde(default)]
pub clock: Option<DoorbellClock>,
#[serde(default)]
pub window_length: Option<u32>,
}
impl HardwareDoorbellPeripheral {
pub fn party_window_length(&self) -> u32 {
self.window_length.unwrap_or(self.length)
}
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct DoorbellClock {
pub provider: String,
pub id: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum HardwareDoorbellPeripheralType {
Mu,
Hsem,
Ipcc,
}
impl fmt::Display for HardwareDoorbellPeripheralType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
HardwareDoorbellPeripheralType::Mu => write!(f, "Mu"),
HardwareDoorbellPeripheralType::Hsem => write!(f, "Hsem"),
HardwareDoorbellPeripheralType::Ipcc => write!(f, "Ipcc"),
}
}
}