Takashi Matsuoka / MJ_LineSerial
Committer:
matsujirushi
Date:
Mon Oct 13 12:50:10 2014 +0000
Revision:
0:d3ca6a57e60b
Child:
1:2338acfb180d
1st commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
matsujirushi 0:d3ca6a57e60b 1 #include "LineSerial.h"
matsujirushi 0:d3ca6a57e60b 2
matsujirushi 0:d3ca6a57e60b 3 LineSerial::LineSerial(PinName tx, PinName rx, const char *name) : Serial(tx, rx, name),
matsujirushi 0:d3ca6a57e60b 4 readBuffer(NULL),
matsujirushi 0:d3ca6a57e60b 5 readBufferSize(0),
matsujirushi 0:d3ca6a57e60b 6 readBufferCount(0),
matsujirushi 0:d3ca6a57e60b 7 readLineFunc(NULL)
matsujirushi 0:d3ca6a57e60b 8 {
matsujirushi 0:d3ca6a57e60b 9 }
matsujirushi 0:d3ca6a57e60b 10
matsujirushi 0:d3ca6a57e60b 11 LineSerial::~LineSerial()
matsujirushi 0:d3ca6a57e60b 12 {
matsujirushi 0:d3ca6a57e60b 13 if (this->readBuffer != NULL)
matsujirushi 0:d3ca6a57e60b 14 {
matsujirushi 0:d3ca6a57e60b 15 delete this->readBuffer;
matsujirushi 0:d3ca6a57e60b 16 this->readBuffer = NULL;
matsujirushi 0:d3ca6a57e60b 17 }
matsujirushi 0:d3ca6a57e60b 18 }
matsujirushi 0:d3ca6a57e60b 19
matsujirushi 0:d3ca6a57e60b 20 void LineSerial::allocateReadBuffer(size_t size)
matsujirushi 0:d3ca6a57e60b 21 {
matsujirushi 0:d3ca6a57e60b 22 // free memory.
matsujirushi 0:d3ca6a57e60b 23 if (this->readBuffer != NULL)
matsujirushi 0:d3ca6a57e60b 24 {
matsujirushi 0:d3ca6a57e60b 25 delete this->readBuffer;
matsujirushi 0:d3ca6a57e60b 26 }
matsujirushi 0:d3ca6a57e60b 27
matsujirushi 0:d3ca6a57e60b 28 // allocate memory.
matsujirushi 0:d3ca6a57e60b 29 if (size <= 0)
matsujirushi 0:d3ca6a57e60b 30 {
matsujirushi 0:d3ca6a57e60b 31 this->readBuffer = NULL;
matsujirushi 0:d3ca6a57e60b 32 }
matsujirushi 0:d3ca6a57e60b 33 else
matsujirushi 0:d3ca6a57e60b 34 {
matsujirushi 0:d3ca6a57e60b 35 this->readBuffer = new char[size];
matsujirushi 0:d3ca6a57e60b 36 }
matsujirushi 0:d3ca6a57e60b 37
matsujirushi 0:d3ca6a57e60b 38 // initialize related values.
matsujirushi 0:d3ca6a57e60b 39 this->readBufferSize = size <= 0 ? 0 : size;
matsujirushi 0:d3ca6a57e60b 40 this->readBufferCount = 0;
matsujirushi 0:d3ca6a57e60b 41 }
matsujirushi 0:d3ca6a57e60b 42
matsujirushi 0:d3ca6a57e60b 43 void LineSerial::attachReadLine(void (*func)(const char* str))
matsujirushi 0:d3ca6a57e60b 44 {
matsujirushi 0:d3ca6a57e60b 45 this->readLineFunc = func;
matsujirushi 0:d3ca6a57e60b 46 }
matsujirushi 0:d3ca6a57e60b 47
matsujirushi 0:d3ca6a57e60b 48 void LineSerial::task()
matsujirushi 0:d3ca6a57e60b 49 {
matsujirushi 0:d3ca6a57e60b 50 if (this->readable())
matsujirushi 0:d3ca6a57e60b 51 {
matsujirushi 0:d3ca6a57e60b 52 char c = this->getc();
matsujirushi 0:d3ca6a57e60b 53 switch (c)
matsujirushi 0:d3ca6a57e60b 54 {
matsujirushi 0:d3ca6a57e60b 55 case '\r':
matsujirushi 0:d3ca6a57e60b 56 if (this->readLineFunc != NULL)
matsujirushi 0:d3ca6a57e60b 57 {
matsujirushi 0:d3ca6a57e60b 58 this->readBuffer[this->readBufferCount] = '\0';
matsujirushi 0:d3ca6a57e60b 59 this->readLineFunc(this->readBuffer);
matsujirushi 0:d3ca6a57e60b 60 this->readBufferCount = 0;
matsujirushi 0:d3ca6a57e60b 61 }
matsujirushi 0:d3ca6a57e60b 62 break;
matsujirushi 0:d3ca6a57e60b 63 case '\b':
matsujirushi 0:d3ca6a57e60b 64 if (!this->removeReadBuffer())
matsujirushi 0:d3ca6a57e60b 65 {
matsujirushi 0:d3ca6a57e60b 66 this->putc('\a');
matsujirushi 0:d3ca6a57e60b 67 }
matsujirushi 0:d3ca6a57e60b 68 else
matsujirushi 0:d3ca6a57e60b 69 {
matsujirushi 0:d3ca6a57e60b 70 this->putc('\b');
matsujirushi 0:d3ca6a57e60b 71 }
matsujirushi 0:d3ca6a57e60b 72 break;
matsujirushi 0:d3ca6a57e60b 73 default:
matsujirushi 0:d3ca6a57e60b 74 if (!this->appendReadBuffer(c))
matsujirushi 0:d3ca6a57e60b 75 {
matsujirushi 0:d3ca6a57e60b 76 this->putc('\a');
matsujirushi 0:d3ca6a57e60b 77 }
matsujirushi 0:d3ca6a57e60b 78 else
matsujirushi 0:d3ca6a57e60b 79 {
matsujirushi 0:d3ca6a57e60b 80 this->putc(c);
matsujirushi 0:d3ca6a57e60b 81 }
matsujirushi 0:d3ca6a57e60b 82 break;
matsujirushi 0:d3ca6a57e60b 83 }
matsujirushi 0:d3ca6a57e60b 84 }
matsujirushi 0:d3ca6a57e60b 85 }
matsujirushi 0:d3ca6a57e60b 86
matsujirushi 0:d3ca6a57e60b 87 bool LineSerial::appendReadBuffer(char data)
matsujirushi 0:d3ca6a57e60b 88 {
matsujirushi 0:d3ca6a57e60b 89 if (this->readBuffer == NULL)
matsujirushi 0:d3ca6a57e60b 90 {
matsujirushi 0:d3ca6a57e60b 91 return false;
matsujirushi 0:d3ca6a57e60b 92 }
matsujirushi 0:d3ca6a57e60b 93 if (this->readBufferCount >= this->readBufferSize - 1)
matsujirushi 0:d3ca6a57e60b 94 {
matsujirushi 0:d3ca6a57e60b 95 return false;
matsujirushi 0:d3ca6a57e60b 96 }
matsujirushi 0:d3ca6a57e60b 97
matsujirushi 0:d3ca6a57e60b 98 this->readBuffer[this->readBufferCount++] = data;
matsujirushi 0:d3ca6a57e60b 99 return true;
matsujirushi 0:d3ca6a57e60b 100 }
matsujirushi 0:d3ca6a57e60b 101
matsujirushi 0:d3ca6a57e60b 102 bool LineSerial::removeReadBuffer()
matsujirushi 0:d3ca6a57e60b 103 {
matsujirushi 0:d3ca6a57e60b 104 if (this->readBuffer == NULL)
matsujirushi 0:d3ca6a57e60b 105 {
matsujirushi 0:d3ca6a57e60b 106 return false;
matsujirushi 0:d3ca6a57e60b 107 }
matsujirushi 0:d3ca6a57e60b 108 if (this->readBufferCount <= 0)
matsujirushi 0:d3ca6a57e60b 109 {
matsujirushi 0:d3ca6a57e60b 110 return false;
matsujirushi 0:d3ca6a57e60b 111 }
matsujirushi 0:d3ca6a57e60b 112
matsujirushi 0:d3ca6a57e60b 113 this->readBufferCount--;
matsujirushi 0:d3ca6a57e60b 114 return true;
matsujirushi 0:d3ca6a57e60b 115 }
matsujirushi 0:d3ca6a57e60b 116