Interactive functions for UART.

It's old library. Please change the new library "MjLineSerial".

Committer:
matsujirushi
Date:
Mon Oct 13 13:01:36 2014 +0000
Revision:
1:2338acfb180d
Parent:
0:d3ca6a57e60b
Erase a char then key in backspace.

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 1:2338acfb180d 70 this->puts("\b \b");
matsujirushi 1:2338acfb180d 71
matsujirushi 0:d3ca6a57e60b 72 }
matsujirushi 0:d3ca6a57e60b 73 break;
matsujirushi 0:d3ca6a57e60b 74 default:
matsujirushi 0:d3ca6a57e60b 75 if (!this->appendReadBuffer(c))
matsujirushi 0:d3ca6a57e60b 76 {
matsujirushi 0:d3ca6a57e60b 77 this->putc('\a');
matsujirushi 0:d3ca6a57e60b 78 }
matsujirushi 0:d3ca6a57e60b 79 else
matsujirushi 0:d3ca6a57e60b 80 {
matsujirushi 0:d3ca6a57e60b 81 this->putc(c);
matsujirushi 0:d3ca6a57e60b 82 }
matsujirushi 0:d3ca6a57e60b 83 break;
matsujirushi 0:d3ca6a57e60b 84 }
matsujirushi 0:d3ca6a57e60b 85 }
matsujirushi 0:d3ca6a57e60b 86 }
matsujirushi 0:d3ca6a57e60b 87
matsujirushi 0:d3ca6a57e60b 88 bool LineSerial::appendReadBuffer(char data)
matsujirushi 0:d3ca6a57e60b 89 {
matsujirushi 0:d3ca6a57e60b 90 if (this->readBuffer == NULL)
matsujirushi 0:d3ca6a57e60b 91 {
matsujirushi 0:d3ca6a57e60b 92 return false;
matsujirushi 0:d3ca6a57e60b 93 }
matsujirushi 0:d3ca6a57e60b 94 if (this->readBufferCount >= this->readBufferSize - 1)
matsujirushi 0:d3ca6a57e60b 95 {
matsujirushi 0:d3ca6a57e60b 96 return false;
matsujirushi 0:d3ca6a57e60b 97 }
matsujirushi 0:d3ca6a57e60b 98
matsujirushi 0:d3ca6a57e60b 99 this->readBuffer[this->readBufferCount++] = data;
matsujirushi 0:d3ca6a57e60b 100 return true;
matsujirushi 0:d3ca6a57e60b 101 }
matsujirushi 0:d3ca6a57e60b 102
matsujirushi 0:d3ca6a57e60b 103 bool LineSerial::removeReadBuffer()
matsujirushi 0:d3ca6a57e60b 104 {
matsujirushi 0:d3ca6a57e60b 105 if (this->readBuffer == NULL)
matsujirushi 0:d3ca6a57e60b 106 {
matsujirushi 0:d3ca6a57e60b 107 return false;
matsujirushi 0:d3ca6a57e60b 108 }
matsujirushi 0:d3ca6a57e60b 109 if (this->readBufferCount <= 0)
matsujirushi 0:d3ca6a57e60b 110 {
matsujirushi 0:d3ca6a57e60b 111 return false;
matsujirushi 0:d3ca6a57e60b 112 }
matsujirushi 0:d3ca6a57e60b 113
matsujirushi 0:d3ca6a57e60b 114 this->readBufferCount--;
matsujirushi 0:d3ca6a57e60b 115 return true;
matsujirushi 0:d3ca6a57e60b 116 }