Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers circular_buffer.cpp Source File

circular_buffer.cpp

00001 #include    "circular_buffer.h"
00002 #include    "mbed.h"
00003 
00004 using namespace std;
00005 
00006 bool    circular_buffer_f::seek    (int distance_back) {   // Assumes at least that much has been written to buff beforehand
00007     if(!seek_enable)    return  false;
00008     if(buffsize <= distance_back)    return  false;
00009     Offbuff = Onbuff - distance_back;       //  Setup to enable read of most recent 'distance_back' samples
00010     if(Offbuff < buffbase)  Offbuff += buffsize;
00011     emptyf = false;
00012     return  true;
00013 }
00014 void    circular_buffer_f::init    (int size, float *buffstart, int flags)  {  // Size and address of buffer to work with
00015     buffsize = size;
00016     Onbuff = Offbuff = buffend = buffbase = buffstart;
00017     buffend += (size - 1);
00018     emptyf = true; fullf = false;
00019     if  (flags & OVERWRITE_ENABLE)  overwrite_enable = true;
00020     else overwrite_enable = false;
00021     if  (flags & SEEK_ENABLE)       seek_enable = true;
00022     else seek_enable = false;
00023 }
00024 bool    circular_buffer_f::read (float *rd)  {
00025     if(!readable())             return false;
00026     *rd = *Offbuff++;
00027     if(Offbuff > buffend)       Offbuff = buffbase;
00028     if(Onbuff == Offbuff)       emptyf = true;
00029     fullf = false;
00030     return true;
00031 }
00032 bool    circular_buffer_f::write   (float a)  {     // Put value into circular buffer
00033     if  (overwrite_enable)  {
00034         *Onbuff++ = a;                  // post increment pointer
00035         if(Onbuff > buffend)        Onbuff = buffbase;
00036         fullf = false;
00037     }
00038     else    {
00039         if(fullf)                   return false;  // Fail if buffer already full
00040         *Onbuff++ = a;                  // post increment pointer
00041         if(Onbuff > buffend)        Onbuff = buffbase;
00042         if(Onbuff == Offbuff)       fullf = true;
00043     }
00044     emptyf = false;
00045     return true;
00046 }
00047 bool circular_buffer_f::get_samps (float *dest, int len) {
00048     for (int i = 0; i < len; i++)   {
00049         if (!read(dest++))
00050             return false;
00051     }
00052     return  true;
00053 }
00054 
00055 //////////////////////////
00056 
00057 bool    circular_buffer_c::seek    (int distance_back) {   // Assumes at least that much has been written to buff beforehand
00058     if(!seek_enable)    return  false;
00059     if(buffsize <= distance_back)    return  false;
00060     Offbuff = Onbuff - distance_back;       //  Setup to enable read of most recent 'distance_back' samples
00061     if(Offbuff < buffbase)  Offbuff += buffsize;
00062     emptyf = false;
00063     return  true;
00064 }
00065 void    circular_buffer_c::init    (int size, char *buffstart, int flags)  {  // Size and address of buffer to work with
00066     buffsize = size;
00067     Onbuff = Offbuff = buffend = buffbase = buffstart;
00068     buffend += (size - 1);
00069     emptyf = true; fullf = false;
00070     if  (flags & OVERWRITE_ENABLE)  overwrite_enable = true;
00071     else overwrite_enable = false;
00072     if  (flags & SEEK_ENABLE)       seek_enable = true;
00073     else seek_enable = false;
00074 }
00075 bool    circular_buffer_c::read (char *rd)  {
00076     if(!readable())             return false;
00077     *rd = *Offbuff++;
00078     if(Offbuff > buffend)       Offbuff = buffbase;
00079     if(Onbuff == Offbuff)       emptyf = true;
00080     fullf = false;
00081     return true;
00082 }
00083 bool    circular_buffer_c::write   (char a)  {     // Put value into circular buffer
00084     if  (overwrite_enable)  {
00085         *Onbuff++ = a;                  // post increment pointer
00086         if(Onbuff > buffend)        Onbuff = buffbase;
00087         fullf = false;
00088     }
00089     else    {
00090         if(fullf)                   return false;  // Fail if buffer already full
00091         *Onbuff++ = a;                  // post increment pointer
00092         if(Onbuff > buffend)        Onbuff = buffbase;
00093         if(Onbuff == Offbuff)       fullf = true;
00094     }
00095     emptyf = false;
00096     return true;
00097 }
00098 bool circular_buffer_c::get_samps (char *dest, int len) {
00099     for (int i = 0; i < len; i++)   {
00100         if (!read(dest++))
00101             return false;
00102     }
00103     return  true;
00104 }
00105