This library is togle sw on/off edge and level decision. input sw level noise and chatting cancel. MDX-20 controler用

Fork of DigitalSw by suu pen

Committer:
suupen
Date:
Sun Dec 11 07:32:41 2016 +0000
Revision:
7:b8d12d3d6ff0
Parent:
6:55845c4ef887
?????????????????;

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