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

Go to the documentation of this file.
00001 
00029 #include <WallBuilder.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 WallBuilder::WallBuilder(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 WallBuilder::WallBuilder(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 WallBuilder::WallBuilder(const std::string &streamname,const std::string &gblName){
00059        init(streamname,STRAT_NORMAL,gblName);
00060 }
00061 
00062 void WallBuilder::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 WallBuilder::~WallBuilder(){
00103   myManager=NULL;
00104   if(myCOMObject){
00105 
00106          //      delete myCOMObject;
00107   }
00108 }
00109 
00110 
00111 void WallBuilder::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::CMUIPCWallBuilder(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         if(m_supplier){
00142                 info.deleteWalls.setCMode(C_SUPPLIER);
00143         }else{
00144                 info.deleteWalls.setCMode(C_CONSUMER);
00145         }
00146         if(m_supplier){
00147                 info.wallList.setCMode(C_SUPPLIER);
00148         }else{
00149                 info.wallList.setCMode(C_CONSUMER);
00150         }
00151        }else{
00152               //this shouldn't happen, but there's no real problem with it.
00153               //it'd just be dumb.
00154               m_initialize=true;
00155               m_supplier=true;
00156        }
00157        
00158        requests=info;
00159 
00160 }
00161 
00162 void WallBuilder::activateConsumer(){
00163        std::string localname;
00164        
00165        if(m_haveStream){
00166               m_initialize=false;
00167               m_supplier=false;
00168               if(myCOMObject&&myManager){
00169                       /* global name so we don't have conflicts with the naming service */
00170                       if(!m_haveGlobalname&&m_strategy==STRAT_NORMAL){
00171                               m_globalname=myManager->getName()+WALLBUILDER+m_streamname+"Consumer";
00172                               m_haveGlobalname=true;
00173                       }
00174 
00175                      myCOMObject->setGlobalName(m_globalname);
00176                      myCOMObject->setStreamName(m_streamname);
00177                      requests.source=m_globalname;
00178                      data.source=m_streamname;
00179                      info.source=m_streamname;
00180                      myCOMObject->setInfo(&info);
00181                      myCOMObject->setRequests(&requests);
00182                      myCOMObject->setStaging(&data);
00183                      myCOMObject->setAutoPing(m_doAutoPing);
00184                      myCOMObject->activateConsumer();
00185                      myCOMObject->setInfoVector(&m_infoVector);
00186                      myCOMObject->setRequestVector(&m_requestVector);
00187                      myCOMObject->setDataVector(&m_dataVector);
00188 
00189                      if(m_queue){
00190                             myCOMObject->setQueueMode(true);
00191                      }
00192               }else{
00193                       g_fatal("Attempted to activateConsumer before setting a COMObject and CommsManager. Please use registerConsumer instead.");
00194                      exit(-1);
00195               }
00196 
00197         if(m_supplier){
00198                 info.deleteWalls.setCMode(C_SUPPLIER);
00199         }else{
00200                 info.deleteWalls.setCMode(C_CONSUMER);
00201         }
00202         if(m_supplier){
00203                 info.wallList.setCMode(C_SUPPLIER);
00204         }else{
00205                 info.wallList.setCMode(C_CONSUMER);
00206         }
00207        }else{
00208               //no stream, so we can't connect yet. tell the system 
00209               //to initialize as soon as we've got one
00210               m_initialize=true;
00211        }
00212 
00213 }
00214 
00215 void WallBuilder::runUpdate(){
00216        if(myCOMObject){
00217 
00218               myCOMObject->runUpdate(m_doPublishData,m_doPublishInfo);
00219               
00220               m_doPublishData=false;
00221               m_doPublishInfo=false;
00222               
00223        }
00224 }
00225 
00226 void WallBuilder::setManager(CommsManager *myManager_){
00227 
00228   if(!myCOMObject){
00229     myManager=myManager_;
00230   }
00231 
00232 }
00233 
00234 void WallBuilder::setQueueMode(const bool & val){
00235 
00236        if(!myCOMObject){
00237               m_queue=val;
00238        }else if(!m_queue&&val){
00239               m_queue=val;
00240               myCOMObject->setDataVector(&m_dataVector);
00241               myCOMObject->setQueueMode(true);
00242 
00243        }else if(!val&&m_queue){
00244               m_queue=val;
00245               myCOMObject->setQueueMode(false);
00246               while(!m_dataVector.empty()){
00247                      m_dataVector.pop();
00248               }
00249               while(!m_infoVector.empty()){
00250                      m_infoVector.pop();
00251               }
00252               while(!m_requestVector.empty()){
00253                      m_requestVector.pop();
00254               }
00255        }
00256 }
00257 
00258 bool WallBuilder::newData(){
00259        if(m_queue){
00260               return !m_dataVector.empty();
00261        }else{
00262               if(myCOMObject){
00263                      return myCOMObject->newData();
00264               }
00265        }
00266 
00267        return false;
00268 }
00269 
00270 bool WallBuilder::newInfo(){
00271        if(m_queue){
00272               if(m_supplier){
00273                      return !m_requestVector.empty();
00274               }
00275 
00276               return !m_infoVector.empty();
00277        }else{
00278               if(myCOMObject){
00279                      return myCOMObject->newInfo();
00280               }
00281        }
00282 
00283 
00284        return false;
00285 }
00286 
00287 void WallBuilder::publishData(){
00288        if(m_supplier){
00289               if(m_doTimestamp){
00290                      data.timestamp.now();
00291               }
00292               if(m_doTag){
00293                      data.source=m_globalname;
00294               }
00295               if(m_queue){
00296                      WallBuilderDataStruct temp;
00297                      temp.source=data.source;
00298 temp.timestamp=data.timestamp;
00299  
00300                      m_dataVector.push(temp);
00301                               //                     m_dataVector.push(data);
00302               }
00303               m_doPublishData=true;
00304        }
00305 }
00306 
00307 void WallBuilder::publishInfo(){
00308        if(m_supplier){
00309 
00310               info.mType=MESSAGE_INFO;
00311               if(m_doTimestamp){
00312                      info.timestamp.now();
00313               }
00314 
00315               if(m_doTag){
00316                      info.source=m_globalname;
00317                      info.target="Any";
00318               }
00319 
00320               if(m_queue){
00321                      WallBuilderInfoStruct temp;
00322                      
00323                     
00324                      temp.deleteWalls=info.deleteWalls;
00325 temp.source=info.source;
00326 temp.target=info.target;
00327 temp.wallList=info.wallList;
00328 temp.timestamp=info.timestamp;
00329 temp.mType=info.mType;
00330 
00331                      m_infoVector.push(temp);
00332                     
00333                      //              m_infoVector.push(info);
00334               }
00335 
00336               m_doPublishInfo=true;
00337        }else{
00338 
00339               requests.mType=MESSAGE_REQUEST;
00340               
00341               if(m_doTimestamp){
00342                      requests.timestamp.now();
00343               }
00344 
00345               if(m_doTag){
00346                      requests.source=m_globalname;
00347                      requests.target=m_streamname;
00348               }
00349 
00350               if(m_queue){
00351                      WallBuilderInfoStruct temp;
00352         if(m_supplier){
00353                 temp.deleteWalls.setCMode(C_SUPPLIER);
00354         }else{
00355                 temp.deleteWalls.setCMode(C_CONSUMER);
00356         }
00357         if(m_supplier){
00358                 temp.wallList.setCMode(C_SUPPLIER);
00359         }else{
00360                 temp.wallList.setCMode(C_CONSUMER);
00361         }
00362                      temp.deleteWalls=requests.deleteWalls;
00363 temp.source=requests.source;
00364 temp.target=requests.target;
00365 temp.wallList=requests.wallList;
00366 temp.timestamp=requests.timestamp;
00367 temp.mType=requests.mType;
00368 
00369                      m_requestVector.push(temp);
00370 
00371                      //              m_requestVector.push(requests);
00372               }
00373 
00374               m_doPublishInfo=true;
00375        }
00376 }
00377 
00378 WallBuilderDataStruct WallBuilder::getNextData(){
00379        if(m_queue){
00380               WallBuilderDataStruct retval;
00381               retval.source="NULL";
00382               if(m_dataVector.empty()){
00383                      return data;
00384               }
00385              
00386               retval.source=m_dataVector.front().source;
00387 retval.timestamp=m_dataVector.front().timestamp;
00388 
00389                        //             retval=m_dataVector.front();
00390               m_dataVector.pop();
00391               data=retval;
00392        
00393               return retval;
00394        }else{
00395               myCOMObject->resetData();
00396               return data;
00397        }
00398 }
00399 
00400 WallBuilderInfoStruct WallBuilder::getNextInfo(){
00401        if(m_queue){
00402               WallBuilderInfoStruct retval;
00403         if(m_supplier){
00404                 retval.deleteWalls.setCMode(C_SUPPLIER);
00405         }else{
00406                 retval.deleteWalls.setCMode(C_CONSUMER);
00407         }
00408         if(m_supplier){
00409                 retval.wallList.setCMode(C_SUPPLIER);
00410         }else{
00411                 retval.wallList.setCMode(C_CONSUMER);
00412         }
00413               retval.source="NULL";
00414               if(m_supplier){
00415                      if(m_requestVector.empty()){
00416                             return requests;
00417                      }
00418                      retval.deleteWalls=m_requestVector.front().deleteWalls;
00419 retval.source=m_requestVector.front().source;
00420 retval.target=m_requestVector.front().target;
00421 retval.wallList=m_requestVector.front().wallList;
00422 retval.timestamp=m_requestVector.front().timestamp;
00423 retval.mType=m_requestVector.front().mType;
00424 
00425                               //                     retval=m_requestVector.front();
00426         if(m_supplier){
00427                 retval.deleteWalls.setCMode(C_SUPPLIER);
00428         }else{
00429                 retval.deleteWalls.setCMode(C_CONSUMER);
00430         }
00431         if(m_supplier){
00432                 retval.wallList.setCMode(C_SUPPLIER);
00433         }else{
00434                 retval.wallList.setCMode(C_CONSUMER);
00435         }
00436                      m_requestVector.pop();
00437                      requests=retval;
00438                      return retval;
00439               }else{
00440                      if(m_infoVector.empty()){
00441                             return info;
00442                      }
00443                      retval.deleteWalls=m_infoVector.front().deleteWalls;
00444 retval.source=m_infoVector.front().source;
00445 retval.target=m_infoVector.front().target;
00446 retval.wallList=m_infoVector.front().wallList;
00447 retval.timestamp=m_infoVector.front().timestamp;
00448 retval.mType=m_infoVector.front().mType;
00449 
00450         if(m_supplier){
00451                 retval.deleteWalls.setCMode(C_SUPPLIER);
00452         }else{
00453                 retval.deleteWalls.setCMode(C_CONSUMER);
00454         }
00455         if(m_supplier){
00456                 retval.wallList.setCMode(C_SUPPLIER);
00457         }else{
00458                 retval.wallList.setCMode(C_CONSUMER);
00459         }
00460                      m_infoVector.pop();
00461                      info=retval;
00462                      // the requests struct really should get the values in 
00463                      // info
00464                      requests=info;
00465                      
00466                      return retval;
00467               }
00468        }else{
00469               myCOMObject->resetInfo();
00470               if(m_supplier){
00471         if(m_supplier){
00472                 requests.deleteWalls.setCMode(C_SUPPLIER);
00473         }else{
00474                 requests.deleteWalls.setCMode(C_CONSUMER);
00475         }
00476         if(m_supplier){
00477                 requests.wallList.setCMode(C_SUPPLIER);
00478         }else{
00479                 requests.wallList.setCMode(C_CONSUMER);
00480         }
00481                      return requests;
00482               }else{
00483         if(m_supplier){
00484                 info.deleteWalls.setCMode(C_SUPPLIER);
00485         }else{
00486                 info.deleteWalls.setCMode(C_CONSUMER);
00487         }
00488         if(m_supplier){
00489                 info.wallList.setCMode(C_SUPPLIER);
00490         }else{
00491                 info.wallList.setCMode(C_CONSUMER);
00492         }
00493                      // the requests struct really should get the values in 
00494                      // info
00495                      requests=info;
00496                      return info;
00497               }
00498        }
00499 }
00500 
00501 void WallBuilder::setStreamName(const std::string & name){
00502 
00503        if(m_supplier&&name=="Any"){
00504               return;
00505        }
00506 
00507        m_streamname=name;
00508        m_haveStream=true;
00509 
00510        if(m_supplier){
00511               m_globalname=name;
00512        }
00513        
00514        if(myCOMObject){
00515               myCOMObject->setStreamName(name);
00516        }
00517 
00518        if(m_initialize){
00519               if(m_supplier){
00520                      activateSupplier();
00521               }else{
00522                      activateConsumer();
00523               }
00524        }
00525 
00526        m_streamRequest=STAT_OKAY;
00527 }
00528 
00529 void WallBuilder::setGlobalName(const std::string & name){
00530        
00531        if(name=="Any"){
00532               return;
00533        }
00534 
00535        m_globalname=name;
00536        m_haveGlobalname=true;
00537        if(m_supplier){
00538               m_streamname=name;
00539        }
00540 
00541        if(myCOMObject){
00542               myCOMObject->setGlobalName(name);
00543        }
00544 }
00545 
00546 void WallBuilder::doPing(){
00547        if(myCOMObject){
00548               myCOMObject->doPing();
00549        }
00550 }
00551 
00552 void WallBuilder::setAutoPing(const bool & val){
00553        m_doAutoPing=val; 
00554        if(myCOMObject){
00555               myCOMObject->setAutoPing(val);
00556        }
00557 }
00558 
00559 

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