use std::collections::{BTreeMap, BTreeSet, VecDeque};
use std::time::Duration;
use bacnet_transport::mstp::monitor::{LostToken, MonitorStats, DEFAULT_TIMESTAMP_RESOLUTION};
pub(crate) mod analysis;
pub(crate) mod lines;
pub(crate) mod worker;
pub(crate) use lines::Lines;
pub(crate) const SAMPLE_EVERY: Duration = Duration::from_secs(1);
pub(crate) const ROTATION_HISTORY: usize = 60;
pub(crate) const LOST_TOKEN_HISTORY: usize = 16;
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct MonitorPlan {
pub(crate) port: String,
pub(crate) baud: u32,
pub(crate) max_info_frames: u8,
pub(crate) resolution: Duration,
}
impl MonitorPlan {
pub(crate) fn new(port: String, baud: u32, max_info_frames: u8) -> Self {
Self {
port,
baud,
max_info_frames,
resolution: DEFAULT_TIMESTAMP_RESOLUTION,
}
}
}
pub(crate) fn plan_from(cli: &crate::args::Cli) -> Option<MonitorPlan> {
match &cli.command {
Some(crate::args::Command::Tui {
mstp_monitor: Some(port),
..
}) => Some(MonitorPlan::new(
port.clone(),
cli.mstp_baud,
cli.mstp_max_info_frames,
)),
_ => None,
}
}
#[derive(Debug, Clone, Default)]
pub(crate) struct MstpOptions {
pub(crate) monitor: Option<MonitorPlan>,
pub(crate) lines: Lines,
pub(crate) thread: bacnet_transport::mstp::MstpThreadConfig,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct MonitorSample {
pub(crate) elapsed: Duration,
pub(crate) stats: MonitorStats,
pub(crate) devices: BTreeMap<u8, u32>,
pub(crate) routers: BTreeSet<u8>,
pub(crate) rotations: VecDeque<Duration>,
pub(crate) lost: VecDeque<LostToken>,
pub(crate) dropped: u64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) enum MonitorReport {
Started {
port: String,
baud: u32,
},
Sample(Box<MonitorSample>),
Ended(String),
}