import java.io.ObjectInputStream;\r
import java.io.ObjectOutputStream;\r
\r
+import net.sf.openrocket.motor.Motor;\r
import net.sf.openrocket.util.Coordinate;\r
\r
abstract class ConversionUtils {\r
\r
+ static double[] stringToDelays( String value ) {\r
+ if (value == null || "".equals(value) ) {\r
+ return new double[0];\r
+ }\r
+ String[] parts = value.split(",");\r
+ double[] values = new double[parts.length];\r
+ for( int i =0; i<parts.length; i++ ) {\r
+ String p = parts[i];\r
+ if ( "P".equals(p) ) {\r
+ values[i] = Motor.PLUGGED;\r
+ } else {\r
+ double d = Double.parseDouble(p);\r
+ values[i] = d;\r
+ }\r
+ }\r
+ return values;\r
+ }\r
+ \r
+ static String delaysToString( double[] delays ) {\r
+ StringBuilder s = new StringBuilder();\r
+ boolean first = true;\r
+ for( double d:delays ) {\r
+ if (!first) {\r
+ s .append(",");\r
+ } else {\r
+ first = false;\r
+ }\r
+ if ( d == Motor.PLUGGED ) {\r
+ s.append("P");\r
+ } else {\r
+ s.append(Math.round(d));\r
+ }\r
+ }\r
+ return s.toString();\r
+ }\r
+ \r
static double[] deserializeArrayOfDouble( byte[] bytes ) throws Exception {\r
double[] data = null;\r
if (bytes != null ) {\r
private SQLiteDatabase mDb;\r
\r
private static final String DATABASE_NAME = "rocketflightnotebook";\r
- private static final int DATABASE_VERSION = 2;\r
+ private static final int DATABASE_VERSION = 3;\r
\r
private final Context mCtx;\r
\r
"create table "+ DATABASE_TABLE + " ( " +\r
"_id integer primary key, "+\r
"unique_name text unique, "+\r
+ "digest string, " +\r
"designation text, "+\r
- "delays blob, "+\r
+ "delays text, "+\r
"diameter number, "+\r
"tot_impulse_ns number, "+\r
"avg_thrust_n number, "+\r
\r
public final static String ID = "_id";\r
public final static String UNIQUE_NAME = "unique_name";\r
+ public final static String DIGEST = "digest";\r
public final static String DESIGNATION = "designation";\r
public final static String DELAYS = "delays";\r
public final static String DIAMETER = "diameter";\r
\r
private final static String[] ALL_COLS = new String[] {\r
ID,\r
+ DIGEST,\r
DESIGNATION ,\r
DELAYS ,\r
DIAMETER ,\r
final ThrustCurveMotor tcm = mi.getThrustCurveMotor();\r
initialValues.put(ID, mi.getId());\r
initialValues.put(UNIQUE_NAME, tcm.getManufacturer()+tcm.getDesignation());\r
+ initialValues.put(DIGEST, tcm.getDigest());\r
initialValues.put(DESIGNATION, tcm.getDesignation());\r
- initialValues.put(DELAYS, ConversionUtils.serializeArrayOfDouble(tcm.getStandardDelays()));\r
+ initialValues.put(DELAYS, ConversionUtils.delaysToString(tcm.getStandardDelays()));\r
initialValues.put(DIAMETER,tcm.getDiameter());\r
initialValues.put(TOTAL_IMPULSE,tcm.getTotalImpulseEstimate());\r
initialValues.put(AVG_THRUST,tcm.getAverageThrustEstimate());\r
mi.setImpulseClass(mCursor.getString(mCursor.getColumnIndex(IMPULSE_CLASS)));\r
\r
{\r
+ String digest = mCursor.getString(mCursor.getColumnIndex(DIGEST));\r
String designation = mCursor.getString(mCursor.getColumnIndex(DESIGNATION));\r
- double[] delays = ConversionUtils.deserializeArrayOfDouble( mCursor.getBlob(mCursor.getColumnIndex(DELAYS)));\r
+ String delayString = mCursor.getString(mCursor.getColumnIndex(DELAYS));\r
+ double[] delays = ConversionUtils.stringToDelays(delayString);\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
length,\r
timeData,\r
thrustData,\r
- cgData\r
+ cgData,\r
+ digest\r
);\r
mi.setThrustCurveMotor(tcm);\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
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
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
+ delays.setText( arg2.getString(arg2.getColumnIndex(MotorDao.DELAYS)));\r
\r
TextView totImpulse = (TextView) arg0.findViewById(R.id.motorChildImpulse);\r
totImpulse.setText( arg2.getString(arg2.getColumnIndex(MotorDao.TOTAL_IMPULSE)));\r
import net.sf.openrocket.motor.Manufacturer;
import net.sf.openrocket.motor.Motor;
import net.sf.openrocket.motor.Motor.Type;
-import net.sf.openrocket.motor.MotorDigest;
import net.sf.openrocket.motor.ThrustCurveMotor;
import net.sf.openrocket.util.ArrayList;
import net.sf.openrocket.util.MathUtil;
// Check whether to add as new motor or overwrite existing
- final String digest = MotorDigest.digestMotor(motor);
+ final String digest = motor.getDigest();
for (int index = 0; index < motors.size(); index++) {
Motor m = motors.get(index);
motorDigest.update(DataType.TIME_ARRAY, timeArray);
motorDigest.update(DataType.MASS_SPECIFIC, totalW, totalW - propW);
motorDigest.update(DataType.FORCE_PER_TIME, thrustArray);
- // TODO: HIGH: Motor digest?
- // final String digest = motorDigest.getDigest();
-
+ final String digest = motorDigest.getDigest();
try {
Manufacturer m = Manufacturer.getManufacturer(manufacturer);
return new ThrustCurveMotor(m, designation, comment, m.getMotorType(),
- delays, diameter, length, timeArray, thrustArray, cgArray);
+ delays, diameter, length, timeArray, thrustArray, cgArray, digest);
} catch (IllegalArgumentException e) {
motorDigest.update(DataType.CG_PER_TIME, toArray(cg));
}
motorDigest.update(DataType.FORCE_PER_TIME, thrustArray);
- // TODO: HIGH: Motor digest?
- // final String digest = motorDigest.getDigest();
+ final String digest = motorDigest.getDigest();
try {
}
return new ThrustCurveMotor(m, designation, description, t,
- delays, diameter, length, timeArray, thrustArray, cgArray);
+ delays, diameter, length, timeArray, thrustArray, cgArray, digest);
} catch (IllegalArgumentException e) {
throw new SAXException("Illegal motor data", e);
}
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.motor.Motor;
-import net.sf.openrocket.motor.MotorDigest;
-import net.sf.openrocket.motor.ThrustCurveMotor;
import net.sf.openrocket.rocketcomponent.BodyComponent;
import net.sf.openrocket.rocketcomponent.BodyTube;
import net.sf.openrocket.rocketcomponent.Bulkhead;
// One motor
if (motors.size() == 1) {
Motor m = motors.get(0);
- if (digest != null && !MotorDigest.digestMotor(m).equals(digest)) {
+ if (digest != null && !digest.equals(m.getDigest())) {
String str = "Motor with designation '" + designation + "'";
if (manufacturer != null)
str += " for manufacturer '" + manufacturer + "'";
// Check for motor with correct digest
for (Motor m : motors) {
- if (MotorDigest.digestMotor(m).equals(digest)) {
+ if (digest.equals(m.getDigest())) {
return m;
}
}
// No digest, check for preferred digest (OpenRocket <= 1.1.0)
// TODO: MEDIUM: This should only be done for document versions 1.1 and below
for (Motor m : motors) {
- if (PreferredMotorDigests.DIGESTS.contains(MotorDigest.digestMotor(m))) {
+ if (PreferredMotorDigests.DIGESTS.contains(m.getDigest())) {
return m;
}
}
import net.sf.openrocket.file.RocketSaver;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.motor.Motor;
-import net.sf.openrocket.motor.MotorDigest;
import net.sf.openrocket.motor.ThrustCurveMotor;
import net.sf.openrocket.rocketcomponent.ComponentAssembly;
import net.sf.openrocket.rocketcomponent.MotorMount;
ThrustCurveMotor m = (ThrustCurveMotor) motor;
elements.add(" <manufacturer>" + RocketSaver.escapeXML(m.getManufacturer().getSimpleName()) +
"</manufacturer>");
- elements.add(" <digest>" + MotorDigest.digestMotor(m) + "</digest>");
+ elements.add(" <digest>" + m.getDigest() + "</digest>");
}
elements.add(" <designation>" + RocketSaver.escapeXML(motor.getDesignation()) + "</designation>");
elements.add(" <diameter>" + motor.getDiameter() + "</diameter>");
// Store selected motor in preferences node, set all others to false
Preferences prefs = ((SwingPreferences) Application.getPreferences()).getNode(net.sf.openrocket.startup.Preferences.PREFERRED_THRUST_CURVE_MOTOR_NODE);
for (ThrustCurveMotor m : set.getMotors()) {
- String digest = MotorDigest.digestMotor(m);
+ String digest = m.getDigest();
prefs.putBoolean(digest, m == motor);
}
}
selectedMotor.getEmptyCG().weight));
dataPointsLabel.setText("" + (selectedMotor.getTimePoints().length - 1));
if (digestLabel != null) {
- digestLabel.setText(MotorDigest.digestMotor(selectedMotor));
+ digestLabel.setText(selectedMotor.getDigest());
}
setComment(selectedMotor.getDescription());
List<ThrustCurveMotor> list = set.getMotors();
Preferences prefs = ((SwingPreferences) Application.getPreferences()).getNode(net.sf.openrocket.startup.Preferences.PREFERRED_THRUST_CURVE_MOTOR_NODE);
for (ThrustCurveMotor m : list) {
- String digest = MotorDigest.digestMotor(m);
+ String digest = m.getDigest();
if (prefs.getBoolean(digest, false)) {
return m;
}
*/
public double getLength();
+ public String getDigest();
public MotorInstance getInstance();
package net.sf.openrocket.motor;
-import java.io.Serializable;
import java.text.Collator;
import java.util.Arrays;
import java.util.Locale;
}
private static final DesignationComparator DESIGNATION_COMPARATOR = new DesignationComparator();
-
+ private final String digest;
private final Manufacturer manufacturer;
private final String designation;
*/
public ThrustCurveMotor(Manufacturer manufacturer, String designation, String description,
Motor.Type type, double[] delays, double diameter, double length,
- double[] time, double[] thrust, Coordinate[] cg) {
-
+ double[] time, double[] thrust, Coordinate[] cg, String digest) {
+ this.digest = digest;
// Check argument validity
if ((time.length != thrust.length) || (time.length != cg.length)) {
throw new IllegalArgumentException("Array lengths do not match, " +
return totalImpulse;
}
+ @Override
+ public String getDigest() {
+ return digest;
+ }
/**
// Output motor digests
final int count = motors.size();
for (int i = 0; i < count; i++) {
- System.out.println(files.get(i) + ": " + MotorDigest.digestMotor((ThrustCurveMotor) motors.get(i)));
+ System.out.println(files.get(i) + ": " + ((ThrustCurveMotor) motors.get(i)).getDigest());
}
// Cross-correlate every pair
continue;
}
- String digest = MotorDigest.digestMotor((ThrustCurveMotor) m);
+ String digest = ((ThrustCurveMotor) m).getDigest();
if (printFileNames) {
System.out.print(file + ": ");
}
System.out.printf(" Total impulse: %.2f Ns\n", m.getTotalImpulseEstimate());
System.out.println(" Diameter: " + m.getDiameter() * 1000 + " mm");
System.out.println(" Length: " + m.getLength() * 1000 + " mm");
- System.out.println(" Digest: " + MotorDigest.digestMotor(m));
+ System.out.println(" Digest: " + m.getDigest());
if (m instanceof ThrustCurveMotor) {
ThrustCurveMotor tc = (ThrustCurveMotor) m;
this.addMotor(new ThrustCurveMotor(Manufacturer.getManufacturer("A"),
"Foo", "Desc", Motor.Type.SINGLE, new double[] { 0 },
0.024, 0.07, new double[] { 0, 1, 2 }, new double[] {0, 1, 0},
- new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL}));
+ new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL}, "digestA"));
this.addMotor(new ThrustCurveMotor(Manufacturer.getManufacturer("A"),
"Bar", "Desc", Motor.Type.SINGLE, new double[] { 0 },
0.024, 0.07, new double[] { 0, 1, 2 }, new double[] {0, 1, 0},
- new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL}));
+ new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL}, "digestB"));
this.addMotor(new ThrustCurveMotor(Manufacturer.getManufacturer("A"),
"Foo", "Desc", Motor.Type.UNKNOWN, new double[] { 0 },
0.024, 0.07, new double[] { 0, 1, 2 }, new double[] {0, 1, 0},
- new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL}));
+ new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL}, "digestA"));
}
};
Manufacturer.getManufacturer("A"),
"F12X", "Desc", Motor.Type.UNKNOWN, new double[] { },
0.024, 0.07, new double[] { 0, 1, 2 }, new double[] {0, 1, 0},
- new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL});
+ new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL}, "digestA");
private static final ThrustCurveMotor motor2 = new ThrustCurveMotor(
Manufacturer.getManufacturer("A"),
"F12H", "Desc", Motor.Type.SINGLE, new double[] { 5 },
0.024, 0.07, new double[] { 0, 1, 2 }, new double[] {0, 1, 0},
- new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL});
+ new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL}, "digestB");
private static final ThrustCurveMotor motor3 = new ThrustCurveMotor(
Manufacturer.getManufacturer("A"),
"F12", "Desc", Motor.Type.UNKNOWN, new double[] { 0, Motor.PLUGGED },
0.024, 0.07, new double[] { 0, 1, 2 }, new double[] {0, 2, 0},
- new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL});
+ new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL}, "digestC");
private static final ThrustCurveMotor motor4 = new ThrustCurveMotor(
Manufacturer.getManufacturer("A"),
"F12", "Desc", Motor.Type.HYBRID, new double[] { 0 },
0.024, 0.07, new double[] { 0, 1, 2 }, new double[] {0, 2, 0},
- new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL});
+ new Coordinate[] {Coordinate.NUL, Coordinate.NUL, Coordinate.NUL}, "digestD");
@Test
package net.sf.openrocket.file.motor;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import net.sf.openrocket.motor.Motor;
-import net.sf.openrocket.motor.MotorDigest;
import net.sf.openrocket.motor.ThrustCurveMotor;
import org.junit.Test;
String[] d = new String[digests.length];
for (int i = 0; i < motors.size(); i++) {
- d[i] = MotorDigest.digestMotor((ThrustCurveMotor) motors.get(i));
+ d[i] = ((ThrustCurveMotor) motors.get(i)).getDigest();
}
Arrays.sort(digests);
Arrays.sort(d);
- assertTrue(Arrays.equals(d, digests));
+ assertTrue("d = " + Arrays.toString(d) + " digests = " + Arrays.toString(digests), Arrays.equals(d, digests));
}
}
new Coordinate(0.02,0,0,0.05),
new Coordinate(0.02,0,0,0.05),
new Coordinate(0.03,0,0,0.03)
- });
+ }, "digestA");
@Test
public void testMotorData() {