circular_buffer.cpp
- Committer:
- JonFreeman
- Date:
- 2012-01-31
- Revision:
- 3:7ef4c240d5e3
- Parent:
- 0:2c2b17c7b7a8
File content as of revision 3:7ef4c240d5e3:
#include "circular_buffer.h"
#include "mbed.h"
using namespace std;
bool circular_buffer_f::seek (int distance_back) { // Assumes at least that much has been written to buff beforehand
if(!seek_enable) return false;
if(buffsize <= distance_back) return false;
Offbuff = Onbuff - distance_back; // Setup to enable read of most recent 'distance_back' samples
if(Offbuff < buffbase) Offbuff += buffsize;
emptyf = false;
return true;
}
void circular_buffer_f::init (int size, float *buffstart, int flags) { // Size and address of buffer to work with
buffsize = size;
Onbuff = Offbuff = buffend = buffbase = buffstart;
buffend += (size - 1);
emptyf = true; fullf = false;
if (flags & OVERWRITE_ENABLE) overwrite_enable = true;
else overwrite_enable = false;
if (flags & SEEK_ENABLE) seek_enable = true;
else seek_enable = false;
}
bool circular_buffer_f::read (float *rd) {
if(!readable()) return false;
*rd = *Offbuff++;
if(Offbuff > buffend) Offbuff = buffbase;
if(Onbuff == Offbuff) emptyf = true;
fullf = false;
return true;
}
bool circular_buffer_f::write (float a) { // Put value into circular buffer
if (overwrite_enable) {
*Onbuff++ = a; // post increment pointer
if(Onbuff > buffend) Onbuff = buffbase;
fullf = false;
}
else {
if(fullf) return false; // Fail if buffer already full
*Onbuff++ = a; // post increment pointer
if(Onbuff > buffend) Onbuff = buffbase;
if(Onbuff == Offbuff) fullf = true;
}
emptyf = false;
return true;
}
bool circular_buffer_f::get_samps (float *dest, int len) {
for (int i = 0; i < len; i++) {
if (!read(dest++))
return false;
}
return true;
}
//////////////////////////
bool circular_buffer_c::seek (int distance_back) { // Assumes at least that much has been written to buff beforehand
if(!seek_enable) return false;
if(buffsize <= distance_back) return false;
Offbuff = Onbuff - distance_back; // Setup to enable read of most recent 'distance_back' samples
if(Offbuff < buffbase) Offbuff += buffsize;
emptyf = false;
return true;
}
void circular_buffer_c::init (int size, char *buffstart, int flags) { // Size and address of buffer to work with
buffsize = size;
Onbuff = Offbuff = buffend = buffbase = buffstart;
buffend += (size - 1);
emptyf = true; fullf = false;
if (flags & OVERWRITE_ENABLE) overwrite_enable = true;
else overwrite_enable = false;
if (flags & SEEK_ENABLE) seek_enable = true;
else seek_enable = false;
}
bool circular_buffer_c::read (char *rd) {
if(!readable()) return false;
*rd = *Offbuff++;
if(Offbuff > buffend) Offbuff = buffbase;
if(Onbuff == Offbuff) emptyf = true;
fullf = false;
return true;
}
bool circular_buffer_c::write (char a) { // Put value into circular buffer
if (overwrite_enable) {
*Onbuff++ = a; // post increment pointer
if(Onbuff > buffend) Onbuff = buffbase;
fullf = false;
}
else {
if(fullf) return false; // Fail if buffer already full
*Onbuff++ = a; // post increment pointer
if(Onbuff > buffend) Onbuff = buffbase;
if(Onbuff == Offbuff) fullf = true;
}
emptyf = false;
return true;
}
bool circular_buffer_c::get_samps (char *dest, int len) {
for (int i = 0; i < len; i++) {
if (!read(dest++))
return false;
}
return true;
}