1664dc95ec5eac1df082b7a57b86e612c1a7839c
[fw/altos] / altoslib / AltosEepromFile.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_4;
19
20 import java.io.*;
21 import java.util.*;
22 import java.text.*;
23
24 class AltosEepromIterator implements Iterator<AltosState> {
25         AltosState              state;
26         Iterator<AltosEeprom>   body;
27         AltosEeprom             next;
28         boolean                 seen;
29
30         public boolean hasNext() {
31                 return !seen || body.hasNext();
32         }
33
34         public AltosState next() {
35                 if (seen) {
36                         AltosState      n = state.clone();
37                         AltosEeprom     e = body.next();
38
39                         e.update_state(n);
40                         state = n;
41                 }
42                 seen = true;
43                 return state;
44         }
45
46         public void remove () {
47         }
48
49         public AltosEepromIterator(AltosState start, Iterator<AltosEeprom> body) {
50                 this.state = start;
51                 this.body = body;
52                 this.seen = false;
53         }
54 }
55
56 public class AltosEepromFile extends AltosStateIterable {
57
58         AltosEepromIterable     headers;
59         AltosEepromIterable     body;
60         AltosState              start;
61
62         public void write_comments(PrintStream out) {
63                 headers.write(out);
64         }
65
66         public void write(PrintStream out) {
67                 headers.write(out);
68                 body.write(out);
69         }
70
71         public AltosEepromFile(FileInputStream input) {
72                 headers = new AltosEepromIterable(AltosEepromHeader.read(input));
73
74                 start = headers.state();
75                 start.set_state(AltosLib.ao_flight_pad);
76
77                 if (start.log_format == AltosLib.MISSING) {
78                         if (start.product != null) {
79                                 if (start.product.startsWith("TeleMetrum"))
80                                         start.log_format = AltosLib.AO_LOG_FORMAT_FULL;
81                                 else if (start.product.startsWith("TeleMini"))
82                                         start.log_format = AltosLib.AO_LOG_FORMAT_TINY;
83                         }
84                 }
85
86                 switch (start.log_format) {
87                 case AltosLib.AO_LOG_FORMAT_FULL:
88                         body = new AltosEepromIterable(AltosEepromTM.read(input));
89                         break;
90                 case AltosLib.AO_LOG_FORMAT_TINY:
91                         body = new AltosEepromIterable(AltosEepromTm.read(input));
92                         break;
93                 case AltosLib.AO_LOG_FORMAT_TELEMETRY:
94                 case AltosLib.AO_LOG_FORMAT_TELESCIENCE:
95                 case AltosLib.AO_LOG_FORMAT_TELEMEGA:
96                         body = new AltosEepromIterable(AltosEepromMega.read(input));
97                         break;
98                 case AltosLib.AO_LOG_FORMAT_TELEMETRUM:
99                         body = new AltosEepromIterable(AltosEepromMetrum2.read(input));
100                         break;
101                 case AltosLib.AO_LOG_FORMAT_TELEMINI:
102                 case AltosLib.AO_LOG_FORMAT_EASYMINI:
103                         body = new AltosEepromIterable(AltosEepromMini.read(input));
104                         break;
105                 default:
106                         body = new AltosEepromIterable(new LinkedList<AltosEeprom>());
107                         break;
108                 }
109
110                 /* Find boost tick */
111                 AltosState      state = start.clone();
112                 for (AltosEeprom eeprom : body) {
113                         eeprom.update_state(state);
114                         state.finish_update();
115                         if (state.state >= AltosLib.ao_flight_boost) {
116                                 start.set_boost_tick(state.tick);
117                                 break;
118                         }
119                 }
120         }
121
122         public Iterator<AltosState> iterator() {
123                 AltosState              state = start.clone();
124                 Iterator<AltosEeprom>   i = body.iterator();
125
126                 while (i.hasNext() && !state.valid()) {
127                         i.next().update_state(state);
128                         state.finish_update();
129                 }
130                 return new AltosEepromIterator(state, i);
131         }
132 }