From e7c1f522dc995010e8b2b86f75190209cf6d99de Mon Sep 17 00:00:00 2001 From: NaruX Date: Wed, 1 Aug 2018 15:49:02 +0200 Subject: [PATCH] watchdogtrigger in Connect-Klasse integriert (Wechselt alle 10 Sekunden) Adressen der core/connect IOs verbessert --- doc/revpimodio2.device.html | 50 +++++++++++++++++++++++++++++++-- doc/revpimodio2.io.html | 2 +- eric-revpimodio2.api | 3 ++ revpimodio2/device.py | 55 ++++++++++++++++++++++++++++++------- revpimodio2/io.py | 4 +-- 5 files changed, 99 insertions(+), 15 deletions(-) diff --git a/doc/revpimodio2.device.html b/doc/revpimodio2.device.html index 0d5dd29..21743ff 100644 --- a/doc/revpimodio2.device.html +++ b/doc/revpimodio2.device.html @@ -58,7 +58,7 @@ Core

Class Attributes

- +
A3
A3
watchdogtrigger

Class Methods

@@ -69,14 +69,23 @@ Class Methods Methods + + + + + + + + +
__wdtriggerWD Ausgang alle 10 Sekunden automatisch toggeln.
_devconfigure Connect-Klasse vorbereiten.
_get_leda3 Gibt den Zustand der LED A3 vom Connect zurueck.
_get_wdtriggerRuft den Wert fuer Autowatchdog ab.
_set_leda3 Setzt den Zustand der LED A3 vom Connect.
_set_wdtriggerSetzt den Wert fuer Autowatchdog.

@@ -84,7 +93,13 @@ Static Methods

None
- + +

+Connect.__wdtrigger

+__wdtrigger() +

+WD Ausgang alle 10 Sekunden automatisch toggeln. +

Connect._devconfigure

_devconfigure() @@ -101,6 +116,17 @@ Gibt den Zustand der LED A3 vom Connect zurueck.
0=aus, 1=gruen, 2=rot
+ +

+Connect._get_wdtrigger

+_get_wdtrigger() +

+Ruft den Wert fuer Autowatchdog ab. +

+
Returns:
+
+True, wenn Autowatchdog aktiv ist +

Connect._set_leda3

@@ -112,6 +138,26 @@ Setzt den Zustand der LED A3 vom Connect.
0=aus, 1=gruen, 2=rot
+ +

+Connect._set_wdtrigger

+_set_wdtrigger(value) +

+Setzt den Wert fuer Autowatchdog. +

+ Wird dieser Wert auf True gesetzt, wechselt im Hintergrund das noetige + Bit zum toggeln des Watchdogs alle 10 Sekunden zwichen True und False. + Dieses Bit wird bei autorefresh=True natuerlich automatisch in das + Prozessabbild geschrieben. +

+ WICHTIG: Sollte autorefresh=False sein, muss zyklisch + .writeprocimg() aufgerufen werden, um den Wert in das + Prozessabbild zu schreiben!!! +

+
value
+
+True zum aktivieren, Fals zum beenden +
Up


