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(); } }
MjLineSerial.cpp
- Committer:
- matsujirushi
- Date:
- 2014-11-18
- Revision:
- 0:40d65405e747
- Child:
- 1:833745ae8a7e
File content as of revision 0:40d65405e747:
#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