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@1:833745ae8a7e, 2014-11-19 (annotated)
- Committer:
- matsujirushi
- Date:
- Wed Nov 19 11:16:12 2014 +0000
- Revision:
- 1:833745ae8a7e
- Parent:
- 0:40d65405e747
- Child:
- 2:84178b3b2824
Implement ReadLine function.
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 | 1:833745ae8a7e | 11 | readLineFunc = NULL; |
matsujirushi | 0:40d65405e747 | 12 | } |
matsujirushi | 0:40d65405e747 | 13 | |
matsujirushi | 0:40d65405e747 | 14 | int MjLineSerial::getc() |
matsujirushi | 0:40d65405e747 | 15 | { |
matsujirushi | 0:40d65405e747 | 16 | return baseSerial->getc(); |
matsujirushi | 0:40d65405e747 | 17 | } |
matsujirushi | 0:40d65405e747 | 18 | |
matsujirushi | 0:40d65405e747 | 19 | int MjLineSerial::putc(int c) |
matsujirushi | 0:40d65405e747 | 20 | { |
matsujirushi | 0:40d65405e747 | 21 | return baseSerial->putc(c); |
matsujirushi | 0:40d65405e747 | 22 | } |
matsujirushi | 0:40d65405e747 | 23 | |
matsujirushi | 1:833745ae8a7e | 24 | int MjLineSerial::puts(const char *str) |
matsujirushi | 1:833745ae8a7e | 25 | { |
matsujirushi | 1:833745ae8a7e | 26 | for (; *str != '\0'; str++) |
matsujirushi | 1:833745ae8a7e | 27 | { |
matsujirushi | 1:833745ae8a7e | 28 | putc(*str); |
matsujirushi | 1:833745ae8a7e | 29 | } |
matsujirushi | 1:833745ae8a7e | 30 | |
matsujirushi | 1:833745ae8a7e | 31 | return 0; |
matsujirushi | 1:833745ae8a7e | 32 | } |
matsujirushi | 1:833745ae8a7e | 33 | |
matsujirushi | 0:40d65405e747 | 34 | int MjLineSerial::printf(const char *format, ...) |
matsujirushi | 0:40d65405e747 | 35 | { |
matsujirushi | 0:40d65405e747 | 36 | std::va_list arg; |
matsujirushi | 0:40d65405e747 | 37 | va_start(arg, format); |
matsujirushi | 0:40d65405e747 | 38 | int len = vsnprintf(NULL, 0, format, arg); |
matsujirushi | 0:40d65405e747 | 39 | if (len < STRING_STACK_LIMIT) { |
matsujirushi | 0:40d65405e747 | 40 | char temp[STRING_STACK_LIMIT]; |
matsujirushi | 0:40d65405e747 | 41 | vsprintf(temp, format, arg); |
matsujirushi | 0:40d65405e747 | 42 | puts(temp); |
matsujirushi | 0:40d65405e747 | 43 | } else { |
matsujirushi | 0:40d65405e747 | 44 | char *temp = new char[len + 1]; |
matsujirushi | 0:40d65405e747 | 45 | vsprintf(temp, format, arg); |
matsujirushi | 0:40d65405e747 | 46 | puts(temp); |
matsujirushi | 0:40d65405e747 | 47 | delete[] temp; |
matsujirushi | 0:40d65405e747 | 48 | } |
matsujirushi | 0:40d65405e747 | 49 | va_end(arg); |
matsujirushi | 0:40d65405e747 | 50 | return len; |
matsujirushi | 0:40d65405e747 | 51 | } |
matsujirushi | 0:40d65405e747 | 52 | |
matsujirushi | 1:833745ae8a7e | 53 | void MjLineSerial::attachReadLine(void (*func)(const char *str)) |
matsujirushi | 1:833745ae8a7e | 54 | { |
matsujirushi | 1:833745ae8a7e | 55 | readLineFunc = func; |
matsujirushi | 1:833745ae8a7e | 56 | } |
matsujirushi | 1:833745ae8a7e | 57 | |
matsujirushi | 1:833745ae8a7e | 58 | void MjLineSerial::task() |
matsujirushi | 1:833745ae8a7e | 59 | { |
matsujirushi | 1:833745ae8a7e | 60 | if (baseSerial->readable()) |
matsujirushi | 1:833745ae8a7e | 61 | { |
matsujirushi | 1:833745ae8a7e | 62 | char c = getc(); |
matsujirushi | 1:833745ae8a7e | 63 | switch (c) |
matsujirushi | 1:833745ae8a7e | 64 | { |
matsujirushi | 1:833745ae8a7e | 65 | case '\r': |
matsujirushi | 1:833745ae8a7e | 66 | if (readLineFunc != NULL) |
matsujirushi | 1:833745ae8a7e | 67 | { |
matsujirushi | 1:833745ae8a7e | 68 | rxBuffer.push_back('\0'); |
matsujirushi | 1:833745ae8a7e | 69 | readLineFunc(rxBuffer.begin()); |
matsujirushi | 1:833745ae8a7e | 70 | } |
matsujirushi | 1:833745ae8a7e | 71 | rxBuffer.clear(); |
matsujirushi | 1:833745ae8a7e | 72 | break; |
matsujirushi | 1:833745ae8a7e | 73 | case '\b': |
matsujirushi | 1:833745ae8a7e | 74 | if (rxBuffer.size() <= 0) |
matsujirushi | 1:833745ae8a7e | 75 | { |
matsujirushi | 1:833745ae8a7e | 76 | putc('\a'); |
matsujirushi | 1:833745ae8a7e | 77 | } |
matsujirushi | 1:833745ae8a7e | 78 | else |
matsujirushi | 1:833745ae8a7e | 79 | { |
matsujirushi | 1:833745ae8a7e | 80 | rxBuffer.pop_back(); |
matsujirushi | 1:833745ae8a7e | 81 | puts("\b \b"); |
matsujirushi | 1:833745ae8a7e | 82 | } |
matsujirushi | 1:833745ae8a7e | 83 | break; |
matsujirushi | 1:833745ae8a7e | 84 | default: |
matsujirushi | 1:833745ae8a7e | 85 | rxBuffer.push_back(c); |
matsujirushi | 1:833745ae8a7e | 86 | putc(c); |
matsujirushi | 1:833745ae8a7e | 87 | break; |
matsujirushi | 1:833745ae8a7e | 88 | } |
matsujirushi | 1:833745ae8a7e | 89 | } |
matsujirushi | 1:833745ae8a7e | 90 | } |
matsujirushi | 1:833745ae8a7e | 91 | |
matsujirushi | 0:40d65405e747 | 92 | } // namespace matsujirushi |
matsujirushi | 0:40d65405e747 | 93 |