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