23
23
24
24
def key_evt_thread_entry ():
25
25
while True :
26
- self , event = key_evt_queue .get ()
27
- self .event_cb (self , event )
26
+ self , msg_type , args = key_evt_queue .get ()
27
+
28
+ if msg_type == self .MsgType .MSG_TYPE_EXIT_CB :
29
+ sleep_ms (self .debounse_ms )
30
+ gpio = Pin (args [0 ], Pin .IN , Pin .PULL_PU , 1 )
31
+ level = gpio .read ()
32
+ event = None
33
+
34
+ if level == self .level_on_pressed :
35
+ event = self .Event .PRESSED
36
+ else :
37
+ event = self .Event .RELEASED
38
+
39
+ if event & self .cared_event :
40
+ self .event_cb (self , event )
41
+
42
+ if event == self .Event .PRESSED :
43
+ self .sec = 0
44
+ self .timer .start (1000 , 1 , self .timer_cb )
45
+ else :
46
+ self .timer .stop ()
47
+
48
+ if self .work_mode == self .WorkMode .CONTINUOUS :
49
+ self .enable ()
50
+ else :
51
+ self .event_cb (self , args )
28
52
29
53
_thread .start_new_thread (key_evt_thread_entry , ())
30
54
@@ -35,15 +59,25 @@ class Event():
35
59
RELEASED = 0x02
36
60
LONG_PRESSED = 0x04
37
61
62
+ class MsgType ():
63
+ MSG_TYPE_EXIT_CB = 0x01
64
+ MSG_TYPE_TIMER_CB = 0x02
65
+
66
+ class WorkMode ():
67
+ ONE_SHOT = 0x01
68
+ CONTINUOUS = 0x02
69
+
38
70
class Error (Exception ):
39
71
def __init__ (self , value ):
40
72
self .value = value
41
73
42
74
def __str__ (self ):
43
75
return repr (self .value )
44
76
45
- def __init__ (self , pin , level_on_pressed , cared_event , event_cb , long_press_event = []):
77
+ def __init__ (self , pin , work_mode , debounse_ms , level_on_pressed , cared_event , event_cb , long_press_event = []):
46
78
self .pin = pin
79
+ self .work_mode = work_mode
80
+ self .debounse_ms = debounse_ms
47
81
if level_on_pressed == 0 :
48
82
self .exti_pull = ExtInt .PULL_PU
49
83
if cared_event == self .Event .PRESSED :
@@ -80,36 +114,17 @@ def timer_cb(self, args):
80
114
self .sec += 1
81
115
for n in self .long_press_event :
82
116
if self .sec == n :
83
- key_evt_queue .put ((self , self .Event .LONG_PRESSED ))
117
+ key_evt_queue .put ((self , self .MsgType . MSG_TYPE_TIMER_CB , self . Event .LONG_PRESSED ))
84
118
break
85
119
86
120
def exit_cb (self , args ):
87
- self .exti .disable ()
88
- sleep_ms (20 )
89
- gpio = Pin (args [0 ], Pin .IN , Pin .PULL_PU , 1 )
90
- level = gpio .read ()
91
- event = None
121
+ self .disable ()
122
+ key_evt_queue .put ((self , self .MsgType .MSG_TYPE_EXIT_CB , args ))
92
123
93
- if self .level_on_pressed == 0 :
94
- if level == 0 :
95
- event = self .Event .PRESSED
96
- else :
97
- event = self .Event .RELEASED
98
- else :
99
- if level == 1 :
100
- event = self .Event .PRESSED
101
- else :
102
- event = self .Event .RELEASED
103
-
104
- if event & self .cared_event :
105
- key_evt_queue .put ((self , event ))
106
-
107
- if event == self .Event .PRESSED :
108
- self .sec = 0
109
- self .timer .start (1000 , 1 , self .timer_cb )
110
- else :
111
- self .timer .stop ()
124
+ def disable (self ):
125
+ self .exti .disable ()
112
126
127
+ def enable (self ):
113
128
self .exti = ExtInt (self .pin , self .exti_trigger_mode , self .exti_pull , self .exit_cb )
114
129
self .exti .enable ()
115
130
@@ -125,5 +140,5 @@ def event_cb(k, event):
125
140
else :
126
141
print ("%s is pressed for %d seconds" % ("k1" if k .pin == k1 else "k2" , k .sec ))
127
142
128
- Key (k1 , 0 , Key .Event .PRESSED | Key .Event .RELEASED , event_cb )
129
- Key (k2 , 0 , Key .Event .PRESSED | Key .Event .RELEASED , event_cb , [2 , 4 , 6 ])
143
+ Key (k1 , Key . WorkMode . CONTINUOUS , 20 , 0 , Key .Event .PRESSED | Key .Event .RELEASED , event_cb )
144
+ Key (k2 , Key . WorkMode . CONTINUOUS , 20 , 0 , Key .Event .PRESSED | Key .Event .RELEASED , event_cb , [2 , 4 , 6 ])
0 commit comments