This library is push button or dipSw noise cancel and on/off edge recognition

Dependents:   led-sound_checker clockGenerator

Fork of DigitalSw by suu pen

sample program "DigitalSW_hello" https://developer.mbed.org/users/suupen/code/DigitalSW_hello/rev/ffa16c2a347f

DigitalSw.cpp

Committer:
suupen
Date:
2016-10-27
Revision:
2:08137bac3611
Parent:
0:45e3ec3004a6
Child:
3:ea853fc7172d

File content as of revision 2:08137bac3611:

/**
 * digital Sw Library
 */

#include "DigitalSw.h"

/**
 *
 */
DigitalSw::DigitalSw(PinName sw
                    ) : _sw(sw)
{

    reset();
    _sw.mode(PullUp);

    _swCheckPeriod.attach_us(this, &DigitalSw::swCheck, 10000);




}

void DigitalSw::reset(void)
{
    _onEdge = 0;
    _offEdge = 0;
    _levelNow = 0;
    _levelOld = 0;
}

int16_t DigitalSw::getLevel(void)
{
    return _levelNow;
}

int16_t DigitalSw::getOnEdge(void)
{
    int16_t ans = _onEdge;
    _onEdge = 0;

    return ans;
}

int16_t DigitalSw::getOffEdge(void)
{
    int16_t ans = _offEdge;
    _offEdge = 0;

    return ans;
}

void DigitalSw::swCheck(void)
{
    static uint8_t levelBuffer = 0;

    levelBuffer = (levelBuffer << 1) | !_sw;

    if(levelBuffer == 0x00) {
        _levelNow = 0;
    } else if(levelBuffer == 0xff) {
        _levelNow = 1;
    }

    if((_levelOld == 0 ) && (_levelNow == 1)) {
        _levelOld = _levelNow;
        _onEdge |= 1;
    } else         if((_levelOld == 1 ) && (_levelNow == 0)) {
        _levelOld = _levelNow;
        _offEdge |= 1;
    }

}