From 307dc3e32d6b5f49729f5e88d8dc5bf6f03e352c Mon Sep 17 00:00:00 2001 From: Julian Oes Date: Wed, 9 Oct 2019 11:02:01 +0200 Subject: [PATCH] mavlink: fix boot complete without lockstep Without lockstep the actual monotonic clock of the host computer is used. Therefore, this time is likely much more than 20 seconds and the check if the boot complete happened in time will fail immediately. Therefore, it probably makes more sense to count the time from the first mavlink creation. --- src/modules/mavlink/mavlink_main.cpp | 6 ++++++ src/modules/mavlink/mavlink_main.h | 4 ++++ src/modules/mavlink/mavlink_receiver.cpp | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/modules/mavlink/mavlink_main.cpp b/src/modules/mavlink/mavlink_main.cpp index a58ad4d2ed..c11f89936f 100644 --- a/src/modules/mavlink/mavlink_main.cpp +++ b/src/modules/mavlink/mavlink_main.cpp @@ -159,6 +159,8 @@ mavlink_message_t *mavlink_get_channel_buffer(uint8_t channel) static void usage(); +hrt_abstime Mavlink::_first_start_time = {0}; + bool Mavlink::_boot_complete = false; Mavlink::Mavlink() : @@ -179,6 +181,10 @@ Mavlink::Mavlink() : if (comp_id > 0 && comp_id < 255) { mavlink_system.compid = comp_id; } + + if (_first_start_time == 0) { + _first_start_time = hrt_absolute_time(); + } } Mavlink::~Mavlink() diff --git a/src/modules/mavlink/mavlink_main.h b/src/modules/mavlink/mavlink_main.h index a73ec6649e..1b871073be 100644 --- a/src/modules/mavlink/mavlink_main.h +++ b/src/modules/mavlink/mavlink_main.h @@ -532,6 +532,8 @@ public: */ struct ping_statistics_s &get_ping_statistics() { return _ping_stats; } + static hrt_abstime &get_first_start_time() { return _first_start_time; } + protected: Mavlink *next{nullptr}; @@ -688,6 +690,8 @@ private: static constexpr unsigned RADIO_BUFFER_LOW_PERCENTAGE = 35; static constexpr unsigned RADIO_BUFFER_HALF_PERCENTAGE = 50; + static hrt_abstime _first_start_time; + /** * Configure a single stream. * @param stream_name diff --git a/src/modules/mavlink/mavlink_receiver.cpp b/src/modules/mavlink/mavlink_receiver.cpp index 4f81217c1e..2c79c775cd 100644 --- a/src/modules/mavlink/mavlink_receiver.cpp +++ b/src/modules/mavlink/mavlink_receiver.cpp @@ -2529,7 +2529,7 @@ MavlinkReceiver::Run() // make sure mavlink app has booted before we start processing anything (parameter sync, etc) while (!_mavlink->boot_complete()) { - if (hrt_absolute_time() > 20_s) { + if (hrt_elapsed_time(&_mavlink->get_first_start_time()) > 20_s) { PX4_ERR("system boot did not complete in 20 seconds"); _mavlink->set_boot_complete(); }