00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "ArExport.h"
00029 #include "ariaUtil.h"
00030
00031 #include "ArCameraCollection.h"
00032
00033 AREXPORT ArCameraCollection::ArCameraCollection() :
00034 myMutex(),
00035 myCameraToInfoMap()
00036 {
00037 }
00038
00039 AREXPORT ArCameraCollection::~ArCameraCollection()
00040 {
00041 ArUtil::deleteSetPairs(myCameraToInfoMap.begin(),
00042 myCameraToInfoMap.end());
00043 myCameraToInfoMap.clear();
00044
00045 }
00046
00047 AREXPORT bool ArCameraCollection::addCamera(const char *cameraName,
00048 const char *cameraType,
00049 const char *displayName,
00050 const char *displayType)
00051 {
00052 if (cameraName == NULL) {
00053 return false;
00054 }
00055
00056 lock();
00057 CameraInfo *info = findCameraInfo(cameraName);
00058 if (info != NULL) {
00059 unlock();
00060 return false;
00061 }
00062
00063 info = new CameraInfo();
00064
00065 info->myCameraName = cameraName;
00066 info->myCameraType = cameraType;
00067 info->myDisplayName = ((displayName != NULL) ? displayName : cameraName);
00068 info->myDisplayType = ((displayType != NULL) ? displayType : cameraType);
00069
00070 myCameraToInfoMap[cameraName] = info;
00071
00072 unlock();
00073 return true;
00074
00075 }
00076
00077
00078 AREXPORT bool ArCameraCollection::removeCamera(const char *cameraName)
00079 {
00080 if (cameraName == NULL) {
00081 return false;
00082 }
00083 lock();
00084
00085 std::map<std::string, CameraInfo*>::iterator iter =
00086 myCameraToInfoMap.find(cameraName);
00087 if (iter == myCameraToInfoMap.end()) {
00088 unlock();
00089 return false;
00090 }
00091
00092 delete iter->second;
00093 iter->second = NULL;
00094
00095 myCameraToInfoMap.erase(iter);
00096
00097 setModified();
00098
00099 unlock();
00100
00101 return true;
00102
00103 }
00104
00105
00106 AREXPORT bool ArCameraCollection::addCameraCommand(const char *cameraName,
00107 const char *command,
00108 const char *cameraCommandName,
00109 int requestInterval)
00110 {
00111 if (command == NULL) {
00112 return false;
00113 }
00114 lock();
00115
00116 CameraInfo *cameraInfo = findCameraInfo(cameraName);
00117 if (cameraInfo == NULL) {
00118 unlock();
00119 return false;
00120 }
00121
00122 CommandInfo *info = findCommandInfo(cameraName, command);
00123 if (info != NULL) {
00124 unlock();
00125 return false;
00126 }
00127
00128 info = new CommandInfo();
00129 info->myCommand = command;
00130 info->myCameraCommandName = cameraCommandName;
00131 info->myRequestInterval = requestInterval;
00132
00133
00134 cameraInfo->myCommandToInfoMap[command] = info;
00135
00136 setModified();
00137 unlock();
00138
00139 return true;
00140
00141 }
00142
00143
00144 AREXPORT bool ArCameraCollection::removeCameraCommand(const char *cameraName,
00145 const char *command)
00146 {
00147 lock();
00148
00149 CameraInfo *info = findCameraInfo(cameraName);
00150 if (info == NULL) {
00151 unlock();
00152 return false;
00153 }
00154
00155 std::map<std::string, CommandInfo*>::iterator iter =
00156 info->myCommandToInfoMap.find(command);
00157
00158 if (iter == info->myCommandToInfoMap.end()) {
00159 unlock();
00160 return false;
00161 }
00162
00163 delete iter->second;
00164 iter->second = NULL;
00165
00166 info->myCommandToInfoMap.erase(iter);
00167
00168 setModified();
00169 unlock();
00170
00171 return true;
00172
00173 }
00174
00175
00176 AREXPORT bool ArCameraCollection::addParameter(const char *cameraName,
00177 ArCameraParameterSource *source,
00178 const ArConfigArg ¶m)
00179 {
00180 lock();
00181 CameraInfo *camInfo = findCameraInfo(cameraName);
00182 if ((camInfo == NULL) || (param.getName() == NULL)) {
00183 unlock();
00184 return false;
00185 }
00186
00187 ParamInfo *info = findParamInfo(cameraName, param.getName());
00188 if (info != NULL) {
00189 unlock();
00190 return false;
00191 }
00192
00193 info = new ParamInfo();
00194 info->mySource = source;
00195 info->myParam = param;
00196
00197 camInfo->myParamToInfoMap[param.getName()] = info;
00198
00199 unlock();
00200 return true;
00201
00202 }
00203
00204
00205 AREXPORT bool ArCameraCollection::removeParameter(const char *cameraName,
00206 const char *paramName)
00207 {
00208 lock();
00209 CameraInfo *camInfo = findCameraInfo(cameraName);
00210 if ((camInfo == NULL) || (paramName == NULL)) {
00211 unlock();
00212 return false;
00213 }
00214
00215 std::map<std::string, ParamInfo*>::iterator iter =
00216 camInfo->myParamToInfoMap.find(paramName);
00217
00218 if (iter == camInfo->myParamToInfoMap.end()) {
00219 unlock();
00220 return false;
00221 }
00222
00223 camInfo->myParamToInfoMap.erase(iter);
00224
00225 unlock();
00226 return true;
00227
00228 }
00229
00230
00231 AREXPORT void ArCameraCollection::getCameraNames(std::list<std::string> &outList)
00232 {
00233 lock();
00234 outList.clear();
00235
00236 for (std::map<std::string, CameraInfo*>::iterator iter = myCameraToInfoMap.begin();
00237 iter != myCameraToInfoMap.end();
00238 iter++) {
00239 outList.push_back(iter->first);
00240
00241 }
00242
00243 unlock();
00244
00245 }
00246
00247
00248 AREXPORT const char *ArCameraCollection::getCameraType(const char *cameraName)
00249 {
00250 const char *type = NULL;
00251
00252 lock();
00253
00254 CameraInfo *info = findCameraInfo(cameraName);
00255 if (info != NULL) {
00256 type = info->myCameraType.c_str();
00257 }
00258 unlock();
00259
00260 return type;
00261
00262 }
00263
00264
00265 AREXPORT const char *ArCameraCollection::getDisplayName(const char *cameraName)
00266 {
00267 const char *displayName = NULL;
00268
00269 lock();
00270
00271 CameraInfo *info = findCameraInfo(cameraName);
00272 if (info != NULL) {
00273 displayName = info->myDisplayName.c_str();
00274 }
00275 unlock();
00276
00277 return displayName;
00278
00279 }
00280
00281
00282 AREXPORT const char *ArCameraCollection::getDisplayType(const char *cameraName)
00283 {
00284 const char *displayType = NULL;
00285
00286 lock();
00287
00288 CameraInfo *info = findCameraInfo(cameraName);
00289 if (info != NULL) {
00290 displayType = info->myDisplayType.c_str();
00291 }
00292 unlock();
00293
00294 return displayType;
00295
00296 }
00297
00298
00299 AREXPORT void ArCameraCollection::getCameraCommands(const char *cameraName,
00300 std::list<std::string> &outList)
00301 {
00302 lock();
00303 outList.clear();
00304
00305 CameraInfo *info = findCameraInfo(cameraName);
00306 if (info != NULL) {
00307 for (std::map<std::string, CommandInfo*>::iterator iter = info->myCommandToInfoMap.begin();
00308 iter != info->myCommandToInfoMap.end();
00309 iter++) {
00310 outList.push_back(iter->first);
00311
00312 }
00313 }
00314
00315 unlock();
00316
00317 }
00318
00319
00320 AREXPORT const char *ArCameraCollection::getCommandName(const char *cameraName,
00321 const char *command)
00322 {
00323 const char *cameraCommandName = NULL;
00324
00325 lock();
00326
00327 CommandInfo *info = findCommandInfo(cameraName, command);
00328 if (info != NULL) {
00329 cameraCommandName = info->myCameraCommandName.c_str();
00330 }
00331
00332 unlock();
00333
00334 return cameraCommandName;
00335
00336 }
00337
00338
00339 AREXPORT int ArCameraCollection::getRequestInterval(const char *cameraName,
00340 const char *command)
00341 {
00342 int interval = -1;
00343
00344 lock();
00345
00346 CommandInfo *info = findCommandInfo(cameraName, command);
00347 if (info != NULL) {
00348 interval = info->myRequestInterval;
00349 }
00350
00351 unlock();
00352
00353 return interval;
00354
00355 }
00356
00357
00358 AREXPORT void ArCameraCollection::getParameterNames
00359 (const char *cameraName,
00360 std::list<std::string> &outList)
00361 {
00362 lock();
00363 outList.clear();
00364
00365 CameraInfo *info = findCameraInfo(cameraName);
00366 if (info != NULL) {
00367 for (std::map<std::string, ParamInfo*>::iterator iter = info->myParamToInfoMap.begin();
00368 iter != info->myParamToInfoMap.end();
00369 iter++) {
00370 outList.push_back(iter->first);
00371
00372 }
00373 }
00374
00375 unlock();
00376
00377 }
00378
00379 AREXPORT bool ArCameraCollection::getParameter(const char *cameraName,
00380 const char *parameterName,
00381 ArConfigArg ¶mOut)
00382 {
00383 lock();
00384
00385 ParamInfo *info = findParamInfo(cameraName, parameterName);
00386 if (info == NULL) {
00387 unlock();
00388 return false;
00389 }
00390 paramOut = info->myParam;
00391 unlock();
00392
00393 return true;
00394
00395 }
00396
00397
00398
00399 AREXPORT bool ArCameraCollection::setParameter(const char *cameraName,
00400 const ArConfigArg ¶m)
00401 {
00402 lock();
00403
00404 ParamInfo *info = findParamInfo(cameraName, param.getName());
00405 if (info == NULL) {
00406 unlock();
00407 return false;
00408 }
00409 info->myParam = param;
00410
00411 if (info->mySource != NULL) {
00412 info->mySource->setParameter(param);
00413 }
00414
00415 unlock();
00416 return true;
00417
00418 }
00419
00420
00421 AREXPORT bool ArCameraCollection::exists(const char *cameraName)
00422 {
00423 lock();
00424
00425 CameraInfo *info = findCameraInfo(cameraName);
00426
00427 unlock();
00428
00429 return (info != NULL);
00430
00431 }
00432
00433
00434 AREXPORT bool ArCameraCollection::exists(const char *cameraName,
00435 const char *command)
00436 {
00437 if ((cameraName == NULL) || (command == NULL)) {
00438 return false;
00439 }
00440
00441 lock();
00442
00443 CommandInfo *info = findCommandInfo(cameraName, command);
00444
00445 unlock();
00446
00447 return (info != NULL);
00448
00449 }
00450
00451
00452 AREXPORT bool ArCameraCollection::parameterExists(const char *cameraName,
00453 const char *paramName)
00454 {
00455 if ((cameraName == NULL) || (paramName == NULL)) {
00456 return false;
00457 }
00458 lock();
00459
00460 ParamInfo *info = findParamInfo(cameraName, paramName);
00461
00462 unlock();
00463
00464 return (info != NULL);
00465
00466 }
00467
00468
00469 AREXPORT void ArCameraCollection::startUpdate()
00470 {
00471 lock();
00472 myIsUpdatesEnabled = false;
00473 unlock();
00474
00475 }
00476
00477
00478 AREXPORT void ArCameraCollection::endUpdate()
00479 {
00480 lock();
00481 myIsUpdatesEnabled = true;
00482
00483
00484 notifyModifiedListeners();
00485 unlock();
00486
00487 }
00488
00489
00490 AREXPORT bool ArCameraCollection::addModifiedCB(ArFunctor *functor,
00491 ArListPos::Pos position)
00492 {
00493 if (functor == NULL) {
00494 return false;
00495 }
00496
00497 bool isSuccess = true;
00498 lock();
00499
00500 switch (position) {
00501 case ArListPos::FIRST:
00502 myModifiedCBList.push_front(functor);
00503 break;
00504
00505 case ArListPos::LAST:
00506 myModifiedCBList.push_back(functor);
00507 break;
00508
00509 default:
00510 isSuccess = false;
00511 ArLog::log(ArLog::Terse,
00512 "ArCameraCollection::addModifiedCB: Unrecognized position = %i.",
00513 position);
00514 break;
00515 }
00516
00517 unlock();
00518
00519 return isSuccess;
00520
00521 }
00522
00523
00524 AREXPORT bool ArCameraCollection::removeModifiedCB(ArFunctor *functor)
00525 {
00526 if (functor == NULL) {
00527 return false;
00528 }
00529
00530 lock();
00531
00532
00533
00534 myModifiedCBList.remove(functor);
00535 unlock();
00536
00537 return true;
00538
00539 }
00540
00541
00542 ArCameraCollection::CameraInfo *ArCameraCollection::findCameraInfo(const char *cameraName)
00543 {
00544 if (cameraName == NULL) {
00545 return NULL;
00546 }
00547
00548 CameraInfo *info = NULL;
00549
00550 std::map<std::string, CameraInfo*>::iterator iter =
00551 myCameraToInfoMap.find(cameraName);
00552
00553 if (iter != myCameraToInfoMap.end()) {
00554 info = iter->second;
00555 }
00556
00557 return info;
00558
00559 }
00560
00561
00562 ArCameraCollection::CommandInfo *ArCameraCollection::findCommandInfo
00563 (const char *cameraName,
00564 const char *commandName)
00565 {
00566 CameraInfo *cameraInfo = findCameraInfo(cameraName);
00567 if (cameraInfo == NULL) {
00568 return false;
00569 }
00570
00571 CommandInfo *info = NULL;
00572
00573 std::map<std::string, CommandInfo*>::iterator iter =
00574 cameraInfo->myCommandToInfoMap.find(commandName);
00575
00576 if (iter != cameraInfo->myCommandToInfoMap.end()) {
00577 info = iter->second;
00578 }
00579
00580 return info;
00581
00582 }
00583
00584 ArCameraCollection::ParamInfo *ArCameraCollection::findParamInfo
00585 (const char *cameraName,
00586 const char *paramName)
00587 {
00588 CameraInfo *cameraInfo = findCameraInfo(cameraName);
00589 if (cameraInfo == NULL) {
00590 return false;
00591 }
00592
00593 ParamInfo *info = NULL;
00594
00595 std::map<std::string, ParamInfo*>::iterator iter =
00596 cameraInfo->myParamToInfoMap.find(paramName);
00597
00598 if (iter != cameraInfo->myParamToInfoMap.end()) {
00599 info = iter->second;
00600 }
00601
00602 return info;
00603
00604 }
00605
00606
00607
00608 void ArCameraCollection::setModified()
00609 {
00610 myIsModified = true;
00611 notifyModifiedListeners();
00612 }
00613
00614
00615 void ArCameraCollection::notifyModifiedListeners()
00616 {
00617 if (!myIsUpdatesEnabled || !myIsModified) {
00618 return;
00619 }
00620
00621
00622 myIsModified = false;
00623
00624 }
00625
00626
00627 ArCameraCollection::CameraInfo::CameraInfo() :
00628 myCameraName(),
00629 myCameraType(),
00630 myDisplayName(),
00631 myDisplayType(),
00632 myCommandToInfoMap(),
00633 myParamToInfoMap()
00634 {
00635 }
00636
00637 ArCameraCollection::CameraInfo::~CameraInfo()
00638 {
00639 ArUtil::deleteSetPairs(myCommandToInfoMap.begin(),
00640 myCommandToInfoMap.end());
00641 myCommandToInfoMap.clear();
00642 }
00643
00644
00645 ArCameraCollection::CommandInfo::CommandInfo() :
00646 myCommand(),
00647 myCameraCommandName(),
00648 myRequestInterval(-1)
00649 {
00650 }
00651
00652 ArCameraCollection::CommandInfo::~CommandInfo()
00653 {
00654 }
00655
00656
00657 ArCameraCollection::ParamInfo::ParamInfo() :
00658 mySource(NULL),
00659 myParam()
00660 {
00661 }
00662
00663 ArCameraCollection::ParamInfo::~ParamInfo()
00664 {
00665 }
00666
00667