Neue Base Klasse eingefügt von der Core / Connect erben

Sollten neue Base-Devices von Kunbus hinzugefügt werden, wird Base verwendet
IntIOReplaceable Klasse erstellt für IOs von Gateways und virtuellen Devices
Leere IntIOCounter Klasse für Counter IOs hinzugefügt
This commit is contained in:
2018-12-08 17:32:03 +01:00
parent 65a0186efb
commit 1e309091e8
7 changed files with 273 additions and 129 deletions

View File

@@ -18,6 +18,9 @@ Global Attributes</h3>
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#Base">Base</a></td>
<td>Klasse fuer alle Base-Devices wie Core / Connect usw.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#Connect">Connect</a></td>
<td>Klasse fuer den RevPi Connect.</td>
</tr><tr>
@@ -43,6 +46,37 @@ Functions</h3>
<tr><td>None</td></tr>
</table>
<hr /><hr />
<a NAME="Base" ID="Base"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">Base</h2>
<p>
Klasse fuer alle Base-Devices wie Core / Connect usw.
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
Device
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>__slots__</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="Connect" ID="Connect"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">Connect</h2>
<p>
@@ -172,7 +206,7 @@ Klasse fuer den RevPi Core.
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
Device
Base
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
@@ -1055,7 +1089,7 @@ Klasse fuer die RevPi Gateway-Devices.
</p><dl>
<dt><b>See Also:</b></dt>
<dd>
<a style="color:#0000FF" href="revpimodio2.io.html#IOBase.replace_io">replace_io(name, frm, **kwargs)</a>
<a style="color:#0000FF" href="revpimodio2.io.html#IntIOReplaceable.replace_io">replace_io(...)</a>
</dd>
</dl>
<h3 style="background-color:#FFFFFF;color:#FF0000">

View File

