Пример #1
0
bool has_further_repetition(const DataRequest& request)
{
    bool repeat = false;
    if (request.repetition) {
        repeat = has_further_repetition(request.repetition.get());
    }
    return repeat;
}
Пример #2
0
void Repeater::add(const DataRequestVariant& request,
        const DataRequest::Repetition& repetition, const DownPacket& payload)
{
    if (has_further_repetition(repetition)) {
        const auto next_repetition = m_runtime.now() + units::clock_cast(repetition.interval);
        m_repetitions.emplace_front(request, payload);
        auto added = m_repetitions.begin();
        auto then = std::placeholders::_1;
        m_runtime.schedule(next_repetition, std::bind<void>(&Repeater::trigger, this, added, then));
    }
}
Пример #3
0
void Repeater::trigger(std::list<Repetition>::iterator rep, Clock::time_point invocation)
{
    Repetition& repetition = *rep;
    DataRequest& request = access_request(repetition.m_request);
    assert(request.repetition);

    // reduce remaining interval by one step and occurred triggering delay
    decrement_by_one(*request.repetition);
    auto delayed = m_runtime.now() - invocation;
    request.repetition->maximum -= units::clock_cast(delayed);

    // reset repetition data if this is the last repetition
    if (!has_further_repetition(request)) {
        request.repetition.reset();
    }

    m_repeat_fn(repetition.m_request, std::move(repetition.m_payload));
    m_repetitions.erase(rep);
}
Пример #4
0
void Repeater::trigger(Timestamp now)
{
    while (!m_repetitions.empty() && m_repetitions.top().m_next <= now) {
        // This cast is safe because element is removed afterwards anyway
        Repetition& repetition = const_cast<Repetition&>(m_repetitions.top());
        if (m_repeat_fn) {
            DataRequest& request = access_request(repetition.m_request);
            assert(request.repetition);

            // reduce remaining interval by one step and occurred triggering delay
            decrement_by_one(*request.repetition);
            Timestamp::duration_type delayed = now - repetition.m_next;
            request.repetition->maximum -= units::Duration(delayed);

            // reset repetition data if this is the last repetition
            if (!has_further_repetition(request)) {
                request.repetition.reset();
            }
            m_repeat_fn(repetition.m_request, std::move(repetition.m_payload));
        }
        m_repetitions.pop();
    }
}