mirror of
https://github.com/naruxde/revpimodio2.git
synced 2025-11-08 22:03:53 +01:00
Bei .reg_event Parameter prefire eingefügt um Event bei Eintritt in mainloop
mit aktuellem Wert auszulösen. Im Helper werden Event-Queues nur beim deaktiveren geleert
This commit is contained in:
@@ -413,9 +413,11 @@ class ProcimgWriter(Thread):
|
||||
if self.__eventwork != value:
|
||||
with self.lck_refresh:
|
||||
self.__eventwork = value
|
||||
self.__eventqth = queue.Queue()
|
||||
self._eventq = queue.Queue()
|
||||
self.__dict_delay = {}
|
||||
if not value:
|
||||
# Nur leeren beim deaktivieren
|
||||
self.__eventqth = queue.Queue()
|
||||
self._eventq = queue.Queue()
|
||||
self.__dict_delay = {}
|
||||
|
||||
# Threadmanagement
|
||||
if value and not self.__eventth.is_alive():
|
||||
|
||||
@@ -21,15 +21,16 @@ class IOEvent(object):
|
||||
|
||||
"""Basisklasse fuer IO-Events."""
|
||||
|
||||
__slots__ = "as_thread", "delay", "edge", "func", "overwrite"
|
||||
__slots__ = "as_thread", "delay", "edge", "func", "overwrite", "prefire"
|
||||
|
||||
def __init__(self, func, edge, as_thread, delay, overwrite):
|
||||
def __init__(self, func, edge, as_thread, delay, overwrite, prefire):
|
||||
"""Init IOEvent class."""
|
||||
self.as_thread = as_thread
|
||||
self.delay = delay
|
||||
self.edge = edge
|
||||
self.func = func
|
||||
self.overwrite = overwrite
|
||||
self.prefire = prefire
|
||||
|
||||
|
||||
class IOList(object):
|
||||
@@ -368,7 +369,7 @@ class IOBase(object):
|
||||
@return Namen des IOs"""
|
||||
return self._name
|
||||
|
||||
def __reg_xevent(self, func, delay, edge, as_thread, overwrite):
|
||||
def __reg_xevent(self, func, delay, edge, as_thread, overwrite, prefire):
|
||||
"""Verwaltet reg_event und reg_timerevent.
|
||||
|
||||
@param func Funktion die bei Aenderung aufgerufen werden soll
|
||||
@@ -376,6 +377,7 @@ class IOBase(object):
|
||||
@param edge Ausfuehren bei RISING, FALLING or BOTH Wertaenderung
|
||||
@param as_thread Bei True, Funktion als EventCallback-Thread ausfuehren
|
||||
@param overwrite Wenn True, wird Event bei ueberschrieben
|
||||
@param prefire Ausloesen mit aktuellem Wert, wenn mainloop startet
|
||||
|
||||
"""
|
||||
# Prüfen ob Funktion callable ist
|
||||
@@ -391,11 +393,15 @@ class IOBase(object):
|
||||
raise ValueError(
|
||||
"parameter 'edge' can be used with bit io objects only"
|
||||
)
|
||||
if prefire and self._parentdevice._modio._looprunning:
|
||||
raise RuntimeError(
|
||||
"prefire can not be used if mainloop is running"
|
||||
)
|
||||
|
||||
if self not in self._parentdevice._dict_events:
|
||||
with self._parentdevice._filelock:
|
||||
self._parentdevice._dict_events[self] = \
|
||||
[IOEvent(func, edge, as_thread, delay, overwrite)]
|
||||
[IOEvent(func, edge, as_thread, delay, overwrite, prefire)]
|
||||
else:
|
||||
# Prüfen ob Funktion schon registriert ist
|
||||
for regfunc in self._parentdevice._dict_events[self]:
|
||||
@@ -429,7 +435,7 @@ class IOBase(object):
|
||||
# Eventfunktion einfügen
|
||||
with self._parentdevice._filelock:
|
||||
self._parentdevice._dict_events[self].append(
|
||||
IOEvent(func, edge, as_thread, delay, overwrite)
|
||||
IOEvent(func, edge, as_thread, delay, overwrite, prefire)
|
||||
)
|
||||
|
||||
def _get_address(self):
|
||||
@@ -464,7 +470,8 @@ class IOBase(object):
|
||||
else:
|
||||
return bytes(self._parentdevice._ba_devdata[self._slc_address])
|
||||
|
||||
def reg_event(self, func, delay=0, edge=BOTH, as_thread=False):
|
||||
def reg_event(
|
||||
self, func, delay=0, edge=BOTH, as_thread=False, prefire=False):
|
||||
"""Registriert fuer IO ein Event bei der Eventueberwachung.
|
||||
|
||||
Die uebergebene Funktion wird ausgefuehrt, wenn sich der IO Wert
|
||||
@@ -478,9 +485,10 @@ class IOBase(object):
|
||||
@param delay Verzoegerung in ms zum Ausloesen wenn Wert gleich bleibt
|
||||
@param edge Ausfuehren bei RISING, FALLING or BOTH Wertaenderung
|
||||
@param as_thread Bei True, Funktion als EventCallback-Thread ausfuehren
|
||||
@param prefire Ausloesen mit aktuellem Wert, wenn mainloop startet
|
||||
|
||||
"""
|
||||
self.__reg_xevent(func, delay, edge, as_thread, True)
|
||||
self.__reg_xevent(func, delay, edge, as_thread, True, prefire)
|
||||
|
||||
def reg_timerevent(self, func, delay, edge=BOTH, as_thread=False):
|
||||
"""Registriert fuer IO einen Timer, welcher nach delay func ausfuehrt.
|
||||
@@ -501,7 +509,7 @@ class IOBase(object):
|
||||
@param as_thread Bei True, Funktion als EventCallback-Thread ausfuehren
|
||||
|
||||
"""
|
||||
self.__reg_xevent(func, delay, edge, as_thread, False)
|
||||
self.__reg_xevent(func, delay, edge, as_thread, False, False)
|
||||
|
||||
def set_value(self, value):
|
||||
"""Setzt den Wert des IOs.
|
||||
|
||||
@@ -10,7 +10,7 @@ from json import load as jload
|
||||
from multiprocessing import cpu_count
|
||||
from os import access, F_OK, R_OK
|
||||
from queue import Empty
|
||||
from revpimodio2 import acheck, DeviceNotFoundError
|
||||
from revpimodio2 import acheck, DeviceNotFoundError, BOTH, RISING, FALLING
|
||||
from signal import signal, SIG_DFL, SIGINT, SIGTERM
|
||||
from threading import Thread, Event, Lock
|
||||
from timeit import default_timer
|
||||
@@ -771,11 +771,29 @@ class RevPiModIO(object):
|
||||
self._exit.clear()
|
||||
self._looprunning = True
|
||||
|
||||
# Beim Eintritt in mainloop Bytecopy erstellen
|
||||
# Beim Eintritt in mainloop Bytecopy erstellen und prefire anhängen
|
||||
for dev in self._lst_refresh:
|
||||
with dev._filelock:
|
||||
dev._ba_datacp = dev._ba_devdata[:]
|
||||
|
||||
# Prefire Events vorbereiten
|
||||
for io in dev._dict_events:
|
||||
for regfunc in dev._dict_events[io]:
|
||||
if not regfunc.prefire:
|
||||
continue
|
||||
|
||||
if regfunc.edge == BOTH \
|
||||
or regfunc.edge == RISING and io.value \
|
||||
or regfunc.edge == FALLING and not io.value:
|
||||
if regfunc.as_thread:
|
||||
self._imgwriter.__eventqth.put(
|
||||
(regfunc, io._name, io.value), False
|
||||
)
|
||||
else:
|
||||
self._imgwriter._eventq.put(
|
||||
(regfunc, io._name, io.value), False
|
||||
)
|
||||
|
||||
# ImgWriter mit Eventüberwachung aktivieren
|
||||
self._imgwriter._collect_events(True)
|
||||
e = None
|
||||
|
||||
Reference in New Issue
Block a user