From f1477bc1071e58b9e199d65dbd6b5ed2454aec54 Mon Sep 17 00:00:00 2001 From: kruland2607 Date: Mon, 4 Jun 2012 19:16:27 +0000 Subject: [PATCH] Added local foreground service which runs simulations. Wired into the SimulationEditFragment. git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@749 180e2498-e6e9-4542-8430-84ac67f01cd8 --- android/AndroidManifest.xml | 5 +- .../layout/simulation_condition_dialog.xml | 4 +- android/res/values/pref_strings.xml | 1 + .../rocket/SimulationEditFragment.java | 33 ++++++- .../android/simservice/SimulationService.java | 85 +++++++++++++++++++ .../android/simservice/SimulationTask.java | 13 +++ 6 files changed, 134 insertions(+), 7 deletions(-) create mode 100644 android/src/net/sf/openrocket/android/simservice/SimulationService.java create mode 100644 android/src/net/sf/openrocket/android/simservice/SimulationTask.java diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 9043baf9..1c9c3a11 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 d4149d2d..ef667c84 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 bb28281d..01706658 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 00000000..dad46292 --- /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 00000000..12abc3a1 --- /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; + } + +} -- 2.30.2