diff --git a/CLI/CLI.c b/CLI/CLI.c index f2021f2..918fcc0 100644 --- a/CLI/CLI.c +++ b/CLI/CLI.c @@ -5,7 +5,7 @@ #include "../FIFOBuff/FIFOBuffChar.h" -void (*CLI_lineOut)(char* line); +CLI_lineOutFn CLI_lineOut; CMDList_t* CMDList; FIFOBuffChar_t* FIFO; @@ -16,6 +16,14 @@ bool CLI_init(CLI_lineOutFn lineOut, CMDList_t* cmdList) CMDList = cmdList; FIFO = FIFOBuffChar_create(); + + if (CLI_lineOut != NULL) + { + (*CLI_lineOut)(">"); + (*CLI_lineOut)(" "); + } + + return true; } bool CLI_deinit() @@ -24,6 +32,7 @@ bool CLI_deinit() CMDList = NULL; FIFOBuffChar_delete(FIFO); + return true; } char* fifoToString(FIFOBuffChar_t* fifo) @@ -50,11 +59,27 @@ int tryExecute(FIFOBuffChar_t* fifo) if (cmd != NULL) { (*(cmd->fn))(line); + + if (CLI_lineOut != NULL) + { + (*CLI_lineOut)("\n"); + (*CLI_lineOut)(">"); + (*CLI_lineOut)(" "); + } return true; } else { - printf("command not found: %s\n", line); + if (CLI_lineOut != NULL) + { + char err[100]; + sprintf(&err, "command not found: %s\n> ", line); + for (int i=0; err[i] != 0; i++) + { + char c[2] = {err[i], 0}; + (*CLI_lineOut)(&c[0]); + } + } return false; } } @@ -84,6 +109,7 @@ bool CLI_charIn(char c) } else { + char str[100]; switch (c) { case '\n': @@ -97,9 +123,29 @@ bool CLI_charIn(char c) ok = tryExecute(fifo); FIFOBuffChar_delete(fifo); break; + + case 127: // backspace + (*CLI_lineOut)("\x1b"); + (*CLI_lineOut)("["); + (*CLI_lineOut)("D"); + break; + + case 27: // escape (start for arrow keys) + sprintf(&str, "\ninvlid char: ESC - (%i)\n", c); + for (int i=0; str[i] != 0; i++) + { + char ch[2] = {str[i], 0}; + (*CLI_lineOut)(&ch[0]); + } + break; - //TODO: add hire backspace and arrow detection default: + sprintf(&str, "\ninvlid char: '%c' - (%i)\n", c, c); + for (int i=0; str[i] != 0; i++) + { + char ch[2] = {str[i], 0}; + (*CLI_lineOut)(&ch[0]); + } break; } }