use crate::{ClassId, Direction, EventId, EvidenceRef, FrameStamp, SubjectId, TrackId, ZoneId};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum EventKind {
Zone,
Dwell,
Occupancy,
Identity,
Pattern,
Anomaly,
Custom,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum EventPayload {
Empty,
Entered {
zone_id: ZoneId,
class_id: Option<ClassId>,
},
Exited {
zone_id: ZoneId,
class_id: Option<ClassId>,
},
Crossed {
zone_id: ZoneId,
direction: Direction,
},
DwellStarted {
zone_id: ZoneId,
},
DwellEnded {
zone_id: ZoneId,
duration_ns: i64,
visit_count: u32,
},
Occupancy {
zone_id: ZoneId,
occupancy: u32,
},
Metrics {
score: f32,
aux: f32,
tag: u32,
},
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct EventEnvelope {
pub event_id: EventId,
pub stamp: FrameStamp,
pub kind: EventKind,
pub track_id: Option<TrackId>,
pub subject_id: Option<SubjectId>,
pub zone_id: Option<ZoneId>,
pub evidence: Option<EvidenceRef>,
pub payload: EventPayload,
}
impl EventEnvelope {
#[must_use]
pub fn new(event_id: EventId, stamp: FrameStamp, kind: EventKind) -> Self {
Self {
event_id,
stamp,
kind,
track_id: None,
subject_id: None,
zone_id: None,
evidence: None,
payload: EventPayload::Empty,
}
}
#[must_use]
pub fn with_track(mut self, track_id: TrackId) -> Self {
self.track_id = Some(track_id);
self
}
#[must_use]
pub fn with_subject(mut self, subject_id: SubjectId) -> Self {
self.subject_id = Some(subject_id);
self
}
#[must_use]
pub fn with_zone(mut self, zone_id: ZoneId) -> Self {
self.zone_id = Some(zone_id);
self
}
#[must_use]
pub fn with_evidence(mut self, evidence: EvidenceRef) -> Self {
self.evidence = Some(evidence);
self
}
#[must_use]
pub fn with_payload(mut self, payload: EventPayload) -> Self {
self.payload = payload;
self
}
}