Skip to content

Commit dd4500d

Browse files
LukePriorMark Jessop
andauthored
XDATA & refactor (#233)
* Added initial XDATA parser, with OIF411 support * initial XDATA decoding support * Update tracker.js * XDATA + single recovery * single historical working * Revert "single historical working" * Initial test of O3 partial pressure calculations * XDATA fixes * Initial CFH support * XDATA COBALD support * fix multiple xdata * HEX to Int helper function * list all XDATA instruments * Delete predictions button * Split station functions to seperate file + fixes * fixes * handle single sonde * xdata updates * PCFH Support * typo * FLASH-B WIP * SKYDEW initial * Fix * comments Co-authored-by: Mark Jessop <[email protected]> Co-authored-by: Uskompuf <[email protected]>
1 parent ba538b0 commit dd4500d

File tree

5 files changed

+2215
-1362
lines changed

5 files changed

+2215
-1362
lines changed

build.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations -
2525
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge tracker.js >> mobile.js
2626
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge app.js >> mobile.js
2727
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge colour-map.js >> mobile.js
28+
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge xdata.js >> mobile.js
29+
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge station.js >> mobile.js
30+
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge format.js >> mobile.js
2831

2932
#compile plot lib and config
3033
java -jar "../tools/yuicompressor-2.4.8.jar" --type=js --disable-optimizations --nomunge _jquery.flot.js >> init_plot.js

js/format.js

Lines changed: 325 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,325 @@
1+
/* SondeHub Tracker Format Incoming Data
2+
*
3+
* Author: Luke Prior
4+
*/
5+
6+
function formatData(data, live) {
7+
var response = {};
8+
response.positions = {};
9+
var dataTemp = [];
10+
if (live) { // Websockets
11+
if (!data.length) { // handle single sonde
12+
data = {"entry": data};
13+
}
14+
for (let entry in data) {
15+
var dataTempEntry = {};
16+
var station = data[entry].uploader_callsign;
17+
dataTempEntry.callsign = {};
18+
//check if other stations also received this packet
19+
if (vehicles.hasOwnProperty(data[entry].serial)) {
20+
if (data[entry].datetime == vehicles[data[entry].serial].curr_position.gps_time) {
21+
for (let key in vehicles[data[entry].serial].curr_position.callsign) {
22+
if (vehicles[data[entry].serial].curr_position.callsign.hasOwnProperty(key)) {
23+
if (key != station) {
24+
dataTempEntry.callsign[key] = {};
25+
if (vehicles[data[entry].serial].curr_position.callsign[key].hasOwnProperty("snr")) {
26+
dataTempEntry.callsign[key].snr = vehicles[data[entry].serial].curr_position.callsign[key].snr;
27+
}
28+
if (vehicles[data[entry].serial].curr_position.callsign[key].hasOwnProperty("rssi")) {
29+
dataTempEntry.callsign[key].rssi = vehicles[data[entry].serial].curr_position.callsign[key].rssi;
30+
}
31+
if (vehicles[data[entry].serial].curr_position.callsign[key].hasOwnProperty("frequency")) {
32+
dataTempEntry.callsign[key].frequency = vehicles[data[entry].serial].curr_position.callsign[key].frequency;
33+
}
34+
}
35+
}
36+
}
37+
}
38+
}
39+
dataTempEntry.callsign[station] = {};
40+
if (data[entry].snr) {
41+
dataTempEntry.callsign[station].snr = data[entry].snr;
42+
}
43+
if (data[entry].rssi) {
44+
dataTempEntry.callsign[station].rssi = data[entry].rssi;
45+
}
46+
if (data[entry].frequency) {
47+
dataTempEntry.callsign[station].frequency = data[entry].frequency;
48+
}
49+
dataTempEntry.gps_alt = data[entry].alt;
50+
dataTempEntry.gps_lat = data[entry].lat;
51+
dataTempEntry.gps_lon = data[entry].lon;
52+
if (data[entry].heading) {
53+
dataTempEntry.gps_heading = data[entry].heading;
54+
}
55+
dataTempEntry.gps_time = data[entry].datetime;
56+
dataTempEntry.server_time = data[entry].datetime;
57+
dataTempEntry.vehicle = data[entry].serial;
58+
dataTempEntry.position_id = data[entry].serial + "-" + data[entry].datetime;
59+
dataTempEntry.data = {};
60+
if (data[entry].batt) {
61+
dataTempEntry.data.batt = data[entry].batt;
62+
}
63+
if (data[entry].burst_timer) {
64+
dataTempEntry.data.burst_timer = data[entry].burst_timer;
65+
}
66+
if (data[entry].frequency) {
67+
dataTempEntry.data.frequency = data[entry].frequency;
68+
}
69+
if (data[entry].tx_frequency) {
70+
dataTempEntry.data.frequency_tx = data[entry].tx_frequency;
71+
}
72+
if (data[entry].hasOwnProperty("humidity")) {
73+
dataTempEntry.data.humidity = data[entry].humidity;
74+
}
75+
if (data[entry].manufacturer) {
76+
dataTempEntry.data.manufacturer = data[entry].manufacturer;
77+
}
78+
if (data[entry].hasOwnProperty("pressure")) {
79+
dataTempEntry.data.pressure = data[entry].pressure;
80+
}
81+
if (data[entry].sats) {
82+
dataTempEntry.data.sats = data[entry].sats;
83+
}
84+
if (data[entry].hasOwnProperty("temp")) {
85+
dataTempEntry.data.temperature_external = data[entry].temp;
86+
}
87+
if (data[entry].type) {
88+
dataTempEntry.data.type = data[entry].type;
89+
dataTempEntry.type = data[entry].type;
90+
}
91+
if (data[entry].subtype) {
92+
dataTempEntry.data.type = data[entry].subtype;
93+
dataTempEntry.type = data[entry].subtype;
94+
}
95+
if (data[entry].xdata) {
96+
dataTempEntry.data.xdata = data[entry].xdata;
97+
98+
if (data[entry].hasOwnProperty("pressure")) {
99+
xdata_pressure = data[entry].pressure;
100+
} else {
101+
xdata_pressure = 1100.0;
102+
}
103+
104+
var tempXDATA = parseXDATA(data[entry].xdata, xdata_pressure);
105+
for (let field in tempXDATA) {
106+
if (tempXDATA.hasOwnProperty(field)) {
107+
if (field == "xdata_instrument") {
108+
dataTempEntry.data.xdata_instrument = tempXDATA.xdata_instrument.join(', ');
109+
} else {
110+
dataTempEntry.data[field] = tempXDATA[field];
111+
}
112+
}
113+
}
114+
}
115+
if (data[entry].serial.toLowerCase() != "xxxxxxxx") {
116+
dataTemp.push(dataTempEntry);
117+
}
118+
}
119+
} else if (data.length == null) { // Elasticsearch
120+
for (let key in data) {
121+
if (data.hasOwnProperty(key)) {
122+
if (typeof data[key] === 'object') {
123+
for (let i in data[key]) {
124+
var dataTempEntry = {};
125+
var station = data[key][i].uploader_callsign;
126+
dataTempEntry.callsign = {};
127+
dataTempEntry.callsign[station] = {};
128+
if (data[key][i].snr) {
129+
dataTempEntry.callsign[station].snr = data[key][i].snr;
130+
}
131+
if (data[key][i].rssi) {
132+
dataTempEntry.callsign[station].rssi = data[key][i].rssi;
133+
}
134+
if (data[key][i].frequency) {
135+
dataTempEntry.callsign[station].frequency = data[key][i].frequency;
136+
}
137+
dataTempEntry.gps_alt = data[key][i].alt;
138+
dataTempEntry.gps_lat = data[key][i].lat;
139+
dataTempEntry.gps_lon = data[key][i].lon;
140+
if (data[key][i].heading) {
141+
dataTempEntry.gps_heading = data[key][i].heading;
142+
}
143+
dataTempEntry.gps_time = data[key][i].datetime;
144+
dataTempEntry.server_time = data[key][i].datetime;
145+
dataTempEntry.vehicle = data[key][i].serial;
146+
dataTempEntry.position_id = data[key][i].serial + "-" + data[key][i].datetime;
147+
dataTempEntry.data = {};
148+
if (data[key][i].batt) {
149+
dataTempEntry.data.batt = data[key][i].batt;
150+
}
151+
if (data[key][i].burst_timer) {
152+
dataTempEntry.data.burst_timer = data[key][i].burst_timer;
153+
}
154+
if (data[key][i].frequency) {
155+
dataTempEntry.data.frequency = data[key][i].frequency;
156+
}
157+
if (data[key][i].tx_frequency) {
158+
dataTempEntry.data.frequency_tx = data[key][i].tx_frequency;
159+
}
160+
if (data[key][i].hasOwnProperty("humidity")) {
161+
dataTempEntry.data.humidity = data[key][i].humidity;
162+
}
163+
if (data[key][i].manufacturer) {
164+
dataTempEntry.data.manufacturer = data[key][i].manufacturer;
165+
}
166+
if (data[key][i].hasOwnProperty("pressure")) {
167+
dataTempEntry.data.pressure = data[key][i].pressure;
168+
}
169+
if (data[key][i].sats) {
170+
dataTempEntry.data.sats = data[key][i].sats;
171+
}
172+
if (data[key][i].hasOwnProperty("temp")) {
173+
dataTempEntry.data.temperature_external = data[key][i].temp;
174+
}
175+
if (data[key][i].type) {
176+
dataTempEntry.data.type = data[key][i].type;
177+
dataTempEntry.type = data[key][i].type;
178+
}
179+
if (data[key][i].subtype) {
180+
dataTempEntry.data.type = data[key][i].subtype;
181+
dataTempEntry.type = data[key][i].subtype;
182+
}
183+
if (data[key][i].xdata) {
184+
dataTempEntry.data.xdata = data[key][i].xdata;
185+
if (data[key][i].hasOwnProperty("pressure")) {
186+
xdata_pressure = data[key][i].pressure;
187+
} else {
188+
xdata_pressure = 1100.0;
189+
}
190+
var tempXDATA = parseXDATA(data[key][i].xdata, xdata_pressure);
191+
for (let field in tempXDATA) {
192+
if (tempXDATA.hasOwnProperty(field)) {
193+
if (field == "xdata_instrument") {
194+
dataTempEntry.data.xdata_instrument = tempXDATA.xdata_instrument.join(', ');
195+
} else {
196+
dataTempEntry.data[field] = tempXDATA[field];
197+
}
198+
}
199+
}
200+
}
201+
if (data[key][i].serial.toLowerCase() != "xxxxxxxx") {
202+
dataTemp.push(dataTempEntry);
203+
}
204+
}
205+
}
206+
}
207+
}
208+
} else { // AWS
209+
for (var i = data.length - 1; i >= 0; i--) {
210+
if (data[i].hasOwnProperty('subtype') && data[i].subtype == "SondehubV1") { // SondeHub V1
211+
var dataTempEntry = {};
212+
var station = data[i].uploader_callsign;
213+
dataTempEntry.callsign = {};
214+
dataTempEntry.callsign[station] = {};
215+
dataTempEntry.gps_alt = parseFloat(data[i].alt);
216+
dataTempEntry.gps_lat = parseFloat(data[i].lat);
217+
dataTempEntry.gps_lon = parseFloat(data[i].lon);
218+
dataTempEntry.gps_time = data[i].time_received;
219+
dataTempEntry.server_time = data[i].time_received;
220+
dataTempEntry.vehicle = data[i].serial;
221+
dataTempEntry.position_id = data[i].serial + "-" + data[i].time_received;
222+
dataTempEntry.data = {};
223+
if (data[i].humidity) {
224+
dataTempEntry.data.humidity = parseFloat(data[i].humidity);
225+
}
226+
if (data[i].temp) {
227+
dataTempEntry.data.temperature_external = parseFloat(data[i].temp);
228+
}
229+
dataTemp.push(dataTempEntry);
230+
} else { // SondeHub V2
231+
var dataTempEntry = {};
232+
var station = data[i].uploader_callsign;
233+
dataTempEntry.callsign = {};
234+
dataTempEntry.callsign[station] = {};
235+
if (data[i].snr) {
236+
dataTempEntry.callsign[station].snr = data[i].snr;
237+
}
238+
if (data[i].rssi) {
239+
dataTempEntry.callsign[station].rssi = data[i].rssi;
240+
}
241+
if (data[i].frequency) {
242+
dataTempEntry.callsign[station].frequency = data[i].frequency;
243+
}
244+
dataTempEntry.gps_alt = data[i].alt;
245+
dataTempEntry.gps_lat = data[i].lat;
246+
dataTempEntry.gps_lon = data[i].lon;
247+
if (data[i].heading) {
248+
dataTempEntry.gps_heading = data[i].heading;
249+
}
250+
dataTempEntry.gps_time = data[i].datetime;
251+
dataTempEntry.server_time = data[i].datetime;
252+
dataTempEntry.vehicle = data[i].serial;
253+
dataTempEntry.position_id = data[i].serial + "-" + data[i].datetime;
254+
dataTempEntry.data = {};
255+
if (data[i].batt) {
256+
dataTempEntry.data.batt = data[i].batt;
257+
}
258+
if (data[i].burst_timer) {
259+
dataTempEntry.data.burst_timer = data[i].burst_timer;
260+
}
261+
if (data[i].frequency) {
262+
dataTempEntry.data.frequency = data[i].frequency;
263+
}
264+
if (data[i].tx_frequency) {
265+
dataTempEntry.data.frequency_tx = data[i].tx_frequency;
266+
}
267+
if (data[i].hasOwnProperty("humidity")) {
268+
dataTempEntry.data.humidity = data[i].humidity;
269+
}
270+
if (data[i].manufacturer) {
271+
dataTempEntry.data.manufacturer = data[i].manufacturer;
272+
}
273+
if (data[i].hasOwnProperty("pressure")) {
274+
dataTempEntry.data.pressure = data[i].pressure;
275+
}
276+
if (data[i].sats) {
277+
dataTempEntry.data.sats = data[i].sats;
278+
}
279+
if (data[i].hasOwnProperty("temp")) {
280+
dataTempEntry.data.temperature_external = data[i].temp;
281+
}
282+
if (data[i].type && data[i].type == "payload_telemetry") { // SondeHub V1.5 data?
283+
var comment = data[i].comment.split(" ");
284+
if (v1types.hasOwnProperty(comment[0])) {
285+
dataTempEntry.data.type = v1types[comment[0]];
286+
dataTempEntry.type = v1types[comment[0]];
287+
if (v1manufacturers.hasOwnProperty(dataTempEntry.type)) {
288+
dataTempEntry.data.manufacturer = v1manufacturers[dataTempEntry.type];
289+
}
290+
}
291+
dataTempEntry.data.frequency = comment[2];
292+
} else if (data[i].type) {
293+
dataTempEntry.data.type = data[i].type;
294+
dataTempEntry.type = data[i].type;
295+
}
296+
if (data[i].subtype) {
297+
dataTempEntry.data.type = data[i].subtype;
298+
dataTempEntry.type = data[i].subtype;
299+
}
300+
if (data[i].xdata) {
301+
dataTempEntry.data.xdata = data[i].xdata;
302+
if (data[i].hasOwnProperty("pressure")) {
303+
xdata_pressure = data[i].pressure;
304+
} else {
305+
xdata_pressure = 1100.0;
306+
}
307+
var tempXDATA = parseXDATA(data[i].xdata, xdata_pressure);
308+
for (let field in tempXDATA) {
309+
if (tempXDATA.hasOwnProperty(field)) {
310+
if (field == "xdata_instrument") {
311+
dataTempEntry.data.xdata_instrument = tempXDATA.xdata_instrument.join(', ');
312+
} else {
313+
dataTempEntry.data[field] = tempXDATA[field];
314+
}
315+
}
316+
}
317+
}
318+
dataTemp.push(dataTempEntry);
319+
}
320+
}
321+
}
322+
response.positions.position = dataTemp;
323+
response.fetch_timestamp = Date.now();
324+
return response;
325+
}

0 commit comments

Comments
 (0)