Merge 1090 and UAT aircraft into one map

Squashed commit of the following:

commit ef61cba13698090b85fea3136bc77e320eab3d0d
Author: eric1tran <eric1tran@gmail.com>
Date:   Thu Feb 25 04:39:22 2021 +0000

    Remove unused receiver clock code

commit 809cf656b5a098948fbfc5ce2b5f60f753fb4043
Author: eric1tran <eric1tran@gmail.com>
Date:   Thu Feb 25 04:35:32 2021 +0000

    Avoid calling getDataSource() so many times and cleanup spacing

commit a0000b942bb5aa5f8061db0ca9d405461c6eea07
Author: eric1tran <eric1tran@gmail.com>
Date:   Thu Feb 25 04:19:11 2021 +0000

    Copy paste bug

commit ccc3cd3964bddcd86e8faf45c06e577309cffb02
Author: eric1tran <eric1tran@gmail.com>
Date:   Thu Feb 25 04:17:14 2021 +0000

    Filter UAT logic

commit 34dc860a16e1c57cdc3563ec31c45f9b1b133d4c
Author: eric1tran <eric1tran@gmail.com>
Date:   Thu Feb 25 03:24:56 2021 +0000

    Reorder message rate text

commit 25db80799a2a6dc8e33835cb2ed43c305c87a4d8
Author: eric1tran <eric1tran@gmail.com>
Date:   Thu Feb 25 00:56:43 2021 +0000

    Track 1090 and 978 message rate separately

commit a2031d13e4a447ad0f8de61eada75f0da019d1c2
Author: eric1tran <eric1tran@gmail.com>
Date:   Thu Feb 25 00:27:25 2021 +0000

    UAT classification logic

commit 5482274016eecfbc27f2b5de6779c032803ca177
Author: eric1tran <eric1tran@gmail.com>
Date:   Wed Feb 24 23:13:39 2021 +0000

    Spacing

commit 2fc4408e6437ec5e0db2329d46a68fc6538abc45
Author: eric1tran <eric1tran@gmail.com>
Date:   Wed Feb 24 22:57:05 2021 +0000

    Load UAT history.json files if UAT is enabled

commit 9ccf4eba7590b1f38c78aeb73209b48cb8e0c34f
Author: eric1tran <eric1tran@gmail.com>
Date:   Wed Feb 24 22:24:23 2021 +0000

    ajax calls to fetch UAT aircraft json if enabled

commit d8f0c1c042bdba8ae1348a513df7dcca6ebc23fc
Author: eric1tran <eric1tran@gmail.com>
Date:   Wed Feb 24 21:29:01 2021 +0000

    Read skyaware978 config files on initialization

commit 0245fa7449e92555b7631ab0365e43fb38e1c221
Author: eric1tran <eric1tran@gmail.com>
Date:   Wed Feb 24 20:15:09 2021 +0000

    Change SkyAware url to /skyaware to genericize it for dual mode

commit 9384364b2473f8c73d3f165d7f5192c1995457a5
Author: eric1tran <eric1tran@gmail.com>
Date:   Wed Feb 24 19:46:06 2021 +0000

    Add UAT toggle and description (non-functional)

commit 9b65a55c0ceb7c3da3b3515d26f0d5d42192f658
Author: eric1tran <eric1tran@gmail.com>
Date:   Wed Feb 24 19:32:54 2021 +0000

    Removed unused css
This commit is contained in:
eric1tran 2021-02-25 05:35:05 +00:00
parent 9f07a81dfa
commit 74b1a39aa0
6 changed files with 419 additions and 238 deletions

View File

@ -21,19 +21,23 @@
# server.modules += ( "mod_alias" )
alias.url += (
"/dump1090-fa/data/" => "/run/dump1090-fa/",
"/dump1090-fa/" => "/usr/share/dump1090-fa/html/"
"/skyaware/data-1090/" => "/run/dump1090-fa/",
"/skyaware/data-978/" => "/run/skyaware978/",
"/skyaware/" => "/usr/share/dump1090-fa/html/"
)
# redirect the slash-less URL
url.redirect += (
"^/dump1090-fa$" => "/dump1090-fa/"
"^/skyaware$" => "/skyaware/",
"^/dump1090-fa$" => "/skyaware/",
"^/dump1090-fa/" => "/skyaware/"
)
# Listen on port 8080 and serve the map there, too.
$SERVER["socket"] == ":8080" {
alias.url += (
"/data/" => "/run/dump1090-fa/",
"/data-1090/" => "/run/dump1090-fa/",
"/data-978/" => "/run/skyaware978/",
"/" => "/usr/share/dump1090-fa/html/"
)
}

View File

