Mit direct_io zusammenführen

This commit is contained in:
2019-08-01 15:36:36 +02:00
12 changed files with 205 additions and 36 deletions

View File

@@ -27,7 +27,10 @@ Global Attributes</h3>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3> Classes</h3>
<table> <table>
<tr><td>None</td></tr> <tr>
<td><a style="color:#0000FF" href="#DeviceNotFoundError">DeviceNotFoundError</a></td>
<td>Fehler wenn ein Device nicht gefunden wird.</td>
</tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3> Functions</h3>
@@ -41,6 +44,37 @@ Functions</h3>
</tr> </tr>
</table> </table>
<hr /><hr /> <hr /><hr />
<a NAME="DeviceNotFoundError" ID="DeviceNotFoundError"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">DeviceNotFoundError</h2>
<p>
Fehler wenn ein Device nicht gefunden wird.
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
Exception
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="acheck" ID="acheck"></a> <a NAME="acheck" ID="acheck"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">acheck</h2> <h2 style="background-color:#FFFFFF;color:#0000FF">acheck</h2>
<b>acheck</b>(<i>check_type, **kwargs</i>) <b>acheck</b>(<i>check_type, **kwargs</i>)

View File

@@ -556,6 +556,9 @@ Methods</h3>
<td><a style="color:#0000FF" href="#Device.__getioiter">__getioiter</a></td> <td><a style="color:#0000FF" href="#Device.__getioiter">__getioiter</a></td>
<td>Gibt <class 'iter'> mit allen IOs zurueck.</td> <td>Gibt <class 'iter'> mit allen IOs zurueck.</td>
</tr><tr> </tr><tr>
<td><a style="color:#0000FF" href="#Device.__getitem__">__getitem__</a></td>
<td>Gibt IO an angegebener Stelle zurueck.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#Device.__int__">__int__</a></td> <td><a style="color:#0000FF" href="#Device.__int__">__int__</a></td>
<td>Gibt die Positon im RevPi Bus zurueck.</td> <td>Gibt die Positon im RevPi Bus zurueck.</td>
</tr><tr> </tr><tr>
@@ -580,6 +583,9 @@ Methods</h3>
<td><a style="color:#0000FF" href="#Device._get_producttype">_get_producttype</a></td> <td><a style="color:#0000FF" href="#Device._get_producttype">_get_producttype</a></td>
<td>Gibt den Produkttypen des device zurueck.</td> <td>Gibt den Produkttypen des device zurueck.</td>
</tr><tr> </tr><tr>
<td><a style="color:#0000FF" href="#Device._update_my_io_list">_update_my_io_list</a></td>
<td>Erzeugt eine neue IO Liste fuer schnellen Zugriff.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#Device.autorefresh">autorefresh</a></td> <td><a style="color:#0000FF" href="#Device.autorefresh">autorefresh</a></td>
<td>Registriert dieses Device fuer die automatische Synchronisierung.</td> <td>Registriert dieses Device fuer die automatische Synchronisierung.</td>
</tr><tr> </tr><tr>
@@ -676,6 +682,22 @@ Filter fuer 'Export' Flag in piCtory
<dd> <dd>
IOs als Iterator IOs als Iterator
</dd> </dd>
</dl><a NAME="Device.__getitem__" ID="Device.__getitem__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Device.__getitem__</h3>
<b>__getitem__</b>(<i>key</i>)
<p>
Gibt IO an angegebener Stelle zurueck.
</p><dl>
<dt><i>key</i></dt>
<dd>
Index des IOs auf dem device als <class 'int'>
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
Gefundenes IO-Objekt
</dd>
</dl><a NAME="Device.__int__" ID="Device.__int__"></a> </dl><a NAME="Device.__int__" ID="Device.__int__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Device.__int__</h3> Device.__int__</h3>
@@ -767,7 +789,13 @@ Gibt den Produkttypen des device zurueck.
<dd> <dd>
Deviceprodukttyp Deviceprodukttyp
</dd> </dd>
</dl><a NAME="Device.autorefresh" ID="Device.autorefresh"></a> </dl><a NAME="Device._update_my_io_list" ID="Device._update_my_io_list"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Device._update_my_io_list</h3>
<b>_update_my_io_list</b>(<i></i>)
<p>
Erzeugt eine neue IO Liste fuer schnellen Zugriff.
</p><a NAME="Device.autorefresh" ID="Device.autorefresh"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Device.autorefresh</h3> Device.autorefresh</h3>
<b>autorefresh</b>(<i>activate=True</i>) <b>autorefresh</b>(<i>activate=True</i>)
@@ -1049,7 +1077,7 @@ DeviceList.__iter__</h3>
Gibt Iterator aller Devices zurueck. Gibt Iterator aller Devices zurueck.
</p><p> </p><p>
Die Reihenfolge ist nach Position im Prozessabbild sortiert und nicht Die Reihenfolge ist nach Position im Prozessabbild sortiert und nicht
nach Position (Dies entspricht der Positionierung aus piCtory)! nach Positionsnummer (Dies entspricht der Positionierung aus piCtory)!
</p><dl> </p><dl>
<dt>Returns:</dt> <dt>Returns:</dt>
<dd> <dd>

