Skip to content
Snippets Groups Projects
Commit 9dc581ad authored by Xavier Gibert's avatar Xavier Gibert
Browse files

Simulator: changed Asynctasks per Handler-Threads

parent 396a5b79
No related branches found
Tags STAVOR_v1.0.6
No related merge requests found
......@@ -183,9 +183,9 @@ public final class SimulatorFragment extends Fragment implements LoaderCallbacks
button_delete.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
if(simulator.getSimulatorStatus().equals(SimulatorStatus.Connected)){
Toast.makeText(getActivity().getApplicationContext(), getString(R.string.sim_stop_simulator_first), Toast.LENGTH_LONG).show();
}else{
//if(simulator.getSimulatorStatus().equals(SimulatorStatus.Connected)){
//Toast.makeText(getActivity().getApplicationContext(), getString(R.string.sim_stop_simulator_first), Toast.LENGTH_LONG).show();
//}else{
if(activeMissionId==-1){
Toast.makeText(getActivity().getApplicationContext(), getString(R.string.sim_local_select_first_a_mission), Toast.LENGTH_LONG).show();
}else if (activeMissionId==0 ||activeMissionId==1 ||activeMissionId==2 || activeMissionId==3 ){
......@@ -193,7 +193,7 @@ public final class SimulatorFragment extends Fragment implements LoaderCallbacks
}else{
showDeleteMissionDialog(activeMissionId, activeMissionName);
}
}
//}
}
});
......@@ -203,11 +203,11 @@ public final class SimulatorFragment extends Fragment implements LoaderCallbacks
button_new.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
if(simulator.getSimulatorStatus().equals(SimulatorStatus.Connected)){
Toast.makeText(getActivity().getApplicationContext(), getString(R.string.sim_stop_simulator_first), Toast.LENGTH_LONG).show();
}else{
//if(simulator.getSimulatorStatus().equals(SimulatorStatus.Connected)){
//Toast.makeText(getActivity().getApplicationContext(), getString(R.string.sim_stop_simulator_first), Toast.LENGTH_LONG).show();
//}else{
((MainActivity)getActivity()).showMissionCreator();
}
//}
}
});
......@@ -217,9 +217,9 @@ public final class SimulatorFragment extends Fragment implements LoaderCallbacks
button_edit.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
if(simulator.getSimulatorStatus().equals(SimulatorStatus.Connected)){
Toast.makeText(getActivity().getApplicationContext(), getString(R.string.sim_stop_simulator_first), Toast.LENGTH_LONG).show();
}else{
//if(simulator.getSimulatorStatus().equals(SimulatorStatus.Connected)){
//Toast.makeText(getActivity().getApplicationContext(), getString(R.string.sim_stop_simulator_first), Toast.LENGTH_LONG).show();
//}else{
if(activeMissionId==-1){
Toast.makeText(getActivity().getApplicationContext(), getString(R.string.sim_local_select_first_a_mission), Toast.LENGTH_LONG).show();
}else if (activeMissionId==0 ||activeMissionId==1 ||activeMissionId==2 ||activeMissionId==3){
......@@ -232,7 +232,7 @@ public final class SimulatorFragment extends Fragment implements LoaderCallbacks
Toast.makeText(getActivity().getApplicationContext(), getString(R.string.sim_local_cannot_deserialize_selected_mission), Toast.LENGTH_LONG).show();
}
}
}
//}
}
});
......
......@@ -13,6 +13,7 @@ import android.app.ProgressDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.ConditionVariable;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.Button;
......@@ -34,9 +35,9 @@ public class Simulator {
//Simulation core
private SimulatorStatus simulatorStatus = SimulatorStatus.Disconnected;
private SimulationStatus simulationStatus = SimulationStatus.Pause;
private SocketsThread thread;
@SuppressWarnings("unused")
private SimulatorThread sthread;
private ThreadRemote thread_remote;
private ThreadLocal thread_local;
private Handler handler_remote, handler_local;
//Results
private ModelSimulation simulation;
......@@ -189,6 +190,8 @@ public class Simulator {
context = activity.getApplicationContext();
sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
simulation = new ModelSimulation(act);
handler_remote = new Handler();
handler_local = new Handler();
}
public void reconstruct(MainActivity act){
activity = act;
......@@ -321,7 +324,8 @@ public class Simulator {
setProgress(40 * 100);
simulation.preInitialize();
setProgress(50 * 100);
thread = (SocketsThread) new SocketsThread(this,host,port).execute(simulation);
thread_remote = new ThreadRemote(handler_remote,this,host,port);
thread_remote.start();
}catch(NumberFormatException nfe){
setSimulatorStatus(SimulatorStatus.Disconnected);
}
......@@ -332,8 +336,8 @@ public class Simulator {
setProgress(40 * 100);
simulation.preInitialize();
setProgress(50 * 100);
sthread = (SimulatorThread) new SimulatorThread(((MainActivity)activity).getSimulator(), mission).execute(simulation);
thread_local = new ThreadLocal(handler_local, ((MainActivity)activity).getSimulator(), mission);
thread_local.start();
}
}
......@@ -344,7 +348,7 @@ public class Simulator {
boolean remote = sharedPref.getBoolean(context.getString(R.string.pref_key_sim_global_remote), false);
if(remote){
// Remote
thread.closeSocket();
thread_remote.closeSocket();
}else{
// Local
......
package cs.si.stavor.simulator;
import org.orekit.attitudes.AttitudeProvider;
import org.orekit.attitudes.NadirPointing;
import org.orekit.bodies.BodyShape;
import org.orekit.bodies.CelestialBodyFactory;
import org.orekit.bodies.OneAxisEllipsoid;
import org.orekit.errors.OrekitException;
import org.orekit.errors.PropagationException;
import org.orekit.frames.Frame;
import org.orekit.frames.FramesFactory;
import org.orekit.orbits.KeplerianOrbit;
import org.orekit.orbits.Orbit;
import org.orekit.orbits.PositionAngle;
import org.orekit.propagation.Propagator;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.analytical.KeplerianPropagator;
import org.orekit.time.AbsoluteDate;
import cs.si.stavor.R;
import cs.si.stavor.app.Parameters;
import cs.si.stavor.mission.Mission;
import android.os.Handler;
public class ThreadLocal extends Thread{
private final Handler mHandler;
private Simulator simulator;
private Mission mission;
ThreadLocal(Handler handler, Simulator simu, Mission mis) {
mHandler = handler;
simulator = simu;
mission = mis;
}
@Override public void run() {
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
if(simulator.getSimulatorStatus().equals(SimulatorStatus.Disconnected)){
//initialize simulation
try {
simulator.setProgress(60 * 100);
setSimulationParameters();
simulator.setProgress(80 * 100);
setConnected();
simulator.goToHud();
simulator.showMessage(simulator.getContext().getString(R.string.sim_local_simulator_connected));
} catch (OrekitException e) {
e.printStackTrace();
simulator.showMessage(simulator.getContext().getString(R.string.sim_orekit_init_error)+": "+e.getMessage());
setDisconnected();
}
}
if(simulator.getSimulatorStatus().equals(SimulatorStatus.Connected)){
try {
while (true){//Infinite simulation loop
if(simulator.reset){
simulator.reset=false;
setSimulationParameters();
simulator.pause();
}
simulator.playCondition.block();
if(simulator.cancel){
simulator.cancel=false;
break;
}
//Fix simulation speed to desired FPS
long dur = (System.nanoTime()-time_tmp_data);
if(dur<(Parameters.Simulator.min_hud_model_refreshing_interval_ns-Parameters.Simulator.model_refreshing_interval_safe_guard_ns)){
try {
long sleep_dur = (Parameters.Simulator.min_hud_model_refreshing_interval_ns-dur)/1000000;
if(sleep_dur>0){
Thread.sleep(sleep_dur);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
try {
Thread.sleep(Parameters.Simulator.model_refreshing_interval_safe_guard_ns/1000000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
time_tmp_data = System.nanoTime();
SpacecraftState sstate = propagate();
int progress = (int)(((mission.sim_duration+extrapDate.durationFrom(finalDate))/mission.sim_duration)*100);
if(sstate!=null){
simulator.getSimulationResults().updateSimulation(sstate, progress);
publishProgress();
}else{
simulator.stop();
simulator.showMessage(simulator.getContext().getString(R.string.sim_mission_ended));
}
if(simulator.cancel){
simulator.cancel=false;
break;
}
Thread.yield();
}
} catch (OrekitException e) {
e.printStackTrace();
simulator.showMessage(simulator.getContext().getString(R.string.sim_orekit_prop_error)+": "+e.getMessage());
}
}
setDisconnected();
}
private long time_tmp_data = 0;
private long time_tmp_gui = 0;
private void publishProgress(){
mHandler.post(new Runnable() {
@Override
public void run() {
//Update model by push
simulator.getSimulationResults().pushSimulationModel();
//Update GUI HUD
if(time_tmp_gui==0 || (System.nanoTime()-time_tmp_gui)>Parameters.Simulator.min_hud_panel_refreshing_interval_ns){
time_tmp_gui = System.nanoTime();
simulator.getSimulationResults().updateHUD();
}
}
});
}
private void setConnected(){
//Log.d("Sim",System.currentTimeMillis()+": "+"Simulator connected");
simulator.setSimulatorStatus(SimulatorStatus.Connected);
}
public void setDisconnected(){
//Log.d("Sim",System.currentTimeMillis()+": "+"Simulator disconnected");
simulator.setSimulatorStatus(SimulatorStatus.Disconnected);
simulator.resetSelectedMissionId();
}
private Frame inertialFrame;
//private Frame rotatingFrame;
private Propagator propagator;
private AbsoluteDate extrapDate, finalDate;
/**
* Initialize simulation
* @throws OrekitException
*/
private void setSimulationParameters() throws OrekitException{
switch(mission.inertialFrame){
case GCRF:
inertialFrame = FramesFactory.getGCRF();
break;
case EME2000:
inertialFrame = FramesFactory.getEME2000();
break;
case MOD:
inertialFrame = FramesFactory.getMOD(true);
break;
case TOD:
inertialFrame = FramesFactory.getTOD(true);
break;
case TEME:
inertialFrame = FramesFactory.getTEME();
break;
case Veis1959:
inertialFrame = FramesFactory.getVeis1950();
break;
default:
inertialFrame = FramesFactory.getEME2000();
break;
}
/*switch(mission.rotatingFrame){
case ITRF:
rotatingFrame = FramesFactory.getITRF(IERSConventions.IERS_2010, true);
break;
case GTOD:
rotatingFrame = FramesFactory.getGTOD(true);
break;
default:
rotatingFrame = FramesFactory.getITRF(IERSConventions.IERS_2010, true);
break;
}*/
Orbit initialOrbit = new KeplerianOrbit(mission.initial_orbit.a, mission.initial_orbit.e, mission.initial_orbit.i, mission.initial_orbit.omega, mission.initial_orbit.raan, mission.initial_orbit.lM, PositionAngle.MEAN, inertialFrame, mission.initial_date, mission.initial_orbit.mu);
BodyShape earth = new OneAxisEllipsoid(org.orekit.utils.Constants.WGS84_EARTH_EQUATORIAL_RADIUS,org.orekit.utils.Constants.WGS84_EARTH_FLATTENING,CelestialBodyFactory.getEarth().getBodyOrientedFrame());
AttitudeProvider attitudeProvider = new NadirPointing(earth);
SpacecraftState old_st;
switch(mission.propagatorType){
case Keplerian://FIXME:PROPAGATOR implement other propagators and put a flag to use each one
//kepler = new KeplerianPropagator(initialOrbit,null,mission.initial_orbit.mu,mission.initial_mass);
propagator = new KeplerianPropagator(initialOrbit,attitudeProvider,mission.initial_orbit.mu, mission.initial_mass);
propagator.setSlaveMode();
old_st = propagator.getInitialState();
propagator.resetInitialState(new SpacecraftState(old_st.getOrbit(), old_st.getAttitude() , mission.initial_mass));
break;
default:
//kepler = new KeplerianPropagator(initialOrbit,"DEFAULT_LAW",mission.initial_orbit.mu,mission.initial_mass);
propagator = new KeplerianPropagator(initialOrbit,attitudeProvider,mission.initial_orbit.mu, mission.initial_mass);
propagator.setSlaveMode();
old_st = propagator.getInitialState();
propagator.resetInitialState(new SpacecraftState(old_st.getOrbit(), old_st.getAttitude() , mission.initial_mass));
}
//Apply EventDetectors for maneuvers
/*for(Entry<String, ManeuverImpulse> ma : simulation.mission.maneuvers.entrySet()){
ManeuverImpulse mi = (ManeuverImpulse) ma.getValue();
propagator.addEventDetector(mi.getOrekitManeuver());
}*/
extrapDate = mission.initial_date;
finalDate = new AbsoluteDate(mission.initial_date, mission.sim_duration);
//step=simulation.mission.sim_step;
}
/**
* Propagate simulation
* @return
* @throws PropagationException
*/
private SpacecraftState propagate() throws PropagationException{
if(extrapDate.compareTo(finalDate) <= 0){
SpacecraftState currentState = propagator.propagate(extrapDate);
extrapDate = new AbsoluteDate(extrapDate, mission.sim_step);
return currentState;
}else{
return null;
}
}
}
package cs.si.stavor.simulator;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import org.orekit.propagation.SpacecraftState;
import cs.si.stavor.R;
import cs.si.stavor.app.Parameters;
import android.os.Handler;
public class ThreadRemote extends Thread{
private final Handler mHandler;
private String dstAddress;
private int dstPort;
private Socket socket = null;
private Simulator simulator;
private ObjectInputStream inputOStream;
private InputStream inputStream;
ThreadRemote(Handler handler, Simulator simu, String addr, int port) {
mHandler = handler;
simulator = simu;
dstAddress = addr;
dstPort = port;
}
public void closeSocket(){
if(socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override public void run() {
if(simulator.getSimulatorStatus().equals(SimulatorStatus.Disconnected)){
//Connect remote simulator
try {
simulator.setProgress(60 * 100);
socket = new Socket();
socket.connect(new InetSocketAddress(dstAddress, dstPort), Parameters.Simulator.Remote.remote_connection_timeout_ms);
inputStream = socket.getInputStream();
inputOStream = new ObjectInputStream( inputStream );
simulator.setProgress(80 * 100);
setConnected();
simulator.goToHud();
simulator.showMessage(simulator.getContext().getString(R.string.sim_remote_simulator_connected));
} catch (UnknownHostException e) {
e.printStackTrace();
simulator.showMessage(simulator.getContext().getString(R.string.sim_unknown_host));
setDisconnected();
} catch (IOException e) {
e.printStackTrace();
simulator.showMessage(simulator.getContext().getString(R.string.sim_io_error)+": "+e.getMessage());
setDisconnected();
}
}
if(simulator.getSimulatorStatus().equals(SimulatorStatus.Connected)){
try {
while (true){//Infinite simulation loop
SpacecraftState sstate = (SpacecraftState) inputOStream.readObject();
if(sstate!=null){
simulator.getSimulationResults().updateSimulation(sstate, 0);
publishProgress();
}
/*if(simulator.cancel){
simulator.cancel=false;
break;
}*/
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
simulator.showMessage(simulator.getContext().getString(R.string.sim_error)+": "+e.getMessage());
} catch (IOException e) {
e.printStackTrace();
simulator.showMessage(simulator.getContext().getString(R.string.sim_remote_disconnected)+": "+e.getMessage());
} catch (ClassNotFoundException e) {
e.printStackTrace();
simulator.showMessage(simulator.getContext().getString(R.string.sim_error)+": "+e.getMessage());
}
}
setDisconnected();
}
private long time_tmp_data = 0;
private long time_tmp_gui = 0;
private void publishProgress(){
mHandler.post(new Runnable() {
@Override
public void run() {
if(time_tmp_gui==0 || (System.nanoTime()-time_tmp_gui)>Parameters.Simulator.min_hud_panel_refreshing_interval_ns){
time_tmp_gui = System.nanoTime();
simulator.getSimulationResults().updateHUD();
}
if(time_tmp_data==0 || (System.nanoTime()-time_tmp_data)>Parameters.Simulator.min_hud_model_refreshing_interval_ns){
time_tmp_data = System.nanoTime();
simulator.getSimulationResults().pushSimulationModel();
}
}
});
}
private void setConnected(){
//Log.d("Sim",System.currentTimeMillis()+": "+"Simulator connected");
simulator.setSimulatorStatus(SimulatorStatus.Connected);
}
public void setDisconnected(){
//Log.d("Sim",System.currentTimeMillis()+": "+"Simulator disconnected");
closeSocket();
simulator.setSimulatorStatus(SimulatorStatus.Disconnected);
simulator.resetSelectedMissionId();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment