X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosui%2FAltosPad.java;h=60f5890588cd218a00b6f34d693b060b3221c89a;hp=2d9c832317845545b53ca303634732332faa8363;hb=e9a3268285e97b7316c3321892e77814703ff71d;hpb=e69a433fd93b9f6bd2297d8045eb075fee29e73b diff --git a/altosui/AltosPad.java b/altosui/AltosPad.java index 2d9c8323..60f58905 100644 --- a/altosui/AltosPad.java +++ b/altosui/AltosPad.java @@ -3,7 +3,8 @@ * * 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 @@ -17,355 +18,236 @@ package altosui; -import java.awt.*; -import javax.swing.*; -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 java.util.*; +import org.altusmetrum.altoslib_13.*; +import org.altusmetrum.altosuilib_13.*; + +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) { + AltosCalData cal_data = state.cal_data(); + if (state == null || cal_data.flight == AltosLib.MISSING) { + hide(); + } else { + if (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(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++)); } }