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 02:03:28 2016 +0000
Revision:
2:08137bac3611
Parent:
0:45e3ec3004a6
Child:
3:ea853fc7172d
sw level capture is ticker(10ms) before DigitalInterrupt

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 0:45e3ec3004a6 10 DigitalSw::DigitalSw(PinName sw
suupen 0:45e3ec3004a6 11 ) : _sw(sw)
suupen 0:45e3ec3004a6 12 {
suupen 0:45e3ec3004a6 13
suupen 2:08137bac3611 14 reset();
suupen 0:45e3ec3004a6 15 _sw.mode(PullUp);
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 2:08137bac3611 57 levelBuffer = (levelBuffer << 1) | !_sw;
suupen 0:45e3ec3004a6 58
suupen 2:08137bac3611 59 if(levelBuffer == 0x00) {
suupen 2:08137bac3611 60 _levelNow = 0;
suupen 2:08137bac3611 61 } else if(levelBuffer == 0xff) {
suupen 2:08137bac3611 62 _levelNow = 1;
suupen 0:45e3ec3004a6 63 }
suupen 0:45e3ec3004a6 64
suupen 2:08137bac3611 65 if((_levelOld == 0 ) && (_levelNow == 1)) {
suupen 0:45e3ec3004a6 66 _levelOld = _levelNow;
suupen 2:08137bac3611 67 _onEdge |= 1;
suupen 2:08137bac3611 68 } else if((_levelOld == 1 ) && (_levelNow == 0)) {
suupen 2:08137bac3611 69 _levelOld = _levelNow;
suupen 2:08137bac3611 70 _offEdge |= 1;
suupen 2:08137bac3611 71 }
suupen 0:45e3ec3004a6 72
suupen 0:45e3ec3004a6 73 }
suupen 0:45e3ec3004a6 74