Files
HendiControlFirmware/Control/brewpi/timer.py
T
jens ebd27336cb - Timer: simplified stop()
git-svn-id: http://moon:8086/svn/projects/HendiControl@255 fda53097-d464-4ada-af97-ba876c37ca34
2019-04-23 09:04:20 +00:00

103 lines
2.1 KiB
Python

import time
import abc
class Timer(object):
def __init__(self, name='Timer', listener=None):
self.name = name
self.listener = listener
self.isActive = False
self.mode = 'periodic'
self.interval = 0
self.elapseTime = 0
self.count = 0
def start(self, interval, mode='periodic'):
now = time.time()
self.interval = interval
self.mode = mode
self.elapseTime = now + interval
self.isActive = self.elapseTime > now
pass
def stop(self):
self.isActive = False
self.count = 0
def __str__(self):
return self.name
class TimerListener(abc.ABC):
def __init__(self):
pass
@abc.abstractmethod
def onTimer(self, timer):
pass
class TimerManager(object):
def __init__(self):
self.timers = []
pass
def registerTimer(self, timer):
self.timers.append(timer)
def process(self):
for timer in self.timers:
now = time.time()
if timer.isActive:
if timer.elapseTime <= now:
if timer.listener:
if 'periodic' in timer.mode:
timer.start(timer.interval)
timer.listener.onTimer(timer)
timer.count += 1
def getMinTimeout(self):
minTimeout = None
timeouts = []
for timer in self.timers:
now = time.time()
if timer.isActive:
timeout = max(0, timer.elapseTime-now)
timeouts.append(timeout)
if len(timeouts) > 0:
minTimeout = min(timeouts)
return minTimeout
if __name__ == '__main__':
class Test (TimerListener):
def __init__(self):
self.timerMgr = TimerManager()
self.timer200 = Timer('Timer 200', self)
self.timer500 = Timer('Timer 500', self)
self.timer1000 = Timer('Timer 1000', self)
self.timerMgr.registerTimer(self.timer200)
self.timerMgr.registerTimer(self.timer500)
self.timerMgr.registerTimer(self.timer1000)
self.timer200.start(0.200)
self.timer500.start(0.500)
self.timer1000.start(1.000)
pass
def onTimer(self, timer):
print ("{}, Count: {}".format(timer, timer.count))
if timer.count == 30:
timer.stop()
def run(self):
while(True):
wait = self.timerMgr.getMinTimeout()
if wait is None:
break
time.sleep(wait)
self.timerMgr.process()
test = Test()
test.run()