create changelog entry
[debian/openrocket] / android / src / net / sf / openrocket / android / motor / BurnPlotFragment.java
1 package net.sf.openrocket.android.motor;\r
2 \r
3 import net.sf.openrocket.android.db.DbAdapter;\r
4 import net.sf.openrocket.android.util.AndroidLogWrapper;\r
5 \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
14 \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
22 \r
23 public class BurnPlotFragment extends Fragment {\r
24 \r
25         private ExtendedThrustCurveMotor motor;\r
26         private long motorId;\r
27 \r
28         /** The encapsulated graphical view. */\r
29         private GraphicalView mView;\r
30         /** The chart to be drawn. */\r
31         private XYChart mChart;\r
32 \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
38                 return frag;\r
39         }\r
40 \r
41         @Override\r
42         public void onCreate(Bundle savedInstanceState) {\r
43                 AndroidLogWrapper.d(BurnPlotFragment.class,"onCreate");\r
44 \r
45                 if ( savedInstanceState!= null) {\r
46                         motorId = savedInstanceState.getLong("motorId",-1);\r
47                 } else {\r
48                         Bundle b = getArguments();\r
49                         motorId = b.getLong("motorId");\r
50                 }\r
51 \r
52                 DbAdapter mDbHelper = new DbAdapter(getActivity());\r
53                 mDbHelper.open();\r
54 \r
55                 try {\r
56                         motor = mDbHelper.getMotorDao().fetchMotor(motorId);\r
57                 } catch ( Exception e ) {\r
58 \r
59                 }\r
60 \r
61                 mDbHelper.close();\r
62                 super.onCreate(savedInstanceState);\r
63         }\r
64 \r
65         @Override\r
66         public void onSaveInstanceState(Bundle outState) {\r
67                 super.onSaveInstanceState(outState);\r
68                 outState.putLong("motorId", motorId);\r
69         }\r
70 \r
71         @Override\r
72         public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
73                         Bundle savedInstanceState) {\r
74                 AndroidLogWrapper.d(BurnPlotFragment.class,"onCreateView");\r
75                 \r
76                 init(motor);\r
77                 mView = new GraphicalView(container.getContext(), mChart);\r
78                 return mView;\r
79         }\r
80 \r
81         private void init( ExtendedThrustCurveMotor motor ) {\r
82 \r
83                 XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(1);\r
84 \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
100 \r
101                 renderer.setChartTitle(motor.getManufacturer() + " " + motor.getDesignation());\r
102 \r
103                 renderer.setXTitle("time (s)");\r
104                 renderer.setXLabelsAlign(Align.RIGHT);\r
105 \r
106                 renderer.setYTitle("impuse (n)");\r
107                 renderer.setYLabelsAlign(Align.RIGHT,0);\r
108 \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
116 \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
122 \r
123                 XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();\r
124 \r
125                 XYSeries series = new XYSeries(motor.getDesignation(), 0);\r
126                 \r
127                 double[] timePoints = motor.getTimePoints();\r
128                 double[] thrustPoints = motor.getThrustPoints();\r
129 \r
130                 // We are going to abuse this loop to also compute the Y axis max.\r
131                 int maxy = 0;\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
137                                 maxy = ceil;\r
138                         }\r
139                 }\r
140                 renderer.setYAxisMax(maxy);\r
141                 \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
146                 } else {\r
147                         maxx = Math.ceil(maxx*10.0) /10.0;\r
148                 }\r
149                 renderer.setXAxisMax(maxx);\r
150                 \r
151                 dataset.addSeries(series);\r
152 \r
153                 mChart = new LineChart(dataset, renderer);\r
154 \r
155         }\r
156 \r
157 }\r
158 \r