summaryrefslogtreecommitdiff
path: root/altosuilib
diff options
context:
space:
mode:
Diffstat (limited to 'altosuilib')
-rw-r--r--altosuilib/AltosFlightStatsTable.java84
-rw-r--r--altosuilib/AltosGraph.java8
-rw-r--r--altosuilib/AltosUIEnable.java82
-rw-r--r--altosuilib/AltosUIGraph.java4
-rw-r--r--altosuilib/AltosUITimeSeries.java3
5 files changed, 152 insertions, 29 deletions
diff --git a/altosuilib/AltosFlightStatsTable.java b/altosuilib/AltosFlightStatsTable.java
index 415c0244..8f7e9bff 100644
--- a/altosuilib/AltosFlightStatsTable.java
+++ b/altosuilib/AltosFlightStatsTable.java
@@ -38,6 +38,11 @@ public class AltosFlightStatsTable extends JComponent implements AltosFontListen
value[i].setFont(AltosUILib.value_font);
}
+ public void set(String ... values) {
+ for (int j = 0; j < values.length; j++)
+ value[j].setText(values[j]);
+ }
+
public FlightStat(GridBagLayout layout, int y, String label_text, String ... values) {
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(AltosUILib.tab_elt_pad, AltosUILib.tab_elt_pad, AltosUILib.tab_elt_pad, AltosUILib.tab_elt_pad);
@@ -87,6 +92,43 @@ public class AltosFlightStatsTable extends JComponent implements AltosFontListen
return String.format("%s %4d° %9.6f'", h, deg, min);
}
+ private FlightStat max_height_stat;
+ private FlightStat max_speed_stat;
+ private FlightStat max_accel_stat;
+ private FlightStat boost_accel_stat;
+ private FlightStat drogue_descent_stat;
+ private FlightStat main_descent_stat;
+
+ public void set_values(AltosFlightStats stats) {
+ if (max_height_stat != null && stats.max_height != AltosLib.MISSING) {
+ max_height_stat.set(String.format("%6.1f m", stats.max_height),
+ String.format("%5.0f ft", AltosConvert.meters_to_feet(stats.max_height)));
+ }
+ if (max_speed_stat != null && stats.max_speed != AltosLib.MISSING) {
+ max_speed_stat.set(String.format("%6.1f m/s", stats.max_speed),
+ String.format("%5.0f fps", AltosConvert.mps_to_fps(stats.max_speed)),
+ String.format("Mach %4.1f", AltosConvert.meters_to_mach(stats.max_speed)));
+ }
+ if (max_accel_stat != null && stats.max_acceleration != AltosLib.MISSING) {
+ max_accel_stat.set(String.format("%6.1f m/s²", stats.max_acceleration),
+ String.format("%5.0f ft/s²", AltosConvert.meters_to_feet(stats.max_acceleration)),
+ String.format("%6.2f G", AltosConvert.meters_to_g(stats.max_acceleration)));
+ }
+ if (boost_accel_stat != null && stats.state_accel[AltosLib.ao_flight_boost] != AltosLib.MISSING) {
+ boost_accel_stat.set(String.format("%6.1f m/s²", stats.state_accel[AltosLib.ao_flight_boost]),
+ String.format("%5.0f ft/s²", AltosConvert.meters_to_feet(stats.state_accel[AltosLib.ao_flight_boost])),
+ String.format("%6.2f G", AltosConvert.meters_to_g(stats.state_accel[AltosLib.ao_flight_boost])));
+ }
+ if (drogue_descent_stat != null && stats.state_speed[AltosLib.ao_flight_drogue] != AltosLib.MISSING) {
+ drogue_descent_stat.set(String.format("%6.1f m/s", -stats.state_speed[AltosLib.ao_flight_drogue]),
+ String.format("%5.0f ft/s", -AltosConvert.meters_to_feet(stats.state_speed[AltosLib.ao_flight_drogue])));
+ }
+ if (main_descent_stat != null && stats.state_speed[AltosLib.ao_flight_main] != AltosLib.MISSING) {
+ main_descent_stat.set(String.format("%6.1f m/s", -stats.state_speed[AltosLib.ao_flight_main]),
+ String.format("%5.0f ft/s", -AltosConvert.meters_to_feet(stats.state_speed[AltosLib.ao_flight_main])));
+ }
+ }
+
public void set_stats(AltosFlightStats stats) {
int y = 0;
if (stats.serial != AltosLib.MISSING) {
@@ -113,9 +155,9 @@ public class AltosFlightStatsTable extends JComponent implements AltosFontListen
String.format("%02d:%02d:%02d UTC", stats.hour, stats.minute, stats.second));
}
if (stats.max_height != AltosLib.MISSING) {
- new FlightStat(layout, y++, "Maximum height",
- String.format("%6.1f m", stats.max_height),
- String.format("%5.0f ft", AltosConvert.meters_to_feet(stats.max_height)));
+ max_height_stat = new FlightStat(layout, y++, "Maximum height",
+ String.format("%6.1f m", stats.max_height),
+ String.format("%5.0f ft", AltosConvert.meters_to_feet(stats.max_height)));
}
if (stats.max_gps_height != AltosLib.MISSING) {
new FlightStat(layout, y++, "Maximum GPS height",
@@ -123,21 +165,21 @@ public class AltosFlightStatsTable extends JComponent implements AltosFontListen
String.format("%5.0f ft", AltosConvert.meters_to_feet(stats.max_gps_height)));
}
if (stats.max_speed != AltosLib.MISSING) {
- new FlightStat(layout, y++, "Maximum speed",
- String.format("%6.1f m/s", stats.max_speed),
- String.format("%5.0f fps", AltosConvert.mps_to_fps(stats.max_speed)),
- String.format("Mach %4.1f", AltosConvert.meters_to_mach(stats.max_speed)));
+ max_speed_stat = new FlightStat(layout, y++, "Maximum speed",
+ String.format("%6.1f m/s", stats.max_speed),
+ String.format("%5.0f fps", AltosConvert.mps_to_fps(stats.max_speed)),
+ String.format("Mach %4.1f", AltosConvert.meters_to_mach(stats.max_speed)));
}
if (stats.max_acceleration != AltosLib.MISSING)
- new FlightStat(layout, y++, "Maximum boost acceleration",
- String.format("%6.1f m/s²", stats.max_acceleration),
- String.format("%5.0f ft/s²", AltosConvert.meters_to_feet(stats.max_acceleration)),
- String.format("%6.2f G", AltosConvert.meters_to_g(stats.max_acceleration)));
+ max_accel_stat = new FlightStat(layout, y++, "Maximum boost acceleration",
+ String.format("%6.1f m/s²", stats.max_acceleration),
+ String.format("%5.0f ft/s²", AltosConvert.meters_to_feet(stats.max_acceleration)),
+ String.format("%6.2f G", AltosConvert.meters_to_g(stats.max_acceleration)));
if (stats.state_accel[AltosLib.ao_flight_boost] != AltosLib.MISSING)
- new FlightStat(layout, y++, "Average boost acceleration",
- String.format("%6.1f m/s²", stats.state_accel[AltosLib.ao_flight_boost]),
- String.format("%5.0f ft/s²", AltosConvert.meters_to_feet(stats.state_accel[AltosLib.ao_flight_boost])),
- String.format("%6.2f G", AltosConvert.meters_to_g(stats.state_accel[AltosLib.ao_flight_boost])));
+ boost_accel_stat = new FlightStat(layout, y++, "Average boost acceleration",
+ String.format("%6.1f m/s²", stats.state_accel[AltosLib.ao_flight_boost]),
+ String.format("%5.0f ft/s²", AltosConvert.meters_to_feet(stats.state_accel[AltosLib.ao_flight_boost])),
+ String.format("%6.2f G", AltosConvert.meters_to_g(stats.state_accel[AltosLib.ao_flight_boost])));
if (stats.state_time[AltosLib.ao_flight_boost] != 0 || stats.state_time[AltosLib.ao_flight_fast] != 0 || stats.state_time[AltosLib.ao_flight_coast] != 0) {
double boost_time = stats.state_time[AltosLib.ao_flight_boost];
@@ -167,14 +209,14 @@ public class AltosFlightStatsTable extends JComponent implements AltosFontListen
label = "Descent rate";
else
label = "Drogue descent rate";
- new FlightStat(layout, y++, label,
+ drogue_descent_stat = new FlightStat(layout, y++, label,
String.format("%6.1f m/s", -stats.state_speed[AltosLib.ao_flight_drogue]),
String.format("%5.0f ft/s", -AltosConvert.meters_to_feet(stats.state_speed[AltosLib.ao_flight_drogue])));
}
if (stats.state_speed[AltosLib.ao_flight_main] != AltosLib.MISSING)
- new FlightStat(layout, y++, "Main descent rate",
- String.format("%6.1f m/s", -stats.state_speed[AltosLib.ao_flight_main]),
- String.format("%5.0f ft/s", -AltosConvert.meters_to_feet(stats.state_speed[AltosLib.ao_flight_main])));
+ main_descent_stat = new FlightStat(layout, y++, "Main descent rate",
+ String.format("%6.1f m/s", -stats.state_speed[AltosLib.ao_flight_main]),
+ String.format("%5.0f ft/s", -AltosConvert.meters_to_feet(stats.state_speed[AltosLib.ao_flight_main])));
if (stats.state_time[AltosLib.ao_flight_drogue] != 0 || stats.state_time[AltosLib.ao_flight_main] != 0) {
double drogue_duration = stats.state_time[AltosLib.ao_flight_drogue];
double main_duration = stats.state_time[AltosLib.ao_flight_main];
@@ -210,6 +252,10 @@ public class AltosFlightStatsTable extends JComponent implements AltosFontListen
AltosUIPreferences.unregister_font_listener(this);
}
+ public void filter_changed(AltosFlightStats stats) {
+ set_values(stats);
+ }
+
public AltosFlightStatsTable() {
layout = new GridBagLayout();
diff --git a/altosuilib/AltosGraph.java b/altosuilib/AltosGraph.java
index 5df95233..3f610285 100644
--- a/altosuilib/AltosGraph.java
+++ b/altosuilib/AltosGraph.java
@@ -92,7 +92,7 @@ public class AltosGraph extends AltosUIGraph {
AltosUIAxis gyro_axis, orient_axis, mag_axis;
AltosUIAxis course_axis, dop_axis, tick_axis;
- if (stats.serial != AltosLib.MISSING && stats.product != null && stats.flight != AltosLib.MISSING)
+ if (stats != null && stats.serial != AltosLib.MISSING && stats.product != null && stats.flight != AltosLib.MISSING)
setName(String.format("%s %d flight %d\n", stats.product, stats.serial, stats.flight));
height_axis = newAxis("Height", AltosConvert.height, height_color);
@@ -327,12 +327,6 @@ public class AltosGraph extends AltosUIGraph {
return flight_series.series(cal_data);
}
- public void set_filter(double filter) {
- System.out.printf("filter set to %f\n", filter);
- flight_series.set_filter(filter, filter);
- units_changed(false);
- }
-
public void set_data(AltosFlightStats stats, AltosUIFlightSeries flight_series) {
set_series(setup(stats, flight_series));
}
diff --git a/altosuilib/AltosUIEnable.java b/altosuilib/AltosUIEnable.java
index 0c23fa8d..4bd07c52 100644
--- a/altosuilib/AltosUIEnable.java
+++ b/altosuilib/AltosUIEnable.java
@@ -21,6 +21,7 @@ package org.altusmetrum.altosuilib_12;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
+import javax.swing.event.*;
import java.io.*;
import java.util.concurrent.*;
import java.util.*;
@@ -36,12 +37,17 @@ import org.jfree.chart.labels.*;
import org.jfree.data.xy.*;
import org.jfree.data.*;
-public class AltosUIEnable extends Container {
+public class AltosUIEnable extends Container implements ChangeListener {
Insets il, ir;
int y;
int x;
JCheckBox imperial_units;
+ JLabel speed_filter_label;
+ JSlider speed_filter;
+ JLabel accel_filter_label;
+ JSlider accel_filter;
+ AltosFilterListener filter_listener;
static final int max_rows = 14;
@@ -69,11 +75,15 @@ public class AltosUIEnable extends Container {
}
}
+ LinkedList<GraphElement> elements = new LinkedList<GraphElement>();
+
public void add(String name, AltosUIGrapher grapher, boolean enabled) {
GraphElement e = new GraphElement(name, grapher, enabled);
GridBagConstraints c = new GridBagConstraints();
+ elements.add(e);
+
/* Add element */
c = new GridBagConstraints();
c.gridx = x; c.gridy = y;
@@ -90,6 +100,17 @@ public class AltosUIEnable extends Container {
}
}
+ public void stateChanged(ChangeEvent e) {
+ JSlider filter = (JSlider) e.getSource();
+ if (!filter.getValueIsAdjusting()) {
+ double speed_value = (int) speed_filter.getValue() / 1000.0;
+ double accel_value = (int) accel_filter.getValue() / 1000.0;
+ if (filter_listener != null) {
+ filter_listener.filter_changed(speed_value, accel_value);
+ }
+ }
+ }
+
public void add_units() {
/* Imperial units setting */
@@ -109,9 +130,66 @@ public class AltosUIEnable extends Container {
c.anchor = GridBagConstraints.LINE_START;
c.insets = il;
add(imperial_units, c);
+
+ speed_filter_label = new JLabel("Speed Filter(ms)");
+ c = new GridBagConstraints();
+ c.gridx = 0; c.gridy = 1001;
+ c.fill = GridBagConstraints.NONE;
+ c.anchor = GridBagConstraints.LINE_START;
+ c.insets = il;
+ add(speed_filter_label, c);
+
+ speed_filter = new JSlider(JSlider.HORIZONTAL, 0, 10000, (int) (filter_listener.speed_filter() * 1000.0));
+ Hashtable<Integer,JLabel> label_table = new Hashtable<Integer,JLabel>();
+ for (int i = 0; i <= 10000; i += 5000) {
+ label_table.put(new Integer(i), new JLabel(String.format("%d", i)));
+ }
+ speed_filter.setPaintTicks(true);
+ speed_filter.setMajorTickSpacing(1000);
+ speed_filter.setMinorTickSpacing(250);
+ speed_filter.setLabelTable(label_table);
+ speed_filter.setPaintTrack(false);
+ speed_filter.setSnapToTicks(true);
+ speed_filter.setPaintLabels(true);
+ speed_filter.addChangeListener(this);
+
+ c = new GridBagConstraints();
+ c.gridx = 1; c.gridy = 1001;
+ c.gridwidth = 1000; c.gridheight = 1;
+ c.fill = GridBagConstraints.BOTH;
+ c.anchor = GridBagConstraints.LINE_START;
+ c.insets = il;
+ add(speed_filter, c);
+
+ accel_filter_label = new JLabel("Acceleration Filter(ms)");
+ c = new GridBagConstraints();
+ c.gridx = 0; c.gridy = 1002;
+ c.fill = GridBagConstraints.NONE;
+ c.anchor = GridBagConstraints.LINE_START;
+ c.insets = il;
+ add(accel_filter_label, c);
+
+ accel_filter = new JSlider(JSlider.HORIZONTAL, 0, 10000, (int) (filter_listener.accel_filter() * 1000.0));
+ accel_filter.setPaintTicks(true);
+ accel_filter.setMajorTickSpacing(1000);
+ accel_filter.setMinorTickSpacing(250);
+ accel_filter.setLabelTable(label_table);
+ accel_filter.setPaintTrack(false);
+ accel_filter.setSnapToTicks(true);
+ accel_filter.setPaintLabels(true);
+ accel_filter.addChangeListener(this);
+
+ c = new GridBagConstraints();
+ c.gridx = 1; c.gridy = 1002;
+ c.gridwidth = 1000; c.gridheight = 1;
+ c.fill = GridBagConstraints.BOTH;
+ c.anchor = GridBagConstraints.LINE_START;
+ c.insets = il;
+ add(accel_filter, c);
}
- public AltosUIEnable() {
+ public AltosUIEnable(AltosFilterListener filter_listener) {
+ this.filter_listener = filter_listener;
il = new Insets(4,4,4,4);
ir = new Insets(4,4,4,4);
x = 0;
diff --git a/altosuilib/AltosUIGraph.java b/altosuilib/AltosUIGraph.java
index 0caabcfa..efc3d493 100644
--- a/altosuilib/AltosUIGraph.java
+++ b/altosuilib/AltosUIGraph.java
@@ -95,6 +95,10 @@ public class AltosUIGraph implements AltosUnitsListener {
s.set_units();
}
+ public void filter_changed() {
+ units_changed(false);
+ }
+
public void setName (String name) {
chart.setTitle(name);
}
diff --git a/altosuilib/AltosUITimeSeries.java b/altosuilib/AltosUITimeSeries.java
index 08f95ca7..71166064 100644
--- a/altosuilib/AltosUITimeSeries.java
+++ b/altosuilib/AltosUITimeSeries.java
@@ -89,7 +89,7 @@ public class AltosUITimeSeries extends AltosTimeSeries implements AltosUIGrapher
public void fireSeriesChanged() {
}
- void set_data() {
+ public void set_data() {
if (marker) {
if (markers != null) {
for (ValueMarker marker : markers)
@@ -124,6 +124,7 @@ public class AltosUITimeSeries extends AltosTimeSeries implements AltosUIGrapher
}
xy_series.setNotify(true);
}
+ clear_changed();
}
public void set_units() {