Merge branch 'master' into new-state
[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_1;
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;
29         public boolean  last;
30         public boolean  valid;
31
32         public void update_state(AltosState state) {
33                 switch (cmd) {
34                 case AltosLib.AO_LOG_CONFIG_VERSION:
35                         break;
36                 case AltosLib.AO_LOG_MAIN_DEPLOY:
37                         break;
38                 case AltosLib.AO_LOG_APOGEE_DELAY:
39                         break;
40                 case AltosLib.AO_LOG_RADIO_CHANNEL:
41                         break;
42                 case AltosLib.AO_LOG_CALLSIGN:
43                         state.callsign = data;
44                         break;
45                 case AltosLib.AO_LOG_ACCEL_CAL:
46                         state.set_accel_g(config_a, config_b);
47                         break;
48                 case AltosLib.AO_LOG_RADIO_CAL:
49                         break;
50                 case AltosLib.AO_LOG_MANUFACTURER:
51                         break;
52                 case AltosLib.AO_LOG_PRODUCT:
53                         break;
54                 case AltosLib.AO_LOG_LOG_FORMAT:
55                         state.log_format = config_a;
56                         break;
57                 case AltosLib.AO_LOG_SERIAL_NUMBER:
58                         state.set_serial(config_a);
59                         break;
60                 case AltosLib.AO_LOG_BARO_RESERVED:
61                         state.make_baro();
62                         state.baro.reserved = config_a;
63                         break;
64                 case AltosLib.AO_LOG_BARO_SENS:
65                         state.make_baro();
66                         state.baro.sens = config_a;
67                         break;
68                 case AltosLib.AO_LOG_BARO_OFF:
69                         state.make_baro();
70                         state.baro.off = config_a;
71                         break;
72                 case AltosLib.AO_LOG_BARO_TCS:
73                         state.make_baro();
74                         state.baro.tcs = config_a;
75                         break;
76                 case AltosLib.AO_LOG_BARO_TCO:
77                         state.make_baro();
78                         state.baro.tco = config_a;
79                         break;
80                 case AltosLib.AO_LOG_BARO_TREF:
81                         state.make_baro();
82                         state.baro.tref = config_a;
83                         break;
84                 case AltosLib.AO_LOG_BARO_TEMPSENS:
85                         state.make_baro();
86                         state.baro.tempsens = config_a;
87                         break;
88                 case AltosLib.AO_LOG_BARO_CRC:
89                         state.make_baro();
90                         state.baro.crc = config_a;
91                         break;
92                 case AltosLib.AO_LOG_SOFTWARE_VERSION:
93                         break;
94                 }
95         }
96
97         public void write(PrintStream out) {
98                 switch (cmd) {
99                 case AltosLib.AO_LOG_CONFIG_VERSION:
100                         out.printf("# Config version: %s\n", data);
101                         break;
102                 case AltosLib.AO_LOG_MAIN_DEPLOY:
103                         out.printf("# Main deploy: %s\n", config_a);
104                         break;
105                 case AltosLib.AO_LOG_APOGEE_DELAY:
106                         out.printf("# Apogee delay: %s\n", config_a);
107                         break;
108                 case AltosLib.AO_LOG_RADIO_CHANNEL:
109                         out.printf("# Radio channel: %s\n", config_a);
110                         break;
111                 case AltosLib.AO_LOG_CALLSIGN:
112                         out.printf("# Callsign: %s\n", data);
113                         break;
114                 case AltosLib.AO_LOG_ACCEL_CAL:
115                         out.printf ("# Accel cal: %d %d\n", config_a, config_b);
116                         break;
117                 case AltosLib.AO_LOG_RADIO_CAL:
118                         out.printf ("# Radio cal: %d\n", config_a);
119                         break;
120                 case AltosLib.AO_LOG_MAX_FLIGHT_LOG:
121                         out.printf ("# Max flight log: %d\n", config_a);
122                         break;
123                 case AltosLib.AO_LOG_MANUFACTURER:
124                         out.printf ("# Manufacturer: %s\n", data);
125                         break;
126                 case AltosLib.AO_LOG_PRODUCT:
127                         out.printf ("# Product: %s\n", data);
128                         break;
129                 case AltosLib.AO_LOG_SERIAL_NUMBER:
130                         out.printf ("# Serial number: %d\n", config_a);
131                         break;
132                 case AltosLib.AO_LOG_SOFTWARE_VERSION:
133                         out.printf ("# Software version: %s\n", data);
134                         break;
135                 case AltosLib.AO_LOG_BARO_RESERVED:
136                         out.printf ("# Baro reserved: %d\n", config_a);
137                         break;
138                 case AltosLib.AO_LOG_BARO_SENS:
139                         out.printf ("# Baro sens: %d\n", config_a);
140                         break;
141                 case AltosLib.AO_LOG_BARO_OFF:
142                         out.printf ("# Baro off: %d\n", config_a);
143                         break;
144                 case AltosLib.AO_LOG_BARO_TCS:
145                         out.printf ("# Baro tcs: %d\n", config_a);
146                         break;
147                 case AltosLib.AO_LOG_BARO_TCO:
148                         out.printf ("# Baro tco: %d\n", config_a);
149                         break;
150                 case AltosLib.AO_LOG_BARO_TREF:
151                         out.printf ("# Baro tref: %d\n", config_a);
152                         break;
153                 case AltosLib.AO_LOG_BARO_TEMPSENS:
154                         out.printf ("# Baro tempsens: %d\n", config_a);
155                         break;
156                 case AltosLib.AO_LOG_BARO_CRC:
157                         out.printf ("# Baro crc: %d\n", config_a);
158                         break;
159                 }
160         }
161         
162         public AltosEepromHeader (String[] tokens) {
163                 last = false;
164                 valid = true;
165                 try {
166                         if (tokens[0].equals("Config") && tokens[1].equals("version:")) {
167                                 cmd = AltosLib.AO_LOG_CONFIG_VERSION;
168                                 data = tokens[2];
169                         } else if (tokens[0].equals("Main") && tokens[1].equals("deploy:")) {
170                                 cmd = AltosLib.AO_LOG_MAIN_DEPLOY;
171                                 config_a = Integer.parseInt(tokens[2]);
172                         } else if (tokens[0].equals("Apogee") && tokens[1].equals("delay:")) {
173                                 cmd = AltosLib.AO_LOG_APOGEE_DELAY;
174                                 config_a = Integer.parseInt(tokens[2]);
175                         } else if (tokens[0].equals("Radio") && tokens[1].equals("channel:")) {
176                                 cmd = AltosLib.AO_LOG_RADIO_CHANNEL;
177                                 config_a = Integer.parseInt(tokens[2]);
178                         } else if (tokens[0].equals("Callsign:")) {
179                                 cmd = AltosLib.AO_LOG_CALLSIGN;
180                                 data = tokens[1].replaceAll("\"","");
181                         } else if (tokens[0].equals("Accel") && tokens[1].equals("cal")) {
182                                 cmd = AltosLib.AO_LOG_ACCEL_CAL;
183                                 config_a = Integer.parseInt(tokens[3]);
184                                 config_b = Integer.parseInt(tokens[5]);
185                         } else if (tokens[0].equals("Radio") && tokens[1].equals("cal:")) {
186                                 cmd = AltosLib.AO_LOG_RADIO_CAL;
187                                 config_a = Integer.parseInt(tokens[2]);
188                         } else if (tokens[0].equals("Max") && tokens[1].equals("flight") && tokens[2].equals("log:")) {
189                                 cmd = AltosLib.AO_LOG_MAX_FLIGHT_LOG;
190                                 config_a = Integer.parseInt(tokens[3]);
191                         } else if (tokens[0].equals("manufacturer")) {
192                                 cmd = AltosLib.AO_LOG_MANUFACTURER;
193                                 data = tokens[1];
194                         } else if (tokens[0].equals("product")) {
195                                 cmd = AltosLib.AO_LOG_PRODUCT;
196                                 data = tokens[1];
197                         } else if (tokens[0].equals("serial-number")) {
198                                 cmd = AltosLib.AO_LOG_SERIAL_NUMBER;
199                                 config_a = Integer.parseInt(tokens[1]);
200                         } else if (tokens[0].equals("log-format")) {
201                                 cmd = AltosLib.AO_LOG_LOG_FORMAT;
202                                 config_a = Integer.parseInt(tokens[1]);
203                         } else if (tokens[0].equals("software-version")) {
204                                 cmd = AltosLib.AO_LOG_SOFTWARE_VERSION;
205                                 data = tokens[1];
206                                 last = true;
207                         } else if (tokens[0].equals("ms5607")) {
208                                 if (tokens[1].equals("reserved:")) {
209                                         cmd = AltosLib.AO_LOG_BARO_RESERVED;
210                                         config_a = Integer.parseInt(tokens[2]);
211                                 } else if (tokens[1].equals("sens:")) {
212                                         cmd = AltosLib.AO_LOG_BARO_SENS;
213                                         config_a = Integer.parseInt(tokens[2]);
214                                 } else if (tokens[1].equals("off:")) {
215                                         cmd = AltosLib.AO_LOG_BARO_OFF;
216                                         config_a = Integer.parseInt(tokens[2]);
217                                 } else if (tokens[1].equals("tcs:")) {
218                                         cmd = AltosLib.AO_LOG_BARO_TCS;
219                                         config_a = Integer.parseInt(tokens[2]);
220                                 } else if (tokens[1].equals("tco:")) {
221                                         cmd = AltosLib.AO_LOG_BARO_TCO;
222                                         config_a = Integer.parseInt(tokens[2]);
223                                 } else if (tokens[1].equals("tref:")) {
224                                         cmd = AltosLib.AO_LOG_BARO_TREF;
225                                         config_a = Integer.parseInt(tokens[2]);
226                                 } else if (tokens[1].equals("tempsens:")) {
227                                         cmd = AltosLib.AO_LOG_BARO_TEMPSENS;
228                                         config_a = Integer.parseInt(tokens[2]);
229                                 } else if (tokens[1].equals("crc:")) {
230                                         cmd = AltosLib.AO_LOG_BARO_CRC;
231                                         config_a = Integer.parseInt(tokens[2]);
232                                 } else {
233                                         cmd = AltosLib.AO_LOG_INVALID;
234                                         data = tokens[2];
235                                 }
236                         } else
237                                 valid = false;
238                 } catch (Exception e) {
239                         valid = false;
240                 }
241         }
242
243         static public LinkedList<AltosEeprom> read(FileInputStream input) {
244                 LinkedList<AltosEeprom> headers = new LinkedList<AltosEeprom>();
245
246                 for (;;) {
247                         try {
248                                 String line = AltosLib.gets(input);
249                                 if (line == null)
250                                         break;
251                                 AltosEepromHeader header = new AltosEepromHeader(line);
252                                 headers.add(header);
253                                 if (header.last)
254                                         break;
255                         } catch (IOException ie) {
256                                 break;
257                         }
258                 }
259
260                 return headers;
261         }
262
263         static public void write (PrintStream out, LinkedList<AltosEepromHeader> headers) {
264                 out.printf("# Comments\n");
265                 for (AltosEepromHeader header : headers) {
266                         header.write(out);
267                 }
268                 
269         }
270
271         public AltosEepromHeader (String line) {
272                 this(line.split("\\s+"));
273         }
274 }