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 12:30:26 2014 +0000
Revision:
3:e730a11160d7
Parent:
2:84178b3b2824
Child:
4:14ef86f5de57
Fix lost receive data when some sending.

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