A replacement for InterruptIn that debounces the interrupt.

Dependents:   D7A_Demo-Get-started CVtoOSCConverter EE3501keypad D7A_Localisation ... more

Fork of DebouncedInterrupt by Anil Kandangath

Example code:

#include "DebouncedInterrupt.h"

DebouncedInterrupt up_button(USER_BUTTON);

void onUp()
{
    // Do Something
}

int main()
{
    // Will immediatly call function and ignore other interrupts until timeout
    up_button.attach(&onUp, IRQ_FALL, 1000, true);

    // Will call function only if button has been held for the specified time
    //up_button.attach(&onUp, IRQ_FALL, 500, false);

    while(1) {}
}
Committer:
Jeej
Date:
Thu Apr 27 16:06:12 2017 +0000
Revision:
26:2df374d23986
Parent:
25:2163ebb21aef
Updated deprecated callback.

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 20:996ea2fc8d2d 7
kandangath 20:996ea2fc8d2d 8 /**
kandangath 20:996ea2fc8d2d 9 typedef enum {
kandangath 20:996ea2fc8d2d 10 IRQ_NONE,
kandangath 20:996ea2fc8d2d 11 IRQ_RISE,
kandangath 20:996ea2fc8d2d 12 IRQ_FALL
kandangath 20:996ea2fc8d2d 13 } gpio_irq_event;
kandangath 20:996ea2fc8d2d 14 **/
kandangath 0:ca5a0fee9f52 15
kandangath 15:948e85b22efe 16 /** A replacement for InterruptIn that debounces the interrupt
kandangath 15:948e85b22efe 17 *
kandangath 20:996ea2fc8d2d 18 * Example:
kandangath 15:948e85b22efe 19 * @code
kandangath 15:948e85b22efe 20 *
kandangath 15:948e85b22efe 21 * #include "DebouncedInterrupt.h"
kandangath 15:948e85b22efe 22 *
Jeej 23:cd4042093f85 23 * DebouncedInterrupt up_button(USER_BUTTON);
kandangath 15:948e85b22efe 24 *
kandangath 15:948e85b22efe 25 * void onUp()
kandangath 15:948e85b22efe 26 * {
kandangath 15:948e85b22efe 27 * // Do Something
kandangath 15:948e85b22efe 28 * }
kandangath 15:948e85b22efe 29 *
kandangath 15:948e85b22efe 30 * int main()
kandangath 15:948e85b22efe 31 * {
Jeej 23:cd4042093f85 32 * // Will immediatly call function and ignore other interrupts until timeout
Jeej 23:cd4042093f85 33 * up_button.attach(&onUp, IRQ_FALL, 1000, true);
Jeej 23:cd4042093f85 34 *
Jeej 23:cd4042093f85 35 * // Will call function only if button has been held for the specified time
Jeej 23:cd4042093f85 36 * //up_button.attach(&onUp, IRQ_FALL, 500, false);
Jeej 23:cd4042093f85 37 *
kandangath 15:948e85b22efe 38 * while(1) {
kandangath 15:948e85b22efe 39 * ...
kandangath 15:948e85b22efe 40 * }
kandangath 15:948e85b22efe 41 * }
kandangath 15:948e85b22efe 42 * @endcode
kandangath 15:948e85b22efe 43 */
kandangath 10:cb16d2957f8d 44 class DebouncedInterrupt {
kandangath 0:ca5a0fee9f52 45 private:
kandangath 7:2d73e219dadf 46 unsigned int _debounce_us;
Jeej 23:cd4042093f85 47 bool _immediate;
Jeej 23:cd4042093f85 48 bool _timeout_expired;
kandangath 10:cb16d2957f8d 49 InterruptIn *_in;
kandangath 14:da09706b92f5 50 DigitalIn *_din;
kandangath 18:e6e9bc6402b7 51 gpio_irq_event _trigger;
Jeej 23:cd4042093f85 52 Timeout *_timeout;
kandangath 7:2d73e219dadf 53
kandangath 13:09b53a088a9c 54 // Diagnostics
kandangath 13:09b53a088a9c 55 volatile unsigned int _bounce_count;
kandangath 13:09b53a088a9c 56 volatile unsigned int _last_bounce_count;
kandangath 13:09b53a088a9c 57
kandangath 3:e4b7033508d1 58 void _onInterrupt(void);
Jeej 26:2df374d23986 59 void _onCallback(void);
kandangath 0:ca5a0fee9f52 60 public:
kandangath 10:cb16d2957f8d 61 DebouncedInterrupt(PinName pin);
kandangath 10:cb16d2957f8d 62 ~DebouncedInterrupt();
kandangath 10:cb16d2957f8d 63
kandangath 10:cb16d2957f8d 64 // Start monitoring the interupt and attach a callback
Jeej 23:cd4042093f85 65 void attach(void (*fptr)(void), const gpio_irq_event trigger, const uint32_t debounce_ms=10, bool immediate=false);
kandangath 21:34b95e1b2bf3 66
Jeej 25:2163ebb21aef 67 template<typename T, typename M>
Jeej 25:2163ebb21aef 68 void attach(T *obj, M method, const gpio_irq_event trigger, const uint32_t debounce_ms=10, bool immediate=false) {
Jeej 26:2df374d23986 69 _callback = callback(obj, method);
kandangath 22:9733f886810a 70 _last_bounce_count = _bounce_count = 0;
kandangath 22:9733f886810a 71 _debounce_us = 1000*debounce_ms;
kandangath 22:9733f886810a 72 _trigger = trigger;
kandangath 22:9733f886810a 73
kandangath 22:9733f886810a 74 switch(trigger)
kandangath 22:9733f886810a 75 {
kandangath 22:9733f886810a 76 case IRQ_RISE:
Jeej 25:2163ebb21aef 77 _in->rise(callback(this, &DebouncedInterrupt::_onInterrupt));
kandangath 22:9733f886810a 78 break;
kandangath 22:9733f886810a 79 case IRQ_FALL:
Jeej 25:2163ebb21aef 80 _in->fall(callback(this, &DebouncedInterrupt::_onInterrupt));
kandangath 22:9733f886810a 81 break;
kandangath 22:9733f886810a 82 case IRQ_NONE:
kandangath 22:9733f886810a 83 reset(); // Unexpected. Clear callbacks.
kandangath 22:9733f886810a 84 break;
kandangath 22:9733f886810a 85 }
kandangath 22:9733f886810a 86 }
kandangath 10:cb16d2957f8d 87
kandangath 10:cb16d2957f8d 88 // Stop monitoring the interrupt
kandangath 10:cb16d2957f8d 89 void reset();
kandangath 10:cb16d2957f8d 90
kandangath 10:cb16d2957f8d 91
kandangath 7:2d73e219dadf 92 /*
kandangath 13:09b53a088a9c 93 * Get number of bounces
kandangath 13:09b53a088a9c 94 * @return: bounce count
kandangath 7:2d73e219dadf 95 */
kandangath 13:09b53a088a9c 96 unsigned int get_bounce();
kandangath 22:9733f886810a 97 protected:
kandangath 22:9733f886810a 98 // https://github.com/mbedmicro/mbed/blob/master/libraries/mbed/api/FunctionPointer.h
Jeej 26:2df374d23986 99 Callback<void()> _callback;
kandangath 0:ca5a0fee9f52 100 };
kandangath 0:ca5a0fee9f52 101 #endif