# HG changeset patch # User darius # Date 1190640675 0 # Node ID 618372f83862259ea397728a0e97434a6e99237e # Parent f197f6716cd67e2f1a087449a729e480a0df0757 Wait on a condition var instead of using time.sleep() - this works better with signals in a multithreaded environment (ie the signal will interrupt the wait) A few other misc tidy ups. diff -r f197f6716cd6 -r 618372f83862 beermon.py --- a/beermon.py Mon Sep 24 04:05:52 2007 +0000 +++ b/beermon.py Mon Sep 24 13:31:15 2007 +0000 @@ -4,7 +4,7 @@ # Monitor & control fermenter temperature # v1.0 # -# $Id: beermon.py,v 1.2 2007/09/24 04:05:52 darius Exp $ +# $Id: beermon.py,v 1.3 2007/09/24 13:31:15 darius Exp $ # # Depends on: Python 2.3 (I think) # @@ -36,7 +36,7 @@ ############################################################################ -import pexpect, re, threading, time, logging +import pexpect, re, threading, time, logging, sys, traceback from logging.handlers import RotatingFileHandler class ROMReadError(Exception): @@ -51,6 +51,8 @@ self.m = m global log log = _log + self.cv = threading.Condition() + self.cv.acquire() def doit(self): log.debug("target temperature - %3.2f" % (self.targetTemp)) @@ -65,8 +67,8 @@ log.debug("Fermenter Fridge Ambient State New State") while True: if (self.m.lastUpdate == 0): - print "%s Invalid data" % (time.asctime()) - time.sleep(30) + log.debug("Invalid data") + self.cv.wait(self.pollInterval) self.m.setState('idle') continue @@ -98,7 +100,7 @@ if (nextState != "-"): self.m.setState(nextState) - time.sleep(self.pollInterval) + self.cv.wait(self.pollInterval) class MonitorDev(threading.Thread): @@ -278,7 +280,6 @@ def initLog(): # Init our logging - global log log = logging.getLogger("monitor") # Default to warts and all logging @@ -302,17 +303,19 @@ return(log) def main(): - import sys, traceback, beermon - - exitCode = 0 + import beermon - initLog() + global log + log = initLog() log.debug("=== Initing ===") - log.debug("$Id: beermon.py,v 1.2 2007/09/24 04:05:52 darius Exp $") - m = beermon.MonitorDev() + log.debug("$Id: beermon.py,v 1.3 2007/09/24 13:31:15 darius Exp $") + m = None + exitCode = 0 try: + m = beermon.MonitorDev() + c = beermon.Control(m, log) # Wait for the first temperature readings to come through, saves # getting an 'invalid data' message @@ -323,16 +326,17 @@ except KeyboardInterrupt: log.debug("Exiting due to keyboard interrupt") - #except Exception, e: - # log.debug("Something went wrong, details below") - # log.debug(e) - # #log.debug(reduce(lambda x, y: x + y, traceback.format_exception( - # # sys.last_type, sys.last_value, sys.last_traceback))) - # exitCode = 1 + except Exception, e: + log.debug("Something went wrong, details below") + log.debug(e) + #log.debug(reduce(lambda x, y: x + y, traceback.format_exception( + # sys.last_type, sys.last_value, sys.last_traceback))) + exitCode = 1 finally: # Make sure we try and turn it off if something goes wrong - m.setState('idle') + if (m != None): + m.setState('idle') sys.exit(exitCode)