Bump Java library versions
[fw/altos] / altoslib / AltosEepromHeader.java
1 /*
2  * Copyright © 2013 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 org.altusmetrum.altoslib_8;
19
20 import java.io.*;
21 import java.util.*;
22 import java.text.*;
23
24 public class AltosEepromHeader extends AltosEeprom {
25
26         public int      cmd;
27         public String   data;
28         public int      config_a, config_b, config_c;
29         public boolean  last;
30         public boolean  valid;
31
32         public int record_length () { return 0; }
33
34         /* XXX pull rest of config data to state */
35         public void update_state(AltosState state) {
36                 switch (cmd) {
37                 case AltosLib.AO_LOG_CONFIG_VERSION:
38                         break;
39                 case AltosLib.AO_LOG_MAIN_DEPLOY:
40                         break;
41                 case AltosLib.AO_LOG_APOGEE_DELAY:
42                         break;
43                 case AltosLib.AO_LOG_RADIO_CHANNEL:
44                         break;
45                 case AltosLib.AO_LOG_CALLSIGN:
46                         state.set_callsign(data);
47                         break;
48                 case AltosLib.AO_LOG_ACCEL_CAL:
49                         state.set_accel_g(config_a, config_b);
50                         break;
51                 case AltosLib.AO_LOG_RADIO_CAL:
52                         break;
53                 case AltosLib.AO_LOG_MANUFACTURER:
54                         break;
55                 case AltosLib.AO_LOG_PRODUCT:
56                         state.product = data;
57                         break;
58                 case AltosLib.AO_LOG_LOG_FORMAT:
59                         state.set_log_format(config_a);
60                         break;
61                 case AltosLib.AO_LOG_SERIAL_NUMBER:
62                         state.set_serial(config_a);
63                         break;
64                 case AltosLib.AO_LOG_BARO_RESERVED:
65                         state.make_baro();
66                         state.baro.reserved = config_a;
67                         break;
68                 case AltosLib.AO_LOG_BARO_SENS:
69                         state.make_baro();
70                         state.baro.sens = config_a;
71                         break;
72                 case AltosLib.AO_LOG_BARO_OFF:
73                         state.make_baro();
74                         state.baro.off = config_a;
75                         break;
76                 case AltosLib.AO_LOG_BARO_TCS:
77                         state.make_baro();
78                         state.baro.tcs = config_a;
79                         break;
80                 case AltosLib.AO_LOG_BARO_TCO:
81                         state.make_baro();
82                         state.baro.tco = config_a;
83                         break;
84                 case AltosLib.AO_LOG_BARO_TREF:
85                         state.make_baro();
86                         state.baro.tref = config_a;
87                         break;
88                 case AltosLib.AO_LOG_BARO_TEMPSENS:
89                         state.make_baro();
90                         state.baro.tempsens = config_a;
91                         break;
92                 case AltosLib.AO_LOG_BARO_CRC:
93                         state.make_baro();
94                         state.baro.crc = config_a;
95                         break;
96                 case AltosLib.AO_LOG_IMU_CAL:
97                         state.set_accel_zero(config_a, config_b, config_c);
98                         break;
99                 case AltosLib.AO_LOG_SOFTWARE_VERSION:
100                         state.set_firmware_version(data);
101                         break;
102                 case AltosLib.AO_LOG_FREQUENCY:
103                 case AltosLib.AO_LOG_APOGEE_LOCKOUT:
104                 case AltosLib.AO_LOG_RADIO_RATE:
105                 case AltosLib.AO_LOG_IGNITE_MODE:
106                         break;
107                 case AltosLib.AO_LOG_PAD_ORIENTATION:
108                         state.set_pad_orientation(config_a);
109                         break;
110                 case AltosLib.AO_LOG_RADIO_ENABLE:
111                 case AltosLib.AO_LOG_AES_KEY:
112                 case AltosLib.AO_LOG_APRS:
113                 case AltosLib.AO_LOG_BEEP_SETTING:
114                 case AltosLib.AO_LOG_TRACKER_SETTING:
115                 case AltosLib.AO_LOG_PYRO_TIME:
116                 case AltosLib.AO_LOG_APRS_ID:
117                         break;
118                 case AltosLib.AO_LOG_ALTITUDE_32:
119                         state.set_altitude_32(config_a);
120                         break;
121                 }
122         }
123
124         public void write(PrintStream out) {
125                 switch (cmd) {
126                 case AltosLib.AO_LOG_CONFIG_VERSION:
127                         out.printf("# Config version: %s\n", data);
128                         break;
129                 case AltosLib.AO_LOG_MAIN_DEPLOY:
130                         out.printf("# Main deploy: %s\n", config_a);
131                         break;
132                 case AltosLib.AO_LOG_APOGEE_DELAY:
133                         out.printf("# Apogee delay: %s\n", config_a);
134                         break;
135                 case AltosLib.AO_LOG_RADIO_CHANNEL:
136                         out.printf("# Radio channel: %s\n", config_a);
137                         break;
138                 case AltosLib.AO_LOG_CALLSIGN:
139                         out.printf("# Callsign: %s\n", data);
140                         break;
141                 case AltosLib.AO_LOG_ACCEL_CAL:
142                         out.printf ("# Accel cal: %d %d\n", config_a, config_b);
143                         break;
144                 case AltosLib.AO_LOG_RADIO_CAL:
145                         out.printf ("# Radio cal: %d\n", config_a);
146                         break;
147                 case AltosLib.AO_LOG_MAX_FLIGHT_LOG:
148                         out.printf ("# Max flight log: %d\n", config_a);
149                         break;
150                 case AltosLib.AO_LOG_MANUFACTURER:
151                         out.printf ("# Manufacturer: %s\n", data);
152                         break;
153                 case AltosLib.AO_LOG_PRODUCT:
154                         out.printf ("# Product: %s\n", data);
155                         break;
156                 case AltosLib.AO_LOG_SERIAL_NUMBER:
157                         out.printf ("# Serial number: %d\n", config_a);
158                         break;
159                 case AltosLib.AO_LOG_SOFTWARE_VERSION:
160                         out.printf ("# Software version: %s\n", data);
161                         break;
162                 case AltosLib.AO_LOG_BARO_RESERVED:
163                         out.printf ("# Baro reserved: %d\n", config_a);
164                         break;
165                 case AltosLib.AO_LOG_BARO_SENS:
166                         out.printf ("# Baro sens: %d\n", config_a);
167                         break;
168                 case AltosLib.AO_LOG_BARO_OFF:
169                         out.printf ("# Baro off: %d\n", config_a);
170                         break;
171                 case AltosLib.AO_LOG_BARO_TCS:
172                         out.printf ("# Baro tcs: %d\n", config_a);
173                         break;
174                 case AltosLib.AO_LOG_BARO_TCO:
175                         out.printf ("# Baro tco: %d\n", config_a);
176                         break;
177                 case AltosLib.AO_LOG_BARO_TREF:
178                         out.printf ("# Baro tref: %d\n", config_a);
179                         break;
180                 case AltosLib.AO_LOG_BARO_TEMPSENS:
181                         out.printf ("# Baro tempsens: %d\n", config_a);
182                         break;
183                 case AltosLib.AO_LOG_BARO_CRC:
184                         out.printf ("# Baro crc: %d\n", config_a);
185                         break;
186                 case AltosLib.AO_LOG_IMU_CAL:
187                         out.printf ("# IMU cal: %d %d %d\n", config_a, config_b, config_c);
188                         break;
189                 case AltosLib.AO_LOG_FREQUENCY:
190                 case AltosLib.AO_LOG_APOGEE_LOCKOUT:
191                 case AltosLib.AO_LOG_RADIO_RATE:
192                 case AltosLib.AO_LOG_IGNITE_MODE:
193                         break;
194                 case AltosLib.AO_LOG_PAD_ORIENTATION:
195                         out.printf("# Pad orientation: %d\n", config_a);
196                         break;
197                 case AltosLib.AO_LOG_RADIO_ENABLE:
198                 case AltosLib.AO_LOG_AES_KEY:
199                 case AltosLib.AO_LOG_APRS:
200                 case AltosLib.AO_LOG_BEEP_SETTING:
201                 case AltosLib.AO_LOG_TRACKER_SETTING:
202                 case AltosLib.AO_LOG_PYRO_TIME:
203                 case AltosLib.AO_LOG_APRS_ID:
204                         break;
205                 case AltosLib.AO_LOG_ALTITUDE_32:
206                         out.printf("# Altitude-32: %d\n", config_a);
207                         break;
208                 }
209         }
210
211         public AltosEepromHeader (String[] tokens) {
212                 last = false;
213                 valid = true;
214                 try {
215                         if (tokens[0].equals("Config") && tokens[1].equals("version:")) {
216                                 cmd = AltosLib.AO_LOG_CONFIG_VERSION;
217                                 data = tokens[2];
218                         } else if (tokens[0].equals("Main") && tokens[1].equals("deploy:")) {
219                                 cmd = AltosLib.AO_LOG_MAIN_DEPLOY;
220                                 config_a = Integer.parseInt(tokens[2]);
221                         } else if (tokens[0].equals("Apogee") && tokens[1].equals("delay:")) {
222                                 cmd = AltosLib.AO_LOG_APOGEE_DELAY;
223                                 config_a = Integer.parseInt(tokens[2]);
224                         } else if (tokens[0].equals("Radio") && tokens[1].equals("channel:")) {
225                                 cmd = AltosLib.AO_LOG_RADIO_CHANNEL;
226                                 config_a = Integer.parseInt(tokens[2]);
227                         } else if (tokens[0].equals("Callsign:")) {
228                                 cmd = AltosLib.AO_LOG_CALLSIGN;
229                                 data = tokens[1].replaceAll("\"","");
230                         } else if (tokens[0].equals("Accel") && tokens[1].equals("cal")) {
231                                 cmd = AltosLib.AO_LOG_ACCEL_CAL;
232                                 config_a = Integer.parseInt(tokens[3]);
233                                 config_b = Integer.parseInt(tokens[5]);
234                         } else if (tokens[0].equals("Radio") && tokens[1].equals("cal:")) {
235                                 cmd = AltosLib.AO_LOG_RADIO_CAL;
236                                 config_a = Integer.parseInt(tokens[2]);
237                         } else if (tokens[0].equals("Max") && tokens[1].equals("flight") && tokens[2].equals("log:")) {
238                                 cmd = AltosLib.AO_LOG_MAX_FLIGHT_LOG;
239                                 config_a = Integer.parseInt(tokens[3]);
240                         } else if (tokens[0].equals("manufacturer")) {
241                                 cmd = AltosLib.AO_LOG_MANUFACTURER;
242                                 data = tokens[1];
243                         } else if (tokens[0].equals("product")) {
244                                 cmd = AltosLib.AO_LOG_PRODUCT;
245                                 data = tokens[1];
246                         } else if (tokens[0].equals("serial-number")) {
247                                 cmd = AltosLib.AO_LOG_SERIAL_NUMBER;
248                                 config_a = Integer.parseInt(tokens[1]);
249                         } else if (tokens[0].equals("log-format")) {
250                                 cmd = AltosLib.AO_LOG_LOG_FORMAT;
251                                 config_a = Integer.parseInt(tokens[1]);
252                         } else if (tokens[0].equals("altitude-32")) {
253                                 cmd = AltosLib.AO_LOG_ALTITUDE_32;
254                                 config_a = Integer.parseInt(tokens[1]);
255                         } else if (tokens[0].equals("software-version")) {
256                                 cmd = AltosLib.AO_LOG_SOFTWARE_VERSION;
257                                 data = tokens[1];
258                                 last = true;
259                         } else if (tokens[0].equals("ms5607")) {
260                                 if (tokens[1].equals("reserved:")) {
261                                         cmd = AltosLib.AO_LOG_BARO_RESERVED;
262                                         config_a = Integer.parseInt(tokens[2]);
263                                 } else if (tokens[1].equals("sens:")) {
264                                         cmd = AltosLib.AO_LOG_BARO_SENS;
265                                         config_a = Integer.parseInt(tokens[2]);
266                                 } else if (tokens[1].equals("off:")) {
267                                         cmd = AltosLib.AO_LOG_BARO_OFF;
268                                         config_a = Integer.parseInt(tokens[2]);
269                                 } else if (tokens[1].equals("tcs:")) {
270                                         cmd = AltosLib.AO_LOG_BARO_TCS;
271                                         config_a = Integer.parseInt(tokens[2]);
272                                 } else if (tokens[1].equals("tco:")) {
273                                         cmd = AltosLib.AO_LOG_BARO_TCO;
274                                         config_a = Integer.parseInt(tokens[2]);
275                                 } else if (tokens[1].equals("tref:")) {
276                                         cmd = AltosLib.AO_LOG_BARO_TREF;
277                                         config_a = Integer.parseInt(tokens[2]);
278                                 } else if (tokens[1].equals("tempsens:")) {
279                                         cmd = AltosLib.AO_LOG_BARO_TEMPSENS;
280                                         config_a = Integer.parseInt(tokens[2]);
281                                 } else if (tokens[1].equals("crc:")) {
282                                         cmd = AltosLib.AO_LOG_BARO_CRC;
283                                         config_a = Integer.parseInt(tokens[2]);
284                                 } else {
285                                         cmd = AltosLib.AO_LOG_INVALID;
286                                         data = tokens[2];
287                                 }
288                         } else if (tokens[0].equals("IMU") && tokens[1].equals("cal")) {
289                                 cmd = AltosLib.AO_LOG_IMU_CAL;
290                                 config_a = Integer.parseInt(tokens[3]);
291                                 config_b = Integer.parseInt(tokens[5]);
292                                 config_c = Integer.parseInt(tokens[7]);
293                         } else if (tokens[0].equals("Pad") && tokens[1].equals("orientation:")) {
294                                 cmd = AltosLib.AO_LOG_PAD_ORIENTATION;
295                                 config_a = Integer.parseInt(tokens[2]);
296                         } else
297                                 valid = false;
298                 } catch (Exception e) {
299                         valid = false;
300                 }
301         }
302
303         static public LinkedList<AltosEeprom> read(FileInputStream input) {
304                 LinkedList<AltosEeprom> headers = new LinkedList<AltosEeprom>();
305
306                 for (;;) {
307                         try {
308                                 String line = AltosLib.gets(input);
309                                 if (line == null)
310                                         break;
311                                 AltosEepromHeader header = new AltosEepromHeader(line);
312                                 headers.add(header);
313                                 if (header.last)
314                                         break;
315                         } catch (IOException ie) {
316                                 break;
317                         }
318                 }
319
320                 return headers;
321         }
322
323         static public void write (PrintStream out, LinkedList<AltosEepromHeader> headers) {
324                 out.printf("# Comments\n");
325                 for (AltosEepromHeader header : headers) {
326                         header.write(out);
327                 }
328
329         }
330
331         public AltosEepromHeader (String line) {
332                 this(line.split("\\s+"));
333         }
334 }