telegps: Add graph display
authorKeith Packard <keithp@keithp.com>
Thu, 29 May 2014 21:36:14 +0000 (14:36 -0700)
committerKeith Packard <keithp@keithp.com>
Thu, 29 May 2014 21:36:14 +0000 (14:36 -0700)
Moved the altosui graph files to altosuilib and fixed things up.

Signed-off-by: Keith Packard <keithp@keithp.com>
14 files changed:
altoslib/AltosLib.java
altosui/AltosGraph.java [deleted file]
altosui/AltosGraphDataPoint.java [deleted file]
altosui/AltosGraphDataSet.java [deleted file]
altosui/AltosGraphUI.java
altosui/AltosIgnitor.java
altosui/Makefile.am
altosuilib/AltosGraph.java [new file with mode: 0644]
altosuilib/AltosGraphDataPoint.java [new file with mode: 0644]
altosuilib/AltosGraphDataSet.java [new file with mode: 0644]
altosuilib/AltosUIGraph.java
altosuilib/Makefile.am
telegps/Makefile.am
telegps/TeleGPS.java

index 5e18202fae639b966e763ced7f47792bd1b32d91..3aef077abe8588f893d3bddbd704b9880318c140 100644 (file)
@@ -479,4 +479,8 @@ public class AltosLib {
                default: return "unknown";
                }
        }
                default: return "unknown";
                }
        }
+
+       public static String ignitor_name(int i) {
+               return String.format("Ignitor %c", 'A' + i);
+       }
 }
 }
