rosaria/Legacy/Aria/src/ArArg.cpp
2021-12-16 14:07:59 +00:00

488 lines
12 KiB
C++

/*
Adept MobileRobots Robotics Interface for Applications (ARIA)
Copyright (C) 2004, 2005 ActivMedia Robotics LLC
Copyright (C) 2006, 2007, 2008, 2009, 2010 MobileRobots Inc.
Copyright (C) 2011, 2012, 2013 Adept Technology
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
If you wish to redistribute ARIA under different terms, contact
Adept MobileRobots for information about a commercial version of ARIA at
robots@mobilerobots.com or
Adept MobileRobots, 10 Columbia Drive, Amherst, NH 03031; +1-603-881-7960
*/
#include "ArExport.h"
#include "ariaOSDef.h"
#include "ArArg.h"
#include "ArLog.h"
#include "ArArgumentBuilder.h"
AREXPORT ArArg::ArArg()
{
myType = INVALID;
myName = "";
myDescription = "";
clear();
}
AREXPORT ArArg::ArArg(const char * name, int *pointer,
const char * description, int minInt, int maxInt)
{
myType = INT;
myName = name;
myDescription = description;
clear();
myMinInt = minInt;
myMaxInt = maxInt;
myIntPointer = pointer;
}
AREXPORT ArArg::ArArg(const char * name, double *pointer,
const char * description, double minDouble,
double maxDouble)
{
myType = DOUBLE;
myName = name;
myDescription = description;
clear();
myMinDouble = minDouble;
myMaxDouble = maxDouble;
myDoublePointer = pointer;
}
AREXPORT ArArg::ArArg(const char * name, bool *pointer,
const char * description)
{
myType = BOOL;
myName = name;
myDescription = description;
clear();
myBoolPointer = pointer;
}
AREXPORT ArArg::ArArg(const char * name, ArPose *pointer,
const char * description)
{
myType = POSE;
myName = name;
myDescription = description;
clear();
myPosePointer = pointer;
}
AREXPORT ArArg::ArArg(const char * name, char *pointer,
const char * description, size_t maxStrLen)
{
myType = STRING;
myName = name;
myDescription = description;
clear();
myStringPointer = pointer;
myMaxStrLen = maxStrLen;
}
/**
This constructor is for the functor type of argument, this is for
cases that need to be complicated and have more than one argument
value per name, such as the sonar in a config file, and where this data
needs to be used to construct compound data structures rather than
single variables.
@param name argument name
@param description argument description
@param setFunctor when an argument is read it is passed to this
functor which should set up whatever it needs to from the data
@param getFunctor since parameter files need to be written too,
this get functor will get a list of strings to be written to the file
**/
AREXPORT ArArg::ArArg(const char *name,
ArRetFunctor1<bool, ArArgumentBuilder *> *setFunctor,
ArRetFunctor<const std::list<ArArgumentBuilder *> *> *getFunctor,
const char *description)
{
myType = FUNCTOR;
myName = name;
myDescription = description;
clear();
mySetFunctor = setFunctor;
myGetFunctor = getFunctor;
}
AREXPORT ArArg::ArArg(const char * description)
{
myType = DESCRIPTION_HOLDER;
myDescription = description;
clear();
}
AREXPORT ArArg::ArArg(const ArArg & arg)
{
myType = arg.myType;
myName = arg.myName;
myDescription = arg.myDescription;
myIntPointer = arg.myIntPointer;
myDoublePointer = arg.myDoublePointer;
myPosePointer = arg.myPosePointer;
myBoolPointer = arg.myBoolPointer;
myStringPointer = arg.myStringPointer;
myMinInt = arg.myMinInt;
myMaxInt = arg.myMaxInt;
myMinDouble = arg.myMinDouble;
myMaxDouble = arg.myMaxDouble;
myMaxStrLen = arg.myMaxStrLen;
mySetFunctor = arg.mySetFunctor;
myGetFunctor = arg.myGetFunctor;
myConfigPrioritySet = arg.myConfigPrioritySet;
myConfigPriority = arg.myConfigPriority;
}
AREXPORT ArArg &ArArg::operator=(const ArArg & arg)
{
if (this != &arg) {
myType = arg.myType;
myName = arg.myName;
myDescription = arg.myDescription;
myIntPointer = arg.myIntPointer;
myDoublePointer = arg.myDoublePointer;
myPosePointer = arg.myPosePointer;
myBoolPointer = arg.myBoolPointer;
myStringPointer = arg.myStringPointer;
myMinInt = arg.myMinInt;
myMaxInt = arg.myMaxInt;
myMinDouble = arg.myMinDouble;
myMaxDouble = arg.myMaxDouble;
myMaxStrLen = arg.myMaxStrLen;
mySetFunctor = arg.mySetFunctor;
myGetFunctor = arg.myGetFunctor;
myConfigPrioritySet = arg.myConfigPrioritySet;
myConfigPriority = arg.myConfigPriority;
}
return *this;
}
AREXPORT ArArg::~ArArg()
{
}
AREXPORT void ArArg::clear(void)
{
myIntPointer = NULL;
myDoublePointer = NULL;
myBoolPointer = NULL;
myPosePointer = NULL;
myStringPointer = NULL;
myMinInt = INT_MIN;
myMaxInt = INT_MAX;
myMinDouble = -HUGE_VAL;
myMaxDouble = HUGE_VAL;
myMaxStrLen = 0;
mySetFunctor = NULL;
myGetFunctor = NULL;
myConfigPrioritySet = false;
myConfigPriority = ArPriority::NORMAL;
}
/**
@see INVALID
@see INT
@see DOUBLE
@see BOOL
@see POSE */
AREXPORT ArArg::Type ArArg::getType(void) const
{
return myType;
}
AREXPORT int ArArg::getMinInt(void) const
{
return myMinInt;
}
AREXPORT int ArArg::getMaxInt(void) const
{
return myMaxInt;
}
AREXPORT double ArArg::getMinDouble(void) const
{
return myMinDouble;
}
AREXPORT double ArArg::getMaxDouble(void) const
{
return myMaxDouble;
}
AREXPORT const char *ArArg::getName(void) const
{
return myName.c_str();
}
AREXPORT const char *ArArg::getDescription(void) const
{
return myDescription.c_str();
}
AREXPORT int ArArg::getInt(void) const
{
if (myIntPointer != NULL)
return *myIntPointer;
else
return 0;
}
AREXPORT double ArArg::getDouble(void) const
{
if (myDoublePointer != NULL)
return *myDoublePointer;
else
return 0;
}
AREXPORT bool ArArg::getBool(void) const
{
if (myBoolPointer != NULL)
return *myBoolPointer;
else
return false;
}
AREXPORT const char *ArArg::getString(void) const
{
if (myStringPointer != NULL)
return myStringPointer;
else
return NULL;
}
AREXPORT ArPose ArArg::getPose(void) const
{
ArPose pose;
if (myPosePointer != NULL)
return *myPosePointer;
else
return pose;
}
AREXPORT const std::list<ArArgumentBuilder *> *ArArg::getArgsWithFunctor(void) const
{
if (myGetFunctor == NULL)
return NULL;
else
return myGetFunctor->invokeR();
}
AREXPORT bool ArArg::setInt(int val)
{
if (val < myMinInt)
{
ArLog::log(ArLog::Normal, "ArArg of %s: setInt value %d below range [%d, %d]", getName(), val, myMinInt, myMaxInt);
return false;
}
if (val > myMaxInt)
{
ArLog::log(ArLog::Normal, "ArArg of %s: setInt value %d above range [%d, %d]", getName(), val, myMinInt, myMaxInt);
return false;
}
if (myIntPointer == NULL)
{
ArLog::log(ArLog::Normal, "ArArg of %s: setInt called with NULL int pointer.", getName());
}
// if we got to here we're good
*myIntPointer = val;
return true;
}
AREXPORT bool ArArg::setDouble(double val)
{
if (val < myMinDouble)
{
ArLog::log(ArLog::Normal, "ArArg of %s: setDouble value %g below range [%g, %g]", getName(), val, myMinDouble, myMaxDouble);
return false;
}
if (val > myMaxDouble)
{
ArLog::log(ArLog::Normal, "ArArg of %s: setDouble value %g above range [%g, %g]", getName(), val, myMinDouble, myMaxDouble);
return false;
}
if (myDoublePointer == NULL)
{
ArLog::log(ArLog::Normal, "ArArg of %s: setDouble called with NULL pointer.", getName());
return false;
}
// if we got to here we're good
*myDoublePointer = val;
return true;
}
AREXPORT bool ArArg::setBool(bool val)
{
if (myBoolPointer == NULL)
{
ArLog::log(ArLog::Normal, "ArArg of %s: setBool called with NULL pointer.", getName());
return false;
}
*myBoolPointer = val;
return true;
}
AREXPORT bool ArArg::setString(const char *str)
{
size_t len;
if (myStringPointer == NULL)
{
ArLog::log(ArLog::Normal, "ArArg of %s: setString called with NULL pointer.", getName());
return false;
}
// this is >= so that if it wouldn't have room with NULL that's
// taken care of too
if ((len = strlen(str)) >= myMaxStrLen)
{
ArLog::log(ArLog::Normal, "ArArg of %s: setString called with argument %d long, when max length is %d.", getName(), len, myMaxStrLen);
return false;
}
strcpy(myStringPointer, str);
return true;
}
AREXPORT bool ArArg::setPose(ArPose pose)
{
if (myPosePointer == NULL)
{
ArLog::log(ArLog::Normal, "ArArg of %s: setPose called with NULL pointer.", getName());
return false;
}
*myPosePointer = pose;
return true;
}
AREXPORT bool ArArg::setArgWithFunctor(ArArgumentBuilder *argument)
{
if (mySetFunctor == NULL)
{
ArLog::log(ArLog::Normal, "ArArg of %s: setArgWithFunctor called with NULL pointer.", getName());
return false;
}
return mySetFunctor->invokeR(argument);
}
AREXPORT void ArArg::log(void) const
{
std::list<ArArgumentBuilder *>::const_iterator it;
const std::list<ArArgumentBuilder *> *argList;
switch (getType())
{
case ArArg::INVALID:
ArLog::log(ArLog::Terse,
"\tType: %10s. This argument was not created properly.",
"invalid");
case ArArg::INT:
ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: %d", "int",
getName(), getInt());
if (strlen(getDescription()) != 0)
ArLog::log(ArLog::Terse, "\t\tDescription: %s",
getDescription());
break;
case ArArg::DOUBLE:
ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: %f", "double",
getName(), getDouble());
if (strlen(getDescription()) != 0)
ArLog::log(ArLog::Terse, "\t\tDescription: %s",
getDescription());
break;
case ArArg::STRING:
ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: %s", "string",
getName(), getString());
if (strlen(getDescription()) != 0)
ArLog::log(ArLog::Terse, "\t\tDescription: %s",
getDescription());
break;
case ArArg::BOOL:
ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: %d", "bool",
getName(), getBool());
if (strlen(getDescription()) != 0)
ArLog::log(ArLog::Terse, "\t\tDescription: %s",
getDescription());
break;
case ArArg::POSE:
ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: (%.1f %.1f %.1f)",
"pose", getName(), getPose().getX(), getPose().getY(),
getPose().getTh());
if (strlen(getDescription()) != 0)
ArLog::log(ArLog::Terse, "\t\tDescription: %s",
getDescription());
break;
case ArArg::FUNCTOR:
ArLog::log(ArLog::Terse, "\tType: %10s name: %12s",
"functor", getName(), getPose().getX(), getPose().getY(),
getPose().getTh());
if (strlen(getDescription()) != 0)
ArLog::log(ArLog::Terse, "\t\tDescription: %s",
getDescription());
ArLog::log(ArLog::Terse, "\t\tValues:");
argList = myGetFunctor->invokeR();
for (it = argList->begin(); it != argList->end(); it++)
ArLog::log(ArLog::Terse, "\t\t\t%s", (*it)->getFullString());
break;
case ArArg::DESCRIPTION_HOLDER:
ArLog::log(ArLog::Terse, "\tType: %20s Description: %s",
"description_holder", getDescription());
default:
ArLog::log(ArLog::Terse,
"\tType: %10s. This type doesn't have a case in ArArg::print.",
"unknown");
break;
}
if (myConfigPrioritySet)
ArLog::log(ArLog::Terse, "\t\tPriority: %s",
ArPriority::getPriorityName(myConfigPriority));
}
/**
If this is true then the config priority is set and you can use
getConfigPriority.
**/
AREXPORT bool ArArg::getConfigPrioritySet(void) const
{
return myConfigPrioritySet;
}
/**
The priority of this argument when used in ArConfig.
**/
AREXPORT ArPriority::Priority ArArg::getConfigPriority(void) const
{
return myConfigPriority;
}
/**
The priority of this argument when used in ArConfig.
**/
AREXPORT void ArArg::setConfigPriority(ArPriority::Priority priority)
{
myConfigPriority = priority;
myConfigPrioritySet = true;
}