58 lines
1.7 KiB
Python
58 lines
1.7 KiB
Python
#
|
|
# inspired by: https://forum.micropython.org/viewtopic.php?t=1938#p10931
|
|
#
|
|
import micropython
|
|
|
|
try:
|
|
from machine import Timer
|
|
timer_init = lambda t, p, cb: t.init(period=p, callback=cb)
|
|
except ImportError:
|
|
from pyb import Timer
|
|
timer_init = lambda t, p, cb: t.init(freq=1000 // p, callback=cb)
|
|
|
|
# uncomment when debugging callback problems
|
|
#micropython.alloc_emergency_exception_buf(100)
|
|
|
|
|
|
class DebouncedSwitch:
|
|
def __init__(self, sw, cb, arg=None, delay=50, tid=4):
|
|
self.sw = sw
|
|
# Create references to bound methods beforehand
|
|
# http://docs.micropython.org/en/latest/pyboard/library/micropython.html#micropython.schedule
|
|
self._sw_cb = self.sw_cb
|
|
self._tim_cb = self.tim_cb
|
|
self._set_cb = getattr(self.sw, 'callback', None) or self.sw.irq
|
|
self.delay = delay
|
|
self.tim = Timer(tid)
|
|
self.callback(cb, arg)
|
|
|
|
def sw_cb(self, pin=None):
|
|
self._set_cb(None)
|
|
timer_init(self.tim, self.delay, self._tim_cb)
|
|
|
|
def tim_cb(self, tim):
|
|
tim.deinit()
|
|
if self.sw():
|
|
micropython.schedule(self.cb, self.arg)
|
|
self._set_cb(self._sw_cb if self.cb else None)
|
|
|
|
def callback(self, cb, arg=None):
|
|
self.tim.deinit()
|
|
self.cb = cb
|
|
self.arg = arg
|
|
self._set_cb(self._sw_cb if cb else None)
|
|
|
|
|
|
def test_pyb(ledno=1):
|
|
import pyb
|
|
sw = pyb.Switch()
|
|
led = pyb.LED(ledno)
|
|
return DebouncedSwitch(sw, lambda l: l.toggle(), led)
|
|
|
|
|
|
def test_machine(swpin=2, ledpin=16):
|
|
from machine import Pin
|
|
sw = Pin(swpin, Pin.IN)
|
|
led = Pin(ledpin, Pin.OUT)
|
|
return DebouncedSwitch(sw, lambda l: l.value(not l.value()), led)
|