Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
LineSerial.cpp@0:d3ca6a57e60b, 2014-10-13 (annotated)
- 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?
| 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 | 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 |