diff --git a/altosui/AltosGraph.java b/altosui/AltosGraph.java
deleted file mode 100644 (file)
index ba3875c..0000000
+++ /dev/null
@@ -1,429 +0,0 @@
-/*
- * Copyright © 2013 Keith Packard <keithp@keithp.com>
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-
-package altosui;
-
-import java.io.*;
-import java.util.ArrayList;
-
-import java.awt.*;
-import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
-
-import org.jfree.ui.*;
-import org.jfree.chart.*;
-import org.jfree.chart.plot.*;
-import org.jfree.chart.axis.*;
-import org.jfree.chart.renderer.*;
-import org.jfree.chart.renderer.xy.*;
-import org.jfree.chart.labels.*;
-import org.jfree.data.xy.*;
-import org.jfree.data.*;
-
-class AltosVoltage extends AltosUnits {
-
-       public double value(double v, boolean imperial_units) {
-               return v;
-       }
-
-       public double inverse(double v, boolean imperial_units) {
-               return v;
-       }
-
-       public String show_units(boolean imperial_units) {
-               return "V";
-       }
-
-       public String say_units(boolean imperial_units) {
-               return "volts";
-       }
-
-       public int show_fraction(int width, boolean imperial_units) {
-               return width / 2;
-       }
-}
-
-class AltosNsat extends AltosUnits {
-
-       public double value(double v, boolean imperial_units) {
-               return v;
-       }
-
-       public double inverse(double v, boolean imperial_units) {
-               return v;
-       }
-
-       public String show_units(boolean imperial_units) {
-               return "Sats";
-       }
-
-       public String say_units(boolean imperial_units) {
-               return "Satellites";
-       }
-
-       public int show_fraction(int width, boolean imperial_units) {
-               return 0;
-       }
-}
-
-class AltosPressure extends AltosUnits {
-
-       public double value(double p, boolean imperial_units) {
-               return p;
-       }
-
-       public double inverse(double p, boolean imperial_units) {
-               return p;
-       }
-
-       public String show_units(boolean imperial_units) {
-               return "Pa";
-       }
-
-       public String say_units(boolean imperial_units) {
-               return "pascals";
-       }
-
-       public int show_fraction(int width, boolean imperial_units) {
-               return 0;
-       }
-}
-
-class AltosDbm extends AltosUnits {
-
-       public double value(double d, boolean imperial_units) {
-               return d;
-       }
-
-       public double inverse(double d, boolean imperial_units) {
-               return d;
-       }
-
-       public String show_units(boolean imperial_units) {
-               return "dBm";
-       }
-
-       public String say_units(boolean imperial_units) {
-               return "D B M";
-       }
-
-       public int show_fraction(int width, boolean imperial_units) {
-               return 0;
-       }
-}
-
-class AltosGyroUnits extends AltosUnits {
-
-       public double value(double p, boolean imperial_units) {
-               return p;
-       }
-
-       public double inverse(double p, boolean imperial_units) {
-               return p;
-       }
-
-       public String show_units(boolean imperial_units) {
-               return "°/sec";
-       }
-
-       public String say_units(boolean imperial_units) {
-               return "degrees per second";
-       }
-
-       public int show_fraction(int width, boolean imperial_units) {
-               return 1;
-       }
-}
-
-class AltosMagUnits extends AltosUnits {
-
-       public double value(double p, boolean imperial_units) {
-               return p;
-       }
-
-       public double inverse(double p, boolean imperial_units) {
-               return p;
-       }
-
-       public String show_units(boolean imperial_units) {
-               return "Ga";
-       }
-
-       public String say_units(boolean imperial_units) {
-               return "gauss";
-       }
-
-       public int show_fraction(int width, boolean imperial_units) {
-               return 2;
-       }
-}
-
-public class AltosGraph extends AltosUIGraph {
-
-       static final private Color height_color = new Color(194,31,31);
-       static final private Color gps_height_color = new Color(150,31,31);
-       static final private Color pressure_color = new Color (225,31,31);
-       static final private Color range_color = new Color(100, 31, 31);
-       static final private Color distance_color = new Color(100, 31, 194);
-       static final private Color speed_color = new Color(31,194,31);
-       static final private Color accel_color = new Color(31,31,194);
-       static final private Color voltage_color = new Color(194, 194, 31);
-       static final private Color battery_voltage_color = new Color(194, 194, 31);
-       static final private Color drogue_voltage_color = new Color(150, 150, 31);
-       static final private Color main_voltage_color = new Color(100, 100, 31);
-       static final private Color gps_nsat_color = new Color (194, 31, 194);
-       static final private Color gps_nsat_solution_color = new Color (194, 31, 194);
-       static final private Color gps_nsat_view_color = new Color (150, 31, 150);
-       static final private Color gps_course_color = new Color (100, 31, 112);
-       static final private Color gps_ground_speed_color = new Color (31, 112, 100);
-       static final private Color gps_climb_rate_color = new Color (31, 31, 112);
-       static final private Color temperature_color = new Color (31, 194, 194);
-       static final private Color dbm_color = new Color(31, 100, 100);
-       static final private Color state_color = new Color(0,0,0);
-       static final private Color accel_x_color = new Color(255, 0, 0);
-       static final private Color accel_y_color = new Color(0, 255, 0);
-       static final private Color accel_z_color = new Color(0, 0, 255);
-       static final private Color gyro_x_color = new Color(192, 0, 0);
-       static final private Color gyro_y_color = new Color(0, 192, 0);
-       static final private Color gyro_z_color = new Color(0, 0, 192);
-       static final private Color mag_x_color = new Color(128, 0, 0);
-       static final private Color mag_y_color = new Color(0, 128, 0);
-       static final private Color mag_z_color = new Color(0, 0, 128);
-       static final private Color orient_color = new Color(31, 31, 31);
-
-       static AltosVoltage voltage_units = new AltosVoltage();
-       static AltosPressure pressure_units = new AltosPressure();
-       static AltosNsat nsat_units = new AltosNsat();
-       static AltosDbm dbm_units = new AltosDbm();
-       static AltosGyroUnits gyro_units = new AltosGyroUnits();
-       static AltosOrient orient_units = new AltosOrient();
-       static AltosMagUnits mag_units = new AltosMagUnits();
-
-       AltosUIAxis     height_axis, speed_axis, accel_axis, voltage_axis, temperature_axis, nsat_axis, dbm_axis;
-       AltosUIAxis     distance_axis, pressure_axis;
-       AltosUIAxis     gyro_axis, orient_axis, mag_axis;
-       AltosUIAxis     course_axis;
-
-       public AltosGraph(AltosUIEnable enable, AltosFlightStats stats, AltosGraphDataSet dataSet) {
-               super(enable);
-
-               height_axis = newAxis("Height", AltosConvert.height, height_color);
-               pressure_axis = newAxis("Pressure", pressure_units, pressure_color, 0);
-               speed_axis = newAxis("Speed", AltosConvert.speed, speed_color);
-               accel_axis = newAxis("Acceleration", AltosConvert.accel, accel_color);
-               voltage_axis = newAxis("Voltage", voltage_units, voltage_color);
-               temperature_axis = newAxis("Temperature", AltosConvert.temperature, temperature_color, 0);
-               nsat_axis = newAxis("Satellites", nsat_units, gps_nsat_color,
-                                   AltosUIAxis.axis_include_zero | AltosUIAxis.axis_integer);
-               dbm_axis = newAxis("Signal Strength", dbm_units, dbm_color, 0);
-               distance_axis = newAxis("Distance", AltosConvert.distance, range_color);
-
-               gyro_axis = newAxis("Rotation Rate", gyro_units, gyro_z_color, 0);
-               orient_axis = newAxis("Tilt Angle", orient_units, orient_color, 0);
-               mag_axis = newAxis("Magnetic Field", mag_units, mag_x_color, 0);
-               course_axis = newAxis("Course", orient_units, gps_course_color, 0);
-
-               addMarker("State", AltosGraphDataPoint.data_state, state_color);
-               addSeries("Height",
-                         AltosGraphDataPoint.data_height,
-                         AltosConvert.height,
-                         height_color,
-                         true,
-                         height_axis);
-               addSeries("Pressure",
-                         AltosGraphDataPoint.data_pressure,
-                         pressure_units,
-                         pressure_color,
-                         false,
-                         pressure_axis);
-               addSeries("Speed",
-                         AltosGraphDataPoint.data_speed,
-                         AltosConvert.speed,
-                         speed_color,
-                         true,
-                         speed_axis);
-               addSeries("Acceleration",
-                         AltosGraphDataPoint.data_accel,
-                         AltosConvert.accel,
-                         accel_color,
-                         true,
-                         accel_axis);
-               if (stats.has_gps) {
-                       addSeries("Range",
-                                 AltosGraphDataPoint.data_range,
-                                 AltosConvert.distance,
-                                 range_color,
-                                 false,
-                                 distance_axis);
-                       addSeries("Distance",
-                                 AltosGraphDataPoint.data_distance,
-                                 AltosConvert.distance,
-                                 distance_color,
-                                 false,
-                                 distance_axis);
-                       addSeries("GPS Height",
-                                 AltosGraphDataPoint.data_gps_height,
-                                 AltosConvert.height,
-                                 gps_height_color,
-                                 false,
-                                 height_axis);
-                       addSeries("GPS Satellites in Solution",
-                                 AltosGraphDataPoint.data_gps_nsat_solution,
-                                 nsat_units,
-                                 gps_nsat_solution_color,
-                                 false,
-                                 nsat_axis);
-                       addSeries("GPS Satellites in View",
-                                 AltosGraphDataPoint.data_gps_nsat_view,
-                                 nsat_units,
-                                 gps_nsat_view_color,
-                                 false,
-                                 nsat_axis);
-                       addSeries("GPS Course",
-                                 AltosGraphDataPoint.data_gps_course,
-                                 orient_units,
-                                 gps_course_color,
-                                 false,
-                                 course_axis);
-                       addSeries("GPS Ground Speed",
-                                 AltosGraphDataPoint.data_gps_ground_speed,
-                                 AltosConvert.speed,
-                                 gps_ground_speed_color,
-                                 false,
-                                 speed_axis);
-                       addSeries("GPS Climb Rate",
-                                 AltosGraphDataPoint.data_gps_climb_rate,
-                                 AltosConvert.speed,
-                                 gps_climb_rate_color,
-                                 false,
-                                 speed_axis);
-               }
-               if (stats.has_rssi)
-                       addSeries("Received Signal Strength",
-                                 AltosGraphDataPoint.data_rssi,
-                                 dbm_units,
-                                 dbm_color,
-                                 false,
-                                 dbm_axis);
-               if (stats.has_other_adc) {
-                       addSeries("Temperature",
-                                 AltosGraphDataPoint.data_temperature,
-                                 AltosConvert.temperature,
-                                 temperature_color,
-                                 false,
-                                 temperature_axis);
-                       addSeries("Battery Voltage",
-                                 AltosGraphDataPoint.data_battery_voltage,
-                                 voltage_units,
-                                 battery_voltage_color,
-                                 false,
-                                 voltage_axis);
-                       addSeries("Drogue Voltage",
-                                 AltosGraphDataPoint.data_drogue_voltage,
-                                 voltage_units,
-                                 drogue_voltage_color,
-                                 false,
-                                 voltage_axis);
-                       addSeries("Main Voltage",
-                                 AltosGraphDataPoint.data_main_voltage,
-                                 voltage_units,
-                                 main_voltage_color,
-                                 false,
-                                 voltage_axis);
-               }
-
-               if (stats.has_imu) {
-                       addSeries("Acceleration X",
-                                 AltosGraphDataPoint.data_accel_x,
-                                 AltosConvert.accel,
-                                 accel_x_color,
-                                 false,
-                                 accel_axis);
-                       addSeries("Acceleration Y",
-                                 AltosGraphDataPoint.data_accel_y,
-                                 AltosConvert.accel,
-                                 accel_y_color,
-                                 false,
-                                 accel_axis);
-                       addSeries("Acceleration Z",
-                                 AltosGraphDataPoint.data_accel_z,
-                                 AltosConvert.accel,
-                                 accel_z_color,
-                                 false,
-                                 accel_axis);
-                       addSeries("Rotation Rate X",
-                                 AltosGraphDataPoint.data_gyro_x,
-                                 gyro_units,
-                                 gyro_x_color,
-                                 false,
-                                 gyro_axis);
-                       addSeries("Rotation Rate Y",
-                                 AltosGraphDataPoint.data_gyro_y,
-                                 gyro_units,
-                                 gyro_y_color,
-                                 false,
-                                 gyro_axis);
-                       addSeries("Rotation Rate Z",
-                                 AltosGraphDataPoint.data_gyro_z,
-                                 gyro_units,
-                                 gyro_z_color,
-                                 false,
-                                 gyro_axis);
-               }
-               if (stats.has_mag) {
-                       addSeries("Magnetometer X",
-                                 AltosGraphDataPoint.data_mag_x,
-                                 mag_units,
-                                 mag_x_color,
-                                 false,
-                                 mag_axis);
-                       addSeries("Magnetometer Y",
-                                 AltosGraphDataPoint.data_mag_y,
-                                 mag_units,
-                                 mag_y_color,
-                                 false,
-                                 mag_axis);
-                       addSeries("Magnetometer Z",
-                                 AltosGraphDataPoint.data_mag_z,
-                                 mag_units,
-                                 mag_z_color,
-                                 false,
-                                 mag_axis);
-               }
-               if (stats.has_orient)
-                       addSeries("Tilt Angle",
-                                 AltosGraphDataPoint.data_orient,
-                                 orient_units,
-                                 orient_color,
-                                 false,
-                                 orient_axis);
-               if (stats.num_ignitor > 0) {
-                       for (int i = 0; i < stats.num_ignitor; i++)
-                               addSeries(AltosIgnitor.ignitor_name(i),
-                                         AltosGraphDataPoint.data_ignitor_0 + i,
-                                         voltage_units,
-                                         main_voltage_color,
-                                         false,
-                                         voltage_axis);
-                       for (int i = 0; i < stats.num_ignitor; i++)
-                               addMarker(AltosIgnitor.ignitor_name(i), AltosGraphDataPoint.data_ignitor_fired_0 + i, state_color);
-               }
-
-               setDataSet(dataSet);
-       }
-}
diff --git a/altosui/AltosGraphDataPoint.java b/altosui/AltosGraphDataPoint.java
deleted file mode 100644 (file)
index 06a9b62..0000000
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright © 2013 Keith Packard <keithp@keithp.com>
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-
-package altosui;
-
-import org.altusmetrum.altosuilib_2.*;
-import org.altusmetrum.altoslib_4.*;
-
-public class AltosGraphDataPoint implements AltosUIDataPoint {
-
-       AltosState      state;
-
-       public static final int data_height = 0;
-       public static final int data_speed = 1;
-       public static final int data_accel = 2;
-       public static final int data_temp = 3;
-       public static final int data_battery_voltage = 4;
-       public static final int data_drogue_voltage = 5;
-       public static final int data_main_voltage = 6;
-       public static final int data_rssi = 7;
-       public static final int data_state = 8;
-       public static final int data_gps_height = 9;
-       public static final int data_gps_nsat_solution = 10;
-       public static final int data_gps_nsat_view = 11;
-       public static final int data_temperature = 12;
-       public static final int data_range = 13;
-       public static final int data_distance = 14;
-       public static final int data_pressure = 15;
-       public static final int data_accel_x = 16;
-       public static final int data_accel_y = 17;
-       public static final int data_accel_z = 18;
-       public static final int data_gyro_x = 19;
-       public static final int data_gyro_y = 20;
-       public static final int data_gyro_z = 21;
-       public static final int data_mag_x = 22;
-       public static final int data_mag_y = 23;
-       public static final int data_mag_z = 24;
-       public static final int data_orient = 25;
-       public static final int data_gps_course = 26;
-       public static final int data_gps_ground_speed = 27;
-       public static final int data_gps_climb_rate = 28;
-       public static final int data_ignitor_0 = 29;
-       public static final int data_ignitor_num = 32;
-       public static final int data_ignitor_max = data_ignitor_0 + data_ignitor_num - 1;
-       public static final int data_ignitor_fired_0 = data_ignitor_0 + data_ignitor_num;
-       public static final int data_ignitor_fired_max = data_ignitor_fired_0 + data_ignitor_num - 1;
-
-       public double x() throws AltosUIDataMissing {
-               double  time = state.time_since_boost();
-               if (time < -2)
-                       throw new AltosUIDataMissing(-1);
-               return time;
-       }
-
-       public double y(int index) throws AltosUIDataMissing {
-               double y = AltosLib.MISSING;
-               switch (index) {
-               case data_height:
-                       y = state.height();
-                       break;
-               case data_speed:
-                       y = state.speed();
-                       break;
-               case data_accel:
-                       y = state.acceleration();
-                       break;
-               case data_temp:
-                       y = state.temperature;
-                       break;
-               case data_battery_voltage:
-                       y = state.battery_voltage;
-                       break;
-               case data_drogue_voltage:
-                       y = state.apogee_voltage;
-                       break;
-               case data_main_voltage:
-                       y = state.main_voltage;
-                       break;
-               case data_rssi:
-                       y = state.rssi;
-                       break;
-               case data_gps_height:
-                       y = state.gps_height;
-                       break;
-               case data_gps_nsat_solution:
-                       if (state.gps != null)
-                               y = state.gps.nsat;
-                       break;
-               case data_gps_nsat_view:
-                       if (state.gps != null && state.gps.cc_gps_sat != null)
-                               y = state.gps.cc_gps_sat.length;
-                       break;
-               case data_temperature:
-                       y = state.temperature;
-                       break;
-               case data_range:
-                       y = state.range;
-                       break;
-               case data_distance:
-                       if (state.from_pad != null)
-                               y = state.from_pad.distance;
-                       break;
-               case data_pressure:
-                       y = state.pressure();
-                       break;
-
-               case data_accel_x:
-               case data_accel_y:
-               case data_accel_z:
-               case data_gyro_x:
-               case data_gyro_y:
-               case data_gyro_z:
-                       AltosIMU        imu = state.imu;
-                       if (imu == null)
-                               break;
-                       switch (index) {
-                       case data_accel_x:
-                               y = imu.accel_x;
-                               break;
-                       case data_accel_y:
-                               y = imu.accel_y;
-                               break;
-                       case data_accel_z:
-                               y = imu.accel_z;
-                               break;
-                       case data_gyro_x:
-                               y = imu.gyro_x;
-                               break;
-                       case data_gyro_y:
-                               y = imu.gyro_y;
-                               break;
-                       case data_gyro_z:
-                               y = imu.gyro_z;
-                               break;
-                       }
-                       break;
-               case data_mag_x:
-               case data_mag_y:
-               case data_mag_z:
-                       AltosMag        mag = state.mag;
-                       if (mag == null)
-                               break;
-                       switch (index) {
-                       case data_mag_x:
-                               y = mag.x;
-                               break;
-                       case data_mag_y:
-                               y = mag.y;
-                               break;
-                       case data_mag_z:
-                               y = mag.z;
-                               break;
-                       }
-                       break;
-               case data_orient:
-                       y = state.orient();
-                       break;
-               case data_gps_course:
-                       if (state.gps != null)
-                               y = state.gps.course;
-                       else
-                               y = AltosLib.MISSING;
-                       break;
-               case data_gps_ground_speed:
-                       if (state.gps != null)
-                               y = state.gps.ground_speed;
-                       else
-                               y = AltosLib.MISSING;
-                       break;
-               case data_gps_climb_rate:
-                       if (state.gps != null)
-                               y = state.gps.climb_rate;
-                       else
-                               y = AltosLib.MISSING;
-                       break;
-               default:
-                       if (data_ignitor_0 <= index && index <= data_ignitor_max) {
-                               int ignitor = index - data_ignitor_0;
-                               if (state.ignitor_voltage != null && ignitor < state.ignitor_voltage.length)
-                                       y = state.ignitor_voltage[ignitor];
-                       } else if (data_ignitor_fired_0 <= index && index <= data_ignitor_fired_max) {
-                               int ignitor = index - data_ignitor_fired_0;
-                               if (state.ignitor_voltage != null && ignitor < state.ignitor_voltage.length) {
-                                       if ((state.pyro_fired & (1 << ignitor)) != 0)
-                                               y = 1;
-                                       else
-                                               y = 0;
-                               }
-                       }
-                       break;
-               }
-               if (y == AltosLib.MISSING)
-                       throw new AltosUIDataMissing(index);
-               return y;
-       }
-
-       public int id(int index) {
-               if (index == data_state) {
-                       int s = state.state;
-                       if (Altos.ao_flight_boost <= s && s <= Altos.ao_flight_landed)
-                               return s;
-               } else if (data_ignitor_fired_0 <= index && index <= data_ignitor_fired_max) {
-                       int ignitor = index - data_ignitor_fired_0;
-                       if (state.ignitor_voltage != null && ignitor < state.ignitor_voltage.length) {
-                               if (state.ignitor_voltage != null && ignitor < state.ignitor_voltage.length) {
-                                       if ((state.pyro_fired & (1 << ignitor)) != 0)
-                                               return 1;
-                               }
-                       }
-               }
-               return -1;
-       }
-
-       public String id_name(int index) {
-               if (index == data_state) {
-                       return state.state_name();
-               } else if (data_ignitor_fired_0 <= index && index <= data_ignitor_fired_max) {
-                       int ignitor = index - data_ignitor_fired_0;
-                       if (state.ignitor_voltage != null && ignitor < state.ignitor_voltage.length)
-                               return AltosIgnitor.ignitor_name(ignitor);
-               }
-               return "";
-       }
-
-       public AltosGraphDataPoint (AltosState state) {
-               this.state = state;
-       }
-}
diff --git a/altosui/AltosGraphDataSet.java b/altosui/AltosGraphDataSet.java
deleted file mode 100644 (file)
index a90c256..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright © 2013 Keith Packard <keithp@keithp.com>
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-
-package altosui;
-
-import java.lang.*;
-import java.io.*;
-import java.util.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
-
-class AltosGraphIterator implements Iterator<AltosUIDataPoint> {
-       AltosGraphDataSet       dataSet;
-       Iterator<AltosState>    iterator;
-
-       public boolean hasNext() {
-               return iterator.hasNext();
-       }
-
-       public AltosUIDataPoint next() {
-               AltosState      state = iterator.next();
-
-               if (state.flight != AltosLib.MISSING) {
-                       if (dataSet.callsign == null && state.callsign != null)
-                               dataSet.callsign = state.callsign;
-
-                       if (dataSet.serial == 0 && state.serial != 0)
-                               dataSet.serial = state.serial;
-
-                       if (dataSet.flight == 0 && state.flight != 0)
-                               dataSet.flight = state.flight;
-               }
-
-               return new AltosGraphDataPoint(state);
-       }
-
-       public AltosGraphIterator (Iterator<AltosState> iterator, AltosGraphDataSet dataSet) {
-               this.iterator = iterator;
-               this.dataSet = dataSet;
-       }
-
-       public void remove() {
-       }
-}
-
-class AltosGraphIterable implements Iterable<AltosUIDataPoint> {
-       AltosGraphDataSet       dataSet;
-
-       public Iterator<AltosUIDataPoint> iterator() {
-               return new AltosGraphIterator(dataSet.states.iterator(), dataSet);
-       }
-
-       public AltosGraphIterable(AltosGraphDataSet dataSet) {
-               this.dataSet = dataSet;
-       }
-}
-
-public class AltosGraphDataSet implements AltosUIDataSet {
-       String                  callsign;
-       int                     serial;
-       int                     flight;
-       AltosStateIterable      states;
-
-       public String name() {
-               if (callsign != null)
-                       return String.format("%s - %d/%d", callsign, serial, flight);
-               else
-                       return String.format("%d/%d", serial, flight);
-       }
-
-       public Iterable<AltosUIDataPoint> dataPoints() {
-               return new AltosGraphIterable(this);
-       }
-
-       public AltosGraphDataSet (AltosStateIterable states) {
-               this.states = states;
-               this.callsign = null;
-               this.serial = 0;
-               this.flight = 0;
-       }
-}
index 33e12130ceba74561ed40f72a60a26cd2e44e23b..9e8a1939ebfac47df09714107f6ec2409c64c300 100644 (file)
@@ -1,6 +1,19 @@
-
-// Copyright (c) 2010 Anthony Towns
-// GPL v2 or later
+/*
+ * Copyright © 2010 Anthony Towns
+ *
+ * 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 or any later version of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
 
 package altosui;
 
 
 package altosui;
 
index 27917b307bb9555e35dee659f10ea5ac54dcf903..7f62938d7e3f721bbe14cfc010c5cae2b6891c54 100644 (file)
@@ -114,10 +114,6 @@ public class AltosIgnitor extends JComponent implements AltosFlightDisplay {
                }
        }
 
                }
        }
 
-       public static String ignitor_name(int i) {
-               return String.format("Ignitor %c", 'A' + i);
-       }
-
        class Ignitor extends LaunchStatus {
                int ignitor;
 
        class Ignitor extends LaunchStatus {
                int ignitor;
 
@@ -131,7 +127,7 @@ public class AltosIgnitor extends JComponent implements AltosFlightDisplay {
                }
 
                public Ignitor (GridBagLayout layout, int y) {
                }
 
                public Ignitor (GridBagLayout layout, int y) {
-                       super(layout, y, String.format ("%s Voltage", ignitor_name(y)));
+                       super(layout, y, String.format ("%s Voltage", AltosLib.ignitor_name(y)));
                        ignitor = y;
                }
        }
                        ignitor = y;
                }
        }
index add46825942505c5cc729694fcef2f6f960d3df6..1eb2d9675744f165cfd6a9d0736e6de756038933 100644 (file)
@@ -35,9 +35,6 @@ altosui_JAVA = \
        AltosPad.java \
        AltosUIPreferencesBackend.java \
        AltosUI.java \
        AltosPad.java \
        AltosUIPreferencesBackend.java \
        AltosUI.java \
-       AltosGraph.java \
-       AltosGraphDataPoint.java \
-       AltosGraphDataSet.java \
        AltosGraphUI.java
 
 JFREECHART_CLASS= \
        AltosGraphUI.java
 
 JFREECHART_CLASS= \
diff --git a/altosuilib/AltosGraph.java b/altosuilib/AltosGraph.java
new file mode 100644 (file)
index 0000000..5e5a35c
--- /dev/null
@@ -0,0 +1,428 @@
+/*
+ * Copyright © 2013 Keith Packard <keithp@keithp.com>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+package org.altusmetrum.altosuilib_2;
+
+import java.io.*;
+import java.util.ArrayList;
+
+import java.awt.*;
+import javax.swing.*;
+import org.altusmetrum.altoslib_4.*;
+
+import org.jfree.ui.*;
+import org.jfree.chart.*;
+import org.jfree.chart.plot.*;
+import org.jfree.chart.axis.*;
+import org.jfree.chart.renderer.*;
+import org.jfree.chart.renderer.xy.*;
+import org.jfree.chart.labels.*;
+import org.jfree.data.xy.*;
+import org.jfree.data.*;
+
+class AltosVoltage extends AltosUnits {
+
+       public double value(double v, boolean imperial_units) {
+               return v;
+       }
+
+       public double inverse(double v, boolean imperial_units) {
+               return v;
+       }
+
+       public String show_units(boolean imperial_units) {
+               return "V";
+       }
+
+       public String say_units(boolean imperial_units) {
+               return "volts";
+       }
+
+       public int show_fraction(int width, boolean imperial_units) {
+               return width / 2;
+       }
+}
+
+class AltosNsat extends AltosUnits {
+
+       public double value(double v, boolean imperial_units) {
+               return v;
+       }
+
+       public double inverse(double v, boolean imperial_units) {
+               return v;
+       }
+
+       public String show_units(boolean imperial_units) {
+               return "Sats";
+       }
+
+       public String say_units(boolean imperial_units) {
+               return "Satellites";
+       }
+
+       public int show_fraction(int width, boolean imperial_units) {
+               return 0;
+       }
+}
+
+class AltosPressure extends AltosUnits {
+
+       public double value(double p, boolean imperial_units) {
+               return p;
+       }
+
+       public double inverse(double p, boolean imperial_units) {
+               return p;
+       }
+
+       public String show_units(boolean imperial_units) {
+               return "Pa";
+       }
+
+       public String say_units(boolean imperial_units) {
+               return "pascals";
+       }
+
+       public int show_fraction(int width, boolean imperial_units) {
+               return 0;
+       }
+}
+
+class AltosDbm extends AltosUnits {
+
+       public double value(double d, boolean imperial_units) {
+               return d;
+       }
+
+       public double inverse(double d, boolean imperial_units) {
+               return d;
+       }
+
+       public String show_units(boolean imperial_units) {
+               return "dBm";
+       }
+
+       public String say_units(boolean imperial_units) {
+               return "D B M";
+       }
+
+       public int show_fraction(int width, boolean imperial_units) {
+               return 0;
+       }
+}
+
+class AltosGyroUnits extends AltosUnits {
+
+       public double value(double p, boolean imperial_units) {
+               return p;
+       }
+
+       public double inverse(double p, boolean imperial_units) {
+               return p;
+       }
+
+       public String show_units(boolean imperial_units) {
+               return "°/sec";
+       }
+
+       public String say_units(boolean imperial_units) {
+               return "degrees per second";
+       }
+
+       public int show_fraction(int width, boolean imperial_units) {
+               return 1;
+       }
+}
+
+class AltosMagUnits extends AltosUnits {
+
+       public double value(double p, boolean imperial_units) {
+               return p;
+       }
+
+       public double inverse(double p, boolean imperial_units) {
+               return p;
+       }
+
+       public String show_units(boolean imperial_units) {
+               return "Ga";
+       }
+
+       public String say_units(boolean imperial_units) {
+               return "gauss";
+       }
+
+       public int show_fraction(int width, boolean imperial_units) {
+               return 2;
+       }
+}
+
+public class AltosGraph extends AltosUIGraph {
+
+       static final private Color height_color = new Color(194,31,31);
+       static final private Color gps_height_color = new Color(150,31,31);
+       static final private Color pressure_color = new Color (225,31,31);
+       static final private Color range_color = new Color(100, 31, 31);
+       static final private Color distance_color = new Color(100, 31, 194);
+       static final private Color speed_color = new Color(31,194,31);
+       static final private Color accel_color = new Color(31,31,194);
+       static final private Color voltage_color = new Color(194, 194, 31);
+       static final private Color battery_voltage_color = new Color(194, 194, 31);
+       static final private Color drogue_voltage_color = new Color(150, 150, 31);
+       static final private Color main_voltage_color = new Color(100, 100, 31);
+       static final private Color gps_nsat_color = new Color (194, 31, 194);
+       static final private Color gps_nsat_solution_color = new Color (194, 31, 194);
+       static final private Color gps_nsat_view_color = new Color (150, 31, 150);
+       static final private Color gps_course_color = new Color (100, 31, 112);
+       static final private Color gps_ground_speed_color = new Color (31, 112, 100);
+       static final private Color gps_climb_rate_color = new Color (31, 31, 112);
+       static final private Color temperature_color = new Color (31, 194, 194);
+       static final private Color dbm_color = new Color(31, 100, 100);
+       static final private Color state_color = new Color(0,0,0);
+       static final private Color accel_x_color = new Color(255, 0, 0);
+       static final private Color accel_y_color = new Color(0, 255, 0);
+       static final private Color accel_z_color = new Color(0, 0, 255);
+       static final private Color gyro_x_color = new Color(192, 0, 0);
+       static final private Color gyro_y_color = new Color(0, 192, 0);
+       static final private Color gyro_z_color = new Color(0, 0, 192);
+       static final private Color mag_x_color = new Color(128, 0, 0);
+       static final private Color mag_y_color = new Color(0, 128, 0);
+       static final private Color mag_z_color = new Color(0, 0, 128);
+       static final private Color orient_color = new Color(31, 31, 31);
+
+       static AltosVoltage voltage_units = new AltosVoltage();
+       static AltosPressure pressure_units = new AltosPressure();
+       static AltosNsat nsat_units = new AltosNsat();
+       static AltosDbm dbm_units = new AltosDbm();
+       static AltosGyroUnits gyro_units = new AltosGyroUnits();
+       static AltosOrient orient_units = new AltosOrient();
+       static AltosMagUnits mag_units = new AltosMagUnits();
+
+       AltosUIAxis     height_axis, speed_axis, accel_axis, voltage_axis, temperature_axis, nsat_axis, dbm_axis;
+       AltosUIAxis     distance_axis, pressure_axis;
+       AltosUIAxis     gyro_axis, orient_axis, mag_axis;
+       AltosUIAxis     course_axis;
+
+       public AltosGraph(AltosUIEnable enable, AltosFlightStats stats, AltosGraphDataSet dataSet) {
+               super(enable);
+
+               height_axis = newAxis("Height", AltosConvert.height, height_color);
+               pressure_axis = newAxis("Pressure", pressure_units, pressure_color, 0);
+               speed_axis = newAxis("Speed", AltosConvert.speed, speed_color);
+               accel_axis = newAxis("Acceleration", AltosConvert.accel, accel_color);
+               voltage_axis = newAxis("Voltage", voltage_units, voltage_color);
+               temperature_axis = newAxis("Temperature", AltosConvert.temperature, temperature_color, 0);
+               nsat_axis = newAxis("Satellites", nsat_units, gps_nsat_color,
+                                   AltosUIAxis.axis_include_zero | AltosUIAxis.axis_integer);
+               dbm_axis = newAxis("Signal Strength", dbm_units, dbm_color, 0);
+               distance_axis = newAxis("Distance", AltosConvert.distance, range_color);
+
+               gyro_axis = newAxis("Rotation Rate", gyro_units, gyro_z_color, 0);
+               orient_axis = newAxis("Tilt Angle", orient_units, orient_color, 0);
+               mag_axis = newAxis("Magnetic Field", mag_units, mag_x_color, 0);
+               course_axis = newAxis("Course", orient_units, gps_course_color, 0);
+
+               addMarker("State", AltosGraphDataPoint.data_state, state_color);
+               addSeries("Height",
+                         AltosGraphDataPoint.data_height,
+                         AltosConvert.height,
+                         height_color,
+                         true,
+                         height_axis);
+               addSeries("Pressure",
+                         AltosGraphDataPoint.data_pressure,
+                         pressure_units,
+                         pressure_color,
+                         false,
+                         pressure_axis);
+               addSeries("Speed",
+                         AltosGraphDataPoint.data_speed,
+                         AltosConvert.speed,
+                         speed_color,
+                         true,
+                         speed_axis);
+               addSeries("Acceleration",
+                         AltosGraphDataPoint.data_accel,
+                         AltosConvert.accel,
+                         accel_color,
+                         true,
+                         accel_axis);
+               if (stats.has_gps) {
+                       addSeries("Range",
+                                 AltosGraphDataPoint.data_range,
+                                 AltosConvert.distance,
+                                 range_color,
+                                 false,
+                                 distance_axis);
+                       addSeries("Distance",
+                                 AltosGraphDataPoint.data_distance,
+                                 AltosConvert.distance,
+                                 distance_color,
+                                 false,
+                                 distance_axis);
+                       addSeries("GPS Height",
+                                 AltosGraphDataPoint.data_gps_height,
+                                 AltosConvert.height,
+                                 gps_height_color,
+                                 false,
+                                 height_axis);
+                       addSeries("GPS Satellites in Solution",
+                                 AltosGraphDataPoint.data_gps_nsat_solution,
+                                 nsat_units,
+                                 gps_nsat_solution_color,
+                                 false,
+                                 nsat_axis);
+                       addSeries("GPS Satellites in View",
+                                 AltosGraphDataPoint.data_gps_nsat_view,
+                                 nsat_units,
+                                 gps_nsat_view_color,
+                                 false,
+                                 nsat_axis);
+                       addSeries("GPS Course",
+                                 AltosGraphDataPoint.data_gps_course,
+                                 orient_units,
+                                 gps_course_color,
+                                 false,
+                                 course_axis);
+                       addSeries("GPS Ground Speed",
+                                 AltosGraphDataPoint.data_gps_ground_speed,
+                                 AltosConvert.speed,
+                                 gps_ground_speed_color,
+                                 false,
+                                 speed_axis);
+                       addSeries("GPS Climb Rate",
+                                 AltosGraphDataPoint.data_gps_climb_rate,
+                                 AltosConvert.speed,
+                                 gps_climb_rate_color,
+                                 false,
+                                 speed_axis);
+               }
+               if (stats.has_rssi)
+                       addSeries("Received Signal Strength",
+                                 AltosGraphDataPoint.data_rssi,
+                                 dbm_units,
+                                 dbm_color,
+                                 false,
+                                 dbm_axis);
+               if (stats.has_other_adc) {
+                       addSeries("Temperature",
+                                 AltosGraphDataPoint.data_temperature,
+                                 AltosConvert.temperature,
+                                 temperature_color,
+                                 false,
+                                 temperature_axis);
+                       addSeries("Battery Voltage",
+                                 AltosGraphDataPoint.data_battery_voltage,
+                                 voltage_units,
+                                 battery_voltage_color,
+                                 false,
+                                 voltage_axis);
+                       addSeries("Drogue Voltage",
+                                 AltosGraphDataPoint.data_drogue_voltage,
+                                 voltage_units,
+                                 drogue_voltage_color,
+                                 false,
+                                 voltage_axis);
+                       addSeries("Main Voltage",
+                                 AltosGraphDataPoint.data_main_voltage,
+                                 voltage_units,
+                                 main_voltage_color,
+                                 false,
+                                 voltage_axis);
+               }
+
+               if (stats.has_imu) {
+                       addSeries("Acceleration X",
+                                 AltosGraphDataPoint.data_accel_x,
+                                 AltosConvert.accel,
+                                 accel_x_color,
+                                 false,
+                                 accel_axis);
+                       addSeries("Acceleration Y",
+                                 AltosGraphDataPoint.data_accel_y,
+                                 AltosConvert.accel,
+                                 accel_y_color,
+                                 false,
+                                 accel_axis);
+                       addSeries("Acceleration Z",
+                                 AltosGraphDataPoint.data_accel_z,
+                                 AltosConvert.accel,
+                                 accel_z_color,
+                                 false,
+                                 accel_axis);
+                       addSeries("Rotation Rate X",
+                                 AltosGraphDataPoint.data_gyro_x,
+                                 gyro_units,
+                                 gyro_x_color,
+                                 false,
+                                 gyro_axis);
+                       addSeries("Rotation Rate Y",
+                                 AltosGraphDataPoint.data_gyro_y,
+                                 gyro_units,
+                                 gyro_y_color,
+                                 false,
+                                 gyro_axis);
+                       addSeries("Rotation Rate Z",
+                                 AltosGraphDataPoint.data_gyro_z,
+                                 gyro_units,
+                                 gyro_z_color,
+                                 false,
+                                 gyro_axis);
+               }
+               if (stats.has_mag) {
+                       addSeries("Magnetometer X",
+                                 AltosGraphDataPoint.data_mag_x,
+                                 mag_units,
+                                 mag_x_color,
+                                 false,
+                                 mag_axis);
+                       addSeries("Magnetometer Y",
+                                 AltosGraphDataPoint.data_mag_y,
+                                 mag_units,
+                                 mag_y_color,
+                                 false,
+                                 mag_axis);
+                       addSeries("Magnetometer Z",
+                                 AltosGraphDataPoint.data_mag_z,
+                                 mag_units,
+                                 mag_z_color,
+                                 false,
+                                 mag_axis);
+               }
+               if (stats.has_orient)
+                       addSeries("Tilt Angle",
+                                 AltosGraphDataPoint.data_orient,
+                                 orient_units,
+                                 orient_color,
+                                 false,
+                                 orient_axis);
+               if (stats.num_ignitor > 0) {
+                       for (int i = 0; i < stats.num_ignitor; i++)
+                               addSeries(AltosLib.ignitor_name(i),
+                                         AltosGraphDataPoint.data_ignitor_0 + i,
+                                         voltage_units,
+                                         main_voltage_color,
+                                         false,
+                                         voltage_axis);
+                       for (int i = 0; i < stats.num_ignitor; i++)
+                               addMarker(AltosLib.ignitor_name(i), AltosGraphDataPoint.data_ignitor_fired_0 + i, state_color);
+               }
+
+               setDataSet(dataSet);
+       }
+}
diff --git a/altosuilib/AltosGraphDataPoint.java b/altosuilib/AltosGraphDataPoint.java
new file mode 100644 (file)
index 0000000..a64a9d1
--- /dev/null
@@ -0,0 +1,241 @@
+/*
+ * Copyright © 2013 Keith Packard <keithp@keithp.com>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+package org.altusmetrum.altosuilib_2;
+
+import org.altusmetrum.altoslib_4.*;
+
+public class AltosGraphDataPoint implements AltosUIDataPoint {
+
+       AltosState      state;
+
+       public static final int data_height = 0;
+       public static final int data_speed = 1;
+       public static final int data_accel = 2;
+       public static final int data_temp = 3;
+       public static final int data_battery_voltage = 4;
+       public static final int data_drogue_voltage = 5;
+       public static final int data_main_voltage = 6;
+       public static final int data_rssi = 7;
+       public static final int data_state = 8;
+       public static final int data_gps_height = 9;
+       public static final int data_gps_nsat_solution = 10;
+       public static final int data_gps_nsat_view = 11;
+       public static final int data_temperature = 12;
+       public static final int data_range = 13;
+       public static final int data_distance = 14;
+       public static final int data_pressure = 15;
+       public static final int data_accel_x = 16;
+       public static final int data_accel_y = 17;
+       public static final int data_accel_z = 18;
+       public static final int data_gyro_x = 19;
+       public static final int data_gyro_y = 20;
+       public static final int data_gyro_z = 21;
+       public static final int data_mag_x = 22;
+       public static final int data_mag_y = 23;
+       public static final int data_mag_z = 24;
+       public static final int data_orient = 25;
+       public static final int data_gps_course = 26;
+       public static final int data_gps_ground_speed = 27;
+       public static final int data_gps_climb_rate = 28;
+       public static final int data_ignitor_0 = 29;
+       public static final int data_ignitor_num = 32;
+       public static final int data_ignitor_max = data_ignitor_0 + data_ignitor_num - 1;
+       public static final int data_ignitor_fired_0 = data_ignitor_0 + data_ignitor_num;
+       public static final int data_ignitor_fired_max = data_ignitor_fired_0 + data_ignitor_num - 1;
+
+       public double x() throws AltosUIDataMissing {
+               double  time = state.time_since_boost();
+               if (time < -2)
+                       throw new AltosUIDataMissing(-1);
+               return time;
+       }
+
+       public double y(int index) throws AltosUIDataMissing {
+               double y = AltosLib.MISSING;
+               switch (index) {
+               case data_height:
+                       y = state.height();
+                       break;
+               case data_speed:
+                       y = state.speed();
+                       break;
+               case data_accel:
+                       y = state.acceleration();
+                       break;
+               case data_temp:
+                       y = state.temperature;
+                       break;
+               case data_battery_voltage:
+                       y = state.battery_voltage;
+                       break;
+               case data_drogue_voltage:
+                       y = state.apogee_voltage;
+                       break;
+               case data_main_voltage:
+                       y = state.main_voltage;
+                       break;
+               case data_rssi:
+                       y = state.rssi;
+                       break;
+               case data_gps_height:
+                       y = state.gps_height;
+                       break;
+               case data_gps_nsat_solution:
+                       if (state.gps != null)
+                               y = state.gps.nsat;
+                       break;
+               case data_gps_nsat_view:
+                       if (state.gps != null && state.gps.cc_gps_sat != null)
+                               y = state.gps.cc_gps_sat.length;
+                       break;
+               case data_temperature:
+                       y = state.temperature;
+                       break;
+               case data_range:
+                       y = state.range;
+                       break;
+               case data_distance:
+                       if (state.from_pad != null)
+                               y = state.from_pad.distance;
+                       break;
+               case data_pressure:
+                       y = state.pressure();
+                       break;
+
+               case data_accel_x:
+               case data_accel_y:
+               case data_accel_z:
+               case data_gyro_x:
+               case data_gyro_y:
+               case data_gyro_z:
+                       AltosIMU        imu = state.imu;
+                       if (imu == null)
+                               break;
+                       switch (index) {
+                       case data_accel_x:
+                               y = imu.accel_x;
+                               break;
+                       case data_accel_y:
+                               y = imu.accel_y;
+                               break;
+                       case data_accel_z:
+                               y = imu.accel_z;
+                               break;
+                       case data_gyro_x:
+                               y = imu.gyro_x;
+                               break;
+                       case data_gyro_y:
+                               y = imu.gyro_y;
+                               break;
+                       case data_gyro_z:
+                               y = imu.gyro_z;
+                               break;
+                       }
+                       break;
+               case data_mag_x:
+               case data_mag_y:
+               case data_mag_z:
+                       AltosMag        mag = state.mag;
+                       if (mag == null)
+                               break;
+                       switch (index) {
+                       case data_mag_x:
+                               y = mag.x;
+                               break;
+                       case data_mag_y:
+                               y = mag.y;
+                               break;
+                       case data_mag_z:
+                               y = mag.z;
+                               break;
+                       }
+                       break;
+               case data_orient:
+                       y = state.orient();
+                       break;
+               case data_gps_course:
+                       if (state.gps != null)
+                               y = state.gps.course;
+                       else
+                               y = AltosLib.MISSING;
+                       break;
+               case data_gps_ground_speed:
+                       if (state.gps != null)
+                               y = state.gps.ground_speed;
+                       else
+                               y = AltosLib.MISSING;
+                       break;
+               case data_gps_climb_rate:
+                       if (state.gps != null)
+                               y = state.gps.climb_rate;
+                       else
+                               y = AltosLib.MISSING;
+                       break;
+               default:
+                       if (data_ignitor_0 <= index && index <= data_ignitor_max) {
+                               int ignitor = index - data_ignitor_0;
+                               if (state.ignitor_voltage != null && ignitor < state.ignitor_voltage.length)
+                                       y = state.ignitor_voltage[ignitor];
+                       } else if (data_ignitor_fired_0 <= index && index <= data_ignitor_fired_max) {
+                               int ignitor = index - data_ignitor_fired_0;
+                               if (state.ignitor_voltage != null && ignitor < state.ignitor_voltage.length) {
+                                       if ((state.pyro_fired & (1 << ignitor)) != 0)
+                                               y = 1;
+                                       else
+                                               y = 0;
+                               }
+                       }
+                       break;
+               }
+               if (y == AltosLib.MISSING)
+                       throw new AltosUIDataMissing(index);
+               return y;
+       }
+
+       public int id(int index) {
+               if (index == data_state) {
+                       int s = state.state;
+                       if (AltosLib.ao_flight_boost <= s && s <= AltosLib.ao_flight_landed)
+                               return s;
+               } else if (data_ignitor_fired_0 <= index && index <= data_ignitor_fired_max) {
+                       int ignitor = index - data_ignitor_fired_0;
+                       if (state.ignitor_voltage != null && ignitor < state.ignitor_voltage.length) {
+                               if (state.ignitor_voltage != null && ignitor < state.ignitor_voltage.length) {
+                                       if ((state.pyro_fired & (1 << ignitor)) != 0)
+                                               return 1;
+                               }
+                       }
+               }
+               return -1;
+       }
+
+       public String id_name(int index) {
+               if (index == data_state) {
+                       return state.state_name();
+               } else if (data_ignitor_fired_0 <= index && index <= data_ignitor_fired_max) {
+                       int ignitor = index - data_ignitor_fired_0;
+                       if (state.ignitor_voltage != null && ignitor < state.ignitor_voltage.length)
+                               return AltosLib.ignitor_name(ignitor);
+               }
+               return "";
+       }
+
+       public AltosGraphDataPoint (AltosState state) {
+               this.state = state;
+       }
+}
diff --git a/altosuilib/AltosGraphDataSet.java b/altosuilib/AltosGraphDataSet.java
new file mode 100644 (file)
index 0000000..36933e9
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright © 2013 Keith Packard <keithp@keithp.com>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+package org.altusmetrum.altosuilib_2;
+
+import java.lang.*;
+import java.io.*;
+import java.util.*;
+import org.altusmetrum.altoslib_4.*;
+
+class AltosGraphIterator implements Iterator<AltosUIDataPoint> {
+       AltosGraphDataSet       dataSet;
+       Iterator<AltosState>    iterator;
+
+       public boolean hasNext() {
+               return iterator.hasNext();
+       }
+
+       public AltosUIDataPoint next() {
+               AltosState      state = iterator.next();
+
+               if (state.flight != AltosLib.MISSING) {
+                       if (dataSet.callsign == null && state.callsign != null)
+                               dataSet.callsign = state.callsign;
+
+                       if (dataSet.serial == 0 && state.serial != 0)
+                               dataSet.serial = state.serial;
+
+                       if (dataSet.flight == 0 && state.flight != 0)
+                               dataSet.flight = state.flight;
+               }
+
+               return new AltosGraphDataPoint(state);
+       }
+
+       public AltosGraphIterator (Iterator<AltosState> iterator, AltosGraphDataSet dataSet) {
+               this.iterator = iterator;
+               this.dataSet = dataSet;
+       }
+
+       public void remove() {
+       }
+}
+
+class AltosGraphIterable implements Iterable<AltosUIDataPoint> {
+       AltosGraphDataSet       dataSet;
+
+       public Iterator<AltosUIDataPoint> iterator() {
+               return new AltosGraphIterator(dataSet.states.iterator(), dataSet);
+       }
+
+       public AltosGraphIterable(AltosGraphDataSet dataSet) {
+               this.dataSet = dataSet;
+       }
+}
+
+public class AltosGraphDataSet implements AltosUIDataSet {
+       String                  callsign;
+       int                     serial;
+       int                     flight;
+       AltosStateIterable      states;
+
+       public String name() {
+               if (callsign != null)
+                       return String.format("%s - %d/%d", callsign, serial, flight);
+               else
+                       return String.format("%d/%d", serial, flight);
+       }
+
+       public Iterable<AltosUIDataPoint> dataPoints() {
+               return new AltosGraphIterable(this);
+       }
+
+       public AltosGraphDataSet (AltosStateIterable states) {
+               this.states = states;
+               this.callsign = null;
+               this.serial = 0;
+               this.flight = 0;
+       }
+}
index 909c471ba4b4c8c6cd32ecb66f36238b45a8cc5c..9cca088de48cfd38d23262f3e26d36618ee90522 100644 (file)
@@ -85,8 +85,6 @@ public class AltosUIGraph implements AltosUnitsListener {
 
        public void addMarker(String label, int fetch, Color color) {
                AltosUIMarker           marker = new AltosUIMarker(fetch, color, plot);
 
        public void addMarker(String label, int fetch, Color color) {
                AltosUIMarker           marker = new AltosUIMarker(fetch, color, plot);
-               if (enable != null)
-                       enable.add(label, marker, true);
                this.graphers.add(marker);
        }
 
                this.graphers.add(marker);
        }
 
@@ -158,4 +156,4 @@ public class AltosUIGraph implements AltosUnitsListener {
 
                AltosPreferences.register_units_listener(this);
        }
 
                AltosPreferences.register_units_listener(this);
        }
-}
\ No newline at end of file
+}
index 65a8228a67dc430aa5adfe03f604198c7cba4206..e415fc5b65773060a1dd5d7a81f286ad9d4775bd 100644 (file)
@@ -58,6 +58,9 @@ altosuilib_JAVA = \
        AltosRomconfigUI.java \
        AltosInfoTable.java \
        AltosFlightInfoTableModel.java \
        AltosRomconfigUI.java \
        AltosInfoTable.java \
        AltosFlightInfoTableModel.java \
+       AltosGraph.java \
+       AltosGraphDataPoint.java \
+       AltosGraphDataSet.java \
        AltosBTDevice.java \
        AltosBTDeviceIterator.java \
        AltosBTManage.java \
        AltosBTDevice.java \
        AltosBTDeviceIterator.java \
        AltosBTManage.java \
index f064a488a408e94743cb914282edb7e3a563b89f..87d8a66ae9dc70ba46fb47b1088a4f0182c3e26b 100644 (file)
@@ -5,7 +5,7 @@ man_MANS=telegps.1
 
 altoslibdir=$(libdir)/altos
 
 
 altoslibdir=$(libdir)/altos
 
-CLASSPATH_ENV=mkdir -p $(JAVAROOT); CLASSPATH=".:classes:../altoslib/*:../altosuilib/*:../libaltos:$(JCOMMON)/jcommon.jar:$(JFREECHART)/jfreechart.jar $(FREETTS)/freetts.jar"
+CLASSPATH_ENV=mkdir -p $(JAVAROOT); CLASSPATH=".:classes:../altoslib/*:../altosuilib/*:../libaltos:$(JCOMMON)/jcommon.jar:$(JFREECHART)/jfreechart.jar:$(FREETTS)/freetts.jar"
 
 bin_SCRIPTS=telegps
 
 
 bin_SCRIPTS=telegps
 
@@ -18,7 +18,8 @@ telegps_JAVA= \
        TeleGPSInfo.java \
        TeleGPSConfig.java \
        TeleGPSConfigUI.java \
        TeleGPSInfo.java \
        TeleGPSConfig.java \
        TeleGPSConfigUI.java \
-       TeleGPSPreferences.java
+       TeleGPSPreferences.java \
+       TeleGPSGraphUI.java
 
 JFREECHART_CLASS= \
     jfreechart.jar
 
 JFREECHART_CLASS= \
     jfreechart.jar
index bef0bbc69d5ab04c36c3653a943037a75090cd3e..5a707547d480e131ee16332d1de2bd731cd23def 100644 (file)
@@ -246,6 +246,16 @@ public class TeleGPS
        }
 
        void graph() {
        }
 
        void graph() {
+               AltosDataChooser chooser;
+               chooser = new AltosDataChooser(this);
+               AltosStateIterable states = chooser.runDialog();
+               if (states == null)
+                       return;
+               try {
+                       new TeleGPSGraphUI(states, chooser.file());
+               } catch (InterruptedException ie) {
+               } catch (IOException ie) {
+               }
        }
 
        void flash() {
        }
 
        void flash() {