2323
2424def key_evt_thread_entry ():
2525 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 )
2852
2953_thread .start_new_thread (key_evt_thread_entry , ())
3054
@@ -35,15 +59,25 @@ class Event():
3559 RELEASED = 0x02
3660 LONG_PRESSED = 0x04
3761
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+
3870 class Error (Exception ):
3971 def __init__ (self , value ):
4072 self .value = value
4173
4274 def __str__ (self ):
4375 return repr (self .value )
4476
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 = []):
4678 self .pin = pin
79+ self .work_mode = work_mode
80+ self .debounse_ms = debounse_ms
4781 if level_on_pressed == 0 :
4882 self .exti_pull = ExtInt .PULL_PU
4983 if cared_event == self .Event .PRESSED :
@@ -80,36 +114,17 @@ def timer_cb(self, args):
80114 self .sec += 1
81115 for n in self .long_press_event :
82116 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 ))
84118 break
85119
86120 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 ))
92123
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 ()
112126
127+ def enable (self ):
113128 self .exti = ExtInt (self .pin , self .exti_trigger_mode , self .exti_pull , self .exit_cb )
114129 self .exti .enable ()
115130
@@ -125,5 +140,5 @@ def event_cb(k, event):
125140 else :
126141 print ("%s is pressed for %d seconds" % ("k1" if k .pin == k1 else "k2" , k .sec ))
127142
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