Skip to content

Commit f5b709f

Browse files
committed
Optimization of keyscan.py
1 parent 955654d commit f5b709f

File tree

1 file changed

+45
-30
lines changed

1 file changed

+45
-30
lines changed

libraries/keyscan/keyscan.py

+45-30
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,32 @@
2323

2424
def 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

Comments
 (0)