/home/fwph/code/wurde/rde/core/capabilities/BlobFinder.cpp

Go to the documentation of this file.
00001 
00029 #include <BlobFinder.H>
00030 #include <CommsManager.H>
00031 #include <Logger.H>
00032 
00033 // $Id: Type.cpp 68 2007-02-01 17:56:57Z fwph $
00034 
00035 using namespace WURDE;
00036 
00037 BlobFinder::BlobFinder(const std::string & streamname){
00038        init(streamname,STRAT_NORMAL,"Any");
00039 
00040        //global name will be set later
00041        m_haveGlobalname=false;
00042 }
00043 
00044 BlobFinder::BlobFinder(const ConnectionStrategy & strategy,const std::string & gblName){
00045        init("Any",strategy,gblName);
00046 
00047        if(strategy==STRAT_NORMAL){
00048               //then the global name really specifies the streamname,
00049               // and the global name should be assigned automagically once we have
00050               // confirmation that the stream has been started
00051               m_haveGlobalname=false;   
00052        }
00053 
00054        m_haveStream=false;
00055        
00056 }
00057 
00058 BlobFinder::BlobFinder(const std::string &streamname,const std::string &gblName){
00059        init(streamname,STRAT_NORMAL,gblName);
00060 }
00061 
00062 void BlobFinder::init(const std::string &streamname,const ConnectionStrategy &strategy,const std::string &gblName){
00063   m_globalname=gblName;
00064   m_streamname=streamname;
00065 
00066   myCOMObject=NULL;
00067   
00068   //  data.source=streamname.c_str();
00069   requests=info;
00070 
00071   m_queue=false;
00072   m_supplier=false;
00073   m_doTimestamp=true;
00074   m_doTag=true;
00075 
00076   m_doPublishData=false;
00077   m_doPublishInfo=false;
00078 
00079   m_initialize=false;
00080   m_strategy=strategy;
00081 
00082   m_haveStream=true;
00083   m_haveGlobalname=true;
00084   m_doPublishData=false;
00085   m_doPublishInfo=false;
00086 
00087   m_doAutoPing=true;
00088 
00089   info.source=streamname;
00090   requests.source=m_globalname;
00091   info.target="Any";
00092   requests.target=streamname;
00093   info.timestamp.now();
00094   requests.timestamp.now();
00095 
00096   m_streamRequest=STAT_NULL;
00097   
00098   m_sourceModule="Unknown";
00099 }
00100 
00101 
00102 BlobFinder::~BlobFinder(){
00103   myManager=NULL;
00104   if(myCOMObject){
00105 
00106          //      delete myCOMObject;
00107   }
00108 }
00109 
00110 
00111 void BlobFinder::activateSupplier(){
00112        if(m_haveStream){
00113               m_supplier=true;
00114               m_globalname=m_streamname;
00115               m_haveGlobalname=true;
00116               m_initialize=false;
00117               if(myCOMObject){
00118                       //                     myCOMObject=new CMUIPCRobotProtocol::CMUIPCBlobFinder(m_globalname);
00119                      myCOMObject->setGlobalName(m_globalname);
00120                      myCOMObject->setStreamName(m_streamname);
00121                      myCOMObject->setInfo(&requests);
00122                      myCOMObject->setRequests(&info);
00123                      myCOMObject->setStaging(&data);
00124                      myCOMObject->activateSupplier();
00125                      myCOMObject->setAutoPing(m_doAutoPing);
00126                      myCOMObject->setInfoVector(&m_requestVector);
00127                      myCOMObject->setRequestVector(&m_infoVector);
00128                      myCOMObject->setDataVector(&m_dataVector);
00129 
00130                      data.source=m_streamname;
00131                      info.source=m_streamname;
00132 
00133                      if(m_queue){
00134                             myCOMObject->setQueueMode(true);
00135                      }
00136 
00137               }else{
00138                       g_fatal("Attempted to activateSupplier before setting a COMObject Please just use registerSupplier.");
00139                       exit(-1);
00140               }
00141         data.foundBlobs.clear();
00142         if(m_supplier){
00143                 info.searchColors.setCMode(C_SUPPLIER);
00144         }else{
00145                 info.searchColors.setCMode(C_CONSUMER);
00146         }
00147         if(m_supplier){
00148                 info.deleteBlobs.setCMode(C_SUPPLIER);
00149         }else{
00150                 info.deleteBlobs.setCMode(C_CONSUMER);
00151         }
00152        }else{
00153               //this shouldn't happen, but there's no real problem with it.
00154               //it'd just be dumb.
00155               m_initialize=true;
00156               m_supplier=true;
00157        }
00158        
00159        requests=info;
00160 
00161 }
00162 
00163 void BlobFinder::activateConsumer(){
00164        std::string localname;
00165        
00166        if(m_haveStream){
00167               m_initialize=false;
00168               m_supplier=false;
00169               if(myCOMObject&&myManager){
00170                       /* global name so we don't have conflicts with the naming service */
00171                       if(!m_haveGlobalname&&m_strategy==STRAT_NORMAL){
00172                               m_globalname=myManager->getName()+BLOBFINDER+m_streamname+"Consumer";
00173                               m_haveGlobalname=true;
00174                       }
00175 
00176                      myCOMObject->setGlobalName(m_globalname);
00177                      myCOMObject->setStreamName(m_streamname);
00178                      requests.source=m_globalname;
00179                      data.source=m_streamname;
00180                      info.source=m_streamname;
00181                      myCOMObject->setInfo(&info);
00182                      myCOMObject->setRequests(&requests);
00183                      myCOMObject->setStaging(&data);
00184                      myCOMObject->setAutoPing(m_doAutoPing);
00185                      myCOMObject->activateConsumer();
00186                      myCOMObject->setInfoVector(&m_infoVector);
00187                      myCOMObject->setRequestVector(&m_requestVector);
00188                      myCOMObject->setDataVector(&m_dataVector);
00189 
00190                      if(m_queue){
00191                             myCOMObject->setQueueMode(true);
00192                      }
00193               }else{
00194                       g_fatal("Attempted to activateConsumer before setting a COMObject and CommsManager. Please use registerConsumer instead.");
00195                      exit(-1);
00196               }
00197 
00198         data.foundBlobs.clear();
00199         if(m_supplier){
00200                 info.searchColors.setCMode(C_SUPPLIER);
00201         }else{
00202                 info.searchColors.setCMode(C_CONSUMER);
00203         }
00204         if(m_supplier){
00205                 info.deleteBlobs.setCMode(C_SUPPLIER);
00206         }else{
00207                 info.deleteBlobs.setCMode(C_CONSUMER);
00208         }
00209        }else{
00210               //no stream, so we can't connect yet. tell the system 
00211               //to initialize as soon as we've got one
00212               m_initialize=true;
00213        }
00214 
00215 }
00216 
00217 void BlobFinder::runUpdate(){
00218        if(myCOMObject){
00219 
00220               myCOMObject->runUpdate(m_doPublishData,m_doPublishInfo);
00221               
00222               m_doPublishData=false;
00223               m_doPublishInfo=false;
00224               
00225        }
00226 }
00227 
00228 void BlobFinder::setManager(CommsManager *myManager_){
00229 
00230   if(!myCOMObject){
00231     myManager=myManager_;
00232   }
00233 
00234 }
00235 
00236 void BlobFinder::setQueueMode(const bool & val){
00237 
00238        if(!myCOMObject){
00239               m_queue=val;
00240        }else if(!m_queue&&val){
00241               m_queue=val;
00242               myCOMObject->setDataVector(&m_dataVector);
00243               myCOMObject->setQueueMode(true);
00244 
00245        }else if(!val&&m_queue){
00246               m_queue=val;
00247               myCOMObject->setQueueMode(false);
00248               while(!m_dataVector.empty()){
00249                      m_dataVector.pop();
00250               }
00251               while(!m_infoVector.empty()){
00252                      m_infoVector.pop();
00253               }
00254               while(!m_requestVector.empty()){
00255                      m_requestVector.pop();
00256               }
00257        }
00258 }
00259 
00260 bool BlobFinder::newData(){
00261        if(m_queue){
00262               return !m_dataVector.empty();
00263        }else{
00264               if(myCOMObject){
00265                      return myCOMObject->newData();
00266               }
00267        }
00268 
00269        return false;
00270 }
00271 
00272 bool BlobFinder::newInfo(){
00273        if(m_queue){
00274               if(m_supplier){
00275                      return !m_requestVector.empty();
00276               }
00277 
00278               return !m_infoVector.empty();
00279        }else{
00280               if(myCOMObject){
00281                      return myCOMObject->newInfo();
00282               }
00283        }
00284 
00285 
00286        return false;
00287 }
00288 
00289 void BlobFinder::publishData(){
00290        if(m_supplier){
00291               if(m_doTimestamp){
00292                      data.timestamp.now();
00293               }
00294               if(m_doTag){
00295                      data.source=m_globalname;
00296               }
00297               if(m_queue){
00298                      BlobFinderDataStruct temp;
00299         temp.foundBlobs.clear();
00300                      temp.source=data.source;
00301 temp.foundBlobs=data.foundBlobs;
00302 temp.timestamp=data.timestamp;
00303  
00304                      m_dataVector.push(temp);
00305                               //                     m_dataVector.push(data);
00306               }
00307               m_doPublishData=true;
00308        }
00309 }
00310 
00311 void BlobFinder::publishInfo(){
00312        if(m_supplier){
00313 
00314               info.mType=MESSAGE_INFO;
00315               if(m_doTimestamp){
00316                      info.timestamp.now();
00317               }
00318 
00319               if(m_doTag){
00320                      info.source=m_globalname;
00321                      info.target="Any";
00322               }
00323 
00324               if(m_queue){
00325                      BlobFinderInfoStruct temp;
00326                      
00327                     
00328                      temp.source=info.source;
00329 temp.searchColors=info.searchColors;
00330 temp.target=info.target;
00331 temp.timestamp=info.timestamp;
00332 temp.deleteBlobs=info.deleteBlobs;
00333 temp.mType=info.mType;
00334 
00335                      m_infoVector.push(temp);
00336                     
00337                      //              m_infoVector.push(info);
00338               }
00339 
00340               m_doPublishInfo=true;
00341        }else{
00342 
00343               requests.mType=MESSAGE_REQUEST;
00344               
00345               if(m_doTimestamp){
00346                      requests.timestamp.now();
00347               }
00348 
00349               if(m_doTag){
00350                      requests.source=m_globalname;
00351                      requests.target=m_streamname;
00352               }
00353 
00354               if(m_queue){
00355                      BlobFinderInfoStruct temp;
00356         if(m_supplier){
00357                 temp.searchColors.setCMode(C_SUPPLIER);
00358         }else{
00359                 temp.searchColors.setCMode(C_CONSUMER);
00360         }
00361         if(m_supplier){
00362                 temp.deleteBlobs.setCMode(C_SUPPLIER);
00363         }else{
00364                 temp.deleteBlobs.setCMode(C_CONSUMER);
00365         }
00366                      temp.source=requests.source;
00367 temp.searchColors=requests.searchColors;
00368 temp.target=requests.target;
00369 temp.timestamp=requests.timestamp;
00370 temp.deleteBlobs=requests.deleteBlobs;
00371 temp.mType=requests.mType;
00372 
00373                      m_requestVector.push(temp);
00374 
00375                      //              m_requestVector.push(requests);
00376               }
00377 
00378               m_doPublishInfo=true;
00379        }
00380 }
00381 
00382 BlobFinderDataStruct BlobFinder::getNextData(){
00383        if(m_queue){
00384               BlobFinderDataStruct retval;
00385         retval.foundBlobs.clear();
00386               retval.source="NULL";
00387               if(m_dataVector.empty()){
00388                      return data;
00389               }
00390              
00391               retval.source=m_dataVector.front().source;
00392 retval.foundBlobs=m_dataVector.front().foundBlobs;
00393 retval.timestamp=m_dataVector.front().timestamp;
00394 
00395                        //             retval=m_dataVector.front();
00396               m_dataVector.pop();
00397               data=retval;
00398        
00399               return retval;
00400        }else{
00401               myCOMObject->resetData();
00402               return data;
00403        }
00404 }
00405 
00406 BlobFinderInfoStruct BlobFinder::getNextInfo(){
00407        if(m_queue){
00408               BlobFinderInfoStruct retval;
00409         if(m_supplier){
00410                 retval.searchColors.setCMode(C_SUPPLIER);
00411         }else{
00412                 retval.searchColors.setCMode(C_CONSUMER);
00413         }
00414         if(m_supplier){
00415                 retval.deleteBlobs.setCMode(C_SUPPLIER);
00416         }else{
00417                 retval.deleteBlobs.setCMode(C_CONSUMER);
00418         }
00419               retval.source="NULL";
00420               if(m_supplier){
00421                      if(m_requestVector.empty()){
00422                             return requests;
00423                      }
00424                      retval.source=m_requestVector.front().source;
00425 retval.searchColors=m_requestVector.front().searchColors;
00426 retval.target=m_requestVector.front().target;
00427 retval.timestamp=m_requestVector.front().timestamp;
00428 retval.deleteBlobs=m_requestVector.front().deleteBlobs;
00429 retval.mType=m_requestVector.front().mType;
00430 
00431                               //                     retval=m_requestVector.front();
00432         if(m_supplier){
00433                 retval.searchColors.setCMode(C_SUPPLIER);
00434         }else{
00435                 retval.searchColors.setCMode(C_CONSUMER);
00436         }
00437         if(m_supplier){
00438                 retval.deleteBlobs.setCMode(C_SUPPLIER);
00439         }else{
00440                 retval.deleteBlobs.setCMode(C_CONSUMER);
00441         }
00442                      m_requestVector.pop();
00443                      requests=retval;
00444                      return retval;
00445               }else{
00446                      if(m_infoVector.empty()){
00447                             return info;
00448                      }
00449                      retval.source=m_infoVector.front().source;
00450 retval.searchColors=m_infoVector.front().searchColors;
00451 retval.target=m_infoVector.front().target;
00452 retval.timestamp=m_infoVector.front().timestamp;
00453 retval.deleteBlobs=m_infoVector.front().deleteBlobs;
00454 retval.mType=m_infoVector.front().mType;
00455 
00456         if(m_supplier){
00457                 retval.searchColors.setCMode(C_SUPPLIER);
00458         }else{
00459                 retval.searchColors.setCMode(C_CONSUMER);
00460         }
00461         if(m_supplier){
00462                 retval.deleteBlobs.setCMode(C_SUPPLIER);
00463         }else{
00464                 retval.deleteBlobs.setCMode(C_CONSUMER);
00465         }
00466                      m_infoVector.pop();
00467                      info=retval;
00468                      // the requests struct really should get the values in 
00469                      // info
00470                      requests=info;
00471                      
00472                      return retval;
00473               }
00474        }else{
00475               myCOMObject->resetInfo();
00476               if(m_supplier){
00477         if(m_supplier){
00478                 requests.searchColors.setCMode(C_SUPPLIER);
00479         }else{
00480                 requests.searchColors.setCMode(C_CONSUMER);
00481         }
00482         if(m_supplier){
00483                 requests.deleteBlobs.setCMode(C_SUPPLIER);
00484         }else{
00485                 requests.deleteBlobs.setCMode(C_CONSUMER);
00486         }
00487                      return requests;
00488               }else{
00489         if(m_supplier){
00490                 info.searchColors.setCMode(C_SUPPLIER);
00491         }else{
00492                 info.searchColors.setCMode(C_CONSUMER);
00493         }
00494         if(m_supplier){
00495                 info.deleteBlobs.setCMode(C_SUPPLIER);
00496         }else{
00497                 info.deleteBlobs.setCMode(C_CONSUMER);
00498         }
00499                      // the requests struct really should get the values in 
00500                      // info
00501                      requests=info;
00502                      return info;
00503               }
00504        }
00505 }
00506 
00507 void BlobFinder::setStreamName(const std::string & name){
00508 
00509        if(m_supplier&&name=="Any"){
00510               return;
00511        }
00512 
00513        m_streamname=name;
00514        m_haveStream=true;
00515 
00516        if(m_supplier){
00517               m_globalname=name;
00518        }
00519        
00520        if(myCOMObject){
00521               myCOMObject->setStreamName(name);
00522        }
00523 
00524        if(m_initialize){
00525               if(m_supplier){
00526                      activateSupplier();
00527               }else{
00528                      activateConsumer();
00529               }
00530        }
00531 
00532        m_streamRequest=STAT_OKAY;
00533 }
00534 
00535 void BlobFinder::setGlobalName(const std::string & name){
00536        
00537        if(name=="Any"){
00538               return;
00539        }
00540 
00541        m_globalname=name;
00542        m_haveGlobalname=true;
00543        if(m_supplier){
00544               m_streamname=name;
00545        }
00546 
00547        if(myCOMObject){
00548               myCOMObject->setGlobalName(name);
00549        }
00550 }
00551 
00552 void BlobFinder::doPing(){
00553        if(myCOMObject){
00554               myCOMObject->doPing();
00555        }
00556 }
00557 
00558 void BlobFinder::setAutoPing(const bool & val){
00559        m_doAutoPing=val; 
00560        if(myCOMObject){
00561               myCOMObject->setAutoPing(val);
00562        }
00563 }
00564 
00565 

Generated on Thu Feb 1 15:31:52 2007 for WURDE by  doxygen 1.5.1