update command_handler documentation

Improve the developer manual and primer sections which talk about
writing command handlers.  Notably, it documents the new CMD_* macros.
This commit is contained in:
Zachary T Welch 2009-11-17 05:38:17 -08:00
parent cfaf7bdd0a
commit 789d47c180
2 changed files with 22 additions and 21 deletions

View File

@ -45,16 +45,16 @@ another layer of handlers.
@subsection helpercmdhandlerdef Defining and Calling Command Handlers @subsection helpercmdhandlerdef Defining and Calling Command Handlers
These functions should be defined using the COMMAND_HANDLER macro. These functions should be defined using the @c COMMAND_HANDLER macro.
These methods must be defined as static, as their principle entry point These methods must be defined as static, as their principle entry point
should be the run_command dispatch mechanism. should be the run_command dispatch mechanism.
Command helper functions that require access to the full set of Command helper functions that require access to the full set of
parameters should be defined using the COMMAND_HELPER. These must be parameters should be defined using the @c COMMAND_HELPER. These must be
declared static by you, as sometimes you might want to share a helper declared static by you, as sometimes you might want to share a helper
among several files (e.g. s3c24xx_nand.h). among several files (e.g. @c s3c24xx_nand.h).
Both types of routines must be called using the CALL_COMMAND_HANDLER macro. Both types of routines must be called using the @c CALL_COMMAND_HANDLER macro.
Calls using this macro to normal handlers require the name of the command Calls using this macro to normal handlers require the name of the command
handler (which can a name or function pointer). Calls to helpers and handler (which can a name or function pointer). Calls to helpers and
derived handlers must pass those extra parameters specified by their derived handlers must pass those extra parameters specified by their
@ -67,22 +67,18 @@ will be able to use direct invocations.
Thus, the following macros can be used to define and call command Thus, the following macros can be used to define and call command
handlers or helpers: handlers or helpers:
- COMMAND_HANDLER - declare or define a command handler. - @c COMMAND_HANDLER - declare or define a command handler.
- COMMAND_HELPER - declare or define a derived command handler or helper. - @c COMMAND_HELPER - declare or define a derived command handler or helper.
- CALL_COMMAND_COMMAND - call a command handler/helper. - @c CALL_COMMAND_COMMAND - call a command handler/helper.
@subsection helpercmdhandlerparam Command Handler Parameters
The following parameters are defined in the scope of all command
handlers and helpers:
- <code>struct command_context *cmd_ctx</code> - the command's context
- <code>unsigned argc</code> - the number of command arguments
- <code>const char *args[]</code> - contains the command arguments
@subsection helpercmdhandlermacros Command Handler Macros @subsection helpercmdhandlermacros Command Handler Macros
In addition, the following macro may be used: In addition, the following macros may be used in the context of
- <code>COMMAND_NAME</code> - contains the command name command handlers and helpers:
- @c CMD_CTX - the current @c command_context
- @c CMD_NAME - invoked command name
- @c CMD_ARGC - the number of command arguments
- @c CMD_ARGV - array of command argument strings
@section helpercmdprimer Command Development Primer @section helpercmdprimer Command Development Primer

View File

@ -16,7 +16,7 @@ COMMAND_HANDLER(handle_hello_command)
const char *sep, *name; const char *sep, *name;
int retval = CALL_COMMAND_HANDLER(handle_hello_args); int retval = CALL_COMMAND_HANDLER(handle_hello_args);
if (ERROR_OK == retval) if (ERROR_OK == retval)
command_print(cmd_ctx, "Greetings%s%s!", sep, name); command_print(CMD_CTX, "Greetings%s%s!", sep, name);
return retval; return retval;
} }
@endcode @endcode
@ -39,13 +39,13 @@ static COMMAND_HELPER(handle_hello_args, const char **sep, const char **name)
{ {
if (argc > 1) if (argc > 1)
{ {
LOG_ERROR("%s: too many arguments", COMMAND_NAME); LOG_ERROR("%s: too many arguments", CMD_NAME);
return ERROR_COMMAND_SYNTAX_ERROR; return ERROR_COMMAND_SYNTAX_ERROR;
} }
if (1 == argc) if (1 == CMD_ARGC)
{ {
*sep = ", "; *sep = ", ";
*name = args[0]; *name = CMD_ARGV[0];
} }
else else
*sep = *name = ""; *sep = *name = "";
@ -96,4 +96,9 @@ Greetings, John Doe!
Error: ocd_hello: too many arguments Error: ocd_hello: too many arguments
@endcode @endcode
This difference between the registered and displayed command name comes from
the fact that the TCL scripts are provided with a stub that calls the munged
name. This stub wraps the internal <code>ocd_</code>-prefixed routine,
providing a measure of high-level error handling.
*/ */