Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed connection loss / failsafe detection, added decoding of two switches #122

Merged
merged 2 commits into from
Jan 6, 2013
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 16 additions & 10 deletions apps/px4io/sbus.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
#include "debug.h"

#define SBUS_FRAME_SIZE 25
#define SBUS_INPUT_CHANNELS 16
#define SBUS_INPUT_CHANNELS 18

static int sbus_fd = -1;

Expand Down Expand Up @@ -87,10 +87,9 @@ sbus_init(const char *device)
partial_frame_count = 0;
last_rx_time = hrt_absolute_time();

debug("Sbus: ready");

debug("S.Bus: ready");
} else {
debug("Sbus: open failed");
debug("S.Bus: open failed");
}

return sbus_fd;
Expand Down Expand Up @@ -208,9 +207,13 @@ sbus_decode(hrt_abstime frame_time)
return;
}

/* if the failsafe bit is set, we consider the frame invalid */
if (frame[23] & (1 << 4)) {
return;
/* if the failsafe or connection lost bit is set, we consider the frame invalid */
if ((frame[23] & (1 << 2)) && /* signal lost */
(frame[23] & (1 << 3))) { /* failsafe */

/* actively announce signal loss */
system_state.rc_channels = 0;
return 1;
}

/* we have received something we think is a frame */
Expand Down Expand Up @@ -240,9 +243,12 @@ sbus_decode(hrt_abstime frame_time)
system_state.rc_channel_data[channel] = (value / 2) + 998;
}

if (PX4IO_INPUT_CHANNELS >= 18) {
chancount = 18;
/* XXX decode the two switch channels */
/* decode switch channels if data fields are wide enough */
if (chancount > 17) {
/* channel 17 (index 16) */
system_state.rc_channel_data[16] = (frame[23] & (1 << 0)) * 1000 + 998;
/* channel 18 (index 17) */
system_state.rc_channel_data[17] = (frame[23] & (1 << 1)) * 1000 + 998;
}

/* note the number of channels decoded */
Expand Down