X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=android%2Fsrc%2Fnet%2Fsf%2Fopenrocket%2Fandroid%2Fmotor%2FBurnPlotFragment.java;h=eff07756a696c5a4d7e2b202b879d95cb8de07ae;hb=9349577cdfdff682b2aabd6daa24fdc3a7449b58;hp=1a8df46328e5c3be003da870e0675eaf466a32a1;hpb=7901d5fdebc50a0c1d180ebfc27fff725c232443;p=debian%2Fopenrocket diff --git a/android/src/net/sf/openrocket/android/motor/BurnPlotFragment.java b/android/src/net/sf/openrocket/android/motor/BurnPlotFragment.java index 1a8df463..eff07756 100644 --- a/android/src/net/sf/openrocket/android/motor/BurnPlotFragment.java +++ b/android/src/net/sf/openrocket/android/motor/BurnPlotFragment.java @@ -1,243 +1,158 @@ package net.sf.openrocket.android.motor; -import java.util.Vector; +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 net.sf.openrocket.R; -import android.app.Activity; import android.graphics.Color; -import android.graphics.PointF; +import android.graphics.Paint.Align; import android.os.Bundle; import android.support.v4.app.Fragment; -import android.util.Log; import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.ScaleGestureDetector; import android.view.View; -import android.view.View.OnTouchListener; import android.view.ViewGroup; -import com.androidplot.xy.BoundaryMode; -import com.androidplot.xy.LineAndPointFormatter; -import com.androidplot.xy.LineAndPointRenderer; -import com.androidplot.xy.SimpleXYSeries; -import com.androidplot.xy.XYPlot; -import com.androidplot.xy.YValueMarker; - -public class BurnPlotFragment extends Fragment implements OnTouchListener { - - private final static String TAG = "BurnPlotFragment"; - - private XYPlot mySimpleXYPlot; - private SimpleXYSeries mySeries; - private PointF minXY; - private PointF maxXY; - - private float absMinX; - private float absMaxX; - private float minNoError; - private float maxNoError; - - private ScaleGestureDetector mScaleDetector; - private float mScaleFactor = 1.f; - - public static BurnPlotFragment initializeBurnPlotHelper( Motor motor ) { - BurnPlotFragment h = new BurnPlotFragment(); - - Bundle args = new Bundle(); - args.putSerializable("Motor", motor); - h.setArguments(args); - return h; - } +public class BurnPlotFragment extends Fragment { - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - Log.d(TAG,"onAttach"); - } + private ExtendedThrustCurveMotor motor; + private long motorId; - @Override - public void onCreate(Bundle savedInstanceState) { - Log.d(TAG,"onCreate"); - super.onCreate(savedInstanceState); - } + /** The encapsulated graphical view. */ + private GraphicalView mView; + /** The chart to be drawn. */ + private XYChart mChart; - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - Log.d(TAG,"onCreateView"); - View v = inflater.inflate(R.layout.motor_burn, container, false); - mySimpleXYPlot = (XYPlot) v.findViewById(R.id.xyplot); - mySimpleXYPlot.setOnTouchListener(this); - mScaleDetector = new ScaleGestureDetector(v.getContext(), new ScaleListener()); - // Motor motor = getMotor(); - // init(motor); - return v; + public static BurnPlotFragment newInstance( long motorId ) { + BurnPlotFragment frag = new BurnPlotFragment(); + Bundle bundle = new Bundle(); + bundle.putLong("motorId", motorId); + frag.setArguments(bundle); + return frag; } - void init( Motor motor ) { - - mySimpleXYPlot.setUserDomainOrigin(0); - mySimpleXYPlot.setUserRangeOrigin(0); - mySimpleXYPlot.setRangeLabel("impuse (n)"); - mySimpleXYPlot.setDomainLabel("time (s)"); - mySimpleXYPlot.addMarker(new YValueMarker(motor.getAvgThrust(),"average" )); - mySimpleXYPlot.disableAllMarkup(); + @Override + public void onCreate(Bundle savedInstanceState) { + AndroidLogWrapper.d(BurnPlotFragment.class,"onCreate"); - Vector data = null; - try { - data = motor.getBurndata(); - } catch ( Exception ex ) { + if ( savedInstanceState!= null) { + motorId = savedInstanceState.getLong("motorId",-1); + } else { + Bundle b = getArguments(); + motorId = b.getLong("motorId"); } - if ( data == null || data.size() == 0 ) { - data = new Vector(); - data.add(0.0); - data.add(0.0); - data.add(1.0); - data.add(1.0); - } - Log.d("plot","data = " + data.toString()); - - mySeries = new SimpleXYSeries(data, SimpleXYSeries.ArrayFormat.XY_VALS_INTERLEAVED,motor.getName()); - mySimpleXYPlot.addSeries(mySeries, LineAndPointRenderer.class, - new LineAndPointFormatter(Color.rgb(0, 255, 0), Color.rgb(200, 0, 0), null)); + DbAdapter mDbHelper = new DbAdapter(getActivity()); + mDbHelper.open(); - //Set of internal variables for keeping track of the boundaries - mySimpleXYPlot.calculateMinMaxVals(); - - mySimpleXYPlot.redraw(); + try { + motor = mDbHelper.getMotorDao().fetchMotor(motorId); + } catch ( Exception e ) { - minXY=new PointF(mySimpleXYPlot.getCalculatedMinX().floatValue(),mySimpleXYPlot.getCalculatedMinY().floatValue()); - maxXY=new PointF(mySimpleXYPlot.getCalculatedMaxX().floatValue(),mySimpleXYPlot.getCalculatedMaxY().floatValue()); + } - absMinX = minXY.x; - absMaxX = maxXY.x; - - minNoError = Math.round(mySeries.getX(1).floatValue() +2); - maxNoError = Math.round(mySeries.getX(mySeries.size() -1).floatValue()) - 2.0f; + mDbHelper.close(); + super.onCreate(savedInstanceState); } - private float mPosX; - private float mPosY; - - private float mLastTouchX; - private float mLastTouchY; - - private int mActivePointerId = -1; - @Override - public boolean onTouch(View arg0, MotionEvent event) { - mScaleDetector.onTouchEvent(event); - - final int action = event.getAction(); - switch ( action & MotionEvent.ACTION_MASK ) { - case MotionEvent.ACTION_DOWN: { - final float x = event.getX(); - final float y = event.getY(); + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putLong("motorId", motorId); + } - mLastTouchX = x; - mLastTouchY = y; + @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; + } - mActivePointerId = event.getPointerId(0); - break; - } + 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); - case MotionEvent.ACTION_MOVE: { - final int pointerIndex = event.findPointerIndex(mActivePointerId); - final float x = event.getX(pointerIndex); - final float y = event.getY(pointerIndex); - - if (!mScaleDetector.isInProgress()) { - final float dx = x - mLastTouchX; - final float dy = y - mLastTouchY; - - mPosX += dx; - mPosY += dy; - scroll(dx); - // do scroll. - + 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 maxy ) { + maxy = ceil; } - mLastTouchX = x; - mLastTouchY = y; - - break; } + renderer.setYAxisMax(maxy); - case MotionEvent.ACTION_UP: { - mActivePointerId = -1; - break; + // 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); - case MotionEvent.ACTION_CANCEL: { - mActivePointerId = -1; - break; - } - - case MotionEvent.ACTION_POINTER_UP: { - final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; - final int pointerId = event.getPointerId(pointerIndex); - if (pointerId == mActivePointerId) { - // This was our active pointer going up. choose a new active pointer and adjust accordingly. - final int newPointerIndex = pointerIndex ==0 ? 1:0; - mLastTouchX = event.getX(newPointerIndex); - mLastTouchY = event.getY(newPointerIndex); - mActivePointerId = event.getPointerId(newPointerIndex); - } - break; - } - } - return true; - } + dataset.addSeries(series); - private void zoom(float scale) { - Log.d(TAG,"zoom by " + scale); - float domainSpan = absMaxX - absMinX; - Log.d(TAG,"domainSpan = " + domainSpan); - float domainMidPoint = absMaxX - domainSpan / 2.0f; - Log.d(TAG,"domainMidPoint = " + domainMidPoint); - float offset = domainSpan / scale; - Log.d(TAG,"offset " + offset); - minXY.x=domainMidPoint- offset; - Log.d(TAG,"min X " + minXY.x); - maxXY.x=domainMidPoint+offset; - Log.d(TAG,"max X " + maxXY.x); - checkBoundaries(); - mySimpleXYPlot.setDomainBoundaries(minXY.x, maxXY.x, BoundaryMode.AUTO); - mySimpleXYPlot.redraw(); - } + mChart = new LineChart(dataset, renderer); - private void scroll(float pan) { - float domainSpan = maxXY.x - minXY.x; - float step = domainSpan / mySimpleXYPlot.getWidth(); - float offset = pan * step; - minXY.x+= offset; - maxXY.x+= offset; - checkBoundaries(); - mySimpleXYPlot.setDomainBoundaries(minXY.x, maxXY.x, BoundaryMode.AUTO); - mySimpleXYPlot.redraw(); } - private void checkBoundaries() { - - if ( minXY.x < absMinX) - minXY.x = absMinX; -// else if ( minXY.x > maxNoError ) -// minXY.x = maxNoError; - - if ( maxXY.x > absMaxX) - maxXY.x = absMaxX; -// else if ( maxXY.x < minNoError) -// maxXY.x = minNoError; - } - private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { - @Override - public boolean onScale( ScaleGestureDetector detector ) { - mScaleFactor *= detector.getScaleFactor(); - - mScaleFactor = Math.max(1.0f, Math.min(mScaleFactor, 5.0f)); - zoom(mScaleFactor); - return true; - } - } }