use serde::{Deserialize, Serialize};
use crate::mstp::{MstpArgs, DEFAULT_BAUD, MAX_MASTER_MAC};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub(crate) struct Mstp {
pub(crate) port: String,
pub(crate) mac: u8,
#[serde(default = "default_baud")]
pub(crate) baud: u32,
#[serde(default = "default_max_master")]
pub(crate) max_master: u8,
#[serde(default = "default_max_info_frames")]
pub(crate) max_info_frames: u8,
#[serde(default = "default_timeout_ms")]
pub(crate) timeout_ms: u64,
#[serde(default)]
pub(crate) min_interval_ms: u64,
}
fn default_baud() -> u32 {
DEFAULT_BAUD
}
fn default_max_master() -> u8 {
MAX_MASTER_MAC
}
fn default_max_info_frames() -> u8 {
1
}
fn default_timeout_ms() -> u64 {
6000
}
impl Default for Mstp {
fn default() -> Self {
Self {
port: String::new(),
mac: 0,
baud: default_baud(),
max_master: default_max_master(),
max_info_frames: default_max_info_frames(),
timeout_ms: default_timeout_ms(),
min_interval_ms: 0,
}
}
}
impl Mstp {
pub(crate) fn args(&self) -> MstpArgs {
MstpArgs {
port: self.port.clone(),
baud: self.baud,
mac: self.mac,
max_master: self.max_master,
max_info_frames: self.max_info_frames,
}
}
pub(crate) fn validate(&self) -> Result<(), String> {
self.args().validate()?;
if self.min_interval_ms > bacnet_client::client::MAX_MIN_REQUEST_INTERVAL_MS {
return Err("min_interval_ms must be at most 3600000".into());
}
Ok(())
}
}