00001 
00002 #include "vrep_ros_plugin/access.h"
00003 #include "v_repLib.h"
00004 
00005 #include <vrep_ros_plugin/GenericObjectContainer.h>
00006 
00007 #include "vrep_ros_plugin/ConsoleHandler.h"
00008 
00009 
00010 GenericObjectContainer::GenericObjectContainer():
00011         _object_handler_loader("vrep_ros_plugin", "GenericObjectHandler"){
00012 
00013     std::vector< std::string > plugins = _object_handler_loader.getDeclaredClasses();
00014 
00015     std::stringstream ss;
00016     ss << "Available ObjectHandlers: " << std::endl;
00017     for (uint i=0; i<plugins.size();++i){
00018         ss << plugins[i] << std::endl;
00019         try{
00020             _allExistingPlugins.insert ( std::pair<std::string, boost::shared_ptr<GenericObjectHandler> >(plugins[i],_object_handler_loader.createInstance(plugins[i])) );
00021         } catch(pluginlib::PluginlibException& ex){
00022           
00023           ROS_ERROR("The plugin %s failed to load for some reason. Error: %s", plugins[i].c_str(), ex.what());
00024         }
00025     }
00026 
00027     ConsoleHandler::printInConsole(ss);
00028 }
00029 
00030 GenericObjectContainer::~GenericObjectContainer(){
00031         removeAll();
00032 }
00033 
00034 void GenericObjectContainer::removeAll(){
00035         _allObjects.clear();
00036         _allExistingPlugins.clear();
00037 }
00038 
00039 void GenericObjectContainer::removeFromID(int theID){
00040         for (int i=0;i<getCount();i++)
00041         {
00042                 if (_allObjects[i]->getID()==theID)
00043                 {
00044                         _allObjects.erase(_allObjects.begin()+i);
00045                         break;
00046                 }
00047         }
00048 }
00049 
00050 int GenericObjectContainer::insert(boost::shared_ptr<GenericObjectHandler> objectHandler){
00051         int newID=0;
00052         while (getFromID(newID)!=NULL)
00053                 newID++;
00054         _allObjects.push_back(objectHandler);
00055         objectHandler->setID(newID);
00056         return(newID);
00057 }
00058 
00059 boost::shared_ptr<GenericObjectHandler> GenericObjectContainer::getFromID(int theID){
00060         for (int i=0;i<getCount();i++)
00061         {
00062                 if (_allObjects[i]->getID()==theID)
00063                         return(_allObjects[i]);
00064         }
00065         return boost::shared_ptr<GenericObjectHandler>();
00066 }
00067 
00068 boost::shared_ptr<GenericObjectHandler> GenericObjectContainer::getFromIndex(int ind){
00069         if ( (ind<0)||(ind>=getCount()) )
00070                 return boost::shared_ptr<GenericObjectHandler>();
00071         return(_allObjects[ind]);
00072 }
00073 
00074 boost::shared_ptr<GenericObjectHandler> GenericObjectContainer::getFromAssociatedObject(int theAssociatedObjectID){
00075         for (int i=0;i<getCount();i++)
00076         {
00077                 if (_allObjects[i]->getAssociatedObject()==theAssociatedObjectID)
00078                         return(_allObjects[i]);
00079         }
00080         return boost::shared_ptr<GenericObjectHandler>();
00081 }
00082 
00083 int GenericObjectContainer::getCount(){
00084         return(int(_allObjects.size()));
00085 }
00086 
00087 void GenericObjectContainer::startOfSimulation(){ 
00088         for (int i=0;i<getCount();i++)
00089                 _allObjects[i]->startOfSimulation();
00090 }
00091 
00092 void GenericObjectContainer::endOfSimulation(){ 
00093         for (int i=0;i<getCount();i++)
00094         {
00095                 if (_allObjects[i]->endOfSimulation())
00096                 { 
00097                         _allObjects.erase(_allObjects.begin()+i);
00098                         i--;
00099                 }
00100         }
00101 }
00102 
00103 void GenericObjectContainer::handleSimulation(){
00104     
00105         for (int i=0;i<getCount();i++)
00106                 _allObjects[i]->handleSimulation();
00107 }
00108 
00109 void GenericObjectContainer::actualizeForSceneContent(){
00110         
00111         int i=0;
00112         while (i<int(_allObjects.size()))
00113         {
00114             boost::shared_ptr<GenericObjectHandler> objectHandler=_allObjects[i];
00115                 int associatedObject=objectHandler->getAssociatedObject();
00116                 int uniqueID;
00117                 if (simGetObjectUniqueIdentifier(associatedObject,&uniqueID)==-1)
00118                 { 
00119                         removeFromID(objectHandler->getID());
00120                         i=-1; 
00121                 }
00122                 else
00123                 { 
00124                         if (uniqueID!=objectHandler->getAssociatedObjectUniqueId())
00125                         { 
00126                                 removeFromID(objectHandler->getID());
00127                                 i=-1; 
00128                         } else  {
00129                             
00130                                 
00131                                 int buffSize=simGetObjectCustomDataLength(associatedObject,CustomDataHeaders::DEVELOPER_DATA_HEADER);
00132                                 char* datBuff=new char[buffSize];
00133                                 simGetObjectCustomData(associatedObject,CustomDataHeaders::DEVELOPER_DATA_HEADER,datBuff);
00134                                 std::vector<unsigned char> developerCustomData(datBuff,datBuff+buffSize);
00135                                 delete[] datBuff;
00136                                 
00137                                 std::vector<unsigned char> tempMainData;
00138                                 if (!CAccess::extractSerializationData(developerCustomData,objectHandler->getObjectType(),tempMainData)) 
00139                                 { 
00140                                         removeFromID(objectHandler->getID());
00141                                         i=-1; 
00142                                 }
00143                         }
00144                 }
00145                 i++;
00146         }
00147 
00148         
00149         
00150         
00151 
00152         int objHandle=0;
00153         int ind=0;
00154         while (objHandle!=-1)
00155         {
00156                 objHandle=simGetObjects(ind++,sim_handle_all);
00157                 if (objHandle!=-1)
00158                 { 
00159                         
00160                         if (getFromAssociatedObject(objHandle)==NULL)
00161                         { 
00162                                 
00163                                 
00164                                 int buffSize=simGetObjectCustomDataLength(objHandle,CustomDataHeaders::DEVELOPER_DATA_HEADER);
00165                                 char* datBuff=new char[buffSize];
00166                                 simGetObjectCustomData(objHandle, CustomDataHeaders::DEVELOPER_DATA_HEADER,datBuff);
00167                                 std::vector<unsigned char> developerCustomData(datBuff,datBuff+buffSize);
00168                                 delete[] datBuff;
00169                                 
00170                                 std::vector<unsigned char> tempMainData;
00171                                 bool objectFound = false;
00172 
00173                                 boost::shared_ptr<GenericObjectHandler> objectHandler;
00174 
00175                                 std::stringstream ss;
00176 
00177                                 for (std::map< std::string, boost::shared_ptr<GenericObjectHandler> >::iterator it = _allExistingPlugins.begin(); it!=_allExistingPlugins.end(); ++it){
00178                                 if ((objectFound = CAccess::extractSerializationData(developerCustomData, it->second->getObjectType(), tempMainData)) == true) {
00179                         
00180                         try {
00181                             objectHandler = _object_handler_loader.createInstance(it->first);
00182                             insert(objectHandler);
00183                             int uniqueID;
00184                             simGetObjectUniqueIdentifier(objHandle,&uniqueID);
00185                             objectHandler->setAssociatedObject(objHandle,uniqueID);
00186                             objectHandler->synchronize();
00187                             ss << "Instantiating new " << it->first << " for "  << simGetObjectName(objHandle) << "." << std::endl;
00188                             ConsoleHandler::printInConsole(ss);
00189                         } catch(pluginlib::PluginlibException& ex){
00190                           
00191                           ROS_ERROR("The plugin %s failed to load for some reason. Error: %s", it->first.c_str(), ex.what());
00192                         }
00193                     }
00194                             }
00195                         }
00196                 }
00197         }               
00198 }
00199 
00200 
00201 
00202 
00203 void GenericObjectContainer::simExtGetAllCustomData(SLuaCallBack* p){
00204     if (p->inputArgCount!=1){
00205         simSetLastError(pluginName,"This function requires 1 input argument.");
00206         return;
00207     }
00208 
00209     if (p->outputArgCount>1){
00210         simSetLastError(pluginName,"This function accepts 1 output argument.");
00211         return;
00212     }
00213 
00214     if(p->inputArgTypeAndSize[0]!=sim_lua_arg_int || p->inputInt[0]<0){
00215         simSetLastError(pluginName,"Wrong input argument type.");
00216         return;
00217     }
00218 
00219     if (p->outputArgCount==1 &&
00220             p->outputArgTypeAndSize[0]!=sim_lua_arg_string){
00221         simSetLastError(pluginName,"Wrong output argument type.");
00222         return;
00223     }
00224 
00225     
00226     const int objectHandle = p->inputInt[0];
00227 
00228 
00229     const uint buffSize=simGetObjectCustomDataLength(objectHandle, CustomDataHeaders::DEVELOPER_DATA_HEADER);
00230 
00231     if (buffSize<0){
00232         simSetLastError(pluginName,"The object does not contain any custom data for this plugin.");
00233         return;
00234     }
00235 
00236     std::vector<unsigned char> developerCustomData(buffSize);
00237     simGetObjectCustomData(objectHandle,CustomDataHeaders::DEVELOPER_DATA_HEADER,(simChar*)developerCustomData.data());
00238 
00239     std::stringstream ss;
00240     ss << "[";
00241     while (developerCustomData.size()>0){
00242         const int* dataHeader = ((int *)developerCustomData.data());
00243         const int* dataLength = ((int *)developerCustomData.data()+1);
00244         const unsigned char * data = developerCustomData.data()+2*sizeof(int);
00245 
00246         ss << std::dec << *dataHeader << ", " << *dataLength << ", ";
00247         if (*dataHeader == CustomDataHeaders::QUADROTOR_DATA_CTRL_MODE){
00248             ss << *((int *)data);
00249         } else if (*dataHeader == CustomDataHeaders::QUADROTOR_DATA_TF_RATIO){
00250             ss << *((float*)data);
00251         } else {
00252             ss << "0x";
00253             for (uint i=0; i<*dataLength; ++i){
00254                 ss << std::hex << std::setw(2) << std::setfill('0') << (int)data[i];
00255             }
00256         }
00257 
00258         developerCustomData.erase(developerCustomData.begin(), developerCustomData.begin()+2*sizeof(int)+*dataLength);
00259         if (developerCustomData.size()>0){
00260             ss << "; ";
00261         } else {
00262             ss << "]";
00263         }
00264     }
00265 
00266     p->outputArgCount=1; 
00267     p->outputArgTypeAndSize=(simInt*)simCreateBuffer(p->outputArgCount*2*sizeof(simInt));
00268     p->outputArgTypeAndSize[2*0+0]=sim_lua_arg_string;   
00269     p->outputArgTypeAndSize[2*0+1]=sim_lua_arg_nil;     
00270     p->outputChar=(simChar*)simCreateBuffer(ss.str().size()+1);
00271     strcpy(p->outputChar,ss.str().c_str());
00272 }
00273 
00274 
00275 void GenericObjectContainer::simExtGetCustomDataFromHeader(SLuaCallBack* p){
00276     if (p->inputArgCount!=2){
00277         simSetLastError(pluginName,"This function requires 2 input arguments.");
00278         return;
00279     }
00280 
00281     if (p->outputArgCount>1){
00282         simSetLastError(pluginName,"This function accepts 1 output argument.");
00283         return;
00284     }
00285 
00286     if(p->inputArgTypeAndSize[0]!=sim_lua_arg_int || p->inputInt[0]<0 ||
00287             p->inputArgTypeAndSize[2]!=sim_lua_arg_int){
00288         simSetLastError(pluginName,"Wrong input argument type.");
00289         return;
00290     }
00291 
00292     if (p->outputArgCount==1 &&
00293             p->outputArgTypeAndSize[0]!=sim_lua_arg_float){
00294         simSetLastError(pluginName,"Wrong output argument type.");
00295         return;
00296     }
00297 
00298     
00299     const int objectHandle = p->inputInt[0];
00300     const int dataHeader = p->inputInt[1];
00301 
00302     const uint buffSize=simGetObjectCustomDataLength(objectHandle, CustomDataHeaders::DEVELOPER_DATA_HEADER);
00303 
00304     if (buffSize<0){
00305         simSetLastError(pluginName,"The object does not contain any custom data for this plugin.");
00306         return;
00307     }
00308 
00309     std::vector<unsigned char> developerCustomData(buffSize);
00310     simGetObjectCustomData(objectHandle,CustomDataHeaders::DEVELOPER_DATA_HEADER,(simChar*)developerCustomData.data());
00311 
00312     std::vector<unsigned char> tempData;
00313 
00314     if(CAccess::extractSerializationData(developerCustomData, dataHeader, tempData)){
00315         p->outputArgCount=1; 
00316         p->outputArgTypeAndSize=(simInt*)simCreateBuffer(p->outputArgCount*2*sizeof(simInt)); 
00317         p->outputArgTypeAndSize[1]=sim_lua_arg_nil;     
00318 
00319         if (dataHeader == CustomDataHeaders::QUADROTOR_DATA_CTRL_MODE){
00320             p->outputArgTypeAndSize[0]=sim_lua_arg_int;   
00321             p->outputInt=(simInt*)simCreateBuffer(1*sizeof(simInt)); 
00322             p->outputInt[0] = (simInt)CAccess::pop_int(tempData);
00323 
00324         } else {
00325             p->outputArgTypeAndSize[0]=sim_lua_arg_float;   
00326             p->outputFloat=(simFloat*)simCreateBuffer(1*sizeof(simFloat)); 
00327             p->outputFloat[0] = (simFloat)CAccess::pop_float(tempData);
00328         }
00329     } else {
00330         p->outputArgCount=0; 
00331         simSetLastError(pluginName,"The data was not found.");
00332     }
00333 }
00334 
00335 
00336 simVoid GenericObjectContainer::simExtSetFloatCustomDataFromHeader(SLuaCallBack* p){
00337 
00338     if (p->inputArgCount!=3){
00339         simSetLastError(pluginName,"This function requires 2 input arguments.");
00340         return;
00341     }
00342 
00343     if (p->outputArgCount>1){
00344         simSetLastError(pluginName,"This function accepts 1 output argument.");
00345         return;
00346     }
00347 
00348     if(p->inputArgTypeAndSize[0]!=sim_lua_arg_int || p->inputInt[0]<0 ||
00349             p->inputArgTypeAndSize[2]!=sim_lua_arg_int ||
00350             p->inputArgTypeAndSize[4]!=sim_lua_arg_float){
00351         simSetLastError(pluginName,"Wrong input argument type.");
00352         return;
00353     }
00354 
00355     if (p->outputArgCount==1 &&
00356             p->outputArgTypeAndSize[0]!=sim_lua_arg_float){
00357         simSetLastError(pluginName,"Wrong output argument type.");
00358         return;
00359     }
00360 
00361     
00362     const int objectHandle = p->inputInt[0];
00363     const int dataHeader = p->inputInt[1];
00364 
00365     const uint buffSize=simGetObjectCustomDataLength(objectHandle, CustomDataHeaders::DEVELOPER_DATA_HEADER);
00366 
00367     if (buffSize<0){
00368         simSetLastError(pluginName,"Error getting custom data from the object.");
00369         return;
00370     }
00371 
00372     std::vector<unsigned char> developerCustomData(buffSize);
00373     simGetObjectCustomData(objectHandle,CustomDataHeaders::DEVELOPER_DATA_HEADER,(simChar*)developerCustomData.data());
00374 
00375     
00376     std::vector<unsigned char> tempData;
00377     CAccess::extractSerializationData(developerCustomData, dataHeader, tempData);
00378 
00379     tempData.clear(); 
00380 
00381     const float dataValue = p->inputFloat[0];
00382     CAccess::push_float(tempData, dataValue); 
00383 
00384     CAccess::insertSerializationData(developerCustomData,dataHeader,tempData);
00385 
00386     
00387     simAddObjectCustomData(objectHandle,CustomDataHeaders::DEVELOPER_DATA_HEADER,
00388             (simChar*)developerCustomData.data(),int(developerCustomData.size()));
00389 
00391 
00392 
00393 
00394 
00395 
00396 
00397 
00398 
00399 
00400 
00401 
00402 
00403 
00404 
00405 
00406 }
00407 
00408 
00409 
00410 simVoid GenericObjectContainer::simExtSetIntCustomDataFromHeader(SLuaCallBack* p){
00411 
00412     if (p->inputArgCount!=3){
00413         simSetLastError(pluginName,"This function requires 2 input arguments.");
00414         return;
00415     }
00416 
00417     if (p->outputArgCount>1){
00418         simSetLastError(pluginName,"This function accepts 1 output argument.");
00419         return;
00420     }
00421 
00422     if(p->inputArgTypeAndSize[0]!=sim_lua_arg_int || p->inputInt[0]<0 ||
00423             p->inputArgTypeAndSize[2]!=sim_lua_arg_int ||
00424             p->inputArgTypeAndSize[4]!=sim_lua_arg_int){
00425         simSetLastError(pluginName,"Wrong input argument type.");
00426         return;
00427     }
00428 
00429     if (p->outputArgCount==1 &&
00430             p->outputArgTypeAndSize[0]!=sim_lua_arg_float){
00431         simSetLastError(pluginName,"Wrong output argument type.");
00432         return;
00433     }
00434 
00435     
00436     const int objectHandle = p->inputInt[0];
00437     const int dataHeader = p->inputInt[1];
00438 
00439     const uint buffSize=simGetObjectCustomDataLength(objectHandle, CustomDataHeaders::DEVELOPER_DATA_HEADER);
00440 
00441     if (buffSize<0){
00442         simSetLastError(pluginName,"Error getting custom data from the object.");
00443         return;
00444     }
00445 
00446     std::vector<unsigned char> developerCustomData(buffSize);
00447     simGetObjectCustomData(objectHandle,CustomDataHeaders::DEVELOPER_DATA_HEADER,(simChar*)developerCustomData.data());
00448 
00449     
00450     std::vector<unsigned char> tempData;
00451     CAccess::extractSerializationData(developerCustomData, dataHeader, tempData);
00452 
00453     tempData.clear(); 
00454 
00455     const int dataValue = p->inputInt[2];
00456     CAccess::push_int(tempData, dataValue); 
00457 
00458     CAccess::insertSerializationData(developerCustomData,dataHeader,tempData);
00459 
00460     
00461     simAddObjectCustomData(objectHandle,CustomDataHeaders::DEVELOPER_DATA_HEADER,
00462             (simChar*)developerCustomData.data(),int(developerCustomData.size()));
00463 
00465 
00466 
00467 
00468 
00469 
00470 
00471 
00472 
00473 
00474 
00475 
00476 
00477 
00478 
00479 
00480 }
00481 
00482 
00483 
00484 
00485