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();
    }
}
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?

UserRevisionLine numberNew 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