2014-12-10 5:41 1 second pulse (serial)

Dependencies:   MODSERIALhacked Convert SLCD mbed-src

Committer:
jhaugen
Date:
Thu Dec 18 10:56:52 2014 +0000
Revision:
12:c97d6cd17314
Parent:
8:a44d03ecc942
Added timestamping to sensor readings.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jhaugen 8:a44d03ecc942 1 #ifndef DOUBLE_BUFFER_H
jhaugen 8:a44d03ecc942 2 #define DOUBLE_BUFFER_H
jhaugen 8:a44d03ecc942 3
jhaugen 12:c97d6cd17314 4 #include "Timer.h"
jhaugen 12:c97d6cd17314 5
jhaugen 8:a44d03ecc942 6 template <class T, unsigned int S>
jhaugen 8:a44d03ecc942 7 class DoubleBuffer {
jhaugen 8:a44d03ecc942 8 public:
jhaugen 8:a44d03ecc942 9 DoubleBuffer();
jhaugen 12:c97d6cd17314 10 void write(T val, long long timestamp);
jhaugen 8:a44d03ecc942 11 T* getReadBuffer();
jhaugen 8:a44d03ecc942 12 int getReadBufferSize();
jhaugen 12:c97d6cd17314 13 long long* getTimestampReadBuffer();
jhaugen 8:a44d03ecc942 14 void swapBuff();
jhaugen 12:c97d6cd17314 15 void init(long long* off, Timer* tim);
jhaugen 12:c97d6cd17314 16 long long db_timestamps[2][S];
jhaugen 8:a44d03ecc942 17 private:
jhaugen 8:a44d03ecc942 18 T buffer[2][S];
jhaugen 12:c97d6cd17314 19
jhaugen 8:a44d03ecc942 20 int fill_buffer;
jhaugen 8:a44d03ecc942 21 int buffer0_size;
jhaugen 8:a44d03ecc942 22 int buffer1_size;
jhaugen 12:c97d6cd17314 23 long long* off;
jhaugen 12:c97d6cd17314 24 Timer* time;
jhaugen 12:c97d6cd17314 25 bool active;
jhaugen 8:a44d03ecc942 26 };
jhaugen 8:a44d03ecc942 27
jhaugen 8:a44d03ecc942 28 template <class T, unsigned int S>
jhaugen 8:a44d03ecc942 29 DoubleBuffer<T, S>::DoubleBuffer() {
jhaugen 8:a44d03ecc942 30 fill_buffer = 0;
jhaugen 8:a44d03ecc942 31 buffer0_size = 0;
jhaugen 8:a44d03ecc942 32 buffer1_size = 0;
jhaugen 12:c97d6cd17314 33 active = false;
jhaugen 8:a44d03ecc942 34 }
jhaugen 8:a44d03ecc942 35
jhaugen 8:a44d03ecc942 36 template <class T, unsigned int S>
jhaugen 12:c97d6cd17314 37 void DoubleBuffer<T, S>::init(long long* o, Timer* tim) {
jhaugen 12:c97d6cd17314 38 time = tim;
jhaugen 12:c97d6cd17314 39 off = o;
jhaugen 12:c97d6cd17314 40 active = true;
jhaugen 12:c97d6cd17314 41 }
jhaugen 12:c97d6cd17314 42
jhaugen 12:c97d6cd17314 43 template <class T, unsigned int S>
jhaugen 12:c97d6cd17314 44 void DoubleBuffer<T, S>::write(T val, long long timestamp) {
jhaugen 12:c97d6cd17314 45 //long long timestamp = time->read_us() - (*off);
jhaugen 8:a44d03ecc942 46 int buffer_size;
jhaugen 12:c97d6cd17314 47
jhaugen 12:c97d6cd17314 48 if (!active) {
jhaugen 12:c97d6cd17314 49 return;
jhaugen 12:c97d6cd17314 50 }
jhaugen 12:c97d6cd17314 51
jhaugen 8:a44d03ecc942 52 if (fill_buffer == 0) {
jhaugen 8:a44d03ecc942 53 if(buffer0_size >= S) {
jhaugen 8:a44d03ecc942 54 return;
jhaugen 8:a44d03ecc942 55 }
jhaugen 8:a44d03ecc942 56 buffer_size = buffer0_size;
jhaugen 8:a44d03ecc942 57 buffer0_size++;
jhaugen 8:a44d03ecc942 58 }
jhaugen 8:a44d03ecc942 59 else {
jhaugen 8:a44d03ecc942 60 if(buffer1_size >= S) {
jhaugen 8:a44d03ecc942 61 return;
jhaugen 8:a44d03ecc942 62 }
jhaugen 8:a44d03ecc942 63 buffer_size = buffer1_size;
jhaugen 8:a44d03ecc942 64 buffer1_size++;
jhaugen 8:a44d03ecc942 65 }
jhaugen 8:a44d03ecc942 66 buffer[fill_buffer][buffer_size] = val;
jhaugen 12:c97d6cd17314 67 db_timestamps[fill_buffer][buffer_size] = timestamp;
jhaugen 8:a44d03ecc942 68 }
jhaugen 8:a44d03ecc942 69
jhaugen 8:a44d03ecc942 70 template <class T, unsigned int S>
jhaugen 8:a44d03ecc942 71 T* DoubleBuffer<T, S>::getReadBuffer() {
jhaugen 8:a44d03ecc942 72 if (fill_buffer == 0) {
jhaugen 8:a44d03ecc942 73 return buffer[1];
jhaugen 8:a44d03ecc942 74 }
jhaugen 8:a44d03ecc942 75 else {
jhaugen 8:a44d03ecc942 76 return buffer[0];
jhaugen 8:a44d03ecc942 77 }
jhaugen 8:a44d03ecc942 78 }
jhaugen 8:a44d03ecc942 79
jhaugen 8:a44d03ecc942 80 template <class T, unsigned int S>
jhaugen 12:c97d6cd17314 81 long long* DoubleBuffer<T, S>::getTimestampReadBuffer() {
jhaugen 12:c97d6cd17314 82 if (fill_buffer == 0) {
jhaugen 12:c97d6cd17314 83 return db_timestamps[1];
jhaugen 12:c97d6cd17314 84 }
jhaugen 12:c97d6cd17314 85 else {
jhaugen 12:c97d6cd17314 86 return db_timestamps[0];
jhaugen 12:c97d6cd17314 87 }
jhaugen 12:c97d6cd17314 88 }
jhaugen 12:c97d6cd17314 89
jhaugen 12:c97d6cd17314 90 template <class T, unsigned int S>
jhaugen 8:a44d03ecc942 91 int DoubleBuffer<T, S>::getReadBufferSize() {
jhaugen 8:a44d03ecc942 92 if (fill_buffer == 0) {
jhaugen 8:a44d03ecc942 93 return buffer1_size;
jhaugen 8:a44d03ecc942 94 }
jhaugen 8:a44d03ecc942 95 else {
jhaugen 8:a44d03ecc942 96 return buffer0_size;
jhaugen 8:a44d03ecc942 97 }
jhaugen 8:a44d03ecc942 98 }
jhaugen 8:a44d03ecc942 99
jhaugen 8:a44d03ecc942 100 template <class T, unsigned int S>
jhaugen 8:a44d03ecc942 101 void DoubleBuffer<T, S>::swapBuff() {
jhaugen 8:a44d03ecc942 102 if (fill_buffer == 0) {
jhaugen 8:a44d03ecc942 103 // make sure the fill buffer is empty
jhaugen 8:a44d03ecc942 104 buffer1_size = 0;
jhaugen 8:a44d03ecc942 105 fill_buffer = 1;
jhaugen 8:a44d03ecc942 106 }
jhaugen 8:a44d03ecc942 107 else {
jhaugen 8:a44d03ecc942 108 buffer0_size = 0;
jhaugen 8:a44d03ecc942 109 fill_buffer = 0;
jhaugen 8:a44d03ecc942 110 }
jhaugen 8:a44d03ecc942 111 }
jhaugen 8:a44d03ecc942 112
jhaugen 8:a44d03ecc942 113 #endif