diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
index 9043baf92..1c9c3a119 100644
--- a/android/AndroidManifest.xml
+++ b/android/AndroidManifest.xml
@@ -77,8 +77,11 @@
-
+
+
\ No newline at end of file
diff --git a/android/res/layout/simulation_condition_dialog.xml b/android/res/layout/simulation_condition_dialog.xml
index d4149d2d7..ef667c846 100644
--- a/android/res/layout/simulation_condition_dialog.xml
+++ b/android/res/layout/simulation_condition_dialog.xml
@@ -44,7 +44,7 @@
android:text="@string/simulationConditionsLaunchRodAngle" />
+
PreferenceMotorBrowserGroupingOption
PreferenceUseInternalFileBrowserOpion
PreferenceFileBrowserBaseDirectory
diff --git a/android/src/net/sf/openrocket/android/rocket/SimulationEditFragment.java b/android/src/net/sf/openrocket/android/rocket/SimulationEditFragment.java
index bb28281d7..01706658e 100644
--- a/android/src/net/sf/openrocket/android/rocket/SimulationEditFragment.java
+++ b/android/src/net/sf/openrocket/android/rocket/SimulationEditFragment.java
@@ -3,6 +3,8 @@ package net.sf.openrocket.android.rocket;
import net.sf.openrocket.R;
import net.sf.openrocket.android.CurrentRocketHolder;
+import net.sf.openrocket.android.simservice.SimulationService;
+import net.sf.openrocket.android.simservice.SimulationTask;
import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.document.Simulation;
import net.sf.openrocket.simulation.SimulationOptions;
@@ -59,13 +61,20 @@ public class SimulationEditFragment extends SherlockDialogFragment {
Button deleteButton = (Button) v.findViewById(R.id.simulationConditionDelete);
deleteButton.setOnClickListener( new OnClickListener() {
-
@Override
public void onClick(View v) {
onDelete();
}
-
});
+
+ Button runButton = (Button) v.findViewById(R.id.simulationConditionRun);
+ runButton.setOnClickListener( new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onRun();
+ }
+ });
+
windspeedField = (EditText) v.findViewById(R.id.simulation_condition_windspeed);
rodlengthField = (EditText) v.findViewById(R.id.simulation_condition_rodlength);
rodangleField = (EditText) v.findViewById(R.id.simulation_condition_rodangle);
@@ -83,8 +92,8 @@ public class SimulationEditFragment extends SherlockDialogFragment {
if ( options != null ) {
windspeedField.setText( UnitGroup.UNITS_VELOCITY.toString( options.getWindSpeedAverage() ));
rodlengthField.setText( UnitGroup.UNITS_LENGTH.toString( options.getLaunchRodLength() ));
- rodangleField.setText( String.valueOf( options.getLaunchRodLength() ));
- roddirectionField.setText( String.valueOf( options.getLaunchRodDirection() ));
+ rodangleField.setText( UnitGroup.UNITS_ANGLE.toString( options.getLaunchRodAngle() ));
+ roddirectionField.setText( UnitGroup.UNITS_ANGLE.toString( options.getLaunchRodDirection() ));
motorSpinner.setSelectedConfiguration(options.getMotorConfigurationID());
}
@@ -103,4 +112,20 @@ public class SimulationEditFragment extends SherlockDialogFragment {
getDialog().dismiss();
}
+ public void onRun() {
+
+ OpenRocketDocument rocketDocument = CurrentRocketHolder.getCurrentRocket().getRocketDocument();
+ Simulation sim = rocketDocument.getSimulation(simulationId);
+ SimulationOptions options = sim.getOptions();
+
+ options.setWindSpeedAverage( UnitGroup.UNITS_VELOCITY.fromUnit(Double.parseDouble( windspeedField.getText().toString() )));
+ options.setLaunchRodLength( UnitGroup.UNITS_LENGTH.fromUnit(Double.parseDouble( rodlengthField.getText().toString() )));
+ options.setLaunchRodAngle( UnitGroup.UNITS_ANGLE.fromUnit(Double.parseDouble( rodangleField.getText().toString() )));
+ options.setLaunchRodDirection( UnitGroup.UNITS_ANGLE.fromUnit(Double.parseDouble( roddirectionField.getText().toString() )));
+ options.setMotorConfigurationID( motorSpinner.getSelectedConfiguration() );
+
+ SimulationTask t = new SimulationTask(simulationId);
+ SimulationService.executeSimulationTask(getActivity(), t);
+ getDialog().dismiss();
+ }
}
\ No newline at end of file
diff --git a/android/src/net/sf/openrocket/android/simservice/SimulationService.java b/android/src/net/sf/openrocket/android/simservice/SimulationService.java
new file mode 100644
index 000000000..dad46292f
--- /dev/null
+++ b/android/src/net/sf/openrocket/android/simservice/SimulationService.java
@@ -0,0 +1,85 @@
+package net.sf.openrocket.android.simservice;
+
+import net.sf.openrocket.R;
+import net.sf.openrocket.android.CurrentRocketHolder;
+import net.sf.openrocket.android.util.AndroidLogWrapper;
+import net.sf.openrocket.document.Simulation;
+import net.sf.openrocket.simulation.exception.SimulationException;
+import android.app.IntentService;
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.os.IBinder;
+import android.widget.Toast;
+
+public class SimulationService extends IntentService {
+
+ // We use an id (from a dummy string) as the notificationID because it is unique.
+ private final static int notificationID = R.string.SimulationServiceNotificationID;
+
+ private Notification notification;
+
+ public static void executeSimulationTask( Context c, SimulationTask t ) {
+ AndroidLogWrapper.d(SimulationService.class, "Submitting simulation " + t.simulationId );
+
+ Intent intent = new Intent( c, SimulationService.class );
+ intent.putExtra("net.sf.openrocket.simulationtask", t);
+ c.startService(intent);
+ }
+
+ public SimulationService() {
+ super("OpenRocket Simulation Execution Service");
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ SimulationTask t = (SimulationTask) intent.getSerializableExtra("net.sf.openrocket.simulationtask");
+ try {
+ Simulation sim = CurrentRocketHolder.getCurrentRocket().getRocketDocument().getSimulation(t.simulationId);
+ AndroidLogWrapper.d(SimulationService.class, "simulating " + t.simulationId );
+ sim.simulate();
+ CurrentRocketHolder.getCurrentRocket().notifySimsChanged();
+ }
+ catch (SimulationException simex) {
+ Toast.makeText(this, "Error in simulation:" + simex.getMessage(), Toast.LENGTH_LONG ).show();
+ }
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+
+ this.notification = buildNotification();
+ startForeground(notificationID, notification);
+
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ super.onStartCommand(intent, flags, startId);
+ return START_STICKY;
+ }
+
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ stopForeground(true);
+ }
+
+ private Notification buildNotification( ) {
+ String message = "OpenRocket Simulation Execution";
+ Notification notification = new Notification(R.drawable.or_launcher, message, System.currentTimeMillis());
+
+ notification.flags = Notification.FLAG_NO_CLEAR;
+ PendingIntent contentIntent = PendingIntent.getActivity( this, 0 , new Intent( ), PendingIntent.FLAG_UPDATE_CURRENT );
+ notification.setLatestEventInfo(this, "OpenRocket", message, contentIntent);
+ return notification;
+ }
+}
diff --git a/android/src/net/sf/openrocket/android/simservice/SimulationTask.java b/android/src/net/sf/openrocket/android/simservice/SimulationTask.java
new file mode 100644
index 000000000..12abc3a10
--- /dev/null
+++ b/android/src/net/sf/openrocket/android/simservice/SimulationTask.java
@@ -0,0 +1,13 @@
+package net.sf.openrocket.android.simservice;
+
+import java.io.Serializable;
+
+public class SimulationTask implements Serializable {
+
+ int simulationId;
+
+ public SimulationTask(int simulationId) {
+ this.simulationId = simulationId;
+ }
+
+}