diff --git a/doc/revpimodio2.device.html b/doc/revpimodio2.device.html index 03279fa..9c859f3 100644 --- a/doc/revpimodio2.device.html +++ b/doc/revpimodio2.device.html @@ -18,6 +18,9 @@ Global Attributes Classes + + + @@ -43,6 +46,37 @@ Functions
BaseKlasse fuer alle Base-Devices wie Core / Connect usw.
Connect Klasse fuer den RevPi Connect.
None


+ +

Base

+

+Klasse fuer alle Base-Devices wie Core / Connect usw. +

+

+Derived from

+Device +

+Class Attributes

+ + +
__slots__
+

+Class Methods

+ + +
None
+

+Methods

+ + +
None
+

+Static Methods

+ + +
None
+ +
Up
+

Connect

@@ -172,7 +206,7 @@ Klasse fuer den RevPi Core.

Derived from

-Device +Base

Class Attributes

@@ -1055,7 +1089,7 @@ Klasse fuer die RevPi Gateway-Devices.

See Also:
-replace_io(name, frm, **kwargs) +replace_io(...)

diff --git a/doc/revpimodio2.io.html b/doc/revpimodio2.io.html index 7892835..38ae5a1 100644 --- a/doc/revpimodio2.io.html +++ b/doc/revpimodio2.io.html @@ -33,6 +33,12 @@ Classes

+ + + + + + @@ -97,7 +103,7 @@ Stellt Funktion fuer weiter Bit-Ersetzungen bereit.

See Also:
-replace_io(...) +replace_io(...)
Up
@@ -171,9 +177,6 @@ Methods - - - @@ -381,50 +384,6 @@ Ausfuehren bei RISING, FALLING or BOTH Wertaenderung
Bei True, Funktion als EventCallback-Thread ausfuehren
- -

-IOBase.replace_io

-replace_io(name, frm, **kwargs) -

-Ersetzt bestehenden IO mit Neuem. -

- Wenn die kwargs fuer byteorder und defaultvalue nicht angegeben werden, - uebernimmt das System die Daten aus dem ersetzten IO. -

- Es darf nur ein einzelnes Formatzeichen 'frm' uebergeben werden. Daraus - wird dann die benoetigte Laenge an Bytes berechnet und der Datentyp - festgelegt. - Eine Ausnahme ist die Formatierung 's'. Hier koennen mehrere Bytes - zu einem langen IO zusammengefasst werden. Die Formatierung muss - '8s' fuer z.B. 8 Bytes sein - NICHT 'ssssssss'! -

- Wenn durch die Formatierung mehr Bytes benoetigt werden, als - der urspruenglige IO hat, werden die nachfolgenden IOs ebenfalls - verwendet und entfernt. -

-
name
-
-Name des neuen Inputs -
frm
-
-struct formatierung (1 Zeichen) oder 'ANZAHLs' z.B. '8s' -
kwargs
-
-Weitere Parameter: - - bmk: interne Bezeichnung fuer IO - - bit: Registriert IO als am angegebenen Bit im Byte - - byteorder: Byteorder fuer den IO, Standardwert=little - - defaultvalue: Standardwert fuer IO - - event: Funktion fuer Eventhandling registrieren - - delay: Verzoegerung in ms zum Ausloesen wenn Wert gleich bleibt - - edge: Event ausfuehren bei RISING, FALLING or BOTH Wertaenderung - - as_thread: Fuehrt die event-Funktion als RevPiCallback-Thread aus -
-
-
See Also:
-
-Python3 struct -

IOBase.set_value

@@ -870,6 +829,124 @@ Setzt IO mit Beachtung byteorder/signed.
Up


+ +

IntIOCounter

+

+Erweitert die IntIO-Klasse um die .reset() Funktion fuer Counter. +

+

+Derived from

+IntIO +

+Class Attributes

+
IntIO Klasse fuer den Zugriff auf die Daten mit Konvertierung in int.
IntIOCounterErweitert die IntIO-Klasse um die .reset() Funktion fuer Counter.
IntIOReplaceableErweitert die IntIO-Klasse um die .replace_io Funktion.
StructIO Klasse fuer den Zugriff auf Daten ueber ein definierten struct.
reg_timerevent Registriert fuer IO einen Timer, welcher nach delay func ausfuehrt.
replace_ioErsetzt bestehenden IO mit Neuem.
set_value Setzt den Wert des IOs.
+ +
__slots__
+

+Class Methods

