Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages | Examples

ArCameraCollection.cpp

00001 /*
00002 MobileRobots Advanced Robotics Interface for Applications (ARIA)
00003 Copyright (C) 2004, 2005 ActivMedia Robotics LLC
00004 Copyright (C) 2006, 2007 MobileRobots Inc.
00005 
00006      This program is free software; you can redistribute it and/or modify
00007      it under the terms of the GNU General Public License as published by
00008      the Free Software Foundation; either version 2 of the License, or
00009      (at your option) any later version.
00010 
00011      This program is distributed in the hope that it will be useful,
00012      but WITHOUT ANY WARRANTY; without even the implied warranty of
00013      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014      GNU General Public License for more details.
00015 
00016      You should have received a copy of the GNU General Public License
00017      along with this program; if not, write to the Free Software
00018      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 
00020 If you wish to redistribute ARIA under different terms, contact 
00021 MobileRobots for information about a commercial version of ARIA at 
00022 robots@mobilerobots.com or 
00023 MobileRobots Inc, 19 Columbia Drive, Amherst, NH 03031; 800-639-9481
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 } // end ctor
00038 
00039 AREXPORT ArCameraCollection::~ArCameraCollection()
00040 {
00041   ArUtil::deleteSetPairs(myCameraToInfoMap.begin(),
00042                          myCameraToInfoMap.end());
00043   myCameraToInfoMap.clear();
00044 
00045 } // end dtor
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 } // end method addCamera
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 } // end method removeCamera
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 } // end method addCameraCommand
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 } // end method removeCameraCommand
00174 
00175 
00176 AREXPORT bool ArCameraCollection::addParameter(const char *cameraName,
00177                                               ArCameraParameterSource *source,
00178                                               const ArConfigArg &param)
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 } // end method addParameter
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 } // end method removeParameter 
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   } // end for each map entry
00242 
00243   unlock();
00244 
00245 } // end method getCameraNames
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 } // end method getCameraType
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 } // end method getDisplayName
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 } // end method getDisplayType
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     } // end for each map entry
00313   } // end if info found
00314 
00315   unlock();
00316 
00317 } // end method getCameraCommands
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   } // end if info found
00331 
00332   unlock();
00333 
00334   return cameraCommandName;
00335 
00336 } // end method getCommandName
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   } // end if info found
00350 
00351   unlock();
00352 
00353   return interval;
00354 
00355 } // end method getRequestInterval
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     } // end for each map entry
00373   } // end if info found
00374 
00375   unlock();
00376 
00377 } // end method getParameterNames
00378 
00379 AREXPORT bool ArCameraCollection::getParameter(const char *cameraName,
00380                                                const char *parameterName,
00381                                                ArConfigArg &paramOut)
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 } // end method getParameter
00396 
00397 
00398   
00399 AREXPORT bool ArCameraCollection::setParameter(const char *cameraName,
00400                                                const ArConfigArg &param)
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 } // end method changeParameter
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 } // end method exists
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 } // end method exists
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 } // end method startUpdate
00476 
00477 
00478 AREXPORT void ArCameraCollection::endUpdate()
00479 {
00480   lock();
00481   myIsUpdatesEnabled = true;
00482   // Now that updates have been re-enabled, check whether the collection was
00483   // modified and notify any listeners.
00484   notifyModifiedListeners();
00485   unlock();
00486 
00487 } // end method endUpdate
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 } // end method addModifiedCB
00522 
00523 
00524 AREXPORT bool ArCameraCollection::removeModifiedCB(ArFunctor *functor)
00525 {
00526   if (functor == NULL) {
00527     return false;
00528   }
00529 
00530   lock();
00531   // Could/should add a check to make sure functor is really there in order
00532   // to return a more accurate status... (But this probably isn't really 
00533   // an issue since functors aren't removed all that often.)
00534   myModifiedCBList.remove(functor);
00535   unlock();
00536 
00537   return true;
00538 
00539 } // end method removeModifiedCB
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 } // end method findCameraInfo
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 } // end method findCommandInfo
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 } // end method findParamInfo
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 } // end method notifyModifiedListeners
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 

Generated on Tue Feb 20 10:51:39 2007 for Aria by  doxygen 1.4.0