use std::{collections::HashMap, fmt};
pub use super::point_value::PointValue;
#[derive(Debug)]
pub struct RtuInitialMaps {
pub points: HashMap<PointAddress, PointValue>,
pub interrogation_groups: HashMap<PointAddress, u8>,
pub counter_groups: HashMap<PointAddress, u8>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct RtuInitialPoint {
pub address: PointAddress,
pub value: PointValue,
pub interrogation_group: Option<u8>,
pub counter_group: Option<u8>,
}
impl RtuInitialPoint {
#[must_use]
pub const fn new(address: PointAddress, value: PointValue) -> Self {
Self { address, value, interrogation_group: None, counter_group: None }
}
#[must_use]
pub fn with_interrogation_group(
address: PointAddress,
value: PointValue,
interrogation_group: u8,
) -> Option<Self> {
(1..=16).contains(&interrogation_group).then_some(Self {
address,
value,
interrogation_group: Some(interrogation_group),
counter_group: None,
})
}
#[must_use]
pub fn with_counter_interrogation_group(
address: PointAddress,
value: PointValue,
counter_group: u8,
) -> Option<Self> {
if !(1..=4).contains(&counter_group) || !value.is_counter_integration() {
return None;
}
Some(Self { address, value, interrogation_group: None, counter_group: Some(counter_group) })
}
}
impl From<(PointAddress, PointValue)> for RtuInitialPoint {
fn from((address, value): (PointAddress, PointValue)) -> Self {
Self { address, value, interrogation_group: None, counter_group: None }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct PointAddress {
pub common_address: u16,
pub information_object_address: u32,
}
impl PointAddress {
#[must_use]
pub const fn new(common_address: u16, information_object_address: u32) -> Self {
Self { common_address, information_object_address }
}
}
impl fmt::Display for PointAddress {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "CA {} IOA {}", self.common_address, self.information_object_address)
}
}