View File

@@ -241,7 +241,7 @@ Bytelaenge des IO - 0 bei BITs
</dl><a NAME="IOBase.__reg_xevent" ID="IOBase.__reg_xevent"></a> </dl><a NAME="IOBase.__reg_xevent" ID="IOBase.__reg_xevent"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
IOBase.__reg_xevent</h3> IOBase.__reg_xevent</h3>
<b>__reg_xevent</b>(<i>func, delay, edge, as_thread, overwrite</i>) <b>__reg_xevent</b>(<i>func, delay, edge, as_thread, overwrite, prefire</i>)
<p> <p>
Verwaltet reg_event und reg_timerevent. Verwaltet reg_event und reg_timerevent.
</p><dl> </p><dl>
@@ -260,6 +260,9 @@ Bei True, Funktion als EventCallback-Thread ausfuehren
</dd><dt><i>overwrite</i></dt> </dd><dt><i>overwrite</i></dt>
<dd> <dd>
Wenn True, wird Event bei ueberschrieben Wenn True, wird Event bei ueberschrieben
</dd><dt><i>prefire</i></dt>
<dd>
Ausloesen mit aktuellem Wert, wenn mainloop startet
</dd> </dd>
</dl><a NAME="IOBase.__str__" ID="IOBase.__str__"></a> </dl><a NAME="IOBase.__str__" ID="IOBase.__str__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -330,7 +333,7 @@ IO-Wert als <class 'bytes'> oder <class 'bool'>
</dl><a NAME="IOBase.reg_event" ID="IOBase.reg_event"></a> </dl><a NAME="IOBase.reg_event" ID="IOBase.reg_event"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
IOBase.reg_event</h3> IOBase.reg_event</h3>
<b>reg_event</b>(<i>func, delay=0, edge=BOTH, as_thread=False</i>) <b>reg_event</b>(<i>func, delay=0, edge=BOTH, as_thread=False, prefire=False</i>)
<p> <p>
Registriert fuer IO ein Event bei der Eventueberwachung. Registriert fuer IO ein Event bei der Eventueberwachung.
</p><p> </p><p>
@@ -353,6 +356,9 @@ Ausfuehren bei RISING, FALLING or BOTH Wertaenderung
</dd><dt><i>as_thread</i></dt> </dd><dt><i>as_thread</i></dt>
<dd> <dd>
Bei True, Funktion als EventCallback-Thread ausfuehren Bei True, Funktion als EventCallback-Thread ausfuehren
</dd><dt><i>prefire</i></dt>
<dd>
Ausloesen mit aktuellem Wert, wenn mainloop startet
</dd> </dd>
</dl><a NAME="IOBase.reg_timerevent" ID="IOBase.reg_timerevent"></a> </dl><a NAME="IOBase.reg_timerevent" ID="IOBase.reg_timerevent"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -502,7 +508,7 @@ Static Methods</h3>
<a NAME="IOEvent.__init__" ID="IOEvent.__init__"></a> <a NAME="IOEvent.__init__" ID="IOEvent.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
IOEvent (Constructor)</h3> IOEvent (Constructor)</h3>
<b>IOEvent</b>(<i>func, edge, as_thread, delay, overwrite</i>) <b>IOEvent</b>(<i>func, edge, as_thread, delay, overwrite, prefire</i>)
<p> <p>
Init IOEvent class. Init IOEvent class.
</p> </p>
@@ -961,6 +967,7 @@ Weitere Parameter:
- delay: Verzoegerung in ms zum Ausloesen wenn Wert gleich bleibt - delay: Verzoegerung in ms zum Ausloesen wenn Wert gleich bleibt
- edge: Event ausfuehren bei RISING, FALLING or BOTH Wertaenderung - edge: Event ausfuehren bei RISING, FALLING or BOTH Wertaenderung
- as_thread: Fuehrt die event-Funktion als RevPiCallback-Thread aus - as_thread: Fuehrt die event-Funktion als RevPiCallback-Thread aus
- prefire: Ausloesen mit aktuellem Wert, wenn mainloop startet
</dd> </dd>
</dl><dl> </dl><dl>
<dt><b>See Also:</b></dt> <dt><b>See Also:</b></dt>

View File

