start implementing the new all-great tuerd
[saartuer.git] / libtuer.py
index 0df4051203cf8cad29da53d439dd263e39449922..60f491be2d8226035b382e78ff97c2784ca3066c 100644 (file)
@@ -1,4 +1,4 @@
-import logging, logging.handlers, syslog, os
+import logging, logging.handlers, os, time, queue, threading
 
 # logging function
 class Logger:
@@ -9,17 +9,25 @@ class Logger:
                self.logger.setLevel(logging.INFO)
                self.handler = logging.handlers.SysLogHandler(address = '/dev/log', facility = logging.handlers.SysLogHandler.LOG_LOCAL0)
                self.logger.addHandler(self.handler)
-       def log (self, what):
+       
+       def log (self, lvl, what):
                thestr = "%s[%d]: %s" % (self.name,os.getpid(),what)
                print (thestr)
-               self.logger.info(thestr)
+               self.logger.log(lvl, thestr)
+       
+       def debug(self, what):
+               self.log(logging.DEBUG, what)
+       def info(self, what):
+               self.log(logging.INFO, what)
+       def warning(self, what):
+               self.log(logging.WARNING, what)
+       def error(self, what):
+               self.log(logging.ERROR, what)
+       def critical(self, what):
+               self.log(logging.CRITICAL, what)
 
 logger = Logger()
 
-def log (what):
-       logger.log(what)
-
 # Threaded callback class
 class ThreadFunction():
        _CALL = 0
@@ -36,12 +44,15 @@ class ThreadFunction():
                        (cmd, data) = self._q.get()
                        # run command
                        if cmd == _CALL:
-                               self._f(*data)
+                               try:
+                                       self._f(*data)
+                               except Exception:
+                                       logger.error("ThreadFunction: Got exception out of handler thread: %s" % str(e))
                        elif cmd == _TERM:
                                assert data is None
                                break
                        else:
-                               raise NotImplementedError("Command %d does not exist" % cmd)
+                               logger.error("ThreadFunction: Command %d does not exist" % cmd)
        
        def __call__(self, *arg):
                self._q.put((self._CALL, arg))
@@ -49,3 +60,23 @@ class ThreadFunction():
        def stop(self):
                self._q.put((_TERM, None))
                self._t.join()
+
+# Thread timer-repeater class: Call a function every <sleep_time> seconds
+class ThreadRepeater():
+       def __init__(self, f, sleep_time):
+               self._f = f
+               self._stop = False
+               self._sleep_time = sleep_time
+               self._t = threading.Thread(target=self._thread_func)
+               self._t.start()
+       
+       def _thread_func():
+               while True:
+                       if self._stop:
+                               break
+                       self._f()
+                       time.sleep(sleep_time)
+       
+       def stop(self):
+               self._stop = True
+               self._t.join()