1 package net.sf.openrocket.android.motor;
\r
3 import net.sf.openrocket.android.db.DbAdapter;
\r
4 import net.sf.openrocket.android.util.AndroidLogWrapper;
\r
6 import org.achartengine.GraphicalView;
\r
7 import org.achartengine.chart.LineChart;
\r
8 import org.achartengine.chart.PointStyle;
\r
9 import org.achartengine.chart.XYChart;
\r
10 import org.achartengine.model.XYMultipleSeriesDataset;
\r
11 import org.achartengine.model.XYSeries;
\r
12 import org.achartengine.renderer.XYMultipleSeriesRenderer;
\r
13 import org.achartengine.renderer.XYSeriesRenderer;
\r
15 import android.graphics.Color;
\r
16 import android.graphics.Paint.Align;
\r
17 import android.os.Bundle;
\r
18 import android.support.v4.app.Fragment;
\r
19 import android.view.LayoutInflater;
\r
20 import android.view.View;
\r
21 import android.view.ViewGroup;
\r
23 public class BurnPlotFragment extends Fragment {
\r
25 private ExtendedThrustCurveMotor motor;
\r
26 private long motorId;
\r
28 /** The encapsulated graphical view. */
\r
29 private GraphicalView mView;
\r
30 /** The chart to be drawn. */
\r
31 private XYChart mChart;
\r
33 public static BurnPlotFragment newInstance( long motorId ) {
\r
34 BurnPlotFragment frag = new BurnPlotFragment();
\r
35 Bundle bundle = new Bundle();
\r
36 bundle.putLong("motorId", motorId);
\r
37 frag.setArguments(bundle);
\r
42 public void onCreate(Bundle savedInstanceState) {
\r
43 AndroidLogWrapper.d(BurnPlotFragment.class,"onCreate");
\r
45 if ( savedInstanceState!= null) {
\r
46 motorId = savedInstanceState.getLong("motorId",-1);
\r
48 Bundle b = getArguments();
\r
49 motorId = b.getLong("motorId");
\r
52 DbAdapter mDbHelper = new DbAdapter(getActivity());
\r
56 motor = mDbHelper.getMotorDao().fetchMotor(motorId);
\r
57 } catch ( Exception e ) {
\r
62 super.onCreate(savedInstanceState);
\r
66 public void onSaveInstanceState(Bundle outState) {
\r
67 super.onSaveInstanceState(outState);
\r
68 outState.putLong("motorId", motorId);
\r
72 public View onCreateView(LayoutInflater inflater, ViewGroup container,
\r
73 Bundle savedInstanceState) {
\r
74 AndroidLogWrapper.d(BurnPlotFragment.class,"onCreateView");
\r
77 mView = new GraphicalView(container.getContext(), mChart);
\r
81 private void init( ExtendedThrustCurveMotor motor ) {
\r
83 XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(1);
\r
85 renderer.setAxisTitleTextSize(16);
\r
86 renderer.setChartTitleTextSize(20);
\r
87 renderer.setLabelsTextSize(15);
\r
88 renderer.setLegendTextSize(15);
\r
89 renderer.setPointSize(5f);
\r
90 renderer.setXLabels(10);
\r
91 renderer.setYLabels(10);
\r
92 renderer.setShowGrid(true);
\r
93 renderer.setZoomButtonsVisible(false);
\r
94 renderer.setZoomEnabled(false,false);
\r
95 renderer.setPanEnabled(false,false);
\r
96 renderer.setMargins(new int[] { 50, 40, 10, 20 });
\r
97 renderer.setShowLegend(false);
\r
98 renderer.setAxesColor(Color.LTGRAY);
\r
99 renderer.setLabelsColor(Color.LTGRAY);
\r
101 renderer.setChartTitle(motor.getManufacturer() + " " + motor.getDesignation());
\r
103 renderer.setXTitle("time (s)");
\r
104 renderer.setXLabelsAlign(Align.RIGHT);
\r
106 renderer.setYTitle("impuse (n)");
\r
107 renderer.setYLabelsAlign(Align.RIGHT,0);
\r
109 XYSeriesRenderer r = new XYSeriesRenderer();
\r
110 r.setColor(Color.RED);
\r
111 r.setPointStyle(PointStyle.CIRCLE);
\r
112 r.setFillPoints(true);
\r
113 renderer.addSeriesRenderer(r);
\r
114 // setting the YAximMin to 0 locks the origins.
\r
115 renderer.setYAxisMin(0.0, 0);
\r
117 // TODO get markers working in achartengine
\r
118 //YValueMarker average = new YValueMarker(motor.getThrustCurveMotor().getAverageThrustEstimate(),"average" );
\r
119 //average.getLinePaint().setColor(Color.BLACK);
\r
120 //average.getTextPaint().setColor(Color.BLACK);
\r
121 //mySimpleXYPlot.addMarker( average );
\r
123 XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
\r
125 XYSeries series = new XYSeries(motor.getDesignation(), 0);
\r
127 double[] timePoints = motor.getTimePoints();
\r
128 double[] thrustPoints = motor.getThrustPoints();
\r
130 // We are going to abuse this loop to also compute the Y axis max.
\r
132 int datasize = timePoints.length;
\r
133 for( int i = 0; i<datasize; i++ ) {
\r
134 series.add(timePoints[i], thrustPoints[i]);
\r
135 int ceil =(int) Math.ceil(thrustPoints[i]);
\r
136 if ( ceil > maxy ) {
\r
140 renderer.setYAxisMax(maxy);
\r
142 // Find the X axis max. compute it as next larger integer if t_max > 2 else round up to next tenth.
\r
143 double maxx = timePoints[datasize-1];
\r
144 if ( maxx >= 2.0 ) {
\r
145 maxx = Math.ceil(maxx);
\r
147 maxx = Math.ceil(maxx*10.0) /10.0;
\r
149 renderer.setXAxisMax(maxx);
\r
151 dataset.addSeries(series);
\r
153 mChart = new LineChart(dataset, renderer);
\r