00001
00029 #include <ImageDisplay.H>
00030 #include <CommsManager.H>
00031 #include <Logger.H>
00032
00033
00034
00035 using namespace WURDE;
00036
00037 ImageDisplay::ImageDisplay(const std::string & streamname){
00038 init(streamname,STRAT_NORMAL,"Any");
00039
00040
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
00049
00050
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
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
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
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
00160
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
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
00223
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
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
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
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
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
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
00509
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
00550
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