Files
linuxcnc-configs/my-emco/watchdog.py
2026-03-21 23:48:08 +01:00

94 lines
2.0 KiB
Python

#! /usr/bin/python
import time
import threading
import sys
class WatchDog():
def __init__(self, timeout):
self.timeout = timeout
self.last_ping_time = time.time()
def ping(self):
self.last_ping_time = time.time()
def check(self):
if time.time() - self.last_ping_time > self.timeout:
self.last_ping_time = time.time() #reset tick time
return True
else:
return False
def insideMargin(self):
if time.time() - self.last_ping_time <= self.timeout:
return True
else:
self.last_ping_time = time.time() #reset tick time
return False
class WatchDogDaemon(threading.Thread):
def __init__(self, timeout, periodicity, enable = True):
self.wd = WatchDog(timeout)
self.periodicity = periodicity
self.enabled = enable
self._start()
def _start(self):
threading.Thread.__init__(self)
self.daemon = True
self.start()
def ping(self):
self.wd.ping()
def run(self):
print "Starting watchdog deamon..."
while(self.enabled):
time.sleep(self.periodicity)
if not self.wd.insideMargin():
print "Watchdog outside margin"
self.reset()
print "stopping watchdog deamon..."
def setEnabled(self, enabled):
if self.enabled == False and enabled == True:
self.enabled = True
self.wd.ping() # reset tick time
self._start()
if enabled == False:
self.enabled = False
def reset(self):
"""to be overriden by client"""
pass
def reset():
print 'reset'
def main():
i = 0
wdd = WatchDogDaemon(2, 0.5, False)
wdd.reset = reset
try:
while 1:
time.sleep(1)
print 'main_' + str(i)
print wdd.is_alive()
i = i+1
if i == 5 or i == 15:
wdd.setEnabled(True)
if i == 10:
wdd.setEnabled(False)
wdd.ping()
except KeyboardInterrupt:
raise SystemExit
if __name__ == '__main__':
main()