ECE 4180 - Final Project Team / Mbed 2 deprecated WalkieTalkie

Dependencies:   mbed 4DGL-uLCD-SE mbed-rtos nRF24L01P

CircularBuf.cpp

Committer:
Nurchu
Date:
2018-04-23
Revision:
29:0c6f3c0c992a
Parent:
20:e068469ffb89
Child:
31:39d04aedc3e5

File content as of revision 29:0c6f3c0c992a:

#include "CircularBuf.h"
#include "stdio.h"

template <typename T>
CircularBuf<T>::CircularBuf(unsigned int size) : _size(size), _head(-1), _tail(-1) {
    _data = new T[size];
}

template <typename T>
CircularBuf<T>::~CircularBuf() {
    delete _data;
}

template <typename T>
unsigned int CircularBuf<T>::push(T* data, unsigned int size) {
    unsigned int cnt = 0;
    
    for (int i = 0; i < size; i++) {
        unsigned int next = _head + 1;
        
        if (next >= _size)
            next = 0;
            
        if (next == _tail)
            return cnt;
            
        _data[next] = data[cnt];
        _head = next;
        cnt++;
    }
    
    return cnt;
}

template <typename T>
unsigned int CircularBuf<T>::pop(T* data, unsigned int size) {
    unsigned int cnt = 0;
    
    for (int i = 0; i < size; i++) {
        unsigned int next = _tail + 1;
        
        printf("Next %d\n\r", next);
        if (next >= size)
            next = 0;
        
        printf("Head %d\n\r", _head);    
        if (next == _head)
            return cnt;
            
        printf("Tail %d\n\r", _tail);
        printf("Cnt %d\n\r", cnt);
        printf("Data[cnt] %d\n\r", data[cnt]);
        printf("_Data[next] %d\n\r", _data[next]);
        printf("&Data %x &_Data %x\n\r", data, &_data[0]);
        data[cnt] = _data[next];
        _tail = next;
        printf("Next %d\n\r", next);
        printf("Tail %d\n\r", _tail);
        cnt++;
    }
    
    return cnt;
}

template <typename T>
unsigned int CircularBuf<T>::size() {
    int s = _head - _tail;
    
    // If buffer overlaps end
    if (s < 0)
        s += _size;
        
    return s;
}

template <typename T>
void CircularBuf<T>::clear() {
    _head = 0;
    _tail = 0;
}