2#include <vanetza/common/runtime.hpp>
12static const Limeric::Parameters limericDefaultParams;
14Limeric::Limeric(Runtime& rt) : Limeric(rt, limericDefaultParams)
18Limeric::Limeric(Runtime& rt,
const Parameters& params) :
19 on_duty_cycle_change(m_duty_cycle_change), m_runtime(rt), m_params(params),
20 m_duty_cycle(mean(params.delta_max, params.delta_min)), m_cbr(2)
22 assert(m_cbr.empty());
28 m_runtime.cancel(
this);
34 return 0.5 * mean(m_cbr.begin(), m_cbr.end()) + 0.5 * m_channel_load;
36 return m_channel_load;
42 const bool full = m_cbr.full();
45 m_channel_load = mean(m_cbr.begin(), m_cbr.end());
51 const double cbr_delta = m_params.cbr_target.value() - m_channel_load.value();
52 double delta_offset = 0.0;
53 if (cbr_delta > 0.0) {
54 delta_offset = std::min(m_params.beta.value() * cbr_delta, m_params.g_plus_max);
56 delta_offset = std::max(m_params.beta.value() * cbr_delta, m_params.g_minus_max);
58 UnitInterval delta = m_params.alpha.complement() * m_duty_cycle + delta_offset;
59 delta = std::min(std::max(delta, m_params.delta_min), m_params.delta_max);
62 if (m_duty_cycle - delta > m_dual_alpha->threshold) {
63 delta = m_dual_alpha->alternate_alpha.complement() * m_duty_cycle + delta_offset;
64 delta = std::min(std::max(delta, m_params.delta_min), m_params.delta_max);
70void Limeric::calculate(Clock::time_point tp)
72 m_channel_load = average_cbr();
73 m_duty_cycle = calculate_duty_cycle();
74 m_duty_cycle_change(
this, tp);
78void Limeric::schedule()
81 const Clock::duration scheduling_interval = 2 * m_params.cbr_interval;
82 Clock::time_point tp = m_runtime.now() + scheduling_interval;
83 const Clock::duration scheduling_bias = tp.time_since_epoch() % scheduling_interval;
84 if (scheduling_bias > m_params.cbr_interval) {
85 tp += scheduling_interval - scheduling_bias;
86 }
else if (scheduling_bias > Clock::duration::zero()) {
87 tp -= scheduling_bias;
89 m_runtime.schedule(tp, [
this](Clock::time_point tp) {
94void Limeric::configure_dual_alpha(
const boost::optional<DualAlphaParameters>& params)
96 m_dual_alpha = params;