#ifndef REPEATER_HPP_AH49FXB1 #define REPEATER_HPP_AH49FXB1 #include #include #include #include #include #include namespace vanetza { // forward declaration class Runtime; namespace geonet { /** * Repeater eases handling of packet repetitions. * Packet repetitions are repeated requests with same payload. */ class Repeater { public: using Callback = std::function)>; /** * Create a Repeater instance * \param rt runtime used for scheduling repetitions * \param cb callback to be invoked when repetition is due */ Repeater(Runtime& rt, const Callback& cb); ~Repeater(); /** * Add another repetition * \param request any kind of GeoNet data request * \param payload request's payload */ template void add(const REQUEST& request, const DownPacket& payload) { if (request.repetition) { add(request, *request.repetition, payload); } } private: struct Repetition { Repetition(const DataRequestVariant&, const DownPacket&); DataRequestVariant m_request; std::unique_ptr m_payload; }; /** * Add packet repetition to internal book keeping */ void add(const DataRequestVariant&, const DataRequest::Repetition&, const DownPacket&); /** * Triggered when repetition is due according to runtime */ void trigger(std::list::iterator, Clock::time_point); std::list m_repetitions; Callback m_repeat_fn; Runtime& m_runtime; }; } // namespace geonet } // namespace vanetza #endif /* REPEATER_HPP_AH49FXB1 */