-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathDetectEdge.h
111 lines (93 loc) · 2.11 KB
/
DetectEdge.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#ifndef DETECTEDGE_H
#define DETECTEDGE_H
#include <WProgram.h>
#include "Core.h"
class DetectEdge {
public:
DetectEdge(us8 pin = 0, bool activeLow = true)
{
pPin = pin;
pActiveLow = activeLow;
pPreviousState = activeLow;
pRisingFlag = false;
pFallingFlag = false;
pTime = 0;
pPreviousTime = 0;
}
void scan()
{
bool input = digitalRead(pPin);
bool stateChanged = false;
if(pActiveLow) {
input ^= 1;
}
if(input == 0 && pPreviousState != 0) {
pRisingFlag = false;
pFallingFlag = true;
stateChanged = true;
}
else if(input == 1 && pPreviousState != 1) {
pRisingFlag = true;
pFallingFlag = false;
stateChanged = true;
}
if(stateChanged) {
pPreviousState = input;
pPreviousTime = pTime;
pTime = millis();
}
}
void clear()
{
scan();
pRisingFlag = false;
pFallingFlag = false;
}
bool rising()
{
bool state = pRisingFlag;
pRisingFlag = false;
return state;
}
bool falling()
{
bool state = pFallingFlag;
pFallingFlag = false;
return state;
}
bool isRisen()
{
return pActiveLow ? !digitalRead(pPin) : digitalRead(pPin);
}
bool isFallen()
{
return pActiveLow ? digitalRead(pPin) : !digitalRead(pPin);
}
void setRising()
{
pRisingFlag = true;
pFallingFlag = false;
}
void setFalling()
{
pRisingFlag = false;
pFallingFlag = true;
}
unsigned long time()
{
return pTime;
}
unsigned long previousTime()
{
return pPreviousTime;
}
private:
us8 pPin;
bool pActiveLow;
bool pPreviousState;
bool pRisingFlag;
bool pFallingFlag;
unsigned long pTime;
unsigned long pPreviousTime;
};
#endif // DETECTEDGE_H