2019-07-08 12:12:13 +02:00
|
|
|
import threading
|
|
|
|
import datetime
|
2019-07-08 12:26:03 +02:00
|
|
|
from NotificationForwarder import AbstractNotificationReceiver
|
2019-07-14 00:47:16 +02:00
|
|
|
import logging
|
2019-07-08 12:12:13 +02:00
|
|
|
|
2019-09-10 16:33:18 +02:00
|
|
|
|
2019-07-08 12:12:13 +02:00
|
|
|
class ScanRateConsideringQueueFeeder(threading.Thread, AbstractNotificationReceiver):
|
|
|
|
def __init__(self, config, registers, queue):
|
|
|
|
super().__init__()
|
|
|
|
self.config = config
|
|
|
|
self.registers = registers
|
|
|
|
self.queue = queue
|
|
|
|
self.delayEvent = threading.Event()
|
2019-07-27 23:56:19 +01:00
|
|
|
# self.daemon = True
|
2019-07-14 00:47:16 +02:00
|
|
|
self.logger = logging.getLogger('ScanRateConsideringQueueFeeder')
|
2019-07-08 12:12:13 +02:00
|
|
|
|
|
|
|
def getMinimalScanrate(self):
|
2019-09-10 16:33:18 +02:00
|
|
|
return min([r.scanRate.total_seconds() for r in self.registers if r.scanRate])
|
2019-07-08 12:12:13 +02:00
|
|
|
|
|
|
|
def receiveNotification(self, arg):
|
2019-07-14 00:47:16 +02:00
|
|
|
self.logger.info("ScanRateConsideringQueueFeeder:registersChanged")
|
2019-07-08 12:12:13 +02:00
|
|
|
self.delay = self.getMinimalScanrate()
|
|
|
|
|
|
|
|
def run(self):
|
|
|
|
self.delay = self.getMinimalScanrate()
|
|
|
|
while True:
|
|
|
|
registersToBeHandled = [
|
|
|
|
r for r in self.registers if ((not r.enqueued) and
|
|
|
|
(r.scanRate) and
|
2019-09-10 16:33:18 +02:00
|
|
|
((not r.lastContact) or
|
2019-07-08 12:12:13 +02:00
|
|
|
(r.lastContact + r.scanRate < datetime.datetime.now())))
|
|
|
|
]
|
2019-09-10 16:33:18 +02:00
|
|
|
registersToBeHandled.sort(key=lambda x: x.scanRate)
|
2019-07-08 12:12:13 +02:00
|
|
|
for r in registersToBeHandled:
|
|
|
|
self.queue.put(r)
|
|
|
|
r.enqueued = True
|
|
|
|
self.delayEvent.wait(self.delay)
|