You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by je...@apache.org on 2019/10/17 11:47:22 UTC

[mynewt-core] 14/21: sys/console: Add handling of CRTL-C

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 47a6e50616f052c93f5af1ccc9b79f443b56bc0c
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Tue Oct 8 15:55:59 2019 +0200

    sys/console: Add handling of CRTL-C
    
    Almost all non printable characters are treated somehow strange.
    If they are encounter on input they are appended to current input
    line then line is sent to the client as if enter was pressed.
    Users often hit CTRL-C just when they typed something wrong.
    To go along with this habit CTRL-C will now clear the input line.
    
    In the process three functions were moved up and modified so they
    write to console without filtering.
---
 sys/console/full/src/console.c | 82 ++++++++++++++++++++++--------------------
 1 file changed, 44 insertions(+), 38 deletions(-)

diff --git a/sys/console/full/src/console.c b/sys/console/full/src/console.c
index 4ba5fa1..c41be33 100644
--- a/sys/console/full/src/console.c
+++ b/sys/console/full/src/console.c
@@ -34,6 +34,10 @@
 #define ESC                0x1b
 #define DEL                0x7f
 #define BS                 0x08
+#define ETX                0x03
+#define EOT                0x04
+#define FF                 0x0B
+#define VT                 0x0C
 
 /* ANSI escape sequences */
 #define ANSI_ESC           '['
@@ -164,6 +168,30 @@ console_filter_out(int c)
     return console_out_nolock(c);
 }
 
+static inline void
+cursor_save(void)
+{
+    console_out_nolock(ESC);
+    console_out_nolock('[');
+    console_out_nolock('s');
+}
+
+static inline void
+cursor_restore(void)
+{
+    console_out_nolock(ESC);
+    console_out_nolock('[');
+    console_out_nolock('u');
+}
+
+static inline void
+cursor_clear_line(void)
+{
+    console_out_nolock(ESC);
+    console_out_nolock('[');
+    console_out_nolock('K');
+}
+
 void
 console_prompt_set(const char *prompt, const char *line)
 {
@@ -318,32 +346,6 @@ cursor_backward(unsigned int count)
     console_printf("\x1b[%uD", count);
 }
 
-#if MYNEWT_VAL(CONSOLE_HISTORY_SIZE) > 0
-static inline void
-cursor_clear_line(void)
-{
-    console_out(ESC);
-    console_out('[');
-    console_out('K');
-}
-#endif
-
-static inline void
-cursor_save(void)
-{
-    console_out(ESC);
-    console_out('[');
-    console_out('s');
-}
-
-static inline void
-cursor_restore(void)
-{
-    console_out(ESC);
-    console_out('[');
-    console_out('u');
-}
-
 static void
 insert_char(char *pos, char c)
 {
@@ -403,6 +405,18 @@ del_char(char *pos)
     }
 }
 
+static void
+console_clear_line(void)
+{
+    if (cur) {
+        cursor_backward(cur);
+    }
+    cur = 0;
+    trailing_chars = 0;
+
+    cursor_clear_line();
+}
+
 #if MYNEWT_VAL(CONSOLE_HISTORY_SIZE) > 0
 static char console_hist_lines[ MYNEWT_VAL(CONSOLE_HISTORY_SIZE) ][ MYNEWT_VAL(CONSOLE_MAX_INPUT_LEN) ];
 
@@ -560,18 +574,6 @@ console_hist_add(char *line)
 }
 
 static void
-console_clear_line(void)
-{
-    if (cur) {
-        cursor_backward(cur);
-    }
-    cur = 0;
-    trailing_chars = 0;
-
-    cursor_clear_line();
-}
-
-static void
 console_hist_move(char *line, uint8_t direction)
 {
     struct console_hist *sh = &console_hist;
@@ -894,6 +896,10 @@ console_handle_char(uint8_t byte)
 #endif
             }
             break;
+        /* CTRL-C */
+        case ETX:
+            console_clear_line();
+            break;
         }
 
         return 0;