-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathKeyPanel.cpp
More file actions
104 lines (90 loc) · 2.45 KB
/
Copy pathKeyPanel.cpp
File metadata and controls
104 lines (90 loc) · 2.45 KB
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
#include "KeyPanel.h"
#include "mbed.h"
#include "System.h"
bool KeyPanel::trigger = 0;
bool KeyPanel::Multi_enable = 1;
KeyPanel::KeyPanel(PinName *map,KeyName *map_value,uint8_t len)
{
prevalue=KEY_NO_KEY;
prestate=NO_KEY;
NumKey=len;
//assert(sizeof(map)==sizeof(map_value)/sizeof(KeyName));
this->map = map;
this->map_value = map_value;
}
uint8_t KeyPanel::read()
{
value=KEY_NO_KEY;//
value_multi=KEY_NO_KEY;//
state=NO_KEY;
for(char i=0 ; i < NumKey ; i++ )
{
//Scan Key one by one
if(!(trigger ^ DigitalIn(*(map+i)).read()))
{
if(value == KEY_NO_KEY)
value=*(map_value+i);
else if(Multi_enable)
{
//scan multi Key
value_multi=*(map_value+i);
state=MULTI_KEY;
prestate=state;
return state;
}
}
}
if(prestate==MULTI_KEY)
{
if(!value)
{
count=1;
prestate=NO_KEY;
prevalue=KEY_NO_KEY;
}
state=NO_KEY;
return state;
}
if(!prevalue&&!value)
state=NO_KEY;
else if(prevalue!=value)
{
if(prestate!=HOLD_KEY && prestate!=FIRST_KEY)
state=FIRST_KEY;
else
{
value=prevalue;
state=RELEASE_KEY;
prevalue=KEY_NO_KEY;
prestate=state;
wait_ms(1);//debounce for first trigged
return state;
}
}
else if(prevalue==value)
state=HOLD_KEY;
prevalue=value;
prestate=state;
return state;
}
void KeyPanel::transMultiKey(KeyName value1,KeyName value2,KeyName transfer)
{
if(state!=MULTI_KEY)
{
count=1;
return;
}
if((value1==value || value2==value)&&(value1==value_multi || value2==value_multi))
{
value=transfer;
if(count)
{
state=FIRST_KEY;
count=0;
}
else
{
state=HOLD_KEY;
}
}
}