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.
Fork of MTS-Serial by
MTSBufferedIO.cpp@10:b18a1064dfc6, 2015-01-23 (annotated)
- Committer:
- Mike Fiore
- Date:
- Fri Jan 23 16:52:25 2015 -0600
- Revision:
- 10:b18a1064dfc6
- Parent:
- 4:d348d001283b
- Child:
- 11:4afbbafcd6b3
use mts_min/mts_max inline functions instead of MIN/MAX macros - macros break in IAR
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Mike Fiore |
4:d348d001283b | 1 | #include "mbed.h" |
| Mike Fiore |
1:d34b566d6f47 | 2 | #include "MTSBufferedIO.h" |
| Mike Fiore |
3:8e3cb3371b09 | 3 | #include "Utils.h" |
| Mike Fiore |
1:d34b566d6f47 | 4 | |
| Mike Fiore |
1:d34b566d6f47 | 5 | using namespace mts; |
| Mike Fiore |
1:d34b566d6f47 | 6 | |
| Mike Fiore |
1:d34b566d6f47 | 7 | MTSBufferedIO::MTSBufferedIO(int txBufferSize, int rxBufferSize) |
| Mike Fiore |
1:d34b566d6f47 | 8 | : txBuffer(txBufferSize) |
| Mike Fiore |
1:d34b566d6f47 | 9 | , rxBuffer(rxBufferSize) |
| Mike Fiore |
1:d34b566d6f47 | 10 | { |
| Mike Fiore |
1:d34b566d6f47 | 11 | } |
| Mike Fiore |
1:d34b566d6f47 | 12 | |
| Mike Fiore |
1:d34b566d6f47 | 13 | MTSBufferedIO::~MTSBufferedIO() |
| Mike Fiore |
1:d34b566d6f47 | 14 | { |
| Mike Fiore |
1:d34b566d6f47 | 15 | } |
| Mike Fiore |
1:d34b566d6f47 | 16 | |
| Mike Fiore |
1:d34b566d6f47 | 17 | int MTSBufferedIO::write(const char* data, int length, unsigned int timeoutMillis) |
| Mike Fiore |
1:d34b566d6f47 | 18 | { |
| Mike Fiore |
1:d34b566d6f47 | 19 | //Writes until empty or timeout is reached (different implementation planned once tx isr is working) |
| Mike Fiore |
1:d34b566d6f47 | 20 | int bytesWritten = 0; |
| Mike Fiore |
1:d34b566d6f47 | 21 | Timer tmr; |
| Mike Fiore |
1:d34b566d6f47 | 22 | tmr.start(); |
| Mike Fiore |
10:b18a1064dfc6 | 23 | length = mts_max(0,length); |
| Mike Fiore |
1:d34b566d6f47 | 24 | do { |
| Mike Fiore |
1:d34b566d6f47 | 25 | int bytesWrittenSwBuffer = txBuffer.write(&data[bytesWritten], length - bytesWritten); |
| Mike Fiore |
1:d34b566d6f47 | 26 | if(bytesWrittenSwBuffer > 0) { |
| Mike Fiore |
1:d34b566d6f47 | 27 | handleWrite(); |
| Mike Fiore |
1:d34b566d6f47 | 28 | int bytesRemainingSwBuffer = txBuffer.size(); |
| Mike Fiore |
1:d34b566d6f47 | 29 | txBuffer.clear(); |
| Mike Fiore |
1:d34b566d6f47 | 30 | bytesWritten += (bytesWrittenSwBuffer - bytesRemainingSwBuffer); |
| Mike Fiore |
1:d34b566d6f47 | 31 | } |
| Mike Fiore |
1:d34b566d6f47 | 32 | } while(tmr.read_ms() <= timeoutMillis && bytesWritten < length); |
| Mike Fiore |
1:d34b566d6f47 | 33 | return bytesWritten; |
| Mike Fiore |
1:d34b566d6f47 | 34 | } |
| Mike Fiore |
1:d34b566d6f47 | 35 | |
| Mike Fiore |
1:d34b566d6f47 | 36 | int MTSBufferedIO::write(const char* data, int length) |
| Mike Fiore |
1:d34b566d6f47 | 37 | { |
| Mike Fiore |
1:d34b566d6f47 | 38 | //Blocks until all bytes are written (different implementation planned once tx isr is working) |
| Mike Fiore |
1:d34b566d6f47 | 39 | int bytesWritten = 0; |
| Mike Fiore |
10:b18a1064dfc6 | 40 | length = mts_max(0,length); |
| Mike Fiore |
1:d34b566d6f47 | 41 | do { |
| Mike Fiore |
1:d34b566d6f47 | 42 | int bytesWrittenSwBuffer = txBuffer.write(&data[bytesWritten], length - bytesWritten); |
| Mike Fiore |
1:d34b566d6f47 | 43 | handleWrite(); |
| Mike Fiore |
1:d34b566d6f47 | 44 | int bytesRemainingSwBuffer = txBuffer.size(); |
| Mike Fiore |
1:d34b566d6f47 | 45 | txBuffer.clear(); |
| Mike Fiore |
1:d34b566d6f47 | 46 | bytesWritten += bytesWrittenSwBuffer - bytesRemainingSwBuffer; |
| Mike Fiore |
1:d34b566d6f47 | 47 | } while(bytesWritten < length); |
| Mike Fiore |
1:d34b566d6f47 | 48 | return length; |
| Mike Fiore |
1:d34b566d6f47 | 49 | } |
| Mike Fiore |
1:d34b566d6f47 | 50 | |
| Mike Fiore |
1:d34b566d6f47 | 51 | int MTSBufferedIO::write(char data, unsigned int timeoutMillis) |
| Mike Fiore |
1:d34b566d6f47 | 52 | { |
| Mike Fiore |
1:d34b566d6f47 | 53 | return write(&data, 1, timeoutMillis); |
| Mike Fiore |
1:d34b566d6f47 | 54 | } |
| Mike Fiore |
1:d34b566d6f47 | 55 | |
| Mike Fiore |
1:d34b566d6f47 | 56 | int MTSBufferedIO::write(char data) |
| Mike Fiore |
1:d34b566d6f47 | 57 | { |
| Mike Fiore |
1:d34b566d6f47 | 58 | return write(&data, 1); |
| Mike Fiore |
1:d34b566d6f47 | 59 | } |
| Mike Fiore |
1:d34b566d6f47 | 60 | |
| Mike Fiore |
1:d34b566d6f47 | 61 | int MTSBufferedIO::writeable() { |
| Mike Fiore |
1:d34b566d6f47 | 62 | return txBuffer.remaining(); |
| Mike Fiore |
1:d34b566d6f47 | 63 | } |
| Mike Fiore |
1:d34b566d6f47 | 64 | |
| Mike Fiore |
1:d34b566d6f47 | 65 | int MTSBufferedIO::read(char* data, int length, unsigned int timeoutMillis) |
| Mike Fiore |
1:d34b566d6f47 | 66 | { |
| Mike Fiore |
1:d34b566d6f47 | 67 | int bytesRead = 0; |
| Mike Fiore |
1:d34b566d6f47 | 68 | Timer tmr; |
| Mike Fiore |
1:d34b566d6f47 | 69 | tmr.start(); |
| Mike Fiore |
10:b18a1064dfc6 | 70 | length = mts_max(0,length); |
| Mike Fiore |
1:d34b566d6f47 | 71 | do { |
| Mike Fiore |
1:d34b566d6f47 | 72 | bytesRead += rxBuffer.read(&data[bytesRead], length - bytesRead); |
| Mike Fiore |
1:d34b566d6f47 | 73 | } while(tmr.read_ms() <= timeoutMillis && bytesRead < length); |
| Mike Fiore |
1:d34b566d6f47 | 74 | return bytesRead; |
| Mike Fiore |
1:d34b566d6f47 | 75 | } |
| Mike Fiore |
1:d34b566d6f47 | 76 | |
| Mike Fiore |
1:d34b566d6f47 | 77 | int MTSBufferedIO::read(char* data, int length) |
| Mike Fiore |
1:d34b566d6f47 | 78 | { |
| Mike Fiore |
1:d34b566d6f47 | 79 | int bytesRead = 0; |
| Mike Fiore |
10:b18a1064dfc6 | 80 | length = mts_max(0,length); |
| Mike Fiore |
1:d34b566d6f47 | 81 | while(bytesRead < length) { |
| Mike Fiore |
1:d34b566d6f47 | 82 | bytesRead += rxBuffer.read(&data[bytesRead], length - bytesRead); |
| Mike Fiore |
1:d34b566d6f47 | 83 | } |
| Mike Fiore |
1:d34b566d6f47 | 84 | return length; |
| Mike Fiore |
1:d34b566d6f47 | 85 | } |
| Mike Fiore |
1:d34b566d6f47 | 86 | |
| Mike Fiore |
1:d34b566d6f47 | 87 | int MTSBufferedIO::read(char& data, unsigned int timeoutMillis) |
| Mike Fiore |
1:d34b566d6f47 | 88 | { |
| Mike Fiore |
1:d34b566d6f47 | 89 | return read(&data, 1, timeoutMillis); |
| Mike Fiore |
1:d34b566d6f47 | 90 | } |
| Mike Fiore |
1:d34b566d6f47 | 91 | |
| Mike Fiore |
1:d34b566d6f47 | 92 | int MTSBufferedIO::read(char& data) |
| Mike Fiore |
1:d34b566d6f47 | 93 | { |
| Mike Fiore |
1:d34b566d6f47 | 94 | return rxBuffer.read(&data, 1); |
| Mike Fiore |
1:d34b566d6f47 | 95 | } |
| Mike Fiore |
1:d34b566d6f47 | 96 | |
| Mike Fiore |
1:d34b566d6f47 | 97 | int MTSBufferedIO::readable() { |
| Mike Fiore |
1:d34b566d6f47 | 98 | return rxBuffer.size(); |
| Mike Fiore |
1:d34b566d6f47 | 99 | } |
| Mike Fiore |
1:d34b566d6f47 | 100 | |
| Mike Fiore |
1:d34b566d6f47 | 101 | bool MTSBufferedIO::txEmpty() |
| Mike Fiore |
1:d34b566d6f47 | 102 | { |
| Mike Fiore |
1:d34b566d6f47 | 103 | return txBuffer.isEmpty(); |
| Mike Fiore |
1:d34b566d6f47 | 104 | } |
| Mike Fiore |
1:d34b566d6f47 | 105 | |
| Mike Fiore |
1:d34b566d6f47 | 106 | bool MTSBufferedIO::rxEmpty() |
| Mike Fiore |
1:d34b566d6f47 | 107 | { |
| Mike Fiore |
1:d34b566d6f47 | 108 | return rxBuffer.isEmpty(); |
| Mike Fiore |
1:d34b566d6f47 | 109 | } |
| Mike Fiore |
1:d34b566d6f47 | 110 | |
| Mike Fiore |
1:d34b566d6f47 | 111 | bool MTSBufferedIO::txFull() |
| Mike Fiore |
1:d34b566d6f47 | 112 | { |
| Mike Fiore |
1:d34b566d6f47 | 113 | return txBuffer.isFull(); |
| Mike Fiore |
1:d34b566d6f47 | 114 | } |
| Mike Fiore |
1:d34b566d6f47 | 115 | |
| Mike Fiore |
1:d34b566d6f47 | 116 | bool MTSBufferedIO::rxFull() |
| Mike Fiore |
1:d34b566d6f47 | 117 | { |
| Mike Fiore |
1:d34b566d6f47 | 118 | return rxBuffer.isFull(); |
| Mike Fiore |
1:d34b566d6f47 | 119 | } |
| Mike Fiore |
1:d34b566d6f47 | 120 | |
| Mike Fiore |
1:d34b566d6f47 | 121 | void MTSBufferedIO::txClear() |
| Mike Fiore |
1:d34b566d6f47 | 122 | { |
| Mike Fiore |
1:d34b566d6f47 | 123 | txBuffer.clear(); |
| Mike Fiore |
1:d34b566d6f47 | 124 | } |
| Mike Fiore |
1:d34b566d6f47 | 125 | |
| Mike Fiore |
1:d34b566d6f47 | 126 | void MTSBufferedIO::rxClear() |
| Mike Fiore |
1:d34b566d6f47 | 127 | { |
| Mike Fiore |
1:d34b566d6f47 | 128 | rxBuffer.clear(); |
| Mike Fiore |
1:d34b566d6f47 | 129 | } |
