diff --git a/beast/src/aircrafts.rs b/beast/src/aircrafts.rs index 0264af4..9cfd63c 100644 --- a/beast/src/aircrafts.rs +++ b/beast/src/aircrafts.rs @@ -6,13 +6,15 @@ use tokio::sync::mpsc::channel; use adsb::ICAOAddress; use super::beast; +const MAX_CPR_INTERVAL: u64 = 2; + #[derive(Default)] pub struct Entry { pub emitter_category: Option, pub callsign: Option, pub altitude: Option, - cpr1: Option, - cpr2: Option, + cpr1: Option<(Instant, adsb::CPRFrame)>, + cpr2: Option<(Instant, adsb::CPRFrame)>, pub heading: Option, pub ground_speed: Option, pub vertical_rate: Option, @@ -29,10 +31,10 @@ impl Entry { altitude, cpr_frame } => { self.altitude = Some(altitude); - if self.cpr2.as_ref().map(|cpr2| cpr2.parity != cpr_frame.parity).unwrap_or(false) { + if self.cpr2.as_ref().map(|(_, cpr2)| cpr2.parity != cpr_frame.parity).unwrap_or(false) { self.cpr1 = self.cpr2.take(); } - self.cpr2 = Some(cpr_frame); + self.cpr2 = Some((Instant::now(), cpr_frame)); } adsb::ADSBMessageKind::AirborneVelocity { heading, ground_speed, @@ -56,7 +58,9 @@ impl Entry { pub fn position(&self) -> Option { match (&self.cpr1, &self.cpr2) { - (Some(cpr1), Some(cpr2)) => { + (Some((time1, cpr1)), Some((time2, cpr2))) + if time2.duration_since(*time1) <= Duration::from_secs(MAX_CPR_INTERVAL) => + { let pos = adsb::cpr::get_position((cpr1, cpr2))?; if pos.latitude >= -90.0 && pos.latitude <= 90.0 && pos.longitude >= -180.0 && pos.longitude <= 180.0