beast: filter out erroneous jitter
This commit is contained in:
parent
cbb36494bf
commit
03c9f8ac41
|
@ -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> {
|
||||||
|
|
Loading…
Reference in New Issue