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