Debounce InterruptIn
Dependents: led_sigfox Allumag_lampe_sigfox Case_study_02_Turnstile B18_MP3_PLAYER ... more
Revision 22:9733f886810a, committed 2014-02-25
- Comitter:
- kandangath
- Date:
- Tue Feb 25 23:44:37 2014 +0000
- Parent:
- 21:34b95e1b2bf3
- 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 |
diff -r 34b95e1b2bf3 -r 9733f886810a DebouncedInterrupt.cpp --- 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(); } }
diff -r 34b95e1b2bf3 -r 9733f886810a DebouncedInterrupt.h --- 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