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; }