This is an automated email from the ASF dual-hosted git repository. jerzy pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mynewt-core.git
commit d5fb92abd2211c957ced7c7b7ecbeb702e84670c Author: Jerzy Kasenberg <[email protected]> AuthorDate: Tue Oct 8 14:20:22 2019 +0200 sys/console: Add console_prompt_set function New console_prompt_set() function will be used to display prompt from shell or other client. Before that change prompt was printed with just console_printf() function and console was not aware of what prompt was and could not utilize this for enhancing user experience. --- sys/console/full/include/console/console.h | 11 +++++++++ sys/console/full/src/console.c | 35 +++++++++++++++++++++++++++ sys/console/full/syscfg.yml | 3 +++ sys/console/minimal/include/console/console.h | 2 ++ sys/console/minimal/src/console.c | 9 +++++++ sys/console/stub/include/console/console.h | 5 ++++ 6 files changed, 65 insertions(+) diff --git a/sys/console/full/include/console/console.h b/sys/console/full/include/console/console.h index ac15e5b..b4ff296 100644 --- a/sys/console/full/include/console/console.h +++ b/sys/console/full/include/console/console.h @@ -132,6 +132,17 @@ extern void console_rx_restart(void); int console_lock(int timeout); int console_unlock(void); +/** + * Set prompt and current input line. + * + * This shows prompt with current input editor, cursor is placed + * at the end of line. + * + * @param prompt non-editable part of user input line + * @param line editable part + */ +void console_prompt_set(const char *prompt, const char *line); + #ifdef __cplusplus } #endif diff --git a/sys/console/full/src/console.c b/sys/console/full/src/console.c index f8fb42b..fc720c4 100644 --- a/sys/console/full/src/console.c +++ b/sys/console/full/src/console.c @@ -93,6 +93,11 @@ bool g_console_silence_non_nlip; bool g_console_ignore_non_nlip; static struct os_mutex console_write_lock; +/* Buffer for prompt */ +static char console_prompt[MYNEWT_VAL(CONSOLE_MAX_PROMPT_LEN)]; +/* Length of prompt stored in console_prompt */ +static uint16_t prompt_len; + /* * Default implementation in case all consoles are disabled - we just ignore any * output to console. @@ -159,6 +164,36 @@ console_filter_out(int c) return console_out_nolock(c); } +void +console_prompt_set(const char *prompt, const char *line) +{ + bool locked; + + prompt_len = strlen(prompt); + + /* If this assert fails increase value of CONSOLE_MAX_PROMPT_LEN */ + assert(MYNEWT_VAL(CONSOLE_MAX_PROMPT_LEN) > prompt_len); + + strcpy(console_prompt, prompt); + + /* Place cursor at the end, no trailing chars */ + if (line) { + cur = strlen(line); + } else { + cur = 0; + } + trailing_chars = 0; + + locked = console_lock(1000) == OS_OK; + + console_write(prompt, prompt_len); + console_write(line, cur); + + if (locked) { + (void)console_unlock(); + } +} + int console_out(int c) { diff --git a/sys/console/full/syscfg.yml b/sys/console/full/syscfg.yml index 5faff99..31394be 100644 --- a/sys/console/full/syscfg.yml +++ b/sys/console/full/syscfg.yml @@ -46,6 +46,9 @@ syscfg.defs: Number of lines to be stored in console history. Set to "0" to disable console history. value: 0 + CONSOLE_MAX_PROMPT_LEN: + description: 'Maximum number of characters for prompt' + value: 16 CONSOLE_UART_BAUD: description: 'Console UART baud rate.' diff --git a/sys/console/minimal/include/console/console.h b/sys/console/minimal/include/console/console.h index df1d2da..4628160 100644 --- a/sys/console/minimal/include/console/console.h +++ b/sys/console/minimal/include/console/console.h @@ -128,6 +128,8 @@ extern int console_out(int character); int console_lock(int timeout); int console_unlock(void); +void console_prompt_set(const char *prompt, const char *line); + #ifdef __cplusplus } #endif diff --git a/sys/console/minimal/src/console.c b/sys/console/minimal/src/console.c index 77870cc..16bca59 100644 --- a/sys/console/minimal/src/console.c +++ b/sys/console/minimal/src/console.c @@ -130,6 +130,15 @@ console_out(int c) } void +console_prompt_set(const char *prompt, const char *line) +{ + console_write(promot, strlen(prompt)); + if (line) { + console_write(line, strlen(line)); + } +} + +void console_write(const char *str, int cnt) { int i; diff --git a/sys/console/stub/include/console/console.h b/sys/console/stub/include/console/console.h index d98b4de..c0d63d3 100644 --- a/sys/console/stub/include/console/console.h +++ b/sys/console/stub/include/console/console.h @@ -129,6 +129,11 @@ console_out(int character) return 0; } +static inline void +console_prompt_set(const char *prompt, const char *line) +{ +} + static void inline console_silence(bool silent) {