@@ -54,7 +54,7 @@ object
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3> Class Attributes</h3>
<table> <table>
<tr><td>__slots__</td></tr><tr><td>configrsc</td></tr><tr><td>cycletime</td></tr><tr><td>ioerrors</td></tr><tr><td>length</td></tr><tr><td>maxioerrors</td></tr><tr><td>monitoring</td></tr><tr><td>procimg</td></tr><tr><td>simulator</td></tr> <tr><td>__slots__</td></tr><tr><td>configrsc</td></tr><tr><td>cycletime</td></tr><tr><td>debug</td></tr><tr><td>ioerrors</td></tr><tr><td>length</td></tr><tr><td>maxioerrors</td></tr><tr><td>monitoring</td></tr><tr><td>procimg</td></tr><tr><td>replace_io_file</td></tr><tr><td>simulator</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3> Class Methods</h3>
@@ -89,6 +89,9 @@ Methods</h3>
<td><a style="color:#0000FF" href="#RevPiModIO._get_cycletime">_get_cycletime</a></td> <td><a style="color:#0000FF" href="#RevPiModIO._get_cycletime">_get_cycletime</a></td>
<td>Gibt Aktualisierungsrate in ms der Prozessabbildsynchronisierung aus.</td> <td>Gibt Aktualisierungsrate in ms der Prozessabbildsynchronisierung aus.</td>
</tr><tr> </tr><tr>
<td><a style="color:#0000FF" href="#RevPiModIO._get_debug">_get_debug</a></td>
<td>Gibt Status des Debugflags zurueck.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiModIO._get_ioerrors">_get_ioerrors</a></td> <td><a style="color:#0000FF" href="#RevPiModIO._get_ioerrors">_get_ioerrors</a></td>
<td>Getter function.</td> <td>Getter function.</td>
</tr><tr> </tr><tr>
@@ -104,6 +107,9 @@ Methods</h3>
<td><a style="color:#0000FF" href="#RevPiModIO._get_procimg">_get_procimg</a></td> <td><a style="color:#0000FF" href="#RevPiModIO._get_procimg">_get_procimg</a></td>
<td>Getter function.</td> <td>Getter function.</td>
</tr><tr> </tr><tr>
<td><a style="color:#0000FF" href="#RevPiModIO._get_replace_io_file">_get_replace_io_file</a></td>
<td>Gibt Pfad zur verwendeten replace IO Datei aus.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiModIO._get_simulator">_get_simulator</a></td> <td><a style="color:#0000FF" href="#RevPiModIO._get_simulator">_get_simulator</a></td>
<td>Getter function.</td> <td>Getter function.</td>
</tr><tr> </tr><tr>
@@ -266,6 +272,17 @@ Gibt Aktualisierungsrate in ms der Prozessabbildsynchronisierung aus.
<dd> <dd>
Millisekunden Millisekunden
</dd> </dd>
</dl><a NAME="RevPiModIO._get_debug" ID="RevPiModIO._get_debug"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiModIO._get_debug</h3>
<b>_get_debug</b>(<i></i>)
<p>
Gibt Status des Debugflags zurueck.
</p><dl>
<dt>Returns:</dt>
<dd>
Status des Debugflags
</dd>
</dl><a NAME="RevPiModIO._get_ioerrors" ID="RevPiModIO._get_ioerrors"></a> </dl><a NAME="RevPiModIO._get_ioerrors" ID="RevPiModIO._get_ioerrors"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiModIO._get_ioerrors</h3> RevPiModIO._get_ioerrors</h3>
@@ -321,6 +338,17 @@ Getter function.
<dd> <dd>
Pfad des verwendeten Prozessabbilds Pfad des verwendeten Prozessabbilds
</dd> </dd>
</dl><a NAME="RevPiModIO._get_replace_io_file" ID="RevPiModIO._get_replace_io_file"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiModIO._get_replace_io_file</h3>
<b>_get_replace_io_file</b>(<i></i>)
<p>
Gibt Pfad zur verwendeten replace IO Datei aus.
</p><dl>
<dt>Returns:</dt>
<dd>
Pfad zur replace IO Datei
</dd>
</dl><a NAME="RevPiModIO._get_simulator" ID="RevPiModIO._get_simulator"></a> </dl><a NAME="RevPiModIO._get_simulator" ID="RevPiModIO._get_simulator"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiModIO._get_simulator</h3> RevPiModIO._get_simulator</h3>

View File

