1#ifndef PERIODIC_SIGNAL_HPP
2#define PERIODIC_SIGNAL_HPP
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) {}
49 auto now = std::chrono::steady_clock::now();
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());
56 if (expected_signal_count > signal_count) {
58 signal_count = expected_signal_count;
59 last_delta_time = std::chrono::duration<double>(now - last_signal_time).count();
60 last_signal_time = now;
75 return period_duration.count();
77 return last_delta_time;
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;
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);
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;
106 double last_delta_time;
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
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