3#include "shared/constants.h"
4#include "software/multithreading/thread_safe_buffer.hpp"
13template <
typename T,
typename Clock = std::chrono::steady_clock>
23 Observer(
size_t buffer_size = DEFAULT_BUFFER_SIZE,
bool log_buffer_full =
true);
41 static constexpr
size_t TIME_BUFFER_SIZE = 5;
76 static constexpr
size_t DEFAULT_BUFFER_SIZE = 1;
80 boost::circular_buffer<std::chrono::milliseconds> receive_time_buffer;
83template <typename T, typename Clock>
85 : buffer(buffer_size, log_buffer_full), receive_time_buffer(TIME_BUFFER_SIZE)
89template <
typename T,
typename Clock>
92 receive_time_buffer.push_back(std::chrono::duration_cast<std::chrono::milliseconds>(
93 Clock::now().time_since_epoch()));
94 buffer.push(std::move(val));
97template <
typename T,
typename Clock>
100 return buffer.popMostRecentlyAddedValue(max_wait_time);
103template <
typename T,
typename Clock>
106 return buffer.popLeastRecentlyAddedValue(max_wait_time);
109template <
typename T,
typename Clock>
112 if (receive_time_buffer.empty())
120 (receive_time_buffer.back() - receive_time_buffer.front()).count()) *
121 SECONDS_PER_MILLISECOND;
123 double rate =
static_cast<double>(receive_time_buffer.size() - 1) / time_s;
124 return std::max(0.0, rate);
Definition observer.hpp:15
virtual void receiveValue(T val)
Definition observer.hpp:90
virtual std::optional< T > popMostRecentlyReceivedValue(Duration max_wait_time) final
Definition observer.hpp:98
virtual std::optional< T > popLeastRecentlyReceivedValue(Duration max_wait_time) final
Definition observer.hpp:104
virtual double getDataReceivedPerSecond() final
Definition observer.hpp:110
Observer(size_t buffer_size=DEFAULT_BUFFER_SIZE, bool log_buffer_full=true)
Definition observer.hpp:84
Definition thread_safe_buffer.hpp:23