class of Buttons -isPressed -wasPressed -notPressed -LongPress (Timer)

Button.cpp

Committer:
x1dmoesc
Date:
2020-04-17
Revision:
8:6c8a00baae91
Parent:
7:09fb38cf8526

File content as of revision 8:6c8a00baae91:

#include "Button.h"
#include "mbed.h"


/******************************************************************************/
// constructor of instance button
//      - PinName:  Name of pin of MBed LPC1768 (e.g. p9, p10,...)
//      - PinMode:  PullUp, PullDown, PullNone, OpenDrain
//      - time:     defines the time after the longPress-Flag is set.
//
/******************************************************************************/
Button::Button(PinName pBtn, PinMode  pBtnMode, float time)
{
    fTime = time;
    pin = new DigitalIn(pBtn, pBtnMode);

    if(fTime > 0)
        timer = new Timeout;

    init();

}


/******************************************************************************/
// initialisation
//      - bNewState:        current state of button
//      - bOldState:        previous state of button
//      - bIsPressed:       flag is set if button is pressed
//      - bLongPresed:      flag is set, after timer is zero (bIsPressed = true)
//      - bWasPressed:      after button is not pressed anymore
//
/******************************************************************************/
void Button::init()
{
    bNewState   = false;
    bOldState   = false;    
    
    bIsPressed  = false;
    bLongPress  = false;
    bWasPressed = false;


    bBtnNewAction = false;

    iNumCycle = 0;
    if(fTime > 0)
        timer->detach();


    return;
}


/******************************************************************************/
// query the Button with debouncing
//      - bNewState:        current state of button
//      - bOldState:        previous state of button
//      - bBtnNewAction:    flag, if an action is occur
//      - iNumCycle:        cycle counter of same state
//      - NUNCYCLES:        max. value of cycle counter
//      - *iNumBtn:         pointer to variable, which counts the number of pressed buttons
//
/******************************************************************************/
void Button::polling(uint8_t *iNumBtn)
{
    bOldState   = bNewState;                                                    // bNewState gets the becomes the bOldstate
    bNewState   = (bool)pin->read();                                            // update bNewState
    bWasPressed = false;                                                        // reset the flag was pressed

    
    if(!bBtnNewAction and (bOldState != bNewState))                             // if there is a action (changing signal) on the button (btn), then rise the flag bBtnNewAction
        bBtnNewAction = true;
    

    if(bBtnNewAction) {                                                         // if flag ist true (new action on the button)

        if(bOldState == bNewState) {                                            // if current state equals previous state
            if(iNumCycle <= NUMCYCLE) {                                         // count the number of cycle unless the max. value is reached
                iNumCycle++;

            } else if(iNumCycle > NUMCYCLE) {                                   // else if the max. value is reached
                iNumCycle = 0;                                                  // reset the counter, there is no action any more expected
                bBtnNewAction = false;                                          // there is nomore new action.

                if(bNewState == PRESSED) {                                      // btn is pressed, then
                    bIsPressed = true;                                          // set this flag true
                    
                    if(iNumBtn != NULL)
                        (*iNumBtn)++;
                    
                    if(fTime > 0)                                                // if btn has a timer, 
                        timer->attach(callback(this, &Button::setLongPressFlag), fTime);
                        

                } else if(bNewState == NOT_PRESSED) {                           // if btn is not pressed, then
                    if(bIsPressed == true)                                      // if btn was pressed, then
                        bWasPressed = true;                                     // set this flag true
                    
                    bIsPressed = false;                                         // set this flag false
                    
                    if(fTime > 0)                                               // if btn has a timer, 
                        timer->detach();
                        bLongPress = false;
                        
                    if(iNumBtn != NULL && *iNumBtn > 0)                         // if there is a pointer to a counter-Variable and the value is greater than 0
                        (*iNumBtn)--;                                           // decrease iNumBtn by one 
                }

            }
        } else {
            iNumCycle = 0;
        }
    }

    return;
}


/******************************************************************************/
//
/******************************************************************************/
bool Button::isPressed()
{
    if(bIsPressed)  return true;
    else            return false;
}


/******************************************************************************/
//
/******************************************************************************/
bool Button::isLongPress()
{
    if(bLongPress)  return true;
    else            return false;

}


/******************************************************************************/
//
/******************************************************************************/
bool Button::wasPressed()
{
    if(bWasPressed) return true;
    else            return false;

}


/******************************************************************************/
//
/******************************************************************************/
void Button::setLongPressFlag(){
    bLongPress = true;
    timer->detach();
}