AP_ICEngine: added option for throttle control while disarmed

this uses the passed in base throttle when disarmed
This commit is contained in:
Andrew Tridgell 2022-07-10 16:10:41 +10:00 committed by Randy Mackay
parent a889d1d0e5
commit 431fbacb2c
2 changed files with 18 additions and 5 deletions

View File

@ -132,7 +132,7 @@ const AP_Param::GroupInfo AP_ICEngine::var_info[] = {
// @Param: OPTIONS // @Param: OPTIONS
// @DisplayName: ICE options // @DisplayName: ICE options
// @Description: Options for ICE control // @Description: Options for ICE control
// @Bitmask: 0:DisableIgnitionRCFailsafe // @Bitmask: 0:DisableIgnitionRCFailsafe,2:ThrottleWhileDisarmed
AP_GROUPINFO("OPTIONS", 15, AP_ICEngine, options, 0), AP_GROUPINFO("OPTIONS", 15, AP_ICEngine, options, 0),
// @Param: STARTCHN_MIN // @Param: STARTCHN_MIN
@ -282,7 +282,7 @@ void AP_ICEngine::update(void)
// reset initial height while disarmed // reset initial height while disarmed
initial_height = -pos.z; initial_height = -pos.z;
} }
} else if (idle_percent <= 0) { // check if we should idle } else if (idle_percent <= 0 && !option_set(Options::THROTTLE_WHILE_DISARMED)) {
// force ignition off when disarmed // force ignition off when disarmed
state = ICE_OFF; state = ICE_OFF;
} }
@ -323,8 +323,11 @@ void AP_ICEngine::update(void)
/* /*
check for throttle override. This allows the ICE controller to force check for throttle override. This allows the ICE controller to force
the correct starting throttle when starting the engine and maintain idle when disarmed the correct starting throttle when starting the engine and maintain idle when disarmed
base_throttle is the throttle before the disarmed override
check. This allows for throttle control while disarmed
*/ */
bool AP_ICEngine::throttle_override(uint8_t &percentage) bool AP_ICEngine::throttle_override(float &percentage, const float base_throttle)
{ {
if (!enable) { if (!enable) {
return false; return false;
@ -335,7 +338,10 @@ bool AP_ICEngine::throttle_override(uint8_t &percentage)
idle_percent < 100 && idle_percent < 100 &&
(int16_t)idle_percent > SRV_Channels::get_output_scaled(SRV_Channel::k_throttle)) (int16_t)idle_percent > SRV_Channels::get_output_scaled(SRV_Channel::k_throttle))
{ {
percentage = (uint8_t)idle_percent; percentage = idle_percent;
if (option_set(Options::THROTTLE_WHILE_DISARMED)) {
percentage = MAX(percentage, base_throttle);
}
return true; return true;
} }
@ -347,6 +353,12 @@ bool AP_ICEngine::throttle_override(uint8_t &percentage)
return true; return true;
} }
// if THROTTLE_WHILE_DISARMED is set then we use the base_throttle, allowing the pilot to control throttle while disarmed
if (option_set(Options::THROTTLE_WHILE_DISARMED) && base_throttle > percentage) {
percentage = base_throttle;
return true;
}
return false; return false;
} }

View File

@ -32,7 +32,7 @@ public:
void update(void); void update(void);
// check for throttle override // check for throttle override
bool throttle_override(uint8_t &percent); bool throttle_override(float &percent, const float base_throttle);
enum ICE_State { enum ICE_State {
ICE_OFF=0, ICE_OFF=0,
@ -122,6 +122,7 @@ private:
enum class Options : uint16_t { enum class Options : uint16_t {
DISABLE_IGNITION_RC_FAILSAFE=(1U<<0), DISABLE_IGNITION_RC_FAILSAFE=(1U<<0),
THROTTLE_WHILE_DISARMED = (1U << 2),
}; };
AP_Int16 options; AP_Int16 options;