ulib/man_key/man_key.py
python
EVT_KEY_DOWN = 0x01
EVT_KEY_UP = 0x02
EVT_CLICK = 0x03
EVT_DBL_CLICK =0x04
EVT_PRESSING=0x05
EVT_LONG_CLICK=0x06
STT_IDLE= 0
STT_WAITING_CLICK_UP= 1
STT_WAITING_DBL_CLICK_DOWN= 2
STT_WAITING_DBL_CLICK_UP= 3
STT_LONG_PRESSING= 10
class ManKey():
getKeyboardMask=0;
postEvent=0;
def __init__(self, inx):
self.m_inx = inx
self.m_state = STT_IDLE
self.m_downMs = 0
def setIndex(self,inx):
self.m_inx = inx
def onTick(self,ms):
keyPressState = ManKey.getKeyboardMask(self.m_inx)
if self.m_state==STT_IDLE:
if keyPressState == 1:
self.m_downMs = ms;
ManKey.postEvent(ms,EVT_KEY_DOWN,self.m_inx)
self.m_state = STT_WAITING_CLICK_UP;
elif self.m_state==STT_WAITING_CLICK_UP:
if ms - self.m_downMs > 300:
ManKey.postEvent(ms,EVT_PRESSING,self.m_inx)
self.m_pressingCount = 1
self.m_state = STT_LONG_PRESSING;
elif keyPressState == 0:
self.m_state = STT_WAITING_DBL_CLICK_DOWN
elif self.m_state==STT_WAITING_DBL_CLICK_DOWN:
if ms - self.m_downMs > 400:
ManKey.postEvent(ms,EVT_CLICK,self.m_inx)
ManKey.postEvent(ms,EVT_KEY_UP,self.m_inx)
self.m_state = STT_IDLE;
elif keyPressState==1:
self.m_state = STT_WAITING_DBL_CLICK_UP
elif self.m_state==STT_WAITING_DBL_CLICK_UP:
if keyPressState==0:
ManKey.postEvent(ms, EVT_DBL_CLICK,self.m_inx);
ManKey.postEvent(ms, EVT_KEY_UP,self.m_inx);
self.m_state = STT_IDLE;
elif self.m_state==STT_LONG_PRESSING:
if keyPressState==0:
ManKey.postEvent(ms, EVT_LONG_CLICK,self.m_inx);
ManKey.postEvent(ms, EVT_KEY_UP,self.m_inx);
self.m_state = STT_IDLE;
elif ms - self.m_downMs > 300 + self.m_pressingCount * 100:
ManKey.postEvent(ms, EVT_PRESSING,self.m_inx);
self.m_pressingCount= self.m_pressingCount+1
main.py
python
from machine import Pin
import utime
from ulib.man_key.man_key import ManKey
key = Pin(0, Pin.IN, Pin.PULL_UP)
led = Pin(2, Pin.OUT)
def getKeyboardMask(inx):
if key.value()==0:
return 1
else:
return 0
def postEvent(ms,evtType,inx):
print(f'{ms}:',end="")
if evtType==1:
print("按下")
elif evtType==2:
print("抬起")
elif evtType==3:
print("单击")
elif evtType==4:
print("双击")
elif evtType==5:
print("长按")
elif evtType==6:
print("长击")
ManKey.getKeyboardMask=getKeyboardMask
ManKey.postEvent=postEvent
mk= ManKey(1)
if __name__ == '__main__':
while True:
ms=utime.ticks_ms()
mk.onTick(ms)
测试
bash
>>> %Run -c $EDITOR_CONTENT
287004:按下
287405:单击
287405:抬起
288258:按下
288559:长按
288659:长按