A debouncing InterruptIn wrapper
Revision 1:e806603f0088, committed 2012-02-07
- Comitter:
- evwijk
- Date:
- Tue Feb 07 09:31:26 2012 +0000
- Parent:
- 0:2e999fcd4c7b
- Child:
- 2:c353357a97e4
- Commit message:
Changed in this revision
ButtonIn.cpp | Show annotated file Show diff for this revision Revisions of this file |
ButtonIn.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/ButtonIn.cpp Mon Feb 06 19:53:40 2012 +0000 +++ b/ButtonIn.cpp Tue Feb 07 09:31:26 2012 +0000 @@ -1,38 +1,43 @@ -#include "ButtonIn.h" - -ButtonIn::ButtonIn(PinName buttonPin) : - _button(buttonPin) { - _buttonCanPress = true; - _callback = NULL; - _callbackInstance = NULL; - _callbackMethod = NULL; - _button.rise(this, &ButtonIn::click); -} - -void ButtonIn::attach(void (*method)(void)) { - _callback = method; -} - -template<class T> -void attach(T* instance, void (T::*method)(void)) { - _callbackInstance = (ButtonInCallbackInstance *)instance; - _callbackMethod = (void (ButtonInCallbackInstance::*)(void))method; -} - -void ButtonIn::click() { - if (_buttonCanPress) { - _buttonCanPress = false; - _buttonDownTimeout.attach(this, &ButtonIn::reset, 0.5); - } -} - -void ButtonIn::call() { - if (_callback != NULL) - (*_callback)(); - else - (_callbackInstance->*_callbackMethod)(); -} - -void ButtonIn::reset() { - _buttonCanPress = true; +#include "ButtonIn.h" + +ButtonIn::ButtonIn(PinName buttonPin) : + _button(buttonPin) { + _buttonCanPress = true; + _callback = NULL; + _callbackInstance = NULL; + _callbackMethod = NULL; + _button.rise(this, &ButtonIn::click); +} + +void ButtonIn::attach(void (*method)(void)) { + _callback = method; +} + +template<class T> +void attach(T* instance, void (T::*method)(void)) { + _callbackInstance = (ButtonInCallbackInstance *)instance; + _callbackMethod = (void (ButtonInCallbackInstance::*)(void))method; +} + +void ButtonIn::click() { + printf("click\r\n"); + if (_buttonCanPress) { + _buttonCanPress = false; + printf("press\r\n"); + //_buttonDownTimer.reset(); + _buttonDownTimeout.attach(this, &ButtonIn::reset, 5); + call(); + } +} + +void ButtonIn::call() { + printf("call\r\n"); + if (_callback != NULL) + (*_callback)(); + else + (_callbackInstance->*_callbackMethod)(); +} + +void ButtonIn::reset() { + _buttonCanPress = true; } \ No newline at end of file
--- a/ButtonIn.h Mon Feb 06 19:53:40 2012 +0000 +++ b/ButtonIn.h Tue Feb 07 09:31:26 2012 +0000 @@ -1,37 +1,37 @@ -#include "mbed.h" - -#ifndef _ButtonIn_ -#define _ButtonIn_ - - -class ButtonInCallbackInstance; - - -class ButtonIn { - -private: - InterruptIn _button; - Timeout _buttonDownTimeout; - - bool _buttonCanPress; - void (*_callback)(void); - ButtonInCallbackInstance *_callbackInstance; - void (ButtonInCallbackInstance::*_callbackMethod)(void); - - void click(); - void call(); - void reset(); - - - -public: - ButtonIn(PinName buttonPin); - - - void attach(void (*method)(void) = 0); - - template<class T> - void attach(T* instance, void (T::*method)(void)); -}; - +#include "mbed.h" + +#ifndef _ButtonIn_ +#define _ButtonIn_ + + +class ButtonInCallbackInstance; + + +class ButtonIn { + +private: + InterruptIn _button; + Timeout _buttonDownTimeout; + + volatile bool _buttonCanPress; + void (*_callback)(void); + ButtonInCallbackInstance *_callbackInstance; + void (ButtonInCallbackInstance::*_callbackMethod)(void); + + void click(); + void call(); + void reset(); + + + +public: + ButtonIn(PinName buttonPin); + + + void attach(void (*method)(void) = 0); + + template<class T> + void attach(T* instance, void (T::*method)(void)); +}; + #endif \ No newline at end of file