X-Git-Url: https://git.ucc.asn.au/?p=uccdoor.git;a=blobdiff_plain;f=server.py;h=91fa6307123bb66f02ea63534dcaa8a9432468c3;hp=25e8ff8edfe6b21199c6bb51f5318f3742b3f833;hb=7bb64998c4eb8de4062f01d48c1de5a8d70fb8d3;hpb=71000ffa8a503792eeac8b19f86c9ff7dd69baab diff --git a/server.py b/server.py index 25e8ff8..91fa630 100755 --- a/server.py +++ b/server.py @@ -7,10 +7,12 @@ # statuses: 1 means open circuit, 0 means closed circuit, -1 means error +import syslog import dbus, dbus.service import gobject from LATClient import LATClient from select import select +from threading import Timer def check_LAT_service(servicename, retries=3): latclient = LATClient(service=servicename.upper()) @@ -56,8 +58,12 @@ class Door(dbus.service.Object): object_path = '/au/asn/ucc/doors/%s' % doorname dbus.service.Object.__init__(self, bus, object_path) - # get initial state - self.poll() + # get initial state in a new thread + self.timeout = Timer(0, self.poll) + # daemon threads will be killed when the mainloop exits + # the timeout threads will inherit this value + self.timeout.setDaemon(True) + self.timeout.start() def poll(self): try: @@ -66,12 +72,16 @@ class Door(dbus.service.Object): newstatus = -1 if newstatus != self.status: + syslog.syslog(142, "status changed detected for %s; status: %i, newstatus: %i" % self.service, self.status, newstatus) self.status = newstatus # emit signal self.status_changed(newstatus) + # back off if broken + self.interval = [10,10,20][newstatus] # set up timeout again - gobject.timeout_add_seconds(self.interval, self.poll) + self.timeout = Timer(self.interval, self.poll) + self.timeout.start() @dbus.service.signal('au.asn.ucc.DoorInterface', signature='n') def status_changed(self, newstatus): @@ -83,6 +93,7 @@ class Door(dbus.service.Object): return self.status if __name__ == '__main__': + gobject.threads_init() doors = ('uccdoor', 'unisfadoor', 'chdoor', 'mrdoor', 'uccpir') from dbus.mainloop.glib import DBusGMainLoop