CPP-TOOLBOX
Loading...
Searching...
No Matches
periodic_signal.hpp
Go to the documentation of this file.
1#ifndef PERIODIC_SIGNAL_HPP
2#define PERIODIC_SIGNAL_HPP
3
4#include <algorithm>
5#include <chrono>
6#include <cmath>
7
25
35
37 public:
39 : period_duration(std::chrono::duration<double>(1.0 / rate_limit_hz)),
40 start_time(std::chrono::steady_clock::now()), signal_count(0), last_signal_time(start_time),
41 last_delta_time(0.0), mode(mode) {}
42
49 auto now = std::chrono::steady_clock::now();
50
51 // Compute how many full periods have elapsed since start
52 double elapsed_seconds = std::chrono::duration<double>(now - start_time).count();
53 int expected_signal_count = static_cast<int>(elapsed_seconds / period_duration.count());
54
55 // If we've reached or passed at least one new signal since last time
56 if (expected_signal_count > signal_count) {
57 // Move signal count to the latest one
58 signal_count = expected_signal_count;
59 last_delta_time = std::chrono::duration<double>(now - last_signal_time).count();
60 last_signal_time = now;
61 return true;
62 }
63 return false;
64 }
65
73 double get_last_delta_time() const {
75 return period_duration.count();
76 }
77 return last_delta_time;
78 }
79
84 auto now = std::chrono::steady_clock::now();
85 double elapsed_seconds = std::chrono::duration<double>(now - start_time).count();
86 int expected_signal_count = static_cast<int>(elapsed_seconds / period_duration.count());
87 return expected_signal_count > signal_count;
88 }
89
93 double get_cycle_progress() const {
94 auto now = std::chrono::steady_clock::now();
95 double elapsed_seconds = std::chrono::duration<double>(now - start_time).count();
96 double cycle_position = std::fmod(elapsed_seconds, period_duration.count());
97 return std::clamp(cycle_position / period_duration.count(), 0.0, 1.0);
98 }
99
100 private:
101 OperationMode mode;
102 std::chrono::duration<double> period_duration;
103 std::chrono::steady_clock::time_point start_time;
104 std::chrono::steady_clock::time_point last_signal_time;
105 int signal_count;
106 double last_delta_time;
107};
108
109#endif // PERIODIC_SIGNAL_HPP
bool enough_time_has_passed() const
returns true if a signal would have occurred since the last signal.
Definition periodic_signal.hpp:83
double get_last_delta_time() const
returns the amount of time it took for the last signal to come through
Definition periodic_signal.hpp:73
double get_cycle_progress() const
Returns normalized progress [0,1] through the current cycle.
Definition periodic_signal.hpp:93
bool process_and_get_signal()
Returns true if one or more signals should have occurred since the last call. If we have fallen behin...
Definition periodic_signal.hpp:48
PeriodicSignal(int rate_limit_hz, OperationMode mode=OperationMode::MEASURED_DELTAS)
Definition periodic_signal.hpp:38
Definition hashing.hpp:8
OperationMode
the operation mode indicates how the delta times are computed in the PeriodicSignal
Definition periodic_signal.hpp:21
@ MEASURED_DELTAS
Definition periodic_signal.hpp:23
@ PERFECT_DELTAS
Definition periodic_signal.hpp:22