@ -234,6 +234,8 @@ function format_latlng(p) {
function format_data_source(source) {
switch (source) {
case 'uat':
return "UAT";
case 'mlat':
return "MLAT";
case 'adsb_icao':

View File

@ -213,12 +213,15 @@
</tr>
<tr class="infoblock_body">
<td><span class="infoBlockTitleText">Total Aircraft:</span> <span id="dump1090_total_ac">n/a</span></td>
<td><span class="infoBlockTitleText">Messages:</span> <span id="dump1090_message_rate">n/a</span>/sec</td>
<td><span class="infoBlockTitleText">ADS-B Message Rate:</span> <span id="dump1090_message_rate">n/a</span></td>
</tr>
<tr class="infoblock_body">
<td><span class="infoBlockTitleText">With Positions:</span> <span id="dump1090_total_ac_positions">n/a</span></td>
<td><span class="infoBlockTitleText">History:</span> <span id="dump1090_total_history">n/a</span> positions</td>
<td><span class="infoBlockTitleText">UAT Message Rate:</span> <span id="uat_message_rate">n/a</span></td>
</tr>
<tr class="infoblock_body">
<td><span class="infoBlockTitleText">Position History:</span> <span id="dump1090_total_history">n/a</span></td>
</tr>
</table>
</div> <!-- dump1090_infoblock -->
@ -418,6 +421,8 @@
<div class="legend">
<div class="sourceCheckbox" id="adsb_datasource_checkbox"></div>
<div class="legendTitle vPosition">ADS-B</div>
<div class="sourceCheckbox" id="uat_datasource_checkbox"></div>
<div class="legendTitle uat">UAT</div>
<div class="sourceCheckbox" id="mlat_datasource_checkbox"></div>
<div class="legendTitle mlat">MLAT</div>
<div class="sourceCheckbox" id="other_datasource_checkbox"></div>
@ -703,6 +708,14 @@
<span id="selected_version">n/a</span>
</div>
</div>
<div class="infoRowLine">
<div class="infoHeading infoRowFluid fourColumnSection1">
<span title="For UAT-equipped aircraft, the version of UAT ADS-B to which the aircraft conforms, as reported by the aircraft.">UAT Version</span>:
</div>
<div class="infoData infoRowFluid fourColumnSection2">
<span id="selected_uat_version">n/a</span>
</div>
</div>
<div class="infoRowLine">
<div class="infoHeading infoRowFluid fourColumnSection1">
<span title="Indicated signal strength of the signal received by your ADS-B site from the aircraft.">RSSI</span>:
@ -827,6 +840,11 @@
<span id="update_error_detail"></span><br>
The displayed map data will be out of date.
</div>
<div id="uat_update_error" class="hidden">
<b>Problem fetching data from SkyAware978.</b><br>
<span id="uat_update_error_detail"></span><br>
The displayed map data will be out of date.
</div>
<div id="container_splitter"></div>
</body>

View File

@ -42,6 +42,7 @@ function PlaneObject(icao) {
this.vert_rate = null;
this.version = null;
this.uat_version = null;
this.prev_position = null;
this.prev_position_time = null;
@ -84,6 +85,10 @@ function PlaneObject(icao) {
this.typeDescription = null;
this.wtc = null;
this.heard_on_1090 = false;
this.heard_on_978 = false;
this.heard_on_tisb = false;
// request metadata
getAircraftData(this.icao).done(function(data) {
if ("r" in data) {
@ -124,7 +129,9 @@ PlaneObject.prototype.isFiltered = function() {
}
var dataSource = this.getDataSource();
if (dataSource === 'adsb_icao') {
if (dataSource === 'uat') {
if (!this.filter.UAT) return true;
} else if (dataSource === 'adsb_icao') {
if (!this.filter.ADSB) return true;
} else if (dataSource === 'mlat') {
if (!this.filter.MLAT) return true;
@ -319,6 +326,11 @@ PlaneObject.prototype.getDataSource = function() {
return 'mlat';
}
// Classify as UAT if we heard it on 978 Mhz until we hear it from another source
if (this.heard_on_978 && !this.heard_on_1090 && !this.heard_on_tisb) {
return 'uat';
}
// Not MLAT, but position reported - ADSB or variants
if (this.position !== null) {
return this.addrtype;
@ -538,19 +550,25 @@ PlaneObject.prototype.updateIcon = function() {
};
// Update our data
PlaneObject.prototype.updateData = function(receiver_timestamp, data) {
PlaneObject.prototype.updateData = function(receiver_timestamp, data, receiver_source) {
// Update all of our data
this.messages = data.messages;
this.rssi = data.rssi;
this.last_message_time = receiver_timestamp - data.seen;
if (receiver_source == "dump1090-fa") {
this.heard_on_1090 = true;
} else if (receiver_source == "skyaware978") {
this.heard_on_978 = true;
}
// simple fields
var fields = ["alt_baro", "alt_geom", "gs", "ias", "tas", "track",
"track_rate", "mag_heading", "true_heading", "mach",
"roll", "nav_heading", "nav_modes",
"nac_p", "nac_v", "nic_baro", "sil_type", "sil",
"nav_qnh", "baro_rate", "geom_rate", "rc",
"squawk", "category", "version"];
"squawk", "category", "version", "uat_version"];
for (var i = 0; i < fields.length; ++i) {
if (fields[i] in data) {
@ -561,12 +579,16 @@ PlaneObject.prototype.updateData = function(receiver_timestamp, data) {
}
// fields with more complex behaviour
if ('type' in data)
this.addrtype = data.type;
else
this.addrtype = 'adsb_icao';
if (this.addrtype == "tisb_trackfile" || this.addrtype == "tisb_icao" || this.addrtype == "tisb_other") {
this.heard_on_tisb = true;
}
// don't expire callsigns
if ('flight' in data)
this.flight = data.flight;

View File

@ -18,6 +18,9 @@ var infoBoxOriginalPosition = {};
var customAltitudeColors = true;
var myAdsbStatsSiteUrl = null;
var ADSB_Enabled = true;
var UAT_Enabled = false;
var SpecialSquawks = {
'7500' : { cssClass: 'squawk7500', markerColor: 'rgb(255, 85, 85)', text: 'Aircraft Hijacking' },
'7600' : { cssClass: 'squawk7600', markerColor: 'rgb(0, 255, 255)', text: 'Radio Failure' },
@ -38,14 +41,16 @@ var TrackedHistorySize = 0;
var SitePosition = null;
var ReceiverClock = null;
var LastReceiverTimestamp = 0;
var StaleReceiverCount = 0;
var FetchPending = null;
var FetchPending_UAT = null;
var MessageCountHistory = [];
var MessageCountHistory_UAT = [];
var MessageRate = 0;
var UatMessageRate = 0;
var NBSP='\u00a0';
@ -92,22 +97,38 @@ var DefaultMinMaxFilters = {
'imperial' : {min: 0, maxSpeed: 600, maxAltitude: 65000} // mph, ft
};
function processReceiverUpdate(data) {
// Loop through all the planes in the data packet
// Update Planes with data in aircraft json
// receiver_source will specify where the aircraft.json originated from (dump1090-fa or skyaware978)
function processReceiverUpdate(data, receiver_source) {
// Loop through all the planes in the data packet
var now = data.now;
var acs = data.aircraft;
// Detect stats reset
if (MessageCountHistory.length > 0 && MessageCountHistory[MessageCountHistory.length-1].messages > data.messages) {
MessageCountHistory = [{'time' : MessageCountHistory[MessageCountHistory.length-1].time,
'messages' : 0}];
}
if (receiver_source === "skyaware978") {
// Detect stats reset (i.e. if MessageCountHistory array is > 0 and the latest value > the "messages" field in the data packet)
if (MessageCountHistory_UAT.length > 0 && MessageCountHistory_UAT[MessageCountHistory_UAT.length-1].messages > data.messages) {
MessageCountHistory_UAT = [{'time' : MessageCountHistory_UAT[MessageCountHistory_UAT.length-1].time,
'messages' : 0}];
}
// Note the message count in the history
MessageCountHistory.push({ 'time' : now, 'messages' : data.messages});
// .. and clean up any old values
if ((now - MessageCountHistory[0].time) > 30)
MessageCountHistory.shift();
// Maintain a 30 second rollinng history of message counts
MessageCountHistory_UAT.push({ 'time' : now, 'messages' : data.messages});
// .. and clean up any old values
if ((now - MessageCountHistory_UAT[0].time) > 30)
MessageCountHistory_UAT.shift();
} else {
// Detect stats reset (i.e. if MessageCountHistory array is > 0 and the latest value > the "messages" field in the data packet)
if (MessageCountHistory.length > 0 && MessageCountHistory[MessageCountHistory.length-1].messages > data.messages) {
MessageCountHistory = [{'time' : MessageCountHistory[MessageCountHistory.length-1].time,
'messages' : 0}];
}
// Maintain a 30 second rollinng history of message counts
MessageCountHistory.push({ 'time' : now, 'messages' : data.messages});
// .. and clean up any old values
if ((now - MessageCountHistory[0].time) > 30)
MessageCountHistory.shift();
}
for (var j=0; j < acs.length; j++) {
var ac = acs[j];
@ -169,7 +190,7 @@ function processReceiverUpdate(data) {
}
// Call the function update
plane.updateData(now, ac);
plane.updateData(now, ac, receiver_source);
}
}
@ -179,52 +200,77 @@ function fetchData() {
return;
}
FetchPending = $.ajax({ url: 'data/aircraft.json',
FetchPending = $.ajax({ url: 'data-1090/aircraft.json',
timeout: 5000,
cache: false,
dataType: 'json' });
FetchPending.done(function(data) {
var now = data.now;
processReceiverUpdate(data);
// update timestamps, visibility, history track for all planes - not only those updated
for (var i = 0; i < PlanesOrdered.length; ++i) {
var plane = PlanesOrdered[i];
plane.updateTick(now, LastReceiverTimestamp);
}
selectNewPlanes();
refreshTableInfo();
refreshSelected();
refreshHighlighted();
if (ReceiverClock) {
var rcv = new Date(now * 1000);
ReceiverClock.render(rcv.getUTCHours(),rcv.getUTCMinutes(),rcv.getUTCSeconds());
}
// Check for stale receiver data
if (LastReceiverTimestamp === now) {
StaleReceiverCount++;
if (StaleReceiverCount > 5) {
$("#update_error_detail").text("The data from dump1090 hasn't been updated in a while. Maybe dump1090 is no longer running?");
$("#update_error").css('display','block');
}
} else {
StaleReceiverCount = 0;
LastReceiverTimestamp = now;
$("#update_error").css('display','none');
}
process_aircraft_json(data, 'dump1090-fa');
});
FetchPending.fail(function(jqxhr, status, error) {
$("#update_error_detail").text("AJAX call failed (" + status + (error ? (": " + error) : "") + "). Maybe dump1090 is no longer running?");
$("#update_error").css('display','block');
});
// Fetch UAT if enabled
if (UAT_Enabled) {
if (FetchPending_UAT !== null && FetchPending_UAT.state() == 'pending') {
// don't double up on fetches, let the last one resolve
return;
}
FetchPending_UAT = $.ajax({ url: 'data-978/aircraft.json',
timeout: 5000,
cache: false,
dataType: 'json' });
FetchPending_UAT.done(function(data) {
// Process UAT aircraft.json here
process_aircraft_json(data, 'skyaware978');
});
FetchPending_UAT.fail(function(jqxhr, status, error) {
$("#uat_update_error_detail").text("AJAX call failed (" + status + (error ? (": " + error) : "") + "). Maybe skyaware978 is no longer running?");
$("#uat_update_error").css('display','block');
});
}
}
// Process an aircraft.json and update Planes.
// receiver_source will specify where the aircraft.json originated from (dump1090-fa or skyaware978)
function process_aircraft_json(data, receiver_source) {
var now = data.now;
processReceiverUpdate(data, receiver_source);
// update timestamps, visibility, history track for all planes - not only those updated
for (var i = 0; i < PlanesOrdered.length; ++i) {
var plane = PlanesOrdered[i];
plane.updateTick(now, LastReceiverTimestamp);
}
selectNewPlanes();
refreshTableInfo();
refreshSelected();
refreshHighlighted();
// Check for stale receiver data
if (LastReceiverTimestamp === now) {
StaleReceiverCount++;
if (StaleReceiverCount > 5) {
$("#update_error_detail").text("The data from dump1090 hasn't been updated in a while. Maybe dump1090 is no longer running?");
$("#update_error").css('display','block');
}
} else {
StaleReceiverCount = 0;
LastReceiverTimestamp = now;
$("#update_error").css('display','none');
}
}
var PositionHistorySize = 0;
var UatPositionHistorySize = 0;
function initialize() {
// Set page basics
document.title = PageName;
@ -370,6 +416,11 @@ function initialize() {
refreshDataSourceFilters();
})
$('#uat_datasource_checkbox').on('click', function() {
toggleUATAircraft(true);
refreshDataSourceFilters();
})
$('#mlat_datasource_checkbox').on('click', function() {
toggleMLATAircraft(true);
refreshDataSourceFilters();
@ -425,19 +476,39 @@ function initialize() {
toggleAircraftLabels(false);
toggleAllColumns(false);
toggleADSBAircraft(false);
toggleUATAircraft(false);
toggleMLATAircraft(false);
toggleOtherAircraft(false);
toggleTISBAircraft(false);
refreshDataSourceFilters();
// Get 978 receiver metadata if present
$.ajax({ url: 'data-978/receiver.json',
timeout: 5000,
cache: false,
dataType: 'json' })
.done(function(data) {
console.log('SkyAware978 enabled')
UAT_Enabled = true;
UatPositionHistorySize = data.history;
})
.fail(function(data) {
console.warn('Error reading SkyAware978 receiver.json. SkyAware978 may be disabled')
UAT_Enabled = false;
});
// Get receiver metadata, reconfigure using it, then continue
// with initialization
$.ajax({ url: 'data/receiver.json',
$.ajax({ url: 'data-1090/receiver.json',
timeout: 5000,
cache: false,
dataType: 'json' })
.done(function(data) {
console.log('dump1090-fa enabled');
ADSB_Enabled = true;
if (typeof data.lat !== "undefined") {
SiteShow = true;
SiteLat = data.lat;
@ -451,6 +522,11 @@ function initialize() {
PositionHistorySize = data.history;
})
.fail(function(data) {
console.warn('Error reading dump1090-fa receiver.json. dump1090-fa may be disabled');
ADSB_Enabled = false;
})
.always(function() {
initialize_map();
start_load_history();
@ -556,38 +632,55 @@ function reset_filter_sliders() {
updatePlaneFilter();
}
var CurrentHistoryFetch = null;
var CurrentHistoryFetch = 0;
var PositionHistoryBuffer = [];
var HistoryItemsReturned = 0;
var TotalPositionHistorySize = 0;
function start_load_history() {
let url = new URL(window.location.href);
let params = new URLSearchParams(url.search);
if (PositionHistorySize > 0 && params.get('nohistory') !== 'true') {
$("#loader_progress").attr('max',PositionHistorySize);
console.log("Starting to load history (" + PositionHistorySize + " items)");
//Load history items in parallel
for (var i = 0; i < PositionHistorySize; i++) {
load_history_item(i);
}
} else {
// Nothing to load
end_load_history();
}
let url = new URL(window.location.href);
let params = new URLSearchParams(url.search);
// Get total number of history.json files to load
TotalPositionHistorySize = PositionHistorySize + UatPositionHistorySize;
if (TotalPositionHistorySize > 0 && params.get('nohistory') !== 'true') {
$("#loader_progress").attr('max', TotalPositionHistorySize);
console.log("Starting to load history (" + TotalPositionHistorySize + " items)");
// Load dump1090 history.json files
for (var i = 0; i < PositionHistorySize; i++) {
load_history_item(i, 'data-1090');
CurrentHistoryFetch++;
}
// Load skyaware978 history.json files
for (var i = 0; i < UatPositionHistorySize; i++) {
load_history_item(i, 'data-978');
CurrentHistoryFetch++;
}
} else {
// Nothing to load
end_load_history();
}
}
function load_history_item(i) {
console.log("Loading history #" + i);
$("#loader_progress").attr('value',i);
// Loads a history json file
function load_history_item(i, source) {
var historyfile = 'history_' + i + '.json';
console.log('Loading ' + source + ' ' + historyfile);
$("#loader_progress").attr('value', CurrentHistoryFetch);
$.ajax({ url: 'data/history_' + i + '.json',
var receiver_source = (source == "data-978" ? "skyaware978" : "dump1090-fa");
$.ajax({ url: source + '/' + historyfile,
timeout: 5000,
cache: false,
dataType: 'json' })
.done(function(data) {
// Tag history.json files with the source we fetched from (data-1090 / data-978)
data["source"] = receiver_source;
PositionHistoryBuffer.push(data);
HistoryItemsReturned++;
if (HistoryItemsReturned == PositionHistorySize) {
if (HistoryItemsReturned == TotalPositionHistorySize) {
// End load history when all files have been loaded
end_load_history();
}
})
@ -595,9 +688,10 @@ function load_history_item(i) {
.fail(function(jqxhr, status, error) {
//Doesn't matter if it failed, we'll just be missing a data point
HistoryItemsReturned++;
if (HistoryItemsReturned == PositionHistorySize) {
end_load_history();
}
if (HistoryItemsReturned == TotalPositionHistorySize) {
// End load history when all files have been loaded
end_load_history();
}
});
}
@ -617,9 +711,9 @@ function end_load_history() {
for (var h = 0; h < PositionHistoryBuffer.length; ++h) {
now = PositionHistoryBuffer[h].now;
console.log("Applying history " + (h + 1) + "/" + PositionHistoryBuffer.length + " at: " + now);
processReceiverUpdate(PositionHistoryBuffer[h]);
processReceiverUpdate(PositionHistoryBuffer[h], PositionHistoryBuffer[h].source);
// update track
// Update track
console.log("Updating tracks at: " + now);
for (var i = 0; i < PlanesOrdered.length; ++i) {
var plane = PlanesOrdered[i];
@ -1194,20 +1288,12 @@ function refreshPageTitle() {
// Refresh the detail window about the plane
function refreshSelected() {
if (MessageCountHistory.length > 1) {
var message_time_delta = MessageCountHistory[MessageCountHistory.length-1].time - MessageCountHistory[0].time;
var message_count_delta = MessageCountHistory[MessageCountHistory.length-1].messages - MessageCountHistory[0].messages;
if (message_time_delta > 0)
MessageRate = message_count_delta / message_time_delta;
} else {
MessageRate = null;
}
updateMessageRates();
refreshPageTitle();
refreshPageTitle();
var selected = false;
if (typeof SelectedPlane !== 'undefined' && SelectedPlane != "ICAO" && SelectedPlane != null) {
selected = Planes[SelectedPlane];
if (typeof SelectedPlane !== 'undefined' && SelectedPlane != "ICAO" && SelectedPlane != null) {
selected = Planes[SelectedPlane];
}
$('#dump1090_infoblock').css('display','block');
@ -1218,9 +1304,11 @@ function refreshSelected() {
$('#active_filter_count').text(ActiveFilterCount);
if (MessageRate !== null) {
$('#dump1090_message_rate').text(MessageRate.toFixed(1));
} else {
$('#dump1090_message_rate').text("n/a");
$('#dump1090_message_rate').text(MessageRate.toFixed(1) + '/sec');
}
if (UatMessageRate !== null) {
$('#uat_message_rate').text(UatMessageRate.toFixed(1) + '/sec');
}
setSelectedInfoBlockVisibility();
@ -1311,11 +1399,14 @@ function refreshSelected() {
}
}
if (selected.getDataSource() === "adsb_icao") {
var datasource = selected.getDataSource();
if (datasource === "uat") {
$('#selected_source').text("UAT");
} else if (datasource === "adsb_icao") {
$('#selected_source').text("ADS-B");
} else if (selected.getDataSource() === "tisb_trackfile" || selected.getDataSource() === "tisb_icao" || selected.getDataSource() === "tisb_other") {
} else if (datasource === "tisb_trackfile" || datasource === "tisb_icao" || datasource === "tisb_other") {
$('#selected_source').text("TIS-B");
} else if (selected.getDataSource() === "mlat") {
} else if (datasource === "mlat") {
$('#selected_source').text("MLAT");
} else {
$('#selected_source').text("Other");
@ -1358,61 +1449,62 @@ function refreshSelected() {
$('#selected_nav_modes').text("n/a");
} else {
$('#selected_nav_modes').text(selected.nav_modes.join());
}
if (selected.nic_baro == null) {
$('#selected_nic_baro').text("n/a");
} else {
if (selected.nic_baro == 1) {
$('#selected_nic_baro').text("cross-checked");
} else {
$('#selected_nic_baro').text("not cross-checked");
}
}
}
if (selected.nic_baro == null) {
$('#selected_nic_baro').text("n/a");
} else {
if (selected.nic_baro == 1) {
$('#selected_nic_baro').text("cross-checked");
} else {
$('#selected_nic_baro').text("not cross-checked");
}
}
$('#selected_nac_p').text(format_nac_p(selected.nac_p));
$('#selected_nac_v').text(format_nac_v(selected.nac_v));
if (selected.rc == null) {
$('#selected_rc').text("n/a");
} else if (selected.rc == 0) {
$('#selected_rc').text("unknown");
} else {
$('#selected_rc').text(format_distance_short(selected.rc, DisplayUnits));
}
$('#selected_nac_p').text(format_nac_p(selected.nac_p));
$('#selected_nac_v').text(format_nac_v(selected.nac_v));
if (selected.rc == null) {
$('#selected_rc').text("n/a");
} else if (selected.rc == 0) {
$('#selected_rc').text("unknown");
} else {
$('#selected_rc').text(format_distance_short(selected.rc, DisplayUnits));
}
if (selected.sil == null || selected.sil_type == null) {
$('#selected_sil').text("n/a");
} else {
var sampleRate = "";
var silDesc = "";
if (selected.sil_type == "perhour") {
sampleRate = " per flight hour";
} else if (selected.sil_type == "persample") {
sampleRate = " per sample";
}
switch (selected.sil) {
case 0:
silDesc = "&gt; 1×10<sup>-3</sup>";
break;
case 1:
silDesc = "≤ 1×10<sup>-3</sup>";
break;
case 2:
silDesc = "≤ 1×10<sup>-5</sup>";
break;
case 3:
silDesc = "≤ 1×10<sup>-7</sup>";
break;
default:
silDesc = "n/a";
sampleRate = "";
break;
}
$('#selected_sil').html(silDesc + sampleRate);
}
if (selected.sil == null || selected.sil_type == null) {
$('#selected_sil').text("n/a");
} else {
var sampleRate = "";
var silDesc = "";
if (selected.sil_type == "perhour") {
sampleRate = " per flight hour";
} else if (selected.sil_type == "persample") {
sampleRate = " per sample";
}
switch (selected.sil) {
case 0:
silDesc = "&gt; 1×10<sup>-3</sup>";
break;
case 1:
silDesc = "≤ 1×10<sup>-3</sup>";
break;
case 2:
silDesc = "≤ 1×10<sup>-5</sup>";
break;
case 3:
silDesc = "≤ 1×10<sup>-7</sup>";
break;
default:
silDesc = "n/a";
sampleRate = "";
break;
}
$('#selected_sil').html(silDesc + sampleRate);
}
if (selected.version == null) {
$('#selected_version').text('none');
$('#selected_version').text('N/A');
} else if (selected.version == 0) {
$('#selected_version').text('v0 (DO-260)');
} else if (selected.version == 1) {
@ -1423,8 +1515,42 @@ function refreshSelected() {
$('#selected_version').text('v' + selected.version);
}
if (selected.uat_version == null) {
$('#selected_uat_version').text('N/A');
} else if (selected.uat_version == 0) {
$('#selected_uat_version').text('v0 (DO-282)');
} else if (selected.uat_version == 1) {
$('#selected_uat_version').text('v1 (DO-282A)');
} else if (selected.uat_version == 2) {
$('#selected_uat_version').text('v2 (DO-282B)');
} else {
$('#selected_uat_version').text('v' + selected.uat_version);
}
}
// Calculate 1090 and 978 Message rate using the rolling history of Message Counts recorded from processing aircraft.json
function updateMessageRates () {
if (MessageCountHistory.length > 1) {
var message_time_delta = MessageCountHistory[MessageCountHistory.length-1].time - MessageCountHistory[0].time;
var message_count_delta = MessageCountHistory[MessageCountHistory.length-1].messages - MessageCountHistory[0].messages;
if (message_time_delta > 0)
MessageRate = message_count_delta / message_time_delta;
} else {
MessageRate = null;
}
if (MessageCountHistory_UAT.length > 1) {
var message_time_delta = MessageCountHistory_UAT[MessageCountHistory_UAT.length-1].time - MessageCountHistory_UAT[0].time;
var message_count_delta = MessageCountHistory_UAT[MessageCountHistory_UAT.length-1].messages - MessageCountHistory_UAT[0].messages;
if (message_time_delta > 0)
UatMessageRate = message_count_delta / message_time_delta;
} else {
UatMessageRate = null;
}
}
function refreshHighlighted() {
// this is following nearly identical logic, etc, as the refreshSelected function, but doing less junk for the highlighted pane
var highlighted = false;
@ -1479,11 +1605,14 @@ function refreshHighlighted() {
$('#higlighted_icaotype').text("n/a");
}
if (highlighted.getDataSource() === "adsb_icao") {
var datasource = highlighted.getDataSource();
if (datasource === "uat") {
$('#highlighted_source').text("UAT");
} else if (datasource === "adsb_icao") {
$('#highlighted_source').text("ADS-B");
} else if (highlighted.getDataSource() === "tisb_trackfile" || highlighted.getDataSource() === "tisb_icao" || highlighted.getDataSource() === "tisb_other") {
} else if (datasource === "tisb_trackfile" || datasource === "tisb_icao" || datasource === "tisb_other") {
$('#highlighted_source').text("TIS-B");
} else if (highlighted.getDataSource() === "mlat") {
} else if (datasource === "mlat") {
$('#highlighted_source').text("MLAT");
} else {
$('#highlighted_source').text("Other");
@ -1515,83 +1644,86 @@ function removeHighlight() {
// Refreshes the larger table of all the planes
function refreshTableInfo() {
var show_squawk_warning = false;
var show_squawk_warning = false;
TrackedAircraft = 0
TrackedAircraftPositions = 0
TrackedHistorySize = 0
TrackedAircraft = 0
TrackedAircraftPositions = 0
TrackedHistorySize = 0
$(".altitudeUnit").text(get_unit_label("altitude", DisplayUnits));
$(".speedUnit").text(get_unit_label("speed", DisplayUnits));
$(".distanceUnit").text(get_unit_label("distance", DisplayUnits));
$(".verticalRateUnit").text(get_unit_label("verticalRate", DisplayUnits));
$(".altitudeUnit").text(get_unit_label("altitude", DisplayUnits));
$(".speedUnit").text(get_unit_label("speed", DisplayUnits));
$(".distanceUnit").text(get_unit_label("distance", DisplayUnits));
$(".verticalRateUnit").text(get_unit_label("verticalRate", DisplayUnits));
for (var i = 0; i < PlanesOrdered.length; ++i) {
var tableplane = PlanesOrdered[i];
TrackedHistorySize += tableplane.history_size;
if (tableplane.seen >= 58 || tableplane.isFiltered()) {
tableplane.tr.className = "plane_table_row hidden";
} else {
TrackedAircraft++;
var classes = "plane_table_row";
for (var i = 0; i < PlanesOrdered.length; ++i) {
var tableplane = PlanesOrdered[i];
TrackedHistorySize += tableplane.history_size;
if (tableplane.seen >= 58 || tableplane.isFiltered()) {
tableplane.tr.className = "plane_table_row hidden";
} else {
TrackedAircraft++;
var classes = "plane_table_row";
if (tableplane.position !== null && tableplane.seen_pos < 60) {
++TrackedAircraftPositions;
}
if (tableplane.position !== null && tableplane.seen_pos < 60) {
++TrackedAircraftPositions;
}
if (tableplane.getDataSource() === "adsb_icao") {
classes += " vPosition";
} else if (tableplane.getDataSource() === "tisb_trackfile" || tableplane.getDataSource() === "tisb_icao" || tableplane.getDataSource() === "tisb_other") {
classes += " tisb";
} else if (tableplane.getDataSource() === "mlat") {
classes += " mlat";
} else {
classes += " other";
var datasource = tableplane.getDataSource();
if (datasource === "uat") {
classes += " uat";
} else if (datasource === "adsb_icao") {
classes += " vPosition";
} else if (datasource === "tisb_trackfile" || datasource === "tisb_icao" || datasource === "tisb_other") {
classes += " tisb";
} else if (datasource === "mlat") {
classes += " mlat";
} else {
classes += " other";
}
if (tableplane.icao == SelectedPlane)
classes += " selected";
if (tableplane.squawk in SpecialSquawks) {
classes = classes + " " + SpecialSquawks[tableplane.squawk].cssClass;
show_squawk_warning = true;
}
// ICAO doesn't change
if (tableplane.flight) {
tableplane.tr.cells[2].innerHTML = getFlightAwareModeSLink(tableplane.icao, tableplane.flight, tableplane.flight);
} else {
// Show _registration if ident is not present
tableplane.tr.cells[2].innerHTML = (tableplane.registration !== null ? getFlightAwareIdentLink(tableplane.registration, '_' + tableplane.registration) : "");
}
tableplane.tr.cells[3].textContent = (tableplane.registration !== null ? tableplane.registration : "");
tableplane.tr.cells[4].textContent = (tableplane.icaotype !== null ? tableplane.icaotype : "");
tableplane.tr.cells[5].textContent = (tableplane.squawk !== null ? tableplane.squawk : "");
tableplane.tr.cells[6].innerHTML = format_altitude_brief(tableplane.altitude, tableplane.vert_rate, DisplayUnits);
tableplane.tr.cells[7].textContent = format_speed_brief(tableplane.gs, DisplayUnits);
tableplane.tr.cells[8].textContent = format_vert_rate_brief(tableplane.vert_rate, DisplayUnits);
tableplane.tr.cells[9].textContent = format_distance_brief(tableplane.sitedist, DisplayUnits);
tableplane.tr.cells[10].textContent = format_track_brief(tableplane.track);
tableplane.tr.cells[11].textContent = tableplane.messages;
tableplane.tr.cells[12].textContent = tableplane.seen.toFixed(0);
tableplane.tr.cells[13].textContent = (tableplane.rssi !== null ? tableplane.rssi : "");
tableplane.tr.cells[14].textContent = (tableplane.position !== null ? tableplane.position[1].toFixed(4) : "");
tableplane.tr.cells[15].textContent = (tableplane.position !== null ? tableplane.position[0].toFixed(4) : "");
tableplane.tr.cells[16].textContent = format_data_source(tableplane.getDataSource());
tableplane.tr.cells[17].innerHTML = getAirframesModeSLink(tableplane.icao);
tableplane.tr.cells[18].innerHTML = getFlightAwareModeSLink(tableplane.icao, tableplane.flight);
tableplane.tr.cells[19].innerHTML = getFlightAwarePhotoLink(tableplane.registration);
tableplane.tr.className = classes;
}
}
if (tableplane.icao == SelectedPlane)
classes += " selected";
if (tableplane.squawk in SpecialSquawks) {
classes = classes + " " + SpecialSquawks[tableplane.squawk].cssClass;
show_squawk_warning = true;
}
// ICAO doesn't change
if (tableplane.flight) {
tableplane.tr.cells[2].innerHTML = getFlightAwareModeSLink(tableplane.icao, tableplane.flight, tableplane.flight);
if (show_squawk_warning) {
$("#SpecialSquawkWarning").css('display','block');
} else {
// Show _registration if ident is not present
tableplane.tr.cells[2].innerHTML = (tableplane.registration !== null ? getFlightAwareIdentLink(tableplane.registration, '_' + tableplane.registration) : "");
$("#SpecialSquawkWarning").css('display','none');
}
tableplane.tr.cells[3].textContent = (tableplane.registration !== null ? tableplane.registration : "");
tableplane.tr.cells[4].textContent = (tableplane.icaotype !== null ? tableplane.icaotype : "");
tableplane.tr.cells[5].textContent = (tableplane.squawk !== null ? tableplane.squawk : "");
tableplane.tr.cells[6].innerHTML = format_altitude_brief(tableplane.altitude, tableplane.vert_rate, DisplayUnits);
tableplane.tr.cells[7].textContent = format_speed_brief(tableplane.gs, DisplayUnits);
tableplane.tr.cells[8].textContent = format_vert_rate_brief(tableplane.vert_rate, DisplayUnits);
tableplane.tr.cells[9].textContent = format_distance_brief(tableplane.sitedist, DisplayUnits);
tableplane.tr.cells[10].textContent = format_track_brief(tableplane.track);
tableplane.tr.cells[11].textContent = tableplane.messages;
tableplane.tr.cells[12].textContent = tableplane.seen.toFixed(0);
tableplane.tr.cells[13].textContent = (tableplane.rssi !== null ? tableplane.rssi : "");
tableplane.tr.cells[14].textContent = (tableplane.position !== null ? tableplane.position[1].toFixed(4) : "");
tableplane.tr.cells[15].textContent = (tableplane.position !== null ? tableplane.position[0].toFixed(4) : "");
tableplane.tr.cells[16].textContent = format_data_source(tableplane.getDataSource());
tableplane.tr.cells[17].innerHTML = getAirframesModeSLink(tableplane.icao);
tableplane.tr.cells[18].innerHTML = getFlightAwareModeSLink(tableplane.icao, tableplane.flight);
tableplane.tr.cells[19].innerHTML = getFlightAwarePhotoLink(tableplane.registration);
tableplane.tr.className = classes;
}
}
if (show_squawk_warning) {
$("#SpecialSquawkWarning").css('display','block');
} else {
$("#SpecialSquawkWarning").css('display','none');
}
resortTable();
resortTable();
}
//
@ -2284,6 +2416,7 @@ function refreshDataSourceFilters () {
PlaneFilter.MLAT = (localStorage.getItem('sourceMLATFilter') === 'selected') ? true : false;
PlaneFilter.Other = (localStorage.getItem('sourceOtherFilter') === 'selected') ? true : false;
PlaneFilter.TISB = (localStorage.getItem('sourceTISBFilter') === 'selected') ? true : false;
PlaneFilter.UAT = (localStorage.getItem('sourceUATFilter') === 'selected') ? true : false;
}
function getFlightAwareIdentLink(ident, linkText) {
@ -2608,6 +2741,23 @@ function toggleADSBAircraft(switchFilter) {
localStorage.setItem('sourceADSBFilter', sourceADSBFilter);
}
function toggleUATAircraft(switchFilter) {
if (typeof localStorage['sourceUATFilter'] === 'undefined') {
localStorage.setItem('sourceUATFilter','selected');
}
var sourceUATFilter = localStorage.getItem('sourceUATFilter');
if (switchFilter === true) {
sourceUATFilter = (sourceUATFilter === 'deselected') ? 'selected' : 'deselected';
}
if (sourceUATFilter === 'deselected') {
$('#uat_datasource_checkbox').removeClass('sourceCheckboxChecked');
} else {
$('#uat_datasource_checkbox').addClass('sourceCheckboxChecked');
}
localStorage.setItem('sourceUATFilter', sourceUATFilter);
}
function toggleMLATAircraft(switchFilter) {
if (typeof localStorage['sourceMLATFilter'] === 'undefined') {
localStorage.setItem('sourceMLATFilter','selected');

View File

@ -259,6 +259,7 @@ div#loader { z-index: 99; position: absolute; left: 0; top: 0; bottom: 0; right:
}
.vPosition { background-color: #E5F6FC; }
.uat { background-color: #CDF7D0; }
.mlat { background-color: #FDF2E5; }
.other { background-color: #CCD5F8; }
.tisb { background-color: #FFF3B8; }
@ -630,22 +631,6 @@ select.error, textarea.error, input.error {
-webkit-border-radius: 4px;
}
#adsbLegendBox {
background-color: #E5F6FC;
}
#mlatLegendBox {
background-color: #FDF2E5;
}
#otherLegendBox {
background-color: #E6E6E6;
}
#tisbLegendBox {
background-color: #CCD5DF;
}
.legendTitle {
line-height: 19px;
display: inline-block;