Simple embedded shell with runtime pluggable commands.

Dependents:   DataBus2018

Implements a simple unix-like shell for embedded systems with a pluggable command architecture.

Revision:
10:c3faa7ffd23b
Parent:
5:8f486f4d29d3
Child:
11:23f61057d877
diff -r b58450c94d32 -r c3faa7ffd23b SimpleShell.cpp
--- a/SimpleShell.cpp	Wed Dec 12 17:58:27 2018 +0000
+++ b/SimpleShell.cpp	Thu Dec 13 08:56:58 2018 +0000
@@ -1,6 +1,8 @@
 #include "SimpleShell.h"
 #include <ctype.h>
 
+#define ESC 0x1b
+
 SimpleShell::SimpleShell()
 {
     lookupEnd = 0;
@@ -85,18 +87,72 @@
         c = fgetc(stdin);
         if (c == '\r') { // if return is hit, we're done, don't add \r to cmd
             done = true;
+        } else if (c == ESC) { // keyboard escape codes (arrow keys, etc)
+            char c2 = getchar();
+            char c3 = getchar();
+
+            if (c2 == 0x4f && c3 == 0x46) {
+                printf("<END>");
+            } else if (c2 == 0x5b) {
+                switch (c3) {
+                case 0x41 : // up
+                    printf("<UP>");
+                    break;
+                case 0x42 : // down
+                    printf("<DOWN>");
+                    break;
+                case 0x43 : // right
+                    printf("<RIGHT>");
+                    break;
+                case 0x44 : // left
+                    printf("<LEFT>");
+                    break;
+                case 0x31 : // home
+                case 0x32 : // ins
+                case 0x33: // del
+                case 0x35: // pgup
+                case 0x36: // pgdn
+                    char c4 = getchar();
+                    if (c4 == 0x7e) {
+                        switch (c3) {
+                        case 0x31 :
+                            printf("<HOME>");
+                            break;
+                        case 0x32 : // ins
+                            printf("<INS>");
+                            break;
+                        case 0x33: // del
+                            printf("<DEL>");
+                            break;                
+                        case 0x35: // pgup
+                            printf("<PGUP>");
+                            break;
+                        case 0x36: // pgdn
+                            printf("<PGDN>");
+                            break;
+                        default:
+                            break;
+                        }//switch
+                    }//if
+                default:
+                    //printf("<0x%02x>", c3);
+                    break;
+                }//switch
+            }//if            
+            //printf("\n");
         } else if (i < MAXBUF-1) {
             if (c == 0x7f || c == '\b') { // backspace or delete
                 if (i > 0) { // if we're at the beginning, do nothing
                     i--;
                     fputs("\b \b", stdout);
-
                 }
             } else {
-                fputc(c, stdout);
+                if (isprint(c))
+                    fputc(c, stdout);
                 cmd[i++] = c;
             }
         }
+
     } while (!done);
     fputc('\n', stdout);