From d61d76b6f3dc5e2827d13bcabfc474418aa836ea Mon Sep 17 00:00:00 2001 From: NaruX Date: Tue, 20 Aug 2019 09:36:19 +0200 Subject: [PATCH] =?UTF-8?q?Bugfix:=20prefire=20mit=20as=5Fthread=20hatte?= =?UTF-8?q?=20Fehler=20bei=20=C3=9Cbergabe=20in=20Queue=20Netzwerkklassen?= =?UTF-8?q?=20zeigen=20=C3=BCber=20.config=5Fchanged=20an,=20dass=20Neuins?= =?UTF-8?q?tanzierung=20n=C3=B6tig=20ist=20=5Fconnect=20von=20NetFH=20l?= =?UTF-8?q?=C3=B6st=20ConfigChanged-Exception=20aus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/revpimodio2.netio.html | 38 ++++++++++++++++++++++++++++++++++++-- eric-revpimodio2.api | 4 ++++ revpimodio2/helper.py | 14 +++++++------- revpimodio2/modio.py | 2 +- revpimodio2/netio.py | 31 +++++++++++++++++++++++++------ 5 files changed, 73 insertions(+), 16 deletions(-) diff --git a/doc/revpimodio2.netio.html b/doc/revpimodio2.netio.html index 98bea51..3f674ae 100644 --- a/doc/revpimodio2.netio.html +++ b/doc/revpimodio2.netio.html @@ -122,7 +122,7 @@ Thread

Class Attributes

- +
__slots__
closed
name
reconnecting
timeout
__slots__
closed
config_changed
name
reconnecting
timeout

Class Methods

@@ -163,6 +163,9 @@ Methods get_closed Pruefen ob Verbindung geschlossen ist. +get_config_changed +Pruefen ob RevPi Konfiguration geaendert wurde. + get_name Verbindugnsnamen zurueckgeben. @@ -307,6 +310,17 @@ Pruefen ob Verbindung geschlossen ist.
True, wenn Verbindung geschlossen ist
+ +

+NetFH.get_config_changed

+get_config_changed() +

+Pruefen ob RevPi Konfiguration geaendert wurde. +

+
Returns:
+
+True, wenn RevPi Konfiguration geaendert ist +

NetFH.get_name

@@ -484,7 +498,7 @@ _RevPiModIO

Class Attributes

- +
__slots__
reconnecting
__slots__
config_changed
reconnecting

Class Methods

@@ -510,6 +524,9 @@ Methods exit Beendet mainloop() und optional autorefresh. +get_config_changed +Pruefen ob RevPi Konfiguration geaendert wurde. + get_jconfigrsc Laedt die piCotry Konfiguration und erstellt ein . @@ -595,6 +612,20 @@ Beendet mainloop() und optional autorefresh.
#RevPiModIO.exit(...)
+ +

+RevPiNetIO.get_config_changed

+get_config_changed() +

+Pruefen ob RevPi Konfiguration geaendert wurde. +

+ In diesem Fall ist die Verbindung geschlossen und RevPiNetIO muss + neu instanziert werden. +

+
Returns:
+
+True, wenn RevPi Konfiguration geaendert ist +

RevPiNetIO.get_jconfigrsc

@@ -612,6 +643,9 @@ RevPiNetIO.get_reconnecting get_reconnecting()

Interner reconnect aktiv wegen Netzwerkfehlern. +

+ Das Modul versucht intern die Verbindung neu herzustellen. Es ist + kein weiteres Zutun noetig.

