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

Committer:
babylonica
Date:
Thu Jun 22 12:21:25 2017 +0000
Revision:
3:137a7245f990
Parent:
2:fa27aa055777
Warning Fixed.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
babylonica 0:f3bdfd31af88 1 // -*- coding: utf-8 -*-
babylonica 0:f3bdfd31af88 2 /**
babylonica 0:f3bdfd31af88 3 @file FIFO.hpp
babylonica 0:f3bdfd31af88 4 @brief Variable Length Ring Buffer
babylonica 0:f3bdfd31af88 5
babylonica 0:f3bdfd31af88 6 This library provides variable length ring buffering with software FIFO(First-in, First-out).
babylonica 2:fa27aa055777 7 This library overwrites when the buffer is full.
babylonica 0:f3bdfd31af88 8
babylonica 0:f3bdfd31af88 9 @author T.Kawamura
babylonica 0:f3bdfd31af88 10 @version 2.1
babylonica 0:f3bdfd31af88 11 @date 2016-11-20 T.Kawamura Written for AVR.
babylonica 0:f3bdfd31af88 12 @date 2017-03-28 T.Kawamura Fork for mbed/C++.
babylonica 0:f3bdfd31af88 13 @date 2017-03-29 T.Kawamura Add template.
babylonica 0:f3bdfd31af88 14
babylonica 0:f3bdfd31af88 15 @see
babylonica 0:f3bdfd31af88 16 Copyright (C) 2016-2017 T.Kawamura.
babylonica 0:f3bdfd31af88 17 Released under the MIT license.
babylonica 0:f3bdfd31af88 18 http://opensource.org/licenses/mit-license.php
babylonica 0:f3bdfd31af88 19
babylonica 0:f3bdfd31af88 20 */
babylonica 0:f3bdfd31af88 21
babylonica 0:f3bdfd31af88 22 #ifndef FIFO_H
babylonica 0:f3bdfd31af88 23 #define FIFO_H
babylonica 0:f3bdfd31af88 24
babylonica 0:f3bdfd31af88 25 /**
babylonica 0:f3bdfd31af88 26 Disable all interuupts and save the status of interrupts.
babylonica 0:f3bdfd31af88 27 This macro is usable at ONLY Cortex-M Series.
babylonica 0:f3bdfd31af88 28 */
babylonica 0:f3bdfd31af88 29 #define DISABLE_INTERRUPTS uint32_t primask = __get_PRIMASK(); __disable_irq()
babylonica 0:f3bdfd31af88 30 /**
babylonica 0:f3bdfd31af88 31 Enable all interuupts when the status of interrupts is ENABLED.
babylonica 0:f3bdfd31af88 32 This macro is usable at ONLY Cortex-M Series.
babylonica 0:f3bdfd31af88 33 */
babylonica 0:f3bdfd31af88 34 #define RESTORE_INTERUUPTS if( !(primask & 1) ) __enable_irq()
babylonica 0:f3bdfd31af88 35
babylonica 0:f3bdfd31af88 36 /**
babylonica 0:f3bdfd31af88 37 @class FIFO
babylonica 0:f3bdfd31af88 38 @brief Variable Length Software Ring Buffer
babylonica 0:f3bdfd31af88 39 */
babylonica 0:f3bdfd31af88 40 template <typename T>
babylonica 0:f3bdfd31af88 41 class FIFO{
babylonica 0:f3bdfd31af88 42 private:
babylonica 0:f3bdfd31af88 43 T *buffer; // Buffer
babylonica 0:f3bdfd31af88 44 uint32_t size; // Buffer Size
babylonica 0:f3bdfd31af88 45 volatile uint32_t getindex; // Index for Getting Data
babylonica 0:f3bdfd31af88 46 volatile uint32_t putindex; // Index for Putting Data
babylonica 0:f3bdfd31af88 47 volatile uint32_t count; // Size of Data
babylonica 0:f3bdfd31af88 48
babylonica 0:f3bdfd31af88 49 public:
babylonica 0:f3bdfd31af88 50 /**
babylonica 0:f3bdfd31af88 51 @brief Create a new FIFO.
babylonica 0:f3bdfd31af88 52 @param size Buffer Size.
babylonica 0:f3bdfd31af88 53 */
babylonica 0:f3bdfd31af88 54 FIFO(uint32_t bufsize);
babylonica 0:f3bdfd31af88 55
babylonica 0:f3bdfd31af88 56 /**
babylonica 0:f3bdfd31af88 57 @brief Destroy the FIFO.
babylonica 0:f3bdfd31af88 58 @param No Parameters.
babylonica 0:f3bdfd31af88 59 */
babylonica 0:f3bdfd31af88 60 virtual ~FIFO(void);
babylonica 0:f3bdfd31af88 61
babylonica 0:f3bdfd31af88 62 /**
babylonica 0:f3bdfd31af88 63 @brief Clear the buffer.
babylonica 0:f3bdfd31af88 64 @param No Parameters.
babylonica 0:f3bdfd31af88 65 */
babylonica 0:f3bdfd31af88 66 virtual void clear(void);
babylonica 0:f3bdfd31af88 67
babylonica 0:f3bdfd31af88 68 /**
babylonica 0:f3bdfd31af88 69 @brief Get buffer size.
babylonica 0:f3bdfd31af88 70 @param No Parameters.
babylonica 0:f3bdfd31af88 71 @return Buffer size
babylonica 0:f3bdfd31af88 72 */
babylonica 0:f3bdfd31af88 73 virtual uint32_t getsize(void);
babylonica 0:f3bdfd31af88 74
babylonica 0:f3bdfd31af88 75 /**
babylonica 0:f3bdfd31af88 76 @brief Get byte from the buffer.
babylonica 0:f3bdfd31af88 77 @param No Parameters.
babylonica 0:f3bdfd31af88 78 @retval All Data
babylonica 0:f3bdfd31af88 79 @retval 0 Error.
babylonica 0:f3bdfd31af88 80 */
babylonica 0:f3bdfd31af88 81 virtual T get(void);
babylonica 0:f3bdfd31af88 82
babylonica 0:f3bdfd31af88 83 /**
babylonica 0:f3bdfd31af88 84 @brief Peek byte from the buffer
babylonica 0:f3bdfd31af88 85 Peek 1byte from the buffer.(Do not touch index)
babylonica 0:f3bdfd31af88 86 @param No Parameters.
babylonica 0:f3bdfd31af88 87 @retval All Data
babylonica 0:f3bdfd31af88 88 @retval 0 Error.
babylonica 0:f3bdfd31af88 89 */
babylonica 0:f3bdfd31af88 90 virtual T peek(void);
babylonica 0:f3bdfd31af88 91
babylonica 0:f3bdfd31af88 92 /**
babylonica 0:f3bdfd31af88 93 @brief Put byte to the buffer
babylonica 0:f3bdfd31af88 94 @param No Parameters.
babylonica 0:f3bdfd31af88 95 @param putdata The Data for Putting.
babylonica 1:fe6b5355c973 96 @return Nothing.
babylonica 1:fe6b5355c973 97 */
babylonica 1:fe6b5355c973 98 virtual void put(const T putdata);
babylonica 0:f3bdfd31af88 99
babylonica 0:f3bdfd31af88 100 /**
babylonica 0:f3bdfd31af88 101 @brief Get Size of Retained Data.
babylonica 0:f3bdfd31af88 102 @param No Parameters.
babylonica 0:f3bdfd31af88 103 @return Data size.
babylonica 0:f3bdfd31af88 104 */
babylonica 0:f3bdfd31af88 105 virtual uint32_t available(void);
babylonica 0:f3bdfd31af88 106
babylonica 0:f3bdfd31af88 107 /**
babylonica 0:f3bdfd31af88 108 * @brief Overloaded operator for putting data to the FIFO.
babylonica 0:f3bdfd31af88 109 * @param Data to put
babylonica 0:f3bdfd31af88 110 */
babylonica 0:f3bdfd31af88 111 FIFO &operator= (T data){
babylonica 0:f3bdfd31af88 112 put(data);
babylonica 0:f3bdfd31af88 113 return *this;
babylonica 0:f3bdfd31af88 114 }
babylonica 0:f3bdfd31af88 115
babylonica 0:f3bdfd31af88 116 /**
babylonica 0:f3bdfd31af88 117 * @brief Overloaded operator for getting data from the FIFO.
babylonica 0:f3bdfd31af88 118 * @param No Parameters.
babylonica 0:f3bdfd31af88 119 * @return Oldest Data
babylonica 0:f3bdfd31af88 120 */
babylonica 0:f3bdfd31af88 121 operator int(void){
babylonica 0:f3bdfd31af88 122 return get();
babylonica 0:f3bdfd31af88 123 }
babylonica 0:f3bdfd31af88 124
babylonica 0:f3bdfd31af88 125 };
babylonica 0:f3bdfd31af88 126
babylonica 0:f3bdfd31af88 127 #endif
babylonica 0:f3bdfd31af88 128