Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
103895f
Added initial XDATA parser, with OIF411 support
Jan 8, 2022
c82d143
initial XDATA decoding support
LukePrior Jan 8, 2022
c6c4199
Merge pull request #214 from LukePrior/testing
LukePrior Jan 8, 2022
0364400
Update tracker.js
LukePrior Jan 8, 2022
7eeb217
XDATA + single recovery
LukePrior Jan 8, 2022
8ce279b
Merge pull request #215 from LukePrior/testing
LukePrior Jan 8, 2022
69066b3
single historical working
LukePrior Jan 8, 2022
0c58713
Merge pull request #216 from LukePrior/testing
LukePrior Jan 8, 2022
fc7cc4e
Revert "single historical working"
LukePrior Jan 8, 2022
d57d078
Merge pull request #217 from projecthorus/revert-216-testing
LukePrior Jan 8, 2022
ca6ccde
Initial test of O3 partial pressure calculations
Jan 9, 2022
2efd33a
XDATA fixes
LukePrior Jan 9, 2022
d8a2037
Merge pull request #218 from LukePrior/testing
LukePrior Jan 9, 2022
6265d64
Initial CFH support
LukePrior Jan 9, 2022
9857a31
Merge pull request #219 from LukePrior/testing
LukePrior Jan 9, 2022
98a407f
XDATA COBALD support
LukePrior Jan 10, 2022
a967cca
Merge pull request #220 from LukePrior/testing
LukePrior Jan 10, 2022
295d451
fix multiple xdata
LukePrior Jan 10, 2022
9e8c099
Merge pull request #221 from LukePrior/testing
LukePrior Jan 10, 2022
c0106b5
HEX to Int helper function
LukePrior Jan 10, 2022
7c7a2fe
Merge pull request #222 from LukePrior/testing
LukePrior Jan 10, 2022
573dc84
list all XDATA instruments
LukePrior Jan 10, 2022
5921a8e
Delete predictions button
LukePrior Jan 10, 2022
734dd3f
Split station functions to seperate file + fixes
LukePrior Jan 10, 2022
c60216a
fixes
LukePrior Jan 10, 2022
78bdbde
Merge pull request #223 from LukePrior/testing
LukePrior Jan 10, 2022
cbfbb00
handle single sonde
LukePrior Jan 11, 2022
733755f
Merge pull request #224 from LukePrior/testing
LukePrior Jan 11, 2022
17732bb
xdata updates
LukePrior Jan 11, 2022
6703e90
Merge pull request #225 from LukePrior/testing
LukePrior Jan 11, 2022
df8a5b2
PCFH Support
LukePrior Jan 14, 2022
f021513
Merge pull request #226 from LukePrior/testing
LukePrior Jan 14, 2022
2083b34
typo
LukePrior Jan 14, 2022
fe2d8f7
Merge pull request #227 from LukePrior/testing
LukePrior Jan 14, 2022
a9a7d4e
FLASH-B WIP
LukePrior Jan 14, 2022
a05a9f5
Merge pull request #228 from LukePrior/testing
LukePrior Jan 14, 2022
d51e5be
SKYDEW initial
LukePrior Jan 17, 2022
0167247
Merge pull request #229 from LukePrior/testing
LukePrior Jan 18, 2022
58fa3c1
Fix
LukePrior Jan 18, 2022
88c5d8e
comments
LukePrior Jan 29, 2022
d6ebe6a
Merge branch 'testing' of https://github.com/LukePrior/sondehub-track…
LukePrior Jan 29, 2022
79e3520
Merge pull request #232 from LukePrior/testing
LukePrior Jan 29, 2022
bc7d949
jump to user location
LukePrior Feb 3, 2022
e296912
Merge pull request #234 from LukePrior/testing
LukePrior Feb 3, 2022
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
3 changes: 3 additions & 0 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations -
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge tracker.js >> mobile.js
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge app.js >> mobile.js
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge colour-map.js >> mobile.js
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge xdata.js >> mobile.js
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge station.js >> mobile.js
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge format.js >> mobile.js

