mirror of https://github.com/JorjBauer/aiie
added suspend/resume
parent
061eca8c3a
commit
753a9a5f24
@ -0,0 +1,177 @@
|
||||
#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)
|
||||
{
|
||||
g_filemanager->writeByte(fd, RINGBUFFERMAGIC);
|
||||
|
||||
g_filemanager->writeByte(fd, (max >> 8) & 0xFF);
|
||||
g_filemanager->writeByte(fd, (max ) & 0xFF);
|
||||
|
||||
g_filemanager->writeByte(fd, (ptr >> 8) & 0xFF);
|
||||
g_filemanager->writeByte(fd, (ptr ) & 0xFF);
|
||||
|
||||
g_filemanager->writeByte(fd, (fill >> 8) & 0xFF);
|
||||
g_filemanager->writeByte(fd, (fill ) & 0xFF);
|
||||
|
||||
g_filemanager->writeByte(fd, (cursor >> 8) & 0xFF);
|
||||
g_filemanager->writeByte(fd, (cursor ) & 0xFF);
|
||||
|
||||
for (uint16_t i=0; i<max; i++) {
|
||||
g_filemanager->writeByte(fd, buffer[i]);
|
||||
}
|
||||
|
||||
g_filemanager->writeByte(fd, RINGBUFFERMAGIC);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LRingBuffer::Deserialize(int8_t fd)
|
||||
{
|
||||
if (g_filemanager->readByte(fd) != RINGBUFFERMAGIC)
|
||||
return false;
|
||||
|
||||
max = g_filemanager->readByte(fd);
|
||||
max <<= 8;
|
||||
max |= g_filemanager->readByte(fd);
|
||||
|
||||
ptr = g_filemanager->readByte(fd);
|
||||
ptr <<= 8;
|
||||
ptr |= g_filemanager->readByte(fd);
|
||||
|
||||
fill = g_filemanager->readByte(fd);
|
||||
fill <<= 8;
|
||||
fill |= g_filemanager->readByte(fd);
|
||||
|
||||
cursor = g_filemanager->readByte(fd);
|
||||
cursor <<= 8;
|
||||
cursor |= g_filemanager->readByte(fd);
|
||||
|
||||
if (buffer)
|
||||
free(buffer);
|
||||
|
||||
buffer = (uint8_t *)malloc(max);
|
||||
|
||||
for (uint16_t i=0; i<max; i++) {
|
||||
buffer[i] = g_filemanager->readByte(fd);
|
||||
}
|
||||
|
||||
if (g_filemanager->readByte(fd) != RINGBUFFERMAGIC)
|
||||
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)
|
||||
{
|
||||
uint16_t p = (this->ptr + idx) % this->max;
|
||||
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;
|
||||
}
|
@ -1,12 +1,15 @@
|
||||
#ifndef __RINGBUFFER_H
|
||||
#define __RINGBUFFER_H
|
||||
#ifndef __LRINGBUFFER_H
|
||||
#define __LRINGBUFFER_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
class RingBuffer {
|
||||
class LRingBuffer {
|
||||
public:
|
||||
RingBuffer(int16_t length);
|
||||
~RingBuffer();
|
||||
LRingBuffer(int16_t length);
|
||||
~LRingBuffer();
|
||||
|
||||
bool Serialize(int8_t fd);
|
||||
bool Deserialize(int8_t fd);
|
||||
|
||||
void clear();
|
||||
|
@ -1,113 +0,0 @@
|
||||
#include "RingBuffer.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
RingBuffer::RingBuffer(int16_t length)
|
||||
{
|
||||
this->buffer = (uint8_t *)malloc(length);
|
||||
this->max = length;
|
||||
this->fill = 0;
|
||||
this->ptr = 0;
|
||||
this->cursor = 0;
|
||||
}
|
||||
|
||||
RingBuffer::~RingBuffer()
|
||||
{
|
||||
free (this->buffer);
|
||||
}
|
||||
|
||||
void RingBuffer::clear()
|
||||
{
|
||||
this->fill = 0;
|
||||
}
|
||||
|
||||
bool RingBuffer::isFull()
|
||||
{
|
||||
return (this->max == this->fill);
|
||||
}
|
||||
|
||||
bool RingBuffer::hasData()
|
||||
{
|
||||
return (this->fill != 0);
|
||||
}
|
||||
|
||||
bool RingBuffer::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 RingBuffer::replaceByte(uint8_t b)
|
||||
{
|
||||
if (cursor < fill) {
|
||||
buffer[cursor] = b;
|
||||
cursor++;
|
||||
if (cursor >= fill) {
|
||||
cursor = 0;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool RingBuffer::addBytes(uint8_t *b, int count)
|
||||
{
|
||||
for (int i=0; i<count; i++) {
|
||||
if (!addByte(b[i]))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
uint8_t RingBuffer::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 RingBuffer::peek(int16_t idx)
|
||||
{
|
||||
uint16_t p = (this->ptr + idx) % this->max;
|
||||
return this->buffer[p];
|
||||
}
|
||||
|
||||
int16_t RingBuffer::count()
|
||||
{
|
||||
return this->fill;
|
||||
}
|
||||
|
||||
uint16_t RingBuffer::getPeekCursor()
|
||||
{
|
||||
return this->cursor;
|
||||
}
|
||||
|
||||
void RingBuffer::setPeekCursor(int16_t idx)
|
||||
{
|
||||
this->cursor = idx;
|
||||
}
|
||||
|
||||
void RingBuffer::resetPeekCursor()
|
||||
{
|
||||
this->cursor = 0;
|
||||
}
|
||||
|
||||
uint8_t RingBuffer::peekNext()
|
||||
{
|
||||
uint8_t ret = peek(cursor);
|
||||
cursor++;
|
||||
if (cursor >= fill) {
|
||||
cursor = 0;
|
||||
}
|
||||
return ret;
|
||||
}
|