Embed:
(wiki syntax)
Show/hide line numbers
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
Generated on Mon Jul 18 2022 17:25:53 by 1.7.2