Multi-Hackers / SocketModem

Dependents:   M2X_dev axeda_wrapper_dev MTS_M2x_Example1 MTS_Cellular_Connect_Example ... more

Committer:
jengbrecht
Date:
Mon Dec 09 15:29:35 2013 +0000
Revision:
0:563b70517320
Child:
2:8d3ea0dfce39
Initial Commit Library!

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
jengbrecht 0:563b70517320 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
jengbrecht 0:563b70517320 34 int MTSCircularBuffer::read()
jengbrecht 0:563b70517320 35 {
jengbrecht 0:563b70517320 36 if (available() == 0) {
jengbrecht 0:563b70517320 37 return -1;
jengbrecht 0:563b70517320 38 }
jengbrecht 0:563b70517320 39 if (readIndex == bufferSize) {
jengbrecht 0:563b70517320 40 readIndex = 0;
jengbrecht 0:563b70517320 41 }
jengbrecht 0:563b70517320 42 int tmp = buffer[readIndex++];
jengbrecht 0:563b70517320 43 checkThreshold();
jengbrecht 0:563b70517320 44 return tmp;
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 if (length > capacity()) {
jengbrecht 0:563b70517320 50 return -1;
jengbrecht 0:563b70517320 51 }
jengbrecht 0:563b70517320 52 int i = 0;
jengbrecht 0:563b70517320 53 while((i < length) && (available() < bufferSize)) {
jengbrecht 0:563b70517320 54 if(writeIndex == bufferSize) {
jengbrecht 0:563b70517320 55 writeIndex = 0;
jengbrecht 0:563b70517320 56 }
jengbrecht 0:563b70517320 57 buffer[writeIndex++] = data[i++];
jengbrecht 0:563b70517320 58 }
jengbrecht 0:563b70517320 59 checkThreshold();
jengbrecht 0:563b70517320 60 return capacity();
jengbrecht 0:563b70517320 61 }
jengbrecht 0:563b70517320 62
jengbrecht 0:563b70517320 63 int MTSCircularBuffer::write(char data)
jengbrecht 0:563b70517320 64 {
jengbrecht 0:563b70517320 65 if (available() == bufferSize) {
jengbrecht 0:563b70517320 66 return -1;
jengbrecht 0:563b70517320 67 }
jengbrecht 0:563b70517320 68 if(writeIndex == bufferSize) {
jengbrecht 0:563b70517320 69 writeIndex = 0;
jengbrecht 0:563b70517320 70 }
jengbrecht 0:563b70517320 71 buffer[writeIndex++] = data;
jengbrecht 0:563b70517320 72 checkThreshold();
jengbrecht 0:563b70517320 73 return capacity();
jengbrecht 0:563b70517320 74 }
jengbrecht 0:563b70517320 75
jengbrecht 0:563b70517320 76 void MTSCircularBuffer::attach(void(*fptr)(void), int _threshold, Vars::RelationalOperator _op)
jengbrecht 0:563b70517320 77 {
jengbrecht 0:563b70517320 78 threshold = _threshold;
jengbrecht 0:563b70517320 79 op = _op;
jengbrecht 0:563b70517320 80 notify.attach(fptr);
jengbrecht 0:563b70517320 81 }
jengbrecht 0:563b70517320 82
jengbrecht 0:563b70517320 83 template<typename T>
jengbrecht 0:563b70517320 84 void MTSCircularBuffer::attach(T *tptr, void(T::*mptr)(void), int threshold, Vars::RelationalOperator op)
jengbrecht 0:563b70517320 85 {
jengbrecht 0:563b70517320 86 this.threshold = threshold;
jengbrecht 0:563b70517320 87 this.op = op;
jengbrecht 0:563b70517320 88 notify.attach(tptr, mptr);
jengbrecht 0:563b70517320 89 }
jengbrecht 0:563b70517320 90
jengbrecht 0:563b70517320 91 int MTSCircularBuffer::capacity()
jengbrecht 0:563b70517320 92 {
jengbrecht 0:563b70517320 93 return bufferSize - available();
jengbrecht 0:563b70517320 94 }
jengbrecht 0:563b70517320 95
jengbrecht 0:563b70517320 96 int MTSCircularBuffer::available()
jengbrecht 0:563b70517320 97 {
jengbrecht 0:563b70517320 98 if (readIndex <= writeIndex) {
jengbrecht 0:563b70517320 99 return writeIndex - readIndex;
jengbrecht 0:563b70517320 100 } else {
jengbrecht 0:563b70517320 101 return bufferSize + writeIndex - readIndex;
jengbrecht 0:563b70517320 102 }
jengbrecht 0:563b70517320 103 }
jengbrecht 0:563b70517320 104
jengbrecht 0:563b70517320 105 bool MTSCircularBuffer::isFull()
jengbrecht 0:563b70517320 106 {
jengbrecht 0:563b70517320 107 if (available() == bufferSize) {
jengbrecht 0:563b70517320 108 return true;
jengbrecht 0:563b70517320 109 } else {
jengbrecht 0:563b70517320 110 return false;
jengbrecht 0:563b70517320 111 }
jengbrecht 0:563b70517320 112 }
jengbrecht 0:563b70517320 113
jengbrecht 0:563b70517320 114 bool MTSCircularBuffer::isEmpty()
jengbrecht 0:563b70517320 115 {
jengbrecht 0:563b70517320 116 if (available() == 0) {
jengbrecht 0:563b70517320 117 return true;
jengbrecht 0:563b70517320 118 } else {
jengbrecht 0:563b70517320 119 return false;
jengbrecht 0:563b70517320 120 }
jengbrecht 0:563b70517320 121 }
jengbrecht 0:563b70517320 122
jengbrecht 0:563b70517320 123 void MTSCircularBuffer::clear()
jengbrecht 0:563b70517320 124 {
jengbrecht 0:563b70517320 125 writeIndex = readIndex;
jengbrecht 0:563b70517320 126 }
jengbrecht 0:563b70517320 127
jengbrecht 0:563b70517320 128 void MTSCircularBuffer::checkThreshold()
jengbrecht 0:563b70517320 129 {
jengbrecht 0:563b70517320 130 if (threshold == -1) {
jengbrecht 0:563b70517320 131 return;
jengbrecht 0:563b70517320 132 }
jengbrecht 0:563b70517320 133 switch (op) {
jengbrecht 0:563b70517320 134 case Vars::GREATER:
jengbrecht 0:563b70517320 135 if (available() > threshold) {
jengbrecht 0:563b70517320 136 notify.call();
jengbrecht 0:563b70517320 137 }
jengbrecht 0:563b70517320 138 break;
jengbrecht 0:563b70517320 139 case Vars::LESS:
jengbrecht 0:563b70517320 140 if (available() < threshold) {
jengbrecht 0:563b70517320 141 notify.call();
jengbrecht 0:563b70517320 142 }
jengbrecht 0:563b70517320 143 break;
jengbrecht 0:563b70517320 144 case Vars::GREATER_EQUAL:
jengbrecht 0:563b70517320 145 if (available() >= threshold) {
jengbrecht 0:563b70517320 146 notify.call();
jengbrecht 0:563b70517320 147 }
jengbrecht 0:563b70517320 148 break;
jengbrecht 0:563b70517320 149 case Vars::LESS_EQUAL:
jengbrecht 0:563b70517320 150 if (available() <= threshold) {
jengbrecht 0:563b70517320 151 notify.call();
jengbrecht 0:563b70517320 152 }
jengbrecht 0:563b70517320 153 break;
jengbrecht 0:563b70517320 154 case Vars::EQUAL:
jengbrecht 0:563b70517320 155 if (available() == threshold) {
jengbrecht 0:563b70517320 156 notify.call();
jengbrecht 0:563b70517320 157 }
jengbrecht 0:563b70517320 158 break;
jengbrecht 0:563b70517320 159 }
jengbrecht 0:563b70517320 160 }
jengbrecht 0:563b70517320 161
jengbrecht 0:563b70517320 162 #endif /* MTSCIRCULARBUFFER_CPP */