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

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

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