e13b42e2df811465faf2c038a828f2d18e5adada
[fw/altos] / ao-tools / altosui / AltosTelemetry.java
1 /*
2  * Copyright © 2010 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; version 2 of the License.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License along
14  * with this program; if not, write to the Free Software Foundation, Inc.,
15  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
16  */
17
18 package altosui;
19
20 import java.lang.*;
21 import java.text.*;
22 import java.util.HashMap;
23 import altosui.AltosConvert;
24 import altosui.AltosGPS;
25
26 /*
27  * Telemetry data contents
28  */
29
30
31 /*
32  * The telemetry data stream is a bit of a mess at present, with no consistent
33  * formatting. In particular, the GPS data is formatted for viewing instead of parsing.
34  * However, the key feature is that every telemetry line contains all of the information
35  * necessary to describe the current rocket state, including the calibration values
36  * for accelerometer and barometer.
37  *
38  * GPS unlocked:
39  *
40  * VERSION 2 CALL KB0G SERIAL  51 FLIGHT     2 RSSI  -68 STATUS ff STATE     pad  1001 \
41  *    a: 16032 p: 21232 t: 20284 v: 25160 d:   204 m:   204 fa: 16038 ga: 16032 fv:       0 \
42  *    fp: 21232 gp: 21230 a+: 16049 a-: 16304 GPS  0 sat unlocked SAT 1   15  30
43  *
44  * GPS locked:
45  *
46  * VERSION 2 CALL KB0G SERIAL  51 FLIGHT     2 RSSI  -71 STATUS ff STATE     pad  2504 \
47  *     a: 16028 p: 21220 t: 20360 v: 25004 d:   208 m:   200 fa: 16031 ga: 16032 fv:     330 \
48  *     fp: 21231 gp: 21230 a+: 16049 a-: 16304 \
49  *     GPS  9 sat 2010-02-13 17:16:51 35°20.0803'N 106°45.2235'W  1790m  \
50  *     0.00m/s(H) 0°     0.00m/s(V) 1.0(hdop)     0(herr)     0(verr) \
51  *     SAT 10   29  30  24  28   5  25  21  20  15  33   1  23  30  24  18  26  10  29   2  26
52  */
53
54 public class AltosTelemetry {
55         int     version;
56         String  callsign;
57         int     serial;
58         int     flight;
59         int     rssi;
60         int     status;
61         String  state;
62         int     tick;
63         int     accel;
64         int     pres;
65         int     temp;
66         int     batt;
67         int     drogue;
68         int     main;
69         int     flight_accel;
70         int     ground_accel;
71         int     flight_vel;
72         int     flight_pres;
73         int     ground_pres;
74         int     accel_plus_g;
75         int     accel_minus_g;
76         AltosGPS        gps;
77
78         public static final int ao_flight_startup = 0;
79         public static final int ao_flight_idle = 1;
80         public static final int ao_flight_pad = 2;
81         public static final int ao_flight_boost = 3;
82         public static final int ao_flight_fast = 4;
83         public static final int ao_flight_coast = 5;
84         public static final int ao_flight_drogue = 6;
85         public static final int ao_flight_main = 7;
86         public static final int ao_flight_landed = 8;
87         public static final int ao_flight_invalid = 9;
88
89         static HashMap<String,Integer>  states = new HashMap<String,Integer>();
90         {
91                 states.put("startup", ao_flight_startup);
92                 states.put("idle", ao_flight_idle);
93                 states.put("pad", ao_flight_pad);
94                 states.put("boost", ao_flight_boost);
95                 states.put("fast", ao_flight_fast);
96                 states.put("coast", ao_flight_coast);
97                 states.put("drogue", ao_flight_drogue);
98                 states.put("main", ao_flight_main);
99                 states.put("landed", ao_flight_landed);
100                 states.put("invalid", ao_flight_invalid);
101         }
102
103         public int state() {
104                 if (states.containsKey(state))
105                         return states.get(state);
106                 return ao_flight_invalid;
107         }
108
109         public double altitude() {
110                 return AltosConvert.cc_pressure_to_altitude(AltosConvert.cc_barometer_to_pressure(pres));
111         }
112
113         public double pad_altitude() {
114                 return AltosConvert.cc_pressure_to_altitude(AltosConvert.cc_barometer_to_pressure(ground_pres));
115         }
116
117         public AltosTelemetry(String line) throws ParseException {
118                 String[] words = line.split("\\s+");
119
120                 int     i = 0;
121
122                 AltosParse.word (words[i++], "VERSION");
123                 version = AltosParse.parse_int(words[i++]);
124
125                 AltosParse.word (words[i++], "CALL");
126                 callsign = words[i++];
127
128                 AltosParse.word (words[i++], "SERIAL");
129                 serial = AltosParse.parse_int(words[i++]);
130
131                 AltosParse.word (words[i++], "FLIGHT");
132                 flight = AltosParse.parse_int(words[i++]);
133
134                 AltosParse.word(words[i++], "RSSI");
135                 rssi = AltosParse.parse_int(words[i++]);
136
137                 AltosParse.word(words[i++], "STATUS");
138                 status = AltosParse.parse_hex(words[i++]);
139
140                 AltosParse.word(words[i++], "STATE");
141                 state = words[i++];
142
143                 tick = AltosParse.parse_int(words[i++]);
144
145                 AltosParse.word(words[i++], "a:");
146                 accel = AltosParse.parse_int(words[i++]);
147
148                 AltosParse.word(words[i++], "p:");
149                 pres = AltosParse.parse_int(words[i++]);
150
151                 AltosParse.word(words[i++], "t:");
152                 temp = AltosParse.parse_int(words[i++]);
153
154                 AltosParse.word(words[i++], "v:");
155                 batt = AltosParse.parse_int(words[i++]);
156
157                 AltosParse.word(words[i++], "d:");
158                 drogue = AltosParse.parse_int(words[i++]);
159
160                 AltosParse.word(words[i++], "m:");
161                 main = AltosParse.parse_int(words[i++]);
162
163                 AltosParse.word(words[i++], "fa:");
164                 flight_accel = AltosParse.parse_int(words[i++]);
165
166                 AltosParse.word(words[i++], "ga:");
167                 ground_accel = AltosParse.parse_int(words[i++]);
168
169                 AltosParse.word(words[i++], "fv:");
170                 flight_vel = AltosParse.parse_int(words[i++]);
171
172                 AltosParse.word(words[i++], "fp:");
173                 flight_pres = AltosParse.parse_int(words[i++]);
174
175                 AltosParse.word(words[i++], "gp:");
176                 ground_pres = AltosParse.parse_int(words[i++]);
177
178                 AltosParse.word(words[i++], "a+:");
179                 accel_plus_g = AltosParse.parse_int(words[i++]);
180
181                 AltosParse.word(words[i++], "a-:");
182                 accel_minus_g = AltosParse.parse_int(words[i++]);
183
184                 gps = new AltosGPS(words, i);
185         }
186 }