A library for talking to Multi-Tech's Cellular SocketModem Devices.

Dependents:   M2X_dev axeda_wrapper_dev MTS_M2x_Example1 MTS_Cellular_Connect_Example ... more

Committer:
mfiore
Date:
Tue Sep 02 18:38:55 2014 +0000
Revision:
152:9a2c7ed27744
Parent:
141:571e0ef6c8dc
Wifi: fix compatibility break with old shields by checking for both old and new style responses to "show connection" command

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