shell: creating new module for help functionality

1. Created new shell module: shell_help.
2. Simplified command handlers with new shell print macros.
3. Removed help functions from command handlers.

Signed-off-by: Jakub Rzeszutko <jakub.rzeszutko@nordicsemi.no>
This commit is contained in:
Jakub Rzeszutko 2018-11-26 17:09:56 +01:00 committed by Carles Cufí
commit 3064ca4f2f
27 changed files with 686 additions and 956 deletions

View file

@ -41,6 +41,7 @@
"Disable shell echo. Editing keys and meta-keys are not handled"
#define SHELL_HELP_SHELL "Useful, not Unix-like shell commands."
#define SHELL_HELP_HELP "Prints help message."
#define SHELL_MSG_UNKNOWN_PARAMETER " unknown parameter: "
@ -96,7 +97,7 @@ static int cursor_position_get(const struct shell *shell, u16_t *x, u16_t *y)
/* Index start position in the buffer where 'y'
* is stored.
*/
buff_idx = 2U;
buff_idx = 2;
while (shell->ctx->temp_buff[buff_idx] != ';') {
*y = *y * 10 +
@ -184,157 +185,84 @@ static int cmd_clear(const struct shell *shell, size_t argc, char **argv)
{
ARG_UNUSED(argv);
int ret = shell_cmd_precheck(shell, (argc == 1));
if (ret) {
return ret;
}
SHELL_VT100_CMD(shell, SHELL_VT100_CURSORHOME);
SHELL_VT100_CMD(shell, SHELL_VT100_CLEARSCREEN);
return 0;
}
static int cmd_shell(const struct shell *shell, size_t argc, char **argv)
{
int ret = shell_cmd_precheck(shell, (argc == 2));
if (ret) {
return ret;
}
shell_fprintf(shell, SHELL_ERROR, "%s:%s%s\n", argv[0],
SHELL_MSG_UNKNOWN_PARAMETER, argv[1]);
return -EINVAL;
}
static int cmd_bacskpace_mode_backspace(const struct shell *shell, size_t argc,
char **argv)
{
ARG_UNUSED(argc);
ARG_UNUSED(argv);
int ret = shell_cmd_precheck(shell, (argc == 1));
shell->ctx->internal.flags.mode_delete = 0;
if (ret == 0) {
shell->ctx->internal.flags.mode_delete = 0;
}
return ret;
return 0;
}
static int cmd_bacskpace_mode_delete(const struct shell *shell, size_t argc,
char **argv)
{
ARG_UNUSED(argc);
ARG_UNUSED(argv);
int ret = shell_cmd_precheck(shell, (argc == 1));
shell->ctx->internal.flags.mode_delete = 1;
if (ret == 0) {
shell->ctx->internal.flags.mode_delete = 1;
}
return ret;
}
static int cmd_bacskpace_mode(const struct shell *shell, size_t argc,
char **argv)
{
int ret = shell_cmd_precheck(shell, (argc == 2));
if (ret) {
return ret;
}
shell_fprintf(shell, SHELL_ERROR, "%s:%s%s\n", argv[0],
SHELL_MSG_UNKNOWN_PARAMETER, argv[1]);
return -EINVAL;
return 0;
}
static int cmd_colors_off(const struct shell *shell, size_t argc, char **argv)
{
ARG_UNUSED(argc);
ARG_UNUSED(argv);
int ret = shell_cmd_precheck(shell, (argc == 1));
shell->ctx->internal.flags.use_colors = 0;
if (ret == 0) {
shell->ctx->internal.flags.use_colors = 0;
}
return ret;
return 0;
}
static int cmd_colors_on(const struct shell *shell, size_t argc, char **argv)
{
ARG_UNUSED(argv);
ARG_UNUSED(argv);
int ret = shell_cmd_precheck(shell, (argc == 1));
shell->ctx->internal.flags.use_colors = 1;
if (ret == 0) {
shell->ctx->internal.flags.use_colors = 1;
}
return ret;
}
static int cmd_colors(const struct shell *shell, size_t argc, char **argv)
{
int ret = shell_cmd_precheck(shell, (argc == 2));
if (ret) {
return ret;
}
shell_fprintf(shell, SHELL_ERROR, "%s:%s%s\n", argv[0],
SHELL_MSG_UNKNOWN_PARAMETER, argv[1]);
return -EINVAL;
return 0;
}
static int cmd_echo_off(const struct shell *shell, size_t argc, char **argv)
{
ARG_UNUSED(argc);
ARG_UNUSED(argv);
int ret = shell_cmd_precheck(shell, (argc == 1));
shell->ctx->internal.flags.echo = 0;
if (ret == 0) {
shell->ctx->internal.flags.echo = 0;
}
return ret;
return 0;
}
static int cmd_echo_on(const struct shell *shell, size_t argc, char **argv)
{
ARG_UNUSED(argc);
ARG_UNUSED(argv);
int ret = shell_cmd_precheck(shell, (argc == 1));
shell->ctx->internal.flags.echo = 1;
if (ret == 0) {
shell->ctx->internal.flags.echo = 1;
}
return ret;
return 0;
}
static int cmd_echo(const struct shell *shell, size_t argc, char **argv)
{
int ret = shell_cmd_precheck(shell, (argc <= 2));
if (ret) {
return ret;
}
if (argc == 2) {
shell_fprintf(shell, SHELL_ERROR, "%s:%s%s\n", argv[0],
SHELL_MSG_UNKNOWN_PARAMETER, argv[1]);
shell_error(shell, "%s:%s%s", argv[0],
SHELL_MSG_UNKNOWN_PARAMETER, argv[1]);
return -EINVAL;
}
shell_fprintf(shell, SHELL_NORMAL, "Echo status: %s\n",
flag_echo_is_set(shell) ? "on" : "off");
shell_print(shell, "Echo status: %s",
flag_echo_is_set(shell) ? "on" : "off");
return 0;
}
@ -344,42 +272,36 @@ static int cmd_help(const struct shell *shell, size_t argc, char **argv)
ARG_UNUSED(argc);
ARG_UNUSED(argv);
shell_fprintf(shell, SHELL_NORMAL,
shell_print(shell,
"Please press the <Tab> button to see all available commands.\n"
"You can also use the <Tab> button to prompt or auto-complete"
" all commands or its subcommands.\n"
"You can try to call commands with <-h> or <--help> parameter"
" for more information.\n");
" for more information.");
return 0;
}
static int cmd_history(const struct shell *shell, size_t argc, char **argv)
{
ARG_UNUSED(argc);
ARG_UNUSED(argv);
size_t i = 0;
size_t len;
int ret;
if (!IS_ENABLED(CONFIG_SHELL_HISTORY)) {
shell_fprintf(shell, SHELL_ERROR, SHELL_MSG_CMD_NOT_SUPPORTED);
shell_error(shell, "Command not supported.");
return -ENOEXEC;
}
ret = shell_cmd_precheck(shell, (argc == 1));
if (ret) {
return ret;
}
while (1) {
shell_history_get(shell->history, true,
shell->ctx->temp_buff, &len);
if (len) {
shell_fprintf(shell, SHELL_NORMAL, "[%3d] %s\n",
i++, shell->ctx->temp_buff);
shell_print(shell, "[%3d] %s",
i++, shell->ctx->temp_buff);
} else {
break;
@ -394,72 +316,46 @@ static int cmd_history(const struct shell *shell, size_t argc, char **argv)
static int cmd_shell_stats_show(const struct shell *shell, size_t argc,
char **argv)
{
ARG_UNUSED(argc);
ARG_UNUSED(argv);
if (!IS_ENABLED(CONFIG_SHELL_STATS)) {
shell_fprintf(shell, SHELL_ERROR, SHELL_MSG_CMD_NOT_SUPPORTED);
shell_error(shell, "Command not supported.");
return -ENOEXEC;
}
int ret = shell_cmd_precheck(shell, (argc == 1));
shell_print(shell, "Lost logs: %u", shell->stats->log_lost_cnt);
if (ret == 0) {
shell_fprintf(shell, SHELL_NORMAL, "Lost logs: %u\n",
shell->stats->log_lost_cnt);
}
return ret;
return 0;
}
static int cmd_shell_stats_reset(const struct shell *shell,
size_t argc, char **argv)
{
ARG_UNUSED(argc);
ARG_UNUSED(argv);
if (!IS_ENABLED(CONFIG_SHELL_STATS)) {
shell_fprintf(shell, SHELL_ERROR, SHELL_MSG_CMD_NOT_SUPPORTED);
shell_error(shell, "Command not supported.");
return -ENOEXEC;
}
int ret = shell_cmd_precheck(shell, (argc == 1));
shell->stats->log_lost_cnt = 0;
if (ret == 0) {
shell->stats->log_lost_cnt = 0;
}
return ret;
}
static int cmd_shell_stats(const struct shell *shell, size_t argc, char **argv)
{
ARG_UNUSED(argc);
if (argc == 1) {
shell_help_print(shell);
} else {
shell_fprintf(shell, SHELL_ERROR, "%s:%s%s\n", argv[0],
SHELL_MSG_UNKNOWN_PARAMETER, argv[1]);
}
return -EINVAL;
return 0;
}
static int cmd_resize_default(const struct shell *shell,
size_t argc, char **argv)
{
ARG_UNUSED(argc);
ARG_UNUSED(argv);
int ret = shell_cmd_precheck(shell, (argc == 1));
SHELL_VT100_CMD(shell, SHELL_VT100_SETCOL_80);
shell->ctx->vt100_ctx.cons.terminal_wid = SHELL_DEFAULT_TERMINAL_WIDTH;
shell->ctx->vt100_ctx.cons.terminal_hei = SHELL_DEFAULT_TERMINAL_HEIGHT;
if (ret == 0) {
SHELL_VT100_CMD(shell, SHELL_VT100_SETCOL_80);
shell->ctx->vt100_ctx.cons.terminal_wid =
SHELL_DEFAULT_TERMINAL_WIDTH;
shell->ctx->vt100_ctx.cons.terminal_hei =
SHELL_DEFAULT_TERMINAL_HEIGHT;
}
return ret;
return 0;
}
static int cmd_resize(const struct shell *shell, size_t argc, char **argv)
@ -467,18 +363,13 @@ static int cmd_resize(const struct shell *shell, size_t argc, char **argv)
int err;
if (!IS_ENABLED(CONFIG_SHELL_CMDS_RESIZE)) {
shell_fprintf(shell, SHELL_ERROR, SHELL_MSG_CMD_NOT_SUPPORTED);
shell_error(shell, "Command not supported.");
return -ENOEXEC;
}
err = shell_cmd_precheck(shell, (argc <= 2));
if (err) {
return err;
}
if (argc != 1) {
shell_fprintf(shell, SHELL_ERROR, "%s:%s%s\n", argv[0],
SHELL_MSG_UNKNOWN_PARAMETER, argv[1]);
shell_error(shell, "%s:%s%s", argv[0],
SHELL_MSG_UNKNOWN_PARAMETER, argv[1]);
return -EINVAL;
}
@ -488,9 +379,8 @@ static int cmd_resize(const struct shell *shell, size_t argc, char **argv)
SHELL_DEFAULT_TERMINAL_WIDTH;
shell->ctx->vt100_ctx.cons.terminal_hei =
SHELL_DEFAULT_TERMINAL_HEIGHT;
shell_fprintf(shell, SHELL_WARNING,
"No response from the terminal, assumed 80x24 "
"screen size\n");
shell_warn(shell, "No response from the terminal, assumed 80x24"
" screen size");
return -ENOEXEC;
}
@ -499,54 +389,56 @@ static int cmd_resize(const struct shell *shell, size_t argc, char **argv)
SHELL_CREATE_STATIC_SUBCMD_SET(m_sub_colors)
{
SHELL_CMD(off, NULL, SHELL_HELP_COLORS_OFF, cmd_colors_off),
SHELL_CMD(on, NULL, SHELL_HELP_COLORS_ON, cmd_colors_on),
SHELL_CMD_ARG(off, NULL, SHELL_HELP_COLORS_OFF, cmd_colors_off, 1, 0),
SHELL_CMD_ARG(on, NULL, SHELL_HELP_COLORS_ON, cmd_colors_on, 1, 0),
SHELL_SUBCMD_SET_END
};
SHELL_CREATE_STATIC_SUBCMD_SET(m_sub_echo)
{
SHELL_CMD(off, NULL, SHELL_HELP_ECHO_OFF, cmd_echo_off),
SHELL_CMD(on, NULL, SHELL_HELP_ECHO_ON, cmd_echo_on),
SHELL_CMD_ARG(off, NULL, SHELL_HELP_ECHO_OFF, cmd_echo_off, 1, 0),
SHELL_CMD_ARG(on, NULL, SHELL_HELP_ECHO_ON, cmd_echo_on, 1, 0),
SHELL_SUBCMD_SET_END
};
SHELL_CREATE_STATIC_SUBCMD_SET(m_sub_shell_stats)
{
SHELL_CMD(reset, NULL, SHELL_HELP_STATISTICS_RESET,
cmd_shell_stats_reset),
SHELL_CMD(show, NULL, SHELL_HELP_STATISTICS_SHOW, cmd_shell_stats_show),
SHELL_CMD_ARG(reset, NULL, SHELL_HELP_STATISTICS_RESET,
cmd_shell_stats_reset, 1, 0),
SHELL_CMD_ARG(show, NULL, SHELL_HELP_STATISTICS_SHOW,
cmd_shell_stats_show, 1, 0),
SHELL_SUBCMD_SET_END
};
SHELL_CREATE_STATIC_SUBCMD_SET(m_sub_backspace_mode)
{
SHELL_CMD(backspace, NULL, SHELL_HELP_BACKSPACE_MODE_BACKSPACE,
cmd_bacskpace_mode_backspace),
SHELL_CMD(delete, NULL, SHELL_HELP_BACKSPACE_MODE_DELETE,
cmd_bacskpace_mode_delete),
SHELL_CMD_ARG(backspace, NULL, SHELL_HELP_BACKSPACE_MODE_BACKSPACE,
cmd_bacskpace_mode_backspace, 1, 0),
SHELL_CMD_ARG(delete, NULL, SHELL_HELP_BACKSPACE_MODE_DELETE,
cmd_bacskpace_mode_delete, 1, 0),
SHELL_SUBCMD_SET_END
};
SHELL_CREATE_STATIC_SUBCMD_SET(m_sub_shell)
{
SHELL_CMD(backspace_mode, &m_sub_backspace_mode,
SHELL_HELP_BACKSPACE_MODE, cmd_bacskpace_mode),
SHELL_CMD(colors, &m_sub_colors, SHELL_HELP_COLORS, cmd_colors),
SHELL_CMD(echo, &m_sub_echo, SHELL_HELP_ECHO, cmd_echo),
SHELL_CMD(stats, &m_sub_shell_stats, SHELL_HELP_STATISTICS,
cmd_shell_stats),
SHELL_HELP_BACKSPACE_MODE, NULL),
SHELL_CMD(colors, &m_sub_colors, SHELL_HELP_COLORS, NULL),
SHELL_CMD_ARG(echo, &m_sub_echo, SHELL_HELP_ECHO, cmd_echo, 1, 1),
SHELL_CMD(stats, &m_sub_shell_stats, SHELL_HELP_STATISTICS, NULL),
SHELL_SUBCMD_SET_END
};
SHELL_CREATE_STATIC_SUBCMD_SET(m_sub_resize)
{
SHELL_CMD(default, NULL, SHELL_HELP_RESIZE_DEFAULT, cmd_resize_default),
SHELL_CMD_ARG(default, NULL, SHELL_HELP_RESIZE_DEFAULT,
cmd_resize_default, 1, 0),
SHELL_SUBCMD_SET_END
};
SHELL_CMD_REGISTER(clear, NULL, SHELL_HELP_CLEAR, cmd_clear);
SHELL_CMD_REGISTER(shell, &m_sub_shell, SHELL_HELP_SHELL, cmd_shell);
SHELL_CMD_REGISTER(help, NULL, NULL, cmd_help);
SHELL_CMD_REGISTER(history, NULL, SHELL_HELP_HISTORY, cmd_history);
SHELL_CMD_REGISTER(resize, &m_sub_resize, SHELL_HELP_RESIZE, cmd_resize);
SHELL_CMD_ARG_REGISTER(clear, NULL, SHELL_HELP_CLEAR, cmd_clear, 1, 0);
SHELL_CMD_REGISTER(shell, &m_sub_shell, SHELL_HELP_SHELL, NULL);
SHELL_CMD_ARG_REGISTER(help, NULL, SHELL_HELP_HELP, cmd_help, 1, 255);
SHELL_CMD_ARG_REGISTER(history, NULL, SHELL_HELP_HISTORY, cmd_history, 1, 0);
SHELL_CMD_ARG_REGISTER(resize, &m_sub_resize, SHELL_HELP_RESIZE, cmd_resize,
1, 1);