Skyward boardcore
Loading...
Searching...
No Matches
SyncCircularBuffer.h
Go to the documentation of this file.
1/* Copyright (c) 2015-2018 Skyward Experimental Rocketry
2 * Authors: Luca Erbetta, Davide Mor
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 * THE SOFTWARE.
21 */
22
23#pragma once
24
25#include <miosix.h>
26
27#include <type_traits>
28
29#include "CircularBuffer.h"
30
31using miosix::ConditionVariable;
32using miosix::FastMutex;
33using miosix::Lock;
34
35namespace Boardcore
36{
37
41template <typename T, unsigned int Size>
43{
44public:
49 void put(const T& elem)
50 {
51 Lock<FastMutex> l(mutex);
52 cv.signal();
53 buffer.put(elem);
54 }
55
67 T get(unsigned int i = 0)
68 {
69 Lock<FastMutex> l(mutex);
70 return buffer.get(i);
71 }
72
80 T last()
81 {
82 Lock<FastMutex> l(mutex);
83 return buffer.last();
84 }
85
93 T pop()
94 {
95 Lock<FastMutex> l(mutex);
96 return buffer.pop();
97 }
98
104 size_t count() const
105 {
106 Lock<FastMutex> l(mutex);
107 return buffer.count();
108 }
109
110 bool isEmpty() const
111 {
112 Lock<FastMutex> l(mutex);
113 return buffer.isEmpty();
114 }
115
116 bool isFull() const
117 {
118 Lock<FastMutex> l(mutex);
119 return buffer.isFull();
120 }
121
126 {
127 Lock<FastMutex> l(mutex);
128 while (buffer.isEmpty())
129 cv.wait(l);
130 }
131
138 size_t getSize() const { return Size; }
139
140private:
141 mutable FastMutex mutex;
142 mutable ConditionVariable cv;
143
144 CircularBuffer<T, Size> buffer;
145};
146
147} // namespace Boardcore
size_t count() const
Counts the elements in the buffer.
T pop()
Pops the first element in the buffer.
void waitUntilNotEmpty()
Waits until the buffer contains at least one element.
T last()
Returns the last element added in the buffer.
size_t getSize() const
Returns the maximum number of elements that can be stored in the buffer.
T get(unsigned int i=0)
Gets an element from the buffer, without removing it.
This file includes all the types the logdecoder script will decode.