diff --git a/Control/brewpi/brewpi.py b/Control/brewpi/brewpi.py index 7dec34f..8d44433 100755 --- a/Control/brewpi/brewpi.py +++ b/Control/brewpi/brewpi.py @@ -1,6 +1,6 @@ #!/usr/bin/python3 -import time +import signal import json from controller import Controller from mass import Mass @@ -38,6 +38,24 @@ def results_plot(self): if __name__ == '__main__': + def handler(signum, frame): + print('Signal handler called with signal', signum) + + if signum == signal.SIGABRT: + ablauf.stop() + if signum == signal.SIGINT: + ablauf.pause() + if signum == signal.SIGCONT: + ablauf.cont() + if signum == signal.SIGHUP: + ablauf.restart() + + # Set the signal handler and a 5-second alarm + signal.signal(signal.SIGABRT, handler) + signal.signal(signal.SIGINT, handler) + signal.signal(signal.SIGCONT, handler) + signal.signal(signal.SIGHUP, handler) + fp = open("brewpi.json") configJson = json.load(fp) diff --git a/Control/brewpi/controller.py b/Control/brewpi/controller.py index 2141641..76c2830 100644 --- a/Control/brewpi/controller.py +++ b/Control/brewpi/controller.py @@ -36,6 +36,9 @@ class Controller(): self.thread = None self.rast_abort = False self.receipe_sema = threading.Semaphore(0) + self.is_pause = False + self.is_restart = False + self.receipe = None def log(self, s): now = time.time() @@ -55,6 +58,8 @@ class Controller(): self.report_last_time = now def start(self, recipe): + self.is_pause = False + self.receipe = recipe print(json.dumps({recipe['Name'] : recipe}, indent=4, sort_keys=True)) self.thread = threading.Thread(target=self.receipe_run, args=(recipe,)) @@ -66,6 +71,22 @@ class Controller(): self.thread.join() self.thread = None self.rast_abort = False + self.receipe = None + + def restart(self): + receipe = self.receipe + self.is_restart = True + self.stop() + self.start(receipe) + self.is_restart = False + + def pause(self): + if self.thread != None: + self.is_pause = True + + def cont(self): + if self.thread != None: + self.is_pause = False def wait_finished(self): self.receipe_sema.acquire() @@ -83,8 +104,11 @@ class Controller(): for rast in recipe['Rasten']: self.rast(rast) + if self.rast_abort: + break - self.receipe_sema.release() + if self.rast_abort and not self.is_restart: + self.receipe_sema.release() def rast(self, rast): @@ -109,8 +133,6 @@ class Controller(): theta_err_sm = Smoother(0.5) heatrate_err_sm = Smoother(0.5) while(doLoop): - if self.rast_abort: - break time_start = time.time() @@ -215,6 +237,13 @@ class Controller(): self.report() - time.sleep(time_to_sleep) + while(True): + time.sleep(time_to_sleep) + if self.is_pause == False: + break + if self.rast_abort: + break + if self.rast_abort: + break self.stirrer.deactivate()