45 template <
typename DerivedLogger>
55 time_interface_(time_interface),
56 timer_provider_(timer_provider)
58 comm_->register_mavlink_listener(
this);
60 time_sync_timer_ = timer_provider_.create_timer(std::chrono::milliseconds(100), bound_callback);
63 template <
typename DerivedLogger>
66 std::chrono::nanoseconds now = time_interface_.now();
73 std::chrono::nanoseconds tc1_chrono(tsync.
tc1);
77 std::chrono::nanoseconds ts1_chrono(tsync.
ts1);
78 std::chrono::nanoseconds offset_ns((ts1_chrono + now - 2 * tc1_chrono) / 2);
81 if (!initialized_ || (offset_ns_ - offset_ns) > std::chrono::milliseconds(10)
82 || (offset_ns_ - offset_ns) < std::chrono::milliseconds(-10))
84 offset_ns_ = offset_ns;
85 logger_.info(
"Detected time offset of %0.3f s.", std::chrono::duration<double>(offset_ns).count());
86 logger_.debug(
"FCU time: %0.3f, System time: %0.3f", tsync.
tc1 * 1e-9, tsync.
ts1 * 1e-9);
91 offset_ns_ = std::chrono::duration_cast<std::chrono::nanoseconds>(offset_alpha_ * offset_ns
92 + (1.0 - offset_alpha_) * offset_ns_);
98 template <
typename DerivedLogger>
102 return time_interface_.now();
104 std::chrono::nanoseconds ns = fcu_time + offset_ns_;
105 if (ns < std::chrono::nanoseconds::zero())
107 logger_.error_throttle(1,
"negative time calculated from FCU: fcu_time=%ld, offset_ns=%ld. Using system time",
108 fcu_time, offset_ns_);
109 return time_interface_.now();
114 template <
typename DerivedLogger>
117 mavlink_message_t msg;
119 comm_->send_message(msg);
static void mavlink_msg_timesync_decode(const mavlink_message_t *msg, mavlink_timesync_t *timesync)
Decode a timesync message into a struct.
#define MAVLINK_MSG_ID_TIMESYNC
TimeManager(MavlinkComm *comm, LoggerInterface< DerivedLogger > &logger, const TimeInterface &time_interface, TimerProviderInterface &timer_provider)
Provide an interface for creating timers.
Interface for acquiring system time.
static uint16_t mavlink_msg_timesync_pack(uint8_t system_id, uint8_t component_id, mavlink_message_t *msg, int64_t tc1, int64_t ts1)
Pack a timesync message.