Debounce InterruptIn

Dependents:   led_sigfox Allumag_lampe_sigfox Case_study_02_Turnstile B18_MP3_PLAYER ... more

Committer:
kandangath
Date:
Tue Feb 25 23:44:37 2014 +0000
Revision:
22:9733f886810a
Parent:
21:34b95e1b2bf3
Modifications to template version for member functions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kandangath 20:996ea2fc8d2d 1
kandangath 20:996ea2fc8d2d 2 #ifndef DEBOUNCED_INTERRUPT_H
kandangath 20:996ea2fc8d2d 3 #define DEBOUNCED_INTERRUPT_H
kandangath 20:996ea2fc8d2d 4
kandangath 20:996ea2fc8d2d 5 #include <stdint.h>
kandangath 20:996ea2fc8d2d 6 #include "mbed.h"
kandangath 22:9733f886810a 7 #include "FunctionPointer.h"
kandangath 20:996ea2fc8d2d 8
kandangath 20:996ea2fc8d2d 9 /**
kandangath 20:996ea2fc8d2d 10 typedef enum {
kandangath 20:996ea2fc8d2d 11 IRQ_NONE,
kandangath 20:996ea2fc8d2d 12 IRQ_RISE,
kandangath 20:996ea2fc8d2d 13 IRQ_FALL
kandangath 20:996ea2fc8d2d 14 } gpio_irq_event;
kandangath 20:996ea2fc8d2d 15 **/
kandangath 0:ca5a0fee9f52 16
kandangath 15:948e85b22efe 17 /** A replacement for InterruptIn that debounces the interrupt
kandangath 15:948e85b22efe 18 *
kandangath 20:996ea2fc8d2d 19 * Example:
kandangath 15:948e85b22efe 20 * @code
kandangath 15:948e85b22efe 21 *
kandangath 15:948e85b22efe 22 * #include "DebouncedInterrupt.h"
kandangath 15:948e85b22efe 23 *
kandangath 15:948e85b22efe 24 * DebouncedInterrupt up_button(p15);
kandangath 15:948e85b22efe 25 *
kandangath 15:948e85b22efe 26 * void onUp()
kandangath 15:948e85b22efe 27 * {
kandangath 15:948e85b22efe 28 * // Do Something
kandangath 15:948e85b22efe 29 * }
kandangath 15:948e85b22efe 30 *
kandangath 15:948e85b22efe 31 * int main()
kandangath 15:948e85b22efe 32 * {
kandangath 18:e6e9bc6402b7 33 * up_button.attach(&onUp,IRQ_FALL, 100);
kandangath 15:948e85b22efe 34 * while(1) {
kandangath 15:948e85b22efe 35 * ...
kandangath 15:948e85b22efe 36 * }
kandangath 15:948e85b22efe 37 * }
kandangath 15:948e85b22efe 38 * @endcode
kandangath 15:948e85b22efe 39 */
kandangath 10:cb16d2957f8d 40 class DebouncedInterrupt {
kandangath 0:ca5a0fee9f52 41 private:
kandangath 7:2d73e219dadf 42 unsigned int _debounce_us;
kandangath 10:cb16d2957f8d 43 InterruptIn *_in;
kandangath 14:da09706b92f5 44 DigitalIn *_din;
kandangath 18:e6e9bc6402b7 45 gpio_irq_event _trigger;
kandangath 7:2d73e219dadf 46
kandangath 13:09b53a088a9c 47 // Diagnostics
kandangath 13:09b53a088a9c 48 volatile unsigned int _bounce_count;
kandangath 13:09b53a088a9c 49 volatile unsigned int _last_bounce_count;
kandangath 13:09b53a088a9c 50
kandangath 3:e4b7033508d1 51 void _onInterrupt(void);
kandangath 7:2d73e219dadf 52 void _callback(void);
kandangath 0:ca5a0fee9f52 53 public:
kandangath 10:cb16d2957f8d 54 DebouncedInterrupt(PinName pin);
kandangath 10:cb16d2957f8d 55 ~DebouncedInterrupt();
kandangath 10:cb16d2957f8d 56
kandangath 10:cb16d2957f8d 57 // Start monitoring the interupt and attach a callback
kandangath 18:e6e9bc6402b7 58 void attach(void (*fptr)(void), const gpio_irq_event trigger, const uint32_t& debounce_ms=10);
kandangath 21:34b95e1b2bf3 59
kandangath 21:34b95e1b2bf3 60 template<typename T>
kandangath 22:9733f886810a 61 void attach(T* tptr, void (T::*mptr)(void), const gpio_irq_event trigger, const uint32_t& debounce_ms=10) {
kandangath 22:9733f886810a 62 _fAttach.attach(tptr, mptr);
kandangath 22:9733f886810a 63 _last_bounce_count = _bounce_count = 0;
kandangath 22:9733f886810a 64 _debounce_us = 1000*debounce_ms;
kandangath 22:9733f886810a 65 _trigger = trigger;
kandangath 22:9733f886810a 66
kandangath 22:9733f886810a 67 switch(trigger)
kandangath 22:9733f886810a 68 {
kandangath 22:9733f886810a 69 case IRQ_RISE:
kandangath 22:9733f886810a 70 _in->rise(tptr, &DebouncedInterrupt::_onInterrupt);
kandangath 22:9733f886810a 71 break;
kandangath 22:9733f886810a 72 case IRQ_FALL:
kandangath 22:9733f886810a 73 _in->fall(tptr, &DebouncedInterrupt::_onInterrupt);
kandangath 22:9733f886810a 74 break;
kandangath 22:9733f886810a 75 case IRQ_NONE:
kandangath 22:9733f886810a 76 reset(); // Unexpected. Clear callbacks.
kandangath 22:9733f886810a 77 break;
kandangath 22:9733f886810a 78 }
kandangath 22:9733f886810a 79 }
kandangath 10:cb16d2957f8d 80
kandangath 10:cb16d2957f8d 81 // Stop monitoring the interrupt
kandangath 10:cb16d2957f8d 82 void reset();
kandangath 10:cb16d2957f8d 83
kandangath 10:cb16d2957f8d 84
kandangath 7:2d73e219dadf 85 /*
kandangath 13:09b53a088a9c 86 * Get number of bounces
kandangath 13:09b53a088a9c 87 * @return: bounce count
kandangath 7:2d73e219dadf 88 */
kandangath 13:09b53a088a9c 89 unsigned int get_bounce();
kandangath 22:9733f886810a 90 protected:
kandangath 22:9733f886810a 91 // https://github.com/mbedmicro/mbed/blob/master/libraries/mbed/api/FunctionPointer.h
kandangath 22:9733f886810a 92 FunctionPointer _fAttach;
kandangath 0:ca5a0fee9f52 93 };
kandangath 0:ca5a0fee9f52 94 #endif