DebounceIN library allows debouncing a GPIO pin interrupt

DebounceInt.cpp

Committer:
nleoni
Date:
2014-02-18
Revision:
0:afa153f7249f

File content as of revision 0:afa153f7249f:

/* DebounceInt 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.                                                 */
// Usage:
// Declare a DebounceInt 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/

#include "DebounceInt.h"

//Default constructor, required but not to be used, will yield error and exit.
    DebounceInt::DebounceInt(){
        exit(1);
    }
    
//Constructor with PinName, delay will remain default value
    DebounceInt::DebounceInt(PinName pin){
    // Inputs:
    // PinName pin: Expected Proper Mbed Pin (e.g. p12), program will exit otherwise
        this->pinIntMask = new InterruptMask(pin);
        this->setDelay(_DEBOUNCEINTDELAYDEFAULT);    
    }

//Constructor with PinName and specified delay in micro-seconds
    DebounceInt::DebounceInt(PinName pin,unsigned int delay_us){
    // Inputs:
    // PinName pin: Expected Proper Mbed Pin (e.g. p12), program will exit otherwise
    // unsigned int delay: Expected positive delay, will force delay to be larger
    // than minimum delay _MINDBOUNCEDELAY
        this->pinIntMask = new InterruptMask(pin);        
        this->setDelay(delay_us);
    }

//method to modify delay for debounce in us
    void DebounceInt::setDelay(unsigned int delay_us){
    // Inputs:
    // unsigned int delay: Expected positive delay, will force delay to be larger
    // than minimum delay _MINDBOUNCEDELAY
        if(delay_us>(_MINDBOUNCEDELAY) ){
            this->delay=delay_us;
        } else { 
            this->delay=_MINDBOUNCEDELAY;
        }
    } 

//method to be called within Interrupt Service Routine to debounce GPIO pin on rising edge
    void DebounceInt::debouncePinRise(void){
        this->pinIntMask->maskIntR();
        this->debounceCallBack.attach_us(this,&DebounceInt::debounceCallbackPinRise,this->delay);
    }
    
//internal callback used to re-enable (unmask) interrupts on rising edge
    void DebounceInt::debounceCallbackPinRise(void){
        this->pinIntMask->ClrInt();
        this->pinIntMask->unMaskIntR();
    }

//method to be called within Interrupt Service Routine to debounce GPIO pin on falling edge
    void DebounceInt::debouncePinFall(void){
        this->pinIntMask->maskIntF();
        this->debounceCallBack.attach_us(this,&DebounceInt::debounceCallbackPinFall,this->delay);
    }
    
//internal callback used to re-enable (unmask) interrupts on falling edge
    void DebounceInt::debounceCallbackPinFall(void){
        this->pinIntMask->ClrInt();
        this->pinIntMask->unMaskIntF();
    }