f223f3fb99edd3f14c9ae3a71b50c810f3f10c7e
[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
48         public AltosEepromBlock (AltosSerial serial_line, int block) throws TimeoutException, InterruptedException {
49                 int     addr;
50                 boolean done = false;
51
52                 has_flight = false;
53                 has_state = false;
54                 has_date = false;
55                 has_lat = false;
56                 has_lon = false;
57                 has_time = false;
58                 serial_line.printf("e %x\n", block);
59                 for (addr = 0; !done && addr < 0x100;) {
60                         try {
61                                 AltosEepromRecord r = new AltosEepromRecord(serial_line, block * 256 + addr);
62
63                                 if (r.cmd == Altos.AO_LOG_FLIGHT) {
64                                         flight = r.b;
65                                         has_flight = true;
66                                 }
67
68                                 /* Monitor state transitions to update display */
69                                 if (r.cmd == Altos.AO_LOG_STATE && r.a <= Altos.ao_flight_landed) {
70                                         if (!has_state || r.a > state) {
71                                                 state = r.a;
72                                                 has_state = true;
73                                         }
74                                 }
75
76                                 if (r.cmd == Altos.AO_LOG_GPS_DATE) {
77                                         year = 2000 + (r.a & 0xff);
78                                         month = (r.a >> 8) & 0xff;
79                                         day = (r.b & 0xff);
80                                         has_date = true;
81                                 }
82                                 if (r.cmd == Altos.AO_LOG_GPS_TIME) {
83                                         hour = (r.a & 0xff);
84                                         minute = (r.a >> 8);
85                                         second = (r.b & 0xff);
86                                         has_time = true;
87                                 }
88                                 if (r.cmd == Altos.AO_LOG_GPS_LAT) {
89                                         lat = (double) (r.a | (r.b << 16)) / 1e7;
90                                         has_lat = true;
91                                 }
92                                 if (r.cmd == Altos.AO_LOG_GPS_LON) {
93                                         lon = (double) (r.a | (r.b << 16)) / 1e7;
94                                         has_lon = true;
95                                 }
96                                 if (r.cmd == Altos.AO_LOG_STATE && r.a == Altos.ao_flight_landed)
97                                         done = true;
98                                 add(addr / 8, r);
99                         } catch (ParseException pe) {
100                         }
101                         addr += 8;
102                 }
103         }
104 }