Vanetza
 
Loading...
Searching...
No Matches
repeater.cpp
1#include "repeater.hpp"
2#include "data_request.hpp"
3#include <vanetza/common/runtime.hpp>
4#include <cassert>
5
6namespace vanetza
7{
8namespace geonet
9{
10
11Repeater::Repetition::Repetition(const DataRequestVariant& request, const DownPacket& payload) :
12 m_request(request), m_payload(new DownPacket(payload))
13{
14}
15
16Repeater::Repeater(Runtime& rt, const Callback& cb) : m_repeat_fn(cb), m_runtime(rt)
17{
18 assert(m_repeat_fn);
19}
20
21Repeater::~Repeater()
22{
23 m_runtime.cancel(this);
24}
25
26void Repeater::add(const DataRequestVariant& request,
27 const DataRequest::Repetition& repetition, const DownPacket& payload)
28{
29 if (has_further_repetition(repetition)) {
30 const auto next_repetition = m_runtime.now() + units::clock_cast(repetition.interval);
31 m_repetitions.emplace_front(request, payload);
32 auto added = m_repetitions.begin();
33 auto then = std::placeholders::_1;
34 m_runtime.schedule(next_repetition, std::bind<void>(&Repeater::trigger, this, added, then), this);
35 }
36}
37
38void Repeater::trigger(std::list<Repetition>::iterator rep, Clock::time_point invocation)
39{
40 Repetition& repetition = *rep;
41 DataRequest& request = access_request(repetition.m_request);
42 assert(request.repetition);
43
44 // reduce remaining interval by one step and occurred triggering delay
45 decrement_by_one(*request.repetition);
46 auto delayed = m_runtime.now() - invocation;
47 request.repetition->maximum -= units::clock_cast(delayed);
48
49 // reset repetition data if this is the last repetition
50 if (!has_further_repetition(request)) {
51 request.repetition.reset();
52 }
53
54 m_repeat_fn(repetition.m_request, std::move(repetition.m_payload));
55 m_repetitions.erase(rep);
56}
57
58} // namespace geonet
59} // namespace vanetza
60
ChunckPacket is a packet consisting of several memory chunks.
virtual void cancel(const void *scope)=0
virtual Clock::time_point now() const =0
virtual void schedule(Clock::time_point tp, const Callback &cb, const void *scope=nullptr)=0
void trigger(std::list< Repetition >::iterator, Clock::time_point)
Definition: repeater.cpp:38
void add(const REQUEST &request, const DownPacket &payload)
Definition: repeater.hpp:42