modbusmaster/src/ScanRateConsideringQueueFeeder.py

38 lines
1.4 KiB
Python
Raw Normal View History

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()
# 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)