// -*- 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 ""; }