diff --git a/revpimodio2/io.py b/revpimodio2/io.py index 9b62833..9dc7c4a 100644 --- a/revpimodio2/io.py +++ b/revpimodio2/io.py @@ -950,7 +950,7 @@ class StructIO(IOBase): """ __slots__ = "__frm", "_parentio_address", "_parentio_defaultvalue", \ - "_parentio_length" + "_parentio_length", "_parentio_name" def __init__(self, parentio, name, frm, **kwargs): """Erstellt einen IO mit struct-Formatierung. @@ -975,6 +975,9 @@ class StructIO(IOBase): raise ValueError("byteorder must be 'little' or 'big'") bofrm = "<" if byteorder == "little" else ">" + # Namen des parent fuer export merken + self._parentio_name = parentio._name + if frm == "?": bitaddress = kwargs.get("bit", 0) max_bits = parentio._length * 8 @@ -995,6 +998,9 @@ class StructIO(IOBase): else: bitaddress = "" bitlength = struct.calcsize(bofrm + frm) * 8 + self._parentio_address = None + self._parentio_defaultvalue = None + self._parentio_length = None # [name,default,anzbits,adressbyte,export,adressid,bmk,bitaddress] valuelist = [ diff --git a/revpimodio2/modio.py b/revpimodio2/modio.py index 55f589a..418847b 100644 --- a/revpimodio2/modio.py +++ b/revpimodio2/modio.py @@ -5,6 +5,7 @@ __copyright__ = "Copyright (C) 2018 Sven Sager" __license__ = "LGPLv3" import warnings +from configparser import ConfigParser from json import load as jload from multiprocessing import cpu_count from os import access, F_OK, R_OK @@ -519,6 +520,36 @@ class RevPiModIO(object): if not self._monitoring: self.writeprocimg(dev) + def export_replaced_ios(self, filename): + """Exportiert ersetzte IOs dieser Instanz. + + Exportiert alle ersetzten IOs, welche mit .replace_io(...) angelegt + wurden. Die Datei kann z.B. fuer RevPiPyLoad verwndet werden um Daten + in den neuen Formaten per MQTT zu uebertragen oder mit RevPiPyControl + anzusehen. + + @param filename Dateiname fuer Exportdatei""" + acheck(str, filename=filename) + + cp = ConfigParser() + for io in self.io: + if isinstance(io, StructIO): + cp.add_section(io.name) + cp[io.name]["parentio_name"] = io._parentio_name + cp[io.name]["frm"] = io.frm + cp[io.name]["bmk"] = io.bmk + cp[io.name]["bitaddress"] = str(io._bitaddress) + cp[io.name]["byteorder"] = io._byteorder + cp[io.name]["defaultvalue"] = str(io.defaultvalue) + try: + with open(filename, "w") as fh: + cp.write(fh) + except Exception as e: + raise RuntimeError( + "could not write export file '{0}' | {1}" + "".format(filename, e) + ) + def get_jconfigrsc(self): """Laedt die piCtory Konfiguration und erstellt ein . @return der piCtory Konfiguration""" @@ -584,6 +615,39 @@ class RevPiModIO(object): signal(SIGINT, self.__evt_exit) signal(SIGTERM, self.__evt_exit) + def import_replaced_ios(self, filename): + """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 wieder hergestellt. + + @param filename Dateiname der Exportdatei""" + acheck(str, filename=filename) + + cp = ConfigParser() + try: + with open(filename, "r") as fh: + cp.read_file(fh) + except Exception as e: + raise RuntimeError( + "could not read export file '{0}' | {1}" + "".format(filename, e) + ) + + for io in cp: + if io == "DEFAULT": + continue + + self.io[cp[io].get("parentio_name")].replace_io( + io, + frm=cp[io].get("frm"), + bmk=cp[io].get("bmk"), + bit=cp[io].getint("bitaddress"), + byteorder=cp[io].get("byteorder", "little"), + defaultvalue=cp[io].getint("defaultvalue") + ) + def mainloop(self, blocking=True, no_warn=False): """Startet den Mainloop mit Eventueberwachung. @@ -977,5 +1041,6 @@ from . import device as devicemodule from . import helper as helpermodule from . import summary as summarymodule from .io import IOList +from .io import StructIO from .netio import RevPiNetIODriver, RevPiNetIO