Multi-Hackers / SocketModem

Dependents:   M2X_dev axeda_wrapper_dev MTS_M2x_Example1 MTS_Cellular_Connect_Example ... more

Committer:
kranjan
Date:
Sat Jan 04 05:28:45 2014 +0000
Revision:
141:571e0ef6c8dc
Parent:
84:77c5ab16534d
Added licensing header to all files in the library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kranjan 141:571e0ef6c8dc 1 /* Universal Socket Modem Interface Library
kranjan 141:571e0ef6c8dc 2 * Copyright (c) 2013 Multi-Tech Systems
kranjan 141:571e0ef6c8dc 3 *
kranjan 141:571e0ef6c8dc 4 * Licensed under the Apache License, Version 2.0 (the "License");
kranjan 141:571e0ef6c8dc 5 * you may not use this file except in compliance with the License.
kranjan 141:571e0ef6c8dc 6 * You may obtain a copy of the License at
kranjan 141:571e0ef6c8dc 7 *
kranjan 141:571e0ef6c8dc 8 * http://www.apache.org/licenses/LICENSE-2.0
kranjan 141:571e0ef6c8dc 9 *
kranjan 141:571e0ef6c8dc 10 * Unless required by applicable law or agreed to in writing, software
kranjan 141:571e0ef6c8dc 11 * distributed under the License is distributed on an "AS IS" BASIS,
kranjan 141:571e0ef6c8dc 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kranjan 141:571e0ef6c8dc 13 * See the License for the specific language governing permissions and
kranjan 141:571e0ef6c8dc 14 * limitations under the License.
kranjan 141:571e0ef6c8dc 15 */
kranjan 141:571e0ef6c8dc 16
jengbrecht 0:563b70517320 17 #include "MTSCircularBuffer.h"
jengbrecht 0:563b70517320 18
mfiore 39:6e94520a3217 19 using namespace mts;
mfiore 39:6e94520a3217 20
sgodinez 64:0ca9c7123ffc 21 MTSCircularBuffer::MTSCircularBuffer(int bufferSize) : bufferSize(bufferSize), readIndex(0), writeIndex(0), bytes(0), _threshold(-1), _op(Vars::GREATER)
jengbrecht 0:563b70517320 22 {
jengbrecht 0:563b70517320 23 buffer = new char[bufferSize];
jengbrecht 0:563b70517320 24 }
jengbrecht 0:563b70517320 25
jengbrecht 0:563b70517320 26 MTSCircularBuffer::~MTSCircularBuffer()
jengbrecht 0:563b70517320 27 {
jengbrecht 0:563b70517320 28 delete[] buffer;
jengbrecht 0:563b70517320 29 }
jengbrecht 0:563b70517320 30
sgodinez 67:1003b410f781 31 int MTSCircularBuffer::capacity()
jengbrecht 0:563b70517320 32 {
jengbrecht 0:563b70517320 33 return bufferSize;
jengbrecht 0:563b70517320 34 }
jengbrecht 0:563b70517320 35
jengbrecht 0:563b70517320 36 int MTSCircularBuffer::read(char* data, int length)
jengbrecht 0:563b70517320 37 {
jengbrecht 0:563b70517320 38 int i = 0;
sgodinez 64:0ca9c7123ffc 39 while ((i < length) && (bytes > 0)) {
jengbrecht 0:563b70517320 40 if (readIndex == bufferSize) {
jengbrecht 0:563b70517320 41 readIndex = 0;
jengbrecht 0:563b70517320 42 }
jengbrecht 0:563b70517320 43 data[i++] = buffer[readIndex++];
sgodinez 64:0ca9c7123ffc 44 bytes--;
mfiore 60:ee9c7a700330 45 checkThreshold();
jengbrecht 0:563b70517320 46 }
jengbrecht 0:563b70517320 47 return i;
jengbrecht 0:563b70517320 48 }
jengbrecht 0:563b70517320 49
sgodinez 17:2d7c4ea7491b 50 int MTSCircularBuffer::read(char& data)
jengbrecht 0:563b70517320 51 {
sgodinez 64:0ca9c7123ffc 52 if (bytes == 0) {
sgodinez 35:f28acb1be52d 53 return 0;
jengbrecht 0:563b70517320 54 }
jengbrecht 0:563b70517320 55 if (readIndex == bufferSize) {
jengbrecht 0:563b70517320 56 readIndex = 0;
jengbrecht 0:563b70517320 57 }
sgodinez 17:2d7c4ea7491b 58 data = buffer[readIndex++];
sgodinez 64:0ca9c7123ffc 59 bytes--;
jengbrecht 0:563b70517320 60 checkThreshold();
sgodinez 17:2d7c4ea7491b 61 return 1;
jengbrecht 0:563b70517320 62 }
jengbrecht 0:563b70517320 63
sgodinez 41:81d035fb0b6a 64 int MTSCircularBuffer::write(const char* data, int length)
jengbrecht 0:563b70517320 65 {
jengbrecht 0:563b70517320 66 int i = 0;
sgodinez 64:0ca9c7123ffc 67 while((i < length) && (bytes < bufferSize)) {
jengbrecht 0:563b70517320 68 if(writeIndex == bufferSize) {
jengbrecht 0:563b70517320 69 writeIndex = 0;
jengbrecht 0:563b70517320 70 }
jengbrecht 0:563b70517320 71 buffer[writeIndex++] = data[i++];
sgodinez 64:0ca9c7123ffc 72 bytes++;
mfiore 60:ee9c7a700330 73 checkThreshold();
jengbrecht 0:563b70517320 74 }
mfiore 2:8d3ea0dfce39 75 return i;
jengbrecht 0:563b70517320 76 }
jengbrecht 0:563b70517320 77
jengbrecht 0:563b70517320 78 int MTSCircularBuffer::write(char data)
jengbrecht 0:563b70517320 79 {
sgodinez 64:0ca9c7123ffc 80 if (bytes == bufferSize) {
sgodinez 35:f28acb1be52d 81 return 0;
jengbrecht 0:563b70517320 82 }
jengbrecht 0:563b70517320 83 if(writeIndex == bufferSize) {
jengbrecht 0:563b70517320 84 writeIndex = 0;
jengbrecht 0:563b70517320 85 }
jengbrecht 0:563b70517320 86 buffer[writeIndex++] = data;
sgodinez 64:0ca9c7123ffc 87 bytes++;
jengbrecht 0:563b70517320 88 checkThreshold();
mfiore 2:8d3ea0dfce39 89 return 1;
jengbrecht 0:563b70517320 90 }
jengbrecht 0:563b70517320 91
sgodinez 67:1003b410f781 92 int MTSCircularBuffer::remaining()
jengbrecht 0:563b70517320 93 {
sgodinez 64:0ca9c7123ffc 94 return bufferSize - bytes;
jengbrecht 0:563b70517320 95 }
jengbrecht 0:563b70517320 96
sgodinez 67:1003b410f781 97 int MTSCircularBuffer::size()
jengbrecht 0:563b70517320 98 {
sgodinez 64:0ca9c7123ffc 99 return bytes;
jengbrecht 0:563b70517320 100 }
jengbrecht 0:563b70517320 101
jengbrecht 0:563b70517320 102 bool MTSCircularBuffer::isFull()
jengbrecht 0:563b70517320 103 {
sgodinez 64:0ca9c7123ffc 104 if (bytes == bufferSize) {
jengbrecht 0:563b70517320 105 return true;
jengbrecht 0:563b70517320 106 } else {
jengbrecht 0:563b70517320 107 return false;
jengbrecht 0:563b70517320 108 }
jengbrecht 0:563b70517320 109 }
jengbrecht 0:563b70517320 110
jengbrecht 0:563b70517320 111 bool MTSCircularBuffer::isEmpty()
jengbrecht 0:563b70517320 112 {
sgodinez 64:0ca9c7123ffc 113 if (bytes == 0) {
jengbrecht 0:563b70517320 114 return true;
jengbrecht 0:563b70517320 115 } else {
jengbrecht 0:563b70517320 116 return false;
jengbrecht 0:563b70517320 117 }
jengbrecht 0:563b70517320 118 }
jengbrecht 0:563b70517320 119
jengbrecht 0:563b70517320 120 void MTSCircularBuffer::clear()
jengbrecht 0:563b70517320 121 {
sgodinez 64:0ca9c7123ffc 122 writeIndex = readIndex = bytes = 0;
jengbrecht 0:563b70517320 123 }
jengbrecht 0:563b70517320 124
jengbrecht 0:563b70517320 125 void MTSCircularBuffer::checkThreshold()
jengbrecht 0:563b70517320 126 {
mfiore 2:8d3ea0dfce39 127 if (_threshold == -1) {
jengbrecht 0:563b70517320 128 return;
jengbrecht 0:563b70517320 129 }
mfiore 2:8d3ea0dfce39 130 switch (_op) {
jengbrecht 0:563b70517320 131 case Vars::GREATER:
sgodinez 64:0ca9c7123ffc 132 if (bytes > _threshold) {
jengbrecht 0:563b70517320 133 notify.call();
jengbrecht 0:563b70517320 134 }
jengbrecht 0:563b70517320 135 break;
jengbrecht 0:563b70517320 136 case Vars::LESS:
sgodinez 64:0ca9c7123ffc 137 if (bytes < _threshold) {
jengbrecht 0:563b70517320 138 notify.call();
jengbrecht 0:563b70517320 139 }
jengbrecht 0:563b70517320 140 break;
jengbrecht 0:563b70517320 141 case Vars::GREATER_EQUAL:
sgodinez 64:0ca9c7123ffc 142 if (bytes >= _threshold) {
jengbrecht 0:563b70517320 143 notify.call();
jengbrecht 0:563b70517320 144 }
jengbrecht 0:563b70517320 145 break;
jengbrecht 0:563b70517320 146 case Vars::LESS_EQUAL:
sgodinez 64:0ca9c7123ffc 147 if (bytes <= _threshold) {
jengbrecht 0:563b70517320 148 notify.call();
jengbrecht 0:563b70517320 149 }
jengbrecht 0:563b70517320 150 break;
jengbrecht 0:563b70517320 151 case Vars::EQUAL:
sgodinez 64:0ca9c7123ffc 152 if (bytes == _threshold) {
jengbrecht 0:563b70517320 153 notify.call();
jengbrecht 0:563b70517320 154 }
jengbrecht 0:563b70517320 155 break;
jengbrecht 0:563b70517320 156 }
jengbrecht 0:563b70517320 157 }
kranjan 141:571e0ef6c8dc 158