use core::time::Duration;
use kinavis_kernel::event::NavigationIntegrity;
use crate::{AlertKind, AlertPriority};
pub trait AlertPolicy {
fn classify(&self, condition: &AlertKind) -> Option<AlertPriority>;
fn rectify_after(&self) -> Duration;
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct StandardPolicy {
pub rectify_after: Duration,
}
impl Default for StandardPolicy {
fn default() -> Self {
Self {
rectify_after: Duration::from_secs(30),
}
}
}
impl AlertPolicy for StandardPolicy {
fn classify(&self, condition: &AlertKind) -> Option<AlertPriority> {
match condition {
AlertKind::Cpa { .. }
| AlertKind::UnderKeelClearanceLow
| AlertKind::AnchorDragging => Some(AlertPriority::Alarm),
AlertKind::CrossTrackExceeded | AlertKind::FixLost { .. } => {
Some(AlertPriority::Warning)
}
AlertKind::IntegrityDegraded { to } => match to {
NavigationIntegrity::Exceeded => Some(AlertPriority::Warning),
NavigationIntegrity::DeadReckoning => Some(AlertPriority::Caution),
_ => None,
},
AlertKind::SensorSuspect { .. } | AlertKind::TargetLost { .. } => {
Some(AlertPriority::Caution)
}
_ => None,
}
}
fn rectify_after(&self) -> Duration {
self.rectify_after
}
}