A simple PWM decoder class. It is based on using 2 interrupts, one for rising and another for falling edges of the input pulse. This is a very simple approach, possibly accurate enough to decode RC receiver pulses.

Revision:
0:b0ec6b86deaa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pulse_decoder.h	Sun May 15 11:08:46 2016 +0000
@@ -0,0 +1,56 @@
+#ifndef PULSE_DECODER_H
+#define PULSE_DECODER_H
+
+/// @file pulse_decoder.h This library provides a simple PWM decoder class.
+///
+/// The approach is based on installing two interrupt routines for the rising and
+/// falling edges of an input pin and measuring the time between the two events.
+///
+/// Example:
+/// @code
+/// #include "mbed.h"
+/// void main()
+/// {
+///     pulse_decoder pulse(D7);
+///
+///     while(true) {
+///         printf("Pulse high = %5d low = %5d (us) Period = %5d\n", 
+///           pulse.get_high_period(), pulse.get_low_period(), 
+///           pulse.get_high_period() + pulse.get_low_period());  
+///         wait(.2);
+///     }    
+/// }
+/// @endcode
+
+class pulse_decoder {
+public:
+    ///Creates a pulse_decoder
+    ///@param[in] pin the input pin on the microcontroller
+    pulse_decoder(PinName pin);
+    
+    ///Get the period of time that the pulse was in high state
+    ///@return the period in us
+    int get_high_period() const
+    {
+        return high_period;
+    }
+
+    ///Get the period of time that the pulse was in low state
+    ///@return the period in us        
+    int get_low_period() const
+    {
+        return low_period;
+    }
+    
+private:
+    InterruptIn interrupt;
+    Timer high_timer;
+    Timer low_timer;
+    volatile int high_period;
+    volatile int low_period;
+    
+    void rising_edge();
+    void falling_edge();
+}; 
+
+#endif //PULSE_DECODER_H
\ No newline at end of file