[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[paparazzi-commits] [5807] Improve ppm decoding on lpc21: a valid synchr
From: |
Gautier Hattenberger |
Subject: |
[paparazzi-commits] [5807] Improve ppm decoding on lpc21: a valid synchro is needed to validate a ppm frame |
Date: |
Mon, 06 Sep 2010 15:06:16 +0000 |
Revision: 5807
http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=5807
Author: gautier
Date: 2010-09-06 15:06:16 +0000 (Mon, 06 Sep 2010)
Log Message:
-----------
Improve ppm decoding on lpc21: a valid synchro is needed to validate a ppm frame
It also means that the number of channel between the radio and its config file
has to match exactly
In radio control: several valid frame are needed to go back to RC_OK
Modified Paths:
--------------
paparazzi3/trunk/sw/airborne/arm7/ppm_hw.h
paparazzi3/trunk/sw/airborne/main_fbw.c
paparazzi3/trunk/sw/airborne/radio_control.c
paparazzi3/trunk/sw/airborne/radio_control.h
Modified: paparazzi3/trunk/sw/airborne/arm7/ppm_hw.h
===================================================================
--- paparazzi3/trunk/sw/airborne/arm7/ppm_hw.h 2010-09-06 13:01:02 UTC (rev
5806)
+++ paparazzi3/trunk/sw/airborne/arm7/ppm_hw.h 2010-09-06 15:06:16 UTC (rev
5807)
@@ -33,6 +33,7 @@
#define PPM_IT PPM_CRI
#define PPM_ISR() { \
static uint8_t state = PPM_NB_CHANNEL; \
+ static uint8_t data_valid = FALSE; \
static uint32_t last; \
\
uint32_t now = PPM_CR; \
@@ -41,21 +42,30 @@
\
if (state == PPM_NB_CHANNEL) { \
if (length > SYS_TICS_OF_USEC(PPM_SYNC_MIN_LEN) && \
- length < SYS_TICS_OF_USEC(PPM_SYNC_MAX_LEN)) { \
- state = 0; \
+ length < SYS_TICS_OF_USEC(PPM_SYNC_MAX_LEN)) { \
+ if (data_valid) { \
+ ppm_valid = TRUE; \
+ data_valid = FALSE; \
+ } \
+ state = 0; \
} \
+ else { \
+ data_valid = FALSE; \
+ } \
} \
else { \
if (length > SYS_TICS_OF_USEC(PPM_DATA_MIN_LEN) && \
- length < SYS_TICS_OF_USEC(PPM_DATA_MAX_LEN)) { \
- ppm_pulses[state] = length; \
- state++; \
- if (state == PPM_NB_CHANNEL) { \
- ppm_valid = TRUE; \
- } \
+ length < SYS_TICS_OF_USEC(PPM_DATA_MAX_LEN)) { \
+ ppm_pulses[state] = length; \
+ state++; \
+ if (state == PPM_NB_CHANNEL) { \
+ data_valid = TRUE; \
+ } \
} \
- else \
- state = PPM_NB_CHANNEL; \
+ else { \
+ state = PPM_NB_CHANNEL; \
+ data_valid = FALSE; \
+ } \
} \
}
Modified: paparazzi3/trunk/sw/airborne/main_fbw.c
===================================================================
--- paparazzi3/trunk/sw/airborne/main_fbw.c 2010-09-06 13:01:02 UTC (rev
5806)
+++ paparazzi3/trunk/sw/airborne/main_fbw.c 2010-09-06 15:06:16 UTC (rev
5807)
@@ -140,11 +140,13 @@
if (ppm_valid) {
ppm_valid = FALSE;
radio_control_event_task();
- if (rc_values_contains_avg_channels) {
- fbw_mode = FBW_MODE_OF_PPRZ(rc_values[RADIO_MODE]);
+ if (rc_status == RC_OK) {
+ if (rc_values_contains_avg_channels) {
+ fbw_mode = FBW_MODE_OF_PPRZ(rc_values[RADIO_MODE]);
+ }
+ if (fbw_mode == FBW_MODE_MANUAL)
+ SetCommandsFromRC(commands, rc_values);
}
- if (fbw_mode == FBW_MODE_MANUAL)
- SetCommandsFromRC(commands, rc_values);
}
#endif
Modified: paparazzi3/trunk/sw/airborne/radio_control.c
===================================================================
--- paparazzi3/trunk/sw/airborne/radio_control.c 2010-09-06 13:01:02 UTC
(rev 5806)
+++ paparazzi3/trunk/sw/airborne/radio_control.c 2010-09-06 15:06:16 UTC
(rev 5807)
@@ -29,5 +29,5 @@
int32_t avg_rc_values[PPM_NB_PULSES];
uint8_t rc_values_contains_avg_channels = FALSE;
uint8_t time_since_last_ppm;
-uint8_t ppm_cpt, last_ppm_cpt;
+uint8_t ppm_cpt, last_ppm_cpt, radio_ok_cpt;
Modified: paparazzi3/trunk/sw/airborne/radio_control.h
===================================================================
--- paparazzi3/trunk/sw/airborne/radio_control.h 2010-09-06 13:01:02 UTC
(rev 5806)
+++ paparazzi3/trunk/sw/airborne/radio_control.h 2010-09-06 15:06:16 UTC
(rev 5807)
@@ -47,6 +47,8 @@
#define RC_AVG_PERIOD 8
#define RC_LOST_TIME 30 /* 500ms with a 60Hz timer */
#define RC_REALLY_LOST_TIME 60 /* ~1s */
+// Number of valid ppm frame to go back to RC OK
+#define RC_OK_CPT 15
#define RC_OK 0
#define RC_LOST 1
@@ -57,7 +59,7 @@
extern int32_t avg_rc_values[PPM_NB_PULSES];
extern uint8_t rc_values_contains_avg_channels;
extern uint8_t time_since_last_ppm;
-extern uint8_t ppm_cpt, last_ppm_cpt;
+extern uint8_t ppm_cpt, last_ppm_cpt, radio_ok_cpt;
/*
* On tiny (and booz) the ppm counter is running at the same speed as
@@ -73,6 +75,7 @@
static inline void radio_control_init ( void ) {
rc_status = RC_REALLY_LOST;
time_since_last_ppm = RC_REALLY_LOST_TIME;
+ radio_ok_cpt = 0;
}
/************* PERIODIC ******************************************************/
@@ -89,8 +92,10 @@
if (time_since_last_ppm >= RC_REALLY_LOST_TIME) {
rc_status = RC_REALLY_LOST;
} else {
- if (time_since_last_ppm >= RC_LOST_TIME)
+ if (time_since_last_ppm >= RC_LOST_TIME) {
rc_status = RC_LOST;
+ radio_ok_cpt = RC_OK_CPT;
+ }
time_since_last_ppm++;
}
@@ -109,10 +114,14 @@
static inline void radio_control_event_task ( void ) {
ppm_cpt++;
time_since_last_ppm = 0;
- rc_status = RC_OK;
- /** From ppm values to normalised rc_values */
- NormalizePpm();
+ /* Wait for enough valid frame to switch back to RC_OK */
+ if (radio_ok_cpt > 0) radio_ok_cpt--;
+ else {
+ rc_status = RC_OK;
+ /** From ppm values to normalised rc_values */
+ NormalizePpm();
+ }
}
#endif /* RADIO_CONTROL */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [paparazzi-commits] [5807] Improve ppm decoding on lpc21: a valid synchro is needed to validate a ppm frame,
Gautier Hattenberger <=