2 * Copyright © 2010 Keith Packard <keithp@keithp.com>
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.
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.
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.
22 import org.altusmetrum.altoslib_3.*;
24 public class AltosAscent extends JComponent implements AltosFlightDisplay {
28 public class AscentStatus {
34 value.setVisible(true);
35 lights.setVisible(true);
36 label.setVisible(true);
40 value.setVisible(false);
41 lights.setVisible(false);
42 label.setVisible(false);
45 void show(AltosState state, AltosListenerState listener_state) {}
52 void show(AltosUnits units, double v) {
53 show(units.show(8, v));
56 void show(String format, double v) {
57 show(String.format(format, v));
66 label.setFont(Altos.label_font);
67 value.setFont(Altos.value_font);
70 public AscentStatus (GridBagLayout layout, int y, String text) {
71 GridBagConstraints c = new GridBagConstraints();
74 lights = new AltosLights();
75 c.gridx = 0; c.gridy = y;
76 c.anchor = GridBagConstraints.CENTER;
77 c.fill = GridBagConstraints.VERTICAL;
79 layout.setConstraints(lights, c);
82 label = new JLabel(text);
83 label.setFont(Altos.label_font);
84 label.setHorizontalAlignment(SwingConstants.LEFT);
85 c.gridx = 1; c.gridy = y;
86 c.insets = new Insets(Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad);
87 c.anchor = GridBagConstraints.WEST;
88 c.fill = GridBagConstraints.VERTICAL;
90 layout.setConstraints(label, c);
93 value = new JTextField(Altos.text_width);
94 value.setFont(Altos.value_font);
95 value.setHorizontalAlignment(SwingConstants.RIGHT);
96 c.gridx = 2; c.gridy = y;
98 c.anchor = GridBagConstraints.WEST;
99 c.fill = GridBagConstraints.BOTH;
101 layout.setConstraints(value, c);
107 public class AscentValue {
110 void show(AltosState state, AltosListenerState listener_state) {}
117 label.setVisible(true);
118 value.setVisible(true);
121 void show(String s) {
126 void show(AltosUnits units, double v) {
127 show(units.show(8, v));
130 void show(String format, double v) {
131 show(String.format(format, v));
135 label.setVisible(false);
136 value.setVisible(false);
139 label.setFont(Altos.label_font);
140 value.setFont(Altos.value_font);
143 public AscentValue (GridBagLayout layout, int y, String text) {
144 GridBagConstraints c = new GridBagConstraints();
147 label = new JLabel(text);
148 label.setFont(Altos.label_font);
149 label.setHorizontalAlignment(SwingConstants.LEFT);
150 c.gridx = 1; c.gridy = y;
151 c.insets = new Insets(Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad);
152 c.anchor = GridBagConstraints.WEST;
153 c.fill = GridBagConstraints.VERTICAL;
155 layout.setConstraints(label, c);
158 value = new JTextField(Altos.text_width);
159 value.setFont(Altos.value_font);
160 value.setHorizontalAlignment(SwingConstants.RIGHT);
161 c.gridx = 2; c.gridy = y;
162 c.anchor = GridBagConstraints.WEST;
163 c.fill = GridBagConstraints.BOTH;
166 layout.setConstraints(value, c);
171 public class AscentValueHold {
174 JTextField max_value;
177 void show(AltosState state, AltosListenerState listener_state) {}
181 max_value.setText("");
182 max = AltosLib.MISSING;
186 label.setFont(Altos.label_font);
187 value.setFont(Altos.value_font);
188 max_value.setFont(Altos.value_font);
191 void show(AltosUnits units, double v) {
192 if (v == AltosLib.MISSING) {
193 value.setText("Missing");
194 max_value.setText("Missing");
196 value.setText(units.show(8, v));
197 if (v > max || max == AltosLib.MISSING) {
198 max_value.setText(units.show(8, v));
205 label.setVisible(false);
206 value.setVisible(false);
207 max_value.setVisible(false);
210 public AscentValueHold (GridBagLayout layout, int y, String text) {
211 GridBagConstraints c = new GridBagConstraints();
214 label = new JLabel(text);
215 label.setFont(Altos.label_font);
216 label.setHorizontalAlignment(SwingConstants.LEFT);
217 c.gridx = 1; c.gridy = y;
218 c.insets = new Insets(Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad);
219 c.anchor = GridBagConstraints.WEST;
220 c.fill = GridBagConstraints.VERTICAL;
222 layout.setConstraints(label, c);
225 value = new JTextField(Altos.text_width);
226 value.setFont(Altos.value_font);
227 value.setHorizontalAlignment(SwingConstants.RIGHT);
228 c.gridx = 2; c.gridy = y;
229 c.anchor = GridBagConstraints.EAST;
230 c.fill = GridBagConstraints.BOTH;
232 layout.setConstraints(value, c);
235 max_value = new JTextField(Altos.text_width);
236 max_value.setFont(Altos.value_font);
237 max_value.setHorizontalAlignment(SwingConstants.RIGHT);
238 c.gridx = 3; c.gridy = y;
239 c.anchor = GridBagConstraints.EAST;
240 c.fill = GridBagConstraints.BOTH;
242 layout.setConstraints(max_value, c);
248 class Height extends AscentValueHold {
249 void show (AltosState state, AltosListenerState listener_state) {
250 show(AltosConvert.height, state.height());
252 public Height (GridBagLayout layout, int y) {
253 super (layout, y, "Height");
259 class Speed extends AscentValueHold {
260 void show (AltosState state, AltosListenerState listener_state) {
261 show(AltosConvert.speed, state.speed());
263 public Speed (GridBagLayout layout, int y) {
264 super (layout, y, "Speed");
270 class Accel extends AscentValueHold {
271 void show (AltosState state, AltosListenerState listener_state) {
272 show(AltosConvert.accel, state.acceleration());
274 public Accel (GridBagLayout layout, int y) {
275 super (layout, y, "Acceleration");
281 class Orient extends AscentValueHold {
282 void show (AltosState state, AltosListenerState listener_state) {
283 show(AltosConvert.orient, state.orient());
285 public Orient (GridBagLayout layout, int y) {
286 super (layout, y, "Tilt Angle");
292 String pos(double p, String pos, String neg) {
298 int deg = (int) Math.floor(p);
299 double min = (p - Math.floor(p)) * 60.0;
300 return String.format("%s %4d° %9.6f", h, deg, min);
303 class Apogee extends AscentStatus {
304 void show (AltosState state, AltosListenerState listener_state) {
305 show("%4.2f V", state.apogee_voltage);
306 lights.set(state.apogee_voltage >= AltosLib.ao_igniter_good);
308 public Apogee (GridBagLayout layout, int y) {
309 super(layout, y, "Apogee Igniter Voltage");
315 class Main extends AscentStatus {
316 void show (AltosState state, AltosListenerState listener_state) {
317 show("%4.2f V", state.main_voltage);
318 lights.set(state.main_voltage >= AltosLib.ao_igniter_good);
320 public Main (GridBagLayout layout, int y) {
321 super(layout, y, "Main Igniter Voltage");
327 class Lat extends AscentValue {
328 void show (AltosState state, AltosListenerState listener_state) {
329 if (state.gps != null && state.gps.connected && state.gps.lat != AltosLib.MISSING)
330 show(pos(state.gps.lat,"N", "S"));
334 public Lat (GridBagLayout layout, int y) {
335 super (layout, y, "Latitude");
341 class Lon extends AscentValue {
342 void show (AltosState state, AltosListenerState listener_state) {
343 if (state.gps != null && state.gps.connected && state.gps.lon != AltosLib.MISSING)
344 show(pos(state.gps.lon,"E", "W"));
348 public Lon (GridBagLayout layout, int y) {
349 super (layout, y, "Longitude");
355 public void reset() {
366 public void set_font() {
367 cur.setFont(Altos.label_font);
368 max.setFont(Altos.label_font);
379 public void show(AltosState state, AltosListenerState listener_state) {
380 if (state.gps != null && state.gps.connected) {
381 lat.show(state, listener_state);
382 lon.show(state, listener_state);
387 height.show(state, listener_state);
388 if (state.main_voltage != AltosLib.MISSING)
389 main.show(state, listener_state);
392 if (state.apogee_voltage != AltosLib.MISSING)
393 apogee.show(state, listener_state);
396 speed.show(state, listener_state);
397 accel.show(state, listener_state);
398 if (state.orient() != AltosLib.MISSING)
399 orient.show(state, listener_state);
404 public void labels(GridBagLayout layout, int y) {
405 GridBagConstraints c;
407 cur = new JLabel("Current");
408 cur.setFont(Altos.label_font);
409 c = new GridBagConstraints();
410 c.gridx = 2; c.gridy = y;
411 c.insets = new Insets(Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad);
412 layout.setConstraints(cur, c);
415 max = new JLabel("Maximum");
416 max.setFont(Altos.label_font);
417 c.gridx = 3; c.gridy = y;
418 layout.setConstraints(max, c);
422 public String getName() {
426 public AltosAscent() {
427 layout = new GridBagLayout();
431 /* Elements in ascent display:
439 height = new Height(layout, y++);
440 speed = new Speed(layout, y++);
441 accel = new Accel(layout, y++);
442 orient = new Orient(layout, y++);
443 lat = new Lat(layout, y++);
444 lon = new Lon(layout, y++);
445 apogee = new Apogee(layout, y++);
446 main = new Main(layout, y++);