2014-12-10 5:41 1 second pulse (serial)
Dependencies: MODSERIALhacked Convert SLCD mbed-src
double_buffer.h@12:c97d6cd17314, 2014-12-18 (annotated)
- 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?
User | Revision | Line number | New 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 |