*/\r
package net.sf.openrocket.android.simulation;\r
\r
+import java.io.Serializable;\r
+import java.util.ArrayList;\r
import java.util.List;\r
\r
+import net.sf.openrocket.android.util.AndroidLogWrapper;\r
+import net.sf.openrocket.document.OpenRocketDocument;\r
+import net.sf.openrocket.document.Simulation;\r
import net.sf.openrocket.simulation.FlightDataBranch;\r
import net.sf.openrocket.simulation.FlightDataType;\r
import net.sf.openrocket.simulation.FlightEvent;\r
+import net.sf.openrocket.unit.Unit;\r
\r
-import org.achartengine.ChartFactory;\r
import org.achartengine.chart.LineChart;\r
import org.achartengine.chart.PointStyle;\r
import org.achartengine.chart.XYChart;\r
import org.achartengine.renderer.XYMultipleSeriesRenderer;\r
import org.achartengine.renderer.XYSeriesRenderer;\r
\r
-import android.content.Context;\r
-import android.content.Intent;\r
import android.graphics.Color;\r
import android.graphics.Paint.Align;\r
-import android.util.Log;\r
\r
/**\r
- * Multiple temperature demo chart.\r
+ * This is really a flyweight object so we can serialize the\r
+ * values behind a simulation chart. Since OpenRocketDocument, FlightDataBranch,\r
+ * FlightDataType, Unit and all the other underlying types are not serializable,\r
+ * we have to resort to persisting just the bare minimum of information.\r
+ * \r
+ * This also means without further changes to FlightDataType, we cannot actually\r
+ * restore the displayed series.\r
+ * \r
+ * TODO make FlightDataBranch serializable or at least reconstructable from\r
+ * from some the name.\r
+ * \r
*/\r
-public class SimulationChart {\r
+public class SimulationChart implements Serializable {\r
+ \r
+ private final int simulationIndex;\r
+ private transient FlightDataType series1;\r
+ private transient FlightDataType series2;\r
+ private transient List<FlightEvent> events;\r
\r
- private final static String TAG = "SimulationChart";\r
-\r
- private FlightDataBranch flightDataBranch;\r
- private FlightDataType series1;\r
- private FlightDataType series2;\r
- private final FlightDataType time = FlightDataType.TYPE_TIME;\r
- private List<FlightEvent> flightEvents;\r
-\r
// Define 4 different colors and point styles to use for the series.\r
// For now only 2 series are supported though.\r
private final static int[] colors = new int[] { Color.BLUE, Color.YELLOW, Color.GREEN, Color.RED };\r
private final static PointStyle[] styles = new PointStyle[] { PointStyle.CIRCLE, PointStyle.DIAMOND,\r
PointStyle.TRIANGLE, PointStyle.SQUARE };\r
\r
- /**\r
- * @param flightDataBranch the flightDataBranch to set\r
- */\r
- public void setFlightDataBranch(FlightDataBranch flightDataBranch) {\r
- this.flightDataBranch = flightDataBranch;\r
+ public SimulationChart(int simulationIndex) {\r
+ super();\r
+ this.simulationIndex = simulationIndex;\r
+ }\r
+\r
+ private static String formatFlightDataTypeAxisLabel( FlightDataType fdt ) {\r
+ return fdt.getName() + " (" + fdt.getUnitGroup().getDefaultUnit().toString() + ")";\r
}\r
\r
- /**\r
- * @param series1 the series1 to set\r
- */\r
public void setSeries1(FlightDataType series1) {\r
this.series1 = series1;\r
}\r
\r
- /**\r
- * @param series2 the series2 to set\r
- */\r
+ public FlightDataType getSeries1() {\r
+ return series1;\r
+ }\r
+\r
public void setSeries2(FlightDataType series2) {\r
this.series2 = series2;\r
}\r
\r
- /**\r
- * @param flightEvents the flightEvents to set\r
- */\r
- public void setFlightEvents(List<FlightEvent> flightEvents) {\r
- this.flightEvents = flightEvents;\r
+ public FlightDataType getSeries2() {\r
+ return series2;\r
}\r
\r
- private static String formatFlightDataTypeAxisLabel( FlightDataType fdt ) {\r
- return fdt.getName() + " (" + fdt.getUnitGroup().getDefaultUnit().toString() + ")";\r
+ public void setEvents( List<FlightEvent> events ) {\r
+ this.events = events;\r
+ }\r
+ \r
+ public List<FlightEvent> getEvents() {\r
+ return events;\r
}\r
\r
+ public FlightDataBranch getFlightDataBranch( OpenRocketDocument rocketDocument ) {\r
+ Simulation sim = rocketDocument.getSimulation(simulationIndex);\r
+ FlightDataBranch flightDataBranch = sim.getSimulatedData().getBranch(0);\r
+ return flightDataBranch;\r
+ }\r
/**\r
* Executes the chart demo.\r
* \r
* @param context the context\r
* @return the built intent\r
*/\r
- public Intent execute(Context context) {\r
+ public XYChart buildChart(OpenRocketDocument rocketDocument) {\r
+\r
+ Simulation sim = rocketDocument.getSimulation(simulationIndex);\r
+ FlightDataBranch flightDataBranch = sim.getSimulatedData().getBranch(0);\r
+ FlightDataType time = FlightDataType.TYPE_TIME;\r
+ if (series1== null) {\r
+ series1 = flightDataBranch.getTypes()[1];\r
+ }\r
+ if (series2== null) {\r
+ series2 = flightDataBranch.getTypes()[2];\r
+ }\r
+ \r
+ if ( events == null ) {\r
+ events = new ArrayList<FlightEvent>();\r
+ for ( FlightEvent event : flightDataBranch.getEvents() ) {\r
+ events.add(event);\r
+ }\r
+ }\r
\r
/*\r
* TODO -\r
renderer.setYLabels(10);\r
renderer.setShowGrid(true);\r
renderer.setZoomButtonsVisible(true);\r
- renderer.setChartTitle("Simulation");\r
+ renderer.setChartTitle(sim.getName());\r
+ renderer.setShowCustomTextGrid(true);\r
+ renderer.setXLabelsAlign(Align.RIGHT);\r
+ renderer.setXLabelsAngle(90); // rotate right\r
+ for( FlightEvent event : events ) {\r
+ renderer.addXTextLabel(event.getTime(), event.getType().toString());\r
+ }\r
\r
renderer.setMargins(new int[] { 50, 30, 0, 20 });\r
{\r
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();\r
\r
List<Double> timevalues = flightDataBranch.get(time);\r
- List<Double> series1values = flightDataBranch.get(series1);\r
+ List<Double> series1values = new ArrayList<Double>( flightDataBranch.get(series1).size() );\r
+ {\r
+ Unit u = series1.getUnitGroup().getDefaultUnit();\r
+ for( Double d: flightDataBranch.get(series1) ) {\r
+ series1values.add( u.toUnit(d));\r
+ }\r
+ }\r
\r
// compute the axis limits using timevalues and series1values.\r
double xmin = 0;\r
double ymax = computeMaxValueWithPadding( series1values );\r
double xmax = Math.ceil( timevalues.get( timevalues.size()-1));\r
\r
- Log.d(TAG,"ymax = " + ymax);\r
+ AndroidLogWrapper.d(SimulationChart.class,"ymax = " + ymax);\r
renderer.setXAxisMax(xmax);\r
renderer.setYAxisMax(ymax);\r
\r
\r
if ( seriesCount > 1 ) {\r
// Add second series\r
- addXYSeries(dataset, series2.getName(), timevalues, flightDataBranch.get(series2), 1);\r
+ List<Double> series2values = new ArrayList<Double>( flightDataBranch.get(series2).size() );\r
+ {\r
+ Unit u = series2.getUnitGroup().getDefaultUnit();\r
+ for( Double d: flightDataBranch.get(series2) ) {\r
+ series2values.add( u.toUnit(d));\r
+ }\r
+ }\r
+\r
+ addXYSeries(dataset, series2.getName(), timevalues, series2values, 1);\r
}\r
- Intent intent = getLineChartIntent(context, dataset, renderer,"Simulation");\r
- return intent;\r
+ XYChart chart = new LineChart(dataset, renderer);\r
+ \r
+ return chart;\r
}\r
\r
private static void addXYSeries(XYMultipleSeriesDataset dataset, String titles, List<Double> xValues, List<Double> yValues, int scale) {\r
\r
}\r
\r
- private static Intent getLineChartIntent(Context context, XYMultipleSeriesDataset dataset,\r
- XYMultipleSeriesRenderer renderer, String activityTitle) {\r
- // checkParameters(dataset, renderer);\r
- Intent intent = new Intent(context, GraphicalActivity.class);\r
- XYChart chart = new LineChart(dataset, renderer);\r
- intent.putExtra(ChartFactory.CHART, chart);\r
- intent.putExtra(ChartFactory.TITLE, activityTitle);\r
- return intent;\r
- }\r
-\r
private static double computeMaxValueWithPadding( List<Double> list ) {\r
double max = list.get(0);\r
for( double v : list ) {\r