@@ -43,6 +43,7 @@ revpimodio2.device.Device._buildio?5(dict_io, iotype)
revpimodio2.device.Device._devconfigure?5() revpimodio2.device.Device._devconfigure?5()
revpimodio2.device.Device._get_offset?5() revpimodio2.device.Device._get_offset?5()
revpimodio2.device.Device._get_producttype?5() revpimodio2.device.Device._get_producttype?5()
revpimodio2.device.Device._update_my_io_list?5()
revpimodio2.device.Device.autorefresh?4(activate=True) revpimodio2.device.Device.autorefresh?4(activate=True)
revpimodio2.device.Device.get_allios?4(export=None) revpimodio2.device.Device.get_allios?4(export=None)
revpimodio2.device.Device.get_inputs?4(export=None) revpimodio2.device.Device.get_inputs?4(export=None)
@@ -106,7 +107,7 @@ revpimodio2.io.IOBase.get_defaultvalue?4()
revpimodio2.io.IOBase.get_value?4() revpimodio2.io.IOBase.get_value?4()
revpimodio2.io.IOBase.length?7 revpimodio2.io.IOBase.length?7
revpimodio2.io.IOBase.name?7 revpimodio2.io.IOBase.name?7
revpimodio2.io.IOBase.reg_event?4(func, delay=0, edge=BOTH, as_thread=False) revpimodio2.io.IOBase.reg_event?4(func, delay=0, edge=BOTH, as_thread=False, prefire=False)
revpimodio2.io.IOBase.reg_timerevent?4(func, delay, edge=BOTH, as_thread=False) revpimodio2.io.IOBase.reg_timerevent?4(func, delay, edge=BOTH, as_thread=False)
revpimodio2.io.IOBase.set_value?4(value) revpimodio2.io.IOBase.set_value?4(value)
revpimodio2.io.IOBase.type?7 revpimodio2.io.IOBase.type?7
@@ -114,7 +115,7 @@ revpimodio2.io.IOBase.unreg_event?4(func=None, edge=None)
revpimodio2.io.IOBase.value?7 revpimodio2.io.IOBase.value?7
revpimodio2.io.IOBase.wait?4(edge=BOTH, exitevent=None, okvalue=None, timeout=0) revpimodio2.io.IOBase.wait?4(edge=BOTH, exitevent=None, okvalue=None, timeout=0)
revpimodio2.io.IOBase?1(parentdevice, valuelist, iotype, byteorder, signed) revpimodio2.io.IOBase?1(parentdevice, valuelist, iotype, byteorder, signed)
revpimodio2.io.IOEvent?1(func, edge, as_thread, delay, overwrite) revpimodio2.io.IOEvent?1(func, edge, as_thread, delay, overwrite, prefire)
revpimodio2.io.IOList._private_register_new_io_object?5(new_io) revpimodio2.io.IOList._private_register_new_io_object?5(new_io)
revpimodio2.io.IOList?1() revpimodio2.io.IOList?1()
revpimodio2.io.IntIO._get_signed?5() revpimodio2.io.IntIO._get_signed?5()
@@ -145,11 +146,13 @@ revpimodio2.modio.RevPiModIO._configure_replace_io?5()
revpimodio2.modio.RevPiModIO._create_myfh?5() revpimodio2.modio.RevPiModIO._create_myfh?5()
revpimodio2.modio.RevPiModIO._get_configrsc?5() revpimodio2.modio.RevPiModIO._get_configrsc?5()
revpimodio2.modio.RevPiModIO._get_cycletime?5() revpimodio2.modio.RevPiModIO._get_cycletime?5()
revpimodio2.modio.RevPiModIO._get_debug?5()
revpimodio2.modio.RevPiModIO._get_ioerrors?5() revpimodio2.modio.RevPiModIO._get_ioerrors?5()
revpimodio2.modio.RevPiModIO._get_length?5() revpimodio2.modio.RevPiModIO._get_length?5()
revpimodio2.modio.RevPiModIO._get_maxioerrors?5() revpimodio2.modio.RevPiModIO._get_maxioerrors?5()
revpimodio2.modio.RevPiModIO._get_monitoring?5() revpimodio2.modio.RevPiModIO._get_monitoring?5()
revpimodio2.modio.RevPiModIO._get_procimg?5() revpimodio2.modio.RevPiModIO._get_procimg?5()
revpimodio2.modio.RevPiModIO._get_replace_io_file?5()
revpimodio2.modio.RevPiModIO._get_simulator?5() revpimodio2.modio.RevPiModIO._get_simulator?5()
revpimodio2.modio.RevPiModIO._gotioerror?5(action, e=None) revpimodio2.modio.RevPiModIO._gotioerror?5(action, e=None)
revpimodio2.modio.RevPiModIO._set_cycletime?5(milliseconds) revpimodio2.modio.RevPiModIO._set_cycletime?5(milliseconds)
@@ -160,6 +163,7 @@ revpimodio2.modio.RevPiModIO.cleanup?4()
revpimodio2.modio.RevPiModIO.configrsc?7 revpimodio2.modio.RevPiModIO.configrsc?7
revpimodio2.modio.RevPiModIO.cycleloop?4(func, cycletime=50) revpimodio2.modio.RevPiModIO.cycleloop?4(func, cycletime=50)
revpimodio2.modio.RevPiModIO.cycletime?7 revpimodio2.modio.RevPiModIO.cycletime?7
revpimodio2.modio.RevPiModIO.debug?7
revpimodio2.modio.RevPiModIO.exit?4(full=True) revpimodio2.modio.RevPiModIO.exit?4(full=True)
revpimodio2.modio.RevPiModIO.export_replaced_ios?4(filename) revpimodio2.modio.RevPiModIO.export_replaced_ios?4(filename)
revpimodio2.modio.RevPiModIO.get_jconfigrsc?4() revpimodio2.modio.RevPiModIO.get_jconfigrsc?4()
@@ -171,6 +175,7 @@ revpimodio2.modio.RevPiModIO.maxioerrors?7
revpimodio2.modio.RevPiModIO.monitoring?7 revpimodio2.modio.RevPiModIO.monitoring?7
revpimodio2.modio.RevPiModIO.procimg?7 revpimodio2.modio.RevPiModIO.procimg?7
revpimodio2.modio.RevPiModIO.readprocimg?4(device=None) revpimodio2.modio.RevPiModIO.readprocimg?4(device=None)
revpimodio2.modio.RevPiModIO.replace_io_file?7
revpimodio2.modio.RevPiModIO.resetioerrors?4() revpimodio2.modio.RevPiModIO.resetioerrors?4()
revpimodio2.modio.RevPiModIO.setdefaultvalues?4(device=None) revpimodio2.modio.RevPiModIO.setdefaultvalues?4(device=None)
revpimodio2.modio.RevPiModIO.simulator?7 revpimodio2.modio.RevPiModIO.simulator?7

