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

Committer:
suupen
Date:
Thu Oct 27 06:35:32 2016 +0000
Revision:
3:ea853fc7172d
Parent:
2:08137bac3611
This commit is PinMode(PullUp or PullDown) select

Who changed what in which revision?

UserRevisionLine numberNew contents of line
suupen 0:45e3ec3004a6 1 /**
suupen 0:45e3ec3004a6 2 * digital Sw Library
suupen 0:45e3ec3004a6 3 */
suupen 0:45e3ec3004a6 4
suupen 0:45e3ec3004a6 5 #include "DigitalSw.h"
suupen 0:45e3ec3004a6 6
suupen 0:45e3ec3004a6 7 /**
suupen 0:45e3ec3004a6 8 *
suupen 0:45e3ec3004a6 9 */
suupen 3:ea853fc7172d 10 DigitalSw::DigitalSw(PinName sw, PinMode pull = PullUp
suupen 3:ea853fc7172d 11 ) : _sw(sw), _pull(pull)
suupen 0:45e3ec3004a6 12 {
suupen 0:45e3ec3004a6 13
suupen 2:08137bac3611 14 reset();
suupen 3:ea853fc7172d 15 _sw.mode(_pull);
suupen 0:45e3ec3004a6 16
suupen 2:08137bac3611 17 _swCheckPeriod.attach_us(this, &DigitalSw::swCheck, 10000);
suupen 2:08137bac3611 18
suupen 2:08137bac3611 19
suupen 0:45e3ec3004a6 20
suupen 0:45e3ec3004a6 21
suupen 0:45e3ec3004a6 22 }
suupen 0:45e3ec3004a6 23
suupen 0:45e3ec3004a6 24 void DigitalSw::reset(void)
suupen 0:45e3ec3004a6 25 {
suupen 0:45e3ec3004a6 26 _onEdge = 0;
suupen 0:45e3ec3004a6 27 _offEdge = 0;
suupen 2:08137bac3611 28 _levelNow = 0;
suupen 2:08137bac3611 29 _levelOld = 0;
suupen 0:45e3ec3004a6 30 }
suupen 0:45e3ec3004a6 31
suupen 0:45e3ec3004a6 32 int16_t DigitalSw::getLevel(void)
suupen 0:45e3ec3004a6 33 {
suupen 2:08137bac3611 34 return _levelNow;
suupen 0:45e3ec3004a6 35 }
suupen 0:45e3ec3004a6 36
suupen 0:45e3ec3004a6 37 int16_t DigitalSw::getOnEdge(void)
suupen 0:45e3ec3004a6 38 {
suupen 0:45e3ec3004a6 39 int16_t ans = _onEdge;
suupen 0:45e3ec3004a6 40 _onEdge = 0;
suupen 0:45e3ec3004a6 41
suupen 0:45e3ec3004a6 42 return ans;
suupen 0:45e3ec3004a6 43 }
suupen 0:45e3ec3004a6 44
suupen 0:45e3ec3004a6 45 int16_t DigitalSw::getOffEdge(void)
suupen 0:45e3ec3004a6 46 {
suupen 0:45e3ec3004a6 47 int16_t ans = _offEdge;
suupen 0:45e3ec3004a6 48 _offEdge = 0;
suupen 0:45e3ec3004a6 49
suupen 0:45e3ec3004a6 50 return ans;
suupen 0:45e3ec3004a6 51 }
suupen 0:45e3ec3004a6 52
suupen 2:08137bac3611 53 void DigitalSw::swCheck(void)
suupen 0:45e3ec3004a6 54 {
suupen 2:08137bac3611 55 static uint8_t levelBuffer = 0;
suupen 2:08137bac3611 56
suupen 3:ea853fc7172d 57 if(_pull == PullUp){
suupen 2:08137bac3611 58 levelBuffer = (levelBuffer << 1) | !_sw;
suupen 3:ea853fc7172d 59 }
suupen 3:ea853fc7172d 60 else{
suupen 3:ea853fc7172d 61 levelBuffer = (levelBuffer << 1) | _sw;
suupen 3:ea853fc7172d 62 }
suupen 0:45e3ec3004a6 63
suupen 2:08137bac3611 64 if(levelBuffer == 0x00) {
suupen 2:08137bac3611 65 _levelNow = 0;
suupen 2:08137bac3611 66 } else if(levelBuffer == 0xff) {
suupen 2:08137bac3611 67 _levelNow = 1;
suupen 0:45e3ec3004a6 68 }
suupen 0:45e3ec3004a6 69
suupen 2:08137bac3611 70 if((_levelOld == 0 ) && (_levelNow == 1)) {
suupen 0:45e3ec3004a6 71 _levelOld = _levelNow;
suupen 2:08137bac3611 72 _onEdge |= 1;
suupen 2:08137bac3611 73 } else if((_levelOld == 1 ) && (_levelNow == 0)) {
suupen 2:08137bac3611 74 _levelOld = _levelNow;
suupen 2:08137bac3611 75 _offEdge |= 1;
suupen 2:08137bac3611 76 }
suupen 0:45e3ec3004a6 77
suupen 0:45e3ec3004a6 78 }
suupen 0:45e3ec3004a6 79