Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 49 additions & 61 deletions js/format.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,40 @@
/* SondeHub Tracker Format Incoming Data
/* SondeHub Amateur Tracker Format Incoming Data
*
* Author: Luke Prior
*/

var excludedFields = [
"payload_callsign",
"uploader_callsign",
"software_version",
"position",
"user-agent",
"uploaders",
"snr",
"rssi",
"software_name",
"alt",
"lat",
"lon",
"heading",
"datetime",
"payload_callsign",
"path",
"time_received",
"frame",
"uploader_alt",
"uploader_position",
"uploader_radio",
"uploader_antenna",
"raw"
];

var uniqueKeys = {
"batt": {"precision": 2},
"frequency": {"precision": 4},
"tx_frequency": {"precision": 4}
}

function formatData(data) {
var hideAprs = offline.get('opt_hide_aprs');
var response = {};
Expand All @@ -15,7 +47,9 @@ function formatData(data) {
var dataTempEntry = {};
var aprsflag = false;
dataTempEntry.callsign = {};
maximumAltitude = 0;
if (vehicles.hasOwnProperty(data[key][i].payload_callsign)) {
maximumAltitude = vehicles[data[key][i].payload_callsign].max_alt;
if (data[key][i].datetime == vehicles[data[key][i].payload_callsign].curr_position.gps_time) {
dataTempEntry = vehicles[data[key][i].payload_callsign].curr_position;
}
Expand Down Expand Up @@ -58,7 +92,10 @@ function formatData(data) {
}
}
dataTempEntry.gps_alt = parseFloat((data[key][i].alt).toPrecision(8));
if (dataTempEntry.gps_alt < 1500 && aprsflag && !hideAprs) {
if (dataTempEntry.gps_alt > maximumAltitude) {
maximumAltitude = dataTempEntry.gps_alt;
}
if (maximumAltitude < 1500 && aprsflag && !hideAprs) {
continue;
}
dataTempEntry.gps_lat = parseFloat((data[key][i].lat).toPrecision(8));
Expand All @@ -77,66 +114,17 @@ function formatData(data) {
dataTempEntry.data = {};
}

// Cleanup of some fields, limiting precision, formatting. etc.
// Currently this section copies over specific fields. It should be changed
// to initially copy over all fields that have not already been included,
// Then apply formatting to some 'known' fields.

// Fairly common fields
if (data[key][i].hasOwnProperty("batt")) {
dataTempEntry.data.batt = +data[key][i].batt.toFixed(2);
}
if (data[key][i].hasOwnProperty("frequency")) {
dataTempEntry.data.frequency = +data[key][i].frequency.toFixed(4);
}
if (data[key][i].hasOwnProperty("tx_frequency")) {
dataTempEntry.data.frequency_tx = +data[key][i].tx_frequency.toFixed(3);
}
if (data[key][i].hasOwnProperty("humidity")) {
dataTempEntry.data.humidity = data[key][i].humidity;
}
if (data[key][i].hasOwnProperty("pressure")) {
dataTempEntry.data.pressure = data[key][i].pressure;
}
if (data[key][i].hasOwnProperty("sats")) {
dataTempEntry.data.sats = data[key][i].sats;
}
if (data[key][i].hasOwnProperty("temp")) {
dataTempEntry.data.temp = data[key][i].temp;
}
if (data[key][i].hasOwnProperty("comment")) {
dataTempEntry.data.comment = data[key][i].comment;
}

// Horus Binary V2 Fields
if (data[key][i].hasOwnProperty("ascent_rate")) {
// Limit to 1 decimal place.
dataTempEntry.data.ascent_rate = +data[key][i].ascent_rate.toFixed(1);
}
if (data[key][i].hasOwnProperty("ext_pressure")) {
dataTempEntry.data.ext_pressure = data[key][i].ext_pressure;
}
if (data[key][i].hasOwnProperty("ext_humidity")) {
dataTempEntry.data.ext_humidity = data[key][i].ext_humidity;
}
if (data[key][i].hasOwnProperty("ext_temperature")) {
dataTempEntry.data.ext_temperature = data[key][i].ext_temperature;
}

// Horus LoRa Fields
if (data[key][i].hasOwnProperty("pyro_voltage")) {
dataTempEntry.data.pyro_voltage = +data[key][i].pyro_voltage.toFixed(2);
}
if (data[key][i].hasOwnProperty("noise_floor_dbm")) {
dataTempEntry.data.noise_floor_dbm = data[key][i].noise_floor_dbm;
}
if (data[key][i].hasOwnProperty("rx_pkt_count")) {
dataTempEntry.data.rx_pkt_count = data[key][i].rx_pkt_count;
}
// Automatically add all remaining fields as data excluding excluded fields

// Metadata added on by receiver applications.
if (data[key][i].hasOwnProperty("modulation")) {
dataTempEntry.data.modulation = data[key][i].modulation;
for (let field in data[key][i]) {
if (excludedFields.includes(field)) {
continue;
}
if (uniqueKeys.hasOwnProperty(field)) {
dataTempEntry.data[field] = data[key][i][field].toFixed(uniqueKeys[field].precision);
} else {
dataTempEntry.data[field] = data[key][i][field];
}
}

dataTemp.push(dataTempEntry);
Expand Down
64 changes: 47 additions & 17 deletions js/tracker.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ var globalKeys = {
"ext_pressure": "Pressure, External",
"subtype": "Sonde Sub-type",
"frequency": "Frequency",
"frequency_tx": "TX Frequency",
"tx_frequency": "TX Frequency",
"manufacturer": "Manufacturer",
"type": "Sonde Type",
"burst_timer": "Burst Timer",
Expand Down Expand Up @@ -158,11 +158,24 @@ var globalSuffixes = {
"humidity": " %",
"ext_humidity": " %",
"frequency": " MHz",
"frequency_tx": " MHz",
"tx_frequency": " MHz",
"noise_floor_dbm": " dBm",
"spam": ""
};

var keyOrder = [
"ascent_rate",
"batt",
"frequency",
"tx_frequency",
"humidity",
"pressure",
"sats",
"temp",
"comment",
"modulation"
]

// localStorage vars
var ls_receivers = false;
var ls_pred = false;
Expand Down Expand Up @@ -866,24 +879,31 @@ function habitat_data(jsondata, alternative) {

var data = (typeof jsondata === "string") ? $.parseJSON(jsondata) : jsondata;
var array = [];
var tempArray = [];
var output = "";
var txFreq = false

if(Object.keys(data).length === 0) return "";

if ("frequency_tx" in data) {
if ("tx_frequency" in data) {
txFreq = true
}

for(var key in data) {
if (key === "frequency" && txFreq) {} else {
array.push([key, data[key]]);
for (var field in keyOrder) {
if (keyOrder[field] in data) {
if (keyOrder[field] === "frequency" && txFreq) {} else {
array.push([keyOrder[field], data[keyOrder[field]]]);
tempArray.push(keyOrder[field]);
}
}
}

//array.sort(function(a, b) {
// return a[0].localeCompare(b[0]);
//});
for (var key in data) {
if (!tempArray.includes(key)) {
array.push([key, data[key]]);
tempArray.push(key);
}
}

for(var i = 0, ii = array.length; i < ii; i++) {
var k = array[i][0]; // key
Expand Down Expand Up @@ -1404,7 +1424,7 @@ function updateVehicleInfo(vcallsign, newPosition) {
'<img class="'+((vehicle.vehicle_type=="car")?'car':'')+'" src="'+image+'" />' +
'<span class="vbutton path '+((vehicle.polyline_visible) ? 'active' : '')+'" data-vcallsign="'+vcallsign+'"' + ' style="top:'+(vehicle.image_src_size[1]+55)+'px">Path</span>' +
((vehicle.vehicle_type!="car") ? '<span class="sbutton" onclick="shareVehicle(\'' + vcallsign + '\')" style="top:'+(vehicle.image_src_size[1]+85)+'px">Share</span>' : '') +
((vehicle.vehicle_type!="car" && newPosition.gps_alt > 1000 && vehicle.ascent_rate < 1) ? '<span class="sbutton hysplit '+((vehicle.prediction_hysplit_visible) ? 'active' : '')+'" data-vcallsign="' + vcallsign + '" style="top:'+(vehicle.image_src_size[1]+115)+'px">Float</span>' : '') +
((vehicle.vehicle_type!="car" && newPosition.gps_alt > 5000 && vehicle.ascent_rate < 1 && vehicle.ascent_rate > -1) ? '<span class="sbutton hysplit '+((vehicle.prediction_hysplit_visible) ? 'active' : '')+'" data-vcallsign="' + vcallsign + '" style="top:'+(vehicle.image_src_size[1]+115)+'px">Float</span>' : '') +
'<div class="left">' +
'<dl>';
//mobile
Expand All @@ -1416,7 +1436,7 @@ function updateVehicleInfo(vcallsign, newPosition) {
'<img class="'+((vehicle.vehicle_type=="car")?'car':'')+'" src="'+image+'" />' +
'<span class="vbutton path '+((vehicle.polyline_visible) ? 'active' : '')+'" data-vcallsign="'+vcallsign+'"' + ' style="top:55px">Path</span>' +
((vehicle.vehicle_type!="car") ? '<span class="sbutton" onclick="shareVehicle(\'' + vcallsign + '\')" style="top:85px">Share</span>' : '') +
((vehicle.vehicle_type!="car" && newPosition.gps_alt > 1000 && vehicle.ascent_rate < 1) ? '<span class="sbutton hysplit '+((vehicle.prediction_hysplit_visible) ? 'active' : '')+'" data-vcallsign="' + vcallsign + '" style="top:115px">Float</span>' : '') +
((vehicle.vehicle_type!="car" && newPosition.gps_alt > 5000 && vehicle.ascent_rate < 1 && vehicle.ascent_rate > -1) ? '<span class="sbutton hysplit '+((vehicle.prediction_hysplit_visible) ? 'active' : '')+'" data-vcallsign="' + vcallsign + '" style="top:115px">Float</span>' : '') +
'<div class="left">' +
'<dl>';
var b = '</dl>' +
Expand Down Expand Up @@ -1513,7 +1533,17 @@ function createHysplit(callsign, adjustment) {

var altitude = Math.round(vehicle.curr_position.gps_alt) + adjustment;

var endTime = new Date(Date.parse(vehicle.curr_position.gps_time));
var startTime = new Date(Date.parse(vehicle.curr_position.gps_time.replace("Z","")));
//max is 8h back so need to catch is older
var nowTime = new Date();
var timeDifference = nowTime - startTime;
if (timeDifference > 28800000) {
nowTime.setHours(nowTime.getHours() - 8);
startTime = nowTime;
}
startTime = startTime.toISOString();

var endTime = new Date(Date.parse(vehicle.curr_position.gps_time.replace("Z","")));
endTime.setHours(endTime.getHours() + 84);
endTime = endTime.toISOString();

Expand All @@ -1523,7 +1553,7 @@ function createHysplit(callsign, adjustment) {
+ "&launch_latitude=" + vehicle.curr_position.gps_lat
+ "&launch_longitude=" + lon
+ "&launch_altitude=" + (altitude-1)
+ "&launch_datetime=" + vehicle.curr_position.gps_time
+ "&launch_datetime=" + startTime
+ "&ascent_rate=0.1"
+ "&float_altitude=" + altitude
+ "&stop_datetime=" + endTime;
Expand Down Expand Up @@ -2986,7 +3016,7 @@ function refresh() {
if (wvar.query != null && JSON.stringify(data).indexOf(wvar.query) == -1) {
refreshSingle(wvar.query);
} else {
response = formatData(data, false);
response = formatData(data);
update(response, true);
$("#stTimer").attr("data-timestamp", response.fetch_timestamp);
}
Expand Down Expand Up @@ -3026,7 +3056,7 @@ function refreshSingle(serial) {
url: data_url,
dataType: "json",
success: function(data, textStatus) {
response = formatData(data, false);
response = formatData(data);
update(response, true);
$("#stText").text("");
},
Expand Down Expand Up @@ -3067,7 +3097,7 @@ function refreshSingleNew(serial) {
data: data_str,
dataType: "json",
success: function(data, textStatus) {
response = formatData(data, false);
response = formatData(data);
update(response, true);
},
error: function() {
Expand Down Expand Up @@ -3144,7 +3174,7 @@ function liveData() {
var tempDate = new Date(frame[frame.length - 1]["1"].time_received).getTime()
}
if ((dateNow - tempDate) < 30000) {
var test = formatData(frame, true);
var test = formatData(frame);
if (clientActive) {
live_data_buffer.positions.position.push.apply(live_data_buffer.positions.position,test.positions.position)
}
Expand Down