// This is the plugin start routine: VREP_DLLEXPORT unsigned char v_repStart(void* reservedPointer,int reservedInt) { // This is called just once, at the start of V-REP // Dynamically load and bind V-REP functions: char curDirAndFile[1024]; #ifdef _WIN32 #ifdef QT_COMPIL _getcwd(curDirAndFile, sizeof(curDirAndFile)); #else GetModuleFileName(NULL,curDirAndFile,1023); PathRemoveFileSpec(curDirAndFile); #endif #elif defined (__linux) || defined (__APPLE__) getcwd(curDirAndFile, sizeof(curDirAndFile)); #endif std::string currentDirAndPath(curDirAndFile); std::string temp(currentDirAndPath); #ifdef _WIN32 temp+="\\v_rep.dll"; #elif defined (__linux) temp+="/libv_rep.so"; #elif defined (__APPLE__) temp+="/libv_rep.dylib"; #endif /* __linux || __APPLE__ */ vrepLib=loadVrepLibrary(temp.c_str()); if (vrepLib==NULL) { std::cout << "Error, could not find or correctly load the V-REP library. Cannot start 'RemoteApi' plugin.\n"; return(0); // Means error, V-REP will unload this plugin } if (getVrepProcAddresses(vrepLib)==0) { std::cout << "Error, could not find all required functions in the V-REP library. Cannot start 'RemoteApi' plugin.\n"; unloadVrepLibrary(vrepLib); return(0); // Means error, V-REP will unload this plugin } int vrepVer; simGetIntegerParameter(sim_intparam_program_version,&vrepVer); if (vrepVer<20604) // if V-REP version is smaller than 2.06.04 { std::cout << "Sorry, your V-REP copy is somewhat old. Cannot start 'RemoteApi' plugin.\n"; unloadVrepLibrary(vrepLib); return(0); // Means error, V-REP will unload this plugin } // Register 3 new Lua commands: int inArgs1[]={1,sim_lua_arg_int}; simRegisterCustomLuaFunction(LUA_STATUS_COMMAND,strConCat("number status,table_5 info=",LUA_STATUS_COMMAND,"(number socketPort)"),inArgs1,LUA_STATUS_COMMAND_CALLBACK); int inArgs2[]={4,sim_lua_arg_int,sim_lua_arg_int,sim_lua_arg_bool,sim_lua_arg_bool}; // 3/3/2014 simRegisterCustomLuaFunction(LUA_START_COMMAND,strConCat("number result=",LUA_START_COMMAND,"(number socketPort,number maxPacketSize=1300,boolean debug=false,boolean preEnableTrigger=false)"),inArgs2,LUA_START_COMMAND_CALLBACK); // 3/3/2014 simRegisterCustomLuaFunction(LUA_STOP_COMMAND,strConCat("number result=",LUA_STOP_COMMAND,"(number socketPort)"),inArgs1,LUA_STOP_COMMAND_CALLBACK); simRegisterCustomLuaFunction(LUA_RESET_COMMAND,strConCat("number result=",LUA_RESET_COMMAND,"(number socketPort)"),inArgs1,LUA_RESET_COMMAND_CALLBACK); // Read the configuration file to prepare socket connections: CConfReader conf; temp=currentDirAndPath; #ifdef _WIN32 temp+="\\remoteApiConnections.txt"; #endif /* _WIN32 */ #if defined (__linux) || defined (__APPLE__) temp+="/remoteApiConnections.txt"; #endif /* __linux || __APPLE__ */ conf.readConfiguration(temp.c_str()); conf.getBoolean("useAlternateSocketRoutines",CSimxSocket::useAlternateSocketRoutines); int index=1; while (true) { std::stringstream strStream; strStream << index; std::string variableNameBase("portIndex"); variableNameBase+=strStream.str(); std::string variableName=variableNameBase+"_port"; int portNb; if (conf.getInteger(variableName.c_str(),portNb)) { bool debug=false; int maxPacketSize=1300; if (portNb<0) maxPacketSize=3200000; bool synchronousTrigger=false; variableName=variableNameBase+"_maxPacketSize"; conf.getInteger(variableName.c_str(),maxPacketSize); variableName=variableNameBase+"_debug"; conf.getBoolean(variableName.c_str(),debug); variableName=variableNameBase+"_syncSimTrigger"; conf.getBoolean(variableName.c_str(),synchronousTrigger); if (portNb<0) { // when using shared memory if (maxPacketSize<1000) maxPacketSize=1000; if (maxPacketSize>32000000) maxPacketSize=32000000; } else { // when using sockets if (maxPacketSize<200) maxPacketSize=200; if (maxPacketSize>30000) maxPacketSize=30000; } if (allConnections.getConnectionFromPort(portNb)==NULL) { // 3/3/2014 synchronousTrigger&=(allConnections.getSynchronousSimulationTriggerConnection()==NULL); CSimxSocket* oneSocketConnection=new CSimxSocket(portNb,false,debug,maxPacketSize,synchronousTrigger); oneSocketConnection->start(); allConnections.addSocketConnection(oneSocketConnection); // 3/3/2014 if (synchronousTrigger) // 3/3/2014 allConnections.setSynchronousSimulationTriggerConnection(oneSocketConnection); // only one connection can act as trigger! std::cout << "Starting a remote API server on port " << portNb << std::endl; } else std::cout << "Failed starting a remote API server on port " << portNb << std::endl; index++; } else break; } return(SIMX_VERSION); // initialization went fine, we return the version number of this extension module (can be queried with simGetModuleName) }
// This is the plugin start routine: VREP_DLLEXPORT unsigned char v_repStart(void* reservedPointer,int reservedInt) { // This is called just once, at the start of V-REP // Dynamically load and bind V-REP functions: char curDirAndFile[1024]; #ifdef _WIN32 #ifdef QT_COMPIL _getcwd(curDirAndFile, sizeof(curDirAndFile)); #else GetModuleFileName(NULL,curDirAndFile,1023); PathRemoveFileSpec(curDirAndFile); #endif #elif defined (__linux) || defined (__APPLE__) getcwd(curDirAndFile, sizeof(curDirAndFile)); #endif std::string currentDirAndPath(curDirAndFile); std::string temp(currentDirAndPath); #ifdef _WIN32 temp+="\\v_rep.dll"; #elif defined (__linux) temp+="/libv_rep.so"; #elif defined (__APPLE__) temp+="/libv_rep.dylib"; #endif /* __linux || __APPLE__ */ vrepLib=loadVrepLibrary(temp.c_str()); if (vrepLib==NULL) { std::cout << "Error, could not find or correctly load the V-REP library. Cannot start 'RemoteApi' plugin.\n"; return(0); // Means error, V-REP will unload this plugin } if (getVrepProcAddresses(vrepLib)==0) { std::cout << "Error, could not find all required functions in the V-REP library. Cannot start 'RemoteApi' plugin.\n"; unloadVrepLibrary(vrepLib); return(0); // Means error, V-REP will unload this plugin } int vrepVer; simGetIntegerParameter(sim_intparam_program_version,&vrepVer); if (vrepVer<30200) // if V-REP version is smaller than 3.02.00 { std::cout << "Sorry, your V-REP copy is somewhat old. Cannot start 'RemoteApi' plugin.\n"; unloadVrepLibrary(vrepLib); return(0); // Means error, V-REP will unload this plugin } std::vector<int> inArgs; // Register the new Lua commands: CLuaFunctionData::getInputDataForFunctionRegistration(inArgs_START,inArgs); simRegisterCustomLuaFunction(LUA_START_COMMAND,strConCat("number result=",LUA_START_COMMAND,"(number socketPort,number maxPacketSize=1300,boolean debug=false,boolean preEnableTrigger=false)"),&inArgs[0],LUA_START_CALLBACK); CLuaFunctionData::getInputDataForFunctionRegistration(inArgs_STOP,inArgs); simRegisterCustomLuaFunction(LUA_STOP_COMMAND,strConCat("number result=",LUA_STOP_COMMAND,"(number socketPort)"),&inArgs[0],LUA_STOP_CALLBACK); CLuaFunctionData::getInputDataForFunctionRegistration(inArgs_RESET,inArgs); simRegisterCustomLuaFunction(LUA_RESET_COMMAND,strConCat("number result=",LUA_RESET_COMMAND,"(number socketPort)"),&inArgs[0],LUA_RESET_CALLBACK); CLuaFunctionData::getInputDataForFunctionRegistration(inArgs_STATUS,inArgs); simRegisterCustomLuaFunction(LUA_STATUS_COMMAND,strConCat("number status,table_5 info,number version,number clientVersion,string connectedIp=",LUA_STATUS_COMMAND,"(number socketPort)"),&inArgs[0],LUA_STATUS_CALLBACK); // Read the configuration file to prepare socket connections: CConfReader conf; temp=currentDirAndPath; #ifdef _WIN32 temp+="\\remoteApiConnections.txt"; #endif /* _WIN32 */ #if defined (__linux) || defined (__APPLE__) temp+="/remoteApiConnections.txt"; #endif /* __linux || __APPLE__ */ // Read the configuration file and start remote API server services accordingly: conf.readConfiguration(temp.c_str()); conf.getBoolean("useAlternateSocketRoutines",CSimxSocket::useAlternateSocketRoutines); int index=1; while (true) { std::stringstream strStream; strStream << index; std::string variableNameBase("portIndex"); variableNameBase+=strStream.str(); std::string variableName=variableNameBase+"_port"; int portNb; if (conf.getInteger(variableName.c_str(),portNb)) { bool debug=false; int maxPacketSize=1300; if (portNb<0) maxPacketSize=3200000; bool synchronousTrigger=false; variableName=variableNameBase+"_maxPacketSize"; conf.getInteger(variableName.c_str(),maxPacketSize); variableName=variableNameBase+"_debug"; conf.getBoolean(variableName.c_str(),debug); variableName=variableNameBase+"_syncSimTrigger"; conf.getBoolean(variableName.c_str(),synchronousTrigger); if (portNb<0) { // when using shared memory if (maxPacketSize<1000) maxPacketSize=1000; if (maxPacketSize>32000000) maxPacketSize=32000000; } else { // when using sockets if (maxPacketSize<200) maxPacketSize=200; if (maxPacketSize>30000) maxPacketSize=30000; } if (allConnections.getConnectionFromPort(portNb)==NULL) { CSimxSocket* oneSocketConnection=new CSimxSocket(portNb,true,false,debug,maxPacketSize,synchronousTrigger); oneSocketConnection->start(); allConnections.addSocketConnection(oneSocketConnection); std::cout << "Starting a remote API server on port " << portNb << std::endl; } else std::cout << "Failed starting a remote API server on port " << portNb << std::endl; index++; } else break; } // Check if we need to start additional remote API server services: for (int iarg=0;iarg<9;iarg++) { char* str=simGetStringParameter(sim_stringparam_app_arg1+iarg); if (str!=NULL) { std::string arg(str); simReleaseBuffer(str); if ( (arg.compare(0,23,"REMOTEAPISERVERSERVICE_")==0)&&(arg.length()>23) ) { size_t pos1=arg.find('_',24); size_t pos2=std::string::npos; size_t pos3=std::string::npos; if (pos1!=std::string::npos) pos2=arg.find('_',pos1+1); if (pos2!=std::string::npos) pos3=arg.find('_',pos2+1); int portNb=-1; bool debug=false; bool syncTrigger=true; int maxPacketSize=1300; std::string portStr; if (pos1!=std::string::npos) { portStr=arg.substr(23,pos1-23); if (pos2!=std::string::npos) { debug=(arg.compare(pos1+1,pos2-pos1-1,"TRUE")==0); if (pos3!=std::string::npos) syncTrigger=(arg.compare(pos2+1,pos3-pos2-1,"TRUE")==0); else syncTrigger=(arg.compare(pos2+1,std::string::npos,"TRUE")==0); } else debug=(arg.compare(pos1+1,std::string::npos,"TRUE")==0); } else portStr=arg.substr(23,std::string::npos); if (portStr.length()!=0) { portNb=atoi(portStr.c_str()); if (allConnections.getConnectionFromPort(portNb)==NULL) { CSimxSocket* oneSocketConnection=new CSimxSocket(portNb,true,false,debug,maxPacketSize,syncTrigger); oneSocketConnection->start(); allConnections.addSocketConnection(oneSocketConnection); std::cout << "Starting a remote API server on port " << portNb << std::endl; } else std::cout << "Failed starting a remote API server on port " << portNb << std::endl; } } } } return(SIMX_VERSION); // initialization went fine, we return the version number of this extension module (can be queried with simGetModuleName) }