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(); } }
Diff: MjLineSerial.cpp
- 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