From def134ea3b7195d96bdb2af8b34c731fe789745f Mon Sep 17 00:00:00 2001 From: Marat Fayzullin Date: Fri, 26 Apr 2024 23:44:03 -0400 Subject: [PATCH] Moving marine and aircraft modes to standard JSON fields, for reporting. --- htdocs/lib/MessagePanel.js | 6 ++-- owrx/aircraft.py | 64 ++++++++++++++++++-------------------- owrx/marine.py | 5 ++- 3 files changed, 38 insertions(+), 37 deletions(-) diff --git a/htdocs/lib/MessagePanel.js b/htdocs/lib/MessagePanel.js index 980eb8ae..a1d89f6c 100644 --- a/htdocs/lib/MessagePanel.js +++ b/htdocs/lib/MessagePanel.js @@ -378,8 +378,8 @@ HfdlMessagePanel.prototype.pushMessage = function(msg) { : ''; var tstamp = - msg.msgtime? '' + msg.msgtime + '' - : msg.time? msg.time + msg.msgtime? '' + msg.msgtime + '' + : msg.timestamp? Utils.HHMMSS(msg.timestamp) : ''; // Add location, altitude, speed, etc @@ -575,7 +575,7 @@ DscMessagePanel.prototype.pushMessage = function(msg) { // Format timestamp var timestamp = msg.time? '' + msg.time + '' - : msg.timestamp? Utils.HHMMSS(msg.timestamp * 1000) + : msg.timestamp? Utils.HHMMSS(msg.timestamp) : ''; // Format debugging data diff --git a/owrx/aircraft.py b/owrx/aircraft.py index e48a2a0f..3fafe5a1 100644 --- a/owrx/aircraft.py +++ b/owrx/aircraft.py @@ -94,11 +94,9 @@ class AircraftLocation(LatLngLocation): def __dict__(self): res = super(AircraftLocation, self).__dict__() - # JavaScript timestamps are in milliseconds - res["ttl"] = self.data["ttl"] * 1000 res["symbol"] = self.getSymbol() # Convert aircraft-specific data into APRS-like data - for x in ["icao", "aircraft", "flight", "speed", "altitude", "course", "destination", "origin", "vspeed", "squawk", "rssi", "msglog"]: + for x in ["icao", "aircraft", "flight", "speed", "altitude", "course", "destination", "origin", "vspeed", "squawk", "rssi", "msglog", "ttl"]: if x in self.data: res[x] = self.data[x] # Return APRS-like dictionary object @@ -174,11 +172,11 @@ class AircraftManager(object): return updated # Add time-to-live, if missing, assume HFDL longevity - if "ts" not in data: + if "timestamp" not in data: pm = Config.get() - ts = datetime.now().timestamp() - data["ts"] = ts - data["ttl"] = ts + pm["hfdl_ttl"] + ts = round(datetime.now().timestamp() * 1000) + data["timestamp"] = ts + data["ttl"] = ts + pm["hfdl_ttl"] * 1000 # Now operating on the database... with self.lock: @@ -201,7 +199,7 @@ class AircraftManager(object): # Use existing record item = self.aircraft[id] # If we have got newer data... - if data["ts"] > item["ts"]: + if data["timestamp"] > item["timestamp"]: # Get previous and current positions pos0 = (item["lat"], item["lon"]) if "lat" in item and "lon" in item else None pos1 = (data["lat"], data["lon"]) if "lat" in data and "lon" in data else None @@ -244,7 +242,7 @@ class AircraftManager(object): # Remove all database entries older than given time. def cleanup(self): - now = datetime.now().timestamp() + now = datetime.now().timestamp() * 1000 # Now operating on the database... with self.lock: too_old = [x for x in self.aircraft.keys() if self.aircraft[x]["ttl"] < now] @@ -280,7 +278,7 @@ class AircraftManager(object): item2 = self.aircraft[id2] if item1 is not item2: # Make sure ID1 is always newer than ID2 - if item1["ts"] < item2["ts"]: + if item1["timestamp"] < item2["timestamp"]: item1, item2 = item2, item1 id1, id2 = id2, id1 # Update older data with newer data @@ -324,6 +322,9 @@ class AircraftParser(TextParser): for key in ["aircraft", "origin", "destination"]: if key in out: out[key] = self.reDots.sub("\\1", out[key]) + # Add communications frequency, if known + if self.frequency != 0: + out["freq"] = self.frequency # Report message ReportingEngine.getSharedInstance().spot(out) # Update aircraft database with the new data @@ -345,7 +346,7 @@ class AircraftParser(TextParser): if len(aircraft)>0: out["aircraft"] = aircraft if len(message)>0: - out["message"] = [ message ] + out["message"] = message if len(flight)>0: out["flight"] = flight # Done @@ -363,16 +364,15 @@ class HfdlParser(AircraftParser): # Expect JSON data in text form data = json.loads(msg) pm = Config.get() - ts = data["hfdl"]["t"]["sec"] + data["hfdl"]["t"]["usec"] / 1000000 + ts = round(data["hfdl"]["t"]["sec"] * 1000 + data["hfdl"]["t"]["usec"] / 1000) # @@@ Only parse messages that have LDPU frames for now !!! if "lpdu" not in data["hfdl"]: return {} # Collect basic data first out = { - "mode" : "HFDL", - "time" : datetime.utcfromtimestamp(ts).strftime("%H:%M:%S"), - "ts" : ts, - "ttl" : ts + pm["hfdl_ttl"] + "mode" : "HFDL", + "timestamp" : ts, + "ttl" : ts + pm["hfdl_ttl"] * 1000 } # Parse LPDU if present if "lpdu" in data["hfdl"]: @@ -450,13 +450,12 @@ class Vdl2Parser(AircraftParser): # Expect JSON data in text form data = json.loads(msg) pm = Config.get() - ts = data["vdl2"]["t"]["sec"] + data["vdl2"]["t"]["usec"] / 1000000 + ts = round(data["vdl2"]["t"]["sec"] * 1000 + data["vdl2"]["t"]["usec"] / 1000) # Collect basic data first out = { - "mode" : "VDL2", - "time" : datetime.utcfromtimestamp(ts).strftime("%H:%M:%S"), - "ts" : ts, - "ttl" : ts + pm["vdl2_ttl"] + "mode" : "VDL2", + "timestamp" : ts, + "ttl" : ts + pm["vdl2_ttl"] * 1000 } # Parse AVLC if present if "avlc" in data["vdl2"]: @@ -584,12 +583,12 @@ class AdsbParser(AircraftParser): # Always present ADSB data out = { - "mode" : "ADSB", - "icao" : entry["hex"].upper(), - "ts" : ts, - "ttl" : ttl - entry["seen"], - "msgs" : entry["messages"], - "rssi" : entry["rssi"], + "mode" : "ADSB", + "icao" : entry["hex"].upper(), + "timestamp" : round(ts * 1000), + "ttl" : round((ttl - entry["seen"]) * 1000), + "msgs" : entry["messages"], + "rssi" : entry["rssi"], } # Position @@ -670,15 +669,14 @@ class AcarsParser(AircraftParser): # Expect JSON data in text form data = json.loads(msg) pm = Config.get() - ts = data["timestamp"] + ts = round(data["timestamp"] * 1000) #logger.debug("@@@ ACARS: {0}".format(data)) # Collect basic data first out = { - "mode" : "ACARS", - "type" : "ACARS frame", - "time" : datetime.utcfromtimestamp(ts).strftime("%H:%M:%S"), - "ts" : ts, - "ttl" : ts + pm["acars_ttl"] + "mode" : "ACARS", + "type" : "ACARS frame", + "timestamp" : ts, + "ttl" : ts + pm["acars_ttl"] * 1000 } # Fetch other data for key in self.attrMap: diff --git a/owrx/marine.py b/owrx/marine.py index e0613627..65efeaa7 100644 --- a/owrx/marine.py +++ b/owrx/marine.py @@ -32,7 +32,10 @@ class DscParser(TextParser): # Add mode and frequency out["mode"] = "DSC" if self.frequency != 0: - out["frequency"] = self.frequency + out["freq"] = self.frequency + # Convert timestamp to milliseconds + if "timestamp" in out: + out["timestamp"] = out["timestamp"] * 1000 # Report message ReportingEngine.getSharedInstance().spot(out) # Log received messages for debugging