px4iofirmware: guard against parsing multiple RC protocols

It was for example possible that DSM got parsed, and in the next iteration
SBUS got parsed, leading to multiple PX4IO_P_STATUS_FLAGS_RC_ flags set.
input_rc::input_source was then incorrectly set to DSM.

Partially guarding was already done: if SBUS got parsed, DSM and others
were skipped.

The IO will still clear all PX4IO_P_STATUS_FLAGS_RC_* flags on RC loss.
This commit is contained in:
Beat Küng
2021-02-19 14:20:31 +01:00
committed by Daniel Agar
parent 5c27c47746
commit 9d11d94e7e
+10 -2
View File
@@ -133,12 +133,14 @@ bool dsm_port_input(uint16_t *rssi, bool *dsm_updated, bool *st24_updated, bool
*st24_updated = false; *st24_updated = false;
if (!(r_status_flags & (PX4IO_P_STATUS_FLAGS_RC_DSM | PX4IO_P_STATUS_FLAGS_RC_SUMD))) {
for (unsigned i = 0; i < n_bytes; i++) { for (unsigned i = 0; i < n_bytes; i++) {
/* set updated flag if one complete packet was parsed */ /* set updated flag if one complete packet was parsed */
st24_rssi = RC_INPUT_RSSI_MAX; st24_rssi = RC_INPUT_RSSI_MAX;
*st24_updated |= (OK == st24_decode(bytes[i], &st24_rssi, &lost_count, *st24_updated |= (OK == st24_decode(bytes[i], &st24_rssi, &lost_count,
&st24_channel_count, r_raw_rc_values, PX4IO_RC_INPUT_CHANNELS)); &st24_channel_count, r_raw_rc_values, PX4IO_RC_INPUT_CHANNELS));
} }
}
if (*st24_updated && lost_count == 0) { if (*st24_updated && lost_count == 0) {
@@ -161,12 +163,14 @@ bool dsm_port_input(uint16_t *rssi, bool *dsm_updated, bool *st24_updated, bool
*sumd_updated = false; *sumd_updated = false;
if (!(r_status_flags & (PX4IO_P_STATUS_FLAGS_RC_DSM | PX4IO_P_STATUS_FLAGS_RC_ST24))) {
for (unsigned i = 0; i < n_bytes; i++) { for (unsigned i = 0; i < n_bytes; i++) {
/* set updated flag if one complete packet was parsed */ /* set updated flag if one complete packet was parsed */
sumd_rssi = RC_INPUT_RSSI_MAX; sumd_rssi = RC_INPUT_RSSI_MAX;
*sumd_updated |= (OK == sumd_decode(bytes[i], &sumd_rssi, &sumd_rx_count, *sumd_updated |= (OK == sumd_decode(bytes[i], &sumd_rssi, &sumd_rx_count,
&sumd_channel_count, r_raw_rc_values, PX4IO_RC_INPUT_CHANNELS, &sumd_failsafe_state)); &sumd_channel_count, r_raw_rc_values, PX4IO_RC_INPUT_CHANNELS, &sumd_failsafe_state));
} }
}
if (*sumd_updated) { if (*sumd_updated) {
@@ -263,8 +267,11 @@ controls_tick()
perf_begin(c_gather_sbus); perf_begin(c_gather_sbus);
#endif #endif
bool sbus_updated = false;
if (!(r_status_flags & (PX4IO_P_STATUS_FLAGS_RC_DSM | PX4IO_P_STATUS_FLAGS_RC_ST24 | PX4IO_P_STATUS_FLAGS_RC_SUMD))) {
bool sbus_failsafe, sbus_frame_drop; bool sbus_failsafe, sbus_frame_drop;
bool sbus_updated = sbus_input(_sbus_fd, r_raw_rc_values, &r_raw_rc_count, &sbus_failsafe, &sbus_frame_drop, sbus_updated = sbus_input(_sbus_fd, r_raw_rc_values, &r_raw_rc_count, &sbus_failsafe, &sbus_frame_drop,
PX4IO_RC_INPUT_CHANNELS); PX4IO_RC_INPUT_CHANNELS);
if (sbus_updated) { if (sbus_updated) {
@@ -293,6 +300,7 @@ controls_tick()
} }
} }
}
#if defined(PX4IO_PERF) #if defined(PX4IO_PERF)
perf_end(c_gather_sbus); perf_end(c_gather_sbus);
@@ -321,7 +329,7 @@ controls_tick()
bool dsm_updated = false, st24_updated = false, sumd_updated = false; bool dsm_updated = false, st24_updated = false, sumd_updated = false;
if (!((r_status_flags & PX4IO_P_STATUS_FLAGS_RC_SBUS) || (r_status_flags & PX4IO_P_STATUS_FLAGS_RC_PPM))) { if (!(r_status_flags & (PX4IO_P_STATUS_FLAGS_RC_SBUS | PX4IO_P_STATUS_FLAGS_RC_PPM))) {
#if defined(PX4IO_PERF) #if defined(PX4IO_PERF)
perf_begin(c_gather_dsm); perf_begin(c_gather_dsm);
#endif #endif