From b65680b1efd2caaf51c3039091a54da8677bdd63 Mon Sep 17 00:00:00 2001 From: Uskompuf <22492406+Uskompuf@users.noreply.github.com> Date: Wed, 11 May 2022 17:04:44 +1000 Subject: [PATCH 1/3] Fix float --- js/tracker.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/js/tracker.js b/js/tracker.js index e33de67..c7fec15 100644 --- a/js/tracker.js +++ b/js/tracker.js @@ -1389,7 +1389,7 @@ function updateVehicleInfo(vcallsign, newPosition) { '' + 'Path' + ((vehicle.vehicle_type!="car") ? 'Share' : '') + - ((vehicle.vehicle_type!="car" && newPosition.gps_alt > 1000 && vehicle.ascent_rate < 1) ? 'Float' : '') + + ((vehicle.vehicle_type!="car" && newPosition.gps_alt > 5000 && vehicle.ascent_rate < 1 && vehicle.ascent_rate > -1) ? 'Float' : '') + '
' + '
'; //mobile @@ -1401,7 +1401,7 @@ function updateVehicleInfo(vcallsign, newPosition) { '' + 'Path' + ((vehicle.vehicle_type!="car") ? 'Share' : '') + - ((vehicle.vehicle_type!="car" && newPosition.gps_alt > 1000 && vehicle.ascent_rate < 1) ? 'Float' : '') + + ((vehicle.vehicle_type!="car" && newPosition.gps_alt > 5000 && vehicle.ascent_rate < 1 && vehicle.ascent_rate > -1) ? 'Float' : '') + '
' + '
'; var b = '
' + @@ -1498,7 +1498,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(); @@ -1508,7 +1518,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; From 595216fb92cc58feedcc5233968d9dd16a3e578e Mon Sep 17 00:00:00 2001 From: Uskompuf <22492406+Uskompuf@users.noreply.github.com> Date: Wed, 11 May 2022 17:46:18 +1000 Subject: [PATCH 2/3] support unique data fields --- js/format.js | 103 +++++++++++++++++++++----------------------------- js/tracker.js | 38 +++++++++++++++---- 2 files changed, 73 insertions(+), 68 deletions(-) diff --git a/js/format.js b/js/format.js index 9acfc11..4659957 100644 --- a/js/format.js +++ b/js/format.js @@ -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 = {}; @@ -77,66 +109,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; - } + // Automatically add all remaining fields as data excluding excluded fields - // 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; - } - - // 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); diff --git a/js/tracker.js b/js/tracker.js index 116e8ee..7a3cc2a 100644 --- a/js/tracker.js +++ b/js/tracker.js @@ -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", @@ -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; @@ -866,24 +879,33 @@ 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 { + 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]); + } + } + } + + for (var key in data) { + if (!tempArray.includes(key)) { array.push([key, data[key]]); + tempArray.push(key); } } - //array.sort(function(a, b) { - // return a[0].localeCompare(b[0]); - //}); + console.log(array); for(var i = 0, ii = array.length; i < ii; i++) { var k = array[i][0]; // key From 0c42076c89bd0ef6a00fd64510e8ab4072f68a0e Mon Sep 17 00:00:00 2001 From: Uskompuf <22492406+Uskompuf@users.noreply.github.com> Date: Wed, 11 May 2022 18:32:43 +1000 Subject: [PATCH 3/3] partial working max alt aprs filter --- js/format.js | 7 ++++++- js/tracker.js | 10 ++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/js/format.js b/js/format.js index 4659957..a7059f0 100644 --- a/js/format.js +++ b/js/format.js @@ -47,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; } @@ -90,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)); diff --git a/js/tracker.js b/js/tracker.js index 7a3cc2a..c37a592 100644 --- a/js/tracker.js +++ b/js/tracker.js @@ -905,8 +905,6 @@ function habitat_data(jsondata, alternative) { } } - console.log(array); - for(var i = 0, ii = array.length; i < ii; i++) { var k = array[i][0]; // key var v = array[i][1]; // value @@ -3018,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); } @@ -3058,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(""); }, @@ -3099,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() { @@ -3176,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) }