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

Dependencies:   MODSERIALhacked Convert SLCD mbed-src

double_buffer.h

Committer:
jhaugen
Date:
2014-12-18
Revision:
12:c97d6cd17314
Parent:
8:a44d03ecc942

File content as of revision 12:c97d6cd17314:

#ifndef DOUBLE_BUFFER_H
#define DOUBLE_BUFFER_H

#include "Timer.h"

template <class T, unsigned int S>
class DoubleBuffer {
    public:
        DoubleBuffer();
        void write(T val, long long timestamp);
        T* getReadBuffer();
        int getReadBufferSize();
        long long* getTimestampReadBuffer();
        void swapBuff();
        void init(long long* off, Timer* tim);
        long long db_timestamps[2][S];
    private:
        T buffer[2][S];
        
        int fill_buffer;
        int buffer0_size;
        int buffer1_size;
        long long* off;
        Timer* time;
        bool active;
};

template <class T, unsigned int S>
DoubleBuffer<T, S>::DoubleBuffer() {
    fill_buffer = 0;
    buffer0_size = 0;
    buffer1_size = 0;
    active = false;
}

template <class T, unsigned int S>
void DoubleBuffer<T, S>::init(long long* o, Timer* tim) {
    time = tim;
    off = o;
    active = true;
}

template <class T, unsigned int S>
void DoubleBuffer<T, S>::write(T val, long long timestamp) {
    //long long timestamp = time->read_us() - (*off);
    int buffer_size;
    
    if (!active) {
        return;
    }
    
    if (fill_buffer == 0) {
        if(buffer0_size >= S) {
            return;
        }
        buffer_size = buffer0_size;
        buffer0_size++;
    }
    else {
        if(buffer1_size >= S) {
            return;
        }
        buffer_size = buffer1_size;
        buffer1_size++;
    }
    buffer[fill_buffer][buffer_size] = val;
    db_timestamps[fill_buffer][buffer_size] = timestamp;
}

template <class T, unsigned int S>
T* DoubleBuffer<T, S>::getReadBuffer() {
    if (fill_buffer == 0) {
        return buffer[1];
    }
    else {
        return buffer[0];
    }
}

template <class T, unsigned int S>
long long* DoubleBuffer<T, S>::getTimestampReadBuffer() {
    if (fill_buffer == 0) {
        return db_timestamps[1];
    }
    else {
        return db_timestamps[0];
    }
}

template <class T, unsigned int S>
int DoubleBuffer<T, S>::getReadBufferSize() {
    if (fill_buffer == 0) {
        return buffer1_size;
    }
    else {
        return buffer0_size;
    }
}

template <class T, unsigned int S>
void DoubleBuffer<T, S>::swapBuff() {
    if (fill_buffer == 0) {
        // make sure the fill buffer is empty
        buffer1_size = 0;
        fill_buffer = 1;
    }
    else {
        buffer0_size = 0;
        fill_buffer = 0;
    }
}

#endif