Multi-Hackers / SocketModem

Dependents:   M2X_dev axeda_wrapper_dev MTS_M2x_Example1 MTS_Cellular_Connect_Example ... more

Committer:
mfiore
Date:
Thu Dec 19 19:49:58 2013 +0000
Revision:
39:6e94520a3217
Parent:
35:f28acb1be52d
Child:
43:3cacf019ed7d
add mts namespace to files in cellular/, io/, and utils/ directories; prepend CELL_ to some enums in cellular.h to avoid conflict with HTTPClient class; added AxedaWrapper class for sending data to Axeda backend

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 39:6e94520a3217 6 using namespace mts;
mfiore 39:6e94520a3217 7
mfiore 2:8d3ea0dfce39 8 MTSCircularBuffer::MTSCircularBuffer(int bufferSize) : bufferSize(bufferSize), readIndex(0), writeIndex(0), _threshold(-1), _op(Vars::GREATER)
jengbrecht 0:563b70517320 9 {
jengbrecht 0:563b70517320 10 buffer = new char[bufferSize];
jengbrecht 0:563b70517320 11 }
jengbrecht 0:563b70517320 12
jengbrecht 0:563b70517320 13 MTSCircularBuffer::~MTSCircularBuffer()
jengbrecht 0:563b70517320 14 {
jengbrecht 0:563b70517320 15 delete[] buffer;
jengbrecht 0:563b70517320 16 }
jengbrecht 0:563b70517320 17
jengbrecht 0:563b70517320 18 int MTSCircularBuffer::getSize()
jengbrecht 0:563b70517320 19 {
jengbrecht 0:563b70517320 20 return bufferSize;
jengbrecht 0:563b70517320 21 }
jengbrecht 0:563b70517320 22
jengbrecht 0:563b70517320 23 int MTSCircularBuffer::read(char* data, int length)
jengbrecht 0:563b70517320 24 {
jengbrecht 0:563b70517320 25 int i = 0;
jengbrecht 0:563b70517320 26 while ((i < length) && (available() > 0)) {
jengbrecht 0:563b70517320 27 if (readIndex == bufferSize) {
jengbrecht 0:563b70517320 28 readIndex = 0;
jengbrecht 0:563b70517320 29 }
jengbrecht 0:563b70517320 30 data[i++] = buffer[readIndex++];
jengbrecht 0:563b70517320 31 }
jengbrecht 0:563b70517320 32 checkThreshold();
jengbrecht 0:563b70517320 33 return i;
jengbrecht 0:563b70517320 34 }
jengbrecht 0:563b70517320 35
sgodinez 17:2d7c4ea7491b 36 int MTSCircularBuffer::read(char& data)
jengbrecht 0:563b70517320 37 {
jengbrecht 0:563b70517320 38 if (available() == 0) {
sgodinez 35:f28acb1be52d 39 return 0;
jengbrecht 0:563b70517320 40 }
jengbrecht 0:563b70517320 41 if (readIndex == bufferSize) {
jengbrecht 0:563b70517320 42 readIndex = 0;
jengbrecht 0:563b70517320 43 }
sgodinez 17:2d7c4ea7491b 44 data = buffer[readIndex++];
jengbrecht 0:563b70517320 45 checkThreshold();
sgodinez 17:2d7c4ea7491b 46 return 1;
jengbrecht 0:563b70517320 47 }
jengbrecht 0:563b70517320 48
jengbrecht 0:563b70517320 49 int MTSCircularBuffer::write(char* data, int length)
jengbrecht 0:563b70517320 50 {
jengbrecht 0:563b70517320 51 if (length > capacity()) {
sgodinez 35:f28acb1be52d 52 return 0;
jengbrecht 0:563b70517320 53 }
jengbrecht 0:563b70517320 54 int i = 0;
jengbrecht 0:563b70517320 55 while((i < length) && (available() < bufferSize)) {
jengbrecht 0:563b70517320 56 if(writeIndex == bufferSize) {
jengbrecht 0:563b70517320 57 writeIndex = 0;
jengbrecht 0:563b70517320 58 }
jengbrecht 0:563b70517320 59 buffer[writeIndex++] = data[i++];
jengbrecht 0:563b70517320 60 }
jengbrecht 0:563b70517320 61 checkThreshold();
mfiore 2:8d3ea0dfce39 62 return i;
jengbrecht 0:563b70517320 63 }
jengbrecht 0:563b70517320 64
jengbrecht 0:563b70517320 65 int MTSCircularBuffer::write(char data)
jengbrecht 0:563b70517320 66 {
jengbrecht 0:563b70517320 67 if (available() == bufferSize) {
sgodinez 35:f28acb1be52d 68 return 0;
jengbrecht 0:563b70517320 69 }
jengbrecht 0:563b70517320 70 if(writeIndex == bufferSize) {
jengbrecht 0:563b70517320 71 writeIndex = 0;
jengbrecht 0:563b70517320 72 }
jengbrecht 0:563b70517320 73 buffer[writeIndex++] = data;
jengbrecht 0:563b70517320 74 checkThreshold();
mfiore 2:8d3ea0dfce39 75 return 1;
jengbrecht 0:563b70517320 76 }
jengbrecht 0:563b70517320 77
jengbrecht 0:563b70517320 78 int MTSCircularBuffer::capacity()
jengbrecht 0:563b70517320 79 {
jengbrecht 0:563b70517320 80 return bufferSize - available();
jengbrecht 0:563b70517320 81 }
jengbrecht 0:563b70517320 82
jengbrecht 0:563b70517320 83 int MTSCircularBuffer::available()
jengbrecht 0:563b70517320 84 {
jengbrecht 0:563b70517320 85 if (readIndex <= writeIndex) {
jengbrecht 0:563b70517320 86 return writeIndex - readIndex;
jengbrecht 0:563b70517320 87 } else {
jengbrecht 0:563b70517320 88 return bufferSize + writeIndex - readIndex;
jengbrecht 0:563b70517320 89 }
jengbrecht 0:563b70517320 90 }
jengbrecht 0:563b70517320 91
jengbrecht 0:563b70517320 92 bool MTSCircularBuffer::isFull()
jengbrecht 0:563b70517320 93 {
jengbrecht 0:563b70517320 94 if (available() == bufferSize) {
jengbrecht 0:563b70517320 95 return true;
jengbrecht 0:563b70517320 96 } else {
jengbrecht 0:563b70517320 97 return false;
jengbrecht 0:563b70517320 98 }
jengbrecht 0:563b70517320 99 }
jengbrecht 0:563b70517320 100
jengbrecht 0:563b70517320 101 bool MTSCircularBuffer::isEmpty()
jengbrecht 0:563b70517320 102 {
jengbrecht 0:563b70517320 103 if (available() == 0) {
jengbrecht 0:563b70517320 104 return true;
jengbrecht 0:563b70517320 105 } else {
jengbrecht 0:563b70517320 106 return false;
jengbrecht 0:563b70517320 107 }
jengbrecht 0:563b70517320 108 }
jengbrecht 0:563b70517320 109
jengbrecht 0:563b70517320 110 void MTSCircularBuffer::clear()
jengbrecht 0:563b70517320 111 {
jengbrecht 0:563b70517320 112 writeIndex = readIndex;
jengbrecht 0:563b70517320 113 }
jengbrecht 0:563b70517320 114
jengbrecht 0:563b70517320 115 void MTSCircularBuffer::checkThreshold()
jengbrecht 0:563b70517320 116 {
mfiore 2:8d3ea0dfce39 117 if (_threshold == -1) {
jengbrecht 0:563b70517320 118 return;
jengbrecht 0:563b70517320 119 }
mfiore 2:8d3ea0dfce39 120 switch (_op) {
jengbrecht 0:563b70517320 121 case Vars::GREATER:
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::LESS:
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::GREATER_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::LESS_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 case Vars::EQUAL:
mfiore 2:8d3ea0dfce39 142 if (available() == _threshold) {
jengbrecht 0:563b70517320 143 notify.call();
jengbrecht 0:563b70517320 144 }
jengbrecht 0:563b70517320 145 break;
jengbrecht 0:563b70517320 146 }
jengbrecht 0:563b70517320 147 }
jengbrecht 0:563b70517320 148
jengbrecht 0:563b70517320 149 #endif /* MTSCIRCULARBUFFER_CPP */