From 76cb1f57d110a87db3f29dc8c9379b0aa1c074b2 Mon Sep 17 00:00:00 2001 From: NaruX Date: Wed, 28 Aug 2019 09:34:08 +0200 Subject: [PATCH 1/2] =?UTF-8?q?Warnmeldungen=20=C3=BCberarbeitet=20Warnung?= =?UTF-8?q?en=20erscheinen=20nur=20ein=20Mal,=20wenn=20debug=3DFalse=20ist?= =?UTF-8?q?=20Filter=20f=C3=BCr=20Warnungen=20werden=20nur=20f=C3=BCr=20Re?= =?UTF-8?q?vPiModIO=20ver=C3=A4ndert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/revpimodio2.modio.html | 14 ++++++++++++++ eric-revpimodio2.api | 1 + revpimodio2/__init__.py | 4 ---- revpimodio2/helper.py | 27 +++++++++++++++------------ revpimodio2/modio.py | 38 ++++++++++++++++++++++++++++---------- 5 files changed, 58 insertions(+), 26 deletions(-) diff --git a/doc/revpimodio2.modio.html b/doc/revpimodio2.modio.html index 8d26ae8..fe4839a 100644 --- a/doc/revpimodio2.modio.html +++ b/doc/revpimodio2.modio.html @@ -122,6 +122,9 @@ Methods _set_cycletime Setzt Aktualisierungsrate der Prozessabbild-Synchronisierung. +_set_debug +Setzt debugging Status um mehr Meldungen zu erhalten oder nicht. + _set_maxioerrors Setzt Anzahl der maximal erlaubten Fehler bei Prozessabbildzugriff. @@ -407,6 +410,17 @@ Setzt Aktualisierungsrate der Prozessabbild-Synchronisierung.
in Millisekunden
+ +

+RevPiModIO._set_debug

+_set_debug(value) +

+Setzt debugging Status um mehr Meldungen zu erhalten oder nicht. +

+
value
+
+Wenn True, werden umfangreiche Medungen angezeigt +

RevPiModIO._set_maxioerrors

