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