From 13e88ed59974b6940815b6a392266ad34a9ee410 Mon Sep 17 00:00:00 2001 From: Leo C Date: Fri, 17 Jun 2016 15:52:16 +0200 Subject: [PATCH] Add verbose and xtrace options to cli --- avr/cli.c | 46 ++++++++++++++++++++++++++++++++++++++++++---- avr/cmd_mem.c | 2 +- avr/command.c | 4 ++-- avr/debug.c | 2 +- 4 files changed, 46 insertions(+), 8 deletions(-) diff --git a/avr/cli.c b/avr/cli.c index 77876af..891a26a 100644 --- a/avr/cli.c +++ b/avr/cli.c @@ -35,6 +35,23 @@ #define debug_parser(fmt, args...) \ debug_cond(DEBUG_PARSER, fmt, ##args) + +static bool opt_xtrace; +static bool opt_verbose; +static int_least8_t command_level; + +static void cli_trace_cmd(int_fast8_t level, int argc, char *argv[]) +{ + while (level-- > 0) + putchar('+'); + for (int_fast8_t i = 0; i < argc; i++) + printf_P(PSTR(" %s"), argv[i]); + putchar('\n'); +} + + + + static int cli_parse_line(char *line, char *argv[]) { uint_fast8_t state = 0; @@ -232,9 +249,20 @@ static int cli_run_command(const char *cmd, int flag) uint_fast8_t inquotes, repeatable = 1; int rc = 0; + opt_verbose = 0; + opt_xtrace = 0; + char *optenv = getenv_str(PSTR("cli")); + if (optenv) { + opt_verbose = (strstr_P(optenv, PSTR("verbose")) != NULL); + opt_xtrace = (strstr_P(optenv, PSTR("xtrace")) != NULL); + } + debug_parser("[RUN_COMMAND] cmd[%p]=\"%s\"\n", cmd, cmd ? cmd : "NULL"); + if (opt_verbose) + printf_P(PSTR("%s\n"), cmd, cmd ? cmd : ""); + clear_ctrlc(); /* forget any previous Control C */ if (!cmd || !*cmd) @@ -244,6 +272,7 @@ static int cli_run_command(const char *cmd, int flag) if (!cmdbuf) return -1; /* not enough memory */ + ++command_level; str = cmdbuf; /* Process separators and check for invalid @@ -294,8 +323,15 @@ static int cli_run_command(const char *cmd, int flag) continue; } - if (cmd_process(flag, argc, argv, &repeatable) != CMD_RET_SUCCESS) + if (opt_xtrace) + cli_trace_cmd(command_level, argc, argv); + + rc = cmd_process(flag, argc, argv, &repeatable); + if (rc != CMD_RET_SUCCESS) { + if (opt_verbose) + printf_P(PSTR("Command failed, result=%d\n"), rc); rc = -1; + } /* Did the user stop this? */ if (had_ctrlc()) { @@ -306,6 +342,7 @@ static int cli_run_command(const char *cmd, int flag) free(cmdbuf); free(finaltoken); + --command_level; return rc ? rc : repeatable; } @@ -376,9 +413,10 @@ void cli_loop(void) } else if (len == 0) flag |= CMD_FLAG_REPEAT; - if (len == -1) - my_puts_P(PSTR("\n")); - else + if (len == -1) { + if (opt_verbose) + my_puts_P(PSTR("\n")); + } else rc = run_command_repeatable(lastcommand, flag); if (rc <= 0) { diff --git a/avr/cmd_mem.c b/avr/cmd_mem.c index ded5146..4fe9415 100644 --- a/avr/cmd_mem.c +++ b/avr/cmd_mem.c @@ -176,7 +176,7 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[]) addr++; } } - } while (nbytes); + } while (nbytes > 0); mm_last_addr = addr; return CMD_RET_SUCCESS; diff --git a/avr/command.c b/avr/command.c index ed25dee..e696202 100644 --- a/avr/command.c +++ b/avr/command.c @@ -476,8 +476,8 @@ command_ret_t cmd_call(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[] command_ret_t result; result = (cmdtp->cmd)(cmdtp, flag, argc, argv); - if (result != CMD_RET_SUCCESS) - debug("Command failed, result=%d\n", result); +// if (result != CMD_RET_SUCCESS) +// debug("Command failed, result=%d\n", result); return result; } diff --git a/avr/debug.c b/avr/debug.c index 384a5ad..e38ccb2 100644 --- a/avr/debug.c +++ b/avr/debug.c @@ -189,7 +189,7 @@ mod_mem_avr(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const arg addr++; } } - } while (nbytes); + } while (nbytes > 0); mm_last_addr = addr; return CMD_RET_SUCCESS; -- 2.39.2