+ + +
None
+

+Methods

+ + + + + +
resetSetzt den Counter des Inputs zurueck.
+

+Static Methods

+ + +
None
+ +

+IntIOCounter.reset

+reset() +

+Setzt den Counter des Inputs zurueck. +

+
Up
+

+ +

IntIOReplaceable

+

+Erweitert die IntIO-Klasse um die .replace_io Funktion. +

+

+Derived from

+IntIO +

+Class Attributes

+ + +
__slots__
+

+Class Methods

+ + +
None
+

+Methods

+ + + + + +
replace_ioErsetzt bestehenden IO mit Neuem.
+

+Static Methods

+ + +
None
+ +

+IntIOReplaceable.replace_io

+replace_io(name, frm, **kwargs) +

+Ersetzt bestehenden IO mit Neuem. +

+ Wenn die kwargs fuer byteorder und defaultvalue nicht angegeben werden, + uebernimmt das System die Daten aus dem ersetzten IO. +

+ Es darf nur ein einzelnes Formatzeichen 'frm' uebergeben werden. Daraus + wird dann die benoetigte Laenge an Bytes berechnet und der Datentyp + festgelegt. + Eine Ausnahme ist die Formatierung 's'. Hier koennen mehrere Bytes + zu einem langen IO zusammengefasst werden. Die Formatierung muss + '8s' fuer z.B. 8 Bytes sein - NICHT 'ssssssss'! +

+ Wenn durch die Formatierung mehr Bytes benoetigt werden, als + der urspruenglige IO hat, werden die nachfolgenden IOs ebenfalls + verwendet und entfernt. +

+
name
+
+Name des neuen Inputs +
frm
+
+struct formatierung (1 Zeichen) oder 'ANZAHLs' z.B. '8s' +
kwargs
+
+Weitere Parameter: + - bmk: interne Bezeichnung fuer IO + - bit: Registriert IO als am angegebenen Bit im Byte + - byteorder: Byteorder fuer den IO, Standardwert=little + - defaultvalue: Standardwert fuer IO + - event: Funktion fuer Eventhandling registrieren + - delay: Verzoegerung in ms zum Ausloesen wenn Wert gleich bleibt + - edge: Event ausfuehren bei RISING, FALLING or BOTH Wertaenderung + - as_thread: Fuehrt die event-Funktion als RevPiCallback-Thread aus +
+
+
See Also:
+
+Python3 struct +
+
+
Up
+

StructIO

