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:
Sun Oct 23 09:36:27 2016 +0000
Revision:
0:45e3ec3004a6
Child:
2:08137bac3611
Child:
5:9198c5c0afcb
???;

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 0:45e3ec3004a6 14 _onEdge = 0;
suupen 0:45e3ec3004a6 15 _offEdge = 0;
suupen 0:45e3ec3004a6 16 _levelNow = 1;
suupen 0:45e3ec3004a6 17 _levelOld = 1;
suupen 0:45e3ec3004a6 18
suupen 0:45e3ec3004a6 19 _sw.mode(PullUp);
suupen 0:45e3ec3004a6 20
suupen 0:45e3ec3004a6 21 _sw.rise(this, &DigitalSw::swLevelUp);
suupen 0:45e3ec3004a6 22 _sw.fall(this, &DigitalSw::swLevelDown);
suupen 0:45e3ec3004a6 23
suupen 0:45e3ec3004a6 24
suupen 0:45e3ec3004a6 25 }
suupen 0:45e3ec3004a6 26
suupen 0:45e3ec3004a6 27 void DigitalSw::reset(void)
suupen 0:45e3ec3004a6 28 {
suupen 0:45e3ec3004a6 29 _onEdge = 0;
suupen 0:45e3ec3004a6 30 _offEdge = 0;
suupen 0:45e3ec3004a6 31 _levelNow = 1;
suupen 0:45e3ec3004a6 32 _levelOld = 1;
suupen 0:45e3ec3004a6 33 }
suupen 0:45e3ec3004a6 34
suupen 0:45e3ec3004a6 35 int16_t DigitalSw::getLevel(void)
suupen 0:45e3ec3004a6 36 {
suupen 0:45e3ec3004a6 37 return !_levelNow;
suupen 0:45e3ec3004a6 38 }
suupen 0:45e3ec3004a6 39
suupen 0:45e3ec3004a6 40 int16_t DigitalSw::getOnEdge(void)
suupen 0:45e3ec3004a6 41 {
suupen 0:45e3ec3004a6 42 int16_t ans = _onEdge;
suupen 0:45e3ec3004a6 43 _onEdge = 0;
suupen 0:45e3ec3004a6 44
suupen 0:45e3ec3004a6 45 return ans;
suupen 0:45e3ec3004a6 46 }
suupen 0:45e3ec3004a6 47
suupen 0:45e3ec3004a6 48 int16_t DigitalSw::getOffEdge(void)
suupen 0:45e3ec3004a6 49 {
suupen 0:45e3ec3004a6 50 int16_t ans = _offEdge;
suupen 0:45e3ec3004a6 51 _offEdge = 0;
suupen 0:45e3ec3004a6 52
suupen 0:45e3ec3004a6 53 return ans;
suupen 0:45e3ec3004a6 54 }
suupen 0:45e3ec3004a6 55
suupen 0:45e3ec3004a6 56
suupen 0:45e3ec3004a6 57
suupen 0:45e3ec3004a6 58 void DigitalSw::swLevelUp(void)
suupen 0:45e3ec3004a6 59 {
suupen 0:45e3ec3004a6 60 uint8_t levelCheck = 0xaa;
suupen 0:45e3ec3004a6 61
suupen 0:45e3ec3004a6 62 while((levelCheck != 0x00) && (levelCheck != 0xff)) {
suupen 0:45e3ec3004a6 63 levelCheck = (levelCheck << 1) | _sw.read();
suupen 0:45e3ec3004a6 64 }
suupen 0:45e3ec3004a6 65
suupen 0:45e3ec3004a6 66 if(levelCheck == 0xff) {
suupen 0:45e3ec3004a6 67 _levelOld = _levelNow;
suupen 0:45e3ec3004a6 68 _levelNow = 1;
suupen 0:45e3ec3004a6 69
suupen 0:45e3ec3004a6 70
suupen 0:45e3ec3004a6 71 if(_levelOld == 0) {
suupen 0:45e3ec3004a6 72 _offEdge |= 1;
suupen 0:45e3ec3004a6 73 }
suupen 0:45e3ec3004a6 74 }
suupen 0:45e3ec3004a6 75 }
suupen 0:45e3ec3004a6 76
suupen 0:45e3ec3004a6 77 void DigitalSw::swLevelDown(void)
suupen 0:45e3ec3004a6 78 {
suupen 0:45e3ec3004a6 79 uint8_t levelCheck = 0xaa;
suupen 0:45e3ec3004a6 80
suupen 0:45e3ec3004a6 81 while((levelCheck != 0x00) && (levelCheck != 0xff)) {
suupen 0:45e3ec3004a6 82 levelCheck = (levelCheck << 1) | _sw.read();
suupen 0:45e3ec3004a6 83 }
suupen 0:45e3ec3004a6 84
suupen 0:45e3ec3004a6 85 if(levelCheck == 0x00) {
suupen 0:45e3ec3004a6 86 _levelOld = _levelNow;
suupen 0:45e3ec3004a6 87 _levelNow = 0;
suupen 0:45e3ec3004a6 88
suupen 0:45e3ec3004a6 89
suupen 0:45e3ec3004a6 90 if(_levelOld == 1) {
suupen 0:45e3ec3004a6 91 _onEdge |= 1;
suupen 0:45e3ec3004a6 92 }
suupen 0:45e3ec3004a6 93 }
suupen 0:45e3ec3004a6 94 }
suupen 0:45e3ec3004a6 95