aaaaaaaaa

Dependencies:   QEI mbed

Fork of MainBoard2018_Auto_Master_A_new by Akihiro Nakabayashi

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers RingBuffer.cpp Source File

RingBuffer.cpp

00001 /*
00002 * RingBuffer.cpp
00003 *
00004 * Created: 2016/08/10 12:14:47
00005 *  Author: masuk
00006 */
00007 
00008 #include "mbed.h"
00009 #include "RingBuffer.h"
00010 
00011 namespace RINGBUFFER
00012 {
00013 
00014     RingBuffer::RingBuffer(char *bufPtr, int size)
00015     {
00016         Buffer.data = bufPtr;
00017         Buffer.size = size;
00018         Buffer.top = 0;
00019         Buffer.bottom = 0;
00020         Buffer.fullup = false;
00021     }
00022 
00023     void RingBuffer::PutData(char data, bool ASCIItoNum /* = false */)
00024     {
00025         __disable_irq();
00026         if(!Buffer.fullup)
00027         {
00028             if(ASCIItoNum) Buffer.data[Buffer.top] = data+48;
00029             else           Buffer.data[Buffer.top] = data;
00030             Buffer.length++;
00031             Buffer.top++;
00032             Buffer.top %= Buffer.size;
00033             Buffer.fullup = false;
00034             if(Buffer.length>=Buffer.size) Buffer.fullup = true;
00035         }
00036         __enable_irq();
00037     }
00038 
00039     void RingBuffer::PutData(char *data, int length)
00040     {
00041         __disable_irq();
00042         for(int i=0; i<length; i++)
00043         {
00044             if(!Buffer.fullup)
00045             {
00046                 Buffer.data[Buffer.top] = data[i];
00047                 Buffer.length++;
00048                 Buffer.top++;
00049                 Buffer.top %= Buffer.size;
00050                 Buffer.fullup = false;
00051                 if(Buffer.length>=Buffer.size) Buffer.fullup = true;
00052             }
00053         }
00054         __enable_irq();
00055     }
00056 
00057     void RingBuffer::PutData(const char *str)
00058     {
00059         __disable_irq();
00060         for( ; *str!='\0'; str++)
00061         {
00062             if(!Buffer.fullup)
00063             {
00064                 Buffer.data[Buffer.top] = *str;
00065                 Buffer.length++;
00066                 Buffer.top++;
00067                 Buffer.top %= Buffer.size;
00068                 if(Buffer.length>=Buffer.size) Buffer.fullup = true;
00069                 else                           Buffer.fullup = false;
00070             }
00071         }
00072         __enable_irq();
00073     }
00074 
00075     char RingBuffer::GetData()
00076     {
00077         __disable_irq();
00078         char data;
00079         if(Buffer.length > 0)
00080         {
00081             data = Buffer.data[Buffer.bottom];
00082             Buffer.length--;
00083             Buffer.bottom++;
00084             Buffer.bottom %= Buffer.size;
00085             if(Buffer.length<Buffer.size) Buffer.fullup = false;
00086         }
00087         else data = '\0';
00088         __enable_irq();
00089         return data;
00090     }
00091 
00092     bool RingBuffer::IsFullup()
00093     {
00094         return Buffer.fullup;
00095     }
00096 
00097     bool RingBuffer::InAnyData()
00098     {
00099         if(Buffer.length > 0) return true;
00100         else return false;
00101     }
00102 
00103 }