Christopher Haster / mbed-hal

Dependencies:   target-freescale

Fork of mbed-hal by Morpheus

Committer:
Christopher Haster
Date:
Wed Apr 06 09:41:33 2016 -0500
Revision:
20:fbc6173aa5b2
Parent:
0:9c59db1fbc9e
Added Binder class for statically allocated function binding

Who changed what in which revision?

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