From d54ab5f6eb128e46b2732dee961eb6ee0758519e Mon Sep 17 00:00:00 2001 From: Tal Zaitsev <16272783+tzai@users.noreply.github.com> Date: Wed, 27 Nov 2019 18:30:09 -0500 Subject: [PATCH] Change RC override to affect offboard mode as well -Defines COM_RC_OVERRIDE as a bitmask -Changes RC override to affect auto modes, offboard mode, or both --- src/modules/commander/Commander.cpp | 19 ++++++++++++------- src/modules/commander/Commander.hpp | 8 +++++++- src/modules/commander/commander_params.c | 11 ++++++++--- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/modules/commander/Commander.cpp b/src/modules/commander/Commander.cpp index 32eafff763..e0f2d28b84 100644 --- a/src/modules/commander/Commander.cpp +++ b/src/modules/commander/Commander.cpp @@ -1743,15 +1743,20 @@ Commander::run() // but only if not in a low battery handling action const bool low_battery_reaction = _battery_warning >= battery_status_s::BATTERY_WARNING_CRITICAL; const bool is_rotary_wing = status.vehicle_type == vehicle_status_s::VEHICLE_TYPE_ROTARY_WING; - const bool in_auto_mode = - _internal_state.main_state == commander_state_s::MAIN_STATE_AUTO_LAND || - _internal_state.main_state == commander_state_s::MAIN_STATE_AUTO_RTL || - _internal_state.main_state == commander_state_s::MAIN_STATE_AUTO_MISSION || - _internal_state.main_state == commander_state_s::MAIN_STATE_AUTO_LOITER; - if (_param_rc_override.get() && is_rotary_wing && !low_battery_reaction - && !_geofence_warning_action_on && in_auto_mode) { + const bool override_auto_mode = + (_param_rc_override.get() & OVERRIDE_AUTO_MODE_BIT) && + (_internal_state.main_state == commander_state_s::MAIN_STATE_AUTO_LAND || + _internal_state.main_state == commander_state_s::MAIN_STATE_AUTO_RTL || + _internal_state.main_state == commander_state_s::MAIN_STATE_AUTO_MISSION || + _internal_state.main_state == commander_state_s::MAIN_STATE_AUTO_LOITER); + const bool override_offboard_mode = + (_param_rc_override.get() & OVERRIDE_OFFBOARD_MODE_BIT) && + _internal_state.main_state == commander_state_s::MAIN_STATE_OFFBOARD; + + if ((override_auto_mode || override_offboard_mode) && is_rotary_wing + && !low_battery_reaction && !_geofence_warning_action_on) { // transition to previous state if sticks are touched if ((_last_sp_man.timestamp != _sp_man.timestamp) && ((fabsf(_sp_man.x - _last_sp_man.x) > _min_stick_change) || diff --git a/src/modules/commander/Commander.hpp b/src/modules/commander/Commander.hpp index 9f9f9a8478..675c8325c9 100644 --- a/src/modules/commander/Commander.hpp +++ b/src/modules/commander/Commander.hpp @@ -223,7 +223,7 @@ private: (ParamInt) _param_flight_uuid, (ParamInt) _param_takeoff_finished_action, - (ParamBool) _param_rc_override, + (ParamInt) _param_rc_override, (ParamInt) _param_rc_in_off, (ParamInt) _param_rc_arm_hyst, (ParamFloat) _param_min_stick_change, @@ -258,6 +258,12 @@ private: ALWAYS = 2 }; + enum OverrideMode { + OVERRIDE_DISABLED = 0, + OVERRIDE_AUTO_MODE_BIT = (1 << 0), + OVERRIDE_OFFBOARD_MODE_BIT = (1 << 1) + }; + /* Decouple update interval and hysteresis counters, all depends on intervals */ static constexpr uint64_t COMMANDER_MONITORING_INTERVAL{10_ms}; static constexpr float COMMANDER_MONITORING_LOOPSPERMSEC{1 / (COMMANDER_MONITORING_INTERVAL / 1000.0f)}; diff --git a/src/modules/commander/commander_params.c b/src/modules/commander/commander_params.c index 45827e73d8..e4716549e4 100644 --- a/src/modules/commander/commander_params.c +++ b/src/modules/commander/commander_params.c @@ -631,13 +631,18 @@ PARAM_DEFINE_INT32(COM_ARM_MAG_STR, 1); /** * Enable RC stick override of auto modes + * Enable RC stick override of auto or offboard modes * - * When an auto mode is active (except a critical battery reaction) moving the RC sticks - * gives control back to the pilot in manual position mode immediately. + * Moving the RC sticks gives control back to the pilot in manual position mode immediately when: + * 0: an auto mode is active (except a critical battery reaction) + * 1: offboard mode is active * * Only has an effect on multicopters and VTOLS in multicopter mode. * - * @boolean + * @min 0 + * @max 3 + * @bit 0 Enable override of auto modes + * @bit 1 Enable override of offboard mode * @group Commander */ PARAM_DEFINE_INT32(COM_RC_OVERRIDE, 1);