diff --git a/eric-revpimodio2.api b/eric-revpimodio2.api index e993119..4ebbb7d 100644 --- a/eric-revpimodio2.api +++ b/eric-revpimodio2.api @@ -106,7 +106,6 @@ revpimodio2.io.IOBase.length?7 revpimodio2.io.IOBase.name?7 revpimodio2.io.IOBase.reg_event?4(func, delay=0, edge=BOTH, as_thread=False) revpimodio2.io.IOBase.reg_timerevent?4(func, delay, edge=BOTH, as_thread=False) -revpimodio2.io.IOBase.replace_io?4(name, frm, **kwargs) revpimodio2.io.IOBase.set_value?4(value) revpimodio2.io.IOBase.type?7 revpimodio2.io.IOBase.unreg_event?4(func=None, edge=None) @@ -126,6 +125,8 @@ revpimodio2.io.IntIO.get_intvalue?4() revpimodio2.io.IntIO.set_intvalue?4(value) revpimodio2.io.IntIO.signed?7 revpimodio2.io.IntIO.value?7 +revpimodio2.io.IntIOCounter.reset?4() +revpimodio2.io.IntIOReplaceable.replace_io?4(name, frm, **kwargs) revpimodio2.io.StructIO._get_frm?5() revpimodio2.io.StructIO._get_signed?5() revpimodio2.io.StructIO.defaultvalue?7 diff --git a/eric-revpimodio2.bas b/eric-revpimodio2.bas index 9dcf76d..861f740 100644 --- a/eric-revpimodio2.bas +++ b/eric-revpimodio2.bas @@ -1,8 +1,11 @@ +Base Device Connect Core -Core Device +Core Base EventCallback Thread Gateway Device IntIO IOBase +IntIOCounter IntIO +IntIOReplaceable IntIO NetFH Thread ProcimgWriter Thread RevPiModIODriver RevPiModIOSelected diff --git a/revpimodio2/device.py b/revpimodio2/device.py index c61d289..2e695a3 100644 --- a/revpimodio2/device.py +++ b/revpimodio2/device.py @@ -253,11 +253,20 @@ class Device(object): for key in sorted(dict_io, key=lambda x: int(x)): # Neuen IO anlegen - if bool(dict_io[key][7]) or isinstance(self, Core): - # Bei Bitwerten oder Core RevPiIOBase verwenden + if bool(dict_io[key][7]) or isinstance(self, Base): + # Bei Bitwerten oder Base IOBase verwenden io_new = IOBase( self, dict_io[key], iotype, "little", False ) + elif isinstance(self, Gateway) and iotype != MEM: + # Ersetzbare IOs erzeugen + io_new = IntIOReplaceable( + self, dict_io[key], + iotype, + "little", + # Bei AIO (103) signed auf True setzen + self._producttype == 103 + ) else: io_new = IntIO( self, dict_io[key], @@ -441,7 +450,16 @@ class Device(object): producttype = property(_get_producttype) -class Core(Device): +class Base(Device): + + """Klasse fuer alle Base-Devices wie Core / Connect usw.""" + + __slots__ = () + + pass + + +class Core(Base): """Klasse fuer den RevPi Core. @@ -849,7 +867,7 @@ class Gateway(Device): zur verfuegung, ueber die eigene IOs definiert werden, die ein RevPiStructIO-Objekt abbilden. Dieser IO-Typ kann Werte ueber mehrere Bytes verarbeiten und zurueckgeben. - @see revpimodio2.io#IOBase.replace_io replace_io(name, frm, **kwargs) + @see revpimodio2.io#IntIOReplaceable.replace_io replace_io(...) """ @@ -925,5 +943,5 @@ class Virtual(Gateway): # Nachträglicher Import -from .io import IOBase, IntIO +from .io import IOBase, IntIO, IntIOReplaceable from revpimodio2 import INP, OUT, MEM diff --git a/revpimodio2/io.py b/revpimodio2/io.py index 447c917..46eae5c 100644 --- a/revpimodio2/io.py +++ b/revpimodio2/io.py @@ -231,7 +231,7 @@ class DeadIO(object): def replace_io(self, name, frm, **kwargs): """Stellt Funktion fuer weiter Bit-Ersetzungen bereit. - @see #IOBase.replace_io replace_io(...)""" + @see #IntIOReplaceable.replace_io replace_io(...)""" self.__deadio.replace_io(name, frm, **kwargs) _parentdevice = property(lambda self: None) @@ -496,70 +496,6 @@ class IOBase(object): """ self.__reg_xevent(func, delay, edge, as_thread, False) - def replace_io(self, name, frm, **kwargs): - """Ersetzt bestehenden IO mit Neuem. - - Wenn die kwargs fuer byteorder und defaultvalue nicht angegeben werden, - uebernimmt das System die Daten aus dem ersetzten IO. - - Es darf nur ein einzelnes Formatzeichen 'frm' uebergeben werden. Daraus - wird dann die benoetigte Laenge an Bytes berechnet und der Datentyp - festgelegt. - Eine Ausnahme ist die Formatierung 's'. Hier koennen mehrere Bytes - zu einem langen IO zusammengefasst werden. Die Formatierung muss - '8s' fuer z.B. 8 Bytes sein - NICHT 'ssssssss'! - - Wenn durch die Formatierung mehr Bytes benoetigt werden, als - der urspruenglige IO hat, werden die nachfolgenden IOs ebenfalls - verwendet und entfernt. - - @param name Name des neuen Inputs - @param frm struct formatierung (1 Zeichen) oder 'ANZAHLs' z.B. '8s' - @param kwargs Weitere Parameter: - - bmk: interne Bezeichnung fuer IO - - bit: Registriert IO als am angegebenen Bit im Byte - - byteorder: Byteorder fuer den IO, Standardwert=little - - defaultvalue: Standardwert fuer IO - - event: Funktion fuer Eventhandling registrieren - - delay: Verzoegerung in ms zum Ausloesen wenn Wert gleich bleibt - - edge: Event ausfuehren bei RISING, FALLING or BOTH Wertaenderung - - as_thread: Fuehrt die event-Funktion als RevPiCallback-Thread aus - @see Python3 struct - - """ - if not isinstance(self._parentdevice, Gateway): - raise RuntimeError( - "this function can be used for ios on gatway or virtual " - "devices only" - ) - if type(self) == StructIO: - raise RuntimeError( - "this io is already a replaced one" - ) - - # StructIO erzeugen - io_new = StructIO( - self, - name, - frm, - **kwargs - ) - - # StructIO in IO-Liste einfügen - self._parentdevice._modio.io._private_register_new_io_object(io_new) - - # Optional Event eintragen - reg_event = kwargs.get("event", None) - if reg_event is not None: - io_new.reg_event( - reg_event, - kwargs.get("delay", 0), - kwargs.get("edge", BOTH), - kwargs.get("as_thread", False) - ) - def set_value(self, value): """Setzt den Wert des IOs. @param value IO-Wert als oder """ @@ -849,6 +785,80 @@ class IntIO(IOBase): value = property(get_intvalue, set_intvalue) +class IntIOCounter(IntIO): + + """Erweitert die IntIO-Klasse um die .reset() Funktion fuer Counter.""" + + __slots__ = () + + def reset(self): + """Setzt den Counter des Inputs zurueck.""" + # TODO: Counter ID ermitteln + # TODO: Counter reset durchführen + pass + + +class IntIOReplaceable(IntIO): + + """Erweitert die IntIO-Klasse um die .replace_io Funktion.""" + + __slots__ = () + + def replace_io(self, name, frm, **kwargs): + """Ersetzt bestehenden IO mit Neuem. + + Wenn die kwargs fuer byteorder und defaultvalue nicht angegeben werden, + uebernimmt das System die Daten aus dem ersetzten IO. + + Es darf nur ein einzelnes Formatzeichen 'frm' uebergeben werden. Daraus + wird dann die benoetigte Laenge an Bytes berechnet und der Datentyp + festgelegt. + Eine Ausnahme ist die Formatierung 's'. Hier koennen mehrere Bytes + zu einem langen IO zusammengefasst werden. Die Formatierung muss + '8s' fuer z.B. 8 Bytes sein - NICHT 'ssssssss'! + + Wenn durch die Formatierung mehr Bytes benoetigt werden, als + der urspruenglige IO hat, werden die nachfolgenden IOs ebenfalls + verwendet und entfernt. + + @param name Name des neuen Inputs + @param frm struct formatierung (1 Zeichen) oder 'ANZAHLs' z.B. '8s' + @param kwargs Weitere Parameter: + - bmk: interne Bezeichnung fuer IO + - bit: Registriert IO als am angegebenen Bit im Byte + - byteorder: Byteorder fuer den IO, Standardwert=little + - defaultvalue: Standardwert fuer IO + - event: Funktion fuer Eventhandling registrieren + - delay: Verzoegerung in ms zum Ausloesen wenn Wert gleich bleibt + - edge: Event ausfuehren bei RISING, FALLING or BOTH Wertaenderung + - as_thread: Fuehrt die event-Funktion als RevPiCallback-Thread aus + @see Python3 struct + + """ + # StructIO erzeugen + io_new = StructIO( + self, + name, + frm, + **kwargs + ) + + # StructIO in IO-Liste einfügen + self._parentdevice._modio.io._private_register_new_io_object(io_new) + + # Optional Event eintragen + reg_event = kwargs.get("event", None) + if reg_event is not None: + io_new.reg_event( + reg_event, + kwargs.get("delay", 0), + kwargs.get("edge", BOTH), + kwargs.get("as_thread", False) + ) + + class StructIO(IOBase): """Klasse fuer den Zugriff auf Daten ueber ein definierten struct. @@ -980,7 +990,3 @@ class StructIO(IOBase): frm = property(_get_frm) signed = property(_get_signed) value = property(get_structvalue, set_structvalue) - - -# Nachträglicher Import -from .device import Gateway diff --git a/revpimodio2/modio.py b/revpimodio2/modio.py index 4ad688e..d603992 100644 --- a/revpimodio2/modio.py +++ b/revpimodio2/modio.py @@ -162,14 +162,19 @@ class RevPiModIO(object): if device["type"] == "BASE": pt = int(device["productType"]) - if pt == 105: + if pt == 95: + # RevPi Core + dev_new = devicemodule.Core( + self, device, simulator=self._simulator + ) + elif pt == 105: # RevPi Connect dev_new = devicemodule.Connect( self, device, simulator=self._simulator ) else: - # RevPi Core immer als Fallback verwenden - dev_new = devicemodule.Core( + # Base immer als Fallback verwenden + dev_new = devicemodule.Base( self, device, simulator=self._simulator ) self.core = dev_new