<classpath>\r
<classpathentry kind="src" path="gen"/>\r
<classpathentry including="l10n/**/*" kind="src" path="core-resources"/>\r
- <classpathentry excluding="net/sf/openrocket/file/CSVExport.java|net/sf/openrocket/file/motor/|net/sf/openrocket/file/rocksim/export/|net/sf/openrocket/gui/|net/sf/openrocket/startup/Startup.java|net/sf/openrocket/startup/Startup2.java|net/sf/openrocket/startup/VersionHelper.java|net/sf/openrocket/utils/" kind="src" path="core"/>\r
+ <classpathentry excluding="net/sf/openrocket/file/CSVExport.java|net/sf/openrocket/file/rocksim/export/|net/sf/openrocket/gui/|net/sf/openrocket/startup/Startup.java|net/sf/openrocket/startup/Startup2.java|net/sf/openrocket/startup/VersionHelper.java|net/sf/openrocket/utils/|net/sf/openrocket/file/motor/MotorLoaderHelper.java" kind="src" path="core"/>\r
<classpathentry kind="src" path="src"/>\r
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>\r
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>\r
android:editable="false" />
</TableRow>
+ <TableRow >
+
+ <TextView
+ android:paddingRight="10px"
+ android:text="Delays" />
+
+ <EditText
+ android:id="@+id/motorDetailsDelays"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="0.04"
+ android:editable="false" />
+ </TableRow>
+
<TableRow >
<TextView
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="45dip"
android:gravity="center_vertical"
android:id="@+id/motorChildManu"
android:layout_width="wrap_content"
android:layout_height="45dip"
- android:layout_alignParentLeft="true"
android:gravity="center_vertical"
android:paddingLeft="5dip"
android:paddingRight="5dip"
android:id="@+id/motorChildName"
android:layout_width="wrap_content"
android:layout_height="45dip"
- android:layout_toRightOf="@id/motorChildManu"
android:gravity="center_vertical"
android:paddingLeft="5dip"
- android:paddingRight="5dip"
android:text="Motor Name"
android:textColor="#ffCCCC22"
android:textSize="17dip"
android:textStyle="bold" >
</TextView>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="45dip"
+ android:gravity="center_vertical"
+ android:text="-"
+ android:paddingLeft="2dip"
+ android:paddingRight="2dip"
+ android:textColor="#ffCCCC22"
+ android:textSize="17dip"
+ android:textStyle="bold" >
+ </TextView>
+
+ <TextView
+ android:id="@+id/motorChildDelays"
+ android:layout_width="wrap_content"
+ android:layout_height="45dip"
+ android:layout_weight="0"
+ android:gravity="center_vertical"
+ android:paddingRight="5dip"
+ android:text=""
+ android:textColor="#ffCCCC22"
+ android:textSize="17dip"
+ android:textStyle="bold" >
+ </TextView>
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="2" />
+
<TextView
android:id="@+id/motorChildImpulse"
android:layout_width="wrap_content"
android:layout_height="45dip"
- android:layout_alignParentRight="true"
android:gravity="center_vertical"
android:paddingLeft="5dip"
android:paddingRight="5dip"
android:textStyle="bold" >
</TextView>
-</RelativeLayout>
\ No newline at end of file
+</LinearLayout>
\ No newline at end of file
\r
import java.util.Locale;\r
\r
-import android.preference.PreferenceManager;\r
-\r
-import net.sf.openrocket.database.ThrustCurveMotorSetDatabase;\r
import net.sf.openrocket.document.OpenRocketDocument;\r
import net.sf.openrocket.l10n.DebugTranslator;\r
import net.sf.openrocket.l10n.ResourceBundleTranslator;\r
import net.sf.openrocket.l10n.Translator;\r
+import android.preference.PreferenceManager;\r
\r
public class Application extends android.app.Application {\r
\r
// Big B boolean so I can synchronize on it.\r
private static Boolean initialized = false;\r
\r
- public static void initialize() {\r
+ public void initialize() {\r
synchronized (initialized) {\r
if ( initialized == true ) {\r
return;\r
\r
net.sf.openrocket.startup.Application.setPreferences( new PreferencesAdapter() );\r
\r
- ThrustCurveMotorSetDatabase db = new ThrustCurveMotorSetDatabase(false) {\r
- \r
- @Override\r
- protected void loadMotors() {\r
- }\r
- };\r
- db.startLoading();\r
+ MotorDatabaseAdapter db = new MotorDatabaseAdapter(this);\r
\r
net.sf.openrocket.startup.Application.setMotorSetDatabase(db);\r
\r
}\r
\r
public Application() {\r
- initialize();\r
}\r
\r
/* (non-Javadoc)\r
@Override\r
public void onCreate() {\r
super.onCreate();\r
+ initialize();\r
PreferencesActivity.initializePreferences(this, PreferenceManager.getDefaultSharedPreferences(this));\r
}\r
\r
--- /dev/null
+package net.sf.openrocket.android;\r
+\r
+import java.util.Collections;\r
+import java.util.List;\r
+\r
+import net.sf.openrocket.android.db.DbAdapter;\r
+import net.sf.openrocket.android.motor.ExtendedThrustCurveMotor;\r
+import net.sf.openrocket.database.MotorDatabase;\r
+import net.sf.openrocket.motor.Motor;\r
+import net.sf.openrocket.motor.Motor.Type;\r
+import android.content.Context;\r
+import android.util.Log;\r
+\r
+public class MotorDatabaseAdapter implements MotorDatabase {\r
+\r
+ private final static String TAG = "MotorDatabaseAdapter";\r
+ private DbAdapter mDbHelper;\r
+\r
+ public MotorDatabaseAdapter( Context ctx ) {\r
+ mDbHelper = new DbAdapter(ctx);\r
+ mDbHelper.open();\r
+ }\r
+\r
+ @Override\r
+ public List<? extends Motor> findMotors(Type type, String manufacturer,\r
+ String designation, double diameter, double length) {\r
+\r
+ Log.d(TAG,"find motor: type="+ type.toString());\r
+ Log.d(TAG,"find motor: manu="+ manufacturer);\r
+ Log.d(TAG,"find motor: designation="+ designation);\r
+ Log.d(TAG,"find motor: diameter=" +diameter);\r
+ Log.d(TAG,"find motor: length="+ length);\r
+\r
+ try {\r
+ ExtendedThrustCurveMotor m = mDbHelper.getMotorDao().fetchMotor(manufacturer, designation);\r
+ if ( m != null ) {\r
+ return Collections.singletonList(m.getThrustCurveMotor());\r
+ }\r
+ } catch ( Exception ex ) {\r
+\r
+ }\r
+ return Collections.<Motor>emptyList();\r
+ }\r
+\r
+}\r
--- /dev/null
+package net.sf.openrocket.android.db;\r
+\r
+import java.io.ByteArrayInputStream;\r
+import java.io.ByteArrayOutputStream;\r
+import java.io.ObjectInputStream;\r
+import java.io.ObjectOutputStream;\r
+\r
+import net.sf.openrocket.util.Coordinate;\r
+\r
+abstract class ConversionUtils {\r
+\r
+ static double[] deserializeArrayOfDouble( byte[] bytes ) throws Exception {\r
+ double[] data = null;\r
+ if (bytes != null ) {\r
+ ObjectInputStream is = new ObjectInputStream( new ByteArrayInputStream(bytes));\r
+ data = (double[]) is.readObject();\r
+ }\r
+ return data;\r
+ }\r
+\r
+ static byte[] serializeArrayOfDouble( double[] data ) throws Exception {\r
+\r
+ byte[] serObj = null;\r
+ if ( data != null ) {\r
+ ByteArrayOutputStream b = new ByteArrayOutputStream();\r
+ ObjectOutputStream os = new ObjectOutputStream(b);\r
+ os.writeObject(data);\r
+ os.close();\r
+ serObj = b.toByteArray();\r
+ }\r
+ return serObj;\r
+ }\r
+\r
+ static Coordinate[] deserializeArrayOfCoordinate( byte[] bytes ) throws Exception {\r
+ Coordinate[] data = null;\r
+ if (bytes != null ) {\r
+ ObjectInputStream is = new ObjectInputStream( new ByteArrayInputStream(bytes));\r
+ data = (Coordinate[]) is.readObject();\r
+ }\r
+ return data;\r
+ }\r
+\r
+ static byte[] serializeArrayOfCoordinate( Coordinate[] data ) throws Exception {\r
+\r
+ byte[] serObj = null;\r
+ if ( data != null ) {\r
+ ByteArrayOutputStream b = new ByteArrayOutputStream();\r
+ ObjectOutputStream os = new ObjectOutputStream(b);\r
+ os.writeObject(data);\r
+ os.close();\r
+ serObj = b.toByteArray();\r
+ }\r
+ return serObj;\r
+ }\r
+\r
+\r
+}
\ No newline at end of file
private SQLiteDatabase mDb;\r
\r
private static final String DATABASE_NAME = "rocketflightnotebook";\r
- private static final int DATABASE_VERSION = 5;\r
+ private static final int DATABASE_VERSION = 2;\r
\r
private final Context mCtx;\r
\r
package net.sf.openrocket.android.db;\r
\r
-import java.io.ByteArrayInputStream;\r
-import java.io.ByteArrayOutputStream;\r
-import java.io.ObjectInputStream;\r
-import java.io.ObjectOutputStream;\r
-import java.util.Vector;\r
-\r
-import net.sf.openrocket.android.motor.Motor;\r
+import net.sf.openrocket.android.motor.ExtendedThrustCurveMotor;\r
+import net.sf.openrocket.motor.Manufacturer;\r
+import net.sf.openrocket.motor.Motor;\r
+import net.sf.openrocket.motor.ThrustCurveMotor;\r
+import net.sf.openrocket.util.Coordinate;\r
import android.content.ContentValues;\r
import android.database.Cursor;\r
import android.database.SQLException;\r
"create table "+ DATABASE_TABLE + " ( " +\r
"_id integer primary key, "+\r
"unique_name text unique, "+\r
- "name text, "+\r
+ "designation text, "+\r
+ "delays blob, "+\r
"diameter number, "+\r
"tot_impulse_ns number, "+\r
"avg_thrust_n number, "+\r
"tot_mass_g number,"+\r
"case_info text,"+\r
"manufacturer text," +\r
+ "type text," +\r
"impulse_class text," +\r
- "burndata blob"+\r
+ "thrust_data blob,"+\r
+ "time_data blob," +\r
+ "cg_data blob"+\r
");";\r
\r
MotorDao( SQLiteDatabase mDb ) {\r
\r
public final static String ID = "_id";\r
public final static String UNIQUE_NAME = "unique_name";\r
- public final static String NAME = "name";\r
+ public final static String DESIGNATION = "designation";\r
+ public final static String DELAYS = "delays";\r
public final static String DIAMETER = "diameter";\r
public final static String TOTAL_IMPULSE = "tot_impulse_ns"; \r
public final static String AVG_THRUST = "avg_thrust_n";\r
public final static String MAX_THRUST = "max_thrust_n";\r
public final static String BURN_TIME = "burn_time_s";\r
public final static String LENGTH = "length";\r
- public final static String PROP_MASS = "prop_mass_g";\r
- public final static String TOT_MASS = "tot_mass_g";\r
- public final static String BURNDATA = "burndata";\r
public final static String CASE_INFO = "case_info";\r
public final static String MANUFACTURER = "manufacturer";\r
+ public final static String TYPE = "type";\r
public final static String IMPULSE_CLASS = "impulse_class";\r
+ public final static String THRUST_DATA = "thrust_data";\r
+ public final static String TIME_DATA = "time_data";\r
+ public final static String CG_DATA = "cg_data";\r
+\r
+ private final static String[] ALL_COLS = new String[] {\r
+ ID,\r
+ DESIGNATION ,\r
+ DELAYS ,\r
+ DIAMETER ,\r
+ TOTAL_IMPULSE ,\r
+ AVG_THRUST ,\r
+ MAX_THRUST ,\r
+ BURN_TIME ,\r
+ LENGTH,\r
+ CASE_INFO,\r
+ TYPE,\r
+ IMPULSE_CLASS,\r
+ MANUFACTURER,\r
+ THRUST_DATA,\r
+ TIME_DATA,\r
+ CG_DATA\r
+ };\r
\r
- public long insertOrUpdateMotor(Motor mi) {\r
+ public long insertOrUpdateMotor(ExtendedThrustCurveMotor mi) throws Exception {\r
ContentValues initialValues = new ContentValues();\r
- initialValues.put(ID, mi.getMotor_id());\r
- initialValues.put(NAME, mi.getName());\r
- initialValues.put(DIAMETER,mi.getDiameter());\r
- initialValues.put(TOTAL_IMPULSE,mi.getTotalImpulse());\r
- initialValues.put(AVG_THRUST,mi.getAvgThrust());\r
- initialValues.put(MAX_THRUST,mi.getMaxThrust());\r
- initialValues.put(BURN_TIME,mi.getBurnTime());\r
- initialValues.put(LENGTH, mi.getLength());\r
- initialValues.put(PROP_MASS, mi.getPropMass());\r
- initialValues.put(TOT_MASS,mi.getTotMass());\r
+ final ThrustCurveMotor tcm = mi.getThrustCurveMotor();\r
+ initialValues.put(ID, mi.getId());\r
+ initialValues.put(UNIQUE_NAME, tcm.getManufacturer()+tcm.getDesignation());\r
+ initialValues.put(DESIGNATION, tcm.getDesignation());\r
+ initialValues.put(DELAYS, ConversionUtils.serializeArrayOfDouble(tcm.getStandardDelays()));\r
+ initialValues.put(DIAMETER,tcm.getDiameter());\r
+ initialValues.put(TOTAL_IMPULSE,tcm.getTotalImpulseEstimate());\r
+ initialValues.put(AVG_THRUST,tcm.getAverageThrustEstimate());\r
+ initialValues.put(MAX_THRUST,tcm.getMaxThrustEstimate());\r
+ initialValues.put(BURN_TIME,tcm.getBurnTimeEstimate());\r
+ initialValues.put(LENGTH, tcm.getLength());\r
initialValues.put(CASE_INFO, mi.getCaseInfo());\r
- initialValues.put(MANUFACTURER,mi.getManufacturer());\r
+ initialValues.put(TYPE, tcm.getMotorType().getName());\r
initialValues.put(IMPULSE_CLASS,mi.getImpulseClass());\r
- initialValues.put(UNIQUE_NAME, mi.getManufacturer()+mi.getName());\r
- {\r
- // Serialize the Vector of burn data\r
- Vector<Double> burndata = mi.getBurndata();\r
- byte[] serObj = null;\r
- if ( burndata != null ) {\r
- try {\r
- ByteArrayOutputStream b = new ByteArrayOutputStream();\r
- ObjectOutputStream os = new ObjectOutputStream(b);\r
- os.writeObject(burndata);\r
- os.close();\r
- serObj = b.toByteArray();\r
- } catch (Exception ex) {\r
- Log.d(TAG,"unable to serialze burndata");\r
- }\r
- }\r
- initialValues.put(BURNDATA, serObj);\r
- }\r
-\r
+ initialValues.put(MANUFACTURER,tcm.getManufacturer().getSimpleName());\r
+ initialValues.put(THRUST_DATA, ConversionUtils.serializeArrayOfDouble(tcm.getThrustPoints()));\r
+ initialValues.put(TIME_DATA,ConversionUtils.serializeArrayOfDouble(tcm.getTimePoints()));\r
+ initialValues.put(CG_DATA,ConversionUtils.serializeArrayOfCoordinate(tcm.getCGPoints()));\r
\r
Log.d(TAG,"insertOrUpdate Motor");\r
long rv = mDb.insertWithOnConflict(DATABASE_TABLE, null, initialValues,SQLiteDatabase.CONFLICT_REPLACE);\r
*/\r
public Cursor fetchAllInGroups( String groupCol, String groupVal ) {\r
return mDb.query(DATABASE_TABLE, \r
- /* columns */new String[] {\r
- ID,\r
- NAME,\r
- DIAMETER ,\r
- TOTAL_IMPULSE,\r
- AVG_THRUST ,\r
- MAX_THRUST ,\r
- BURN_TIME ,\r
- LENGTH,\r
- PROP_MASS,\r
- TOT_MASS,\r
- CASE_INFO,\r
- IMPULSE_CLASS,\r
- MANUFACTURER\r
- },\r
- /* selection */groupCol + "=?",\r
- /* selection args*/new String[] {groupVal},\r
- /* groupby */null,\r
- /* having*/null,\r
- /* orderby*/ NAME );\r
+ /* columns */ ALL_COLS,\r
+ /* selection */groupCol + "=?",\r
+ /* selection args*/new String[] {groupVal},\r
+ /* groupby */null,\r
+ /* having*/null,\r
+ /* orderby*/ DESIGNATION );\r
\r
}\r
\r
*/\r
public Cursor fetchAllMotors() {\r
\r
- return mDb.query(DATABASE_TABLE, \r
- /* columns */new String[] {\r
- ID,\r
- NAME,\r
- DIAMETER ,\r
- TOTAL_IMPULSE,\r
- AVG_THRUST ,\r
- MAX_THRUST ,\r
- BURN_TIME ,\r
- LENGTH,\r
- PROP_MASS,\r
- TOT_MASS,\r
- CASE_INFO,\r
- IMPULSE_CLASS,\r
- MANUFACTURER\r
- },\r
- /* selection */null,\r
- /* selection args*/null,\r
- /* groupby */null,\r
- /* having*/null,\r
- /* orderby*/null);\r
+ return mDb.query(DATABASE_TABLE,\r
+ /* columns */ ALL_COLS,\r
+ /* selection */null,\r
+ /* selection args*/null,\r
+ /* groupby */null,\r
+ /* having*/null,\r
+ /* orderby*/null);\r
}\r
\r
- public Motor fetchMotor(Long id ) throws SQLException {\r
+ private ExtendedThrustCurveMotor hydrateMotor( Cursor mCursor ) throws Exception {\r
+ ExtendedThrustCurveMotor mi = new ExtendedThrustCurveMotor();\r
+\r
+ mi.setId(mCursor.getLong(mCursor.getColumnIndex(ID)));\r
+ mi.setCaseInfo(mCursor.getString(mCursor.getColumnIndex(CASE_INFO)));\r
+ mi.setImpulseClass(mCursor.getString(mCursor.getColumnIndex(IMPULSE_CLASS)));\r
+\r
+ {\r
+ String designation = mCursor.getString(mCursor.getColumnIndex(DESIGNATION));\r
+ double[] delays = ConversionUtils.deserializeArrayOfDouble( mCursor.getBlob(mCursor.getColumnIndex(DELAYS)));\r
+ double diameter = mCursor.getDouble(mCursor.getColumnIndex(DIAMETER));\r
+ double totImpulse = mCursor.getDouble(mCursor.getColumnIndex(TOTAL_IMPULSE));\r
+ double avgImpulse = mCursor.getDouble(mCursor.getColumnIndex(AVG_THRUST));\r
+ double maxThrust = mCursor.getDouble(mCursor.getColumnIndex(MAX_THRUST));\r
+ double length = mCursor.getDouble(mCursor.getColumnIndex(LENGTH));\r
+ Motor.Type type = Motor.Type.fromName( mCursor.getString(mCursor.getColumnIndex(TYPE)));\r
+ Manufacturer manufacturer = Manufacturer.getManufacturer( mCursor.getString( mCursor.getColumnIndex(MANUFACTURER)));\r
+ double[] thrustData = ConversionUtils.deserializeArrayOfDouble( mCursor.getBlob(mCursor.getColumnIndex(THRUST_DATA)));\r
+ double[] timeData = ConversionUtils.deserializeArrayOfDouble( mCursor.getBlob(mCursor.getColumnIndex(TIME_DATA)));\r
+ Coordinate[] cgData = ConversionUtils.deserializeArrayOfCoordinate( mCursor.getBlob(mCursor.getColumnIndex(CG_DATA)));\r
+\r
+ ThrustCurveMotor tcm = new ThrustCurveMotor(manufacturer,\r
+ designation,\r
+ "",\r
+ type,\r
+ delays,\r
+ diameter,\r
+ length,\r
+ timeData,\r
+ thrustData,\r
+ cgData\r
+ );\r
+ mi.setThrustCurveMotor(tcm);\r
+ }\r
+ return mi;\r
+\r
+ }\r
+\r
+ public ExtendedThrustCurveMotor fetchMotor(Long id ) throws Exception {\r
Cursor mCursor = mDb.query(DATABASE_TABLE, \r
- /* columns */new String[] {\r
- ID,\r
- NAME ,\r
- DIAMETER ,\r
- TOTAL_IMPULSE ,\r
- AVG_THRUST ,\r
- MAX_THRUST ,\r
- BURN_TIME ,\r
- LENGTH,\r
- PROP_MASS,\r
- TOT_MASS,\r
- CASE_INFO,\r
- IMPULSE_CLASS,\r
- MANUFACTURER,\r
- BURNDATA\r
- },\r
- /* selection */ID + "="+id,\r
- /* selection args*/null,\r
- /* groupby */null,\r
- /* having*/null,\r
- /* orderby*/null);\r
+ /* columns */ ALL_COLS,\r
+ /* selection */ID + "="+id,\r
+ /* selection args*/null,\r
+ /* groupby */null,\r
+ /* having*/null,\r
+ /* orderby*/null);\r
if ( mCursor == null ) {\r
return null;\r
}\r
return null;\r
}\r
mCursor.moveToFirst();\r
- Motor mi = new Motor();\r
- mi.setMotor_id(mCursor.getLong(mCursor.getColumnIndex(ID)));\r
- mi.setName(mCursor.getString(mCursor.getColumnIndex(NAME)));\r
- mi.setDiameter(mCursor.getLong(mCursor.getColumnIndex(DIAMETER)));\r
- mi.setTotalImpulse(mCursor.getFloat(mCursor.getColumnIndex(TOTAL_IMPULSE)));\r
- mi.setAvgThrust(mCursor.getFloat(mCursor.getColumnIndex(AVG_THRUST)));\r
- mi.setMaxThrust(mCursor.getFloat(mCursor.getColumnIndex(MAX_THRUST)));\r
- mi.setBurnTime(mCursor.getFloat(mCursor.getColumnIndex(BURN_TIME)));\r
- mi.setLength(mCursor.getFloat(mCursor.getColumnIndex(LENGTH)));\r
- mi.setPropMass(mCursor.getDouble(mCursor.getColumnIndex(PROP_MASS)));\r
- mi.setCaseInfo(mCursor.getString(mCursor.getColumnIndex(CASE_INFO)));\r
- mi.setTotMass(mCursor.getDouble(mCursor.getColumnIndex(TOT_MASS)));\r
- mi.setManufacturer(mCursor.getString(mCursor.getColumnIndex(MANUFACTURER)));\r
- mi.setImpulseClass(mCursor.getString(mCursor.getColumnIndex(IMPULSE_CLASS)));\r
+ return hydrateMotor(mCursor);\r
+ }\r
+ finally {\r
+ mCursor.close();\r
+ }\r
\r
- {\r
- // Deserialize burndata column\r
- byte[] serObj = mCursor.getBlob(mCursor.getColumnIndex(BURNDATA));\r
- Vector<Double> burndata = null;\r
- if (serObj != null ) {\r
- try {\r
- ObjectInputStream is = new ObjectInputStream( new ByteArrayInputStream(serObj));\r
- burndata = (Vector<Double>) is.readObject();\r
- }\r
- catch (Exception ex) {\r
- Log.d(TAG,"cannot deserialize burndata");\r
- }\r
- }\r
- mi.setBurndata(burndata);\r
+ }\r
+\r
+ public ExtendedThrustCurveMotor fetchMotor(String manufacturerShortName, String designation ) throws Exception {\r
+ Cursor mCursor = mDb.query(DATABASE_TABLE, \r
+ /* columns */ ALL_COLS,\r
+ /* selection */MANUFACTURER + "='"+manufacturerShortName + "' and "+DESIGNATION+"='"+designation+"'",\r
+ /* selection args*/null,\r
+ /* groupby */null,\r
+ /* having*/null,\r
+ /* orderby*/null);\r
+ if ( mCursor == null ) {\r
+ return null;\r
+ }\r
+ try {\r
+ if (mCursor.getCount() == 0) {\r
+ return null;\r
}\r
- return mi;\r
+ mCursor.moveToFirst();\r
+ return hydrateMotor(mCursor);\r
}\r
finally {\r
mCursor.close();\r
}\r
\r
}\r
-\r
+ \r
+ public static String extractPrettyDelayString( Cursor c ) {\r
+ byte[] blob = c.getBlob(c.getColumnIndex(MotorDao.DELAYS));\r
+ String s = "";\r
+ try {\r
+ double[] delayarry = ConversionUtils.deserializeArrayOfDouble(blob);\r
+ boolean first = true;\r
+ for( double d:delayarry ) {\r
+ if (!first) {\r
+ s += ",";\r
+ } else {\r
+ first = false;\r
+ }\r
+ if ( d == Motor.PLUGGED ) {\r
+ s+= "P";\r
+ } else {\r
+ s += Math.round(d);\r
+ }\r
+ }\r
+ } catch ( Exception ex ) {\r
+ }\r
+ return s;\r
+ }\r
+ \r
}\r
package net.sf.openrocket.android.motor;\r
\r
+import java.util.ArrayList;\r
+import java.util.List;\r
import java.util.Vector;\r
\r
import net.sf.openrocket.R;\r
\r
private final static String TAG = "BurnPlotFragment";\r
\r
+ private ExtendedThrustCurveMotor motor;\r
+\r
private XYPlot mySimpleXYPlot;\r
private SimpleXYSeries mySeries;\r
private PointF minXY;\r
private PointF maxXY;\r
- \r
+\r
private float absMinX;\r
private float absMaxX;\r
- private float minNoError;\r
- private float maxNoError;\r
\r
private ScaleGestureDetector mScaleDetector;\r
private float mScaleFactor = 1.f;\r
\r
- public static BurnPlotFragment initializeBurnPlotHelper( Motor motor ) {\r
- BurnPlotFragment h = new BurnPlotFragment();\r
-\r
- Bundle args = new Bundle();\r
- args.putSerializable("Motor", motor);\r
- h.setArguments(args);\r
- return h;\r
- }\r
-\r
@Override\r
public void onAttach(Activity activity) {\r
super.onAttach(activity);\r
mySimpleXYPlot = (XYPlot) v.findViewById(R.id.xyplot);\r
mySimpleXYPlot.setOnTouchListener(this);\r
mScaleDetector = new ScaleGestureDetector(v.getContext(), new ScaleListener());\r
- // Motor motor = getMotor();\r
- // init(motor);\r
return v;\r
}\r
\r
- void init( Motor motor ) {\r
+ private static List<Double> fromArray( double[] arry ) {\r
+ List<Double> l = new ArrayList<Double>(arry.length);\r
+ for( double d: arry ) {\r
+ l.add(d);\r
+ }\r
+ return l;\r
+ }\r
+ void init( ExtendedThrustCurveMotor motor ) {\r
\r
mySimpleXYPlot.setUserDomainOrigin(0);\r
mySimpleXYPlot.setUserRangeOrigin(0);\r
mySimpleXYPlot.setRangeLabel("impuse (n)");\r
mySimpleXYPlot.setDomainLabel("time (s)");\r
- mySimpleXYPlot.addMarker(new YValueMarker(motor.getAvgThrust(),"average" ));\r
+ mySimpleXYPlot.addMarker(new YValueMarker(motor.getThrustCurveMotor().getAverageThrustEstimate(),"average" ));\r
mySimpleXYPlot.disableAllMarkup();\r
\r
- Vector<Double> data = null;\r
+\r
try {\r
- data = motor.getBurndata();\r
+ mySeries = new SimpleXYSeries( \r
+ fromArray(motor.getThrustCurveMotor().getTimePoints()),\r
+ fromArray(motor.getThrustCurveMotor().getThrustPoints()),\r
+ motor.getThrustCurveMotor().getDesignation());\r
} catch ( Exception ex ) {\r
- }\r
- if ( data == null || data.size() == 0 ) {\r
- data = new Vector<Double>();\r
+\r
+ Vector<Double> data = new Vector<Double>();\r
data.add(0.0);\r
data.add(0.0);\r
data.add(1.0);\r
data.add(1.0);\r
+ mySeries = new SimpleXYSeries(data, SimpleXYSeries.ArrayFormat.XY_VALS_INTERLEAVED,"no data");\r
}\r
- Log.d("plot","data = " + data.toString());\r
-\r
- mySeries = new SimpleXYSeries(data, SimpleXYSeries.ArrayFormat.XY_VALS_INTERLEAVED,motor.getName());\r
\r
mySimpleXYPlot.addSeries(mySeries, LineAndPointRenderer.class,\r
new LineAndPointFormatter(Color.rgb(0, 255, 0), Color.rgb(200, 0, 0), null));\r
\r
//Set of internal variables for keeping track of the boundaries\r
mySimpleXYPlot.calculateMinMaxVals();\r
- \r
+\r
mySimpleXYPlot.redraw();\r
\r
minXY=new PointF(mySimpleXYPlot.getCalculatedMinX().floatValue(),mySimpleXYPlot.getCalculatedMinY().floatValue());\r
\r
absMinX = minXY.x;\r
absMaxX = maxXY.x;\r
- \r
- minNoError = Math.round(mySeries.getX(1).floatValue() +2);\r
- maxNoError = Math.round(mySeries.getX(mySeries.size() -1).floatValue()) - 2.0f;\r
+\r
}\r
\r
private float mPosX;\r
mActivePointerId = event.getPointerId(0);\r
break;\r
}\r
- \r
+\r
case MotionEvent.ACTION_MOVE: {\r
final int pointerIndex = event.findPointerIndex(mActivePointerId);\r
final float x = event.getX(pointerIndex);\r
if (!mScaleDetector.isInProgress()) {\r
final float dx = x - mLastTouchX;\r
final float dy = y - mLastTouchY;\r
- \r
+\r
mPosX += dx;\r
mPosY += dy;\r
scroll(dx);\r
// do scroll.\r
- \r
+\r
}\r
mLastTouchX = x;\r
mLastTouchY = y;\r
- \r
+\r
break;\r
}\r
- \r
+\r
case MotionEvent.ACTION_UP: {\r
mActivePointerId = -1;\r
break;\r
}\r
- \r
+\r
case MotionEvent.ACTION_CANCEL: {\r
mActivePointerId = -1;\r
break;\r
}\r
- \r
+\r
case MotionEvent.ACTION_POINTER_UP: {\r
final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;\r
final int pointerId = event.getPointerId(pointerIndex);\r
}\r
\r
private void checkBoundaries() {\r
- \r
+\r
if ( minXY.x < absMinX) \r
minXY.x = absMinX;\r
-// else if ( minXY.x > maxNoError )\r
-// minXY.x = maxNoError;\r
- \r
+ // else if ( minXY.x > maxNoError )\r
+ // minXY.x = maxNoError;\r
+\r
if ( maxXY.x > absMaxX)\r
maxXY.x = absMaxX;\r
-// else if ( maxXY.x < minNoError)\r
-// maxXY.x = minNoError;\r
+ // else if ( maxXY.x < minNoError)\r
+ // maxXY.x = minNoError;\r
}\r
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {\r
@Override\r
--- /dev/null
+package net.sf.openrocket.android.motor;\r
+\r
+import net.sf.openrocket.motor.ThrustCurveMotor;\r
+\r
+public class ExtendedThrustCurveMotor {\r
+\r
+ private Long id;\r
+ private String caseInfo;\r
+ private String impulseClass;\r
+ private ThrustCurveMotor thrustCurveMotor;\r
+ /**\r
+ * @return the id\r
+ */\r
+ public Long getId() {\r
+ return id;\r
+ }\r
+ /**\r
+ * @param id the id to set\r
+ */\r
+ public void setId(Long id) {\r
+ this.id = id;\r
+ }\r
+ /**\r
+ * @return the caseInfo\r
+ */\r
+ public String getCaseInfo() {\r
+ return caseInfo;\r
+ }\r
+ /**\r
+ * @param caseInfo the caseInfo to set\r
+ */\r
+ public void setCaseInfo(String caseInfo) {\r
+ this.caseInfo = caseInfo;\r
+ }\r
+ /**\r
+ * @return the impulseClass\r
+ */\r
+ public String getImpulseClass() {\r
+ return impulseClass;\r
+ }\r
+ /**\r
+ * @param impulseClass the impulseClass to set\r
+ */\r
+ public void setImpulseClass(String impulseClass) {\r
+ this.impulseClass = impulseClass;\r
+ }\r
+ /**\r
+ * @return the thrustCurveMotor\r
+ */\r
+ public ThrustCurveMotor getThrustCurveMotor() {\r
+ return thrustCurveMotor;\r
+ }\r
+ /**\r
+ * @param thrustCurveMotor the thrustCurveMotor to set\r
+ */\r
+ public void setThrustCurveMotor(ThrustCurveMotor thrustCurveMotor) {\r
+ this.thrustCurveMotor = thrustCurveMotor;\r
+ }\r
+ \r
+ \r
+ \r
+}\r
+++ /dev/null
-package net.sf.openrocket.android.motor;\r
-\r
-import java.io.Serializable;\r
-import java.util.Vector;\r
-\r
-public class Motor implements Serializable {\r
- \r
- private Long motor_id;\r
- private String name;\r
- private String impulseClass;\r
- private String manufacturer;\r
- private Long diameter;\r
- private String caseInfo;\r
- private Float avgThrust;\r
- private Float maxThrust;\r
- private Float totalImpulse;\r
- private Float burnTime;\r
- private Float length;\r
- private Double propMass;\r
- private Double totMass;\r
- private Vector<Double> burndata;\r
- public Long getMotor_id() {\r
- return motor_id;\r
- }\r
- public void setMotor_id(Long motor_id) {\r
- this.motor_id = motor_id;\r
- }\r
- public String getName() {\r
- return name;\r
- }\r
- public void setName(String name) {\r
- this.name = name;\r
- }\r
- public String getImpulseClass() {\r
- return impulseClass;\r
- }\r
- public void setImpulseClass(String impulseClass) {\r
- this.impulseClass = impulseClass;\r
- }\r
- public String getManufacturer() {\r
- return manufacturer;\r
- }\r
- public void setManufacturer(String manufacturer) {\r
- this.manufacturer = manufacturer;\r
- }\r
- public Long getDiameter() {\r
- return diameter;\r
- }\r
- public void setDiameter(Long diameter) {\r
- this.diameter = diameter;\r
- }\r
- public String getCaseInfo() {\r
- return caseInfo;\r
- }\r
- public void setCaseInfo(String caseInfo) {\r
- this.caseInfo = caseInfo;\r
- }\r
- public Float getAvgThrust() {\r
- return avgThrust;\r
- }\r
- public void setAvgThrust(Float avgThrust) {\r
- this.avgThrust = avgThrust;\r
- }\r
- public Float getMaxThrust() {\r
- return maxThrust;\r
- }\r
- public void setMaxThrust(Float maxThrust) {\r
- this.maxThrust = maxThrust;\r
- }\r
- public Float getTotalImpulse() {\r
- return totalImpulse;\r
- }\r
- public void setTotalImpulse(Float totalImpulse) {\r
- this.totalImpulse = totalImpulse;\r
- }\r
- public Float getBurnTime() {\r
- return burnTime;\r
- }\r
- public void setBurnTime(Float burnTime) {\r
- this.burnTime = burnTime;\r
- }\r
- public Float getLength() {\r
- return length;\r
- }\r
- public void setLength(Float length) {\r
- this.length = length;\r
- }\r
- public Double getPropMass() {\r
- return propMass;\r
- }\r
- public void setPropMass(Double propMass) {\r
- this.propMass = propMass;\r
- }\r
- public Double getTotMass() {\r
- return totMass;\r
- }\r
- public void setTotMass(Double totMass) {\r
- this.totMass = totMass;\r
- }\r
- public Vector<Double> getBurndata() {\r
- return burndata;\r
- }\r
- public void setBurndata(Vector<Double> burndata) {\r
- this.burndata = burndata;\r
- }\r
- \r
-}\r
package net.sf.openrocket.android.motor;\r
\r
import net.sf.openrocket.R;\r
+import net.sf.openrocket.android.db.DbAdapter;\r
import android.content.Intent;\r
import android.os.Bundle;\r
import android.support.v4.app.FragmentActivity;\r
private SlidingDrawer slidingDrawer;\r
private ImageView handle;\r
\r
- private Motor motor;\r
+ private ExtendedThrustCurveMotor motor;\r
\r
@Override\r
public void onCreate(Bundle savedInstanceState) {\r
setContentView(R.layout.motor_detail);\r
\r
Intent i = getIntent();\r
- motor = (Motor) i.getSerializableExtra("Motor");\r
+ long motorId = i.getLongExtra("Motor",-1);\r
+\r
+ DbAdapter mDbHelper = new DbAdapter(this);\r
+ mDbHelper.open();\r
+\r
+ try {\r
+ motor = mDbHelper.getMotorDao().fetchMotor(motorId);\r
+ } catch ( Exception e ) {\r
+ \r
+ }\r
+\r
+ mDbHelper.close();\r
\r
BurnPlotFragment burnPlot = (BurnPlotFragment) getSupportFragmentManager().findFragmentById(R.id.burnPlotFragment);\r
burnPlot.init(motor);\r
package net.sf.openrocket.android.motor;\r
\r
+import java.util.Arrays;\r
+\r
import net.sf.openrocket.R;\r
+import net.sf.openrocket.motor.ThrustCurveMotor;\r
import android.os.Bundle;\r
import android.support.v4.app.Fragment;\r
import android.view.LayoutInflater;\r
\r
EditText manuField;\r
EditText nameField;\r
+ EditText delaysField;\r
EditText caseField;\r
EditText impulseClassField;\r
EditText diameterField;\r
View v = inflater.inflate(R.layout.motor_detail_form, container, false);\r
manuField = (EditText) v.findViewById(R.id.motorDetailsManufacturer);\r
nameField = (EditText) v.findViewById(R.id.motorDetailsName);\r
+ delaysField = (EditText) v.findViewById(R.id.motorDetailsDelays);\r
caseField = (EditText) v.findViewById(R.id.motorDetailsCaseInfo);\r
impulseClassField = (EditText) v.findViewById(R.id.motorDetailsImpuseClass);\r
diameterField = (EditText) v.findViewById(R.id.motorDetailsDiameter);\r
return v;\r
}\r
\r
- public void init( Motor m ) {\r
- manuField.setText( m.getManufacturer());\r
- nameField.setText( m.getName() );\r
+ public void init( ExtendedThrustCurveMotor m ) {\r
+ ThrustCurveMotor tcm = m.getThrustCurveMotor();\r
+ manuField.setText( tcm.getManufacturer().getDisplayName());\r
+ nameField.setText( tcm.getDesignation() );\r
+ delaysField.setText( Arrays.toString(tcm.getStandardDelays()) );\r
caseField.setText( m.getCaseInfo());\r
impulseClassField.setText( m.getImpulseClass());\r
- diameterField.setText( m.getDiameter().toString() );\r
- lengthField.setText( m.getLength().toString() );\r
+ diameterField.setText( String.valueOf(tcm.getDiameter()*1000.0) );\r
+ lengthField.setText( String.valueOf(tcm.getLength()*1000.0) );\r
\r
}\r
\r
import android.view.View;\r
import android.widget.CursorTreeAdapter;\r
import android.widget.ExpandableListView;\r
-import android.widget.SimpleCursorTreeAdapter;\r
+import android.widget.ResourceCursorTreeAdapter;\r
+import android.widget.TextView;\r
\r
\r
public class MotorHierarchicalBrowser\r
\r
private DbAdapter mDbHelper;\r
\r
- public class MotorHierarchicalListAdapter extends SimpleCursorTreeAdapter\r
+ public class MotorHierarchicalListAdapter extends ResourceCursorTreeAdapter\r
{\r
\r
// Note that the constructor does not take a Cursor. This is done to avoid querying the \r
// database on the main thread.\r
public MotorHierarchicalListAdapter(Context context, Cursor cursor, int groupLayout,\r
- int childLayout, String[] groupFrom, int[] groupTo, String[] childrenFrom,\r
- int[] childrenTo) {\r
+ int childLayout ) {\r
\r
- super(context, cursor, groupLayout, groupFrom, groupTo, childLayout, childrenFrom,\r
- childrenTo);\r
+ super(context, cursor, groupLayout, childLayout);\r
}\r
\r
@Override\r
return groupPosition;\r
}\r
\r
+ //new String[] { MotorDao.MANUFACTURER, MotorDao.DESIGNATION, MotorDao.CASE_INFO, MotorDao.TOTAL_IMPULSE }, // Number for child layouts\r
+ //new int[] { R.id.motorChildManu, R.id.motorChildName, R.id.motorChildDelays, R.id.motorChildImpulse }\r
+\r
+ /* (non-Javadoc)\r
+ * @see android.widget.CursorTreeAdapter#bindChildView(android.view.View, android.content.Context, android.database.Cursor, boolean)\r
+ */\r
+ @Override\r
+ protected void bindChildView(View arg0, Context arg1, Cursor arg2,\r
+ boolean arg3) {\r
+ \r
+ TextView manu = (TextView) arg0.findViewById(R.id.motorChildManu);\r
+ manu.setText( arg2.getString(arg2.getColumnIndex(MotorDao.MANUFACTURER)));\r
+ \r
+ TextView desig = (TextView) arg0.findViewById(R.id.motorChildName);\r
+ desig.setText( arg2.getString(arg2.getColumnIndex(MotorDao.DESIGNATION)));\r
+ \r
+ TextView delays = (TextView) arg0.findViewById(R.id.motorChildDelays);\r
+ delays.setText( MotorDao.extractPrettyDelayString( arg2 ));\r
+ \r
+ TextView totImpulse = (TextView) arg0.findViewById(R.id.motorChildImpulse);\r
+ totImpulse.setText( arg2.getString(arg2.getColumnIndex(MotorDao.TOTAL_IMPULSE)));\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see android.widget.CursorTreeAdapter#bindGroupView(android.view.View, android.content.Context, android.database.Cursor, boolean)\r
+ */\r
+ @Override\r
+ protected void bindGroupView(View view, Context context, Cursor cursor,\r
+ boolean isExpanded) {\r
+ TextView v = (TextView) view.findViewById(R.id.motorGroup);\r
+ if ( MotorDao.DIAMETER.equals(groupColumn)) {\r
+ double d = cursor.getDouble( cursor.getColumnIndex(groupColumn));\r
+ v.setText( String.valueOf(Math.round(d * 1000.0)) );\r
+ } else {\r
+ v.setText( cursor.getString( cursor.getColumnIndex(groupColumn)));\r
+ }\r
+ }\r
+ \r
+ \r
+\r
}\r
\r
@Override\r
@Override\r
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {\r
super.onChildClick(parent, v, groupPosition, childPosition, id);\r
- Motor m = mDbHelper.getMotorDao().fetchMotor(id);\r
//Intent i = new Intent(this, BurnPlotActivity.class);\r
Intent i = new Intent(this,MotorDetails.class);\r
- i.putExtra("Motor", m);\r
+ i.putExtra("Motor", id);\r
startActivity(i);\r
return true;\r
}\r
this,\r
motorCursor,\r
R.layout.motor_list_group,\r
- R.layout.motor_list_child,\r
- new String[] { groupColumn }, // Name for group layouts\r
- new int[] { R.id.motorGroup },\r
- new String[] { MotorDao.MANUFACTURER, MotorDao.NAME, MotorDao.TOTAL_IMPULSE }, // Number for child layouts\r
- new int[] { R.id.motorChildManu, R.id.motorChildName, R.id.motorChildImpulse });\r
+ R.layout.motor_list_child);\r
setListAdapter(mAdapter);\r
}\r
}\r
\r
public void add( MotorBurnFile mbd ) {\r
MotorBurnFile currentData = data.get(mbd.getMotorId());\r
- if ( currentData == null || currentData.getDatapoints().size() < mbd.getDatapoints().size() ) {\r
+ if ( currentData == null || currentData.getThrustCurveMotor() == null ) {\r
data.put(mbd.getMotorId(),mbd);\r
}\r
}\r
new EndTextElementListener() {\r
@Override\r
public void end(String arg0) {\r
- currentMotor.setMotor_id(Integer.parseInt(arg0));\r
+ currentMotor.setMotorId(Integer.parseInt(arg0));\r
}\r
}\r
);\r
package net.sf.openrocket.android.thrustcurve;\r
\r
-import java.util.Vector;\r
+import java.io.IOException;\r
+import java.io.StringReader;\r
+import java.util.List;\r
+\r
+import net.sf.openrocket.file.motor.RASPMotorLoader;\r
+import net.sf.openrocket.file.motor.RockSimMotorLoader;\r
+import net.sf.openrocket.motor.Motor;\r
+import net.sf.openrocket.motor.ThrustCurveMotor;\r
\r
public class MotorBurnFile {\r
\r
- private Integer motor_id;\r
+ private Integer motorId;\r
private String filetype;\r
- private Float length;\r
- private String delays;\r
- private Double propWeightG;\r
- private Double totWeightG;\r
- private Vector<Double> datapoints = new Vector<Double>();\r
- \r
+ private ThrustCurveMotor thrustCurveMotor;\r
+\r
public void init() {\r
- this.motor_id = null;\r
+ this.motorId = null;\r
this.filetype = null;\r
- this.length = null;\r
- this.delays = null;\r
- this.propWeightG = null;\r
- this.totWeightG = null;\r
- this.datapoints = new Vector<Double>();\r
+ this.thrustCurveMotor = null;\r
}\r
- \r
+\r
@Override\r
public MotorBurnFile clone() {\r
MotorBurnFile clone = new MotorBurnFile();\r
- clone.motor_id = this.motor_id;\r
+ clone.motorId = this.motorId;\r
clone.filetype = this.filetype;\r
- clone.length = this.length;\r
- clone.delays = this.delays;\r
- clone.propWeightG = this.propWeightG;\r
- clone.totWeightG = this.totWeightG;\r
- clone.datapoints = this.datapoints;\r
+ clone.thrustCurveMotor = this.thrustCurveMotor;\r
return clone;\r
}\r
\r
- public void decodeFile(String data){\r
- if (SupportedFileTypes.RASP_FORMAT.equals(filetype)) {\r
- RaspBurnFile.parse(this,data);\r
- } else if (SupportedFileTypes.ROCKSIM_FORMAT.equals(filetype) ){\r
- RSEBurnFile.parse(this,data);\r
+ public void decodeFile(String data) {\r
+ try {\r
+ if (SupportedFileTypes.RASP_FORMAT.equals(filetype)) {\r
+ RASPMotorLoader loader = new RASPMotorLoader();\r
+ List<Motor> motors = loader.load( new StringReader(data), "download");\r
+ this.thrustCurveMotor = (ThrustCurveMotor) motors.get(0);\r
+ } else if (SupportedFileTypes.ROCKSIM_FORMAT.equals(filetype) ){\r
+ RockSimMotorLoader loader = new RockSimMotorLoader();\r
+ List<Motor> motors = loader.load( new StringReader(data), "download");\r
+ this.thrustCurveMotor = (ThrustCurveMotor) motors.get(0);\r
+ }\r
+ } catch ( IOException ex ) {\r
+ this.thrustCurveMotor = null;\r
}\r
}\r
- \r
+\r
+ /**\r
+ * @return the motor_id\r
+ */\r
public Integer getMotorId() {\r
- return motor_id;\r
- }\r
- public String getFileType() {\r
- return filetype;\r
- }\r
- public Float getLength() {\r
- return length;\r
- }\r
- public String getDelays() {\r
- return delays;\r
+ return motorId;\r
}\r
- public Double getPropWeightG() {\r
- return propWeightG;\r
- }\r
- public Double getTotWeightG() {\r
- return totWeightG;\r
- }\r
- public Vector<Double> getDatapoints() {\r
- return datapoints;\r
+\r
+ /**\r
+ * @param motor_id the motor_id to set\r
+ */\r
+ public void setMotorId(Integer motorId) {\r
+ this.motorId = motorId;\r
}\r
\r
- void setMotor_id(Integer motor_id) {\r
- this.motor_id = motor_id;\r
+ /**\r
+ * @return the filetype\r
+ */\r
+ public String getFiletype() {\r
+ return filetype;\r
}\r
- void setFiletype(String filetype ) {\r
+\r
+ /**\r
+ * @param filetype the filetype to set\r
+ */\r
+ public void setFiletype(String filetype) {\r
this.filetype = filetype;\r
}\r
- void setLength(Float length) {\r
- this.length = length;\r
- }\r
- void setDelays(String delays) {\r
- this.delays = delays;\r
- }\r
- void setPropWeightG(Double propWeightG) {\r
- this.propWeightG = propWeightG;\r
- }\r
- void setTotWeightG(Double totWeightG) {\r
- this.totWeightG = totWeightG;\r
+\r
+ /**\r
+ * @return the thrustCurveMotor\r
+ */\r
+ public ThrustCurveMotor getThrustCurveMotor() {\r
+ return thrustCurveMotor;\r
}\r
- void setDatapoints(Vector<Double> datapoints) {\r
- this.datapoints = datapoints;\r
+\r
+ /**\r
+ * @param thrustCurveMotor the thrustCurveMotor to set\r
+ */\r
+ public void setThrustCurveMotor(ThrustCurveMotor thrustCurveMotor) {\r
+ this.thrustCurveMotor = thrustCurveMotor;\r
}\r
+ \r
}\r
+++ /dev/null
-package net.sf.openrocket.android.thrustcurve;\r
-\r
-import java.io.ByteArrayInputStream;\r
-import java.io.InputStream;\r
-import java.util.Vector;\r
-\r
-import org.xml.sax.Attributes;\r
-\r
-import android.sax.Element;\r
-import android.sax.RootElement;\r
-import android.sax.StartElementListener;\r
-import android.util.Log;\r
-import android.util.Xml;\r
-\r
-class RSEBurnFile extends MotorBurnFile {\r
-\r
- private final static String TAG = "RSEBurnFile";\r
-\r
- static void parse( MotorBurnFile that, String filecontents ) {\r
-\r
- parse(that, new ByteArrayInputStream(filecontents.getBytes()) );\r
- }\r
-\r
- private final static String root_tag = "engine-database";\r
- private final static String engine_list_tag = "engine-list";\r
- private final static String engine_tag = "engine";\r
-\r
- private final static String delays_attr = "delays";\r
- private final static String len_attr = "len";\r
- private final static String propwgt_attr = "propWt";\r
- private final static String totwgt_attr = "initWt";\r
-\r
- private final static String data_tag = "data";\r
- private final static String eng_data_tag = "eng-data";\r
-\r
- private final static String time_attr="t";\r
- private final static String force_attr="f";\r
-\r
- static void parse( final MotorBurnFile that, InputStream in ) {\r
-\r
- RootElement rootEl = new RootElement(root_tag);\r
- Element engineEl = rootEl.getChild(engine_list_tag).getChild(engine_tag);\r
-\r
- final Vector<Double> datapoints = new Vector<Double>();\r
- \r
- Log.d(TAG,"parsing start");\r
-\r
- engineEl.setStartElementListener(\r
- new StartElementListener() {\r
- @Override\r
- public void start(Attributes arg0) {\r
- Log.d(TAG,"start engineEl");\r
- that.setPropWeightG(Double.parseDouble(arg0.getValue(propwgt_attr)));\r
- that.setTotWeightG(Double.parseDouble(arg0.getValue(totwgt_attr)));\r
- that.setLength(Float.parseFloat(arg0.getValue(len_attr)));\r
- that.setDelays(arg0.getValue(delays_attr));\r
- Log.d(TAG, "me is now " + that.toString());\r
- }\r
- }\r
- );\r
-\r
- Element datapointEl = engineEl.getChild(data_tag).getChild(eng_data_tag);\r
- datapointEl.setStartElementListener(\r
- new StartElementListener() {\r
- @Override\r
- public void start(Attributes attributes) {\r
- Double x = Double.parseDouble(attributes.getValue(time_attr));\r
- Double y = Double.parseDouble(attributes.getValue(force_attr));\r
- Log.d(TAG, "add data point " + x + "," + y);\r
- datapoints.add(x);\r
- datapoints.add(y);\r
- }\r
- }\r
- );\r
-\r
- try {\r
- Xml.parse(in, Xml.Encoding.UTF_8, rootEl.getContentHandler());\r
- } catch (Exception e) {\r
- throw new RuntimeException(e);\r
- }\r
-\r
- that.setDatapoints(datapoints);\r
- }\r
-}\r
-//\r
-// <engine-database>\r
-// <engine-list>\r
-// <engine FDiv="10" FFix="1" FStep="-1." Isp="202.11" Itot="8.919" Type="single-use" auto-calc-cg="1" auto-calc-mass="1" avgThrust="3.795" burn-time="2.35" cgDiv="10" cgFix="1" cgStep="-1." code="C4" delays="3,5,7" dia="18." exitDia="0." initWt="17." len="50." mDiv="10" mFix="1" mStep="-1." massFrac="26.47" mfg="Apogee" peakThrust="11.31" propWt="4.5" tDiv="10" tFix="1" tStep="-1." throatDia="0.">\r
-// <comments>Apogee C4 RASP.ENG file made from NAR published data\r
-// File produced September 4, 2000\r
-// The total impulse, peak thrust, average thrust and burn time are\r
-// the same as the averaged static test data on the NAR web site in\r
-// the certification file. The curve drawn with these data points is as\r
-// close to the certification curve as can be with such a limited\r
-// number of points (32) allowed with wRASP up to v1.6.\r
-// </comments>\r
-// <data>\r
-// <eng-data cg="25." f="0." m="4.5" t="0."/>\r
-// <eng-data cg="25." f="3.23" m="4.48533" t="0.018"/>\r
-// <eng-data cg="25." f="6.874" m="4.42671" t="0.041"/>\r
-// <eng-data cg="25." f="8.779" m="4.00814" t="0.147"/>\r
-// <eng-data cg="25." f="10.683" m="3.28643" t="0.294"/>\r
-// <eng-data cg="25." f="11.31" m="2.89252" t="0.365"/>\r
-// <eng-data cg="25." f="10.521" m="2.76585" t="0.388"/>\r
-// <eng-data cg="25." f="8.779" m="2.649" t="0.412"/>\r
-// <eng-data cg="25." f="7.04" m="2.53328" t="0.441"/>\r
-// <eng-data cg="25." f="4.555" m="2.46308" t="0.465"/>\r
-// <eng-data cg="25." f="3.479" m="2.33337" t="0.529"/>\r
-// <eng-data cg="25." f="2.981" m="2.1704" t="0.629"/>\r
-// <eng-data cg="25." f="3.23" m="2.1328" t="0.653"/>\r
-// <eng-data cg="25." f="2.816" m="2.03366" t="0.718"/>\r
-// <eng-data cg="25." f="2.733" m="1.84469" t="0.853"/>\r
-// <eng-data cg="25." f="2.65" m="1.5568" t="1.065"/>\r
-// <eng-data cg="25." f="2.567" m="1.30938" t="1.253"/>\r
-// <eng-data cg="25." f="2.401" m="1.05873" t="1.453"/>\r
-// <eng-data cg="25." f="2.484" m="0.761739" t="1.694"/>\r
-// <eng-data cg="25." f="2.484" m="0.636413" t="1.794"/>\r
-// <eng-data cg="25." f="2.733" m="0.612724" t="1.812"/>\r
-// <eng-data cg="25." f="2.401" m="0.575165" t="1.841"/>\r
-// <eng-data cg="25." f="2.401" m="0.446759" t="1.947"/>\r
-// <eng-data cg="25." f="2.401" m="0.246881" t="2.112"/>\r
-// <eng-data cg="25." f="2.401" m="0.0978809" t="2.235"/>\r
-// <eng-data cg="25." f="2.236" m="0.0429024" t="2.282"/>\r
-// <eng-data cg="25." f="1.656" m="0.0134478" t="2.312"/>\r
-// <eng-data cg="25." f="0.662" m="0.003507" t="2.329"/>\r
-// <eng-data cg="25." f="0." m="-0." t="2.35"/>\r
-// </data>\r
-// </engine>\r
-// </engine-list>\r
-// </engine-database>\r
-//\r
+++ /dev/null
-package net.sf.openrocket.android.thrustcurve;\r
-\r
-import java.io.IOException;\r
-import java.io.LineNumberReader;\r
-import java.io.StringReader;\r
-import java.util.Vector;\r
-import java.util.regex.Matcher;\r
-import java.util.regex.Pattern;\r
-\r
-import android.util.Log;\r
-\r
-\r
-class RaspBurnFile{\r
-\r
- private final static String TAG = "RaspBurnFile";\r
- \r
- private final static int HEADER = 0;\r
- private final static int DATA = 1;\r
- private final static Pattern headerPattern = Pattern.compile("(\\S*)\\s+(\\S*)\\s+(\\S*)\\s+(\\S*)\\s+(\\S*)\\s+(\\S*)\\s+(\\S*)");\r
- private final static Pattern dataPattern = Pattern.compile("(\\S*)\\s+(\\S*)");\r
- \r
- static void parse( MotorBurnFile that, String filecontents ) {\r
- \r
- int state = HEADER;\r
- \r
- LineNumberReader reader = new LineNumberReader( new StringReader(filecontents));\r
- \r
- Vector<Double> datapoints = new Vector<Double>();\r
- \r
- String line;\r
- Matcher m;\r
- try {\r
- while ( (line = reader.readLine()) != null ) {\r
- line = line.trim();\r
- Log.d("RASP",line);\r
- if ( line.startsWith(";")) {\r
- continue;\r
- }\r
- switch (state) {\r
- \r
- case HEADER:\r
- Log.d("RASP","header");\r
- m = headerPattern.matcher(line);\r
- if ( m.matches() ) {\r
- Log.d("RASP","header matches");\r
- \r
- /*motorName = m.group(1);*/\r
- /*diameter = Integer.decode(m.group(2));*/\r
- that.setLength(Float.parseFloat(m.group(3)) );\r
- String delays = m.group(4);\r
- if ( delays != null ) {\r
- delays = delays.replace("-", ",");\r
- that.setDelays(delays);\r
- }\r
- that.setPropWeightG(Double.parseDouble(m.group(5))*1000.0);\r
- that.setTotWeightG(Double.parseDouble(m.group(6))*1000.0);\r
- /*manufacturer = m.group(7);*/\r
- \r
- }\r
- state = DATA;\r
- break;\r
- \r
- case DATA:\r
- Log.d("RASP","data");\r
- m = dataPattern.matcher(line);\r
- if ( m.matches() ) {\r
- Log.d("RASP","data matches");\r
- Double x = Double.parseDouble(m.group(1));\r
- Double y = Double.parseDouble(m.group(2));\r
- Log.d("RASP","data matches ("+x+","+y+")");\r
- datapoints.add(x);\r
- datapoints.add(y);\r
- }\r
- break;\r
- }\r
- that.setDatapoints(datapoints);\r
- }\r
- } catch (IOException ex ) {\r
- Log.d(TAG,"Unable to parse Rasp file: " + ex);\r
- }\r
- \r
- }\r
- \r
-\r
-}\r
package net.sf.openrocket.android.thrustcurve;\r
\r
-import java.util.Vector;\r
-\r
import net.sf.openrocket.R;\r
import net.sf.openrocket.android.db.DbAdapter;\r
-import net.sf.openrocket.android.motor.Motor;\r
+import net.sf.openrocket.android.motor.ExtendedThrustCurveMotor;\r
import android.app.Activity;\r
import android.app.AlertDialog;\r
import android.app.ProgressDialog;\r
\r
MotorBurnFile b = new ThrustCurveAPI().downloadData(mi.getMotor_id());\r
\r
- if ( b != null ) {\r
- if ( b.getLength() != null ) {\r
- mi.setLength( b.getLength() );\r
- }\r
- if ( b.getPropWeightG() != null ) {\r
- mi.setProp_mass_g(b.getPropWeightG());\r
- }\r
- if ( b.getTotWeightG() != null ) {\r
- mi.setTot_mass_g(b.getTotWeightG());\r
- }\r
- if ( b.getDelays() != null ) {\r
- mi.setDelays(b.getDelays());\r
- }\r
- mi.setBurndata(b.getDatapoints());\r
- }\r
Log.d(TAG, mi.toString());\r
\r
- // convert to Motors. One per delay.\r
- Motor m = new Motor();\r
- // Base name of motor.\r
- String name = mi.getCommon_name() + "-";\r
-\r
- m.setManufacturer(mi.getManufacturer_abbr());\r
+ ExtendedThrustCurveMotor m = new ExtendedThrustCurveMotor();\r
+ \r
+ m.setThrustCurveMotor( b.getThrustCurveMotor() );\r
+ \r
// Convert impulse class. ThrustCurve puts mmx, 1/4a and 1/2a as A.\r
m.setImpulseClass(mi.getImpulse_class());\r
if ( "a".equalsIgnoreCase(mi.getImpulse_class())) {\r
m.setImpulseClass("1/8A");\r
}\r
}\r
- m.setAvgThrust(mi.getAvg_thrust_n());\r
- m.setBurndata(mi.getBurndata());\r
- m.setBurnTime(mi.getBurn_time_s());\r
- m.setDiameter(mi.getDiameter() == null ? null : mi.getDiameter().longValue());\r
- m.setLength(mi.getLength());\r
- m.setMaxThrust(mi.getMax_thrust_n());\r
- m.setPropMass(mi.getProp_mass_g());\r
- m.setTotalImpulse(mi.getTot_impulse_ns());\r
- m.setTotMass(mi.getTot_mass_g());\r
+ \r
// Convert Case Info.\r
if ( mi.getCase_info() == null\r
|| "single use".equalsIgnoreCase(mi.getCase_info())\r
m.setCaseInfo(mi.getCase_info());\r
}\r
\r
- Vector<String> delays = new Vector<String>();\r
- {\r
- String delaysString = mi.getDelays();\r
- if ( delaysString != null ) {\r
- delaysString = delaysString.trim();\r
- }\r
-\r
- if ( delaysString == null || "".equals(delaysString)) {\r
- delays.add("");\r
- } else {\r
- String[] delayString = delaysString.split(",");\r
- for( String d : delayString ) {\r
- delays.add( d.trim() );\r
- }\r
- }\r
- }\r
-\r
- for( String d: delays ) {\r
- if ( "100".equals(d) ) {\r
- m.setName(name + "P");\r
- } else {\r
- m.setName(name + d);\r
- }\r
- mDbHelper.getMotorDao().insertOrUpdateMotor(m);\r
- }\r
+ Log.d(TAG,"adding motor " + m.toString());\r
+ // Write motor.\r
+ mDbHelper.getMotorDao().insertOrUpdateMotor(m);\r
}\r
if ( total < res.getMatches() ) {\r
handler.post( new Error( total + " motors downloaded, " + res.getMatches() + " matched. Try restricting the query more.") );\r