dump1090/public_html/formatter.js
2016-08-22 18:15:06 -05:00

212 lines
4.8 KiB
JavaScript

// -*- mode: javascript; indent-tabs-mode: t; c-basic-offset: 8 -*-
"use strict";
var NBSP='\u00a0';
var DEGREES='\u00b0'
var UP_TRIANGLE='\u25b2'; // U+25B2 BLACK UP-POINTING TRIANGLE
var DOWN_TRIANGLE='\u25bc'; // U+25BC BLACK DOWN-POINTING TRIANGLE
var TrackDirections = ["North","Northeast","East","Southeast","South","Southwest","West","Northwest"];
var UnitLabels = {
'altitude': { metric: "m", imperial: "ft", nautical: "ft"},
'speed': { metric: "km/h", imperial: "mph", nautical: "kt" },
'distance': { metric: "km", imperial: "mi", nautical: "NM" },
'verticalRate': { metric: "m/s", imperial: "ft/min", nautical: "ft/min" }
};
// formatting helpers
function get_unit_label(quantity, systemOfMeasurement) {
var labels = UnitLabels[quantity];
if (labels !== undefined && labels[systemOfMeasurement] !== undefined) {
return labels[systemOfMeasurement];
}
return "";
}
// track in degrees (0..359)
function format_track_brief(track) {
if (track === null){
return "";
}
return Math.round(track);
}
// track in degrees (0..359)
function format_track_long(track) {
if (track === null){
return "n/a";
}
var trackDir = Math.floor((360 + track % 360 + 22.5) / 45) % 8;
return Math.round(track) + DEGREES + NBSP + "(" + TrackDirections[trackDir] + ")";
}
// altitude (input: alt in feet)
// brief will always show either Metric or Imperial
function format_altitude_brief(alt, vr, displayUnits) {
var alt_text;
if (alt === null){
return "";
} else if (alt === "ground"){
return "ground";
}
if (displayUnits === "metric") {
alt_text = Math.round(alt / 3.2828) + NBSP; // Altitude to meters
} else {
alt_text = Math.round(alt) + NBSP;
}
// Vertical Rate Triangle
if (vr > 128){
return alt_text + UP_TRIANGLE;
} else if (vr < -128){
return alt_text + DOWN_TRIANGLE;
} else {
return alt_text + NBSP;
}
}
// alt in ft
function _alt_to_unit(alt, displayUnits) {
var unitLabel = get_unit_label("altitude", displayUnits);
if (displayUnits === "metric")
return Math.round(alt / 3.2828) + NBSP + unitLabel;
else
return Math.round(alt) + NBSP + unitLabel;
}
function format_altitude_long(alt, vr, displayUnits) {
var alt_text = "";
if (alt === null) {
return "n/a";
} else if (alt === "ground") {
return "on ground";
}
alt_text = _alt_to_unit(alt, displayUnits);
if (vr > 128) {
return UP_TRIANGLE + NBSP + alt_text;
} else if (vr < -128) {
return DOWN_TRIANGLE + NBSP + alt_text;
} else {
return alt_text;
}
}
//input: speed in kts
function format_speed_brief(speed, displayUnits) {
if (speed === null) {
return "";
}
if (displayUnits === "metric") {
return Math.round(speed * 1.852); // knots to kilometers per hour
} else if (displayUnits === "imperial") {
return Math.round(speed * 1.151); // knots to miles per hour
} else {
return Math.round(speed); // knots
}
}
// speed in kts
function _speed_to_unit(speed, displayUnits) {
var unitLabel = get_unit_label("speed", displayUnits);
if (displayUnits === "metric")
return Math.round(speed * 1.852) + NBSP + unitLabel;
else if (displayUnits === "imperial")
return Math.round(speed * 1.151) + NBSP + unitLabel;
else
return Math.round(speed) + NBSP + unitLabel;
}
function format_speed_long(speed, displayUnits) {
if (speed === null) {
return "n/a";
}
var speed_text = _speed_to_unit(speed, displayUnits);
return speed_text;
}
// dist in meters
function format_distance_brief(dist, displayUnits) {
if (dist === null) {
return "";
}
if (displayUnits === "metric") {
return (dist/1000).toFixed(1); // meters to kilometers
} else if (displayUnits === "imperial") {
return (dist/1609).toFixed(1); // meters to miles
} else {
return (dist/1852).toFixed(1); // meters to nautical miles
}
}
// dist in metres
function _dist_to_unit(dist, displayUnits) {
var unitLabel = get_unit_label("distance", displayUnits);
if (displayUnits === "metric")
return (dist/1000).toFixed(1) + NBSP + unitLabel;
else if (displayUnits === "imperial")
return (dist/1609).toFixed(1) + NBSP + unitLabel;
else
return (dist/1852).toFixed(1) + NBSP + unitLabel;
}
function format_distance_long(dist, displayUnits) {
if (dist === null) {
return "n/a";
}
var dist_text = _dist_to_unit(dist, displayUnits);
return dist_text;
}
// rate in ft/min
function format_vert_rate_brief(rate, displayUnits) {
if (rate === null) {
return "";
}
if (displayUnits === "metric") {
return (rate/196.85).toFixed(1); // ft/min to m/s
} else {
return Math.round(rate);
}
}
// p is a [lon, lat] coordinate
function format_latlng(p) {
return p[1].toFixed(3) + DEGREES + "," + NBSP + p[0].toFixed(3) + DEGREES;
}
function format_data_source(source) {
switch (source) {
case 'mlat':
return "MLAT";
case 'adsb':
return "ADSB";
case 'mode_s':
return "Mode S";
case 'mode_ac':
return "Mode A/C";
}
return "";
}