Utility library for MTS Socket Modem Arduino Shield devices from Multi-Tech Systems

Dependents:   mtsas mtsas thermostat_fan_demo--fan mtsas ... more

NOTE: MTS-Utils has moved to GitHub. This version will not be updated. For updates, go to the GitHub version.

Committer:
Mike Fiore
Date:
Tue Mar 21 15:26:50 2017 -0500
Revision:
15:ae12624eb600
Parent:
13:4709c2dfcd11
update from git revision 37b619a6e4e6e3b49b64c402429cdd8710d960a6

Who changed what in which revision?

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