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:
0:40d65405e747
Child:
1:833745ae8a7e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MjLineSerial.cpp	Tue Nov 18 14:43:37 2014 +0000
@@ -0,0 +1,43 @@
+#include "MjLineSerial.h"
+#include <cstdarg>
+
+#define STRING_STACK_LIMIT    120
+
+namespace matsujirushi {
+
+MjLineSerial::MjLineSerial(RawSerial *serial)
+{
+    baseSerial = serial;
+}
+
+int MjLineSerial::getc()
+{
+    return baseSerial->getc();
+}
+
+int MjLineSerial::putc(int c)
+{
+    return baseSerial->putc(c);
+}
+
+int MjLineSerial::printf(const char *format, ...)
+{
+    std::va_list arg;
+    va_start(arg, format);
+    int len = vsnprintf(NULL, 0, format, arg);
+    if (len < STRING_STACK_LIMIT) {
+        char temp[STRING_STACK_LIMIT];
+        vsprintf(temp, format, arg);
+        puts(temp);
+    } else {
+        char *temp = new char[len + 1];
+        vsprintf(temp, format, arg);
+        puts(temp);
+        delete[] temp;
+    }
+    va_end(arg);
+    return len;
+}
+
+} // namespace matsujirushi
+