From b5731e0ccd8e1883dcdafada20c8f76c8ae4171d Mon Sep 17 00:00:00 2001
From: Dennis Mannhart <dennis.mannhart@gmail.com>
Date: Mon, 25 Jun 2018 11:33:30 +0200
Subject: [PATCH] FlightTaskOffboard: only start task if control mode flags are
 met

---
 src/lib/FlightTasks/tasks/FlightTaskOffboard.cpp   |  3 ++-
 src/modules/mc_pos_control/mc_pos_control_main.cpp | 12 +++++++++---
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/src/lib/FlightTasks/tasks/FlightTaskOffboard.cpp b/src/lib/FlightTasks/tasks/FlightTaskOffboard.cpp
index a6a982d775..2952da8931 100644
--- a/src/lib/FlightTasks/tasks/FlightTaskOffboard.cpp
+++ b/src/lib/FlightTasks/tasks/FlightTaskOffboard.cpp
@@ -55,6 +55,8 @@ bool FlightTaskOffboard::initializeSubscriptions(SubscriptionArray &subscription
 bool FlightTaskOffboard::updateInitialize()
 {
 	bool ret = FlightTask::updateInitialize();
+	// require a valid triplet
+	ret = ret && _sub_triplet_setpoint->get().current.valid;
 	// require valid position / velocity in xy
 	return ret && PX4_ISFINITE(_position(0))
 	       && PX4_ISFINITE(_position(1))
@@ -245,5 +247,4 @@ bool FlightTaskOffboard::update()
 	}
 
 	return true;
-
 }
diff --git a/src/modules/mc_pos_control/mc_pos_control_main.cpp b/src/modules/mc_pos_control/mc_pos_control_main.cpp
index 4b3c081322..1b82ddb55e 100644
--- a/src/modules/mc_pos_control/mc_pos_control_main.cpp
+++ b/src/modules/mc_pos_control/mc_pos_control_main.cpp
@@ -519,7 +519,7 @@ MulticopterPositionControl::task_main()
 		setDt(dt);
 
 		if (_control_mode.flag_armed) {
-			// as soon vehicle is armed, start flighttask
+			// as soon vehicle is armed check for flighttask
 			start_flight_task();
 			// arm hysteresis prevents vehicle to takeoff
 			// before propeller reached idle speed.
@@ -646,7 +646,7 @@ MulticopterPositionControl::task_main()
 
 			// publish attitude setpoint
 			// Note: this requires review. The reason for not sending
-			// an attitude setpoint is because for none-flighttask modes
+			// an attitude setpoint is because for non-flighttask modes
 			// the attitude septoint should come from another source, otherwise
 			// they might conflict with each other such as in offboard attitude control.
 			publish_attitude();
@@ -678,7 +678,13 @@ MulticopterPositionControl::start_flight_task()
 	bool task_failure = false;
 
 	// offboard
-	if (_vehicle_status.nav_state == vehicle_status_s::NAVIGATION_STATE_OFFBOARD) {
+	if (_vehicle_status.nav_state == vehicle_status_s::NAVIGATION_STATE_OFFBOARD
+	    && (_control_mode.flag_control_altitude_enabled ||
+		_control_mode.flag_control_position_enabled ||
+		_control_mode.flag_control_climb_rate_enabled ||
+		_control_mode.flag_control_velocity_enabled ||
+		_control_mode.flag_control_acceleration_enabled)) {
+
 		int error = _flight_tasks.switchTask(FlightTaskIndex::Offboard);
 
 		if (error != 0) {
-- 
GitLab