X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=telegps%2FTeleGPSInfo.java;h=bbf4b47265e1d97eb3f34d6d6b977c857deba962;hp=da3df44ea2351c0eb2a4c2434dab843a45d91f62;hb=3f7e885055f8a97f334e0cd3163b760b174114b6;hpb=71715337eb532a1fbe1a753240e7417d5223489f diff --git a/telegps/TeleGPSInfo.java b/telegps/TeleGPSInfo.java index da3df44e..bbf4b472 100644 --- a/telegps/TeleGPSInfo.java +++ b/telegps/TeleGPSInfo.java @@ -17,363 +17,84 @@ package org.altusmetrum.telegps; +import java.util.*; import java.awt.*; +import java.awt.event.*; import javax.swing.*; import org.altusmetrum.altoslib_4.*; import org.altusmetrum.altosuilib_2.*; -public class TeleGPSInfo extends JComponent implements AltosFlightDisplay { - GridBagLayout layout; - JLabel cur, max; +public class TeleGPSInfo extends JComponent implements AltosFlightDisplay, HierarchyListener { - public class Info { - JLabel label; - JTextField value; - AltosLights lights; + JLabel cur, max; - void show() { - value.setVisible(true); - lights.setVisible(true); - label.setVisible(true); - } - - void hide() { - value.setVisible(false); - lights.setVisible(false); - label.setVisible(false); - } - - void show(AltosState state, AltosListenerState listener_state) {} - - void show(String s) { - show(); - value.setText(s); - } - - void show(AltosUnits units, double v) { - show(units.show(8, v)); - } - - void show(String format, double v) { - show(String.format(format, v)); - } + private AltosState last_state; + private AltosListenerState last_listener_state; - void show(String format, int v) { - show(String.format(format, v)); - } - - void reset() { - lights.set(false); - value.setText(""); - } - - void set_font() { - label.setFont(AltosUILib.label_font); - value.setFont(AltosUILib.value_font); - } + abstract class Value extends AltosUIUnitsIndicator { + public abstract void show(AltosState state, AltosListenerState listener_state); - public Info (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(AltosUILib.label_font); - label.setHorizontalAlignment(SwingConstants.LEFT); - c.gridx = 1; c.gridy = y; - c.insets = new Insets(AltosUILib.tab_elt_pad, AltosUILib.tab_elt_pad, AltosUILib.tab_elt_pad, AltosUILib.tab_elt_pad); - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.VERTICAL; - c.weightx = 0; - layout.setConstraints(label, c); - add(label); - - value = new JTextField(AltosUILib.text_width); - value.setFont(AltosUILib.value_font); - value.setHorizontalAlignment(SwingConstants.RIGHT); - c.gridx = 2; c.gridy = y; - c.gridwidth = 2; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.BOTH; - c.weightx = 1; - layout.setConstraints(value, c); - add(value); + public Value (Container container, int y, AltosUnits units, String text) { + super(container, y, units, text, 1, false, 2); } } - public class Value { - JLabel label; - JTextField value; - void show(AltosState state, AltosListenerState listener_state) {} - - void reset() { - value.setText(""); - } - - void show() { - label.setVisible(true); - value.setVisible(true); - } - - void show(String s) { - show(); - value.setText(s); - } - - void show(AltosUnits units, double v) { - show(units.show(8, v)); - } - - void show(String format, double v) { - show(String.format(format, v)); - } - - void hide() { - label.setVisible(false); - value.setVisible(false); - } - void set_font() { - label.setFont(AltosUILib.label_font); - value.setFont(AltosUILib.value_font); - } - - public Value (GridBagLayout layout, int y, String text) { - GridBagConstraints c = new GridBagConstraints(); - c.weighty = 1; - - label = new JLabel(text); - label.setFont(AltosUILib.label_font); - label.setHorizontalAlignment(SwingConstants.LEFT); - c.gridx = 1; c.gridy = y; - c.insets = new Insets(AltosUILib.tab_elt_pad, AltosUILib.tab_elt_pad, AltosUILib.tab_elt_pad, AltosUILib.tab_elt_pad); - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.VERTICAL; - c.weightx = 0; - layout.setConstraints(label, c); - add(label); - - value = new JTextField(AltosUILib.text_width); - value.setFont(AltosUILib.value_font); - value.setHorizontalAlignment(SwingConstants.RIGHT); - c.gridx = 2; c.gridy = y; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.BOTH; - c.gridwidth = 2; - c.weightx = 1; - layout.setConstraints(value, c); - add(value); + abstract class DualValue extends AltosUIUnitsIndicator { + public DualValue (Container container, int y, AltosUnits units, String text) { + super(container, y, units, text, 2, false, 1); } } - public abstract class DualValue { - JLabel label; - JTextField value1; - JTextField value2; - - void reset() { - value1.setText(""); - value2.setText(""); + abstract class ValueHold extends DualValue { + public void reset() { + super.reset(); + last_values[1] = AltosLib.MISSING; } - - void show() { - label.setVisible(true); - value1.setVisible(true); - value2.setVisible(true); - } - - void hide() { - label.setVisible(false); - value1.setVisible(false); - value2.setVisible(false); - } - - void set_font() { - label.setFont(AltosUILib.label_font); - value1.setFont(AltosUILib.value_font); - value2.setFont(AltosUILib.value_font); - } - - abstract void show(AltosState state, AltosListenerState listener_state); - - void show(String v1, String v2) { - show(); - value1.setText(v1); - value2.setText(v2); - } - void show(String f1, double v1, String f2, double v2) { - show(); - value1.setText(String.format(f1, v1)); - value2.setText(String.format(f2, v2)); - } - - public DualValue (GridBagLayout layout, int x, int y, String text) { - GridBagConstraints c = new GridBagConstraints(); - c.weighty = 1; - - label = new JLabel(text); - label.setFont(AltosUILib.label_font); - label.setHorizontalAlignment(SwingConstants.LEFT); - c.gridx = x + 1; c.gridy = y; - c.insets = new Insets(AltosUILib.tab_elt_pad, AltosUILib.tab_elt_pad, AltosUILib.tab_elt_pad, AltosUILib.tab_elt_pad); - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.VERTICAL; - c.weightx = 0; - layout.setConstraints(label, c); - add(label); - - value1 = new JTextField(AltosUILib.text_width); - value1.setFont(AltosUILib.value_font); - value1.setHorizontalAlignment(SwingConstants.RIGHT); - c.gridx = x + 2; c.gridy = y; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.BOTH; - c.weightx = 1; - layout.setConstraints(value1, c); - add(value1); - - value2 = new JTextField(AltosUILib.text_width); - value2.setFont(AltosUILib.value_font); - value2.setHorizontalAlignment(SwingConstants.RIGHT); - c.gridx = x + 3; c.gridy = y; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.BOTH; - c.weightx = 1; - c.gridwidth = 1; - layout.setConstraints(value2, c); - add(value2); - } - } - - public class ValueHold { - JLabel label; - JTextField value; - JTextField max_value; - double max; - - void show(AltosState state, AltosListenerState listener_state) {} - - void reset() { - value.setText(""); - max_value.setText(""); - max = AltosLib.MISSING; - } - - void set_font() { - label.setFont(AltosUILib.label_font); - value.setFont(AltosUILib.value_font); - max_value.setFont(AltosUILib.value_font); - } - - void show(AltosUnits units, double v) { - if (v == AltosLib.MISSING) { - value.setText("Missing"); - max_value.setText("Missing"); - } else { - value.setText(units.show(8, v)); - if (v > max || max == AltosLib.MISSING) { - max_value.setText(units.show(8, v)); - max = v; - } - } - } - - void hide() { - label.setVisible(false); - value.setVisible(false); - max_value.setVisible(false); - } - - public ValueHold (GridBagLayout layout, int y, String text) { - GridBagConstraints c = new GridBagConstraints(); - c.weighty = 1; - - label = new JLabel(text); - label.setFont(AltosUILib.label_font); - label.setHorizontalAlignment(SwingConstants.LEFT); - c.gridx = 1; c.gridy = y; - c.insets = new Insets(AltosUILib.tab_elt_pad, AltosUILib.tab_elt_pad, AltosUILib.tab_elt_pad, AltosUILib.tab_elt_pad); - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.VERTICAL; - c.weightx = 0; - layout.setConstraints(label, c); - add(label); - - value = new JTextField(AltosUILib.text_width); - value.setFont(AltosUILib.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); - - max_value = new JTextField(AltosUILib.text_width); - max_value.setFont(AltosUILib.value_font); - max_value.setHorizontalAlignment(SwingConstants.RIGHT); - c.gridx = 3; c.gridy = y; - c.anchor = GridBagConstraints.EAST; - c.fill = GridBagConstraints.BOTH; - c.weightx = 1; - layout.setConstraints(max_value, c); - add(max_value); + public ValueHold (Container container, int y, AltosUnits units, String text) { + super(container, y, units, text); } } - class Altitude extends ValueHold { - void show (AltosState state, AltosListenerState listener_state) { - show(AltosConvert.height, state.altitude()); + public double value(AltosState state, int i) { + if (i == 0) + return state.altitude(); + else + return state.max_altitude(); } - public Altitude (GridBagLayout layout, int y) { - super (layout, y, "Altitude"); + + public Altitude (Container container, int y) { + super (container, y, AltosConvert.height, "Altitude"); } } - Altitude altitude; - class AscentRate extends ValueHold { - void show (AltosState state, AltosListenerState listener_state) { - show(AltosConvert.speed, state.gps_ascent_rate()); + public double value(AltosState state, int i) { + if (i == 0) + return state.gps_ascent_rate(); + else + return state.max_gps_ascent_rate(); } - public AscentRate (GridBagLayout layout, int y) { - super (layout, y, "Ascent Rate"); + public AscentRate (Container container, int y) { + super (container, y, AltosConvert.speed, "Ascent Rate"); } } - AscentRate ascent_rate; - class GroundSpeed extends ValueHold { - void show (AltosState state, AltosListenerState listener_state) { - show(AltosConvert.speed, state.gps_ground_speed()); + public double value(AltosState state, int i) { + if (i == 0) + return state.gps_ground_speed(); + else + return state.max_gps_ground_speed(); } - public GroundSpeed (GridBagLayout layout, int y) { - super (layout, y, "Ground Speed"); + public GroundSpeed (Container container, int y) { + super (container, y, AltosConvert.speed, "Ground Speed"); } } - GroundSpeed ground_speed; - - String pos(double p, String pos, String neg) { - String h = pos; - if (p < 0) { - h = neg; - p = -p; - } - 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 Course extends AltosUIIndicator { - class Course extends DualValue { - void show (AltosState state, AltosListenerState listener_state) { + public void show (AltosState state, AltosListenerState listener_state) { double course = state.gps_course(); if (course != AltosLib.MISSING) show( String.format("%3.0f°", course), @@ -381,95 +102,109 @@ public class TeleGPSInfo extends JComponent implements AltosFlightDisplay { AltosConvert.BEARING_LONG, course)); } - public Course (GridBagLayout layout, int y) { - super (layout, 0, y, "Course"); + public Course (Container container, int y) { + super (container, y, "Course", 2, false, 1); } } - Course course; + class Lat extends AltosUIIndicator { - class Lat extends Value { - void show (AltosState state, AltosListenerState listener_state) { + String pos(double p, String pos, String neg) { + String h = pos; + if (p < 0) { + h = neg; + p = -p; + } + int deg = (int) Math.floor(p); + double min = (p - Math.floor(p)) * 60.0; + return String.format("%s %4d° %9.6f", h, deg, min); + } + + public void show (AltosState state, AltosListenerState listener_state) { if (state.gps != null && state.gps.connected && state.gps.lat != AltosLib.MISSING) show(pos(state.gps.lat,"N", "S")); else show("???"); } - public Lat (GridBagLayout layout, int y) { - super (layout, y, "Latitude"); + public Lat (Container container, int y) { + super (container, y, "Latitude", 1, false, 2); } } - Lat lat; + class Lon extends AltosUIIndicator { - class Lon extends Value { - void show (AltosState state, AltosListenerState listener_state) { + String pos(double p, String pos, String neg) { + String h = pos; + if (p < 0) { + h = neg; + p = -p; + } + int deg = (int) Math.floor(p); + double min = (p - Math.floor(p)) * 60.0; + return String.format("%s %4d° %9.6f", h, deg, min); + } + + public void show (AltosState state, AltosListenerState listener_state) { if (state.gps != null && state.gps.connected && state.gps.lon != AltosLib.MISSING) show(pos(state.gps.lon,"E", "W")); else show("???"); } - public Lon (GridBagLayout layout, int y) { - super (layout, y, "Longitude"); + public Lon (Container container, int y) { + super (container, y, "Longitude", 1, false, 2); } } - Lon lon; + class GPSLocked extends AltosUIIndicator { - class GPSLocked extends Info { - void show (AltosState state, AltosListenerState listener_state) { + public void show (AltosState state, AltosListenerState listener_state) { if (state == null || state.gps == null) hide(); else { - show("%4d sats", state.gps.nsat); - lights.set(state.gps.locked && state.gps.nsat >= 4); + int soln = state.gps.nsat; + int nsat = state.gps.cc_gps_sat != null ? state.gps.cc_gps_sat.length : 0; + show("%4d in solution", soln, + "%4d in view", nsat); + set_lights(state.gps.locked && soln >= 4); } } - public GPSLocked (GridBagLayout layout, int y) { - super (layout, y, "GPS Locked"); + public GPSLocked (Container container, int y) { + super (container, y, "GPS Locked", 2, true, 1); } } - GPSLocked gps_locked; + LinkedList indicators = new LinkedList(); public void reset() { - lat.reset(); - lon.reset(); - altitude.reset(); - ground_speed.reset(); - ascent_rate.reset(); - course.reset(); - gps_locked.reset(); + for (AltosUIIndicator i : indicators) + i.reset(); } - public void set_font() { + public void font_size_changed(int font_size) { cur.setFont(AltosUILib.label_font); max.setFont(AltosUILib.label_font); - lat.set_font(); - lon.set_font(); - altitude.set_font(); - ground_speed.set_font(); - ascent_rate.set_font(); - course.set_font(); - gps_locked.set_font(); + for (AltosUIIndicator i : indicators) + i.font_size_changed(font_size); + } + + public void units_changed(boolean imperial_units) { + for (AltosUIIndicator i : indicators) + i.units_changed(imperial_units); } public void show(AltosState state, AltosListenerState listener_state) { - if (state.gps != null && state.gps.connected) { - lat.show(state, listener_state); - lon.show(state, listener_state); - } else { - lat.hide(); - lon.hide(); + if (!isShowing()) { + last_state = state; + last_listener_state = listener_state; + return; } - altitude.show(state, listener_state); - ground_speed.show(state, listener_state); - ascent_rate.show(state, listener_state); - course.show(state, listener_state); - gps_locked.show(state, listener_state); + + for (AltosUIIndicator i : indicators) + i.show(state, listener_state); } - public void labels(GridBagLayout layout, int y) { + public void labels(Container container, int y) { + GridBagLayout layout = (GridBagLayout)(container.getLayout()); GridBagConstraints c; cur = new JLabel("Current"); @@ -488,28 +223,32 @@ public class TeleGPSInfo extends JComponent implements AltosFlightDisplay { } public String getName() { - return "Info"; + return "Location"; } - public TeleGPSInfo() { - layout = new GridBagLayout(); + public void hierarchyChanged(HierarchyEvent e) { + if (last_state != null && isShowing()) { + AltosState state = last_state; + AltosListenerState listener_state = last_listener_state; - setLayout(layout); + last_state = null; + last_listener_state = null; + show(state, listener_state); + } + } + + public TeleGPSInfo() { + setLayout(new GridBagLayout()); - /* Elements in ascent display: - * - * lat - * lon - * height - */ int y = 0; - labels(layout, y++); - altitude = new Altitude(layout, y++); - ground_speed = new GroundSpeed(layout, y++); - ascent_rate = new AscentRate(layout, y++); - course = new Course(layout, y++); - lat = new Lat(layout, y++); - lon = new Lon(layout, y++); - gps_locked = new GPSLocked(layout, y++); + labels(this, y++); + indicators.add(new Altitude(this, y++)); + indicators.add(new GroundSpeed(this, y++)); + indicators.add(new AscentRate(this, y++)); + indicators.add(new Course(this, y++)); + indicators.add(new Lat(this, y++)); + indicators.add(new Lon(this, y++)); + indicators.add(new GPSLocked(this, y++)); + addHierarchyListener(this); } }