#compile plot lib and config
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge _jquery.flot.js >> init_plot.js
Expand Down
2 changes: 1 addition & 1 deletion js/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -860,7 +860,7 @@ $(window).ready(function() {
// open map
$('.nav .home').click();
// pan map to our current location
map.flyTo(new L.LatLng(currentPosition.lat, currentPosition.lon));
map.panTo(new L.LatLng(currentPosition.lat, currentPosition.lon));
} else {
alert("No position available");
}
Expand Down
325 changes: 325 additions & 0 deletions js/format.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,325 @@
/* SondeHub Tracker Format Incoming Data
*
* Author: Luke Prior
*/

function formatData(data, live) {
var response = {};
response.positions = {};
var dataTemp = [];
if (live) { // Websockets
if (!data.length) { // handle single sonde
data = {"entry": data};
}
for (let entry in data) {
var dataTempEntry = {};
var station = data[entry].uploader_callsign;
dataTempEntry.callsign = {};
//check if other stations also received this packet
if (vehicles.hasOwnProperty(data[entry].serial)) {
if (data[entry].datetime == vehicles[data[entry].serial].curr_position.gps_time) {
for (let key in vehicles[data[entry].serial].curr_position.callsign) {
if (vehicles[data[entry].serial].curr_position.callsign.hasOwnProperty(key)) {
if (key != station) {
dataTempEntry.callsign[key] = {};
if (vehicles[data[entry].serial].curr_position.callsign[key].hasOwnProperty("snr")) {
dataTempEntry.callsign[key].snr = vehicles[data[entry].serial].curr_position.callsign[key].snr;
}
if (vehicles[data[entry].serial].curr_position.callsign[key].hasOwnProperty("rssi")) {
dataTempEntry.callsign[key].rssi = vehicles[data[entry].serial].curr_position.callsign[key].rssi;
}
if (vehicles[data[entry].serial].curr_position.callsign[key].hasOwnProperty("frequency")) {
dataTempEntry.callsign[key].frequency = vehicles[data[entry].serial].curr_position.callsign[key].frequency;
}
}
}
}
}
}
dataTempEntry.callsign[station] = {};
if (data[entry].snr) {
dataTempEntry.callsign[station].snr = data[entry].snr;
}
if (data[entry].rssi) {
dataTempEntry.callsign[station].rssi = data[entry].rssi;
}
if (data[entry].frequency) {
dataTempEntry.callsign[station].frequency = data[entry].frequency;
}
dataTempEntry.gps_alt = data[entry].alt;
dataTempEntry.gps_lat = data[entry].lat;
dataTempEntry.gps_lon = data[entry].lon;
if (data[entry].heading) {
dataTempEntry.gps_heading = data[entry].heading;
}
dataTempEntry.gps_time = data[entry].datetime;
dataTempEntry.server_time = data[entry].datetime;
dataTempEntry.vehicle = data[entry].serial;
dataTempEntry.position_id = data[entry].serial + "-" + data[entry].datetime;
dataTempEntry.data = {};
if (data[entry].batt) {
dataTempEntry.data.batt = data[entry].batt;
}
if (data[entry].burst_timer) {
dataTempEntry.data.burst_timer = data[entry].burst_timer;
}
if (data[entry].frequency) {
dataTempEntry.data.frequency = data[entry].frequency;
}
if (data[entry].tx_frequency) {
dataTempEntry.data.frequency_tx = data[entry].tx_frequency;
}
if (data[entry].hasOwnProperty("humidity")) {
dataTempEntry.data.humidity = data[entry].humidity;
}
if (data[entry].manufacturer) {
dataTempEntry.data.manufacturer = data[entry].manufacturer;
}
if (data[entry].hasOwnProperty("pressure")) {
dataTempEntry.data.pressure = data[entry].pressure;
}
if (data[entry].sats) {
dataTempEntry.data.sats = data[entry].sats;
}
if (data[entry].hasOwnProperty("temp")) {
dataTempEntry.data.temperature_external = data[entry].temp;
}
if (data[entry].type) {
dataTempEntry.data.type = data[entry].type;
dataTempEntry.type = data[entry].type;
}
if (data[entry].subtype) {
dataTempEntry.data.type = data[entry].subtype;
dataTempEntry.type = data[entry].subtype;
}
if (data[entry].xdata) {
dataTempEntry.data.xdata = data[entry].xdata;

if (data[entry].hasOwnProperty("pressure")) {
xdata_pressure = data[entry].pressure;
} else {
xdata_pressure = 1100.0;
}

var tempXDATA = parseXDATA(data[entry].xdata, xdata_pressure);
for (let field in tempXDATA) {
if (tempXDATA.hasOwnProperty(field)) {
if (field == "xdata_instrument") {
dataTempEntry.data.xdata_instrument = tempXDATA.xdata_instrument.join(', ');
} else {
dataTempEntry.data[field] = tempXDATA[field];
}
}
}
}
if (data[entry].serial.toLowerCase() != "xxxxxxxx") {
dataTemp.push(dataTempEntry);
}
}
} else if (data.length == null) { // Elasticsearch
for (let key in data) {
if (data.hasOwnProperty(key)) {
if (typeof data[key] === 'object') {
for (let i in data[key]) {
var dataTempEntry = {};
var station = data[key][i].uploader_callsign;
dataTempEntry.callsign = {};
dataTempEntry.callsign[station] = {};
if (data[key][i].snr) {
dataTempEntry.callsign[station].snr = data[key][i].snr;
}
if (data[key][i].rssi) {
dataTempEntry.callsign[station].rssi = data[key][i].rssi;
}
if (data[key][i].frequency) {
dataTempEntry.callsign[station].frequency = data[key][i].frequency;
}
dataTempEntry.gps_alt = data[key][i].alt;
dataTempEntry.gps_lat = data[key][i].lat;
dataTempEntry.gps_lon = data[key][i].lon;
if (data[key][i].heading) {
dataTempEntry.gps_heading = data[key][i].heading;
}
dataTempEntry.gps_time = data[key][i].datetime;
dataTempEntry.server_time = data[key][i].datetime;
dataTempEntry.vehicle = data[key][i].serial;
dataTempEntry.position_id = data[key][i].serial + "-" + data[key][i].datetime;
dataTempEntry.data = {};
if (data[key][i].batt) {
dataTempEntry.data.batt = data[key][i].batt;
}
if (data[key][i].burst_timer) {
dataTempEntry.data.burst_timer = data[key][i].burst_timer;
}
if (data[key][i].frequency) {
dataTempEntry.data.frequency = data[key][i].frequency;
}
if (data[key][i].tx_frequency) {
dataTempEntry.data.frequency_tx = data[key][i].tx_frequency;
}
if (data[key][i].hasOwnProperty("humidity")) {
dataTempEntry.data.humidity = data[key][i].humidity;
}
if (data[key][i].manufacturer) {
dataTempEntry.data.manufacturer = data[key][i].manufacturer;
}
if (data[key][i].hasOwnProperty("pressure")) {
dataTempEntry.data.pressure = data[key][i].pressure;
}
if (data[key][i].sats) {
dataTempEntry.data.sats = data[key][i].sats;
}
if (data[key][i].hasOwnProperty("temp")) {
dataTempEntry.data.temperature_external = data[key][i].temp;
}
if (data[key][i].type) {
dataTempEntry.data.type = data[key][i].type;
dataTempEntry.type = data[key][i].type;
}
if (data[key][i].subtype) {
dataTempEntry.data.type = data[key][i].subtype;
dataTempEntry.type = data[key][i].subtype;
}
if (data[key][i].xdata) {
dataTempEntry.data.xdata = data[key][i].xdata;
if (data[key][i].hasOwnProperty("pressure")) {
xdata_pressure = data[key][i].pressure;
} else {
xdata_pressure = 1100.0;
}
var tempXDATA = parseXDATA(data[key][i].xdata, xdata_pressure);
for (let field in tempXDATA) {
if (tempXDATA.hasOwnProperty(field)) {
if (field == "xdata_instrument") {
dataTempEntry.data.xdata_instrument = tempXDATA.xdata_instrument.join(', ');
} else {
dataTempEntry.data[field] = tempXDATA[field];
}
}
}
}
if (data[key][i].serial.toLowerCase() != "xxxxxxxx") {
dataTemp.push(dataTempEntry);
}
}
}
}
}
} else { // AWS
for (var i = data.length - 1; i >= 0; i--) {
if (data[i].hasOwnProperty('subtype') && data[i].subtype == "SondehubV1") { // SondeHub V1
var dataTempEntry = {};
var station = data[i].uploader_callsign;
dataTempEntry.callsign = {};
dataTempEntry.callsign[station] = {};
dataTempEntry.gps_alt = parseFloat(data[i].alt);
dataTempEntry.gps_lat = parseFloat(data[i].lat);
dataTempEntry.gps_lon = parseFloat(data[i].lon);
dataTempEntry.gps_time = data[i].time_received;
dataTempEntry.server_time = data[i].time_received;
dataTempEntry.vehicle = data[i].serial;
dataTempEntry.position_id = data[i].serial + "-" + data[i].time_received;
dataTempEntry.data = {};
if (data[i].humidity) {
dataTempEntry.data.humidity = parseFloat(data[i].humidity);
}
if (data[i].temp) {
dataTempEntry.data.temperature_external = parseFloat(data[i].temp);
}
dataTemp.push(dataTempEntry);
} else { // SondeHub V2
var dataTempEntry = {};
var station = data[i].uploader_callsign;
dataTempEntry.callsign = {};
dataTempEntry.callsign[station] = {};
if (data[i].snr) {
dataTempEntry.callsign[station].snr = data[i].snr;
}
if (data[i].rssi) {
dataTempEntry.callsign[station].rssi = data[i].rssi;
}
if (data[i].frequency) {
dataTempEntry.callsign[station].frequency = data[i].frequency;
}
dataTempEntry.gps_alt = data[i].alt;
dataTempEntry.gps_lat = data[i].lat;
dataTempEntry.gps_lon = data[i].lon;
if (data[i].heading) {
dataTempEntry.gps_heading = data[i].heading;
}
dataTempEntry.gps_time = data[i].datetime;
dataTempEntry.server_time = data[i].datetime;
dataTempEntry.vehicle = data[i].serial;
dataTempEntry.position_id = data[i].serial + "-" + data[i].datetime;
dataTempEntry.data = {};
if (data[i].batt) {
dataTempEntry.data.batt = data[i].batt;
}
if (data[i].burst_timer) {
dataTempEntry.data.burst_timer = data[i].burst_timer;
}
if (data[i].frequency) {
dataTempEntry.data.frequency = data[i].frequency;
}
if (data[i].tx_frequency) {
dataTempEntry.data.frequency_tx = data[i].tx_frequency;
}
if (data[i].hasOwnProperty("humidity")) {
dataTempEntry.data.humidity = data[i].humidity;
}
if (data[i].manufacturer) {
dataTempEntry.data.manufacturer = data[i].manufacturer;
}
if (data[i].hasOwnProperty("pressure")) {
dataTempEntry.data.pressure = data[i].pressure;
}
if (data[i].sats) {
dataTempEntry.data.sats = data[i].sats;
}
if (data[i].hasOwnProperty("temp")) {
dataTempEntry.data.temperature_external = data[i].temp;
}
if (data[i].type && data[i].type == "payload_telemetry") { // SondeHub V1.5 data?
var comment = data[i].comment.split(" ");
if (v1types.hasOwnProperty(comment[0])) {
dataTempEntry.data.type = v1types[comment[0]];
dataTempEntry.type = v1types[comment[0]];
if (v1manufacturers.hasOwnProperty(dataTempEntry.type)) {
dataTempEntry.data.manufacturer = v1manufacturers[dataTempEntry.type];
}
}
dataTempEntry.data.frequency = comment[2];
} else if (data[i].type) {
dataTempEntry.data.type = data[i].type;
dataTempEntry.type = data[i].type;
}
if (data[i].subtype) {
dataTempEntry.data.type = data[i].subtype;
dataTempEntry.type = data[i].subtype;
}
if (data[i].xdata) {
dataTempEntry.data.xdata = data[i].xdata;
if (data[i].hasOwnProperty("pressure")) {
xdata_pressure = data[i].pressure;
} else {
xdata_pressure = 1100.0;
}
var tempXDATA = parseXDATA(data[i].xdata, xdata_pressure);
for (let field in tempXDATA) {
if (tempXDATA.hasOwnProperty(field)) {
if (field == "xdata_instrument") {
dataTempEntry.data.xdata_instrument = tempXDATA.xdata_instrument.join(', ');
} else {
dataTempEntry.data[field] = tempXDATA[field];
}
}
}
}
dataTemp.push(dataTempEntry);
}
}
}
response.positions.position = dataTemp;
response.fetch_timestamp = Date.now();
return response;
}
Loading