This library provides variable length ring buffering with software FIFO(First-in, First-out). This library overwrites when the buffer is full.
Dependents: AsyncSerial AsyncSerial AsyncSerial AsyncSerialh
FIFO.cpp
- Committer:
- babylonica
- Date:
- 2017-03-29
- Revision:
- 0:f3bdfd31af88
- Child:
- 1:fe6b5355c973
File content as of revision 0:f3bdfd31af88:
// -*- coding: utf-8 -*- /** @file FIFO.cpp @brief 1Byte Software FIFO(First-in, First-out) This library provides variable length ring buffering with software FIFO(First-in, First-out). This library DO NOT overwrite when the buffer is full. @author T.Kawamura @version 2.1 @date 2016-11-20 T.Kawamura Written for AVR. @date 2017-03-28 T.Kawamura Fork for mbed/C++. @date 2017-03-29 T.Kawamura Add template. @see Copyright (C) 2016-2017 T.Kawamura. Released under the MIT license. http://opensource.org/licenses/mit-license.php */ #include <stdint.h> #include "mbed.h" // for cmsis #include "FIFO.hpp" template <class T> FIFO<T>::FIFO(uint32_t bufsize){ buffer = new T[bufsize]; size = bufsize; getindex = 0; putindex = 0; count = 0; return; } template <class T> FIFO<T>::~FIFO(void){ delete[] buffer; return; } template <class T> void FIFO<T>::clear(void){ DISABLE_INTERRUPTS; count = 0; getindex = 0; putindex = 0; RESTORE_INTERUUPTS; return; } template <class T> uint32_t FIFO<T>::getsize(void){ return size; } template <class T> T FIFO<T>::get(void){ T getdata; DISABLE_INTERRUPTS; if ( count <= 0 ){ RESTORE_INTERUUPTS; return 0; } getdata = buffer[getindex]; getindex++; if ( getindex >= size ){ //When the index is in the terminus of the buffer getindex = 0; } count--; RESTORE_INTERUUPTS; return getdata; } template <class T> T FIFO<T>::peek(void){ T getdata; DISABLE_INTERRUPTS; if ( count <= 0 ){ //When the buffer is empty RESTORE_INTERUUPTS; return -1; } getdata = buffer[getindex]; RESTORE_INTERUUPTS; return getdata; } template <class T> uint8_t FIFO<T>::put(const T putdata){ DISABLE_INTERRUPTS; if ( count >= size ){ //When the buffer is full RESTORE_INTERUUPTS; return 0; } buffer[putindex] = putdata; putindex++; if ( putindex >= size ){ // When the index is in the terminus of the buffer putindex = 0; } count++; RESTORE_INTERUUPTS; return 1; } template <class T> uint32_t FIFO<T>::available(void){ uint32_t c = 0; DISABLE_INTERRUPTS; c = count; RESTORE_INTERUUPTS; return c; } template class FIFO<uint8_t>; template class FIFO<int8_t>; template class FIFO<uint16_t>; template class FIFO<int16_t>; template class FIFO<uint32_t>; template class FIFO<int32_t>; template class FIFO<uint64_t>; template class FIFO<int64_t>; template class FIFO<char>; template class FIFO<wchar_t>;