Browse Source

IO mixer - Change default mixer to DISARMED and allow to set outputs to failsafe if FMU does not respond and if flight termination circuit breaker is not set

sbg
bresch 7 years ago committed by Beat Küng
parent
commit
d655c33faa
  1. 25
      src/modules/px4iofirmware/mixer.cpp

25
src/modules/px4iofirmware/mixer.cpp

@ -84,6 +84,7 @@ extern int _sbus_fd; @@ -84,6 +84,7 @@ extern int _sbus_fd;
/* selected control values and count for mixing */
enum mixer_source {
MIX_NONE,
MIX_DISARMED,
MIX_FMU,
MIX_OVERRIDE,
MIX_FAILSAFE,
@ -146,8 +147,8 @@ mixer_tick(void) @@ -146,8 +147,8 @@ mixer_tick(void)
}
}
/* default to failsafe mixing - it will be forced below if flag is set */
source = MIX_FAILSAFE;
/* default to disarmed mixing */
source = MIX_DISARMED;
/*
* Decide which set of controls we're using.
@ -206,8 +207,6 @@ mixer_tick(void) @@ -206,8 +207,6 @@ mixer_tick(void)
((r_setup_arming & PX4IO_P_SETUP_ARMING_FMU_ARMED) /* and FMU is armed */
&& (r_status_flags & PX4IO_P_STATUS_FLAGS_MIXER_OK)) /* and there is valid input via or mixer */
|| (r_status_flags & PX4IO_P_STATUS_FLAGS_RAW_PWM) /* or direct PWM is set */
|| ((r_setup_arming & PX4IO_P_SETUP_ARMING_FAILSAFE_CUSTOM) /* or failsafe was set manually */
&& !(r_status_flags & PX4IO_P_STATUS_FLAGS_FMU_OK)) /* and FMU is not active */
)
);
@ -228,10 +227,10 @@ mixer_tick(void) @@ -228,10 +227,10 @@ mixer_tick(void)
* set the force failsafe flag once entering the first
* failsafe condition.
*/
if ( /* if we have requested flight termination style failsafe (noreturn) */
(r_setup_arming & PX4IO_P_SETUP_ARMING_TERMINATION_FAILSAFE) &&
/* and we ended up in a failsafe condition */
(source == MIX_FAILSAFE) &&
if ( /* Flight termination is allowed */
REG_TO_BOOL(r_setup_flightterm) &&
/* If we ended up not changing the default mixer */
(source == MIX_DISARMED) &&
/* and we should be armed, so we intended to provide outputs */
should_arm &&
/* and FMU is initialized */
@ -283,6 +282,15 @@ mixer_tick(void) @@ -283,6 +282,15 @@ mixer_tick(void)
r_page_actuators[i] = FLOAT_TO_REG((r_page_servos[i] - 1500) / 600.0f);
}
} else if (source == MIX_DISARMED) {
/* copy disarmed values to the servo outputs */
for (unsigned i = 0; i < PX4IO_SERVO_COUNT; i++) {
r_page_servos[i] = r_page_servo_disarmed[i];
/* safe actuators for FMU feedback */
r_page_actuators[i] = FLOAT_TO_REG((r_page_servos[i] - 1500) / 600.0f);
}
} else if (source != MIX_NONE && (r_status_flags & PX4IO_P_STATUS_FLAGS_MIXER_OK)
&& !(r_setup_arming & PX4IO_P_SETUP_ARMING_LOCKDOWN)) {
@ -437,6 +445,7 @@ mixer_callback(uintptr_t handle, @@ -437,6 +445,7 @@ mixer_callback(uintptr_t handle,
return -1;
case MIX_DISARMED:
case MIX_FAILSAFE:
case MIX_NONE:
control = 0.0f;

Loading…
Cancel
Save