]> git.gag.com Git - debian/openrocket/commitdiff
Reimplement motor handling so the android application relies more heavily on the...
authorkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Thu, 12 Jan 2012 19:51:28 +0000 (19:51 +0000)
committerkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Thu, 12 Jan 2012 19:51:28 +0000 (19:51 +0000)
ExtendedThrustCurveMotor class was created to hold the additional data required by the db ( the id in particular) along with the data which is useful to the browser (case info and impulse class).

git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@344 180e2498-e6e9-4542-8430-84ac67f01cd8

20 files changed:
android/.classpath
android/res/layout/motor_detail_form.xml
android/res/layout/motor_list_child.xml
android/src/net/sf/openrocket/android/Application.java
android/src/net/sf/openrocket/android/MotorDatabaseAdapter.java [new file with mode: 0644]
android/src/net/sf/openrocket/android/db/ConversionUtils.java [new file with mode: 0644]
android/src/net/sf/openrocket/android/db/DbAdapter.java
android/src/net/sf/openrocket/android/db/MotorDao.java
android/src/net/sf/openrocket/android/motor/BurnPlotFragment.java
android/src/net/sf/openrocket/android/motor/ExtendedThrustCurveMotor.java [new file with mode: 0644]
android/src/net/sf/openrocket/android/motor/Motor.java [deleted file]
android/src/net/sf/openrocket/android/motor/MotorDetails.java
android/src/net/sf/openrocket/android/motor/MotorDetailsFragment.java
android/src/net/sf/openrocket/android/motor/MotorHierarchicalBrowser.java
android/src/net/sf/openrocket/android/thrustcurve/DownloadResponse.java
android/src/net/sf/openrocket/android/thrustcurve/DownloadResponseParser.java
android/src/net/sf/openrocket/android/thrustcurve/MotorBurnFile.java
android/src/net/sf/openrocket/android/thrustcurve/RSEBurnFile.java [deleted file]
android/src/net/sf/openrocket/android/thrustcurve/RaspBurnFile.java [deleted file]
android/src/net/sf/openrocket/android/thrustcurve/TCQueryActivity.java

index d9ab10b2dce3761096dbb869c9efcd853c0639f7..e715e6e7e2ba0a72fbdd19b9ab827c71390d8a9f 100644 (file)
@@ -2,7 +2,7 @@
 <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
index 45d595d30ff30d2bf076e91425ce31a1eacc3069..751fb279e4d5b55240cc15253caf18cdadd69dc1 100644 (file)
             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
index 0b27002ba04311cee661591b3850b7dab2c1bbf1..453f4b25abab8c722a297f38194d76b8306cefcb 100644 (file)
@@ -1,4 +1,4 @@
-<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"
@@ -8,7 +8,6 @@
         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"
@@ -45,4 +71,4 @@
         android:textStyle="bold" >
     </TextView>
 
-</RelativeLayout>
\ No newline at end of file
+</LinearLayout>
\ No newline at end of file
index 6628e5fbc103f31ab92a25b1336c6379eacd8d1c..5c34da432ad616ee5b03e56d967af78e9fea186c 100644 (file)
@@ -2,13 +2,11 @@ package net.sf.openrocket.android;
 \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
