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