<activity\r
android:name=".android.simulation.SimulationViewActivity"\r
android:theme="@style/AppTheme.NoActionBar" />\r
- <activity android:name=".android.filebrowser.SimpleFileBrowser"\r
+ <activity\r
+ android:name=".android.filebrowser.SimpleFileBrowser"\r
android:theme="@style/Theme.Sherlock.Dialog" />\r
+\r
+ <service android:name=".android.simservice.SimulationService" />\r
</application>\r
\r
</manifest>
\ No newline at end of file
android:text="@string/simulationConditionsLaunchRodAngle" />\r
\r
<EditText\r
- android:id="@+id/simulation_condition_roddirection"\r
+ android:id="@+id/simulation_condition_rodangle"\r
android:layout_width="match_parent"\r
android:layout_height="wrap_content"\r
android:ems="10"\r
android:text="@string/simulationConditionsLaunchRodDirection" />\r
\r
<EditText\r
- android:id="@+id/simulation_condition_rodangle"\r
+ android:id="@+id/simulation_condition_roddirection"\r
android:layout_width="match_parent"\r
android:layout_height="wrap_content"\r
android:ems="10"\r
<?xml version="1.0" encoding="utf-8"?>\r
<resources>\r
\r
+ <string name="SimulationServiceNotificationID"></string>\r
<string name="PreferenceMotorBrowserGroupingOption">PreferenceMotorBrowserGroupingOption</string>\r
<string name="PreferenceUseInternalFileBrowserOption">PreferenceUseInternalFileBrowserOpion</string>\r
<string name="PreferenceFileBrowserBaseDirectory">PreferenceFileBrowserBaseDirectory</string>\r
\r
import net.sf.openrocket.R;\r
import net.sf.openrocket.android.CurrentRocketHolder;\r
+import net.sf.openrocket.android.simservice.SimulationService;\r
+import net.sf.openrocket.android.simservice.SimulationTask;\r
import net.sf.openrocket.document.OpenRocketDocument;\r
import net.sf.openrocket.document.Simulation;\r
import net.sf.openrocket.simulation.SimulationOptions;\r
\r
Button deleteButton = (Button) v.findViewById(R.id.simulationConditionDelete);\r
deleteButton.setOnClickListener( new OnClickListener() {\r
-\r
@Override\r
public void onClick(View v) {\r
onDelete();\r
}\r
- \r
});\r
+ \r
+ Button runButton = (Button) v.findViewById(R.id.simulationConditionRun);\r
+ runButton.setOnClickListener( new OnClickListener() {\r
+ @Override\r
+ public void onClick(View v) {\r
+ onRun();\r
+ }\r
+ });\r
+\r
windspeedField = (EditText) v.findViewById(R.id.simulation_condition_windspeed);\r
rodlengthField = (EditText) v.findViewById(R.id.simulation_condition_rodlength);\r
rodangleField = (EditText) v.findViewById(R.id.simulation_condition_rodangle);\r
if ( options != null ) {\r
windspeedField.setText( UnitGroup.UNITS_VELOCITY.toString( options.getWindSpeedAverage() ));\r
rodlengthField.setText( UnitGroup.UNITS_LENGTH.toString( options.getLaunchRodLength() ));\r
- rodangleField.setText( String.valueOf( options.getLaunchRodLength() ));\r
- roddirectionField.setText( String.valueOf( options.getLaunchRodDirection() ));\r
+ rodangleField.setText( UnitGroup.UNITS_ANGLE.toString( options.getLaunchRodAngle() ));\r
+ roddirectionField.setText( UnitGroup.UNITS_ANGLE.toString( options.getLaunchRodDirection() ));\r
motorSpinner.setSelectedConfiguration(options.getMotorConfigurationID());\r
}\r
\r
getDialog().dismiss();\r
}\r
\r
+ public void onRun() {\r
+ \r
+ OpenRocketDocument rocketDocument = CurrentRocketHolder.getCurrentRocket().getRocketDocument();\r
+ Simulation sim = rocketDocument.getSimulation(simulationId);\r
+ SimulationOptions options = sim.getOptions();\r
+\r
+ options.setWindSpeedAverage( UnitGroup.UNITS_VELOCITY.fromUnit(Double.parseDouble( windspeedField.getText().toString() )));\r
+ options.setLaunchRodLength( UnitGroup.UNITS_LENGTH.fromUnit(Double.parseDouble( rodlengthField.getText().toString() )));\r
+ options.setLaunchRodAngle( UnitGroup.UNITS_ANGLE.fromUnit(Double.parseDouble( rodangleField.getText().toString() )));\r
+ options.setLaunchRodDirection( UnitGroup.UNITS_ANGLE.fromUnit(Double.parseDouble( roddirectionField.getText().toString() )));\r
+ options.setMotorConfigurationID( motorSpinner.getSelectedConfiguration() );\r
+ \r
+ SimulationTask t = new SimulationTask(simulationId);\r
+ SimulationService.executeSimulationTask(getActivity(), t);\r
+ getDialog().dismiss();\r
+ }\r
}
\ No newline at end of file
--- /dev/null
+package net.sf.openrocket.android.simservice;\r
+\r
+import net.sf.openrocket.R;\r
+import net.sf.openrocket.android.CurrentRocketHolder;\r
+import net.sf.openrocket.android.util.AndroidLogWrapper;\r
+import net.sf.openrocket.document.Simulation;\r
+import net.sf.openrocket.simulation.exception.SimulationException;\r
+import android.app.IntentService;\r
+import android.app.Notification;\r
+import android.app.PendingIntent;\r
+import android.content.Context;\r
+import android.content.Intent;\r
+import android.os.IBinder;\r
+import android.widget.Toast;\r
+\r
+public class SimulationService extends IntentService {\r
+\r
+ // We use an id (from a dummy string) as the notificationID because it is unique.\r
+ private final static int notificationID = R.string.SimulationServiceNotificationID;\r
+ \r
+ private Notification notification;\r
+ \r
+ public static void executeSimulationTask( Context c, SimulationTask t ) {\r
+ AndroidLogWrapper.d(SimulationService.class, "Submitting simulation " + t.simulationId );\r
+\r
+ Intent intent = new Intent( c, SimulationService.class );\r
+ intent.putExtra("net.sf.openrocket.simulationtask", t);\r
+ c.startService(intent);\r
+ }\r
+ \r
+ public SimulationService() {\r
+ super("OpenRocket Simulation Execution Service");\r
+ }\r
+\r
+ @Override\r
+ protected void onHandleIntent(Intent intent) {\r
+ SimulationTask t = (SimulationTask) intent.getSerializableExtra("net.sf.openrocket.simulationtask");\r
+ try {\r
+ Simulation sim = CurrentRocketHolder.getCurrentRocket().getRocketDocument().getSimulation(t.simulationId);\r
+ AndroidLogWrapper.d(SimulationService.class, "simulating " + t.simulationId );\r
+ sim.simulate();\r
+ CurrentRocketHolder.getCurrentRocket().notifySimsChanged();\r
+ }\r
+ catch (SimulationException simex) {\r
+ Toast.makeText(this, "Error in simulation:" + simex.getMessage(), Toast.LENGTH_LONG ).show();\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public IBinder onBind(Intent intent) {\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public void onCreate() {\r
+ super.onCreate();\r
+ \r
+ this.notification = buildNotification();\r
+ startForeground(notificationID, notification);\r
+ \r
+ }\r
+\r
+ @Override\r
+ public int onStartCommand(Intent intent, int flags, int startId) {\r
+ super.onStartCommand(intent, flags, startId);\r
+ return START_STICKY;\r
+ }\r
+\r
+ \r
+ @Override\r
+ public void onDestroy() {\r
+ super.onDestroy();\r
+ stopForeground(true);\r
+ }\r
+\r
+ private Notification buildNotification( ) {\r
+ String message = "OpenRocket Simulation Execution";\r
+ Notification notification = new Notification(R.drawable.or_launcher, message, System.currentTimeMillis());\r
+ \r
+ notification.flags = Notification.FLAG_NO_CLEAR;\r
+ PendingIntent contentIntent = PendingIntent.getActivity( this, 0 , new Intent( ), PendingIntent.FLAG_UPDATE_CURRENT );\r
+ notification.setLatestEventInfo(this, "OpenRocket", message, contentIntent);\r
+ return notification;\r
+ }\r
+}\r
--- /dev/null
+package net.sf.openrocket.android.simservice;\r
+\r
+import java.io.Serializable;\r
+\r
+public class SimulationTask implements Serializable {\r
+\r
+ int simulationId;\r
+\r
+ public SimulationTask(int simulationId) {\r
+ this.simulationId = simulationId;\r
+ }\r
+ \r
+}\r