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@0:40d65405e747, 2014-11-18 (annotated)
- Committer:
- matsujirushi
- Date:
- Tue Nov 18 14:43:37 2014 +0000
- Revision:
- 0:40d65405e747
- Child:
- 1:833745ae8a7e
Create MjLineSerial class.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
matsujirushi | 0:40d65405e747 | 1 | #include "MjLineSerial.h" |
matsujirushi | 0:40d65405e747 | 2 | #include <cstdarg> |
matsujirushi | 0:40d65405e747 | 3 | |
matsujirushi | 0:40d65405e747 | 4 | #define STRING_STACK_LIMIT 120 |
matsujirushi | 0:40d65405e747 | 5 | |
matsujirushi | 0:40d65405e747 | 6 | namespace matsujirushi { |
matsujirushi | 0:40d65405e747 | 7 | |
matsujirushi | 0:40d65405e747 | 8 | MjLineSerial::MjLineSerial(RawSerial *serial) |
matsujirushi | 0:40d65405e747 | 9 | { |
matsujirushi | 0:40d65405e747 | 10 | baseSerial = serial; |
matsujirushi | 0:40d65405e747 | 11 | } |
matsujirushi | 0:40d65405e747 | 12 | |
matsujirushi | 0:40d65405e747 | 13 | int MjLineSerial::getc() |
matsujirushi | 0:40d65405e747 | 14 | { |
matsujirushi | 0:40d65405e747 | 15 | return baseSerial->getc(); |
matsujirushi | 0:40d65405e747 | 16 | } |
matsujirushi | 0:40d65405e747 | 17 | |
matsujirushi | 0:40d65405e747 | 18 | int MjLineSerial::putc(int c) |
matsujirushi | 0:40d65405e747 | 19 | { |
matsujirushi | 0:40d65405e747 | 20 | return baseSerial->putc(c); |
matsujirushi | 0:40d65405e747 | 21 | } |
matsujirushi | 0:40d65405e747 | 22 | |
matsujirushi | 0:40d65405e747 | 23 | int MjLineSerial::printf(const char *format, ...) |
matsujirushi | 0:40d65405e747 | 24 | { |
matsujirushi | 0:40d65405e747 | 25 | std::va_list arg; |
matsujirushi | 0:40d65405e747 | 26 | va_start(arg, format); |
matsujirushi | 0:40d65405e747 | 27 | int len = vsnprintf(NULL, 0, format, arg); |
matsujirushi | 0:40d65405e747 | 28 | if (len < STRING_STACK_LIMIT) { |
matsujirushi | 0:40d65405e747 | 29 | char temp[STRING_STACK_LIMIT]; |
matsujirushi | 0:40d65405e747 | 30 | vsprintf(temp, format, arg); |
matsujirushi | 0:40d65405e747 | 31 | puts(temp); |
matsujirushi | 0:40d65405e747 | 32 | } else { |
matsujirushi | 0:40d65405e747 | 33 | char *temp = new char[len + 1]; |
matsujirushi | 0:40d65405e747 | 34 | vsprintf(temp, format, arg); |
matsujirushi | 0:40d65405e747 | 35 | puts(temp); |
matsujirushi | 0:40d65405e747 | 36 | delete[] temp; |
matsujirushi | 0:40d65405e747 | 37 | } |
matsujirushi | 0:40d65405e747 | 38 | va_end(arg); |
matsujirushi | 0:40d65405e747 | 39 | return len; |
matsujirushi | 0:40d65405e747 | 40 | } |
matsujirushi | 0:40d65405e747 | 41 | |
matsujirushi | 0:40d65405e747 | 42 | } // namespace matsujirushi |
matsujirushi | 0:40d65405e747 | 43 |