forked from Archive/PX4-Autopilot
Merge branch 'master' of github.com:PX4/Firmware into control_groups
This commit is contained in:
commit
f617689094
|
@ -60,7 +60,7 @@
|
||||||
/**
|
/**
|
||||||
* Maximum number of R/C input channels in the system. S.Bus has up to 18 channels.
|
* Maximum number of R/C input channels in the system. S.Bus has up to 18 channels.
|
||||||
*/
|
*/
|
||||||
#define RC_INPUT_MAX_CHANNELS 18
|
#define RC_INPUT_MAX_CHANNELS 20
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Input signal type, value is a control position from zero to 100
|
* Input signal type, value is a control position from zero to 100
|
||||||
|
|
|
@ -338,7 +338,12 @@ static void hrt_call_invoke(void);
|
||||||
# define PPM_MIN_START 2500 /* shortest valid start gap */
|
# define PPM_MIN_START 2500 /* shortest valid start gap */
|
||||||
|
|
||||||
/* decoded PPM buffer */
|
/* decoded PPM buffer */
|
||||||
#define PPM_MAX_CHANNELS 12
|
#define PPM_MIN_CHANNELS 5
|
||||||
|
#define PPM_MAX_CHANNELS 20
|
||||||
|
|
||||||
|
/* Number of same-sized frames required to 'lock' */
|
||||||
|
#define PPM_CHANNEL_LOCK 2 /* should be less than the input timeout */
|
||||||
|
|
||||||
__EXPORT uint16_t ppm_buffer[PPM_MAX_CHANNELS];
|
__EXPORT uint16_t ppm_buffer[PPM_MAX_CHANNELS];
|
||||||
__EXPORT unsigned ppm_decoded_channels = 0;
|
__EXPORT unsigned ppm_decoded_channels = 0;
|
||||||
__EXPORT uint64_t ppm_last_valid_decode = 0;
|
__EXPORT uint64_t ppm_last_valid_decode = 0;
|
||||||
|
@ -440,7 +445,7 @@ hrt_ppm_decode(uint32_t status)
|
||||||
if (status & SR_OVF_PPM)
|
if (status & SR_OVF_PPM)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* how long since the last edge? */
|
/* how long since the last edge? - this handles counter wrapping implicitely. */
|
||||||
width = count - ppm.last_edge;
|
width = count - ppm.last_edge;
|
||||||
ppm.last_edge = count;
|
ppm.last_edge = count;
|
||||||
|
|
||||||
|
@ -455,14 +460,38 @@ hrt_ppm_decode(uint32_t status)
|
||||||
*/
|
*/
|
||||||
if (width >= PPM_MIN_START) {
|
if (width >= PPM_MIN_START) {
|
||||||
|
|
||||||
/* export the last set of samples if we got something sensible */
|
/*
|
||||||
if (ppm.next_channel > 4) {
|
* If the number of channels changes unexpectedly, we don't want
|
||||||
for (i = 0; i < ppm.next_channel && i < PPM_MAX_CHANNELS; i++)
|
* to just immediately jump on the new count as it may be a result
|
||||||
ppm_buffer[i] = ppm_temp_buffer[i];
|
* of noise or dropped edges. Instead, take a few frames to settle.
|
||||||
|
*/
|
||||||
|
if (ppm.next_channel != ppm_decoded_channels) {
|
||||||
|
static unsigned new_channel_count;
|
||||||
|
static unsigned new_channel_holdoff;
|
||||||
|
|
||||||
ppm_decoded_channels = i;
|
if (new_channel_count != ppm.next_channel) {
|
||||||
ppm_last_valid_decode = hrt_absolute_time();
|
/* start the lock counter for the new channel count */
|
||||||
|
new_channel_count = ppm.next_channel;
|
||||||
|
new_channel_holdoff = PPM_CHANNEL_LOCK;
|
||||||
|
|
||||||
|
} else if (new_channel_holdoff > 0) {
|
||||||
|
/* this frame matched the last one, decrement the lock counter */
|
||||||
|
new_channel_holdoff--;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* we have seen PPM_CHANNEL_LOCK frames with the new count, accept it */
|
||||||
|
ppm_decoded_channels = new_channel_count;
|
||||||
|
new_channel_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* frame channel count matches expected, let's use it */
|
||||||
|
if (ppm.next_channel > PPM_MIN_CHANNELS) {
|
||||||
|
for (i = 0; i < ppm.next_channel; i++)
|
||||||
|
ppm_buffer[i] = ppm_temp_buffer[i];
|
||||||
|
|
||||||
|
ppm_last_valid_decode = hrt_absolute_time();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* reset for the next frame */
|
/* reset for the next frame */
|
||||||
|
|
Loading…
Reference in New Issue