@@ -33,6 +33,12 @@ Classes</h3>
<td><a style="color:#0000FF" href="#IntIO">IntIO</a></td>
<td>Klasse fuer den Zugriff auf die Daten mit Konvertierung in int.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IntIOCounter">IntIOCounter</a></td>
<td>Erweitert die IntIO-Klasse um die .reset() Funktion fuer Counter.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IntIOReplaceable">IntIOReplaceable</a></td>
<td>Erweitert die IntIO-Klasse um die .replace_io Funktion.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#StructIO">StructIO</a></td>
<td>Klasse fuer den Zugriff auf Daten ueber ein definierten struct.</td>
</tr>
@@ -97,7 +103,7 @@ Stellt Funktion fuer weiter Bit-Ersetzungen bereit.
</p><dl>
<dt><b>See Also:</b></dt>
<dd>
<a style="color:#0000FF" href="#IOBase.replace_io">replace_io(...)</a>
<a style="color:#0000FF" href="#IntIOReplaceable.replace_io">replace_io(...)</a>
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
@@ -171,9 +177,6 @@ Methods</h3>
<td><a style="color:#0000FF" href="#IOBase.reg_timerevent">reg_timerevent</a></td>
<td>Registriert fuer IO einen Timer, welcher nach delay func ausfuehrt.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IOBase.replace_io">replace_io</a></td>
<td>Ersetzt bestehenden IO mit Neuem.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IOBase.set_value">set_value</a></td>
<td>Setzt den Wert des IOs.</td>
</tr><tr>
@@ -381,50 +384,6 @@ Ausfuehren bei RISING, FALLING or BOTH Wertaenderung
<dd>
Bei True, Funktion als EventCallback-Thread ausfuehren
</dd>
</dl><a NAME="IOBase.replace_io" ID="IOBase.replace_io"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IOBase.replace_io</h3>
<b>replace_io</b>(<i>name, frm, **kwargs</i>)
<p>
Ersetzt bestehenden IO mit Neuem.
</p><p>
Wenn die kwargs fuer byteorder und defaultvalue nicht angegeben werden,
uebernimmt das System die Daten aus dem ersetzten IO.
</p><p>
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'!
</p><p>
Wenn durch die Formatierung mehr Bytes benoetigt werden, als
der urspruenglige IO hat, werden die nachfolgenden IOs ebenfalls
verwendet und entfernt.
</p><dl>
<dt><i>name</i></dt>
<dd>
Name des neuen Inputs
</dd><dt><i>frm</i></dt>
<dd>
struct formatierung (1 Zeichen) oder 'ANZAHLs' z.B. '8s'
</dd><dt><i>kwargs</i></dt>
<dd>
Weitere Parameter:
- bmk: interne Bezeichnung fuer IO
- bit: Registriert IO als <class 'bool'> 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
</dd>
</dl><dl>
<dt><b>See Also:</b></dt>
<dd>
<a style="color:#0000FF" target="_blank" href="https://docs.python.org/3/library/struct.html#format-characters" >Python3 struct</a>
</dd>
</dl><a NAME="IOBase.set_value" ID="IOBase.set_value"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IOBase.set_value</h3>
@@ -870,6 +829,124 @@ Setzt IO mit Beachtung byteorder/signed.
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="IntIOCounter" ID="IntIOCounter"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">IntIOCounter</h2>
<p>
Erweitert die IntIO-Klasse um die .reset() Funktion fuer Counter.
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
IntIO
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>__slots__</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Methods</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#IntIOCounter.reset">reset</a></td>
<td>Setzt den Counter des Inputs zurueck.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="IntIOCounter.reset" ID="IntIOCounter.reset"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IntIOCounter.reset</h3>
<b>reset</b>(<i></i>)
<p>
Setzt den Counter des Inputs zurueck.
</p>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="IntIOReplaceable" ID="IntIOReplaceable"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">IntIOReplaceable</h2>
<p>
Erweitert die IntIO-Klasse um die .replace_io Funktion.
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
IntIO
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>__slots__</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Methods</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#IntIOReplaceable.replace_io">replace_io</a></td>
<td>Ersetzt bestehenden IO mit Neuem.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="IntIOReplaceable.replace_io" ID="IntIOReplaceable.replace_io"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IntIOReplaceable.replace_io</h3>
<b>replace_io</b>(<i>name, frm, **kwargs</i>)
<p>
Ersetzt bestehenden IO mit Neuem.
</p><p>
Wenn die kwargs fuer byteorder und defaultvalue nicht angegeben werden,
uebernimmt das System die Daten aus dem ersetzten IO.
</p><p>
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'!
</p><p>
Wenn durch die Formatierung mehr Bytes benoetigt werden, als
der urspruenglige IO hat, werden die nachfolgenden IOs ebenfalls
verwendet und entfernt.
</p><dl>
<dt><i>name</i></dt>
<dd>
Name des neuen Inputs
</dd><dt><i>frm</i></dt>
<dd>
struct formatierung (1 Zeichen) oder 'ANZAHLs' z.B. '8s'
</dd><dt><i>kwargs</i></dt>
<dd>
Weitere Parameter:
- bmk: interne Bezeichnung fuer IO
- bit: Registriert IO als <class 'bool'> 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
</dd>
</dl><dl>
<dt><b>See Also:</b></dt>
<dd>
<a style="color:#0000FF" target="_blank" href="https://docs.python.org/3/library/struct.html#format-characters" >Python3 struct</a>
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="StructIO" ID="StructIO"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">StructIO</h2>
<p>

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 <class 'bool'> 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 <a target="_blank"
href="https://docs.python.org/3/library/struct.html#format-characters"
>Python3 struct</a>
"""
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 <class bytes'> oder <class 'bool'>"""
@@ -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 <class 'bool'> 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 <a target="_blank"
href="https://docs.python.org/3/library/struct.html#format-characters"
>Python3 struct</a>
"""
# 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

View File

@@ -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