Multi-Hackers / SocketModem

Dependents:   M2X_dev axeda_wrapper_dev MTS_M2x_Example1 MTS_Cellular_Connect_Example ... more

Committer:
jengbrecht
Date:
Thu Dec 19 21:38:01 2013 +0000
Revision:
45:40745c2036cf
Parent:
35:f28acb1be52d
Child:
46:b30547bf07d5
Added a ton of documentation, made the notify start and stop methods private in MTSSerialFlowControl, added format method to the serial classes, fixed an issue in the bulk write method of MTSCircularBuffer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jengbrecht 0:563b70517320 1 #ifndef MTSCIRCULARBUFFER_CPP
jengbrecht 0:563b70517320 2 #define MTSCIRCULARBUFFER_CPP
jengbrecht 0:563b70517320 3
jengbrecht 0:563b70517320 4 #include "MTSCircularBuffer.h"
jengbrecht 0:563b70517320 5
mfiore 2:8d3ea0dfce39 6 MTSCircularBuffer::MTSCircularBuffer(int bufferSize) : bufferSize(bufferSize), readIndex(0), writeIndex(0), _threshold(-1), _op(Vars::GREATER)
jengbrecht 0:563b70517320 7 {
jengbrecht 0:563b70517320 8 buffer = new char[bufferSize];
jengbrecht 0:563b70517320 9 }
jengbrecht 0:563b70517320 10
jengbrecht 0:563b70517320 11 MTSCircularBuffer::~MTSCircularBuffer()
jengbrecht 0:563b70517320 12 {
jengbrecht 0:563b70517320 13 delete[] buffer;
jengbrecht 0:563b70517320 14 }
jengbrecht 0:563b70517320 15
jengbrecht 0:563b70517320 16 int MTSCircularBuffer::getSize()
jengbrecht 0:563b70517320 17 {
jengbrecht 0:563b70517320 18 return bufferSize;
jengbrecht 0:563b70517320 19 }
jengbrecht 0:563b70517320 20
jengbrecht 0:563b70517320 21 int MTSCircularBuffer::read(char* data, int length)
jengbrecht 0:563b70517320 22 {
jengbrecht 0:563b70517320 23 int i = 0;
jengbrecht 0:563b70517320 24 while ((i < length) && (available() > 0)) {
jengbrecht 0:563b70517320 25 if (readIndex == bufferSize) {
jengbrecht 0:563b70517320 26 readIndex = 0;
jengbrecht 0:563b70517320 27 }
jengbrecht 0:563b70517320 28 data[i++] = buffer[readIndex++];
jengbrecht 0:563b70517320 29 }
jengbrecht 0:563b70517320 30 checkThreshold();
jengbrecht 0:563b70517320 31 return i;
jengbrecht 0:563b70517320 32 }
jengbrecht 0:563b70517320 33
sgodinez 17:2d7c4ea7491b 34 int MTSCircularBuffer::read(char& data)
jengbrecht 0:563b70517320 35 {
jengbrecht 0:563b70517320 36 if (available() == 0) {
sgodinez 35:f28acb1be52d 37 return 0;
jengbrecht 0:563b70517320 38 }
jengbrecht 0:563b70517320 39 if (readIndex == bufferSize) {
jengbrecht 0:563b70517320 40 readIndex = 0;
jengbrecht 0:563b70517320 41 }
sgodinez 17:2d7c4ea7491b 42 data = buffer[readIndex++];
jengbrecht 0:563b70517320 43 checkThreshold();
sgodinez 17:2d7c4ea7491b 44 return 1;
jengbrecht 0:563b70517320 45 }
jengbrecht 0:563b70517320 46
jengbrecht 0:563b70517320 47 int MTSCircularBuffer::write(char* data, int length)
jengbrecht 0:563b70517320 48 {
jengbrecht 0:563b70517320 49 int i = 0;
jengbrecht 0:563b70517320 50 while((i < length) && (available() < bufferSize)) {
jengbrecht 0:563b70517320 51 if(writeIndex == bufferSize) {
jengbrecht 0:563b70517320 52 writeIndex = 0;
jengbrecht 0:563b70517320 53 }
jengbrecht 0:563b70517320 54 buffer[writeIndex++] = data[i++];
jengbrecht 0:563b70517320 55 }
jengbrecht 0:563b70517320 56 checkThreshold();
mfiore 2:8d3ea0dfce39 57 return i;
jengbrecht 0:563b70517320 58 }
jengbrecht 0:563b70517320 59
jengbrecht 0:563b70517320 60 int MTSCircularBuffer::write(char data)
jengbrecht 0:563b70517320 61 {
jengbrecht 0:563b70517320 62 if (available() == bufferSize) {
sgodinez 35:f28acb1be52d 63 return 0;
jengbrecht 0:563b70517320 64 }
jengbrecht 0:563b70517320 65 if(writeIndex == bufferSize) {
jengbrecht 0:563b70517320 66 writeIndex = 0;
jengbrecht 0:563b70517320 67 }
jengbrecht 0:563b70517320 68 buffer[writeIndex++] = data;
jengbrecht 0:563b70517320 69 checkThreshold();
mfiore 2:8d3ea0dfce39 70 return 1;
jengbrecht 0:563b70517320 71 }
jengbrecht 0:563b70517320 72
jengbrecht 0:563b70517320 73 int MTSCircularBuffer::capacity()
jengbrecht 0:563b70517320 74 {
jengbrecht 0:563b70517320 75 return bufferSize - available();
jengbrecht 0:563b70517320 76 }
jengbrecht 0:563b70517320 77
jengbrecht 0:563b70517320 78 int MTSCircularBuffer::available()
jengbrecht 0:563b70517320 79 {
jengbrecht 0:563b70517320 80 if (readIndex <= writeIndex) {
jengbrecht 0:563b70517320 81 return writeIndex - readIndex;
jengbrecht 0:563b70517320 82 } else {
jengbrecht 0:563b70517320 83 return bufferSize + writeIndex - readIndex;
jengbrecht 0:563b70517320 84 }
jengbrecht 0:563b70517320 85 }
jengbrecht 0:563b70517320 86
jengbrecht 0:563b70517320 87 bool MTSCircularBuffer::isFull()
jengbrecht 0:563b70517320 88 {
jengbrecht 0:563b70517320 89 if (available() == bufferSize) {
jengbrecht 0:563b70517320 90 return true;
jengbrecht 0:563b70517320 91 } else {
jengbrecht 0:563b70517320 92 return false;
jengbrecht 0:563b70517320 93 }
jengbrecht 0:563b70517320 94 }
jengbrecht 0:563b70517320 95
jengbrecht 0:563b70517320 96 bool MTSCircularBuffer::isEmpty()
jengbrecht 0:563b70517320 97 {
jengbrecht 0:563b70517320 98 if (available() == 0) {
jengbrecht 0:563b70517320 99 return true;
jengbrecht 0:563b70517320 100 } else {
jengbrecht 0:563b70517320 101 return false;
jengbrecht 0:563b70517320 102 }
jengbrecht 0:563b70517320 103 }
jengbrecht 0:563b70517320 104
jengbrecht 0:563b70517320 105 void MTSCircularBuffer::clear()
jengbrecht 0:563b70517320 106 {
jengbrecht 0:563b70517320 107 writeIndex = readIndex;
jengbrecht 0:563b70517320 108 }
jengbrecht 0:563b70517320 109
jengbrecht 0:563b70517320 110 void MTSCircularBuffer::checkThreshold()
jengbrecht 0:563b70517320 111 {
mfiore 2:8d3ea0dfce39 112 if (_threshold == -1) {
jengbrecht 0:563b70517320 113 return;
jengbrecht 0:563b70517320 114 }
mfiore 2:8d3ea0dfce39 115 switch (_op) {
jengbrecht 0:563b70517320 116 case Vars::GREATER:
mfiore 2:8d3ea0dfce39 117 if (available() > _threshold) {
jengbrecht 0:563b70517320 118 notify.call();
jengbrecht 0:563b70517320 119 }
jengbrecht 0:563b70517320 120 break;
jengbrecht 0:563b70517320 121 case Vars::LESS:
mfiore 2:8d3ea0dfce39 122 if (available() < _threshold) {
jengbrecht 0:563b70517320 123 notify.call();
jengbrecht 0:563b70517320 124 }
jengbrecht 0:563b70517320 125 break;
jengbrecht 0:563b70517320 126 case Vars::GREATER_EQUAL:
mfiore 2:8d3ea0dfce39 127 if (available() >= _threshold) {
jengbrecht 0:563b70517320 128 notify.call();
jengbrecht 0:563b70517320 129 }
jengbrecht 0:563b70517320 130 break;
jengbrecht 0:563b70517320 131 case Vars::LESS_EQUAL:
mfiore 2:8d3ea0dfce39 132 if (available() <= _threshold) {
jengbrecht 0:563b70517320 133 notify.call();
jengbrecht 0:563b70517320 134 }
jengbrecht 0:563b70517320 135 break;
jengbrecht 0:563b70517320 136 case Vars::EQUAL:
mfiore 2:8d3ea0dfce39 137 if (available() == _threshold) {
jengbrecht 0:563b70517320 138 notify.call();
jengbrecht 0:563b70517320 139 }
jengbrecht 0:563b70517320 140 break;
jengbrecht 0:563b70517320 141 }
jengbrecht 0:563b70517320 142 }
jengbrecht 0:563b70517320 143
jengbrecht 0:563b70517320 144 #endif /* MTSCIRCULARBUFFER_CPP */