2 // Copyright (c) 2010 Anthony Towns
8 import java.util.ArrayList;
10 import javax.swing.JFrame;
11 import java.awt.Color;
13 import org.jfree.chart.ChartPanel;
14 import org.jfree.chart.ChartUtilities;
15 import org.jfree.chart.JFreeChart;
16 import org.jfree.chart.axis.AxisLocation;
17 import org.jfree.ui.ApplicationFrame;
18 import org.jfree.ui.RefineryUtilities;
20 import altosui.AltosDataPoint;
21 import altosui.AltosGraphTime;
23 public class AltosGraphUI extends JFrame
25 static final private Color red = new Color(194,31,31);
26 static final private Color green = new Color(31,194,31);
27 static final private Color blue = new Color(31,31,194);
28 static final private Color black = new Color(31,31,31);
30 static private class OverallGraphs {
31 AltosGraphTime.Element height =
32 new AltosGraphTime.TimeSeries("Height (m)", "Height (AGL)", red) {
33 public void gotTimeData(double time, AltosDataPoint d) {
34 series.add(time, d.height());
38 AltosGraphTime.Element speed =
39 new AltosGraphTime.TimeSeries("Speed (m/s)", "Vertical Speed", green) {
40 public void gotTimeData(double time, AltosDataPoint d) {
41 if (d.state() < Altos.ao_flight_drogue) {
42 series.add(time, d.accel_speed());
44 series.add(time, d.baro_speed());
49 AltosGraphTime.Element acceleration =
50 new AltosGraphTime.TimeSeries("Acceleration (m/s\u00B2)",
51 "Axial Acceleration", blue)
53 public void gotTimeData(double time, AltosDataPoint d) {
54 series.add(time, d.acceleration());
58 AltosGraphTime.Element temperature =
59 new AltosGraphTime.TimeSeries("Temperature (\u00B0C)",
60 "Board temperature", red)
62 public void gotTimeData(double time, AltosDataPoint d) {
63 series.add(time, d.temperature());
67 AltosGraphTime.Element drogue_voltage =
68 new AltosGraphTime.TimeSeries("Voltage (V)", "Drogue Continuity", blue)
70 public void gotTimeData(double time, AltosDataPoint d) {
71 series.add(time, d.drogue_voltage());
75 AltosGraphTime.Element main_voltage =
76 new AltosGraphTime.TimeSeries("Voltage (V)", "Main Continuity", green)
78 public void gotTimeData(double time, AltosDataPoint d) {
79 series.add(time, d.main_voltage());
83 AltosGraphTime.Element e_pad = new AltosGraphTime.StateMarker(Altos.ao_flight_pad, "Pad");
84 AltosGraphTime.Element e_boost = new AltosGraphTime.StateMarker(Altos.ao_flight_boost, "Boost");
85 AltosGraphTime.Element e_fast = new AltosGraphTime.StateMarker(Altos.ao_flight_fast, "Fast");
86 AltosGraphTime.Element e_coast = new AltosGraphTime.StateMarker(Altos.ao_flight_coast, "Coast");
87 AltosGraphTime.Element e_drogue = new AltosGraphTime.StateMarker(Altos.ao_flight_drogue, "Drogue");
88 AltosGraphTime.Element e_main = new AltosGraphTime.StateMarker(Altos.ao_flight_main, "Main");
89 AltosGraphTime.Element e_landed = new AltosGraphTime.StateMarker(Altos.ao_flight_landed, "Landed");
91 protected AltosGraphTime myAltosGraphTime(String suffix) {
92 return (new AltosGraphTime("Overall " + suffix))
96 .addElement(e_landed);
99 public ArrayList<AltosGraph> graphs() {
100 ArrayList<AltosGraph> graphs = new ArrayList<AltosGraph>();
102 graphs.add( myAltosGraphTime("Summary")
105 .addElement(acceleration) );
107 graphs.add( myAltosGraphTime("Altitude")
108 .addElement(height) );
110 graphs.add( myAltosGraphTime("Speed")
111 .addElement(speed) );
113 graphs.add( myAltosGraphTime("Acceleration")
114 .addElement(acceleration) );
116 graphs.add( myAltosGraphTime("Temperature")
117 .addElement(temperature) );
119 graphs.add( myAltosGraphTime("Continuity")
120 .addElement(drogue_voltage)
121 .addElement(main_voltage) );
127 static private class AscentGraphs extends OverallGraphs {
128 protected AltosGraphTime myAltosGraphTime(String suffix) {
129 return (new AltosGraphTime("Ascent " + suffix) {
130 public void addData(AltosDataPoint d) {
131 int state = d.state();
132 if (Altos.ao_flight_boost <= state && state <= Altos.ao_flight_coast) {
136 }).addElement(e_boost)
138 .addElement(e_coast);
142 static private class DescentGraphs extends OverallGraphs {
143 protected AltosGraphTime myAltosGraphTime(String suffix) {
144 return (new AltosGraphTime("Descent " + suffix) {
145 public void addData(AltosDataPoint d) {
146 int state = d.state();
147 if (Altos.ao_flight_drogue <= state && state <= Altos.ao_flight_main) {
151 }).addElement(e_drogue)
153 // ((XYGraph)graph[8]).ymin = new Double(-50);
157 public AltosGraphUI(JFrame frame)
159 super("Altos Graph");
161 AltosGraphDataChooser chooser;
162 chooser = new AltosGraphDataChooser(frame);
163 Iterable<AltosDataPoint> reader = chooser.runDialog();
170 public AltosGraphUI(Iterable<AltosDataPoint> data, int which)
172 super("Altos Graph");
176 private void init(Iterable<AltosDataPoint> data, int which) {
177 AltosGraph graph = createGraph(data, which);
179 JFreeChart chart = graph.createChart();
180 ChartPanel chartPanel = new ChartPanel(chart);
181 chartPanel.setMouseWheelEnabled(true);
182 chartPanel.setPreferredSize(new java.awt.Dimension(800, 500));
183 setContentPane(chartPanel);
187 RefineryUtilities.centerFrameOnScreen(this);
189 setDefaultCloseOperation(DISPOSE_ON_CLOSE);
193 private static AltosGraph createGraph(Iterable<AltosDataPoint> data,
196 return createGraphsWhich(data, which).get(0);
199 private static ArrayList<AltosGraph> createGraphs(
200 Iterable<AltosDataPoint> data)
202 return createGraphsWhich(data, -1);
205 private static ArrayList<AltosGraph> createGraphsWhich(
206 Iterable<AltosDataPoint> data, int which)
208 ArrayList<AltosGraph> graph = new ArrayList<AltosGraph>();
209 graph.addAll((new OverallGraphs()).graphs());
210 graph.addAll((new AscentGraphs()).graphs());
211 graph.addAll((new DescentGraphs()).graphs());
214 if (which >= graph.size()) {
217 AltosGraph g = graph.get(which);
218 graph = new ArrayList<AltosGraph>();
222 for (AltosDataPoint dp : data) {
223 for (AltosGraph g : graph) {
236 --------------------------------------------------------
239 "ascent-gps-accuracy.png" "Vertical error margin to apogee - GPS v Baro (m)"
240 5:($7 < 6 ? $24-$11 : 1/0)
241 "descent-gps-accuracy.png" "Vertical error margin during descent - GPS v Baro (m)"
242 5:($7 < 6 ? 1/0 : $24-$11)
244 set output "overall-gps-accuracy.png"
245 set ylabel "distance above sea level (m)"
246 plot "telemetry.csv" using 5:11 with lines ti "baro altitude" axis x1y1, \
247 "telemetry.csv" using 5:24 with lines ti "gps altitude" axis x1y1
249 set term png tiny size 700,700 enhanced
257 set output "overall-gps-path.png"
258 #:30 with yerrorlines
259 plot "telemetry.csv" using (90-$33):($7 == 2 ? $31 : 1/0) with lines ti "pad", \
260 "telemetry.csv" using (90-$33):($7 == 3 ? $31 : 1/0) with lines ti "boost", \
261 "telemetry.csv" using (90-$33):($7 == 4 ? $31 : 1/0) with lines ti "fast", \
262 "telemetry.csv" using (90-$33):($7 == 5 ? $31 : 1/0) with lines ti "coast", \
263 "telemetry.csv" using (90-$33):($7 == 6 ? $31 : 1/0) with lines ti "drogue", \
264 "telemetry.csv" using (90-$33):($7 == 7 ? $31 : 1/0) with lines ti "main", \
265 "telemetry.csv" using (90-$33):($7 == 8 ? $31 : 1/0) with lines ti "landed"
267 set output "ascent-gps-path.png"
268 plot "telemetry.csv" using (90-$33):($7 == 2 ? $31 : 1/0):30 with lines ti "pad", \
269 "telemetry.csv" using (90-$33):($7 == 3 ? $31 : 1/0):20 with lines ti "boost", \
270 "telemetry.csv" using (90-$33):($7 == 4 ? $31 : 1/0):10 with lines ti "fast", \
271 "telemetry.csv" using (90-$33):($7 == 5 ? $31 : 1/0):5 with lines ti "coast"
273 set output "descent-gps-path.png"
274 plot "telemetry.csv" using (90-$33):($7 == 6 ? $31 : 1/0) with lines ti "drogue", \
275 "telemetry.csv" using (90-$33):($7 == 7 ? $31 : 1/0) with lines ti "main", \
276 "telemetry.csv" using (90-$33):($7 == 8 ? $31 : 1/0) with lines ti "landed"