*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
package altosui;
-import java.awt.*;
-import java.awt.event.*;
-import javax.swing.*;
-import javax.swing.filechooser.FileNameExtensionFilter;
-import javax.swing.table.*;
-import java.io.*;
import java.util.*;
-import java.text.*;
-import java.util.prefs.*;
-import java.util.concurrent.LinkedBlockingQueue;
-import org.altusmetrum.AltosLib.*;
-
-public class AltosPad extends JComponent implements AltosFlightDisplay {
- GridBagLayout layout;
-
- public class LaunchStatus {
- JLabel label;
- JTextField value;
- AltosLights lights;
-
- void show(AltosState state, int crc_errors) {}
-
- void reset() {
- value.setText("");
- lights.set(false);
- }
-
- public void show() {
- label.setVisible(true);
- value.setVisible(true);
- lights.setVisible(true);
- }
-
- void show(String s) {
- show();
- value.setText(s);
+import org.altusmetrum.altoslib_11.*;
+import org.altusmetrum.altosuilib_11.*;
+
+public class AltosPad extends AltosUIFlightTab {
+
+ class Battery extends AltosUIVoltageIndicator {
+ public double voltage(AltosState state) { return state.battery_voltage; }
+ public double good() { return AltosLib.ao_battery_good; }
+ public Battery (AltosUIFlightTab container, int y) { super(container, y, "Battery Voltage", 2); }
+ }
+
+ class Apogee extends AltosUIVoltageIndicator {
+ public boolean hide(double v) { return v == AltosLib.MISSING; }
+ public double voltage(AltosState state) { return state.apogee_voltage; }
+ public double good() { return AltosLib.ao_igniter_good; }
+ public Apogee (AltosUIFlightTab container, int y) { super(container, y, "Apogee Igniter Voltage", 2); }
+ }
+
+ class Main extends AltosUIVoltageIndicator {
+ public boolean hide(double v) { return v == AltosLib.MISSING; }
+ public double voltage(AltosState state) { return state.main_voltage; }
+ public double good() { return AltosLib.ao_igniter_good; }
+ public Main (AltosUIFlightTab container, int y) { super(container, y, "Main Igniter Voltage", 2); }
+ }
+
+ class LoggingReady extends AltosUIIndicator {
+ public void show (AltosState state, AltosListenerState listener_state) {
+ if (state == null || state.cal_data.flight == AltosLib.MISSING) {
+ hide();
+ } else {
+ if (state.cal_data.flight != 0) {
+ if (state.state() <= Altos.ao_flight_pad)
+ show("Ready to record");
+ else if (state.state() < Altos.ao_flight_landed ||
+ state.state() == AltosLib.ao_flight_stateless)
+ show("Recording data");
+ else
+ show("Recorded data");
+ } else
+ show("Storage full");
+ set_lights(state.cal_data.flight != 0);
+ }
}
-
- void show(String format, double value) {
- show(String.format(format, value));
+ public LoggingReady (AltosUIFlightTab container, int y) {
+ super(container, y, "On-board Data Logging", 1, true, 2);
}
+ }
- void show(String format, int value) {
- show(String.format(format, value));
+ class GPSLocked extends AltosUIIndicator {
+ public void show (AltosState state, AltosListenerState listener_state) {
+ if (state == null || state.gps == null)
+ hide();
+ else {
+ int sol = state.gps.nsat;
+ int sat = state.gps.cc_gps_sat == null ? 0 : state.gps.cc_gps_sat.length;
+ show("%d in solution", sol, "%d in view", sat);
+ set_lights(state.gps.locked && sol >= 4);
+ }
}
-
- public void hide() {
- label.setVisible(false);
- value.setVisible(false);
- lights.setVisible(false);
+ public GPSLocked (AltosUIFlightTab container, int y) {
+ super (container, y, "GPS Locked", 2, true, 1);
}
+ }
- public void set_font() {
- label.setFont(Altos.label_font);
- value.setFont(Altos.value_font);
+ class GPSReady extends AltosUIIndicator {
+ public void show (AltosState state, AltosListenerState listener_state) {
+ if (state == null || state.gps == null)
+ hide();
+ else {
+ if (state.gps_ready)
+ show("Ready");
+ else
+ show("Waiting %d", state.gps_waiting);
+ set_lights(state.gps_ready);
+ }
}
-
- public LaunchStatus (GridBagLayout layout, int y, String text) {
- GridBagConstraints c = new GridBagConstraints();
- c.weighty = 1;
-
- lights = new AltosLights();
- c.gridx = 0; c.gridy = y;
- c.anchor = GridBagConstraints.CENTER;
- c.fill = GridBagConstraints.VERTICAL;
- c.weightx = 0;
- layout.setConstraints(lights, c);
- add(lights);
-
- label = new JLabel(text);
- label.setFont(Altos.label_font);
- label.setHorizontalAlignment(SwingConstants.LEFT);
- c.gridx = 1; c.gridy = y;
- c.insets = new Insets(Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad);
- c.anchor = GridBagConstraints.WEST;
- c.fill = GridBagConstraints.VERTICAL;
- c.weightx = 0;
- layout.setConstraints(label, c);
- add(label);
-
- value = new JTextField(Altos.text_width);
- value.setFont(Altos.value_font);
- value.setHorizontalAlignment(SwingConstants.RIGHT);
- c.gridx = 2; c.gridy = y;
- c.anchor = GridBagConstraints.WEST;
- c.fill = GridBagConstraints.BOTH;
- c.weightx = 1;
- layout.setConstraints(value, c);
- add(value);
-
+ public GPSReady (AltosUIFlightTab container, int y) {
+ super (container, y, "GPS Ready", 1, true, 2);
}
}
- public class LaunchValue {
- JLabel label;
- JTextField value;
- void show(AltosState state, int crc_errors) {}
-
- void show() {
- label.setVisible(true);
- value.setVisible(true);
- }
-
- void hide() {
- label.setVisible(false);
- value.setVisible(false);
- }
+ class ReceiverBattery extends AltosUIVoltageIndicator {
- public void set_font() {
- label.setFont(Altos.label_font);
- value.setFont(Altos.value_font);
- }
+ double last_voltage = AltosLib.MISSING;
- void show(String s) {
- show();
- value.setText(s);
+ public double voltage(AltosState state) {
+ return last_voltage;
}
- void show(AltosUnits units, double v) {
- show(units.show(8, v));
- }
+ public double good() { return AltosLib.ao_battery_good; }
- void show(String format, double v) {
- show(String.format(format, v));
+ public boolean hide(AltosState state, AltosListenerState listener_state, int i) {
+ return value(state, listener_state, i) == AltosLib.MISSING;
}
- void reset() {
- value.setText("");
+ public double value(AltosState state, AltosListenerState listener_state, int i) {
+ if (listener_state == null)
+ last_voltage = AltosLib.MISSING;
+ else
+ last_voltage = listener_state.battery;
+ return last_voltage;
}
- public LaunchValue (GridBagLayout layout, int y, String text) {
- GridBagConstraints c = new GridBagConstraints();
- c.insets = new Insets(Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad);
- c.weighty = 1;
-
- label = new JLabel(text);
- label.setFont(Altos.label_font);
- label.setHorizontalAlignment(SwingConstants.LEFT);
- c.gridx = 1; c.gridy = y;
- c.anchor = GridBagConstraints.WEST;
- c.fill = GridBagConstraints.VERTICAL;
- c.weightx = 0;
- layout.setConstraints(label, c);
- add(label);
-
- value = new JTextField(Altos.text_width);
- value.setFont(Altos.value_font);
- value.setHorizontalAlignment(SwingConstants.RIGHT);
- c.gridx = 2; c.gridy = y;
- c.anchor = GridBagConstraints.EAST;
- c.fill = GridBagConstraints.BOTH;
- c.weightx = 1;
- layout.setConstraints(value, c);
- add(value);
+ public ReceiverBattery (AltosUIFlightTab container, int y) {
+ super(container, y, "Receiver Battery", 2);
}
}
- class Battery extends LaunchStatus {
- void show (AltosState state, int crc_errors) {
- show("%4.2f V", state.battery);
- lights.set(state.battery > 3.7);
- }
- public Battery (GridBagLayout layout, int y) {
- super(layout, y, "Battery Voltage");
+ boolean report_pad(AltosState state) {
+ if (state.state() == AltosLib.ao_flight_stateless ||
+ state.state() < AltosLib.ao_flight_pad)
+ {
+ return false;
}
+ return true;
}
- Battery battery;
+ class PadLat extends AltosUIIndicator {
- class Apogee extends LaunchStatus {
- void show (AltosState state, int crc_errors) {
- show("%4.2f V", state.drogue_sense);
- lights.set(state.drogue_sense > 3.2);
- }
- public Apogee (GridBagLayout layout, int y) {
- super(layout, y, "Apogee Igniter Voltage");
- }
- }
+ double last_lat = AltosLib.MISSING - 1;
- Apogee apogee;
+ public void show (AltosState state, AltosListenerState listener_state) {
+ double lat = AltosLib.MISSING;
+ String label = null;
- class Main extends LaunchStatus {
- void show (AltosState state, int crc_errors) {
- show("%4.2f V", state.main_sense);
- lights.set(state.main_sense > 3.2);
- }
- public Main (GridBagLayout layout, int y) {
- super(layout, y, "Main Igniter Voltage");
- }
- }
-
- Main main;
-
- class LoggingReady extends LaunchStatus {
- void show (AltosState state, int crc_errors) {
- if (state.data.flight != 0) {
- if (state.data.state <= Altos.ao_flight_pad)
- show("Ready to record");
- else if (state.data.state < Altos.ao_flight_landed)
- show("Recording data");
- else
- show("Recorded data");
+ if (state != null) {
+ if (report_pad(state)) {
+ lat = state.pad_lat;
+ label = "Pad Latitude";
+ } else if (state.gps != null) {
+ lat = state.gps.lat;
+ label = "Latitude";
+ }
+ }
+ if (lat != last_lat) {
+ if (lat != AltosLib.MISSING) {
+ show(AltosConvert.latitude.show(10, lat));
+ set_label(label);
+ } else
+ hide();
+ last_lat = lat;
}
- else
- show("Storage full");
- lights.set(state.data.flight != 0);
- }
- public LoggingReady (GridBagLayout layout, int y) {
- super(layout, y, "On-board Data Logging");
}
- }
-
- LoggingReady logging_ready;
- class GPSLocked extends LaunchStatus {
- void show (AltosState state, int crc_errors) {
- show("%4d sats", state.gps.nsat);
- lights.set(state.gps.locked && state.gps.nsat >= 4);
+ public void reset() {
+ super.reset();
+ last_lat = AltosLib.MISSING - 1;
}
- public GPSLocked (GridBagLayout layout, int y) {
- super (layout, y, "GPS Locked");
+
+ public PadLat (AltosUIFlightTab container, int y) {
+ super (container, y, "Pad Latitude", 1, false, 2);
}
}
- GPSLocked gps_locked;
+ class PadLon extends AltosUIIndicator {
- class GPSReady extends LaunchStatus {
- void show (AltosState state, int crc_errors) {
- if (state.gps_ready)
- show("Ready");
- else
- show("Waiting %d", state.gps_waiting);
- lights.set(state.gps_ready);
- }
- public GPSReady (GridBagLayout layout, int y) {
- super (layout, y, "GPS Ready");
- }
- }
+ double last_lon = AltosLib.MISSING - 1;
- GPSReady gps_ready;
+ public void show (AltosState state, AltosListenerState listener_state) {
+ double lon = AltosLib.MISSING;
+ String label = null;
- String pos(double p, String pos, String neg) {
- String h = pos;
- if (p < 0) {
- h = neg;
- p = -p;
+ if (state != null) {
+ if (report_pad(state)) {
+ lon = state.pad_lon;
+ label = "Pad Longitude";
+ } else if (state.gps != null) {
+ lon = state.gps.lon;
+ label = "Longitude";
+ }
+ }
+ if (lon != last_lon) {
+ if (lon != AltosLib.MISSING) {
+ show(AltosConvert.longitude.show(10, lon));
+ set_label(label);
+ } else
+ hide();
+ last_lon = lon;
+ }
}
- int deg = (int) Math.floor(p);
- double min = (p - Math.floor(p)) * 60.0;
- return String.format("%s %4d° %9.6f", h, deg, min);
- }
- class PadLat extends LaunchValue {
- void show (AltosState state, int crc_errors) {
- show(pos(state.pad_lat,"N", "S"));
+ public void reset() {
+ super.reset();
+ last_lon = AltosLib.MISSING - 1;
}
- public PadLat (GridBagLayout layout, int y) {
- super (layout, y, "Pad Latitude");
+
+ public PadLon (AltosUIFlightTab container, int y) {
+ super (container, y, "Pad Longitude", 1, false, 2);
}
}
- PadLat pad_lat;
+ class PadAlt extends AltosUIUnitsIndicator {
- class PadLon extends LaunchValue {
- void show (AltosState state, int crc_errors) {
- show(pos(state.pad_lon,"E", "W"));
- }
- public PadLon (GridBagLayout layout, int y) {
- super (layout, y, "Pad Longitude");
+ public double value(AltosState state, int i) {
+ if (report_pad(state))
+ return state.pad_alt;
+ else if (state.gps != null)
+ return state.gps.alt;
+ else
+ return state.altitude();
}
- }
- PadLon pad_lon;
+ public void show (AltosState state, AltosListenerState listener_state) {
+ String label = "Altitude";
- class PadAlt extends LaunchValue {
- void show (AltosState state, int crc_errors) {
- show("%4.0f m", state.pad_alt);
+ if (state != null && report_pad(state))
+ label = "Pad Altitude";
+ set_label(label);
+ super.show(state, listener_state);
}
- public PadAlt (GridBagLayout layout, int y) {
- super (layout, y, "Pad Altitude");
- }
- }
- PadAlt pad_alt;
-
- public void reset() {
- battery.reset();
- apogee.reset();
- main.reset();
- logging_ready.reset();
- gps_locked.reset();
- gps_ready.reset();
- pad_lat.reset();
- pad_lon.reset();
- pad_alt.reset();
- }
-
- public void set_font() {
- battery.set_font();
- apogee.set_font();
- main.set_font();
- logging_ready.set_font();
- gps_locked.set_font();
- gps_ready.set_font();
- pad_lat.set_font();
- pad_lon.set_font();
- pad_alt.set_font();
- }
-
- public void show(AltosState state, int crc_errors) {
- battery.show(state, crc_errors);
- if (state.drogue_sense == AltosRecord.MISSING)
- apogee.hide();
- else
- apogee.show(state, crc_errors);
- if (state.main_sense == AltosRecord.MISSING)
- main.hide();
- else
- main.show(state, crc_errors);
- logging_ready.show(state, crc_errors);
- pad_alt.show(state, crc_errors);
- if (state.gps != null && state.gps.connected) {
- gps_locked.show(state, crc_errors);
- gps_ready.show(state, crc_errors);
- pad_lat.show(state, crc_errors);
- pad_lon.show(state, crc_errors);
- } else {
- gps_locked.hide();
- gps_ready.hide();
- pad_lat.hide();
- pad_lon.hide();
+ public PadAlt (AltosUIFlightTab container, int y) {
+ super (container, y, AltosConvert.height, "Pad Altitude", 1, false, 2);
}
}
+ public String getName() { return "Pad"; }
public AltosPad() {
- layout = new GridBagLayout();
-
- setLayout(layout);
-
- /* Elements in pad display:
- *
- * Battery voltage
- * Igniter continuity
- * GPS lock status
- * GPS ready status
- * GPS location
- * Pad altitude
- * RSSI
- */
- battery = new Battery(layout, 0);
- apogee = new Apogee(layout, 1);
- main = new Main(layout, 2);
- logging_ready = new LoggingReady(layout, 3);
- gps_locked = new GPSLocked(layout, 4);
- gps_ready = new GPSReady(layout, 5);
- pad_lat = new PadLat(layout, 6);
- pad_lon = new PadLon(layout, 7);
- pad_alt = new PadAlt(layout, 8);
+ int y = 0;
+ add(new Battery(this, y++));
+ add(new ReceiverBattery(this, y++));
+ add(new Apogee(this, y++));
+ add(new Main(this, y++));
+ add(new LoggingReady(this, y++));
+ add(new GPSLocked(this, y++));
+ add(new GPSReady(this, y++));
+ add(new PadLat(this, y++));
+ add(new PadLon(this, y++));
+ add(new PadAlt(this, y++));
}
}