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