Vanetza
 
Loading...
Searching...
No Matches
position_updater.cpp
1#include <vanetza/common/position_provider.hpp>
2#include <vanetza/common/runtime.hpp>
3#include <vanetza/geonet/position_updater.hpp>
4#include <vanetza/geonet/router.hpp>
5#include <vanetza/units/time.hpp>
6#include <chrono>
7
8namespace vanetza
9{
10namespace geonet
11{
12
14 m_runtime(rt), m_positioning(position), m_router(router)
15{
16 update_rate(m_router.get_mib().itsGnMinimumUpdateFrequencyEPV);
17}
18
19PositionUpdater::~PositionUpdater()
20{
21 m_runtime.cancel(this);
22}
23
24void PositionUpdater::schedule()
25{
26 if (m_interval > Clock::duration::zero()) {
27 m_runtime.schedule(m_interval, [this](Clock::time_point) {
28 m_router.update_position(m_positioning.position_fix());
29 schedule();
30 }, this);
31 }
32}
33
34void PositionUpdater::update_rate(Clock::duration interval)
35{
36 m_interval = interval;
37 m_runtime.cancel(this); /*< cancel previously scheduled callback */
38 schedule();
39}
40
41void PositionUpdater::update_rate(units::Frequency rate)
42{
43 if (rate > units::Frequency::from_value(0.0)) {
44 using namespace std::chrono;
45 const duration<double> interval { 1.0 / rate / units::si::second };
46 update_rate(duration_cast<Clock::duration>(interval));
47 } else {
48 update_rate(Clock::duration::zero());
49 }
50}
51
52} // namespace geonet
53} // namespace vanetza
virtual const PositionFix & position_fix()=0
virtual void cancel(const void *scope)=0
virtual void schedule(Clock::time_point tp, const Callback &cb, const void *scope=nullptr)=0
void update_rate(Clock::duration interval)
PositionUpdater(Runtime &runtime, PositionProvider &pos, Router &router)
const MIB & get_mib() const
Get Management Information Base (MIB)
Definition: router.hpp:210
void update_position(const PositionFix &)
Update router's local position vector.
Definition: router.cpp:167