diff --git a/eric-revpimodio2.api b/eric-revpimodio2.api index 28da249..c92868a 100644 --- a/eric-revpimodio2.api +++ b/eric-revpimodio2.api @@ -157,6 +157,7 @@ revpimodio2.modio.RevPiModIO._get_replace_io_file?5() revpimodio2.modio.RevPiModIO._get_simulator?5() revpimodio2.modio.RevPiModIO._gotioerror?5(action, e=None) revpimodio2.modio.RevPiModIO._set_cycletime?5(milliseconds) +revpimodio2.modio.RevPiModIO._set_debug?5(value) revpimodio2.modio.RevPiModIO._set_maxioerrors?5(value) revpimodio2.modio.RevPiModIO._simulate_ioctl?5(request, arg=b'') revpimodio2.modio.RevPiModIO.autorefresh_all?4() diff --git a/revpimodio2/__init__.py b/revpimodio2/__init__.py index c1d6aa2..d55049f 100644 --- a/revpimodio2/__init__.py +++ b/revpimodio2/__init__.py @@ -12,8 +12,6 @@ Auf alle IOs kann der Benutzer Funktionen als Events registrieren. Diese fuehrt das Modul bei Datenaenderung aus. """ -import warnings - __all__ = [ "RevPiModIO", "RevPiModIOSelected", "RevPiModIODriver", "RevPiNetIO", "RevPiNetIOSelected", "RevPiNetIODriver" @@ -35,8 +33,6 @@ INP = 300 OUT = 301 MEM = 302 -warnings.simplefilter(action="always") - class DeviceNotFoundError(Exception): diff --git a/revpimodio2/helper.py b/revpimodio2/helper.py index abb8bcc..0679bf5 100644 --- a/revpimodio2/helper.py +++ b/revpimodio2/helper.py @@ -443,12 +443,17 @@ class ProcimgWriter(Thread): self._maxioerrors ) ) - warnings.warn( - "count {0} io errors on process image".format(self._ioerror), - RuntimeWarning - ) - if self._modio._debug and e is not None: - warnings.warn(str(e), RuntimeWarning) + if self._modio._debug: + warnings.warn( + "count {0} io errors on process image | {1}" + "".format(self._ioerror, str(e)), + RuntimeWarning + ) + else: + warnings.warn( + "got io error on process image", + RuntimeWarning + ) def get_maxioerrors(self): """Gibt die Anzahl der maximal erlaubten Fehler zurueck. @@ -471,9 +476,8 @@ class ProcimgWriter(Thread): # Lockobjekt holen und Fehler werfen, wenn nicht schnell genug if not self.lck_refresh.acquire(timeout=self._adjwait): warnings.warn( - "cycle time of {0} ms exceeded on lock".format( - int(self._refresh * 1000) - ), + "cycle time of {0} ms exceeded during executing function" + "".format(int(self._refresh * 1000)), RuntimeWarning ) # Verzögerte Events pausieren an dieser Stelle @@ -546,9 +550,8 @@ class ProcimgWriter(Thread): self._adjwait -= 0.001 if self._adjwait < 0: warnings.warn( - "cycle time of {0} ms exceeded".format( - int(self._refresh * 1000) - ), + "cycle time of {0} ms exceeded several times - can not" + " hold cycle time!".format(int(self._refresh * 1000)), RuntimeWarning ) self._adjwait = 0 diff --git a/revpimodio2/modio.py b/revpimodio2/modio.py index a87a661..d64e810 100644 --- a/revpimodio2/modio.py +++ b/revpimodio2/modio.py @@ -80,7 +80,7 @@ class RevPiModIO(object): # Private Variablen self.__cleanupfunc = None self._buffedwrite = False - self._debug = debug + self._debug = False self._exit = Event() self._imgwriter = None self._ioerror = 0 @@ -107,6 +107,9 @@ class RevPiModIO(object): # Event für Benutzeraktionen self.exitsignal = Event() + # Wert über setter setzen + self.debug = debug + try: self._run_on_pi = S_ISCHR(osstat(self._procimg).st_mode) except Exception: @@ -234,7 +237,8 @@ class RevPiModIO(object): else: # Device-Type nicht gefunden warnings.warn( - "device type '{0}' unknown".format(device["type"]), + "device type '{0}' on position {1} unknown" + "".format(device["type"], device["position"]), Warning ) dev_new = None @@ -457,13 +461,15 @@ class RevPiModIO(object): "reach max io error count {0} on process image" "".format(self._maxioerrors) ) - warnings.warn( - "got io error during {0} and count {1} errors now" - "".format(action, self._ioerror), - RuntimeWarning - ) - if self._debug and e is not None: - warnings.warn(str(e), RuntimeWarning) + + if self._debug: + warnings.warn( + "got io error during '{0}' and count {1} errors now | {2}" + "".format(action, self._ioerror, str(e)), + RuntimeWarning + ) + else: + warnings.warn("got io error on process image", RuntimeWarning) def _set_cycletime(self, milliseconds): """Setzt Aktualisierungsrate der Prozessabbild-Synchronisierung. @@ -476,6 +482,18 @@ class RevPiModIO(object): else: self._imgwriter.refresh = milliseconds + def _set_debug(self, value): + """Setzt debugging Status um mehr Meldungen zu erhalten oder nicht. + @param value Wenn True, werden umfangreiche Medungen angezeigt""" + if not isinstance(value, bool): + raise TypeError("value must be ") + self._debug = value + + if value: + warnings.filterwarnings("always", module="revpimodio2") + else: + warnings.filterwarnings("default", module="revpimodio2") + def _set_maxioerrors(self, value): """Setzt Anzahl der maximal erlaubten Fehler bei Prozessabbildzugriff. @param value Anzahl erlaubte Fehler""" @@ -1087,7 +1105,7 @@ class RevPiModIO(object): return workokay - debug = property(_get_debug) + debug = property(_get_debug, _set_debug) configrsc = property(_get_configrsc) cycletime = property(_get_cycletime, _set_cycletime) ioerrors = property(_get_ioerrors) From ba08dab33f670bcd2bbba8cedc699fe6ff79263f Mon Sep 17 00:00:00 2001 From: NaruX Date: Sat, 31 Aug 2019 11:10:57 +0200 Subject: [PATCH 2/2] =?UTF-8?q?Doppelte=20Fehlerz=C3=A4hlung=20bei=20imgwr?= =?UTF-8?q?iter=20und=20modio=20in=20modio=20zusammengef=C3=BChrt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/revpimodio2.helper.html | 60 ++----------------------------------- eric-revpimodio2.api | 6 ---- revpimodio2/device.py | 2 -- revpimodio2/helper.py | 52 ++------------------------------ revpimodio2/modio.py | 7 +---- 5 files changed, 5 insertions(+), 122 deletions(-) diff --git a/doc/revpimodio2.helper.html b/doc/revpimodio2.helper.html index 0224b20..83b157c 100644 --- a/doc/revpimodio2.helper.html +++ b/doc/revpimodio2.helper.html @@ -429,7 +429,7 @@ Thread

