APM: fixed stick mixing in CIRCLE mode on throttle failsafe

Many thanks to Andke for finding this bug!
This commit is contained in:
Andrew Tridgell 2012-09-23 09:33:17 +10:00
parent c28d4e9ad6
commit 1f827d848b

View File

@ -33,6 +33,29 @@ static float get_speed_scaler(void)
return speed_scaler;
}
/*
return true if the current settings and mode should allow for stick mixing
*/
static bool stick_mixing_enabled(void)
{
if (control_mode == CIRCLE && failsafe != FAILSAFE_NONE) {
// we are in short failsafe
return false;
}
if (control_mode < FLY_BY_WIRE_A) {
// pilot has control, always mix in pilot controls
return true;
}
if (g.stick_mixing &&
geofence_stickmixing() &&
failsafe == FAILSAFE_NONE) {
// we're in an auto mode, and haven't triggered failsafe
return true;
}
// we should not do stick mixing
return false;
}
static void stabilize()
{
@ -76,13 +99,9 @@ static void stabilize()
// Mix Stick input to allow users to override control surfaces
// -----------------------------------------------------------
if ((control_mode < FLY_BY_WIRE_A) ||
(g.stick_mixing &&
geofence_stickmixing() &&
control_mode > FLY_BY_WIRE_B &&
failsafe == FAILSAFE_NONE)) {
// TODO: use RC_Channel control_mix function?
if (stick_mixing_enabled()) {
if (control_mode > FLY_BY_WIRE_B) {
// do stick mixing in auto modes
ch1_inf = (float)g.channel_roll.radio_in - (float)g.channel_roll.radio_trim;
ch1_inf = fabs(ch1_inf);
ch1_inf = min(ch1_inf, 400.0);
@ -102,23 +121,18 @@ static void stabilize()
// -------------------
g.channel_roll.servo_out += g.channel_roll.pwm_to_angle();
g.channel_pitch.servo_out += g.channel_pitch.pwm_to_angle();
//Serial.printf_P(PSTR(" servo_out[CH_ROLL] "));
//Serial.println(servo_out[CH_ROLL],DEC);
}
if (control_mode >= FLY_BY_WIRE_A) {
// stick mixing performed for rudder for all cases including FBW unless disabled for higher modes
// important for steering on the ground during landing
// -----------------------------------------------
if (control_mode <= FLY_BY_WIRE_B ||
(g.stick_mixing &&
geofence_stickmixing() &&
failsafe == FAILSAFE_NONE)) {
ch4_inf = (float)g.channel_rudder.radio_in - (float)g.channel_rudder.radio_trim;
ch4_inf = fabs(ch4_inf);
ch4_inf = min(ch4_inf, 400.0);
ch4_inf = ((400.0 - ch4_inf) /400.0);
}
}
// Apply output to Rudder
// ----------------------