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) {}
}

Files at this revision

API Documentation at this revision

Comitter:
kandangath
Date:
Tue Feb 25 23:44:37 2014 +0000
Parent:
21:34b95e1b2bf3
Child:
23:cd4042093f85
Commit message:
Modifications to template version for member functions

Changed in this revision

DebouncedInterrupt.cpp Show annotated file Show diff for this revision Revisions of this file
DebouncedInterrupt.h Show annotated file Show diff for this revision Revisions of this file
--- a/DebouncedInterrupt.cpp	Tue Feb 25 07:13:29 2014 +0000
+++ b/DebouncedInterrupt.cpp	Tue Feb 25 23:44:37 2014 +0000
@@ -19,14 +19,8 @@
 
 void DebouncedInterrupt::attach(void (*fptr)(void), const gpio_irq_event trigger, const unsigned int& debounce_ms)
 {
-    attach(this, fptr, trigger, debounce_ms);
-}
-
-template<typename T>
-void DebouncedInterrupt::attach(T *cptr, void (*fptr)(void), const gpio_irq_event trigger, const unsigned int& debounce_ms)
-{
     if(fptr) {
-        fCallback = fptr;
+        _fAttach.attach(fptr);
         _last_bounce_count = _bounce_count = 0;
         _debounce_us = 1000*debounce_ms;
         _trigger = trigger;
@@ -34,10 +28,10 @@
         switch(trigger)
         {
             case IRQ_RISE:
-                _in->rise(cptr, &DebouncedInterrupt::_onInterrupt);
+                _in->rise(this, &DebouncedInterrupt::_onInterrupt);
                 break;
             case IRQ_FALL:
-                _in->fall(cptr, &DebouncedInterrupt::_onInterrupt);
+                _in->fall(this, &DebouncedInterrupt::_onInterrupt);
                 break;
             case IRQ_NONE:
                 reset(); // Unexpected. Clear callbacks.
@@ -63,7 +57,7 @@
     _last_bounce_count = _bounce_count;
     _bounce_count = 0;
     if(_din->read() == (_trigger==IRQ_RISE)) {
-        fCallback();
+        _fAttach.call();
     }
 }
 
--- a/DebouncedInterrupt.h	Tue Feb 25 07:13:29 2014 +0000
+++ b/DebouncedInterrupt.h	Tue Feb 25 23:44:37 2014 +0000
@@ -4,6 +4,7 @@
 
 #include <stdint.h>
 #include "mbed.h"
+#include "FunctionPointer.h"
 
 /**
 typedef enum {
@@ -47,7 +48,6 @@
     volatile unsigned int _bounce_count;
     volatile unsigned int _last_bounce_count;
     
-    void (*fCallback)(void);
     void _onInterrupt(void);
     void _callback(void);
 public:
@@ -58,7 +58,25 @@
     void attach(void (*fptr)(void), const gpio_irq_event trigger, const uint32_t& debounce_ms=10);
     
     template<typename T>
-    void attach(T* cptr, void (*fptr)(void), const gpio_irq_event trigger, const uint32_t& debounce_ms=10);
+    void attach(T* tptr, void (T::*mptr)(void), const gpio_irq_event trigger, const uint32_t& debounce_ms=10) {
+        _fAttach.attach(tptr, mptr);
+        _last_bounce_count = _bounce_count = 0;
+        _debounce_us = 1000*debounce_ms;
+        _trigger = trigger;
+        
+        switch(trigger)
+        {
+            case IRQ_RISE:
+                _in->rise(tptr, &DebouncedInterrupt::_onInterrupt);
+                break;
+            case IRQ_FALL:
+                _in->fall(tptr, &DebouncedInterrupt::_onInterrupt);
+                break;
+            case IRQ_NONE:
+                reset(); // Unexpected. Clear callbacks.
+                break;
+        }
+    }
    
     // Stop monitoring the interrupt
     void reset();
@@ -69,5 +87,8 @@
     * @return: bounce count
     */
     unsigned int get_bounce();
+protected:
+//    https://github.com/mbedmicro/mbed/blob/master/libraries/mbed/api/FunctionPointer.h
+    FunctionPointer _fAttach;
 };
 #endif
\ No newline at end of file