Class Attributes

- +
__slots__
ioerrors
maxioerrors
refresh
__slots__
refresh

Class Methods

@@ -452,24 +452,12 @@ Methods _collect_events Aktiviert oder Deaktiviert die Eventueberwachung. -_get_ioerrors -Ruft aktuelle Anzahl der Fehler ab. - -_gotioerror -IOError Verwaltung fuer autorefresh. - -get_maxioerrors -Gibt die Anzahl der maximal erlaubten Fehler zurueck. - get_refresh Gibt Zykluszeit zurueck. run Startet die automatische Prozessabbildsynchronisierung. -set_maxioerrors -Setzt die Anzahl der maximal erlaubten Fehler. - set_refresh Setzt die Zykluszeit in Millisekunden. @@ -521,39 +509,6 @@ True aktiviert / False deaktiviert
True, wenn Anforderung erfolgreich war
- -

-ProcimgWriter._get_ioerrors

-_get_ioerrors() -

-Ruft aktuelle Anzahl der Fehler ab. -

-
Returns:
-
-Aktuelle Fehleranzahl -
-
-

-ProcimgWriter._gotioerror

-_gotioerror(e=None) -

-IOError Verwaltung fuer autorefresh. -

-
e
-
-Exception to log if debug is enabled -
-
-

-ProcimgWriter.get_maxioerrors

-get_maxioerrors() -

-Gibt die Anzahl der maximal erlaubten Fehler zurueck. -

-
Returns:
-
-Anzahl erlaubte Fehler -

ProcimgWriter.get_refresh

@@ -571,18 +526,7 @@ ProcimgWriter.run run()

Startet die automatische Prozessabbildsynchronisierung. -

-

-ProcimgWriter.set_maxioerrors

-set_maxioerrors(value) -

-Setzt die Anzahl der maximal erlaubten Fehler. -

-
value
-
-Anzahl erlaubte Fehler -
-
+

ProcimgWriter.set_refresh

