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 #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
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
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
00354
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 }