Debounce InterruptIn

Dependents:   led_sigfox Allumag_lampe_sigfox Case_study_02_Turnstile B18_MP3_PLAYER ... more

Files at this revision

API Documentation at this revision

Comitter:
kandangath
Date:
Wed Feb 19 01:47:45 2014 +0000
Parent:
17:96a51b236ba0
Child:
19:d12a5b89ac3a
Commit message:
Support checking rise and fall of signals

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:38:50 2014 +0000
+++ b/DebouncedInterrupt.cpp	Wed Feb 19 01:47:45 2014 +0000
@@ -17,15 +17,28 @@
     delete _din;
 }
 
-void DebouncedInterrupt::attach(void (*fptr)(void), const unsigned int& debounce_ms)
+void DebouncedInterrupt::attach(void (*fptr)(void), const gpio_irq_event trigger, const unsigned int& debounce_ms)
 {
     if(fptr) {
         fCallback = fptr;
         _last_bounce_count = _bounce_count = 0;
         _debounce_us = 1000*debounce_ms;
+        _trigger = trigger;
         
-        _in->rise(this, &DebouncedInterrupt::_onInterrupt);
-        _in->fall(this, &DebouncedInterrupt::_onInterrupt);
+        switch(trigger)
+        {
+            case IRQ_RISE:
+                _in->rise(this, &DebouncedInterrupt::_onInterrupt);
+                break;
+            case IRQ_FALL:
+                _in->fall(this, &DebouncedInterrupt::_onInterrupt);
+                break;
+            case IRQ_NONE:
+                reset(); // Unexpected. Clear callbacks.
+                break;
+        }
+    } else {
+        reset();
     }
 }
 
@@ -43,7 +56,8 @@
 {
     _last_bounce_count = _bounce_count;
     _bounce_count = 0;
-    if(_din->read()) {
+    unsigned int expected_state = (_trigger==IRQ_RISE)?1:0;
+    if(_din->read() == expected_state) {
         fCallback();
     }
 }
--- a/DebouncedInterrupt.h	Tue Feb 18 20:38:50 2014 +0000
+++ b/DebouncedInterrupt.h	Wed Feb 19 01:47:45 2014 +0000
@@ -15,7 +15,7 @@
  * 
  * int main()
  * {
- *     up_button.attach(&onUp, 100);
+ *     up_button.attach(&onUp,IRQ_FALL, 100);
  *     while(1) {
  *         ...
  *     }
@@ -29,11 +29,20 @@
 #include <stdint.h>
 #include "mbed.h"
 
+/**
+typedef enum {
+    IRQ_NONE,
+    IRQ_RISE,
+    IRQ_FALL
+} gpio_irq_event;
+**/
+
 class DebouncedInterrupt {
 private:
     unsigned int _debounce_us;
     InterruptIn *_in;
     DigitalIn *_din;
+    gpio_irq_event _trigger;
     
     // Diagnostics
     volatile unsigned int _bounce_count;
@@ -47,7 +56,7 @@
     ~DebouncedInterrupt();
     
     // Start monitoring the interupt and attach a callback
-    void attach(void (*fptr)(void), const uint32_t& debounce_ms=10);
+    void attach(void (*fptr)(void), const gpio_irq_event trigger, const uint32_t& debounce_ms=10);
    
     // Stop monitoring the interrupt
     void reset();