stepper-clock/Button.py
2020-03-19 22:34:50 +01:00

42 lines
1.7 KiB
Python

import machine
import time
class Button():
def __init__(self,pin,onPushDown = None, onPushUp = None,onClick = None,onHold = None,clickTime=300,debounceTimeMs = 50,inputMode = machine.Pin.IN,inverted = False):
self.pin = machine.Pin(pin,inputMode)
self.debounceTimestamp = -debounceTimeMs
self.debounceTimeMs = int(debounceTimeMs)
self.clickTime = clickTime
self.pushDownTimeStamp = -clickTime
self.setCallbacks(onPushDown,onPushUp,onClick,onHold)
self.pin.irq(trigger=machine.Pin.IRQ_RISING|machine.Pin.IRQ_FALLING , handler=self._IRQ)
self.value = self.pin.value()
self.inverted = inverted
def setCallbacks(self,onPushDown = None, onPushUp = None,onClick = None,onHold = None):
self.onPushDown = onPushDown
self.onPushUp = onPushUp
self.onClick = onClick
self.onHold = onHold
def _IRQ(self,p):
new_value = self.pin.value()
time_ms = time.ticks_ms()
if (self.value != new_value):
self.value = new_value
if ((self.debounceTimestamp+self.debounceTimeMs) < time_ms):
self.debounceTimestamp = time_ms
if (new_value ^ self.inverted):
if (self.onPushUp != None):
self.onPushUp()
if (self.onClick != None and (self.pushDownTimeStamp + self.clickTime > time_ms)):
self.onClick()
else:
if (self.onPushDown != None):
self.onPushDown()
self.pushDownTimeStamp = time_ms
else:
pass
def isPushed(self):
return not (self.pin.value() ^ self.inverted)