49 #ifndef _DYNASHELL_CMD_H 50 #define _DYNASHELL_CMD_H 60 #include "rnr/rnrconfig.h" 89 #define TRY(boolexpr, ...) do { if( !(boolexpr) ) { return; } } while(0) 96 m_nArgCntMin(nArgCntMin),
97 m_nArgCntMax(nArgCntMax)
100 m_sCmdHelpBrief =
"";
133 virtual void Exec(
DynaShell &shell,
int argc,
char *argv[]) = 0;
135 virtual void PrintHelp(
int indent=0,
int width=80);
167 m_nPubLevel = nLevel;
169 if( m_sPubName != NULL )
173 if( sParent == NULL )
175 m_sPubName =
newstr(m_sCmdName);
179 m_sPubName =
new char[strlen(sParent)+1+strlen(m_sCmdName)+1];
180 sprintf(m_sPubName,
"%s %s", sParent, m_sCmdName);
203 const char *sContext)
221 if( (m_nArgCntMin == 0) && (m_nArgCntMax == 0) )
223 return ChkArgCnt0(shell, argc);
225 else if( m_nArgCntMin == m_nArgCntMax )
227 return ChkArgCntEQ(shell, argc, m_nArgCntMin);
230 if( (m_nArgCntMin > 0) && !ChkArgCntGE(shell, argc, m_nArgCntMin) )
235 if( (m_nArgCntMax > 0) && !ChkArgCntLE(shell, argc, m_nArgCntMax) )
257 shell.
Error(
"Command has no arguments.");
278 shell.
Error(
"Argument count %d != required %d.", argc, eq);
299 shell.
Error(
"Argument count %d < minimum %d.", argc, min);
320 shell.
Error(
"Argument count %d > maximum %d.", argc, max);
339 shell.
Error(
"No open dynamixel communication.");
358 shell.
Error(
"No dynamixel chain.");
375 if( !ChkChain(shell) )
382 shell.
Error(
"No servos in dynamixel chain. Try scanning.");
400 if( !ChkChainNotEmpty(shell) )
407 shell.
Error(
"Servo %d not found in chain.", nServoId);
425 if( !ChkChainHasServo(shell, nServoId) )
432 shell.
Error(
"Servo %d not a master.", nServoId);
452 *pVal = (int)strtol(sArg, &t, 0);
456 shell.
Error(
"Argument value \"%s\": Not an integer.", sArg);
474 return ToInt(shell, sArg, (
int *)pVal);
489 if( sscanf(sArg,
"%lf", pVal) != 1 )
491 shell.
Error(
"Argument value \"%s\": Not a floating-point number.", sArg);
512 if( !strcasecmp(sArg,
"t") || !strcasecmp(sArg,
"true") )
517 else if( !strcasecmp(sArg,
"f") || !strcasecmp(sArg,
"false") )
523 i = (int)strtol(sArg, &t, 0);
527 shell.
Error(
"Argument value \"%s\": Not an boolean.", sArg);
531 *pVal = i?
true:
false;
546 virtual void PrintSynopses(
int indent,
int width);
547 virtual void PrintBlock(
int col,
int indent,
int width,
const char *sText);
548 virtual void PrintDelim(
int width,
const char cDelim);
549 char *eow(
const char *s);
585 m_bMasterOpOnly = bMasterOpOnly;
594 virtual void Exec(
DynaShell &shell,
int argc,
char *argv[]);
596 virtual char *TabCompletion(
DynaShell &shell,
600 const char *sContext);
663 m_bMasterOpOnly = bMasterOpOnly;
671 virtual void Exec(
DynaShell &shell,
int argc,
char *argv[]);
673 virtual char *TabCompletion(
DynaShell &shell,
677 const char *sContext);
705 return ToUInt(shell, sArg, pVal);
708 virtual bool ArgToInt(
DynaShell &shell,
const char *sArg,
int *pVal)
710 return ToInt(shell, sArg, pVal);
725 #endif // _DYNASHELL_CMD_H const char * m_sCmdName
command name
RoadNarrows Dynamixel Bus Communications Abstract Base Class Interface.
char * newstr(const char *s)
Allocate new duplicated string.
virtual bool ArgToUInt(DynaShell &shell, const char *sArg, uint_t *pVal)
Convert command argument into unsigned integer.
void PublishShellServoCommands(DynaShell &shell)
Publish shell servo commands to shell.
DynaShellCmdChainOut(bool bMasterOpOnly=false)
Default constructor.
bool ChkChainNotEmpty(DynaShell &shell)
Check that the servo chain exists and is not empty.
bool ChkArgCntEQ(DynaShell &shell, int argc, int eq)
Check that the argument count is equal to the required.
bool ChkChain(DynaShell &shell)
Check that the servo chain exists.
void PublishShellInterfaceCommands(DynaShell &shell)
Publish shell dynamixel interface commands to shell.
DynaComm * m_pDynaComm
dynamixel bus communication
virtual bool IsOpen()
Test if Dynamixel Bus is open.
virtual char * TabCompletion(DynaShell &shell, const char *sText, size_t uTextLen, int nState, const char *sContext)
Default command tab completion generator.
void PublishShellTrainCommands(DynaShell &shell)
Publish shell servo commands to shell.
bool ChkChainHasServo(DynaShell &shell, int nServoId)
Check that the given servo is present in the chain.
RoadNarrows Dynamixel Servo Chain Container Base Class Interface.
int m_nPubLevel
command's published level (depth)
const char * m_sCmdHelpDesc
command help description
Dynamixel shell command abstract base class.
bool ChkChainIsMasterServo(DynaShell &shell, int nServoId)
Check that the given servo is a master.
#define DYNA_ID_NUMOF
number of unique servo id's
virtual ~DynaShellCmdChainIn()
Default destructor.
bool ChkArgCnt0(DynaShell &shell, int argc)
Check that the argument count is zero.
virtual uint_t GetNumberInChain() const
Get the number of servos currently in chain.
DynaShellCmd(int nArgCntMin=0, int nArgCntMax=0)
Default constructor.
Dynamixel Servo Abstract Base Class.
bool ToInt(DynaShell &shell, const char *sArg, int *pVal)
Convert command argument to integer.
Execute 2-tuple structure type.
const int m_nArgCntMax
maximum argument count (0 if not max)
void PublishShellCoreCommands(DynaShell &shell)
Publish shell core commands to shell.
int m_nTabIter
tab completion: servo id iterator
bool ToBool(DynaShell &shell, const char *sArg, bool *pVal)
Convert command argument to boolean.
char * m_sPubName
command's published name
int SetPublishedInfo(int nLevel, const char *sParent=NULL)
bool IsMaster() const
Test if this servo is a master.
bool m_bMasterOpOnly
is [not] a master-only supported operation
bool ToDouble(DynaShell &shell, const char *sArg, double *pVal)
Convert command argument to double.
const char * m_sCmdHelpBrief
command help brief
virtual DynaServo * GetServo(int nServoId)
virtual bool ChkArgCnt(DynaShell &shell, int argc)
Check that the argument count is within the class (min,max).
int GetPublishedLevel() const
const char * GetCmdName()
Get dynamixel shell command name.
virtual bool HasServo(int nServoId) const
RoadNarrows Dynamixel Archetype Servo Abstract Base Class.
virtual ~DynaShellCmd()
Default destructor.
Dynamixel chain input command abstract base class.
const char * m_sCmdHelpArgs
command help arguments
RoadNarrows Dynamixel Top-Level Package Header File.
bool ChkComm(DynaShell &shell)
Check that Dynamixel communication exists and is open.
const char * GetCmdHelpBrief()
Get shell command name brief description.
Dynamixel chain output command abstract base class.
int m_nTabIter
tab completion: servo id iterator
const int m_nArgCntMin
minimum argument count
const char * GetPublishedName() const
int m_nTabServoId
tab completion: current servo id
bool m_bTabIncChain
tab completion: [do not] include chain keyword
bool ChkArgCntGE(DynaShell &shell, int argc, int min)
Check argument count against minimum required.
DynaChain * m_pDynaChain
dynamixel chain
void Error(int rc, const char *sFmt,...)
Raise error on dynamixel error code.
bool ToUInt(DynaShell &shell, const char *sArg, uint_t *pVal)
Convert command argument to unsigned integer.
bool m_bMasterOpOnly
is [not] a master-only supported operation
virtual ~DynaShellCmdChainOut()
Default destructor.
The simple dynashell declarations.
bool m_bTabIncChain
tab completion: [do not] include chain keyword
bool ChkArgCntLE(DynaShell &shell, int argc, int max)
Check argument count against maximum allowed.
int m_nTabServoId
tab completion: current servo id
DynaShellCmdChainIn(bool bMasterOpOnly=false)
Default constructor.