View File

@@ -1,6 +1,7 @@
Base Device Base Device
Connect Core Connect Core
Core Base Core Base
DeviceNotFoundError Exception
DioModule Device DioModule Device
EventCallback Thread EventCallback Thread
Gateway Device Gateway Device

View File

@@ -38,6 +38,13 @@ MEM = 302
warnings.simplefilter(action="always") warnings.simplefilter(action="always")
class DeviceNotFoundError(Exception):
"""Fehler wenn ein Device nicht gefunden wird."""
pass
def acheck(check_type, **kwargs): def acheck(check_type, **kwargs):
"""Check type of given arguments. """Check type of given arguments.

View File

@@ -72,7 +72,7 @@ class DeviceList(object):
"""Gibt Iterator aller Devices zurueck. """Gibt Iterator aller Devices zurueck.
Die Reihenfolge ist nach Position im Prozessabbild sortiert und nicht Die Reihenfolge ist nach Position im Prozessabbild sortiert und nicht
nach Position (Dies entspricht der Positionierung aus piCtory)! nach Positionsnummer (Dies entspricht der Positionierung aus piCtory)!
@return <class 'iter'> aller Devices""" @return <class 'iter'> aller Devices"""
for dev in sorted( for dev in sorted(
@@ -106,7 +106,7 @@ class Device(object):
""" """
__slots__ = "_ba_devdata", "_ba_datacp", \ __slots__ = "__my_io_list", "_ba_devdata", "_ba_datacp", \
"_dict_events", "_filelock", "_length", "_modio", "_name", "_offset", \ "_dict_events", "_filelock", "_length", "_modio", "_name", "_offset", \
"_position", "_producttype", "_selfupdate", "_slc_devoff", \ "_position", "_producttype", "_selfupdate", "_slc_devoff", \
"_slc_inp", "_slc_inpoff", "_slc_mem", "_slc_memoff", \ "_slc_inp", "_slc_inpoff", "_slc_mem", "_slc_memoff", \
@@ -126,6 +126,7 @@ class Device(object):
self._dict_events = {} self._dict_events = {}
self._filelock = Lock() self._filelock = Lock()
self._length = 0 self._length = 0
self.__my_io_list = []
self._selfupdate = False self._selfupdate = False
# Wertzuweisung aus dict_device # Wertzuweisung aus dict_device
@@ -182,6 +183,9 @@ class Device(object):
# Spezielle Konfiguration von abgeleiteten Klassen durchführen # Spezielle Konfiguration von abgeleiteten Klassen durchführen
self._devconfigure() self._devconfigure()
# IO Liste aktualisieren für schnellen Indexzugriff
self._update_my_io_list()
def __bytes__(self): def __bytes__(self):
"""Gibt alle Daten des Devices als <class 'bytes'> zurueck. """Gibt alle Daten des Devices als <class 'bytes'> zurueck.
@return Devicedaten als <class 'bytes'>""" @return Devicedaten als <class 'bytes'>"""
@@ -205,6 +209,12 @@ class Device(object):
return key in self._modio.io \ return key in self._modio.io \
and getattr(self._modio.io, key)._parentdevice == self and getattr(self._modio.io, key)._parentdevice == self
def __getitem__(self, key):
"""Gibt IO an angegebener Stelle zurueck.
@param key Index des IOs auf dem device als <class 'int'>
@return Gefundenes IO-Objekt"""
return self.__my_io_list[key]
def __int__(self): def __int__(self):
"""Gibt die Positon im RevPi Bus zurueck. """Gibt die Positon im RevPi Bus zurueck.
@return Positionsnummer""" @return Positionsnummer"""
@@ -312,6 +322,10 @@ class Device(object):
@return Deviceprodukttyp""" @return Deviceprodukttyp"""
return self._producttype return self._producttype
def _update_my_io_list(self):
"""Erzeugt eine neue IO Liste fuer schnellen Zugriff."""
self.__my_io_list = list(self.__iter__())
def autorefresh(self, activate=True): def autorefresh(self, activate=True):
"""Registriert dieses Device fuer die automatische Synchronisierung. """Registriert dieses Device fuer die automatische Synchronisierung.
@param activate Default True fuegt Device zur Synchronisierung hinzu""" @param activate Default True fuegt Device zur Synchronisierung hinzu"""

View File

@@ -413,6 +413,8 @@ class ProcimgWriter(Thread):
if self.__eventwork != value: if self.__eventwork != value:
with self.lck_refresh: with self.lck_refresh:
self.__eventwork = value self.__eventwork = value
if not value:
# Nur leeren beim deaktivieren
self.__eventqth = queue.Queue() self.__eventqth = queue.Queue()
self._eventq = queue.Queue() self._eventq = queue.Queue()
self.__dict_delay = {} self.__dict_delay = {}

View File

@@ -19,15 +19,16 @@ class IOEvent(object):
"""Basisklasse fuer IO-Events.""" """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.""" """Init IOEvent class."""
self.as_thread = as_thread self.as_thread = as_thread
self.delay = delay self.delay = delay
self.edge = edge self.edge = edge
self.func = func self.func = func
self.overwrite = overwrite self.overwrite = overwrite
self.prefire = prefire
class IOList(object): class IOList(object):
@@ -66,6 +67,7 @@ class IOList(object):
self.__dict_iobyte[io_del.address] = [] self.__dict_iobyte[io_del.address] = []
object.__delattr__(self, key) object.__delattr__(self, key)
io_del._parentdevice._update_my_io_list()
def __getattr__(self, key): def __getattr__(self, key):
"""Verwaltet geloeschte IOs (Attribute, die nicht existieren). """Verwaltet geloeschte IOs (Attribute, die nicht existieren).
@@ -123,10 +125,10 @@ class IOList(object):
def __setattr__(self, key, value): def __setattr__(self, key, value):
"""Verbietet aus Leistungsguenden das direkte Setzen von Attributen.""" """Verbietet aus Leistungsguenden das direkte Setzen von Attributen."""
if key in [ if key in (
"_IOList__dict_iobyte", "_IOList__dict_iobyte",
"_IOList__dict_iorefname" "_IOList__dict_iorefname"
]: ):
object.__setattr__(self, key, value) object.__setattr__(self, key, value)
else: else:
raise AttributeError( raise AttributeError(
@@ -219,6 +221,9 @@ class IOList(object):
None, None, None, None, None, None, None, None None, None, None, None, None, None, None, None
] ]
self.__dict_iobyte[new_io.address][new_io._bitaddress] = new_io self.__dict_iobyte[new_io.address][new_io._bitaddress] = new_io
if type(new_io) is StructIO:
new_io._parentdevice._update_my_io_list()
else: else:
raise TypeError("io must be <class 'IOBase'> or sub class") raise TypeError("io must be <class 'IOBase'> or sub class")
@@ -375,7 +380,7 @@ class IOBase(object):
@return Namen des IOs""" @return Namen des IOs"""
return self._name 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. """Verwaltet reg_event und reg_timerevent.
@param func Funktion die bei Aenderung aufgerufen werden soll @param func Funktion die bei Aenderung aufgerufen werden soll
@@ -383,6 +388,7 @@ class IOBase(object):
@param edge Ausfuehren bei RISING, FALLING or BOTH Wertaenderung @param edge Ausfuehren bei RISING, FALLING or BOTH Wertaenderung
@param as_thread Bei True, Funktion als EventCallback-Thread ausfuehren @param as_thread Bei True, Funktion als EventCallback-Thread ausfuehren
@param overwrite Wenn True, wird Event bei ueberschrieben @param overwrite Wenn True, wird Event bei ueberschrieben
@param prefire Ausloesen mit aktuellem Wert, wenn mainloop startet
""" """
# Prüfen ob Funktion callable ist # Prüfen ob Funktion callable ist
@@ -398,11 +404,15 @@ class IOBase(object):
raise ValueError( raise ValueError(
"parameter 'edge' can be used with bit io objects only" "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: if self not in self._parentdevice._dict_events:
with self._parentdevice._filelock: with self._parentdevice._filelock:
self._parentdevice._dict_events[self] = \ self._parentdevice._dict_events[self] = \
[IOEvent(func, edge, as_thread, delay, overwrite)] [IOEvent(func, edge, as_thread, delay, overwrite, prefire)]
else: else:
# Prüfen ob Funktion schon registriert ist # Prüfen ob Funktion schon registriert ist
for regfunc in self._parentdevice._dict_events[self]: for regfunc in self._parentdevice._dict_events[self]:
@@ -436,7 +446,7 @@ class IOBase(object):
# Eventfunktion einfügen # Eventfunktion einfügen
with self._parentdevice._filelock: with self._parentdevice._filelock:
self._parentdevice._dict_events[self].append( 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): def _get_address(self):
@@ -471,7 +481,8 @@ class IOBase(object):
else: else:
return bytes(self._parentdevice._ba_devdata[self._slc_address]) 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. """Registriert fuer IO ein Event bei der Eventueberwachung.
Die uebergebene Funktion wird ausgefuehrt, wenn sich der IO Wert Die uebergebene Funktion wird ausgefuehrt, wenn sich der IO Wert
@@ -485,9 +496,10 @@ class IOBase(object):
@param delay Verzoegerung in ms zum Ausloesen wenn Wert gleich bleibt @param delay Verzoegerung in ms zum Ausloesen wenn Wert gleich bleibt
@param edge Ausfuehren bei RISING, FALLING or BOTH Wertaenderung @param edge Ausfuehren bei RISING, FALLING or BOTH Wertaenderung
@param as_thread Bei True, Funktion als EventCallback-Thread ausfuehren @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): def reg_timerevent(self, func, delay, edge=BOTH, as_thread=False):
"""Registriert fuer IO einen Timer, welcher nach delay func ausfuehrt. """Registriert fuer IO einen Timer, welcher nach delay func ausfuehrt.
@@ -508,7 +520,7 @@ class IOBase(object):
@param as_thread Bei True, Funktion als EventCallback-Thread ausfuehren @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): def set_value(self, value):
"""Setzt den Wert des IOs. """Setzt den Wert des IOs.
@@ -982,6 +994,7 @@ class IntIOReplaceable(IntIO):
- delay: Verzoegerung in ms zum Ausloesen wenn Wert gleich bleibt - delay: Verzoegerung in ms zum Ausloesen wenn Wert gleich bleibt
- edge: Event ausfuehren bei RISING, FALLING or BOTH Wertaenderung - edge: Event ausfuehren bei RISING, FALLING or BOTH Wertaenderung
- as_thread: Fuehrt die event-Funktion als RevPiCallback-Thread aus - as_thread: Fuehrt die event-Funktion als RevPiCallback-Thread aus
- prefire: Ausloesen mit aktuellem Wert, wenn mainloop startet
@see <a target="_blank" @see <a target="_blank"
href="https://docs.python.org/3/library/struct.html#format-characters" href="https://docs.python.org/3/library/struct.html#format-characters"
>Python3 struct</a> >Python3 struct</a>

