Multi-Hackers / SocketModem

Dependents:   M2X_dev axeda_wrapper_dev MTS_M2x_Example1 MTS_Cellular_Connect_Example ... more

Committer:
sgodinez
Date:
Fri Dec 27 15:51:19 2013 +0000
Revision:
84:77c5ab16534d
Parent:
67:1003b410f781
Child:
141:571e0ef6c8dc
Employed RTS threshold algorithm.  Removed header guards from cpp files.

Who changed what in which revision?

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