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_1.*;
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 = AltosRecord.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 == AltosRecord.MISSING) {
193 value.setText("Missing");
194 max_value.setText("Missing");
196 value.setText(units.show(8, v));
197 if (v > max || max == AltosRecord.MISSING) {
198 max_value.setText(units.show(8, v));
203 public AscentValueHold (GridBagLayout layout, int y, String text) {
204 GridBagConstraints c = new GridBagConstraints();
207 label = new JLabel(text);
208 label.setFont(Altos.label_font);
209 label.setHorizontalAlignment(SwingConstants.LEFT);
210 c.gridx = 1; c.gridy = y;
211 c.insets = new Insets(Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad);
212 c.anchor = GridBagConstraints.WEST;
213 c.fill = GridBagConstraints.VERTICAL;
215 layout.setConstraints(label, c);
218 value = new JTextField(Altos.text_width);
219 value.setFont(Altos.value_font);
220 value.setHorizontalAlignment(SwingConstants.RIGHT);
221 c.gridx = 2; c.gridy = y;
222 c.anchor = GridBagConstraints.EAST;
223 c.fill = GridBagConstraints.BOTH;
225 layout.setConstraints(value, c);
228 max_value = new JTextField(Altos.text_width);
229 max_value.setFont(Altos.value_font);
230 max_value.setHorizontalAlignment(SwingConstants.RIGHT);
231 c.gridx = 3; c.gridy = y;
232 c.anchor = GridBagConstraints.EAST;
233 c.fill = GridBagConstraints.BOTH;
235 layout.setConstraints(max_value, c);
241 class Height extends AscentValueHold {
242 void show (AltosState state, AltosListenerState listener_state) {
243 show(AltosConvert.height, state.height);
245 public Height (GridBagLayout layout, int y) {
246 super (layout, y, "Height");
252 class Speed extends AscentValueHold {
253 void show (AltosState state, AltosListenerState listener_state) {
254 double speed = state.accel_speed;
256 speed = state.baro_speed;
257 show(AltosConvert.speed, speed);
259 public Speed (GridBagLayout layout, int y) {
260 super (layout, y, "Speed");
266 class Accel extends AscentValueHold {
267 void show (AltosState state, AltosListenerState listener_state) {
268 show(AltosConvert.accel, state.acceleration);
270 public Accel (GridBagLayout layout, int y) {
271 super (layout, y, "Acceleration");
277 String pos(double p, String pos, String neg) {
283 int deg = (int) Math.floor(p);
284 double min = (p - Math.floor(p)) * 60.0;
285 return String.format("%s %4d° %9.6f", h, deg, min);
288 class Apogee extends AscentStatus {
289 void show (AltosState state, AltosListenerState listener_state) {
290 show("%4.2f V", state.drogue_sense);
291 lights.set(state.drogue_sense > 3.2);
293 public Apogee (GridBagLayout layout, int y) {
294 super(layout, y, "Apogee Igniter Voltage");
300 class Main extends AscentStatus {
301 void show (AltosState state, AltosListenerState listener_state) {
302 show("%4.2f V", state.main_sense);
303 lights.set(state.main_sense > 3.2);
305 public Main (GridBagLayout layout, int y) {
306 super(layout, y, "Main Igniter Voltage");
312 class Lat extends AscentValue {
313 void show (AltosState state, AltosListenerState listener_state) {
314 if (state.gps != null)
315 show(pos(state.gps.lat,"N", "S"));
319 public Lat (GridBagLayout layout, int y) {
320 super (layout, y, "Latitude");
326 class Lon extends AscentValue {
327 void show (AltosState state, AltosListenerState listener_state) {
328 if (state.gps != null)
329 show(pos(state.gps.lon,"E", "W"));
333 public Lon (GridBagLayout layout, int y) {
334 super (layout, y, "Longitude");
340 public void reset() {
350 public void set_font() {
351 cur.setFont(Altos.label_font);
352 max.setFont(Altos.label_font);
362 public void show(AltosState state, AltosListenerState listener_state) {
363 if (state.gps != null && state.gps.connected) {
364 lat.show(state, listener_state);
365 lon.show(state, listener_state);
370 height.show(state, listener_state);
371 if (state.main_sense != AltosRecord.MISSING)
372 main.show(state, listener_state);
375 if (state.drogue_sense != AltosRecord.MISSING)
376 apogee.show(state, listener_state);
379 speed.show(state, listener_state);
380 accel.show(state, listener_state);
383 public void labels(GridBagLayout layout, int y) {
384 GridBagConstraints c;
386 cur = new JLabel("Current");
387 cur.setFont(Altos.label_font);
388 c = new GridBagConstraints();
389 c.gridx = 2; c.gridy = y;
390 c.insets = new Insets(Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad);
391 layout.setConstraints(cur, c);
394 max = new JLabel("Maximum");
395 max.setFont(Altos.label_font);
396 c.gridx = 3; c.gridy = y;
397 layout.setConstraints(max, c);
401 public String getName() {
405 public AltosAscent() {
406 layout = new GridBagLayout();
410 /* Elements in ascent display:
417 height = new Height(layout, 1);
418 speed = new Speed(layout, 2);
419 accel = new Accel(layout, 3);
420 lat = new Lat(layout, 4);
421 lon = new Lon(layout, 5);
422 apogee = new Apogee(layout, 6);
423 main = new Main(layout, 7);