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:
Tue May 20 16:12:41 2014 -0500
Revision:
6:fca9bc67b15f
Parent:
3:08a693917d8c
Child:
13:4709c2dfcd11
include mbed.h in cpp files

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