Andrew Tridgell
6 years ago
15 changed files with 153 additions and 111 deletions
@ -0,0 +1,113 @@
@@ -0,0 +1,113 @@
|
||||
/*
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
/*
|
||||
reverse thrust support functions |
||||
*/ |
||||
#include "Plane.h" |
||||
|
||||
/*
|
||||
see if reverse thrust should be allowed in the current flight state |
||||
*/ |
||||
bool Plane::allow_reverse_thrust(void) const |
||||
{ |
||||
// check if we should allow reverse thrust
|
||||
bool allow = false; |
||||
|
||||
if (g.use_reverse_thrust == USE_REVERSE_THRUST_NEVER || !have_reverse_thrust()) { |
||||
return false; |
||||
} |
||||
|
||||
switch (control_mode) { |
||||
case AUTO: |
||||
{ |
||||
uint16_t nav_cmd = mission.get_current_nav_cmd().id; |
||||
|
||||
// never allow reverse thrust during takeoff
|
||||
if (nav_cmd == MAV_CMD_NAV_TAKEOFF) { |
||||
return false; |
||||
} |
||||
|
||||
// always allow regardless of mission item
|
||||
allow |= (g.use_reverse_thrust & USE_REVERSE_THRUST_AUTO_ALWAYS); |
||||
|
||||
// landing
|
||||
allow |= (g.use_reverse_thrust & USE_REVERSE_THRUST_AUTO_LAND_APPROACH) && |
||||
(nav_cmd == MAV_CMD_NAV_LAND); |
||||
|
||||
// LOITER_TO_ALT
|
||||
allow |= (g.use_reverse_thrust & USE_REVERSE_THRUST_AUTO_LOITER_TO_ALT) && |
||||
(nav_cmd == MAV_CMD_NAV_LOITER_TO_ALT); |
||||
|
||||
// any Loiter (including LOITER_TO_ALT)
|
||||
allow |= (g.use_reverse_thrust & USE_REVERSE_THRUST_AUTO_LOITER_ALL) && |
||||
(nav_cmd == MAV_CMD_NAV_LOITER_TIME || |
||||
nav_cmd == MAV_CMD_NAV_LOITER_TO_ALT || |
||||
nav_cmd == MAV_CMD_NAV_LOITER_TURNS || |
||||
nav_cmd == MAV_CMD_NAV_LOITER_UNLIM); |
||||
|
||||
// waypoints
|
||||
allow |= (g.use_reverse_thrust & USE_REVERSE_THRUST_AUTO_WAYPOINT) && |
||||
(nav_cmd == MAV_CMD_NAV_WAYPOINT || |
||||
nav_cmd == MAV_CMD_NAV_SPLINE_WAYPOINT); |
||||
} |
||||
break; |
||||
|
||||
case LOITER: |
||||
allow |= (g.use_reverse_thrust & USE_REVERSE_THRUST_LOITER); |
||||
break; |
||||
case RTL: |
||||
allow |= (g.use_reverse_thrust & USE_REVERSE_THRUST_RTL); |
||||
break; |
||||
case CIRCLE: |
||||
allow |= (g.use_reverse_thrust & USE_REVERSE_THRUST_CIRCLE); |
||||
break; |
||||
case CRUISE: |
||||
allow |= (g.use_reverse_thrust & USE_REVERSE_THRUST_CRUISE); |
||||
break; |
||||
case FLY_BY_WIRE_B: |
||||
allow |= (g.use_reverse_thrust & USE_REVERSE_THRUST_FBWB); |
||||
break; |
||||
case AVOID_ADSB: |
||||
case GUIDED: |
||||
allow |= (g.use_reverse_thrust & USE_REVERSE_THRUST_GUIDED); |
||||
break; |
||||
default: |
||||
// all other control_modes are auto_throttle_mode=false.
|
||||
// If we are not controlling throttle, don't limit it.
|
||||
allow = true; |
||||
break; |
||||
} |
||||
|
||||
return allow; |
||||
} |
||||
|
||||
/*
|
||||
return true if we are configured to support reverse thrust |
||||
*/ |
||||
bool Plane::have_reverse_thrust(void) const |
||||
{ |
||||
return aparm.throttle_min < 0; |
||||
} |
||||
|
||||
/*
|
||||
return control in from the radio throttle channel. |
||||
*/ |
||||
int16_t Plane::get_throttle_input(bool no_deadzone) const |
||||
{ |
||||
if (no_deadzone) { |
||||
return channel_throttle->get_control_in_zero_dz(); |
||||
} |
||||
return channel_throttle->get_control_in(); |
||||
} |
Loading…
Reference in new issue