2024-06-09 14:27:26 -07:00

100 lines
1.5 KiB
C++

/// © MiroZ 2024
#include <stdint.h>
#include <esp_log.h>
static uint8_t mem[30000];
// template<typename T>
class CircBuffer
{
protected:
uint16_t * m_buffer = (uint16_t *)mem;
size_t head_ = 0;
size_t tail_ = 0;
bool full_ = false;
uint32_t m_size = 0;
public:
CircBuffer()
{
// assert(m_buffer = (T*)calloc(size, sizeof(T)));
m_size = 30000/2;
}
~CircBuffer()
{
// free(m_buffer);
}
bool put(uint16_t item)
{
//std::lock_guard<std::recursive_mutex> lock(mutex_);
if (full_)
return false;
m_buffer[head_] = item;
head_ = (head_ + 1) % m_size;
full_ = head_ == tail_;
return true;
}
bool get(uint16_t & val)
{
//std::lock_guard<std::recursive_mutex> lock(mutex_);
if (empty())
return false;
// Read data and advance the tail (we now have a free space)
val = m_buffer[tail_];
full_ = false;
tail_ = (tail_ + 1) % m_size;
return true;
}
void reset()
{
//std::lock_guard<std::recursive_mutex> lock(mutex_);
head_ = tail_ = 0;
full_ = false;
}
bool empty()
{
//std::lock_guard<std::recursive_mutex> lock(mutex_);
// if head and tail are equal, we are empty
return (!full_ && (head_ == tail_));
}
bool full()
{
return full_;
}
size_t capacity()
{
return m_size;
}
size_t size()
{
//std::lock_guard<std::recursive_mutex> lock(mutex_);
size_t size = m_size;
if (!full_)
{
if (head_ >= tail_)
size = head_ - tail_;
else
size = m_size + head_ - tail_;
}
return size;
}
};