Multi-Hackers / SocketModem

Dependents:   M2X_dev axeda_wrapper_dev MTS_M2x_Example1 MTS_Cellular_Connect_Example ... more

Committer:
sgodinez
Date:
Mon Dec 16 20:00:20 2013 +0000
Revision:
17:2d7c4ea7491b
Parent:
2:8d3ea0dfce39
Child:
35:f28acb1be52d
TCP send / receive working.  close() still requires some finesse when other end disconnects.

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) {
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 }
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 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();
mfiore 2:8d3ea0dfce39 60 return i;
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();
mfiore 2:8d3ea0dfce39 73 return 1;
jengbrecht 0:563b70517320 74 }
jengbrecht 0:563b70517320 75
jengbrecht 0:563b70517320 76 int MTSCircularBuffer::capacity()
jengbrecht 0:563b70517320 77 {
jengbrecht 0:563b70517320 78 return bufferSize - available();
jengbrecht 0:563b70517320 79 }
jengbrecht 0:563b70517320 80
jengbrecht 0:563b70517320 81 int MTSCircularBuffer::available()
jengbrecht 0:563b70517320 82 {
jengbrecht 0:563b70517320 83 if (readIndex <= writeIndex) {
jengbrecht 0:563b70517320 84 return writeIndex - readIndex;
jengbrecht 0:563b70517320 85 } else {
jengbrecht 0:563b70517320 86 return bufferSize + writeIndex - readIndex;
jengbrecht 0:563b70517320 87 }
jengbrecht 0:563b70517320 88 }
jengbrecht 0:563b70517320 89
jengbrecht 0:563b70517320 90 bool MTSCircularBuffer::isFull()
jengbrecht 0:563b70517320 91 {
jengbrecht 0:563b70517320 92 if (available() == bufferSize) {
jengbrecht 0:563b70517320 93 return true;
jengbrecht 0:563b70517320 94 } else {
jengbrecht 0:563b70517320 95 return false;
jengbrecht 0:563b70517320 96 }
jengbrecht 0:563b70517320 97 }
jengbrecht 0:563b70517320 98
jengbrecht 0:563b70517320 99 bool MTSCircularBuffer::isEmpty()
jengbrecht 0:563b70517320 100 {
jengbrecht 0:563b70517320 101 if (available() == 0) {
jengbrecht 0:563b70517320 102 return true;
jengbrecht 0:563b70517320 103 } else {
jengbrecht 0:563b70517320 104 return false;
jengbrecht 0:563b70517320 105 }
jengbrecht 0:563b70517320 106 }
jengbrecht 0:563b70517320 107
jengbrecht 0:563b70517320 108 void MTSCircularBuffer::clear()
jengbrecht 0:563b70517320 109 {
jengbrecht 0:563b70517320 110 writeIndex = readIndex;
jengbrecht 0:563b70517320 111 }
jengbrecht 0:563b70517320 112
jengbrecht 0:563b70517320 113 void MTSCircularBuffer::checkThreshold()
jengbrecht 0:563b70517320 114 {
mfiore 2:8d3ea0dfce39 115 if (_threshold == -1) {
jengbrecht 0:563b70517320 116 return;
jengbrecht 0:563b70517320 117 }
mfiore 2:8d3ea0dfce39 118 switch (_op) {
jengbrecht 0:563b70517320 119 case Vars::GREATER:
mfiore 2:8d3ea0dfce39 120 if (available() > _threshold) {
jengbrecht 0:563b70517320 121 notify.call();
jengbrecht 0:563b70517320 122 }
jengbrecht 0:563b70517320 123 break;
jengbrecht 0:563b70517320 124 case Vars::LESS:
mfiore 2:8d3ea0dfce39 125 if (available() < _threshold) {
jengbrecht 0:563b70517320 126 notify.call();
jengbrecht 0:563b70517320 127 }
jengbrecht 0:563b70517320 128 break;
jengbrecht 0:563b70517320 129 case Vars::GREATER_EQUAL:
mfiore 2:8d3ea0dfce39 130 if (available() >= _threshold) {
jengbrecht 0:563b70517320 131 notify.call();
jengbrecht 0:563b70517320 132 }
jengbrecht 0:563b70517320 133 break;
jengbrecht 0:563b70517320 134 case Vars::LESS_EQUAL:
mfiore 2:8d3ea0dfce39 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::EQUAL:
mfiore 2:8d3ea0dfce39 140 if (available() == _threshold) {
jengbrecht 0:563b70517320 141 notify.call();
jengbrecht 0:563b70517320 142 }
jengbrecht 0:563b70517320 143 break;
jengbrecht 0:563b70517320 144 }
jengbrecht 0:563b70517320 145 }
jengbrecht 0:563b70517320 146
jengbrecht 0:563b70517320 147 #endif /* MTSCIRCULARBUFFER_CPP */