From a13ba75bee6ecb62fa0df10b56f11a42e65faff5 Mon Sep 17 00:00:00 2001 From: NaruX Date: Mon, 10 Jun 2019 22:50:29 +0200 Subject: [PATCH] =?UTF-8?q?StructIO=20f=C3=BCr=20export=20erweitert=20Expo?= =?UTF-8?q?rt=20und=20Importfunktionen=20f=C3=BCr=20ersetzte=20IOs=20hinzu?= =?UTF-8?q?gef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- revpimodio2/io.py | 8 +++++- revpimodio2/modio.py | 65 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) 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