diff --git a/beast/src/aircrafts.rs b/beast/src/aircrafts.rs index 0264af4..136f96d 100644 --- a/beast/src/aircrafts.rs +++ b/beast/src/aircrafts.rs @@ -13,6 +13,7 @@ pub struct Entry { pub altitude: Option, cpr1: Option, cpr2: Option, + positions: [Option; 3], pub heading: Option, pub ground_speed: Option, pub vertical_rate: Option, @@ -33,6 +34,26 @@ impl Entry { self.cpr1 = self.cpr2.take(); } self.cpr2 = Some(cpr_frame); + + match (&self.cpr1, &self.cpr2) { + (Some(cpr1), Some(cpr2)) => { + match adsb::cpr::get_position((cpr1, cpr2)) { + Some(pos) if + pos.latitude >= -90.0 && + pos.latitude <= 90.0 && + pos.longitude >= -180.0 && + pos.longitude <= 180.0 => + { + for i in 1..self.positions.len() { + self.positions[i - 1] = self.positions[i].take(); + } + self.positions[self.positions.len() - 1] = Some(pos); + } + _ => {} + } + } + _ => {} + } } adsb::ADSBMessageKind::AirborneVelocity { heading, ground_speed, @@ -54,21 +75,25 @@ impl Entry { self.last_update = Some(Instant::now()); } - pub fn position(&self) -> Option { - match (&self.cpr1, &self.cpr2) { - (Some(cpr1), Some(cpr2)) => { - 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 - { - Some(pos) - } else { - None - } + pub fn position(&self) -> Option<&adsb::Position> { + let mut prev_lat = self.positions[0].as_ref()?.latitude; + let mut prev_lon = self.positions[0].as_ref()?.longitude; + for i in 1..self.positions.len() - 1 { + let lat = self.positions[i].as_ref()?.latitude; + let lon = self.positions[i].as_ref()?.longitude; + if lat < prev_lat - 1.0 || + lat > prev_lat + 1.0 || + lon < prev_lon - 1.0 || + lon > prev_lon + 1.0 + { + // erroneous jitter detected + return None; } - _ => - None + prev_lat = lat; + prev_lon = lon; } + + self.positions[self.positions.len() - 1].as_ref() } pub fn flight(&self) -> Option<&str> {