aiie/LRingBuffer.cpp

171 lines
2.9 KiB
C++
Raw Normal View History

2017-12-30 20:20:34 +00:00
#include "LRingBuffer.h"
#include <stdlib.h>
#include "globals.h"
#define RINGBUFFERMAGIC '0'
LRingBuffer::LRingBuffer(int16_t length)
{
this->buffer = (uint8_t *)malloc(length);
this->max = length;
this->fill = 0;
this->ptr = 0;
this->cursor = 0;
}
LRingBuffer::~LRingBuffer()
{
free (this->buffer);
}
bool LRingBuffer::Serialize(int8_t fd)
{
2020-06-28 19:24:49 +00:00
uint8_t buf[9] = { RINGBUFFERMAGIC,
2020-07-04 11:38:18 +00:00
(uint8_t)((max >> 8) & 0xFF),
(uint8_t)((max ) & 0xFF),
(uint8_t)((ptr >> 8) & 0xFF),
(uint8_t)((ptr ) & 0xFF),
(uint8_t)((fill >> 8) & 0xFF),
(uint8_t)((fill ) & 0xFF),
(uint8_t)((cursor >> 8) & 0xFF),
(uint8_t)((cursor ) & 0xFF) };
2020-06-28 19:24:49 +00:00
if (g_filemanager->write(fd, buf, 9) != 9)
return false;
2017-12-30 20:20:34 +00:00
2020-06-28 19:24:49 +00:00
if (g_filemanager->write(fd, buffer, max) != max)
return false;
2017-12-30 20:20:34 +00:00
2020-06-28 19:24:49 +00:00
if (g_filemanager->write(fd, buf, 1) != 1)
return false;
2017-12-30 20:20:34 +00:00
return true;
}
bool LRingBuffer::Deserialize(int8_t fd)
{
2020-06-28 19:24:49 +00:00
uint8_t buf[9];
if (g_filemanager->read(fd, buf, 9) != 9)
return false;
if (buf[0] != RINGBUFFERMAGIC)
2017-12-30 20:20:34 +00:00
return false;
2020-06-28 19:24:49 +00:00
max = (buf[1] << 8) | buf[2];
ptr = (buf[3] << 8) | buf[4];
fill = (buf[5] << 8) | buf[6];
cursor = (buf[7] << 8) | buf[8];
2017-12-30 20:20:34 +00:00
if (buffer)
free(buffer);
buffer = (uint8_t *)malloc(max);
2020-06-28 19:24:49 +00:00
if (g_filemanager->read(fd, buffer, max) != max)
return false;
if (g_filemanager->read(fd, buf, 1) != 1 ||
buf[0] != RINGBUFFERMAGIC)
2017-12-30 20:20:34 +00:00
return false;
return true;
}
void LRingBuffer::clear()
{
this->fill = 0;
}
bool LRingBuffer::isFull()
{
return (this->max == this->fill);
}
bool LRingBuffer::hasData()
{
return (this->fill != 0);
}
bool LRingBuffer::addByte(uint8_t b)
{
if (this->max == this->fill)
return false;
int idx = (this->ptr + this->fill) % this->max;
this->buffer[idx] = b;
this->fill++;
return true;
}
bool LRingBuffer::replaceByte(uint8_t b)
{
if (cursor < fill) {
buffer[cursor] = b;
cursor++;
if (cursor >= fill) {
cursor = 0;
}
return true;
}
return false;
}
bool LRingBuffer::addBytes(uint8_t *b, int count)
{
for (int i=0; i<count; i++) {
if (!addByte(b[i]))
return false;
}
return true;
}
uint8_t LRingBuffer::consumeByte()
{
if (this->fill == 0)
return 0;
uint8_t ret = this->buffer[this->ptr];
this->fill--;
this->ptr++;
this->ptr %= this->max;
return ret;
}
uint8_t LRingBuffer::peek(int16_t idx)
{
if (!this->fill)
return 0; // No data in buffer; nothing to see
uint16_t p = (this->ptr + idx) % this->fill;
2017-12-30 20:20:34 +00:00
return this->buffer[p];
}
int16_t LRingBuffer::count()
{
return this->fill;
}
uint16_t LRingBuffer::getPeekCursor()
{
return this->cursor;
}
void LRingBuffer::setPeekCursor(int16_t idx)
{
this->cursor = idx;
}
void LRingBuffer::resetPeekCursor()
{
this->cursor = 0;
}
uint8_t LRingBuffer::peekNext()
{
uint8_t ret = peek(cursor);
cursor++;
if (cursor >= fill) {
cursor = 0;
}
return ret;
}