@@ -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.
+
+IntIOCounter
+
+Erweitert die IntIO-Klasse um die .reset() Funktion fuer Counter.
+
+
+Derived from
+IntIO
+
+Class Attributes
+
+
+Class Methods
+
+
+Methods
+
+
+| reset |
+Setzt den Counter des Inputs zurueck. |
+
+
+
+Static Methods
+
+
+
+IntIOCounter.reset
+reset()
+
+Setzt den Counter des Inputs zurueck.
+
+
+
+
+IntIOReplaceable
+
+Erweitert die IntIO-Klasse um die .replace_io Funktion.
+
+
+Derived from
+IntIO
+
+Class Attributes
+
+
+Class Methods
+
+
+Methods
+
+
+| replace_io |
+Ersetzt bestehenden IO mit Neuem. |
+
+
+
+Static Methods
+
+
+
+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
+
+
+
+
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