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:
Sat Oct 29 01:46:17 2016 +0000
Revision:
5:9198c5c0afcb
Parent:
0:45e3ec3004a6
sw input use interrupt.; pullup/pulldown setting.

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