Thunderbots Project
Loading...
Searching...
No Matches
observer.hpp
1#pragma once
2
3#include "shared/constants.h"
4#include "software/multithreading/thread_safe_buffer.hpp"
5
13template <typename T, typename Clock = std::chrono::steady_clock>
15{
16 public:
23 Observer(size_t buffer_size = DEFAULT_BUFFER_SIZE, bool log_buffer_full = true);
24
30 virtual void receiveValue(T val);
31
37 virtual double getDataReceivedPerSecond() final;
38
39 virtual ~Observer() = default;
40
41 static constexpr size_t TIME_BUFFER_SIZE = 5;
42
43 protected:
58 virtual std::optional<T> popMostRecentlyReceivedValue(Duration max_wait_time) final;
59
74 virtual std::optional<T> popLeastRecentlyReceivedValue(Duration max_wait_time) final;
75
76 static constexpr size_t DEFAULT_BUFFER_SIZE = 1;
77
78 private:
79 ThreadSafeBuffer<T> buffer;
80 boost::circular_buffer<std::chrono::milliseconds> receive_time_buffer;
81};
82
83template <typename T, typename Clock>
84Observer<T, Clock>::Observer(size_t buffer_size, bool log_buffer_full)
85 : buffer(buffer_size, log_buffer_full), receive_time_buffer(TIME_BUFFER_SIZE)
86{
87}
88
89template <typename T, typename Clock>
91{
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));
95}
96
97template <typename T, typename Clock>
99{
100 return buffer.popMostRecentlyAddedValue(max_wait_time);
101}
102
103template <typename T, typename Clock>
105{
106 return buffer.popLeastRecentlyAddedValue(max_wait_time);
107}
108
109template <typename T, typename Clock>
111{
112 if (receive_time_buffer.empty())
113 {
114 return 0;
115 }
116 else
117 {
118 double time_s =
119 static_cast<double>(
120 (receive_time_buffer.back() - receive_time_buffer.front()).count()) *
121 SECONDS_PER_MILLISECOND;
122
123 double rate = static_cast<double>(receive_time_buffer.size() - 1) / time_s;
124 return std::max(0.0, rate);
125 }
126}
Definition duration.h:12
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