kopia lustrzana https://github.com/peterhinch/micropython-samples
43 wiersze
1.9 KiB
Python
43 wiersze
1.9 KiB
Python
# A time delay class for the micropython board. Based on the scheduler class. 24th Aug 2014
|
|
# Author: Peter Hinch
|
|
# V1.0 25th Aug 2014
|
|
# Used by Pushbutton library.
|
|
# This class implements the software equivalent of a retriggerable monostable. When first instantiated
|
|
# a delay object does nothing until it trigger method is called. It then enters a running state until
|
|
# the specified time elapses when it calls the optional callback function and stops running.
|
|
# A running delay may be retriggered by calling its trigger function: its time to run is now specified
|
|
# by the passed value.
|
|
|
|
# The usual caveats re microsheduler time periods applies: if you need millisecond accuracy
|
|
# (or better) use a hardware timer. Times can easily be -0 +20mS or more, depending on other threads
|
|
|
|
from usched import Sched, microsWhen, seconds, after, microsUntil, Timeout
|
|
|
|
class Delay(object):
|
|
def __init__(self, objSched, callback = None, callback_args = ()):
|
|
self.objSched = objSched
|
|
self.callback = callback
|
|
self.callback_args = callback_args
|
|
self._running = False
|
|
|
|
def stop(self):
|
|
self._running = False
|
|
|
|
def trigger(self, duration):
|
|
self.tstop = microsWhen(seconds(duration)) # Update end time
|
|
if not self._running: # Start a thread which stops the
|
|
self.objSched.add_thread(self.killer()) # delay after its period has elapsed
|
|
self._running = True
|
|
|
|
def running(self):
|
|
return self._running
|
|
|
|
def killer(self):
|
|
to = Timeout(1) # Initial value is arbitrary
|
|
while not after(self.tstop): # Might have been retriggered
|
|
yield to._ussetdelay(microsUntil(self.tstop))
|
|
if self._running and self.callback:
|
|
self.callback(*self.callback_args)
|
|
self._running = False
|
|
|