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

Revision:
0:f3bdfd31af88
Child:
1:fe6b5355c973
diff -r 000000000000 -r f3bdfd31af88 FIFO.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FIFO.cpp	Wed Mar 29 16:08:55 2017 +0000
@@ -0,0 +1,142 @@
+// -*- 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>;
+