package net.sf.openrocket.android.motor;
import net.sf.openrocket.android.db.DbAdapter;
import net.sf.openrocket.android.util.AndroidLogWrapper;
import org.achartengine.GraphicalView;
import org.achartengine.chart.LineChart;
import org.achartengine.chart.PointStyle;
import org.achartengine.chart.XYChart;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import android.graphics.Color;
import android.graphics.Paint.Align;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class BurnPlotFragment extends Fragment {
private ExtendedThrustCurveMotor motor;
private long motorId;
/** The encapsulated graphical view. */
private GraphicalView mView;
/** The chart to be drawn. */
private XYChart mChart;
public static BurnPlotFragment newInstance( long motorId ) {
BurnPlotFragment frag = new BurnPlotFragment();
Bundle bundle = new Bundle();
bundle.putLong("motorId", motorId);
frag.setArguments(bundle);
return frag;
}
@Override
public void onCreate(Bundle savedInstanceState) {
AndroidLogWrapper.d(BurnPlotFragment.class,"onCreate");
if ( savedInstanceState!= null) {
motorId = savedInstanceState.getLong("motorId",-1);
} else {
Bundle b = getArguments();
motorId = b.getLong("motorId");
}
DbAdapter mDbHelper = new DbAdapter(getActivity());
mDbHelper.open();
try {
motor = mDbHelper.getMotorDao().fetchMotor(motorId);
} catch ( Exception e ) {
}
mDbHelper.close();
super.onCreate(savedInstanceState);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("motorId", motorId);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
AndroidLogWrapper.d(BurnPlotFragment.class,"onCreateView");
init(motor);
mView = new GraphicalView(container.getContext(), mChart);
return mView;
}
private void init( ExtendedThrustCurveMotor motor ) {
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(1);
renderer.setAxisTitleTextSize(16);
renderer.setChartTitleTextSize(20);
renderer.setLabelsTextSize(15);
renderer.setLegendTextSize(15);
renderer.setPointSize(5f);
renderer.setXLabels(10);
renderer.setYLabels(10);
renderer.setShowGrid(true);
renderer.setZoomButtonsVisible(false);
renderer.setZoomEnabled(false,false);
renderer.setPanEnabled(false,false);
renderer.setMargins(new int[] { 50, 40, 10, 20 });
renderer.setShowLegend(false);
renderer.setAxesColor(Color.LTGRAY);
renderer.setLabelsColor(Color.LTGRAY);
renderer.setChartTitle(motor.getManufacturer() + " " + motor.getDesignation());
renderer.setXTitle("time (s)");
renderer.setXLabelsAlign(Align.RIGHT);
renderer.setYTitle("impuse (n)");
renderer.setYLabelsAlign(Align.RIGHT,0);
XYSeriesRenderer r = new XYSeriesRenderer();
r.setColor(Color.RED);
r.setPointStyle(PointStyle.CIRCLE);
r.setFillPoints(true);
renderer.addSeriesRenderer(r);
// setting the YAximMin to 0 locks the origins.
renderer.setYAxisMin(0.0, 0);
// TODO get markers working in achartengine
//YValueMarker average = new YValueMarker(motor.getThrustCurveMotor().getAverageThrustEstimate(),"average" );
//average.getLinePaint().setColor(Color.BLACK);
//average.getTextPaint().setColor(Color.BLACK);
//mySimpleXYPlot.addMarker( average );
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
XYSeries series = new XYSeries(motor.getDesignation(), 0);
double[] timePoints = motor.getTimePoints();
double[] thrustPoints = motor.getThrustPoints();
// We are going to abuse this loop to also compute the Y axis max.
int maxy = 0;
int datasize = timePoints.length;
for( int i = 0; i<datasize; i++ ) {
series.add(timePoints[i], thrustPoints[i]);
int ceil =(int) Math.ceil(thrustPoints[i]);
if ( ceil > maxy ) {
maxy = ceil;
}
}
renderer.setYAxisMax(maxy);
// Find the X axis max. compute it as next larger integer if t_max > 2 else round up to next tenth.
double maxx = timePoints[datasize-1];
if ( maxx >= 2.0 ) {
maxx = Math.ceil(maxx);
} else {
maxx = Math.ceil(maxx*10.0) /10.0;
}
renderer.setXAxisMax(maxx);
dataset.addSeries(series);
mChart = new LineChart(dataset, renderer);
}
}