Interactive functions for UART.
It's old library. Please change the new library "MjLineSerial".
LineSerial.cpp@1:2338acfb180d, 2014-10-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |