test

Dependencies:   mbed Watchdog

Dependents:   STM32-MC_node

Committer:
ommpy
Date:
Mon Jul 06 17:18:59 2020 +0530
Revision:
0:d383e2dee0f7
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ommpy 0:d383e2dee0f7 1 /* mbed Microcontroller Library
ommpy 0:d383e2dee0f7 2 * Copyright (c) 2015 ARM Limited
ommpy 0:d383e2dee0f7 3 *
ommpy 0:d383e2dee0f7 4 * Licensed under the Apache License, Version 2.0 (the "License");
ommpy 0:d383e2dee0f7 5 * you may not use this file except in compliance with the License.
ommpy 0:d383e2dee0f7 6 * You may obtain a copy of the License at
ommpy 0:d383e2dee0f7 7 *
ommpy 0:d383e2dee0f7 8 * http://www.apache.org/licenses/LICENSE-2.0
ommpy 0:d383e2dee0f7 9 *
ommpy 0:d383e2dee0f7 10 * Unless required by applicable law or agreed to in writing, software
ommpy 0:d383e2dee0f7 11 * distributed under the License is distributed on an "AS IS" BASIS,
ommpy 0:d383e2dee0f7 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ommpy 0:d383e2dee0f7 13 * See the License for the specific language governing permissions and
ommpy 0:d383e2dee0f7 14 * limitations under the License.
ommpy 0:d383e2dee0f7 15 */
ommpy 0:d383e2dee0f7 16 #ifndef MBED_CIRCULARBUFFER_H
ommpy 0:d383e2dee0f7 17 #define MBED_CIRCULARBUFFER_H
ommpy 0:d383e2dee0f7 18
ommpy 0:d383e2dee0f7 19 namespace mbed {
ommpy 0:d383e2dee0f7 20
ommpy 0:d383e2dee0f7 21 /** Templated Circular buffer class
ommpy 0:d383e2dee0f7 22 */
ommpy 0:d383e2dee0f7 23 template<typename T, uint32_t BufferSize, typename CounterType = uint32_t>
ommpy 0:d383e2dee0f7 24 class CircularBuffer {
ommpy 0:d383e2dee0f7 25 public:
ommpy 0:d383e2dee0f7 26 CircularBuffer() : _head(0), _tail(0), _full(false) {
ommpy 0:d383e2dee0f7 27 }
ommpy 0:d383e2dee0f7 28
ommpy 0:d383e2dee0f7 29 ~CircularBuffer() {
ommpy 0:d383e2dee0f7 30 }
ommpy 0:d383e2dee0f7 31
ommpy 0:d383e2dee0f7 32 /** Push the transaction to the buffer. This overwrites the buffer if it's
ommpy 0:d383e2dee0f7 33 * full
ommpy 0:d383e2dee0f7 34 *
ommpy 0:d383e2dee0f7 35 * @param data Data to be pushed to the buffer
ommpy 0:d383e2dee0f7 36 */
ommpy 0:d383e2dee0f7 37 void push(const T& data) {
ommpy 0:d383e2dee0f7 38 if (full()) {
ommpy 0:d383e2dee0f7 39 _tail++;
ommpy 0:d383e2dee0f7 40 _tail %= BufferSize;
ommpy 0:d383e2dee0f7 41 }
ommpy 0:d383e2dee0f7 42 _pool[_head++] = data;
ommpy 0:d383e2dee0f7 43 _head %= BufferSize;
ommpy 0:d383e2dee0f7 44 if (_head == _tail) {
ommpy 0:d383e2dee0f7 45 _full = true;
ommpy 0:d383e2dee0f7 46 }
ommpy 0:d383e2dee0f7 47 }
ommpy 0:d383e2dee0f7 48
ommpy 0:d383e2dee0f7 49 /** Pop the transaction from the buffer
ommpy 0:d383e2dee0f7 50 *
ommpy 0:d383e2dee0f7 51 * @param data Data to be pushed to the buffer
ommpy 0:d383e2dee0f7 52 * @return True if the buffer is not empty and data contains a transaction, false otherwise
ommpy 0:d383e2dee0f7 53 */
ommpy 0:d383e2dee0f7 54 bool pop(T& data) {
ommpy 0:d383e2dee0f7 55 if (!empty()) {
ommpy 0:d383e2dee0f7 56 data = _pool[_tail++];
ommpy 0:d383e2dee0f7 57 _tail %= BufferSize;
ommpy 0:d383e2dee0f7 58 _full = false;
ommpy 0:d383e2dee0f7 59 return true;
ommpy 0:d383e2dee0f7 60 }
ommpy 0:d383e2dee0f7 61 return false;
ommpy 0:d383e2dee0f7 62 }
ommpy 0:d383e2dee0f7 63
ommpy 0:d383e2dee0f7 64 /** Check if the buffer is empty
ommpy 0:d383e2dee0f7 65 *
ommpy 0:d383e2dee0f7 66 * @return True if the buffer is empty, false if not
ommpy 0:d383e2dee0f7 67 */
ommpy 0:d383e2dee0f7 68 bool empty() {
ommpy 0:d383e2dee0f7 69 return (_head == _tail) && !_full;
ommpy 0:d383e2dee0f7 70 }
ommpy 0:d383e2dee0f7 71
ommpy 0:d383e2dee0f7 72 /** Check if the buffer is full
ommpy 0:d383e2dee0f7 73 *
ommpy 0:d383e2dee0f7 74 * @return True if the buffer is full, false if not
ommpy 0:d383e2dee0f7 75 */
ommpy 0:d383e2dee0f7 76 bool full() {
ommpy 0:d383e2dee0f7 77 return _full;
ommpy 0:d383e2dee0f7 78 }
ommpy 0:d383e2dee0f7 79
ommpy 0:d383e2dee0f7 80 /** Reset the buffer
ommpy 0:d383e2dee0f7 81 *
ommpy 0:d383e2dee0f7 82 */
ommpy 0:d383e2dee0f7 83 void reset() {
ommpy 0:d383e2dee0f7 84 _head = 0;
ommpy 0:d383e2dee0f7 85 _tail = 0;
ommpy 0:d383e2dee0f7 86 _full = false;
ommpy 0:d383e2dee0f7 87 }
ommpy 0:d383e2dee0f7 88
ommpy 0:d383e2dee0f7 89 private:
ommpy 0:d383e2dee0f7 90 T _pool[BufferSize];
ommpy 0:d383e2dee0f7 91 volatile CounterType _head;
ommpy 0:d383e2dee0f7 92 volatile CounterType _tail;
ommpy 0:d383e2dee0f7 93 volatile bool _full;
ommpy 0:d383e2dee0f7 94 };
ommpy 0:d383e2dee0f7 95
ommpy 0:d383e2dee0f7 96 }
ommpy 0:d383e2dee0f7 97
ommpy 0:d383e2dee0f7 98 #endif