use core::time::Duration;
use kinavis_kernel::event::{Event, RejectionReason, TargetId};
use kinavis_kernel::time::{Instant, Utc};
use kinavis_kernel::units::Distance;
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TrafficEvent {
TargetAcquired {
target: TargetId,
at: Instant<Utc>,
},
TargetLost {
target: TargetId,
last_seen: Instant<Utc>,
},
TargetEvicted {
target: TargetId,
last_seen: Instant<Utc>,
for_target: TargetId,
},
ObservationRejected {
target: TargetId,
reason: RejectionReason,
at: Instant<Utc>,
},
CpaAlarm {
target: TargetId,
cpa: Distance,
tcpa: Duration,
at: Instant<Utc>,
},
}
impl TrafficEvent {
#[must_use]
pub const fn target(&self) -> TargetId {
match self {
Self::TargetAcquired { target, .. }
| Self::TargetLost { target, .. }
| Self::TargetEvicted { target, .. }
| Self::ObservationRejected { target, .. }
| Self::CpaAlarm { target, .. } => *target,
}
}
}
impl Event for TrafficEvent {
const PLACEHOLDER: Self = Self::TargetAcquired {
target: TargetId::new(0),
at: Instant::UNIX_EPOCH,
};
fn at(&self) -> Instant<Utc> {
match self {
Self::TargetAcquired { at, .. }
| Self::ObservationRejected { at, .. }
| Self::CpaAlarm { at, .. } => *at,
Self::TargetLost { last_seen, .. } | Self::TargetEvicted { last_seen, .. } => {
*last_seen
}
}
}
}