MyBuffer.hMyBuffer.h
#ifndef _BUFFER_H_
#define _BUFFER_H_
/*===============================
Класс CBufer написан для буферизации
обмена АЦП и процесса записи на SD
===============================*/
//MaxSize - размер массива для кольцевого буфера
//type - тип элементов, хранимых в буфере
template <uint16_t MaxSize, typename type>
class CBuffer {
private:
type dat[MaxSize]; //массив имеет размер, указанный при объявлении
volatile uint16_t write_p; //указывает на пустую ячейку для записи
volatile uint16_t read_p; //указывает на полную ячейку для чтения
volatile uint16_t size; //хранит размер имеющихся данных
volatile uint8_t overflow; //хранит число переполнений
volatile uint8_t empty; //хранит число обращений к пустому буферу
public:
CBuffer(); //конструктор
~CBuffer(); //деструктор
void reset(); //сбросить буфер со счётчиками ошибок
void clear(); //очистить буфер, сохранив счётчики
void put(type d); //положить число в буфер
type get(); //взять число из буфера
uint16_t getsize(); //узнать размер буфера
uint16_t rd_p(); //узнать указатель чтения
uint16_t wr_p(); //узнать указатель записи
uint16_t ovf(); //узнать число переполнений
uint16_t empt(); //узнать число обращений к пустому буферу
};
//Конструктор создаёт пустой буфер
template <uint16_t MaxSize, typename type>
CBuffer<MaxSize, type>::CBuffer(){
write_p = 0;
read_p = 0;
size = 0;
overflow = 0;
empty = 0;
};
//Деструктор
template <uint16_t MaxSize, typename type>
CBuffer<MaxSize, type>::~CBuffer(){
};
//Сброс буфера со счётчиками ошибок
template <uint16_t MaxSize, typename type>
void CBuffer<MaxSize, type>::reset(){
write_p = 0;
read_p = 0;
size = 0;
overflow = 0;
empty = 0;
};
//Очистка буфера
template <uint16_t MaxSize, typename type>
void CBuffer<MaxSize, type>::clear(){
write_p = 0;
read_p = 0;
size = 0;
};
//Добавление элемента в буфер
template <uint16_t MaxSize, typename type>
void CBuffer<MaxSize, type>::put(type d){
if (size < MaxSize){ //В буфер возможно добавить элемент:
dat[write_p] = d; //Добавляем.
size++; //Увеличиваем размер буфера.
write_p++; //write_p на следующую пустую ячейку.
if (write_p == MaxSize) //если он достиг конца -
write_p = 0; //перейдёт в начало.
} else { //Если буфер полон:
if( overflow < 255 ) //если счётчик меньше 255 -
overflow++; //увеличиваем,
else while(1); //иначе - катастрофа, зависаем.
}
};
//Извлечение элемента из буфера
template <uint16_t MaxSize, typename type>
type CBuffer<MaxSize, type>::get(){
type d = 0; //Заранее объявляем переменную для считывания
if (size > 0){ //Если из буфера можно что-то извлечь:
d = dat[read_p]; //Извлекаем.
size--; //Уменьшаем размер буфера.
read_p++; //read_p на следующую полную ячейку.
if (read_p == MaxSize) //если он достиг конца -
read_p = 0; //перейдёт в начало.
} else { //Если буфер пуст:
if( empty < 255 ) //если счётчик меньше 255 -
empty++; //увеличиваем,
else while(1); //иначе - катастрофа, зависаем.
}
return d; //Возврат значения или нуля.
}
template <uint16_t MaxSize, typename type>
uint16_t CBuffer<MaxSize, type>::getsize(){
return size;
};
template <uint16_t MaxSize, typename type>
uint16_t CBuffer<MaxSize, type>::rd_p(){
return read_p;
};
template <uint16_t MaxSize, typename type>
uint16_t CBuffer<MaxSize, type>::wr_p(){
return write_p;
};
template <uint16_t MaxSize, typename type>
uint16_t CBuffer<MaxSize, type>::ovf(){
return overflow;
};
template <uint16_t MaxSize, typename type>
uint16_t CBuffer<MaxSize, type>::empt(){
return empty;
};
#endif