diff --git a/doc/revpimodio2.io.html b/doc/revpimodio2.io.html index 223107a..d8ca045 100644 --- a/doc/revpimodio2.io.html +++ b/doc/revpimodio2.io.html @@ -24,6 +24,9 @@ Classes
+Verwaltet reg_event und reg_timerevent. +
+Basisklasse fuer IO-Events. +
+| None |
| None |
| IOEvent | +Init IOEvent class. | +
| None |
+Init IOEvent class. +
+ +
diff --git a/eric-revpimodio2.api b/eric-revpimodio2.api
index ade70dc..6c5077f 100644
--- a/eric-revpimodio2.api
+++ b/eric-revpimodio2.api
@@ -105,6 +105,7 @@ revpimodio2.io.IOBase.unreg_event?4(func=None, edge=None)
revpimodio2.io.IOBase.value?7
revpimodio2.io.IOBase.wait?4(edge=BOTH, exitevent=None, okvalue=None, timeout=0)
revpimodio2.io.IOBase?1(parentdevice, valuelist, iotype, byteorder, signed)
+revpimodio2.io.IOEvent?1(func, edge, as_thread, delay, overwrite)
revpimodio2.io.IOList._private_register_new_io_object?5(new_io)
revpimodio2.io.IOList?1()
revpimodio2.io.IntIO._get_signed?5()
diff --git a/revpimodio2/helper.py b/revpimodio2/helper.py
index bca9ef2..b2375f5 100644
--- a/revpimodio2/helper.py
+++ b/revpimodio2/helper.py
@@ -321,11 +321,11 @@ class ProcimgWriter(Thread):
continue
for regfunc in dev._dict_events[io_event]:
- if regfunc[1] == BOTH \
- or regfunc[1] == RISING and boolor \
- or regfunc[1] == FALLING and not boolor:
- if regfunc[3] == 0:
- if regfunc[2]:
+ if regfunc.edge == BOTH \
+ or regfunc.edge == RISING and boolor \
+ or regfunc.edge == FALLING and not boolor:
+ if regfunc.delay == 0:
+ if regfunc.as_thread:
self.__eventqth.put(
(regfunc, io_event._name, io_event.value),
False
@@ -340,14 +340,15 @@ class ProcimgWriter(Thread):
tupfire = (
regfunc, io_event._name, io_event.value
)
- if regfunc[4] or tupfire not in self.__dict_delay:
+ if regfunc.overwrite \
+ or tupfire not in self.__dict_delay:
self.__dict_delay[tupfire] = ceil(
- regfunc[3] / 1000 / self._refresh
+ regfunc.delay / 1000 / self._refresh
)
else:
for regfunc in dev._dict_events[io_event]:
- if regfunc[3] == 0:
- if regfunc[2]:
+ if regfunc.delay == 0:
+ if regfunc.as_thread:
self.__eventqth.put(
(regfunc, io_event._name, io_event.value),
False
@@ -362,9 +363,10 @@ class ProcimgWriter(Thread):
tupfire = (
regfunc, io_event._name, io_event.value
)
- if regfunc[4] or tupfire not in self.__dict_delay:
+ if regfunc.overwrite \
+ or tupfire not in self.__dict_delay:
self.__dict_delay[tupfire] = ceil(
- regfunc[3] / 1000 / self._refresh
+ regfunc.delay / 1000 / self._refresh
)
# Nach Verarbeitung aller IOs die Bytes kopieren (Lock ist noch drauf)
@@ -376,10 +378,9 @@ class ProcimgWriter(Thread):
try:
tup_fireth = self.__eventqth.get(timeout=1)
th = EventCallback(
- tup_fireth[0][0], tup_fireth[1], tup_fireth[2]
+ tup_fireth[0].func, tup_fireth[1], tup_fireth[2]
)
th.start()
- # TODO: Error handling
except queue.Empty:
pass
@@ -492,7 +493,7 @@ class ProcimgWriter(Thread):
# Verzögerte Events prüfen
if self.__eventwork:
for tup_fire in list(self.__dict_delay.keys()):
- if tup_fire[0][4] \
+ if tup_fire[0].overwrite \
and getattr(self._modio.io, tup_fire[1]).value != \
tup_fire[2]:
del self.__dict_delay[tup_fire]
@@ -500,7 +501,7 @@ class ProcimgWriter(Thread):
self.__dict_delay[tup_fire] -= 1
if self.__dict_delay[tup_fire] <= 0:
# Verzögertes Event übernehmen und löschen
- if tup_fire[0][2]:
+ if tup_fire[0].as_thread:
self.__eventqth.put(tup_fire, False)
else:
self._eventq.put(tup_fire, False)
@@ -530,6 +531,7 @@ class ProcimgWriter(Thread):
def stop(self):
"""Beendet die automatische Prozessabbildsynchronisierung."""
+ self._collect_events(False)
self._work.set()
def set_maxioerrors(self, value):
diff --git a/revpimodio2/io.py b/revpimodio2/io.py
index 1bc8946..4e50f5b 100644
--- a/revpimodio2/io.py
+++ b/revpimodio2/io.py
@@ -11,6 +11,19 @@ from threading import Event
from revpimodio2 import RISING, FALLING, BOTH, INP, OUT, MEM, consttostr
+class IOEvent(object):
+
+ """Basisklasse fuer IO-Events."""
+
+ def __init__(self, func, edge, as_thread, delay, overwrite):
+ """Init IOEvent class."""
+ self.as_thread = as_thread
+ self.delay = delay
+ self.edge = edge
+ self.func = func
+ self.overwrite = overwrite
+
+
class IOList(object):
"""Basisklasse fuer direkten Zugriff auf IO Objekte."""
@@ -317,6 +330,67 @@ class IOBase(object):
@return Namen des IOs"""
return self._name
+ def __reg_xevent(self, func, delay, edge, as_thread, overwrite):
+ """Verwaltet reg_event und reg_timerevent.
+
+ @param func Funktion die bei Aenderung aufgerufen werden soll
+ @param delay Verzoegerung in ms zum Ausloesen - auch bei Wertaenderung
+ @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
+
+ """
+ # Prüfen ob Funktion callable ist
+ if not callable(func):
+ raise AttributeError(
+ "registered function '{}' is not callable".format(func)
+ )
+ if type(delay) != int or delay < 0:
+ raise AttributeError(
+ "'delay' must be