beast: filter out erroneous jitter

This commit is contained in:
Astro 2021-11-10 18:59:59 +01:00
parent cbb36494bf
commit 03c9f8ac41
1 changed files with 38 additions and 13 deletions

View File

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