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.hpp@3:137a7245f990, 2017-06-22 (annotated)
- 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?
User | Revision | Line number | New 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 |