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