From 022330eb94f180b0b626988d294ce43c2191ad61 Mon Sep 17 00:00:00 2001 From: Leo C Date: Mon, 27 Aug 2018 22:01:03 +0200 Subject: [PATCH] error handling (WIP) --- avr/cmd_fat.c | 42 ++++++++++++++++++++++++++++-------------- avr/command.c | 36 ++++++++++++++++++++++++++++++------ include/command.h | 7 +++++++ 3 files changed, 65 insertions(+), 20 deletions(-) diff --git a/avr/cmd_fat.c b/avr/cmd_fat.c index 2d64251..ab16fa5 100644 --- a/avr/cmd_fat.c +++ b/avr/cmd_fat.c @@ -75,6 +75,29 @@ static bool check_abort(void) } +static const FLASH char * const FLASH rc_strings[] = { + FSTR("OK"), + FSTR("disk error"), + FSTR("internal error"), + FSTR("not ready"), + FSTR("no file"), + FSTR("no path"), + FSTR("invalid name"), + FSTR("denied"), + FSTR("exist"), + FSTR("invalid object"), + FSTR("write protected"), + FSTR("invalid drive"), + FSTR("not enabled"), + FSTR("no file system"), + FSTR("mkfs aborted"), + FSTR("timeout"), + FSTR("locked"), + FSTR("not enough core"), + FSTR("too many open files"), + FSTR("invalid parameter") + }; + static const FLASH char * const FLASH rc_names[] = { FSTR("OK"), FSTR("DISK_ERR"), @@ -112,16 +135,9 @@ void put_rc (FRESULT rc) } -void err(const char *fmt, ...) +const FLASH char * rctostr(FRESULT rc) { - va_list ap; - va_start(ap, fmt); - printf_P(PSTR("fat %s: "), cmdname); - vfprintf_P(stdout, fmt, ap); - va_end(ap); - printf_P(PSTR("\n")); - _delay_ms(20); - command_ret = CMD_RET_FAILURE; + return rc < ARRAY_SIZE(rc_strings) ? rc_strings[rc] : PSTR(" Unknown Error"); } static void swirl(void) @@ -182,13 +198,13 @@ static void strip_trailing_slash(PATH_T *p) static PATH_T *path_setup(char *string) { if (strlen(string) > PATH_MAX) { - err(PSTR("'%s': name too long"), string); + cmd_error(PSTR("'%s': name too long"), string); return NULL; } PATH_T *p = (PATH_T *) malloc(sizeof *p); if (p == NULL) { - err(PSTR("'%s': Out of Memory"), string); + cmd_error(PSTR("'%s': Out of Memory"), string); return NULL; } @@ -200,7 +216,7 @@ static PATH_T *path_setup(char *string) p->p_path[2] = '/'; len += 1; } else { - err(PSTR("'%s': Out of Memory"), string); + cmd_error(PSTR("'%s': Out of Memory"), string); return NULL; } } @@ -255,8 +271,6 @@ command_ret_t do_cd(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char *arg; FRESULT res = FR_OK; - cmdname = argv[0]; - if (argc < 2) { arg = getenv_str(PSTR(ENV_HOME)); if (arg == NULL) { diff --git a/avr/command.c b/avr/command.c index ff52757..b0d9c90 100644 --- a/avr/command.c +++ b/avr/command.c @@ -100,7 +100,7 @@ static cmd_tbl_t *get_cmd_tbl_parent(cmd_tbl_t *child) return NULL; } -static int print_name_prefix(cmd_tbl_t *p) +static int print_nameprefix(cmd_tbl_t *p) { cmd_tbl_t *top = get_cmd_tbl_parent(p); @@ -112,13 +112,22 @@ static int print_name_prefix(cmd_tbl_t *p) return width; } +static int print_prefixed_name(cmd_tbl_t *p) +{ + int len; + + len = print_nameprefix(p); + len += strlen_P(p->name); + my_puts_P(p->name); + + return len; +} + static void print_usage_line(cmd_tbl_t *p, int width) { - width -= strlen_P(p->name); - width -= print_name_prefix(p); + width -= print_prefixed_name(p); if (width < 0) width = 0; - my_puts_P(p->name); print_blanks(width); my_puts_P(PSTR(" - ")); puts_P(p->usage); @@ -414,8 +423,7 @@ command_ret_t cmd_usage(cmd_tbl_t *cmdtp) print_usage_line(cmdtp, 0); #ifdef CONFIG_SYS_LONGHELP my_puts_P(PSTR("Usage:\n")); - print_name_prefix(cmdtp); - my_puts_P(cmdtp->name); + print_prefixed_name(cmdtp); my_puts_P(PSTR(" ")); if (cmdtp->help && *cmdtp->help != '\0') @@ -686,6 +694,7 @@ int cmd_auto_complete(const FLASH char *const prompt, char *buf, int *np, int *c #endif /* CONFIG_AUTO_COMPLETE */ +static cmd_tbl_t *cmd_invocation_ptr; /** * Call a command function. This should be the only route in U-Boot to call @@ -760,6 +769,7 @@ command_ret_t cmd_process(uint_fast8_t flag, int argc, char * const argv[], /* If OK so far, then do the command */ if (!rc) { + cmd_invocation_ptr = cmdtp; rc = cmd_call(cmdtp, flag, argc, argv); *repeatable &= (cmdtp->flags & CTBL_RPT) != 0; } @@ -780,3 +790,17 @@ int cmd_process_error(cmd_tbl_t *cmdtp, int err) return 0; } + + +void cmd_error(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + print_prefixed_name(cmd_invocation_ptr); + my_puts_P(PSTR(": ")); + vfprintf_P(stdout, fmt, ap); + va_end(ap); + putchar('\n'); + _delay_ms(20); + //command_ret = CMD_RET_FAILURE; +} diff --git a/include/command.h b/include/command.h index 93c9a2d..d5eeb36 100644 --- a/include/command.h +++ b/include/command.h @@ -97,6 +97,13 @@ extern int cmd_auto_complete(const FLASH char *const prompt, char *buf, int *np, */ int cmd_process_error(cmd_tbl_t *cmdtp, int err); +/** + * cmd_error() - print error message + * + * @fmt: + */ +void cmd_error(const char *fmt, ...); + /* * Monitor Command * -- 2.39.2