*/\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
- \r
- private final static String TAG = "SimulationChart";\r
+public class SimulationChart implements Serializable {\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
- private String simulationName;\r
+ private final int simulationIndex;\r
+ private transient FlightDataType series1;\r
+ private transient FlightDataType series2;\r
+ private transient List<FlightEvent> events;\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 PointStyle[] styles = new PointStyle[] { PointStyle.CIRCLE, PointStyle.DIAMOND,\r
PointStyle.TRIANGLE, PointStyle.SQUARE };\r
\r
- /**\r
- * @param simulationName the simulationName to set\r
- */\r
- public void setSimulationName(String simulationName) {\r
- this.simulationName = simulationName;\r
+ public SimulationChart(int simulationIndex) {\r
+ super();\r
+ this.simulationIndex = simulationIndex;\r
}\r
\r
- /**\r
- * @param flightDataBranch the flightDataBranch to set\r
- */\r
- public void setFlightDataBranch(FlightDataBranch flightDataBranch) {\r
- this.flightDataBranch = flightDataBranch;\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
+ switch( event.getType()) {\r
+ case LAUNCHROD:\r
+ case APOGEE:\r
+ case BURNOUT:\r
+ case EJECTION_CHARGE:\r
+ events.add(event);\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ }\r
\r
/*\r
* TODO -\r
renderer.setYLabels(10);\r
renderer.setShowGrid(true);\r
renderer.setZoomButtonsVisible(true);\r
- renderer.setChartTitle(simulationName);\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
\r
double ymax = computeMaxValueWithPadding( series1values );\r
double xmax = Math.ceil( timevalues.get( timevalues.size()-1));\r
- \r
- Log.d(TAG,"ymax = " + ymax);\r
+\r
+ AndroidLogWrapper.d(SimulationChart.class,"ymax = " + ymax);\r
renderer.setXAxisMax(xmax);\r
renderer.setYAxisMax(ymax);\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
// next 100 if 1000 < max < 10,000\r
// next 1000 if max >= 10,000\r
double numdigits = Math.floor(Math.log10(max));\r
- \r
+\r
if ( numdigits <= 1.0 ) {\r
return 10.0;\r
} else if ( numdigits <= 3.0 ) {\r
} else {\r
return 1000.0 * ( Math.ceil( max / 1000.0 ));\r
}\r
- \r
+\r
}\r
- \r
+\r
}\r