From 917edcab119478601a0580fb6047c246792d446c Mon Sep 17 00:00:00 2001 From: Robert Gayle Date: Wed, 1 May 2013 20:39:44 -0400 Subject: [PATCH] Copter: added FS_THR_ENABLED_ALWAYS_LAND (=3) option: don't attempt RTL, just land --- ArduCopter/Parameters.pde | 2 +- ArduCopter/config.h | 1 + ArduCopter/events.pde | 16 ++++++++++++++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ArduCopter/Parameters.pde b/ArduCopter/Parameters.pde index 61cbecc8bc..adab7947ac 100644 --- a/ArduCopter/Parameters.pde +++ b/ArduCopter/Parameters.pde @@ -283,7 +283,7 @@ const AP_Param::Info var_info[] PROGMEM = { // @Param: FS_THR_ENABLE // @DisplayName: Throttle Failsafe Enable // @Description: The throttle failsafe allows you to configure a software failsafe activated by a setting on the throttle input channel - // @Values: 0:Disabled,1:Enabled always RTL,2:Enabled Continue with Mission in Auto Mode + // @Values: 0:Disabled,1:Enabled always RTL,2:Enabled Continue with Mission in Auto Mode,3:Enabled always LAND // @User: Standard GSCALAR(failsafe_throttle, "FS_THR_ENABLE", FS_THR_DISABLED), diff --git a/ArduCopter/config.h b/ArduCopter/config.h index 99cfed5176..d2bb6cff50 100644 --- a/ArduCopter/config.h +++ b/ArduCopter/config.h @@ -502,6 +502,7 @@ #define FS_THR_DISABLED 0 #define FS_THR_ENABLED_ALWAYS_RTL 1 #define FS_THR_ENABLED_CONTINUE_MISSION 2 +#define FS_THR_ENABLED_ALWAYS_LAND 3 #ifndef FS_THR_VALUE_DEFAULT # define FS_THR_VALUE_DEFAULT 975 diff --git a/ArduCopter/events.pde b/ArduCopter/events.pde index 9714a00178..669462ce24 100644 --- a/ArduCopter/events.pde +++ b/ArduCopter/events.pde @@ -18,6 +18,9 @@ static void failsafe_radio_on_event() // if throttle is zero disarm motors if (g.rc_3.control_in == 0) { init_disarm_motors(); + }else if(g.failsafe_throttle == FS_THR_ENABLED_ALWAYS_LAND) { + // if failsafe_throttle is 3 (i.e. FS_THR_ENABLED_ALWAYS_LAND) land immediately + set_mode(LAND); }else if(ap.home_is_set == true && g_gps->status() == GPS::GPS_OK_FIX_3D && home_distance > wp_nav.get_waypoint_radius()) { set_mode(RTL); }else{ @@ -34,11 +37,17 @@ static void failsafe_radio_on_event() // We are very close to home so we will land set_mode(LAND); } + }else if(g.failsafe_throttle == FS_THR_ENABLED_ALWAYS_LAND) { + // if failsafe_throttle is 3 (i.e. FS_THR_ENABLED_ALWAYS_LAND) land immediately + set_mode(LAND); } // if failsafe_throttle is 2 (i.e. FS_THR_ENABLED_CONTINUE_MISSION) no need to do anything break; default: - if(ap.home_is_set == true && g_gps->status() == GPS::GPS_OK_FIX_3D && home_distance > wp_nav.get_waypoint_radius()) { + if(g.failsafe_throttle == FS_THR_ENABLED_ALWAYS_LAND) { + // if failsafe_throttle is 3 (i.e. FS_THR_ENABLED_ALWAYS_LAND) land immediately + set_mode(LAND); + }else if(ap.home_is_set == true && g_gps->status() == GPS::GPS_OK_FIX_3D && home_distance > wp_nav.get_waypoint_radius()) { set_mode(RTL); }else{ // We have no GPS or are very close to home so we will land @@ -77,7 +86,10 @@ static void low_battery_event(void) } break; case AUTO: - if(ap.home_is_set == true && g_gps->status() == GPS::GPS_OK_FIX_3D && home_distance > wp_nav.get_waypoint_radius()) { + if(g.failsafe_throttle == FS_THR_ENABLED_ALWAYS_LAND) { + // if failsafe_throttle is 3 (i.e. FS_THR_ENABLED_ALWAYS_LAND) land immediately + set_mode(LAND); + }else if(ap.home_is_set == true && g_gps->status() == GPS::GPS_OK_FIX_3D && home_distance > wp_nav.get_waypoint_radius()) { set_mode(RTL); }else{ // We have no GPS or are very close to home so we will land