Page 1 of 1

How to check if sim is paused/running/stopped (remote API)

Posted: 14 Oct 2014, 15:52
by nettercm
My remote API client is running in synchronous mode. I like the fact that I can continue to use the V-REP UI to switch to different views etc. I also want to be able to pause the simulation at various points in time so that I can take time to inspect graphs etc.

When the simulation is paused or stopped, I don't really want my remote API client to continue running through the actual control logic. Instead, I just want it to wait until the user resumes or restarts the simulation.

What's the best way for my remote API client to become aware of the fact that the user has paused (or stopped) the simulation? When I pause or stop the simulation, I noticed that calls to simxSynchronousTrigger() fail. I also noticed that when the simulation is paused, simxGetLastCmdTime() is frozen at the previous value and when the simulation is stopped, simxGetLastCmdTime() goes to 0.

I suppose I can use the results from simxGetLastCmdTime() and simxSynchronousTrigger(), but if there is a recommended way, let me know.

Thanks.

Re: How to check if sim is paused/running/stopped (remote AP

Posted: 14 Oct 2014, 17:57
by Eric
hi

have a look at simxGetInMessageInfo function, especially the simx_headeroffset_server_state

Cheers

Eric

Re: How to check if sim is paused/running/stopped (remote AP

Posted: 29 Oct 2014, 23:36
by mfloyd
I'm trying to do the same and when I was using simxGetInMessageInfo, when going from paused to stopped, it always went to "play" for a few times while v-rep did some cleanup. The interval while "getting ready to stop" is happening can be significant when there is a lot of cleanup happening (I think this especially happens with the Playback tool). In lua scripts there is a way to check whether the simulation is getting ready to stop, but I don't seem to have this information available from the external c++ api.

I also found that the simxGetInMessageInfo seemed to not update when called frequently in a loop. In the following code, it would never leave the pause loop:

Code: Select all

	while (simxGetConnectionId(clientID) != -1)
	{
		int ret = 0;
		int message = -1; 
		ret = simxGetInMessageInfo(clientID, simx_headeroffset_server_state, &message);
		while ((message & 2) == 2)//if it has been paused
		{
			message = -1;
			ret = simxGetInMessageInfo(clientID, simx_headeroffset_server_state, &message);
			cout << "paused" << endl;
		}
		if ((message & 1) == 0)
		{
			cout << "stopped" << endl;
			break;
		}
		cout << "running" << endl;
		...
	}
but would work if some other simx command was called between calls: e.g simxGetObjectPosition or simxGetIntegerParameter:

Code: Select all

	while (simxGetConnectionId(clientID) != -1)
	{
		int ret = 0;
		int message = -1; 
		ret = simxGetInMessageInfo(clientID, simx_headeroffset_server_state, &message);
		while ((message & 2) == 2)//if it has been paused
		{
			message = -1;
			ret = simxGetInMessageInfo(clientID, simx_headeroffset_server_state, &message);
			int paramIdentifier = sim_intparam_event_flags_read_clear;
			int paramValue = 0;
			ret = simxGetIntegerParameter(clientID, paramIdentifier, &paramValue, simx_opmode_oneshot_wait);
			cout << "paused" << endl;
		}
		if ((message & 1) == 0)
		{
			cout << "stopped" << endl;
			break;
		}
		cout << "running" << endl;
		...
	}
using simxGetIntegerParameter can get the run/stop state with frequent calls in a loop instead of simxGetInMessageInfo, but doesn't have pause info.

Is there a way to get the "getting ready to stop" info from the external api?
Why won't the simxGetInMessageInfo call update alone inside the loop without some other api function call?

Re: How to check if sim is paused/running/stopped (remote AP

Posted: 30 Oct 2014, 11:03
by coppelia
Hello,

yes, that is correct: the simxGetInMessageInfo will only retrieve the values of last received reply from the server. If the server didn't send any reply, then the values read with simxGetInMessageInfo will not be up-to-date. But the documentation is not clear about this, this will be corrected.

What you should do is start at least one streaming command, so that at least one reply will be received on a regular basis.
Maybe:

Code: Select all

int dummyValue;
simxGetIntegerParameter(clientID,sim_intparam_program_version,&dummyValue,simx_opmode_streaming);
Then, when going from pause to stop, simulation will shortly be running again (i.e. the simulation state won't go directly from paused to stopped), you can see this here.

Finally, if you want to intercept an aboutToStop message from the server, you could write a small non-threaded child script that would be in charge of that:

Code: Select all

if (sim_call_type==sim_childscriptcall_sensing) then
	simSetIntegerSignal('simulationState',simGetSimulationState())
end
Then on the client side you could simply continuously stream that value and check the state.

By the way, if there is no threaded child script in the scene, the simulation state will go from paused, to running, to stopped, with only one running step. If you have threaded child scripts running, then the simulator will first wait to let the threads react by themselves to a stop command. If the threaded child scripts do not have that checking mechanism, V-REP will force the stop after 1-2 seconds.

Cheers