View File

@@ -11,7 +11,7 @@ from multiprocessing import cpu_count
from os import access, F_OK, R_OK from os import access, F_OK, R_OK
from os import stat as osstat from os import stat as osstat
from queue import Empty from queue import Empty
from revpimodio2 import acheck from revpimodio2 import acheck, DeviceNotFoundError, BOTH, RISING, FALLING
from signal import signal, SIG_DFL, SIGINT, SIGTERM from signal import signal, SIG_DFL, SIGINT, SIGTERM
from stat import S_ISCHR from stat import S_ISCHR
from threading import Thread, Event, Lock from threading import Thread, Event, Lock
@@ -397,6 +397,11 @@ class RevPiModIO(object):
@return Millisekunden""" @return Millisekunden"""
return self._imgwriter.refresh return self._imgwriter.refresh
def _get_debug(self):
"""Gibt Status des Debugflags zurueck.
@return Status des Debugflags"""
return self._debug
def _get_ioerrors(self): def _get_ioerrors(self):
"""Getter function. """Getter function.
@return Aktuelle Anzahl gezaehlter Fehler""" @return Aktuelle Anzahl gezaehlter Fehler"""
@@ -425,6 +430,11 @@ class RevPiModIO(object):
@return Pfad des verwendeten Prozessabbilds""" @return Pfad des verwendeten Prozessabbilds"""
return self._procimg return self._procimg
def _get_replace_io_file(self):
"""Gibt Pfad zur verwendeten replace IO Datei aus.
@return Pfad zur replace IO Datei"""
return self._replace_io_file
def _get_simulator(self): def _get_simulator(self):
"""Getter function. """Getter function.
@return True, wenn als Simulator gestartet""" @return True, wenn als Simulator gestartet"""
@@ -694,7 +704,7 @@ class RevPiModIO(object):
# Optional values # Optional values
if io._bitaddress >= 0: if io._bitaddress >= 0:
cp[io.name]["bitaddress"] = str(io._bitaddress) cp[io.name]["bit"] = str(io._bitaddress)
cp[io.name]["byteorder"] = io._byteorder cp[io.name]["byteorder"] = io._byteorder
cp[io.name]["defaultvalue"] = str(io.defaultvalue) cp[io.name]["defaultvalue"] = str(io.defaultvalue)
if io.bmk != "": if io.bmk != "":
@@ -822,11 +832,29 @@ class RevPiModIO(object):
self._exit.clear() self._exit.clear()
self._looprunning = True 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: for dev in self._lst_refresh:
with dev._filelock: with dev._filelock:
dev._ba_datacp = dev._ba_devdata[:] 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 # ImgWriter mit Eventüberwachung aktivieren
self._imgwriter._collect_events(True) self._imgwriter._collect_events(True)
e = None e = None
@@ -1054,6 +1082,7 @@ class RevPiModIO(object):
return workokay return workokay
debug = property(_get_debug)
configrsc = property(_get_configrsc) configrsc = property(_get_configrsc)
cycletime = property(_get_cycletime, _set_cycletime) cycletime = property(_get_cycletime, _set_cycletime)
ioerrors = property(_get_ioerrors) ioerrors = property(_get_ioerrors)
@@ -1061,6 +1090,7 @@ class RevPiModIO(object):
maxioerrors = property(_get_maxioerrors, _set_maxioerrors) maxioerrors = property(_get_maxioerrors, _set_maxioerrors)
monitoring = property(_get_monitoring) monitoring = property(_get_monitoring)
procimg = property(_get_procimg) procimg = property(_get_procimg)
replace_io_file = property(_get_replace_io_file)
simulator = property(_get_simulator) simulator = property(_get_simulator)
@@ -1115,20 +1145,20 @@ class RevPiModIOSelected(RevPiModIO):
if len(self.device) == 0: if len(self.device) == 0:
if type(self) == RevPiModIODriver: if type(self) == RevPiModIODriver:
raise RuntimeError( raise DeviceNotFoundError(
"could not find any given VIRTUAL devices in config" "could not find any given VIRTUAL devices in config"
) )
else: else:
raise RuntimeError( raise DeviceNotFoundError(
"could not find any given devices in config" "could not find any given devices in config"
) )
elif len(self.device) != len(self._lst_devselect): elif len(self.device) != len(self._lst_devselect):
if type(self) == RevPiModIODriver: if type(self) == RevPiModIODriver:
raise RuntimeError( raise DeviceNotFoundError(
"could not find all given VIRTUAL devices in config" "could not find all given VIRTUAL devices in config"
) )
else: else:
raise RuntimeError( raise DeviceNotFoundError(
"could not find all given devices in config" "could not find all given devices in config"
) )

View File

@@ -3,11 +3,11 @@
__author__ = "Sven Sager" __author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager" __copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "LGPLv3" __license__ = "LGPLv3"
import socket import socket
import warnings import warnings
from json import loads as jloads from json import loads as jloads
from re import compile from re import compile
from revpimodio2 import DeviceNotFoundError
from threading import Thread, Event, Lock from threading import Thread, Event, Lock
from .device import Device from .device import Device
@@ -698,20 +698,20 @@ class RevPiNetIOSelected(RevPiNetIO):
if len(self.device) == 0: if len(self.device) == 0:
if type(self) == RevPiNetIODriver: if type(self) == RevPiNetIODriver:
raise RuntimeError( raise DeviceNotFoundError(
"could not find any given VIRTUAL devices in config" "could not find any given VIRTUAL devices in config"
) )
else: else:
raise RuntimeError( raise DeviceNotFoundError(
"could not find any given devices in config" "could not find any given devices in config"
) )
elif len(self.device) != len(self._lst_devselect): elif len(self.device) != len(self._lst_devselect):
if type(self) == RevPiNetIODriver: if type(self) == RevPiNetIODriver:
raise RuntimeError( raise DeviceNotFoundError(
"could not find all given VIRTUAL devices in config" "could not find all given VIRTUAL devices in config"
) )
else: else:
raise RuntimeError( raise DeviceNotFoundError(
"could not find all given devices in config" "could not find all given devices in config"
) )