set_refresh(value) diff --git a/eric-revpimodio2.api b/eric-revpimodio2.api index c92868a..aa88805 100644 --- a/eric-revpimodio2.api +++ b/eric-revpimodio2.api @@ -82,15 +82,9 @@ revpimodio2.helper.EventCallback.run?4() revpimodio2.helper.EventCallback.stop?4() revpimodio2.helper.EventCallback?1(func, name, value) revpimodio2.helper.ProcimgWriter._collect_events?5(value) -revpimodio2.helper.ProcimgWriter._get_ioerrors?5() -revpimodio2.helper.ProcimgWriter._gotioerror?5(e=None) -revpimodio2.helper.ProcimgWriter.get_maxioerrors?4() revpimodio2.helper.ProcimgWriter.get_refresh?4() -revpimodio2.helper.ProcimgWriter.ioerrors?7 -revpimodio2.helper.ProcimgWriter.maxioerrors?7 revpimodio2.helper.ProcimgWriter.refresh?7 revpimodio2.helper.ProcimgWriter.run?4() -revpimodio2.helper.ProcimgWriter.set_maxioerrors?4(value) revpimodio2.helper.ProcimgWriter.set_refresh?4(value) revpimodio2.helper.ProcimgWriter.stop?4() revpimodio2.helper.ProcimgWriter?1(parentmodio) diff --git a/revpimodio2/device.py b/revpimodio2/device.py index a668c62..2043f70 100644 --- a/revpimodio2/device.py +++ b/revpimodio2/device.py @@ -348,12 +348,10 @@ class Device(object): if not self._modio._imgwriter.is_alive(): # Alte Einstellungen speichern - imgmaxioerrors = self._modio._imgwriter.maxioerrors imgrefresh = self._modio._imgwriter.refresh # ImgWriter mit alten Einstellungen erstellen self._modio._imgwriter = ProcimgWriter(self._modio) - self._modio._imgwriter.maxioerrors = imgmaxioerrors self._modio._imgwriter.refresh = imgrefresh self._modio._imgwriter.start() diff --git a/revpimodio2/helper.py b/revpimodio2/helper.py index 0679bf5..a30d65b 100644 --- a/revpimodio2/helper.py +++ b/revpimodio2/helper.py @@ -290,7 +290,7 @@ class ProcimgWriter(Thread): """ __slots__ = "__dict_delay", "__eventth", "_eventqth", "__eventwork", \ - "_adjwait", "_eventq", "_ioerror", "_maxioerrors", "_modio", \ + "_adjwait", "_eventq", "_modio", \ "_refresh", "_work", "daemon", "lck_refresh", "newdata" def __init__(self, parentmodio): @@ -303,8 +303,6 @@ class ProcimgWriter(Thread): self.__eventwork = False self._adjwait = 0 self._eventq = queue.Queue() - self._ioerror = 0 - self._maxioerrors = 0 self._modio = parentmodio self._refresh = 0.05 self._work = Event() @@ -427,39 +425,6 @@ class ProcimgWriter(Thread): return True - def _get_ioerrors(self): - """Ruft aktuelle Anzahl der Fehler ab. - @return Aktuelle Fehleranzahl""" - return self._ioerror - - def _gotioerror(self, e=None): - """IOError Verwaltung fuer autorefresh. - @param e Exception to log if debug is enabled - """ - self._ioerror += 1 - if self._maxioerrors != 0 and self._ioerror >= self._maxioerrors: - raise RuntimeError( - "reach max io error count {0} on process image".format( - self._maxioerrors - ) - ) - if self._modio._debug: - warnings.warn( - "count {0} io errors on process image | {1}" - "".format(self._ioerror, str(e)), - RuntimeWarning - ) - else: - warnings.warn( - "got io error on process image", - RuntimeWarning - ) - - def get_maxioerrors(self): - """Gibt die Anzahl der maximal erlaubten Fehler zurueck. - @return Anzahl erlaubte Fehler""" - return self._maxioerrors - def get_refresh(self): """Gibt Zykluszeit zurueck. @return Zykluszeit in Millisekunden""" @@ -515,7 +480,7 @@ class ProcimgWriter(Thread): fh.flush() except IOError as e: - self._gotioerror(e) + self._modio._gotioerror("autorefresh", e) self.lck_refresh.release() continue @@ -567,17 +532,6 @@ class ProcimgWriter(Thread): """Beendet die automatische Prozessabbildsynchronisierung.""" self._work.set() - def set_maxioerrors(self, value): - """Setzt die Anzahl der maximal erlaubten Fehler. - @param value Anzahl erlaubte Fehler""" - if type(value) == int: - if value >= 0: - self._maxioerrors = value - else: - raise ValueError("value must be 0 or a positive integer") - else: - raise TypeError("value must be ") - def set_refresh(self, value): """Setzt die Zykluszeit in Millisekunden. @param value Millisekunden""" @@ -590,6 +544,4 @@ class ProcimgWriter(Thread): "refresh time must be 5 to 2000 milliseconds" ) - ioerrors = property(_get_ioerrors) - maxioerrors = property(get_maxioerrors, set_maxioerrors) refresh = property(get_refresh, set_refresh) diff --git a/revpimodio2/modio.py b/revpimodio2/modio.py index d64e810..c438bb3 100644 --- a/revpimodio2/modio.py +++ b/revpimodio2/modio.py @@ -413,10 +413,7 @@ class RevPiModIO(object): def _get_ioerrors(self): """Getter function. @return Aktuelle Anzahl gezaehlter Fehler""" - if self._looprunning: - return self._imgwriter._ioerror - else: - return self._ioerror + return self._ioerror def _get_length(self): """Getter function. @@ -499,7 +496,6 @@ class RevPiModIO(object): @param value Anzahl erlaubte Fehler""" if type(value) == int and value >= 0: self._maxioerrors = value - self._imgwriter.maxioerrors = value else: raise ValueError("value must be 0 or a positive integer") @@ -981,7 +977,6 @@ class RevPiModIO(object): def resetioerrors(self): """Setzt aktuellen IOError-Zaehler auf 0 zurueck.""" self._ioerror = 0 - self._imgwriter._ioerror = 0 def setdefaultvalues(self, device=None): """Alle Outputbuffer werden auf die piCtory default Werte gesetzt.