UVic Assistive Technology Lab / Mbed 2 deprecated DSLR_Camera_Gimbal

Dependencies:   mbed ros_lib_kinetic

Committer:
group-UVic-Assistive-Technolog
Date:
Wed Jan 31 05:24:12 2018 +0000
Revision:
0:3a767f41cf04
Initial commit

Who changed what in which revision?

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