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

ArSyncTask.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 #include "ArExport.h"
00027 #include "ariaOSDef.h"
00028 #include "ariaUtil.h"
00029 #include "ArSyncTask.h"
00030 #include "ArLog.h"
00031 
00036 AREXPORT ArSyncTask::ArSyncTask(const char *name, ArFunctor *functor,
00037                 ArTaskState::State *state, ArSyncTask *parent)
00038 {
00039   myName = name;
00040   myStatePointer = state;
00041   myFunctor = functor;
00042   myParent = parent;
00043   myIsDeleting = false;
00044   setState(ArTaskState::INIT);
00045   if (myParent != NULL)
00046   {
00047     setWarningTimeCB(parent->getWarningTimeCB());
00048     setNoTimeWarningCB(parent->getNoTimeWarningCB());
00049   }
00050   else
00051   {
00052     setWarningTimeCB(NULL);
00053     setNoTimeWarningCB(NULL);
00054   }
00055 }
00056 
00062 AREXPORT ArSyncTask::~ArSyncTask()
00063 {
00064   myIsDeleting = true;
00065   if (myParent != NULL && !myParent->isDeleting())
00066     myParent->remove(this);
00067   
00068   ArUtil::deleteSetPairs(myMultiMap.begin(), myMultiMap.end());  
00069   myMultiMap.clear();
00070 }
00071 
00072 AREXPORT ArTaskState::State ArSyncTask::getState(void)
00073 {
00074   if (myStatePointer != NULL)
00075     return *myStatePointer;
00076   else
00077     return myState;
00078 }
00079 
00080 AREXPORT void ArSyncTask::setState(ArTaskState::State state)
00081 {
00082   if (myStatePointer != NULL)
00083     *myStatePointer = state;
00084   else
00085     myState = state;
00086 }
00087 
00088 AREXPORT std::string ArSyncTask::getName(void)
00089 {
00090   return myName;
00091 }
00092 
00093 
00099 AREXPORT ArSyncTask *ArSyncTask::find(ArFunctor *functor)
00100 {
00101   ArSyncTask *proc;
00102   std::multimap<int, ArSyncTask *>::iterator it;
00103   
00104   if (myFunctor == functor)
00105     return this;
00106 
00107   for (it = myMultiMap.begin(); it != myMultiMap.end(); ++it)
00108   {
00109     proc = (*it).second;
00110     if (proc->find(functor) != NULL)
00111       return proc;
00112   }
00113   return NULL;
00114   
00115 }
00116 
00122 AREXPORT ArSyncTask *ArSyncTask::find(const char *name)
00123 {
00124   ArSyncTask *proc;
00125   std::multimap<int, ArSyncTask *>::iterator it;
00126   
00127   if (strcmp(myName.c_str(), name) == 0)
00128     return this;
00129 
00130   for (it = myMultiMap.begin(); it != myMultiMap.end(); ++it)
00131   {
00132     proc = (*it).second;
00133     if (proc->find(name) != NULL)
00134       return proc;
00135   }
00136   return NULL;
00137   
00138 }
00139 
00145 AREXPORT ArSyncTask *ArSyncTask::findNonRecursive(const char * name)
00146 {
00147   ArSyncTask *proc;
00148   std::multimap<int, ArSyncTask *>::iterator it;
00149   
00150   for (it = myMultiMap.begin(); it != myMultiMap.end(); ++it)
00151   {
00152     proc = (*it).second;
00153     if (strcmp(proc->getName().c_str(), name) == 0)  
00154       return proc;
00155   }
00156   return NULL;
00157 }
00158 
00164 AREXPORT ArSyncTask *ArSyncTask::findNonRecursive(ArFunctor *functor)
00165 {
00166   ArSyncTask *proc;
00167   std::multimap<int, ArSyncTask *>::iterator it;
00168   
00169   for (it = myMultiMap.begin(); it != myMultiMap.end(); ++it)
00170   {
00171     proc = (*it).second;
00172     if (proc->getFunctor() == functor)
00173       return proc;
00174   }
00175   return NULL;
00176 }
00177 
00186 AREXPORT void ArSyncTask::addNewBranch(const char *nameOfNew, int position,
00187                        ArTaskState::State *state)
00188 {
00189   ArSyncTask *proc = new ArSyncTask(nameOfNew, NULL, state, this);
00190   myMultiMap.insert(std::pair<int, ArSyncTask *>(position, proc));
00191 }
00192 
00204 AREXPORT void ArSyncTask::addNewLeaf(const char *nameOfNew, int position, 
00205                      ArFunctor *functor, 
00206                      ArTaskState::State *state)
00207 {
00208   ArSyncTask *proc = new ArSyncTask(nameOfNew, functor, state, this);
00209   myMultiMap.insert(std::pair<int, ArSyncTask *>(position, proc));
00210 }
00211 
00212 AREXPORT void ArSyncTask::remove(ArSyncTask *proc)
00213 {
00214   std::multimap<int, ArSyncTask *>::iterator it;
00215   
00216   for (it = myMultiMap.begin(); it != myMultiMap.end(); it++)
00217   {
00218     if ((*it).second == proc)
00219     {
00220       myMultiMap.erase(it);
00221       return;
00222     }
00223   }
00224 }
00225 
00226 AREXPORT bool ArSyncTask::isDeleting(void)
00227 {
00228   return myIsDeleting;
00229 }
00230 
00231 AREXPORT ArFunctor *ArSyncTask::getFunctor(void)
00232 {
00233   return myFunctor;
00234 }
00235 
00241 AREXPORT void ArSyncTask::run(void)
00242 {
00243   std::multimap<int, ArSyncTask *>::reverse_iterator it;
00244   ArTaskState::State state;
00245   ArTime runTime;
00246   int took;  
00247 
00248   state = getState();
00249   switch (state) 
00250   {
00251   case ArTaskState::SUSPEND:
00252   case ArTaskState::SUCCESS:
00253   case ArTaskState::FAILURE:
00254     // The task isn't running so just return
00255     return;
00256   case ArTaskState::INIT:
00257   case ArTaskState::RESUME:
00258   case ArTaskState::ACTIVE:
00259   default:
00260     break;
00261   }
00262   
00263   runTime.setToNow();
00264   if (myFunctor != NULL)
00265     myFunctor->invoke();
00266   
00267   if (myNoTimeWarningCB != NULL && !myNoTimeWarningCB->invokeR() && 
00268       myFunctor != NULL && myWarningTimeCB != NULL &&
00269       (took = runTime.mSecSince()) > (signed int)myWarningTimeCB->invokeR())
00270     ArLog::log(ArLog::Normal, 
00271            "Warning: Task '%s' took %d ms to run (longer than the %d warning time)",
00272            myName.c_str(), took, (signed int)myWarningTimeCB->invokeR());
00273   
00274   
00275   for (it = myMultiMap.rbegin(); it != myMultiMap.rend(); it++)
00276     (*it).second->run();
00277 }
00278 
00284 AREXPORT void ArSyncTask::setWarningTimeCB(ArRetFunctor<unsigned int> *functor)
00285 {
00286   std::multimap<int, ArSyncTask *>::reverse_iterator it;
00287   myWarningTimeCB = functor;
00288   for (it = myMultiMap.rbegin(); it != myMultiMap.rend(); it++)
00289     (*it).second->setWarningTimeCB(functor);
00290 }
00291 
00297 AREXPORT ArRetFunctor<unsigned int> *ArSyncTask::getWarningTimeCB(void)
00298 {
00299   return myWarningTimeCB;
00300 }
00301 
00306 AREXPORT void ArSyncTask::setNoTimeWarningCB(ArRetFunctor<bool> *functor)
00307 {
00308   std::multimap<int, ArSyncTask *>::reverse_iterator it;
00309   myNoTimeWarningCB = functor;
00310   for (it = myMultiMap.rbegin(); it != myMultiMap.rend(); it++)
00311     (*it).second->setNoTimeWarningCB(functor);
00312 }
00313 
00318 AREXPORT ArRetFunctor<bool> *ArSyncTask::getNoTimeWarningCB(void)
00319 {
00320   return myNoTimeWarningCB;
00321 }
00322 
00323 
00328 AREXPORT void ArSyncTask::log(int depth)
00329 {
00330   int i;
00331   std::multimap<int, ArSyncTask *>::reverse_iterator it;
00332   std::string str = "";
00333   ArTaskState::State state;
00334   
00335   for (i = 0; i < depth; i++)
00336     str += "\t";
00337   str += myName.c_str();
00338   str += " (";
00339   state = getState();
00340   switch (state) 
00341   {
00342   case ArTaskState::INIT:
00343     str += "INIT, running)";
00344     break;
00345   case ArTaskState::RESUME:
00346     str += "RESUME, running)";
00347     break;
00348   case ArTaskState::ACTIVE:
00349     str += "ACTIVE, running)";
00350     break;
00351   case ArTaskState::SUSPEND:
00352     str += "SUSPEND, NOT running)";
00353     break;
00354   case ArTaskState::SUCCESS:
00355     str += "SUCCESS, NOT running)";
00356     break;
00357   case ArTaskState::FAILURE:
00358     str += "FAILURE, NOT running)";
00359     break;
00360   default:
00361     str += state;
00362     str += ", running)";
00363     break;
00364   }
00365   ArLog::log(ArLog::Terse, const_cast<char *>(str.c_str()));
00366   for (it = myMultiMap.rbegin(); it != myMultiMap.rend(); it++)
00367     (*it).second->log(depth + 1);
00368   
00369 }
00370 

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