From a14fabb53c733e89077c29ab5fb6fced676145bd Mon Sep 17 00:00:00 2001 From: Astro Date: Fri, 28 Jan 2022 21:33:01 +0100 Subject: [PATCH] http-json: add fields squawk, seen, seen_pos --- beast/src/aircrafts.rs | 10 +++++++++- http-json/src/main.rs | 9 +++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/beast/src/aircrafts.rs b/beast/src/aircrafts.rs index 85bcd8d..80256fd 100644 --- a/beast/src/aircrafts.rs +++ b/beast/src/aircrafts.rs @@ -21,12 +21,17 @@ pub struct Entry { pub speed: Option, pub vertical_rate: Option, last_update: Option, + pub squawk: Option, + pub seen: Option, // Option wrapper is just for derive Default + pub seen_pos: Option, } impl Entry { const MAX_AGE: u64 = 300; fn update(&mut self, kind: adsb_deku::adsb::ME) { + self.seen = Some(Instant::now()); + match kind { adsb_deku::adsb::ME::AirbornePositionBaroAltitude(altitude) | adsb_deku::adsb::ME::AirbornePositionGNSSAltitude(altitude) => { @@ -53,6 +58,7 @@ impl Entry { } // add position to jitter buffer self.positions[self.positions.len() - 1] = Some(pos); + self.seen_pos = Some(Instant::now()); } } } @@ -70,8 +76,10 @@ impl Entry { self.category = Some((ident.tc, ident.ca)); self.callsign = Some(ident.cn); } + adsb_deku::adsb::ME::AircraftStatus(status) => { + self.squawk = Some(status.squawk); + } adsb_deku::adsb::ME::TargetStateAndStatusInformation(_) => {} - adsb_deku::adsb::ME::AircraftStatus(_) => {} adsb_deku::adsb::ME::AircraftOperationStatus(_) => {} msg => { eprintln!("unhandled adsb msg: {:?}", msg); diff --git a/http-json/src/main.rs b/http-json/src/main.rs index 46f4aef..1648c9b 100644 --- a/http-json/src/main.rs +++ b/http-json/src/main.rs @@ -1,3 +1,4 @@ +use std::time::Instant; use warp::{http::Response, Filter}; use adsb_deku::ICAO; use beast::aircrafts::Entry; @@ -6,6 +7,7 @@ use serde::Serialize; #[derive(Serialize)] pub struct Aircraft { hex: String, + squawk: Option, flight: Option, category: Option, lat: Option, @@ -15,12 +17,17 @@ pub struct Aircraft { track: Option, /// kts speed: Option, + seen: Option, + seen_pos: Option, } impl Aircraft { pub fn new(icao_address: &ICAO, entry: &Entry) -> Self { + let now = Instant::now(); + Aircraft { hex: format!("{}", icao_address), + squawk: entry.squawk.clone(), flight: entry.callsign.clone(), category: entry.category.map(|category| category.1), lat: entry.position().map(|pos| pos.latitude), @@ -28,6 +35,8 @@ impl Aircraft { altitude: entry.altitude.clone(), track: entry.heading.map(|heading| heading as i16), speed: entry.speed.map(|speed| speed as u16), + seen: entry.seen.map(|seen| (now - seen).as_secs_f32()), + seen_pos: entry.seen_pos.map(|seen_pos| (now - seen_pos).as_secs_f32()), } } }