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 18 20:38:50 2014 +0000
Parent:
16:7eaa188de0f9
Child:
18:e6e9bc6402b7
Commit message:
Monitor both rising and falling edges

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 18 20:22:31 2014 +0000
+++ b/DebouncedInterrupt.cpp	Tue Feb 18 20:38:50 2014 +0000
@@ -17,26 +17,15 @@
     delete _din;
 }
 
-void DebouncedInterrupt::attach(void (*fptr)(void), 
-                                       const interruptTrigger& trigger,
-                                       const unsigned int& debounce_ms)
+void DebouncedInterrupt::attach(void (*fptr)(void), const unsigned int& debounce_ms)
 {
     if(fptr) {
         fCallback = fptr;
         _last_bounce_count = _bounce_count = 0;
+        _debounce_us = 1000*debounce_ms;
         
-        switch(trigger) {
-         case INT_RISE:
-            _in->rise(this, &DebouncedInterrupt::_onInterrupt);
-            break;
-         case INT_FALL:
-            _in->fall(this, &DebouncedInterrupt::_onInterrupt);
-            break;
-         default:
-            break;
-        }
-    
-        _debounce_us = 1000*debounce_ms;
+        _in->rise(this, &DebouncedInterrupt::_onInterrupt);
+        _in->fall(this, &DebouncedInterrupt::_onInterrupt);
     }
 }
 
@@ -54,7 +43,7 @@
 {
     _last_bounce_count = _bounce_count;
     _bounce_count = 0;
-    if(_din) {
+    if(_din->read()) {
         fCallback();
     }
 }
@@ -64,4 +53,3 @@
     _bounce_count++;
     timeout.attach_us(this, &DebouncedInterrupt::_callback, _debounce_us);
 }
-
--- a/DebouncedInterrupt.h	Tue Feb 18 20:22:31 2014 +0000
+++ b/DebouncedInterrupt.h	Tue Feb 18 20:38:50 2014 +0000
@@ -15,7 +15,7 @@
  * 
  * int main()
  * {
- *     up_button.attach(&onUp, INT_FALL, 100);
+ *     up_button.attach(&onUp, 100);
  *     while(1) {
  *         ...
  *     }
@@ -29,11 +29,6 @@
 #include <stdint.h>
 #include "mbed.h"
 
-enum interruptTrigger{
-    INT_FALL = 0,
-    INT_RISE = 1
-};
-
 class DebouncedInterrupt {
 private:
     unsigned int _debounce_us;
@@ -52,7 +47,7 @@
     ~DebouncedInterrupt();
     
     // Start monitoring the interupt and attach a callback
-    void attach(void (*fptr)(void), const interruptTrigger& trigger=INT_FALL, const uint32_t& debounce_ms=10);
+    void attach(void (*fptr)(void), const uint32_t& debounce_ms=10);
    
     // Stop monitoring the interrupt
     void reset();