paparazzi-commits
[Top][All Lists]
Advanced

[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 */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]