@@ -17,7 +15,7 @@ public class Application extends android.app.Application {
        // 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
@@ -30,13 +28,7 @@ public class Application extends android.app.Application {
                        \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
@@ -53,7 +45,6 @@ public class Application extends android.app.Application {
        }\r
 \r
        public Application() {\r
-               initialize();\r
        }\r
 \r
        /* (non-Javadoc)\r
@@ -62,6 +53,7 @@ public class Application extends android.app.Application {
        @Override\r
        public void onCreate() {\r
                super.onCreate();\r
+               initialize();\r
                PreferencesActivity.initializePreferences(this, PreferenceManager.getDefaultSharedPreferences(this));\r
        }\r
 \r
diff --git a/android/src/net/sf/openrocket/android/MotorDatabaseAdapter.java b/android/src/net/sf/openrocket/android/MotorDatabaseAdapter.java
new file mode 100644 (file)
index 0000000..6470e06
--- /dev/null
@@ -0,0 +1,45 @@
+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
diff --git a/android/src/net/sf/openrocket/android/db/ConversionUtils.java b/android/src/net/sf/openrocket/android/db/ConversionUtils.java
new file mode 100644 (file)
index 0000000..a5695a1
--- /dev/null
@@ -0,0 +1,57 @@
+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
index 4de12facec9e4e854fbd065e77941b8e53379cf9..a61e6a75fc1d8f20630d74fc8f71f488a7f6a705 100644 (file)
@@ -13,7 +13,7 @@ public class DbAdapter {
     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
index 7da2598a8bf6d10191cae8dd50cdd7188cf18327..303f18307b9eadf231f188f80c22755017dbd153 100644 (file)
@@ -1,12 +1,10 @@
 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
@@ -25,7 +23,8 @@ public class MotorDao {
                        "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
@@ -36,8 +35,11 @@ public class MotorDao {
                                        "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
@@ -52,54 +54,61 @@ public class MotorDao {
 \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
@@ -126,26 +135,12 @@ public class MotorDao {
         */\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
@@ -175,52 +170,61 @@ public class MotorDao {
         */\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
@@ -229,42 +233,59 @@ public class MotorDao {
                                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
index 1a8df46328e5c3be003da870e0675eaf466a32a1..96ff0845ba53cde919daa60bf0e05409973d68cf 100644 (file)
@@ -1,5 +1,7 @@
 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
@@ -27,28 +29,19 @@ public class BurnPlotFragment extends Fragment implements OnTouchListener {
 \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
@@ -69,42 +62,47 @@ public class BurnPlotFragment extends Fragment implements OnTouchListener {
                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
@@ -112,9 +110,7 @@ public class BurnPlotFragment extends Fragment implements OnTouchListener {
 \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
@@ -141,7 +137,7 @@ public class BurnPlotFragment extends Fragment implements OnTouchListener {
                        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
@@ -150,29 +146,29 @@ public class BurnPlotFragment extends Fragment implements OnTouchListener {
                        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
@@ -218,16 +214,16 @@ public class BurnPlotFragment extends Fragment implements OnTouchListener {
        }\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
diff --git a/android/src/net/sf/openrocket/android/motor/ExtendedThrustCurveMotor.java b/android/src/net/sf/openrocket/android/motor/ExtendedThrustCurveMotor.java
new file mode 100644 (file)
index 0000000..41e4c4f
--- /dev/null
@@ -0,0 +1,62 @@
+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
diff --git a/android/src/net/sf/openrocket/android/motor/Motor.java b/android/src/net/sf/openrocket/android/motor/Motor.java
deleted file mode 100644 (file)
index 68bd113..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-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
index 19f7548760cdfb32ed6da9119b128db673437351..df31f3be2422dd7437ca67f091ff2b2126a51692 100644 (file)
@@ -1,6 +1,7 @@
 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
@@ -19,7 +20,7 @@ implements SlidingDrawer.OnDrawerCloseListener, SlidingDrawer.OnDrawerOpenListen
        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
@@ -28,7 +29,18 @@ implements SlidingDrawer.OnDrawerCloseListener, SlidingDrawer.OnDrawerOpenListen
                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
index eca5d9c64a2cda82c63d598426c17449369b0081..874f43439bf2f2518bfff2afb8f1a31d832e5019 100644 (file)
@@ -1,6 +1,9 @@
 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
@@ -12,6 +15,7 @@ public class MotorDetailsFragment extends Fragment {
 \r
        EditText manuField;\r
        EditText nameField;\r
+       EditText delaysField;\r
        EditText caseField;\r
        EditText impulseClassField;\r
        EditText diameterField;\r
@@ -23,6 +27,7 @@ public class MotorDetailsFragment extends Fragment {
                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
@@ -30,13 +35,15 @@ public class MotorDetailsFragment extends Fragment {
                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
index 8344083c206a65c5cf1f70c0c7fe3471d8fb86d3..6dd754d24e6d689fafb32a09ee47831ad167b7cd 100644 (file)
@@ -21,7 +21,8 @@ import android.view.MenuItem;
 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
@@ -48,17 +49,15 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
 \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
@@ -77,6 +76,46 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
                        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
@@ -167,10 +206,9 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
        @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
@@ -221,11 +259,7 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
                                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
index 84e159169b79988fe0e52e98052e5fcda3fef28b..c075d53fb1d10f669c27792877d9da2faddfc510 100644 (file)
@@ -12,7 +12,7 @@ public class DownloadResponse {
        \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
index 7e24e7eb298f833efd4e6ddea570eafa5d43bbfb..82997829f3fc3bd0f76781711c8b2f5b34475d9a 100644 (file)
@@ -86,7 +86,7 @@ public class DownloadResponseParser {
                                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
index 58f7bb3e4568fef4b99376705fd97595102869d9..a4290768598e1cc047d6a203dcfefafd076fec3d 100644 (file)
@@ -1,89 +1,91 @@
 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
diff --git a/android/src/net/sf/openrocket/android/thrustcurve/RSEBurnFile.java b/android/src/net/sf/openrocket/android/thrustcurve/RSEBurnFile.java
deleted file mode 100644 (file)
index 0c93757..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-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
diff --git a/android/src/net/sf/openrocket/android/thrustcurve/RaspBurnFile.java b/android/src/net/sf/openrocket/android/thrustcurve/RaspBurnFile.java
deleted file mode 100644 (file)
index 2c2e834..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-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
index 8f5a783585174abef322ff5e985b2a4e8b5c5603..d1f8106c0ad52873efd6dcad67b2b9f54f39f09b 100644 (file)
@@ -1,10 +1,8 @@
 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
@@ -161,29 +159,12 @@ public class TCQueryActivity extends Activity {
 \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
@@ -195,15 +176,7 @@ public class TCQueryActivity extends Activity {
                                                        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
@@ -213,31 +186,9 @@ public class TCQueryActivity extends Activity {
                                                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