altosui: Add support for telemetry version 4
[fw/altos] / altosui / AltosEepromBlock.java
1 /*
2  * Copyright © 2011 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 altosui;
19
20 import java.awt.*;
21 import java.awt.event.*;
22 import javax.swing.*;
23 import javax.swing.filechooser.FileNameExtensionFilter;
24 import javax.swing.table.*;
25 import java.io.*;
26 import java.util.*;
27 import java.text.*;
28 import java.util.prefs.*;
29 import java.util.concurrent.*;
30 import java.lang.reflect.Array;
31
32 import libaltosJNI.*;
33
34 public class AltosEepromBlock extends ArrayList<AltosEepromRecord> {
35         boolean has_flight;
36         int     flight;
37         boolean has_state;
38         int     state;
39         boolean has_date;
40         int     year, month, day;
41         boolean has_lat;
42         double  lat;
43         boolean has_lon;
44         double  lon;
45         boolean has_time;
46         int     hour, minute, second;
47         ParseException  parse_exception = null;
48
49         public AltosEepromBlock (AltosSerial serial_line, int block) throws TimeoutException, InterruptedException {
50                 int     addr;
51                 boolean done = false;
52
53                 has_flight = false;
54                 has_state = false;
55                 has_date = false;
56                 has_lat = false;
57                 has_lon = false;
58                 has_time = false;
59                 serial_line.printf("e %x\n", block);
60                 for (addr = 0; addr < 0x100;) {
61                         try {
62                                 AltosEepromRecord r = new AltosEepromRecord(serial_line, block * 256 + addr);
63
64                                 if (r.cmd == Altos.AO_LOG_FLIGHT) {
65                                         flight = r.b;
66                                         has_flight = true;
67                                 }
68
69                                 /* Monitor state transitions to update display */
70                                 if (r.cmd == Altos.AO_LOG_STATE && r.a <= Altos.ao_flight_landed) {
71                                         if (!has_state || r.a > state) {
72                                                 state = r.a;
73                                                 has_state = true;
74                                         }
75                                 }
76
77                                 if (r.cmd == Altos.AO_LOG_GPS_DATE) {
78                                         year = 2000 + (r.a & 0xff);
79                                         month = (r.a >> 8) & 0xff;
80                                         day = (r.b & 0xff);
81                                         has_date = true;
82                                 }
83                                 if (r.cmd == Altos.AO_LOG_GPS_TIME) {
84                                         hour = (r.a & 0xff);
85                                         minute = (r.a >> 8);
86                                         second = (r.b & 0xff);
87                                         has_time = true;
88                                 }
89                                 if (r.cmd == Altos.AO_LOG_GPS_LAT) {
90                                         lat = (double) (r.a | (r.b << 16)) / 1e7;
91                                         has_lat = true;
92                                 }
93                                 if (r.cmd == Altos.AO_LOG_GPS_LON) {
94                                         lon = (double) (r.a | (r.b << 16)) / 1e7;
95                                         has_lon = true;
96                                 }
97                                 if (!done)
98                                         add(addr / 8, r);
99                                 if (r.cmd == Altos.AO_LOG_STATE && r.a == Altos.ao_flight_landed)
100                                         done = true;
101                         } catch (ParseException pe) {
102                                 AltosEepromRecord       r = new AltosEepromRecord(Altos.AO_LOG_INVALID,
103                                                                                   0, 0, 0);
104                                 if (parse_exception == null)
105                                         parse_exception = pe;
106                                 if (!done)
107                                         add(addr/8, r);
108                         }
109                         addr += 8;
110                 }
111         }
112 }