altoslib: Add a 'seconds' method to AltosGPS
[fw/altos] / altosui / AltosPad.java
1 /*
2  * Copyright © 2010 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; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17  */
18
19 package altosui;
20
21 import java.util.*;
22 import org.altusmetrum.altoslib_11.*;
23 import org.altusmetrum.altosuilib_11.*;
24
25 public class AltosPad extends AltosUIFlightTab {
26
27         class Battery extends AltosUIVoltageIndicator {
28                 public double voltage(AltosState state) { return state.battery_voltage; }
29                 public double good() { return AltosLib.ao_battery_good; }
30                 public Battery (AltosUIFlightTab container, int y) { super(container, y, "Battery Voltage", 2); }
31         }
32
33         class Apogee extends AltosUIVoltageIndicator {
34                 public boolean hide(double v) { return v == AltosLib.MISSING; }
35                 public double voltage(AltosState state) { return state.apogee_voltage; }
36                 public double good() { return AltosLib.ao_igniter_good; }
37                 public Apogee (AltosUIFlightTab container, int y) { super(container, y, "Apogee Igniter Voltage", 2); }
38         }
39
40         class Main extends AltosUIVoltageIndicator {
41                 public boolean hide(double v) { return v == AltosLib.MISSING; }
42                 public double voltage(AltosState state) { return state.main_voltage; }
43                 public double good() { return AltosLib.ao_igniter_good; }
44                 public Main (AltosUIFlightTab container, int y) { super(container, y, "Main Igniter Voltage", 2); }
45         }
46
47         class LoggingReady extends AltosUIIndicator {
48                 public void show (AltosState state, AltosListenerState listener_state) {
49                         if (state == null || state.flight == AltosLib.MISSING) {
50                                 hide();
51                         } else {
52                                 if (state.flight != 0) {
53                                         if (state.state() <= Altos.ao_flight_pad)
54                                                 show("Ready to record");
55                                         else if (state.state() < Altos.ao_flight_landed ||
56                                                  state.state() == AltosLib.ao_flight_stateless)
57                                                 show("Recording data");
58                                         else
59                                                 show("Recorded data");
60                                 } else
61                                         show("Storage full");
62                                 set_lights(state.flight != 0);
63                         }
64                 }
65                 public LoggingReady (AltosUIFlightTab container, int y) {
66                         super(container, y, "On-board Data Logging", 1, true, 2);
67                 }
68         }
69
70         class GPSLocked extends AltosUIIndicator {
71                 public void show (AltosState state, AltosListenerState listener_state) {
72                         if (state == null || state.gps == null)
73                                 hide();
74                         else {
75                                 int     sol = state.gps.nsat;
76                                 int     sat = state.gps.cc_gps_sat == null ? 0 : state.gps.cc_gps_sat.length;
77                                 show("%d in solution", sol, "%d in view", sat);
78                                 set_lights(state.gps.locked && sol >= 4);
79                         }
80                 }
81                 public GPSLocked (AltosUIFlightTab container, int y) {
82                         super (container, y, "GPS Locked", 2, true, 1);
83                 }
84         }
85
86         class GPSReady extends AltosUIIndicator {
87                 public void show (AltosState state, AltosListenerState listener_state) {
88                         if (state == null || state.gps == null)
89                                 hide();
90                         else {
91                                 if (state.gps_ready)
92                                         show("Ready");
93                                 else
94                                         show("Waiting %d", state.gps_waiting);
95                                 set_lights(state.gps_ready);
96                         }
97                 }
98                 public GPSReady (AltosUIFlightTab container, int y) {
99                         super (container, y, "GPS Ready", 1, true, 2);
100                 }
101         }
102
103         class ReceiverBattery extends AltosUIVoltageIndicator {
104
105                 double  last_voltage = AltosLib.MISSING;
106
107                 public double voltage(AltosState state) {
108                         return last_voltage;
109                 }
110
111                 public double good() { return AltosLib.ao_battery_good; }
112
113                 public boolean hide(AltosState state, AltosListenerState listener_state, int i) {
114                         return value(state, listener_state, i) == AltosLib.MISSING;
115                 }
116
117                 public double value(AltosState state, AltosListenerState listener_state, int i) {
118                         if (listener_state == null)
119                                 last_voltage = AltosLib.MISSING;
120                         else
121                                 last_voltage = listener_state.battery;
122                         return last_voltage;
123                 }
124
125                 public ReceiverBattery (AltosUIFlightTab container, int y) {
126                         super(container, y, "Receiver Battery", 2);
127                 }
128         }
129
130         boolean report_pad(AltosState state) {
131                 if ((state.state() == AltosLib.ao_flight_stateless ||
132                      state.state() < AltosLib.ao_flight_pad) &&
133                     state.gps != null &&
134                     state.gps.lat != AltosLib.MISSING)
135                 {
136                         return false;
137                 }
138                 return true;
139         }
140
141         class PadLat extends AltosUIIndicator {
142
143                 double  last_lat = AltosLib.MISSING - 1;
144
145                 public void show (AltosState state, AltosListenerState listener_state) {
146                         double lat = AltosLib.MISSING;
147                         String label = null;
148
149                         if (state != null) {
150                                 if (report_pad(state)) {
151                                         lat = state.pad_lat;
152                                         label = "Pad Latitude";
153                                 } else {
154                                         lat = state.gps.lat;
155                                         label = "Latitude";
156                                 }
157                         }
158                         if (lat != last_lat) {
159                                 if (lat != AltosLib.MISSING) {
160                                         show(AltosConvert.latitude.show(10, lat));
161                                         set_label(label);
162                                 } else
163                                         hide();
164                                 last_lat = lat;
165                         }
166                 }
167
168                 public void reset() {
169                         super.reset();
170                         last_lat = AltosLib.MISSING - 1;
171                 }
172
173                 public PadLat (AltosUIFlightTab container, int y) {
174                         super (container, y, "Pad Latitude", 1, false, 2);
175                 }
176         }
177
178         class PadLon extends AltosUIIndicator {
179
180                 double last_lon = AltosLib.MISSING - 1;
181
182                 public void show (AltosState state, AltosListenerState listener_state) {
183                         double lon = AltosLib.MISSING;
184                         String label = null;
185
186                         if (state != null) {
187                                 if (report_pad(state)) {
188                                         lon = state.pad_lon;
189                                         label = "Pad Longitude";
190                                 } else {
191                                         lon = state.gps.lon;
192                                         label = "Longitude";
193                                 }
194                         }
195                         if (lon != last_lon) {
196                                 if (lon != AltosLib.MISSING) {
197                                         show(AltosConvert.longitude.show(10, lon));
198                                         set_label(label);
199                                 } else
200                                         hide();
201                                 last_lon = lon;
202                         }
203                 }
204
205                 public void reset() {
206                         super.reset();
207                         last_lon = AltosLib.MISSING - 1;
208                 }
209
210                 public PadLon (AltosUIFlightTab container, int y) {
211                         super (container, y, "Pad Longitude", 1, false, 2);
212                 }
213         }
214
215         class PadAlt extends AltosUIUnitsIndicator {
216
217                 public double value(AltosState state, int i) {
218                         if (report_pad(state))
219                                 return state.pad_alt;
220                         else
221                                 return state.gps.alt;
222                 }
223
224                 public void show (AltosState state, AltosListenerState listener_state) {
225                         String label = "Altitude";
226
227                         if (state != null && report_pad(state))
228                                 label = "Pad Altitude";
229                         set_label(label);
230                         super.show(state, listener_state);
231                 }
232
233                 public PadAlt (AltosUIFlightTab container, int y) {
234                         super (container, y, AltosConvert.height, "Pad Altitude", 1, false, 2);
235                 }
236         }
237         public String getName() { return "Pad"; }
238
239         public AltosPad() {
240                 int y = 0;
241                 add(new Battery(this, y++));
242                 add(new ReceiverBattery(this, y++));
243                 add(new Apogee(this, y++));
244                 add(new Main(this, y++));
245                 add(new LoggingReady(this, y++));
246                 add(new GPSLocked(this, y++));
247                 add(new GPSReady(this, y++));
248                 add(new PadLat(this, y++));
249                 add(new PadLon(this, y++));
250                 add(new PadAlt(this, y++));
251         }
252 }