A debouncing InterruptIn wrapper

Revision:
0:2e999fcd4c7b
Child:
1:e806603f0088
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ButtonIn.cpp	Mon Feb 06 19:53:40 2012 +0000
@@ -0,0 +1,38 @@
+#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;
+}
\ No newline at end of file