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

ArArg.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 "ArArg.h"
00029 #include "ArLog.h"
00030 #include "ArArgumentBuilder.h"
00031 
00032 AREXPORT ArArg::ArArg()
00033 {
00034   myType = INVALID;
00035   myName = "";
00036   myDescription = "";
00037   clear();
00038 }
00039 
00040 AREXPORT ArArg::ArArg(const char * name, int *pointer, 
00041               const char * description, int minInt, int maxInt) 
00042 { 
00043   myType = INT;
00044   myName = name; 
00045   myDescription = description;
00046   clear();
00047   myMinInt = minInt;
00048   myMaxInt = maxInt;
00049   myIntPointer = pointer;
00050 }
00051 
00052 AREXPORT ArArg::ArArg(const char * name, double *pointer,
00053               const char * description, double minDouble, 
00054               double maxDouble) 
00055 { 
00056   myType = DOUBLE;
00057   myName = name; 
00058   myDescription = description;
00059   clear();
00060   myMinDouble = minDouble;
00061   myMaxDouble = maxDouble;
00062   myDoublePointer = pointer;
00063 }
00064 
00065 AREXPORT ArArg::ArArg(const char * name, bool *pointer, 
00066               const char * description) 
00067 { 
00068   myType = BOOL;
00069   myName = name; 
00070   myDescription = description;
00071   clear();
00072   myBoolPointer = pointer;
00073 }
00074 
00075 AREXPORT ArArg::ArArg(const char * name, ArPose *pointer, 
00076               const char * description) 
00077 { 
00078   myType = POSE;
00079   myName = name; 
00080   myDescription = description;
00081   clear();
00082   myPosePointer = pointer;
00083 }
00084 
00085 AREXPORT ArArg::ArArg(const char * name, char *pointer, 
00086               const char * description, size_t maxStrLen) 
00087 { 
00088   myType = STRING;
00089   myName = name; 
00090   myDescription = description;
00091   clear();
00092   myStringPointer = pointer;
00093   myMaxStrLen = maxStrLen;
00094 }
00095 
00112 AREXPORT ArArg::ArArg(const char *name, 
00113               ArRetFunctor1<bool, ArArgumentBuilder *> *setFunctor, 
00114           ArRetFunctor<const std::list<ArArgumentBuilder *> *> *getFunctor,
00115               const char *description)
00116 {
00117   myType = FUNCTOR;
00118   myName = name;
00119   myDescription = description;
00120   clear();
00121   mySetFunctor = setFunctor;
00122   myGetFunctor = getFunctor;
00123 }
00124 
00125 AREXPORT ArArg::ArArg(const char * description)
00126 { 
00127   myType = DESCRIPTION_HOLDER;
00128   myDescription = description;
00129   clear();
00130 }
00131 
00132 AREXPORT ArArg::ArArg(const ArArg & arg) 
00133 {
00134   myType = arg.myType;
00135   myName = arg.myName;
00136   myDescription = arg.myDescription;
00137   myIntPointer = arg.myIntPointer;
00138   myDoublePointer = arg.myDoublePointer;
00139   myPosePointer = arg.myPosePointer;
00140   myBoolPointer = arg.myBoolPointer;
00141   myStringPointer = arg.myStringPointer;
00142   myMinInt = arg.myMinInt;
00143   myMaxInt = arg.myMaxInt;
00144   myMinDouble = arg.myMinDouble;
00145   myMaxDouble = arg.myMaxDouble;
00146   myMaxStrLen = arg.myMaxStrLen;
00147   mySetFunctor = arg.mySetFunctor;
00148   myGetFunctor = arg.myGetFunctor;
00149   myConfigPrioritySet = arg.myConfigPrioritySet;
00150   myConfigPriority = arg.myConfigPriority;
00151 }
00152 
00153 AREXPORT ArArg &ArArg::operator=(const ArArg & arg) 
00154 {
00155     if (this != &arg) {
00156         myType = arg.myType;
00157         myName = arg.myName;
00158         myDescription = arg.myDescription;
00159         myIntPointer = arg.myIntPointer;
00160         myDoublePointer = arg.myDoublePointer;
00161         myPosePointer = arg.myPosePointer;
00162         myBoolPointer = arg.myBoolPointer;
00163         myStringPointer = arg.myStringPointer;
00164         myMinInt = arg.myMinInt;
00165         myMaxInt = arg.myMaxInt;
00166         myMinDouble = arg.myMinDouble;
00167         myMaxDouble = arg.myMaxDouble;
00168         myMaxStrLen = arg.myMaxStrLen;
00169         mySetFunctor = arg.mySetFunctor;
00170         myGetFunctor = arg.myGetFunctor;
00171         myConfigPrioritySet = arg.myConfigPrioritySet;
00172         myConfigPriority = arg.myConfigPriority;
00173     }
00174     return *this;
00175 }
00176 
00177 
00178 AREXPORT ArArg::~ArArg()
00179 {
00180 }
00181 
00182 AREXPORT void ArArg::clear(void)
00183 {
00184   myIntPointer = NULL;
00185   myDoublePointer = NULL;
00186   myBoolPointer = NULL;
00187   myPosePointer = NULL;
00188   myStringPointer = NULL;
00189   myMinInt = INT_MIN;
00190   myMaxInt = INT_MAX;
00191   myMinDouble = -HUGE_VAL;
00192   myMaxDouble = HUGE_VAL;
00193   myMaxStrLen = 0;
00194   mySetFunctor = NULL;
00195   myGetFunctor = NULL;  
00196   myConfigPrioritySet = false;
00197   myConfigPriority = ArPriority::NORMAL;
00198 }
00199 
00206 AREXPORT ArArg::Type ArArg::getType(void) const
00207 {
00208   return myType;
00209 }
00210 
00211 AREXPORT int ArArg::getMinInt(void) const
00212 {
00213   return myMinInt;
00214 }
00215 
00216 AREXPORT int ArArg::getMaxInt(void) const
00217 {
00218   return myMaxInt;
00219 }
00220 
00221 AREXPORT double ArArg::getMinDouble(void) const
00222 {
00223   return myMinDouble;
00224 }
00225 
00226 AREXPORT double ArArg::getMaxDouble(void) const
00227 {
00228   return myMaxDouble;
00229 }
00230 
00231 AREXPORT const char *ArArg::getName(void) const
00232 {
00233   return myName.c_str();
00234 }
00235 
00236 AREXPORT const char *ArArg::getDescription(void) const
00237 {
00238   return myDescription.c_str();
00239 }
00240 
00241 AREXPORT int ArArg::getInt(void) const
00242 { 
00243   if (myIntPointer != NULL)
00244     return *myIntPointer;
00245   else
00246     return 0;
00247 }
00248 
00249 AREXPORT double ArArg::getDouble(void) const 
00250 {
00251   if (myDoublePointer != NULL)
00252     return *myDoublePointer; 
00253   else
00254     return 0;
00255 }
00256 
00257 AREXPORT bool ArArg::getBool(void) const
00258 {
00259   if (myBoolPointer != NULL)
00260     return *myBoolPointer;
00261   else
00262     return false;
00263 }
00264 
00265 AREXPORT const char *ArArg::getString(void) const
00266 {
00267   if (myStringPointer != NULL)
00268     return myStringPointer;
00269   else
00270     return NULL;
00271 }
00272 
00273 AREXPORT ArPose ArArg::getPose(void) const
00274 {
00275   ArPose pose;
00276   if (myPosePointer != NULL)
00277     return *myPosePointer;
00278   else
00279     return pose;
00280 }
00281 
00282 AREXPORT const std::list<ArArgumentBuilder *> *ArArg::getArgsWithFunctor(void) const
00283 {
00284   if (myGetFunctor == NULL)
00285     return NULL;
00286   else
00287     return myGetFunctor->invokeR();
00288 }
00289 
00290 AREXPORT bool ArArg::setInt(int val)
00291 {
00292   if (val < myMinInt)
00293   {
00294     ArLog::log(ArLog::Normal, "ArArg of %s: setInt value %d below range [%d, %d]", getName(), val, myMinInt, myMaxInt);
00295     return false;
00296   }
00297   if (val > myMaxInt)
00298   {
00299     ArLog::log(ArLog::Normal, "ArArg of %s: setInt value %d above range [%d, %d]", getName(), val, myMinInt, myMaxInt);
00300     return false;
00301   }
00302   if (myIntPointer == NULL)
00303   {
00304     ArLog::log(ArLog::Normal, "ArArg of %s: setInt called with NULL int pointer.", getName());
00305   }
00306   // if we got to here we're good
00307   *myIntPointer = val;
00308   return true;
00309 }
00310 
00311 AREXPORT bool ArArg::setDouble(double val)
00312 { 
00313   if (val < myMinDouble)
00314   {
00315     ArLog::log(ArLog::Normal, "ArArg of %s: setDouble value %g below range [%g, %g]", getName(), val, myMinDouble, myMaxDouble);
00316     return false;
00317   }
00318   if (val > myMaxDouble)
00319   {
00320     ArLog::log(ArLog::Normal, "ArArg of %s: setDouble value %g above range [%g, %g]", getName(), val, myMinDouble, myMaxDouble);
00321     return false;
00322   }
00323   if (myDoublePointer == NULL)
00324   {
00325     ArLog::log(ArLog::Normal, "ArArg of %s: setDouble called with NULL pointer.", getName());
00326     return false;
00327   }
00328   // if we got to here we're good
00329   *myDoublePointer = val;
00330   return true;
00331 }
00332 
00333 
00334 AREXPORT bool ArArg::setBool(bool val)
00335 {
00336   if (myBoolPointer == NULL)
00337   {
00338     ArLog::log(ArLog::Normal, "ArArg of %s: setBool called with NULL pointer.", getName());
00339     return false;
00340   }
00341   *myBoolPointer = val;
00342   return true;
00343 }
00344 
00345 AREXPORT bool ArArg::setString(const char *str)
00346 {
00347   size_t len;
00348   if (myStringPointer == NULL)
00349   {
00350     ArLog::log(ArLog::Normal, "ArArg of %s: setString called with NULL pointer.", getName());
00351     return false;
00352   }
00353   // this is >= so that if it wouldn't have room with NULL that's
00354   // taken care of too
00355   if ((len = strlen(str)) >= myMaxStrLen)
00356   {
00357     ArLog::log(ArLog::Normal, "ArArg of %s: setString called with argument %d long, when max length is %d.", getName(), len, myMaxStrLen);
00358     return false;
00359   }
00360   strcpy(myStringPointer, str);
00361   return true;
00362 }
00363 
00364 AREXPORT bool ArArg::setPose(ArPose pose)
00365 {
00366   if (myPosePointer == NULL)
00367   {
00368     ArLog::log(ArLog::Normal, "ArArg of %s: setPose called with NULL pointer.", getName());
00369     return false;
00370   }
00371   *myPosePointer = pose;
00372   return true;
00373 
00374 }
00375 
00376 AREXPORT bool ArArg::setArgWithFunctor(ArArgumentBuilder *argument)
00377 {
00378   if (mySetFunctor == NULL)
00379   {
00380     ArLog::log(ArLog::Normal, "ArArg of %s: setArgWithFunctor called with NULL pointer.", getName());
00381     return false;
00382   }
00383   return mySetFunctor->invokeR(argument);
00384 }
00385 
00386 
00387 AREXPORT void ArArg::log(void) const
00388 {
00389   std::list<ArArgumentBuilder *>::const_iterator it;
00390   const std::list<ArArgumentBuilder *> *argList;
00391 
00392   switch (getType()) 
00393   {
00394   case ArArg::INVALID:
00395     ArLog::log(ArLog::Terse, 
00396            "\tType: %10s.  This argument was not created properly.", 
00397            "invalid");
00398   case ArArg::INT:
00399     ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: %d", "int", 
00400            getName(), getInt());
00401     if (strlen(getDescription()) != 0)
00402       ArLog::log(ArLog::Terse, "\t\tDescription: %s",
00403          getDescription());
00404     break;
00405   case ArArg::DOUBLE:
00406     ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: %f", "double",
00407            getName(), getDouble());
00408     if (strlen(getDescription()) != 0)
00409       ArLog::log(ArLog::Terse, "\t\tDescription: %s",
00410          getDescription());
00411     break; 
00412   case ArArg::STRING:
00413     ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: %s", "string", 
00414                getName(), getString());
00415     if (strlen(getDescription()) != 0)
00416       ArLog::log(ArLog::Terse, "\t\tDescription: %s",
00417                  getDescription());
00418     break;
00419   case ArArg::BOOL:
00420     ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: %d", "bool",
00421            getName(), getBool());
00422     if (strlen(getDescription()) != 0)
00423       ArLog::log(ArLog::Terse, "\t\tDescription: %s",
00424          getDescription());
00425     break;
00426   case ArArg::POSE:
00427     ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: (%.1f %.1f %.1f)",
00428            "pose", getName(), getPose().getX(), getPose().getY(),
00429            getPose().getTh());
00430     if (strlen(getDescription()) != 0)
00431       ArLog::log(ArLog::Terse, "\t\tDescription: %s",
00432          getDescription());
00433     break;
00434   case ArArg::FUNCTOR:
00435     ArLog::log(ArLog::Terse, "\tType: %10s name: %12s", 
00436            "functor", getName(), getPose().getX(), getPose().getY(),
00437            getPose().getTh());
00438     if (strlen(getDescription()) != 0)
00439       ArLog::log(ArLog::Terse, "\t\tDescription: %s",
00440          getDescription());
00441     ArLog::log(ArLog::Terse, "\t\tValues:");
00442     argList = myGetFunctor->invokeR();
00443     for (it = argList->begin(); it != argList->end(); it++)
00444       ArLog::log(ArLog::Terse, "\t\t\t%s", (*it)->getFullString());
00445     break;
00446   case ArArg::DESCRIPTION_HOLDER:
00447     ArLog::log(ArLog::Terse, "\tType: %20s Description: %s", 
00448            "description_holder", getDescription());
00449 
00450   default:
00451     ArLog::log(ArLog::Terse, 
00452            "\tType: %10s.  This type doesn't have a case in ArArg::print.",
00453            "unknown");
00454     break;
00455   }
00456 
00457   if (myConfigPrioritySet)
00458     ArLog::log(ArLog::Terse, "\t\tPriority: %s", 
00459            ArPriority::getPriorityName(myConfigPriority));
00460 }
00461 
00466 AREXPORT bool ArArg::getConfigPrioritySet(void) const
00467 {
00468   return myConfigPrioritySet;
00469 }
00470 
00474 AREXPORT ArPriority::Priority ArArg::getConfigPriority(void) const
00475 {
00476   return myConfigPriority;
00477 }
00478 
00483 AREXPORT void ArArg::setConfigPriority(ArPriority::Priority priority)
00484 {
00485   myConfigPriority = priority;
00486   myConfigPrioritySet = true;
00487 }

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