Command line interface for UART.

UARTでコマンドラインインターフェースを実現するためのライブラリです。

UARTからコマンドが入力されるとReadLine関数をコールバックします。

コマンドのデリミタはCR(0x0d)です。

コマンドはバックスペースで消去できます。

#include "mbed.h"
#include "MjLineSerial.h"

using namespace matsujirushi;

RawSerial pc(USBTX, USBRX);
MjLineSerial line(&pc);

void readLineFunc(const char *str)
{
    if (strcmp(str, "apple") == 0)
    {
        line.puts("RINGO");
    }
    else if (strcmp(str, "orange") == 0)
    {
        line.puts("MIKAN");
    }
    else
    {
        line.puts("unknown.");
    }
    line.puts("\r\n");
    
    line.putc('>');
}

int main()
{
    pc.baud(115200);
    line.attachReadLine(readLineFunc);
    
    line.putc('>');
    for (;;)
    {
        line.task();
    }
}
Revision:
1:833745ae8a7e
Parent:
0:40d65405e747
Child:
2:84178b3b2824
--- a/MjLineSerial.cpp	Tue Nov 18 14:43:37 2014 +0000
+++ b/MjLineSerial.cpp	Wed Nov 19 11:16:12 2014 +0000
@@ -8,6 +8,7 @@
 MjLineSerial::MjLineSerial(RawSerial *serial)
 {
     baseSerial = serial;
+    readLineFunc = NULL;
 }
 
 int MjLineSerial::getc()
@@ -20,6 +21,16 @@
     return baseSerial->putc(c);
 }
 
+int MjLineSerial::puts(const char *str)
+{
+    for (; *str != '\0'; str++)
+    {
+        putc(*str);
+    }
+    
+    return 0;
+}
+
 int MjLineSerial::printf(const char *format, ...)
 {
     std::va_list arg;
@@ -39,5 +50,44 @@
     return len;
 }
 
+void MjLineSerial::attachReadLine(void (*func)(const char *str))
+{
+    readLineFunc = func;
+}
+
+void MjLineSerial::task()
+{
+    if (baseSerial->readable())
+    {
+        char c = getc();
+        switch (c)
+        {
+        case '\r':
+            if (readLineFunc != NULL)
+            {
+                rxBuffer.push_back('\0');
+                readLineFunc(rxBuffer.begin());
+            }
+            rxBuffer.clear();
+            break;
+        case '\b':
+            if (rxBuffer.size() <= 0)
+            {
+                putc('\a');
+            }
+            else
+            {
+                rxBuffer.pop_back();
+                puts("\b \b");
+            }
+            break;
+        default:
+            rxBuffer.push_back(c);
+            putc(c);
+            break;
+        }
+    }
+}
+
 } // namespace matsujirushi