diff --git a/doc/revpimodio2.io.html b/doc/revpimodio2.io.html index b3ac153..df89bfc 100644 --- a/doc/revpimodio2.io.html +++ b/doc/revpimodio2.io.html @@ -202,7 +202,7 @@ Parentdevice auf dem der IO liegt
valuelist
Datenliste fuer Instantiierung - ["name","defval","bitlen","startaddr",exp,"idx","bmk","bitaddr"] + ["name","defval","bitlen","startaddrdev",exp,"idx","bmk","bitaddr"]
iotype
Wert diff --git a/eric-revpimodio2.api b/eric-revpimodio2.api index c02b6a2..306cc5f 100644 --- a/eric-revpimodio2.api +++ b/eric-revpimodio2.api @@ -12,7 +12,10 @@ revpimodio2.consttostr?4(value) revpimodio2.device.Connect.A3?7 revpimodio2.device.Connect._devconfigure?5() revpimodio2.device.Connect._get_leda3?5() +revpimodio2.device.Connect._get_wdtrigger?5() revpimodio2.device.Connect._set_leda3?5(value) +revpimodio2.device.Connect._set_wdtrigger?5(value) +revpimodio2.device.Connect.watchdogtrigger?7 revpimodio2.device.Core.A1?7 revpimodio2.device.Core.A2?7 revpimodio2.device.Core._devconfigure?5() diff --git a/revpimodio2/device.py b/revpimodio2/device.py index a842899..1f4b149 100644 --- a/revpimodio2/device.py +++ b/revpimodio2/device.py @@ -6,7 +6,7 @@ # (c) Sven Sager, License: LGPLv3 # """Modul fuer die Verwaltung der Devices.""" -from threading import Lock +from threading import Thread, Event, Lock from .helper import ProcimgWriter @@ -434,19 +434,19 @@ class Core(Device): # Echte IOs erzeugen self.a1green = IOBase(self, [ - "a1green", 0, 1, self._ioled.address, + "a1green", 0, 1, self._ioled._slc_address.start, False, None, "LED_A1_GREEN", "0" ], OUT, "little", False) self.a1red = IOBase(self, [ - "a1red", 0, 1, self._ioled.address, + "a1red", 0, 1, self._ioled._slc_address.start, False, None, "LED_A1_RED", "1" ], OUT, "little", False) self.a2green = IOBase(self, [ - "a2green", 0, 1, self._ioled.address, + "a2green", 0, 1, self._ioled._slc_address.start, False, None, "LED_A2_GREEN", "2" ], OUT, "little", False) self.a2red = IOBase(self, [ - "a2red", 0, 1, self._ioled.address, + "a2red", 0, 1, self._ioled._slc_address.start, False, None, "LED_A2_RED", "3" ], OUT, "little", False) @@ -649,31 +649,38 @@ class Connect(Core): """ + def __wdtrigger(self): + """WD Ausgang alle 10 Sekunden automatisch toggeln.""" + while not self.__evt_wdtrigger.wait(10): + self.wd.value = not self.wd.value + def _devconfigure(self): """Connect-Klasse vorbereiten.""" super()._devconfigure() + self.__evt_wdtrigger = Event() + self.__th_wdtrigger = None # Echte IOs erzeugen self.a3green = IOBase(self, [ - "a3green", 0, 1, self._ioled.address, + "a3green", 0, 1, self._ioled._slc_address.start, False, None, "LED_A3_GREEN", "4" ], OUT, "little", False) self.a3red = IOBase(self, [ - "a3red", 0, 1, self._ioled.address, + "a3red", 0, 1, self._ioled._slc_address.start, False, None, "LED_A3_RED", "5" ], OUT, "little", False) # IO Objekte für WD und X2 in/out erzeugen self.wd = IOBase(self, [ - "wd", 0, 1, self._ioled.address, + "wd", 0, 1, self._ioled._slc_address.start, False, None, "Connect_WatchDog", "7" ], OUT, "little", False) self.x2in = IOBase(self, [ - "x2in", 0, 1, self._iostatusbyte.address, + "x2in", 0, 1, self._iostatusbyte._slc_address.start, False, None, "Connect_X2_IN", "6" ], INP, "little", False) self.x2out = IOBase(self, [ - "x2out", 0, 1, self._ioled.address, + "x2out", 0, 1, self._ioled._slc_address.start, False, None, "Connect_X2_OUT", "6" ], OUT, "little", False) @@ -687,6 +694,12 @@ class Connect(Core): led += int_led & 2 return led + def _get_wdtrigger(self): + """Ruft den Wert fuer Autowatchdog ab. + @return True, wenn Autowatchdog aktiv ist""" + return self.__th_wdtrigger is not None \ + and self.__th_wdtrigger.is_alive() + def _set_leda3(self, value): """Setzt den Zustand der LED A3 vom Connect. @param value 0=aus, 1=gruen, 2=rot""" @@ -695,7 +708,29 @@ class Connect(Core): else: raise ValueError("led status must be between 0 and 3") + def _set_wdtrigger(self, value): + """Setzt den Wert fuer Autowatchdog. + + Wird dieser Wert auf True gesetzt, wechselt im Hintergrund das noetige + Bit zum toggeln des Watchdogs alle 10 Sekunden zwichen True und False. + Dieses Bit wird bei autorefresh=True natuerlich automatisch in das + Prozessabbild geschrieben. + + WICHTIG: Sollte autorefresh=False sein, muss zyklisch + .writeprocimg() aufgerufen werden, um den Wert in das + Prozessabbild zu schreiben!!! + + @param value True zum aktivieren, Fals zum beenden""" + if not value: + self.__evt_wdtrigger.set() + + elif not self._get_wdtrigger(): + self.__evt_wdtrigger.clear() + self.__th_wdtrigger = Thread(target=self.__wdtrigger, daemon=True) + self.__th_wdtrigger.start() + A3 = property(_get_leda3, _set_leda3) + watchdogtrigger = property(_get_wdtrigger, _set_wdtrigger) class Gateway(Device): diff --git a/revpimodio2/io.py b/revpimodio2/io.py index b62b04e..3568f10 100644 --- a/revpimodio2/io.py +++ b/revpimodio2/io.py @@ -255,13 +255,13 @@ class IOBase(object): @param parentdevice Parentdevice auf dem der IO liegt @param valuelist Datenliste fuer Instantiierung - ["name","defval","bitlen","startaddr",exp,"idx","bmk","bitaddr"] + ["name","defval","bitlen","startaddrdev",exp,"idx","bmk","bitaddr"] @param iotype Wert @param byteorder Byteorder 'little'/'big' fuer Berechnung @param sigend Intberechnung mit Vorzeichen durchfuehren """ - # ["name","defval","bitlen","startaddr",exp,"idx","bmk","bitaddr"] + # ["name","defval","bitlen","startaddrdev",exp,"idx","bmk","bitaddr"] # [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] self._parentdevice = parentdevice