Returns:
diff --git a/eric-revpimodio2.api b/eric-revpimodio2.api index 3d2c2e1..bc83c7f 100644 --- a/eric-revpimodio2.api +++ b/eric-revpimodio2.api @@ -190,8 +190,10 @@ revpimodio2.netio.NetFH._direct_send?5(send_bytes, recv_count) revpimodio2.netio.NetFH.clear_dirtybytes?4(position=None) revpimodio2.netio.NetFH.close?4() revpimodio2.netio.NetFH.closed?7 +revpimodio2.netio.NetFH.config_changed?7 revpimodio2.netio.NetFH.flush?4() revpimodio2.netio.NetFH.get_closed?4() +revpimodio2.netio.NetFH.get_config_changed?4() revpimodio2.netio.NetFH.get_name?4() revpimodio2.netio.NetFH.get_reconnecting?4() revpimodio2.netio.NetFH.get_timeout?4() @@ -211,8 +213,10 @@ revpimodio2.netio.NetFH.write?4(bytebuff) revpimodio2.netio.NetFH?1(address, check_replace_ios, timeout=500) revpimodio2.netio.RevPiNetIO._create_myfh?5() revpimodio2.netio.RevPiNetIO._get_cpreplaceio?5() +revpimodio2.netio.RevPiNetIO.config_changed?7 revpimodio2.netio.RevPiNetIO.disconnect?4() revpimodio2.netio.RevPiNetIO.exit?4(full=True) +revpimodio2.netio.RevPiNetIO.get_config_changed?4() revpimodio2.netio.RevPiNetIO.get_jconfigrsc?4() revpimodio2.netio.RevPiNetIO.get_reconnecting?4() revpimodio2.netio.RevPiNetIO.net_cleardefaultvalues?4(device=None) diff --git a/revpimodio2/helper.py b/revpimodio2/helper.py index 0197694..abb8bcc 100644 --- a/revpimodio2/helper.py +++ b/revpimodio2/helper.py @@ -289,7 +289,7 @@ class ProcimgWriter(Thread): """ - __slots__ = "__dict_delay", "__eventth", "__eventqth", "__eventwork", \ + __slots__ = "__dict_delay", "__eventth", "_eventqth", "__eventwork", \ "_adjwait", "_eventq", "_ioerror", "_maxioerrors", "_modio", \ "_refresh", "_work", "daemon", "lck_refresh", "newdata" @@ -299,7 +299,7 @@ class ProcimgWriter(Thread): super().__init__() self.__dict_delay = {} self.__eventth = Thread(target=self.__exec_th) - self.__eventqth = queue.Queue() + self._eventqth = queue.Queue() self.__eventwork = False self._adjwait = 0 self._eventq = queue.Queue() @@ -340,7 +340,7 @@ class ProcimgWriter(Thread): or regfunc.edge == FALLING and not boolor: if regfunc.delay == 0: if regfunc.as_thread: - self.__eventqth.put( + self._eventqth.put( (regfunc, io_event._name, io_event.value), False ) @@ -363,7 +363,7 @@ class ProcimgWriter(Thread): for regfunc in dev._dict_events[io_event]: if regfunc.delay == 0: if regfunc.as_thread: - self.__eventqth.put( + self._eventqth.put( (regfunc, io_event._name, io_event.value), False ) @@ -390,7 +390,7 @@ class ProcimgWriter(Thread): """Laeuft als Thread, der Events als Thread startet.""" while self.__eventwork: try: - tup_fireth = self.__eventqth.get(timeout=1) + tup_fireth = self._eventqth.get(timeout=1) th = EventCallback( tup_fireth[0].func, tup_fireth[1], tup_fireth[2] ) @@ -415,7 +415,7 @@ class ProcimgWriter(Thread): self.__eventwork = value if not value: # Nur leeren beim deaktivieren - self.__eventqth = queue.Queue() + self._eventqth = queue.Queue() self._eventq = queue.Queue() self.__dict_delay = {} @@ -533,7 +533,7 @@ class ProcimgWriter(Thread): if self.__dict_delay[tup_fire] <= 0: # Verzögertes Event übernehmen und löschen if tup_fire[0].as_thread: - self.__eventqth.put(tup_fire, False) + self._eventqth.put(tup_fire, False) else: self._eventq.put(tup_fire, False) del self.__dict_delay[tup_fire] diff --git a/revpimodio2/modio.py b/revpimodio2/modio.py index 401b4fc..f21a5e3 100644 --- a/revpimodio2/modio.py +++ b/revpimodio2/modio.py @@ -850,7 +850,7 @@ class RevPiModIO(object): or regfunc.edge == RISING and io.value \ or regfunc.edge == FALLING and not io.value: if regfunc.as_thread: - self._imgwriter.__eventqth.put( + self._imgwriter._eventqth.put( (regfunc, io._name, io.value), False ) else: diff --git a/revpimodio2/netio.py b/revpimodio2/netio.py index db500ce..1c9eeb7 100644 --- a/revpimodio2/netio.py +++ b/revpimodio2/netio.py @@ -187,6 +187,9 @@ class NetFH(Thread): "configuration on revolution pi was changed") else: self.__replace_ios_h = byte_buff[16:] + except ConfigChanged: + so.close() + raise except Exception: so.close() else: @@ -228,9 +231,7 @@ class NetFH(Thread): """Entfernt die konfigurierten Dirtybytes vom RevPi Slave. @param position Startposition der Dirtybytes""" if self.__config_changed: - raise ConfigChanged( - "configuration on revolution pi was changed" - ) + raise ConfigChanged("configuration on revolution pi was changed") if self.__sockend.is_set(): raise ValueError("I/O operation on closed file") @@ -301,9 +302,7 @@ class NetFH(Thread): def flush(self): """Schreibpuffer senden.""" if self.__config_changed: - raise ConfigChanged( - "configuration on revolution pi was changed" - ) + raise ConfigChanged("configuration on revolution pi was changed") if self.__sockend.is_set(): raise ValueError("flush of closed file") @@ -337,6 +336,11 @@ class NetFH(Thread): @return True, wenn Verbindung geschlossen ist""" return self.__sockend.is_set() + def get_config_changed(self): + """Pruefen ob RevPi Konfiguration geaendert wurde. + @return True, wenn RevPi Konfiguration geaendert ist""" + return self.__config_changed + def get_name(self): """Verbindugnsnamen zurueckgeben. @return IP:PORT""" @@ -621,6 +625,7 @@ class NetFH(Thread): return len(bytebuff) closed = property(get_closed) + config_changed = property(get_config_changed) name = property(get_name) reconnecting = property(get_reconnecting) timeout = property(get_timeout, set_timeout) @@ -755,6 +760,15 @@ class RevPiNetIO(_RevPiModIO): except ConfigChanged: pass + def get_config_changed(self): + """Pruefen ob RevPi Konfiguration geaendert wurde. + + In diesem Fall ist die Verbindung geschlossen und RevPiNetIO muss + neu instanziert werden. + + @return True, wenn RevPi Konfiguration geaendert ist""" + return self._myfh.config_changed + def get_jconfigrsc(self): """Laedt die piCotry Konfiguration und erstellt ein . @return der piCtory Konfiguration""" @@ -765,6 +779,10 @@ class RevPiNetIO(_RevPiModIO): def get_reconnecting(self): """Interner reconnect aktiv wegen Netzwerkfehlern. + + Das Modul versucht intern die Verbindung neu herzustellen. Es ist + kein weiteres Zutun noetig. + @return True, wenn reconnect aktiv""" return self._myfh.reconnecting @@ -835,6 +853,7 @@ class RevPiNetIO(_RevPiModIO): dev._offset + dev._slc_out.start, dirtybytes ) + config_changed = property(get_config_changed) reconnecting = property(get_reconnecting)