MultiTech / MTS-Utils

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:
Mon May 19 11:16:57 2014 -0500
Revision:
3:08a693917d8c
Child:
6:fca9bc67b15f
add MTSCircularBuffer and tests

Who changed what in which revision?

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