From 156317e5462ab14aa087f326594b82277ddd1fbb Mon Sep 17 00:00:00 2001
From: Claudio Micheli <claudio@auterion.com>
Date: Mon, 25 Feb 2019 17:45:53 +0100
Subject: [PATCH] Fixes for ONBOARD Controller lost & regain.

---
 src/modules/commander/Commander.cpp | 27 +++++++++++++--------------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/src/modules/commander/Commander.cpp b/src/modules/commander/Commander.cpp
index f0e9e3a872..36e8f2b829 100644
--- a/src/modules/commander/Commander.cpp
+++ b/src/modules/commander/Commander.cpp
@@ -3906,11 +3906,13 @@ void Commander::data_link_check(bool &status_changed)
 				case (telemetry_status_s::MAV_TYPE_ONBOARD_CONTROLLER):
 					_datalink_last_heartbeat_onboard_controller = telemetry.heartbeat_time;
 
-					if (_onboard_controller_lost != false) {
-						mavlink_log_info(&mavlink_log_pub, "ONBOARD CONTROLLER REGAINED");
-					}
+					if (_onboard_controller_lost) {
+						if (hrt_elapsed_time(&_datalink_last_heartbeat_onboard_controller) < (5_s)) {
+							mavlink_log_info(&mavlink_log_pub, "ONBOARD CONTROLLER REGAINED");
+							_onboard_controller_lost = false;
+						}
 
-					_onboard_controller_lost = false;
+					}
 
 					if (telemetry.remote_component_id == telemetry_status_s::COMPONENT_ID_OBSTACLE_AVOIDANCE) {
 						if (telemetry.heartbeat_time != _datalink_last_heartbeat_avoidance_system) {
@@ -3948,17 +3950,15 @@ void Commander::data_link_check(bool &status_changed)
 	}
 
 	// ONBOARD CONTROLLER data link loss failsafe (hard coded 5 seconds)
-	//  only issue a periodic warning for now
 	if ((_datalink_last_heartbeat_onboard_controller > 0)
-	    && (hrt_elapsed_time(&_datalink_last_heartbeat_onboard_controller) > 5_s) &&
-	    (hrt_elapsed_time(&_onboard_controller_lost) > 5_s)) {
+	    && (hrt_elapsed_time(&_datalink_last_heartbeat_onboard_controller) > 5_s) && !_onboard_controller_lost) {
 
-		_onboard_controller_lost = hrt_absolute_time();
 		mavlink_log_critical(&mavlink_log_pub, "ONBOARD CONTROLLER LOST");
+		_onboard_controller_lost = true;
 	}
 
 	// AVOIDANCE SYSTEM state check (only if it is enabled)
-	if (_obs_avoid.get()) {
+	if (_obs_avoid.get() && !_onboard_controller_lost) {
 
 		//if avoidance never started
 		if (_datalink_last_heartbeat_avoidance_system == 0 && hrt_elapsed_time(&_avoidance_system_not_started) > 5_s) {
@@ -3967,10 +3967,9 @@ void Commander::data_link_check(bool &status_changed)
 		}
 
 		//if heartbeats stop
-		if ((_datalink_last_heartbeat_avoidance_system > 0)
-		    && (hrt_elapsed_time(&_datalink_last_heartbeat_avoidance_system) > 5_s) &&
-		    (hrt_elapsed_time(&_avoidance_system_lost) > 5_s)) {
-			_avoidance_system_lost = hrt_absolute_time();
+		if (!_avoidance_system_lost && (_datalink_last_heartbeat_avoidance_system > 0)
+		    && (hrt_elapsed_time(&_datalink_last_heartbeat_avoidance_system) > 5_s)) {
+			_avoidance_system_lost = true;
 			mavlink_log_critical(&mavlink_log_pub, "AVOIDANCE SYSTEM LOST");
 		}
 
@@ -3985,7 +3984,7 @@ void Commander::data_link_check(bool &status_changed)
 			}
 
 			if (_datalink_last_status_avoidance_system == telemetry_status_s::MAV_STATE_CRITICAL) {
-				mavlink_log_critical(&mavlink_log_pub, "AVOIDANCE SYSTEM TIMEOUT");
+				mavlink_log_info(&mavlink_log_pub, "AVOIDANCE SYSTEM TIMEOUT");
 			}
 
 			if (_datalink_last_status_avoidance_system == telemetry_status_s::MAV_STATE_FLIGHT_TERMINATION) {
-- 
GitLab