3#include "imr/util/log.h"
18 using namespace std::chrono_literals;
39 concept ClockConcept =
requires {
40 typename T::time_point;
41 { T::now() } -> std::same_as<
typename T::time_point>;
45 template <ClockConcept Clock = std::chrono::steady_clock>
55
56
57
62 : playback_speed_{cfg.playback_speed},
63 skip_before_{cfg.skip_before}
71 return packet_timestamp < skip_before_;
75
76
77
79 std::chrono::nanoseconds
get_delay(std::chrono::nanoseconds packet_timestamp)
81 if (!replay_origin_.has_value())
84 replay_origin_ = packet_timestamp;
85 wall_origin_ = Clock::now();
87 util::
log::debug(
"Downstream pacer: replay origin set at {}ns (wall origin {}ns since epoch)",
88 replay_origin_->count(),
89 wall_origin_.time_since_epoch().count());
92 return calculate_delay(packet_timestamp);
96 double playback_speed_;
97 std::chrono::nanoseconds skip_before_;
98 Clock::time_point wall_origin_;
99 std::optional<std::chrono::nanoseconds> replay_origin_;
102 std::chrono::nanoseconds calculate_delay(std::chrono::nanoseconds packet_timestamp)
104 const auto replay_offset{packet_timestamp - *replay_origin_};
106 const auto scaled_offset{
107 std::chrono::nanoseconds(
108 static_cast<int64_t>(
static_cast<
double>(replay_offset.count()) / playback_speed_)),
111 const auto send_at{wall_origin_ + scaled_offset};
113 const auto now{Clock::now()};
117 return std::chrono::nanoseconds{0};
120 return std::chrono::nanoseconds(send_at - now);
Calculates relative delay for a given message timestamp for downstream (which passes the first messag...
Definition pacer.h:47
Pacer(const Config &cfg)
Definition pacer.h:61
std::chrono::nanoseconds get_delay(std::chrono::nanoseconds packet_timestamp)
Returns calculated delay.
Definition pacer.h:79
bool should_skip(std::chrono::nanoseconds packet_timestamp)
True/false if given timestamp is before skip_before_
Definition pacer.h:69
MarketPhase
Definition pacer.h:10
constexpr auto market_close
Definition pacer.h:35
constexpr auto market_open
Definition pacer.h:33
constexpr std::chrono::nanoseconds phase_to_ns(MarketPhase phase)
Definition pacer.h:16
constexpr auto market_pre
Definition pacer.h:34
Definition file_descriptor.h:11
double playback_speed
Scale calculated delays.
Definition pacer.h:53
std::chrono::nanoseconds skip_before
Definition pacer.h:58