From 8f0249673aa3e952363a9e17d7c47d520bc37fb0 Mon Sep 17 00:00:00 2001 From: Sven Sager Date: Sat, 25 Jul 2020 13:26:33 +0200 Subject: [PATCH] Call functions with watchdogs.py. Call psstop after "reset driver" --- revpipyload/revpipyload.py | 2 ++ revpipyload/watchdogs.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/revpipyload/revpipyload.py b/revpipyload/revpipyload.py index 1b9881d..2c6bb4d 100755 --- a/revpipyload/revpipyload.py +++ b/revpipyload/revpipyload.py @@ -791,6 +791,7 @@ class RevPiPyLoad(): # Watchdog to detect the reset_driver event pictory_reset_driver = ResetDriverWatchdog() + pictory_reset_driver.register_call(self.xml_psstop) # mainloop while not self._exit: @@ -1369,6 +1370,7 @@ class RevPiPyLoad(): @return True, wenn stop erfolgreich""" if self.xml_ps is not None: self.xml_ps.stop() + self.xml_ps.loadrevpimodio() return True else: return False diff --git a/revpipyload/watchdogs.py b/revpipyload/watchdogs.py index 00fef4b..213af55 100644 --- a/revpipyload/watchdogs.py +++ b/revpipyload/watchdogs.py @@ -178,6 +178,7 @@ class ResetDriverWatchdog(Thread): def __init__(self): super(ResetDriverWatchdog, self).__init__() self.daemon = True + self._calls = [] self._exit = False self._fh = None self.not_implemented = False @@ -213,6 +214,8 @@ class ResetDriverWatchdog(Thread): if rc == 0 and byte_buff[0] == 1: self._triggered = True pi.logger.debug("piCtory reset_driver detected") + for func in self._calls: + func() except Exception: self.not_implemented = True os.close(self._fh) @@ -222,6 +225,13 @@ class ResetDriverWatchdog(Thread): pi.logger.debug("leave ResetDriverWatchdog.run()") + def register_call(self, function): + """Register a function, if watchdog triggers.""" + if not callable(function): + return ValueError("Function is not callable.") + if function not in self._calls: + self._calls.append(function) + def stop(self): """Stop watchdog for piCtory reset_driver.""" pi.logger.debug("enter ResetDriverWatchdog.stop()") @@ -233,6 +243,13 @@ class ResetDriverWatchdog(Thread): pi.logger.debug("leave ResetDriverWatchdog.stop()") + def unregister_call(self, function=None): + """Remove a function call on watchdog trigger.""" + if function is None: + self._calls.clear() + elif function in self._calls: + self._calls.remove(function) + @property def triggered(self): """Will return True one time after watchdog was triggered."""