diff --git a/src/modules/px4iofirmware/mixer.cpp b/src/modules/px4iofirmware/mixer.cpp index 514f73bad5..0d619db91b 100644 --- a/src/modules/px4iofirmware/mixer.cpp +++ b/src/modules/px4iofirmware/mixer.cpp @@ -143,7 +143,16 @@ mixer_tick(void) if ((r_status_flags & PX4IO_P_STATUS_FLAGS_RAW_PWM) && (r_status_flags & PX4IO_P_STATUS_FLAGS_FMU_OK)) { - source = MIX_NONE; + if ((r_status_flags & PX4IO_P_STATUS_FLAGS_OVERRIDE) > 0) { + /* a channel based override has been + * triggered, with FMU active */ + source = MIX_OVERRIDE_FMU_OK; + + } else { + /* don't actually mix anything - copy values from r_page_direct_pwm */ + source = MIX_NONE; + memcpy(r_page_servos, r_page_direct_pwm, sizeof(uint16_t)*PX4IO_SERVO_COUNT); + } } else { diff --git a/src/modules/px4iofirmware/px4io.h b/src/modules/px4iofirmware/px4io.h index 0894c9a173..edec29ed02 100644 --- a/src/modules/px4iofirmware/px4io.h +++ b/src/modules/px4iofirmware/px4io.h @@ -80,6 +80,7 @@ extern volatile uint16_t r_page_status[]; /* PX4IO_PAGE_STATUS */ extern uint16_t r_page_actuators[]; /* PX4IO_PAGE_ACTUATORS */ extern uint16_t r_page_servos[]; /* PX4IO_PAGE_SERVOS */ +extern uint16_t r_page_direct_pwm[]; /* PX4IO_PAGE_DIRECT_PWM */ extern uint16_t r_page_raw_rc_input[]; /* PX4IO_PAGE_RAW_RC_INPUT */ extern uint16_t r_page_rc_input[]; /* PX4IO_PAGE_RC_INPUT */ extern uint16_t r_page_adc[]; /* PX4IO_PAGE_RAW_ADC_INPUT */ diff --git a/src/modules/px4iofirmware/registers.c b/src/modules/px4iofirmware/registers.c index 7be03efec3..fd0b484f5b 100644 --- a/src/modules/px4iofirmware/registers.c +++ b/src/modules/px4iofirmware/registers.c @@ -143,6 +143,13 @@ uint16_t r_page_rc_input[] = { */ uint16_t r_page_scratch[32]; +/** + * PAGE 8 + * + * RAW PWM values + */ +uint16_t r_page_direct_pwm[PX4IO_SERVO_COUNT]; + /** * PAGE 100 * @@ -307,7 +314,7 @@ registers_set(uint8_t page, uint8_t offset, const uint16_t *values, unsigned num /* XXX range-check value? */ if (*values != PWM_IGNORE_THIS_CHANNEL) { - r_page_servos[offset] = *values; + r_page_direct_pwm[offset] = *values; } offset++; @@ -1011,7 +1018,7 @@ registers_get(uint8_t page, uint8_t offset, uint16_t **values, unsigned *num_val break; case PX4IO_PAGE_DIRECT_PWM: - SELECT_PAGE(r_page_servos); + SELECT_PAGE(r_page_direct_pwm); break; case PX4IO_PAGE_FAILSAFE_PWM: