Mit replace_ios zusammenführen

.is_set() bearbeitet
This commit is contained in:
2019-08-17 19:03:23 +02:00
6 changed files with 171 additions and 62 deletions

View File

@@ -86,6 +86,9 @@ Methods</h3>
<td><a style="color:#0000FF" href="#RevPiModIO._get_configrsc">_get_configrsc</a></td>
<td>Getter function.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiModIO._get_cpreplaceio">_get_cpreplaceio</a></td>
<td>Laed die replace_io_file Konfiguration und verarbeitet sie.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiModIO._get_cycletime">_get_cycletime</a></td>
<td>Gibt Aktualisierungsrate in ms der Prozessabbildsynchronisierung aus.</td>
</tr><tr>
@@ -231,19 +234,27 @@ RevPiModIO._configure</h3>
<b>_configure</b>(<i>jconfigrsc</i>)
<p>
Verarbeitet die piCtory Konfigurationsdatei.
</p><a NAME="RevPiModIO._configure_replace_io" ID="RevPiModIO._configure_replace_io"></a>
</p><dl>
<dt><i>jconfigrsc:</i></dt>
<dd>
Data to build IOs as <class 'dict'> of JSON
</dd>
</dl><a NAME="RevPiModIO._configure_replace_io" ID="RevPiModIO._configure_replace_io"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiModIO._configure_replace_io</h3>
<b>_configure_replace_io</b>(<i></i>)
<b>_configure_replace_io</b>(<i>creplaceio</i>)
<p>
Importiert ersetzte IOs in diese Instanz.
</p><p>
Importiert ersetzte IOs, welche vorher mit .export_replaced_ios(...)
in eine Datei exportiert worden sind. Diese IOs werden in dieser
Instanz wiederhergestellt.
</p><p>
</p><a NAME="RevPiModIO._create_myfh" ID="RevPiModIO._create_myfh"></a>
</p><dl>
<dt><i>ireplaceio:</i></dt>
<dd>
Data to replace ios as <class 'ConfigParser'>
</dd>
</dl><a NAME="RevPiModIO._create_myfh" ID="RevPiModIO._create_myfh"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiModIO._create_myfh</h3>
<b>_create_myfh</b>(<i></i>)
@@ -261,6 +272,17 @@ Getter function.
<dd>
Pfad der verwendeten piCtory Konfiguration
</dd>
</dl><a NAME="RevPiModIO._get_cpreplaceio" ID="RevPiModIO._get_cpreplaceio"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiModIO._get_cpreplaceio</h3>
<b>_get_cpreplaceio</b>(<i></i>)
<p>
Laed die replace_io_file Konfiguration und verarbeitet sie.
</p><dl>
<dt>Returns:</dt>
<dd>
<class 'ConfigParser'> der replace io daten
</dd>
</dl><a NAME="RevPiModIO._get_cycletime" ID="RevPiModIO._get_cycletime"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiModIO._get_cycletime</h3>

View File

@@ -12,7 +12,7 @@ RevPiModIO Hauptklasse fuer Netzwerkzugriff.
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr><tr><td>_sysdeldirty</td></tr><tr><td>_sysexit</td></tr><tr><td>_sysflush</td></tr><tr><td>_syspictory</td></tr><tr><td>_syssync</td></tr>
<tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr><tr><td>_sysdeldirty</td></tr><tr><td>_sysexit</td></tr><tr><td>_sysflush</td></tr><tr><td>_syspictory</td></tr><tr><td>_sysreplaceio</td></tr><tr><td>_syssync</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
@@ -147,6 +147,9 @@ Methods</h3>
<td><a style="color:#0000FF" href="#NetFH.readpictory">readpictory</a></td>
<td>Ruft die piCtory Konfiguration ab.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#NetFH.readreplaceio">readreplaceio</a></td>
<td>Ruft die replace_io Konfiguration ab.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#NetFH.run">run</a></td>
<td>Handler fuer Synchronisierung.</td>
</tr><tr>
@@ -341,6 +344,17 @@ Ruft die piCtory Konfiguration ab.
<dd>
<class 'bytes'> piCtory Datei
</dd>
</dl><a NAME="NetFH.readreplaceio" ID="NetFH.readreplaceio"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
NetFH.readreplaceio</h3>
<b>readreplaceio</b>(<i></i>)
<p>
Ruft die replace_io Konfiguration ab.
</p><dl>
<dt>Returns:</dt>
<dd>
<class 'bytes'> replace_io_file
</dd>
</dl><a NAME="NetFH.run" ID="NetFH.run"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
NetFH.run</h3>
@@ -450,6 +464,9 @@ Methods</h3>
<td><a style="color:#0000FF" href="#RevPiNetIO._create_myfh">_create_myfh</a></td>
<td>Erstellt NetworkFileObject.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiNetIO._get_cpreplaceio">_get_cpreplaceio</a></td>
<td>Laed die replace_io Konfiguration ueber das Netzwerk.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiNetIO.disconnect">disconnect</a></td>
<td>Trennt Verbindungen und beendet autorefresh inkl.</td>
</tr><tr>
@@ -510,7 +527,18 @@ RevPiNetIO._create_myfh</h3>
<p>
Erstellt NetworkFileObject.
return FileObject
</p><a NAME="RevPiNetIO.disconnect" ID="RevPiNetIO.disconnect"></a>
</p><a NAME="RevPiNetIO._get_cpreplaceio" ID="RevPiNetIO._get_cpreplaceio"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiNetIO._get_cpreplaceio</h3>
<b>_get_cpreplaceio</b>(<i></i>)
<p>
Laed die replace_io Konfiguration ueber das Netzwerk.
</p><dl>
<dt>Returns:</dt>
<dd>
<class 'ConfigParser'> der replace io daten
</dd>
</dl><a NAME="RevPiNetIO.disconnect" ID="RevPiNetIO.disconnect"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiNetIO.disconnect</h3>
<b>disconnect</b>(<i></i>)

View File

@@ -142,9 +142,10 @@ revpimodio2.io.StructIO.signed?7
revpimodio2.io.StructIO.value?7
revpimodio2.io.StructIO?1(parentio, name, frm, **kwargs)
revpimodio2.modio.RevPiModIO._configure?5(jconfigrsc)
revpimodio2.modio.RevPiModIO._configure_replace_io?5()
revpimodio2.modio.RevPiModIO._configure_replace_io?5(creplaceio)
revpimodio2.modio.RevPiModIO._create_myfh?5()
revpimodio2.modio.RevPiModIO._get_configrsc?5()
revpimodio2.modio.RevPiModIO._get_cpreplaceio?5()
revpimodio2.modio.RevPiModIO._get_cycletime?5()
revpimodio2.modio.RevPiModIO._get_debug?5()
revpimodio2.modio.RevPiModIO._get_ioerrors?5()
@@ -198,6 +199,7 @@ revpimodio2.netio.NetFH.ioctl?4(request, arg=b'')
revpimodio2.netio.NetFH.name?7
revpimodio2.netio.NetFH.read?4(length)
revpimodio2.netio.NetFH.readpictory?4()
revpimodio2.netio.NetFH.readreplaceio?4()
revpimodio2.netio.NetFH.reconnecting?7
revpimodio2.netio.NetFH.run?4()
revpimodio2.netio.NetFH.seek?4(position)
@@ -208,6 +210,7 @@ revpimodio2.netio.NetFH.timeout?7
revpimodio2.netio.NetFH.write?4(bytebuff)
revpimodio2.netio.NetFH?1(address, timeout=500)
revpimodio2.netio.RevPiNetIO._create_myfh?5()
revpimodio2.netio.RevPiNetIO._get_cpreplaceio?5()
revpimodio2.netio.RevPiNetIO.disconnect?4()
revpimodio2.netio.RevPiNetIO.get_jconfigrsc?4()
revpimodio2.netio.RevPiNetIO.get_reconnecting?4()
@@ -221,5 +224,6 @@ revpimodio2.netio._sysdeldirty?8
revpimodio2.netio._sysexit?8
revpimodio2.netio._sysflush?8
revpimodio2.netio._syspictory?8
revpimodio2.netio._sysreplaceio?8
revpimodio2.netio._syssync?8
revpimodio2.summary.Summary?1(summary)

View File

@@ -1000,13 +1000,6 @@ class IntIOReplaceable(IntIO):
>Python3 struct</a>
"""
# Sperre prüfen
if self._parentdevice._modio._lck_replace_io:
raise RuntimeError(
"can not use this function while using an external "
"replace_io_file"
)
# StructIO erzeugen
io_new = StructIO(
self,

View File

@@ -37,7 +37,7 @@ class RevPiModIO(object):
"_maxioerrors", "_myfh", "_myfh_lck", "_monitoring", "_procimg", \
"_simulator", "_syncoutputs", "_th_mainloop", "_waitexit", \
"core", "app", "device", "exitsignal", "io", "summary", "_debug", \
"_lck_replace_io", "_replace_io_file", "_run_on_pi"
"_replace_io_file", "_run_on_pi"
def __init__(
self, autorefresh=False, monitoring=False, syncoutputs=True,
@@ -85,7 +85,6 @@ class RevPiModIO(object):
self._imgwriter = None
self._ioerror = 0
self._length = 0
self._lck_replace_io = False
self._looprunning = False
self._lst_devselect = []
self._lst_refresh = []
@@ -116,6 +115,7 @@ class RevPiModIO(object):
# Nur Konfigurieren, wenn nicht vererbt
if type(self) == RevPiModIO:
self._configure(self.get_jconfigrsc())
self._configure_replace_io(self._get_cpreplaceio())
def __del__(self):
"""Zerstoert alle Klassen um aufzuraeumen."""
@@ -138,7 +138,8 @@ class RevPiModIO(object):
self.writeprocimg()
def _configure(self, jconfigrsc):
"""Verarbeitet die piCtory Konfigurationsdatei."""
"""Verarbeitet die piCtory Konfigurationsdatei.
@param jconfigrsc: Data to build IOs as <class 'dict'> of JSON"""
# Filehandler konfigurieren, wenn er noch nicht existiert
if self._myfh is None:
@@ -262,11 +263,6 @@ class RevPiModIO(object):
Warning
)
# Replace IO aus Datei verarbeiten
if self._replace_io_file is not None:
self._configure_replace_io()
self._lck_replace_io = True
# ImgWriter erstellen
self._imgwriter = helpermodule.ProcimgWriter(self)
@@ -301,76 +297,67 @@ class RevPiModIO(object):
# Summary Klasse instantiieren
self.summary = summarymodule.Summary(jconfigrsc["Summary"])
def _configure_replace_io(self):
def _configure_replace_io(self, creplaceio):
"""Importiert ersetzte IOs in diese Instanz.
Importiert ersetzte IOs, welche vorher mit .export_replaced_ios(...)
in eine Datei exportiert worden sind. Diese IOs werden in dieser
Instanz wiederhergestellt.
@param ireplaceio: Data to replace ios as <class 'ConfigParser'>
"""
cp = ConfigParser()
try:
with open(self._replace_io_file, "r") as fh:
cp.read_file(fh)
except Exception as e:
raise RuntimeError(
"replace_io_file: could not read file '{0}' | {1}"
"".format(self._replace_io_file, e)
)
for io in cp:
for io in creplaceio:
if io == "DEFAULT":
continue
# IO prüfen
parentio = cp[io].get("replace", "")
parentio = creplaceio[io].get("replace", "")
# Funktionsaufruf vorbereiten
dict_replace = {
"frm": cp[io].get("frm"),
"frm": creplaceio[io].get("frm"),
}
# Convert defaultvalue from config file
if "defaultvalue" in cp[io]:
if "defaultvalue" in creplaceio[io]:
if dict_replace["frm"] == "?":
try:
dict_replace["defaultvalue"] = \
cp[io].getboolean("defaultvalue")
creplaceio[io].getboolean("defaultvalue")
except Exception:
raise ValueError(
"replace_io_file: could not convert '{0}' "
"defaultvalue '{1}' to boolean"
"".format(io, cp[io].get("defaultvalue"))
"".format(io, creplaceio[io].get("defaultvalue"))
)
else:
try:
dict_replace["defaultvalue"] = \
cp[io].getint("defaultvalue")
creplaceio[io].getint("defaultvalue")
except Exception:
raise ValueError(
"replace_io_file: could not convert '{0}' "
"defaultvalue '{1}' to integer"
"".format(io, cp[io].get("bit"))
"".format(io, creplaceio[io].get("bit"))
)
# Get bitaddress from config file
if "bit" in cp[io]:
if "bit" in creplaceio[io]:
try:
dict_replace["bit"] = cp[io].getint("bit", 0)
dict_replace["bit"] = creplaceio[io].getint("bit", 0)
except Exception:
raise ValueError(
"replace_io_file: could not convert '{0}' "
"bit '{1}' to integer"
"".format(io, cp[io].get("bit"))
"".format(io, creplaceio[io].get("bit"))
)
# Sonstige Werte laden, wenn vorhanden
if "bmk" in cp[io]:
dict_replace["bmk"] = cp[io].get("bmk")
if "byteorder" in cp[io]:
dict_replace["byteorder"] = cp[io].get("byteorder")
if "bmk" in creplaceio[io]:
dict_replace["bmk"] = creplaceio[io].get("bmk")
if "byteorder" in creplaceio[io]:
dict_replace["byteorder"] = creplaceio[io].get("byteorder")
# IO ersetzen
try:
@@ -392,6 +379,25 @@ class RevPiModIO(object):
@return Pfad der verwendeten piCtory Konfiguration"""
return self._configrsc
def _get_cpreplaceio(self):
"""Laed die replace_io_file Konfiguration und verarbeitet sie.
@return <class 'ConfigParser'> der replace io daten"""
cp = ConfigParser()
# TODO: verfeinern!
if self._replace_io_file:
try:
with open(self._replace_io_file, "r") as fh:
cp.read_file(fh)
except Exception as e:
raise RuntimeError(
"replace_io_file: could not read/parse file '{0}' | {1}"
"".format(self._replace_io_file, e)
)
return cp
def _get_cycletime(self):
"""Gibt Aktualisierungsrate in ms der Prozessabbildsynchronisierung aus.
@return Millisekunden"""
@@ -1141,6 +1147,7 @@ class RevPiModIOSelected(RevPiModIO):
)
self._configure(self.get_jconfigrsc())
self._configure_replace_io(self._get_cpreplaceio())
if len(self.device) == 0:
if type(self) == RevPiModIODriver:

View File

@@ -5,6 +5,7 @@ __copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "LGPLv3"
import socket
import warnings
from configparser import ConfigParser
from json import loads as jloads
from re import compile
from revpimodio2 import DeviceNotFoundError
@@ -21,6 +22,8 @@ _sysexit = b'\x01EX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
_sysdeldirty = b'\x01EY\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x17'
# piCtory Konfiguration laden
_syspictory = b'\x01PI\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
# ReplaceIO Konfiguration laden
_sysreplaceio = b'\x01RP\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
# Übertragene Bytes schreiben
_sysflush = b'\x01SD\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x17'
@@ -358,19 +361,48 @@ class NetFH(Thread):
self._slavesock.send(_syspictory)
byte_buff = bytearray()
while not self.__sockend.is_set():
data = self._slavesock.recv(256)
zero_byte = 0
while not self.__sockend.is_set() and zero_byte < 100:
data = self._slavesock.recv(128)
if data == b'':
zero_byte += 1
byte_buff += data
if data.find(b'\x04') >= 0:
self.__trigger = True
# NOTE: Nur suchen oder Ende prüfen?
return byte_buff[:-1]
return bytes(byte_buff[:-1])
self.__sockerr.set()
raise IOError("readpictory error on network")
def readreplaceio(self):
"""Ruft die replace_io Konfiguration ab.
@return <class 'bytes'> replace_io_file"""
if self.__sockend:
raise ValueError("read of closed file")
with self.__socklock:
self._slavesock.send(_sysreplaceio)
byte_buff = bytearray()
zero_byte = 0
while not self.__sockend and zero_byte < 100:
data = self._slavesock.recv(128)
if data == b'':
zero_byte += 1
byte_buff += data
if data.find(b'\x04') >= 0:
# NOTE: Nur suchen oder Ende prüfen?
return bytes(byte_buff[:-1])
self.__sockerr.set()
raise IOError("readreplaceio error on network")
self.__trigger = True
def run(self):
"""Handler fuer Synchronisierung."""
while not self.__sockend.is_set():
@@ -592,15 +624,15 @@ class RevPiNetIO(_RevPiModIO):
# Vererben
super().__init__(
autorefresh,
monitoring,
syncoutputs,
"{0}:{1}".format(*self._address),
None,
simulator,
debug,
replace_io_file,
direct_output
autorefresh=autorefresh,
monitoring=monitoring,
syncoutputs=syncoutputs,
procimg="{0}:{1}".format(*self._address),
configrsc=None,
simulator=simulator,
debug=debug,
replace_io_file=replace_io_file,
direct_output=direct_output,
)
# Netzwerkfilehandler anlegen
@@ -609,6 +641,7 @@ class RevPiNetIO(_RevPiModIO):
# Nur Konfigurieren, wenn nicht vererbt
if type(self) == RevPiNetIO:
self._configure(self.get_jconfigrsc())
self._configure_replace_io(self._get_cpreplaceio())
def _create_myfh(self):
"""Erstellt NetworkFileObject.
@@ -616,6 +649,27 @@ class RevPiNetIO(_RevPiModIO):
self._buffedwrite = True
return NetFH(self._address)
def _get_cpreplaceio(self):
"""Laed die replace_io Konfiguration ueber das Netzwerk.
@return <class 'ConfigParser'> der replace io daten"""
# Normale Verwendung über Elternklasse erledigen
if self._replace_io_file != ":network:":
return super()._get_cpreplaceio()
# Replace IO Daten über das Netzwerk beziehen
byte_buff = self._myfh.readreplaceio()
cp = ConfigParser()
try:
cp.read_string(byte_buff.decode("utf-8"))
except Exception as e:
raise RuntimeError(
"replace_io_file: could not read/parse network data | {0}"
"".format(e)
)
return cp
def disconnect(self):
"""Trennt Verbindungen und beendet autorefresh inkl. alle Threads."""
self.cleanup()
@@ -751,6 +805,7 @@ class RevPiNetIOSelected(RevPiNetIO):
)
self._configure(self.get_jconfigrsc())
self._configure_replace_io(self._get_cpreplaceio())
if len(self.device) == 0:
if type(self) == RevPiNetIODriver: