Improvement to the DebounceInt library providing an easier to use interface much more alike the usual InterrupIn interface
Fork of DebounceInt by
Diff: DebounceInt2.h
- Revision:
- 1:3e9de727a215
- Parent:
- 0:afa153f7249f
- Child:
- 2:bd5a3171ebc4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DebounceInt2.h Tue Feb 25 05:07:21 2014 +0000 @@ -0,0 +1,75 @@ +/* DebounceInt2 Library */ +/* This class enables debouncing a GPIO interrupt from a specific MBED pin */ +/* It does so by using the InterruptMask library to temporarily mask the interrupt */ +/* from the specified pin for a user specified delay specified in us. After the delay */ +/* time has passed the interrupt is unmasked (reenabled) and any pending interrupts */ +/* also cleared. The library gives you the flexibiity to debounce on either the */ +/* rising or falling edge interrupts. */ +// Deprecated Usage: +// Declare a DebounceInt2 object with a valid mbed pin (p5-p30 except p19 and p20) as +// an argument. Within your interrupt service routine call the appropriate debounce +// method debouncePinRise or debouncePinFall. +// Requires the InterruptMask library available at: https://mbed.org/users/nleoni/code/InterruptMask/ + +// +// Example Code: toggles LED1 on falling edge interrupt +//#include "mbed.h" +//#include "DebounceInt2.h" +//DigitalOut myled(LED1); +//InterruptIn upPressed(p15); +//DebounceInt2 *upPressedDebounce; //debounce object to be used within interrupt for joystick up +// //note that pointer is defined here to have global variable +// //but constructor call must be within the main function. +//int main() { +// upPressedDebounce = new DebounceInt2(p15,50000); //create DebounceInt2 object for p15 interrupt +// //with a 50000 us delay (interrupt disabled to avoid bounce) +// upPressed.fall(ISRup); //attach joystick up click on falling edge, that is when +// //user releases the joystick the action will happen +// while(1){ +// } +//} +//void ISRup(void){ +// upPressedDebounce->debouncePinFall(); //call debounce method on pin fall, will disable interrupt for +// //specified delay +// myled=!myled; +//} + + +#include "mbed.h" +#include "InterruptMask.h" + +#ifndef DebounceInt2 +#define DebounceInt2 +#define _DEBOUNCEINTDELAYDEFAULT 50000 //useconds, this number would be about 50 ms +#define _MINDBOUNCEDELAY 5 +class DebounceInt2{ +public://members +private://members + InterruptMask* pinIntMask; //Internal InterruptMask object + unsigned int delay; //this is the debounce delay, during which the interrupt in question is masked + Timeout debounceCallBack; + InterruptIn *intRise,*intFall; + bool riseAttached,fallAttached; + void *riseHandler(void),*fallHandler(void); + +public://methods + DebounceInt2(); //Default constructor, required but not to be used, will yield error and exit. + DebounceInt2(PinName pin);//Constructor with PinName, delay will remain default value + DebounceInt2(PinName pin,unsigned int delay_us);//Constructor with PinName and specified delay in micro-seconds + void setDelay(unsigned int); //method to modify delay for debounce in us + void attachRise(*fhandler); //attach interrupt handler for interrupt on rising edge + void disableRise(void); //rise interrupt handler for rising edge + void enableRise(void); //unmask rise interrupt handler for rising edge + void attachFall(*fhandler); //attach interrupt handler for interrupt on falling edge + void disableFall(void); //mask fall interrupt handler for rising edge + void enableFall(void); //unmask fall interrupt handler for rising edge + +private://methods + void debouncePinRise(void); //method to be called within Interrupt Service Routine to debounce GPIO pin on rising edge + void debouncePinFall(void); //method to be called within Interrupt Service Routine to debounce GPIO pin on falling edge + void debounceCallbackPinRise(void); //internal callback used to re-enable (unmask) interrupts on rising edge + void debounceCallbackPinFall(void); //internal callback used to re-enable (unmask) interrupts on falling edge + +}; + +#endif