sys/console: fix newtmgr over shell
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/c7b6f80d Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/c7b6f80d Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/c7b6f80d Branch: refs/heads/master Commit: c7b6f80d4e3a5165f84a4c078c872b4a0526d6fb Parents: 27ff319 Author: MichaÅ Narajowski <michal.narajow...@codecoup.pl> Authored: Mon Apr 24 16:13:40 2017 -0700 Committer: MichaÅ Narajowski <michal.narajow...@codecoup.pl> Committed: Tue Apr 25 17:49:15 2017 -0700 ---------------------------------------------------------------------- sys/console/full/src/console.c | 88 ++++++++++++++++++++++++++++++++++--- sys/console/full/syscfg.yml | 3 ++ 2 files changed, 86 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/c7b6f80d/sys/console/full/src/console.c ---------------------------------------------------------------------- diff --git a/sys/console/full/src/console.c b/sys/console/full/src/console.c index f4a0257..1bc4c3e 100644 --- a/sys/console/full/src/console.c +++ b/sys/console/full/src/console.c @@ -51,6 +51,16 @@ #define ESC_ANSI_VAL (1 << 3) #define ESC_ANSI_VAL_2 (1 << 4) +#define CONSOLE_NLIP_PKT_START1 (6) +#define CONSOLE_NLIP_PKT_START2 (9) +#define CONSOLE_NLIP_DATA_START1 (4) +#define CONSOLE_NLIP_DATA_START2 (20) + +#define NLIP_PKT_START1 (1 << 0) +#define NLIP_PKT_START2 (1 << 1) +#define NLIP_DATA_START1 (1 << 2) +#define NLIP_DATA_START2 (1 << 3) + /* Indicates whether the previous line of output was completed. */ int console_is_midline; @@ -64,7 +74,8 @@ static struct os_eventq compat_lines_queue; #endif static int esc_state; -static int echo = 1; +static int nlip_state; +static int echo = MYNEWT_VAL(CONSOLE_ECHO); static unsigned int ansi_val, ansi_val_2; static uint8_t cur, end; @@ -161,6 +172,10 @@ insert_char(char *pos, char c, uint8_t end) { char tmp; + if (cur + end >= MYNEWT_VAL(CONSOLE_MAX_INPUT_LEN) - 1) { + return; + } + if (echo) { /* Echo back to console */ console_out(c); @@ -302,6 +317,31 @@ ansi_cmd: esc_state &= ~ESC_ANSI; } +static int +handle_nlip(uint8_t byte) +{ + if (((nlip_state & NLIP_PKT_START1) && + (nlip_state & NLIP_PKT_START2)) || + ((nlip_state & NLIP_DATA_START1) && + (nlip_state & NLIP_DATA_START2))) + { + return 1; + } + + if ((nlip_state & NLIP_PKT_START1) && + (byte == CONSOLE_NLIP_PKT_START2)) { + nlip_state |= NLIP_PKT_START2; + return 1; + } else if ((nlip_state & NLIP_DATA_START1) && + (byte == CONSOLE_NLIP_DATA_START2)) { + nlip_state |= NLIP_DATA_START2; + return 1; + } else { + nlip_state = 0; + return 0; + } +} + int console_handle_char(uint8_t byte) { @@ -323,6 +363,41 @@ console_handle_char(uint8_t byte) input = ev->ev_arg; } + if (handle_nlip(byte)) { + if (byte == '\n') { + insert_char(&input->line[cur++], byte, end); + input->line[cur] = '\0'; + cur = 0; + end = 0; + os_eventq_put(lines_queue, ev); + nlip_state = 0; + +#if MYNEWT_VAL(CONSOLE_COMPAT) + if (console_compat_rx_cb) { + console_compat_rx_cb(); + } +#endif + + input = NULL; + ev = NULL; + console_echo(1); + return 0; + /* Ignore characters if there's no more buffer space */ + } else if (byte == CONSOLE_NLIP_PKT_START2) { + /* Disable echo to not flood the UART */ + console_echo(0); + insert_char(&input->line[cur++], CONSOLE_NLIP_PKT_START1, end); + } else if (byte == CONSOLE_NLIP_DATA_START2) { + /* Disable echo to not flood the UART */ + console_echo(0); + insert_char(&input->line[cur++], CONSOLE_NLIP_DATA_START1, end); + } + + insert_char(&input->line[cur++], byte, end); + + return 0; + } + /* Handle ANSI escape mode */ if (esc_state & ESC_ANSI) { handle_ansi(byte, input->line); @@ -349,6 +424,12 @@ console_handle_char(uint8_t byte) if (!isprint(byte)) { handle_ansi(byte, input->line); switch (byte) { + case CONSOLE_NLIP_PKT_START1: + nlip_state |= NLIP_PKT_START1; + break; + case CONSOLE_NLIP_DATA_START1: + nlip_state |= NLIP_DATA_START1; + break; case DEL: if (cur > 0) { del_char(&input->line[--cur], end); @@ -388,10 +469,7 @@ console_handle_char(uint8_t byte) return 0; } - /* Ignore characters if there's no more buffer space */ - if (cur + end < sizeof(input->line) - 1) { - insert_char(&input->line[cur++], byte, end); - } + insert_char(&input->line[cur++], byte, end); return 0; } http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/c7b6f80d/sys/console/full/syscfg.yml ---------------------------------------------------------------------- diff --git a/sys/console/full/syscfg.yml b/sys/console/full/syscfg.yml index 45fc2ed..402892d 100644 --- a/sys/console/full/syscfg.yml +++ b/sys/console/full/syscfg.yml @@ -31,6 +31,9 @@ syscfg.defs: CONSOLE_TICKS: description: 'Print OS Ticks' value: 1 + CONSOLE_ECHO: + description: 'Default console echo' + value: 1 CONSOLE_COMPAT: description: 'Console backward compatibility' value: 1