timerreset.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. """
  2. SleekXMPP: The Sleek XMPP Library
  3. Implementation of xeps for Internet of Things
  4. http://wiki.xmpp.org/web/Tech_pages/IoT_systems
  5. Copyright (C) 2013 Sustainable Innovation, Joachim.lindborg@sust.se, bjorn.westrom@consoden.se
  6. This file is part of SleekXMPP.
  7. See the file LICENSE for copying permission.
  8. """
  9. from threading import Thread, Event, Timer
  10. import time
  11. def TimerReset(*args, **kwargs):
  12. """ Global function for Timer """
  13. return _TimerReset(*args, **kwargs)
  14. class _TimerReset(Thread):
  15. """Call a function after a specified number of seconds:
  16. t = TimerReset(30.0, f, args=[], kwargs={})
  17. t.start()
  18. t.cancel() # stop the timer's action if it's still waiting
  19. """
  20. def __init__(self, interval, function, args=None, kwargs=None):
  21. if not kwargs:
  22. kwargs = {}
  23. if not args:
  24. args = []
  25. Thread.__init__(self)
  26. self.interval = interval
  27. self.function = function
  28. self.args = args
  29. self.kwargs = kwargs
  30. self.finished = Event()
  31. self.resetted = True
  32. def cancel(self):
  33. """Stop the timer if it hasn't finished yet"""
  34. self.finished.set()
  35. def run(self):
  36. #print "Time: %s - timer running..." % time.asctime()
  37. while self.resetted:
  38. #print "Time: %s - timer waiting for timeout in %.2f..." % (time.asctime(), self.interval)
  39. self.resetted = False
  40. self.finished.wait(self.interval)
  41. if not self.finished.isSet():
  42. self.function(*self.args, **self.kwargs)
  43. self.finished.set()
  44. #print "Time: %s - timer finished!" % time.asctime()
  45. def reset(self, interval=None):
  46. """ Reset the timer """
  47. if interval:
  48. #print "Time: %s - timer resetting to %.2f..." % (time.asctime(), interval)
  49. self.interval = interval
  50. else:
  51. #print "Time: %s - timer resetting..." % time.asctime()
  52. pass
  53. self.resetted = True
  54. self.finished.set()
  55. self.finished.clear()