mirror of
https://github.com/naruxde/revpimodio2.git
synced 2025-11-09 06:13:53 +01:00
Encodingzeile an PEP angepasst (muss in Zeile 0 - 1 sein)
Von RevPiModIO kwagrs entfernt und feste keyword vergeben Bei Änderung der Byteorder wird defaultvalue angepasst da aus piCtory little Beim Core nur die RS485 Fehlerwerte übernehmen defaultvalue wird mit Formatierung ausgegeben .isnumeric gegen isdigit getauscht docstrings
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# python3-RevPiModIO
|
||||
#
|
||||
# Webpage: https://revpimodio.org/
|
||||
# (c) Sven Sager, License: LGPLv3
|
||||
#
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Stellt alle Klassen fuer den RevolutionPi zur Verfuegung.
|
||||
|
||||
Stellt Klassen fuer die einfache Verwendung des Revolution Pis der
|
||||
@@ -24,7 +24,7 @@ __all__ = ["RevPiModIO", "RevPiModIOSelected", "RevPiModIODriver"]
|
||||
__author__ = "Sven Sager <akira@revpimodio.org>"
|
||||
__name__ = "revpimodio2"
|
||||
__package__ = "revpimodio2"
|
||||
__version__ = "2.0.0"
|
||||
__version__ = "2.0.1"
|
||||
|
||||
# Global package values
|
||||
OFF = 0
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# python3-RevPiModIO
|
||||
#
|
||||
# Webpage: https://revpimodio.org/
|
||||
# (c) Sven Sager, License: LGPLv3
|
||||
#
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Bildet die App Sektion von piCtory ab."""
|
||||
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# python3-RevPiModIO
|
||||
#
|
||||
# Webpage: https://revpimodio.org/
|
||||
# (c) Sven Sager, License: LGPLv3
|
||||
#
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Modul fuer die Verwaltung der Devices."""
|
||||
from threading import Lock
|
||||
from .helper import ProcimgWriter
|
||||
@@ -20,7 +20,7 @@ class DeviceList(object):
|
||||
|
||||
def __contains__(self, key):
|
||||
"""Prueft ob Device existiert.
|
||||
@param key DeviceName str() / Positionsnummer int()
|
||||
@param key DeviceName <class 'str'> / Positionsnummer <class 'int'>
|
||||
@return True, wenn Device vorhanden"""
|
||||
if type(key) == int:
|
||||
return key in self.__dict_position
|
||||
@@ -49,8 +49,8 @@ class DeviceList(object):
|
||||
|
||||
def __getitem__(self, key):
|
||||
"""Gibt angegebenes Device zurueck.
|
||||
@param key DeviceName str() / Positionsnummer int()
|
||||
@return Gefundenes Device()-Objekt"""
|
||||
@param key DeviceName <class 'str'> / Positionsnummer <class 'int'>
|
||||
@return Gefundenes <class 'Device'>-Objekt"""
|
||||
if type(key) == int:
|
||||
if key not in self.__dict_position:
|
||||
raise KeyError("no device on position {}".format(key))
|
||||
@@ -60,7 +60,7 @@ class DeviceList(object):
|
||||
|
||||
def __iter__(self):
|
||||
"""Gibt Iterator aller Devices zurueck.
|
||||
@return iter() aller Devices"""
|
||||
@return <class 'iter'> aller Devices"""
|
||||
for dev in sorted(self.__dict_position):
|
||||
yield self.__dict_position[dev]
|
||||
|
||||
@@ -91,10 +91,10 @@ class Device(object):
|
||||
"""
|
||||
|
||||
def __init__(self, parentmodio, dict_device, simulator=False):
|
||||
"""Instantiierung der Device()-Klasse.
|
||||
"""Instantiierung der Device-Klasse.
|
||||
|
||||
@param parent RevpiModIO parent object
|
||||
@param dict_device dict() fuer dieses Device aus piCotry Konfiguration
|
||||
@param dict_device <class 'dict'> fuer dieses Device aus piCotry
|
||||
@param simulator: Laed das Modul als Simulator und vertauscht IOs
|
||||
|
||||
"""
|
||||
@@ -149,13 +149,13 @@ class Device(object):
|
||||
self._devconfigure()
|
||||
|
||||
def __bytes__(self):
|
||||
"""Gibt alle Daten des Devices als bytes() zurueck.
|
||||
@return Devicedaten als bytes()"""
|
||||
"""Gibt alle Daten des Devices als <class 'bytes'> zurueck.
|
||||
@return Devicedaten als <class 'bytes'>"""
|
||||
return bytes(self._ba_devdata)
|
||||
|
||||
def __contains__(self, key):
|
||||
"""Prueft ob IO auf diesem Device liegt.
|
||||
@param key IO-Name str() / IO-Bytenummer int()
|
||||
@param key IO-Name <class 'str'> / IO-Bytenummer <class 'int'>
|
||||
@return True, wenn device vorhanden"""
|
||||
if type(key) == str:
|
||||
return key in self._modio.io \
|
||||
@@ -176,14 +176,14 @@ class Device(object):
|
||||
|
||||
def __iter__(self):
|
||||
"""Gibt Iterator aller IOs zurueck.
|
||||
@return iter() aller IOs"""
|
||||
@return <class 'iter'> aller IOs"""
|
||||
for lst_io in self._modio.io[self._slc_devoff]:
|
||||
for io in lst_io:
|
||||
yield io
|
||||
|
||||
def __len__(self):
|
||||
"""Gibt Anzahl der Bytes zurueck, die dieses Device belegt.
|
||||
@return int()"""
|
||||
@return <class 'int'>"""
|
||||
return self._length
|
||||
|
||||
def __str__(self):
|
||||
@@ -194,9 +194,9 @@ class Device(object):
|
||||
def _buildio(self, dict_io, iotype):
|
||||
"""Erstellt aus der piCtory-Liste die IOs fuer dieses Device.
|
||||
|
||||
@param dict_io dict()-Objekt aus piCtory Konfiguration
|
||||
@param iotype io.Type() Wert
|
||||
@return slice()-Objekt mit Start und Stop Position dieser IOs
|
||||
@param dict_io <class 'dict'>-Objekt aus piCtory Konfiguration
|
||||
@param iotype <class 'Type'> Wert
|
||||
@return <class 'slice'> mit Start und Stop Position dieser IOs
|
||||
|
||||
"""
|
||||
if len(dict_io) <= 0:
|
||||
@@ -281,7 +281,7 @@ class Device(object):
|
||||
|
||||
def get_allios(self):
|
||||
"""Gibt eine Liste aller Inputs und Outputs zurueck, keine MEMs.
|
||||
@return list() Input und Output, keine MEMs"""
|
||||
@return <class 'list'> Input und Output, keine MEMs"""
|
||||
lst_return = []
|
||||
for lst_io in self._modio.io[
|
||||
self._slc_inpoff.start:self._slc_outoff.stop]:
|
||||
@@ -290,7 +290,7 @@ class Device(object):
|
||||
|
||||
def get_inputs(self):
|
||||
"""Gibt eine Liste aller Inputs zurueck.
|
||||
@return list() Inputs"""
|
||||
@return <class 'list'> Inputs"""
|
||||
lst_return = []
|
||||
for lst_io in self._modio.io[self._slc_inpoff]:
|
||||
lst_return += lst_io
|
||||
@@ -298,7 +298,7 @@ class Device(object):
|
||||
|
||||
def get_outputs(self):
|
||||
"""Gibt eine Liste aller Outputs zurueck.
|
||||
@return list() Outputs"""
|
||||
@return <class 'list'> Outputs"""
|
||||
lst_return = []
|
||||
for lst_io in self._modio.io[self._slc_outoff]:
|
||||
lst_return += lst_io
|
||||
@@ -306,7 +306,7 @@ class Device(object):
|
||||
|
||||
def get_memmories(self):
|
||||
"""Gibt eine Liste aller mems zurueck.
|
||||
@return list() Mems"""
|
||||
@return <class 'list'> Mems"""
|
||||
lst_return = []
|
||||
for lst_io in self._modio.io[self._slc_memoff]:
|
||||
lst_return += lst_io
|
||||
@@ -376,6 +376,19 @@ class Core(Device):
|
||||
self._ioerrorlimit1 = 6
|
||||
self._ioerrorlimit2 = 7
|
||||
|
||||
if not self._modio._monitoring:
|
||||
# Für RS485 errors defaults laden sollte procimg NULL sein
|
||||
if self._ioerrorlimit1 is not None:
|
||||
self.__lst_io[self._ioerrorlimit1].set_value(
|
||||
self.__lst_io[self._ioerrorlimit1].defaultvalue
|
||||
)
|
||||
if self._ioerrorlimit2 is not None:
|
||||
self.__lst_io[self._ioerrorlimit2].set_value(
|
||||
self.__lst_io[self._ioerrorlimit2].defaultvalue
|
||||
)
|
||||
# RS485 errors schreiben
|
||||
self._modio.writeprocimg(self)
|
||||
|
||||
def __errorlimit(self, io_id, errorlimit):
|
||||
"""Verwaltet das Lesen und Schreiben der ErrorLimits.
|
||||
@param io_id Index des IOs fuer ErrorLimit
|
||||
@@ -392,12 +405,12 @@ class Core(Device):
|
||||
))
|
||||
else:
|
||||
raise ValueError(
|
||||
"errorlimit value int() must be between 0 and 65535"
|
||||
"errorlimit value must be between 0 and 65535"
|
||||
)
|
||||
|
||||
def _get_status(self):
|
||||
"""Gibt den RevPi Core Status zurueck.
|
||||
@return Status als int()"""
|
||||
@return Status als <class 'int'>"""
|
||||
return int.from_bytes(
|
||||
self.__lst_io[0].get_value(), byteorder=self.__lst_io[0]._byteorder
|
||||
)
|
||||
@@ -433,7 +446,7 @@ class Core(Device):
|
||||
length=1, byteorder=self.__lst_io[self._ioled]._byteorder
|
||||
))
|
||||
else:
|
||||
raise ValueError("led status int() must be between 0 and 3")
|
||||
raise ValueError("led status must be between 0 and 3")
|
||||
|
||||
def _set_leda2(self, value):
|
||||
"""Setzt den Zustand der LED A2 vom core.
|
||||
@@ -444,7 +457,7 @@ class Core(Device):
|
||||
length=1, byteorder=self.__lst_io[self._ioled]._byteorder
|
||||
))
|
||||
else:
|
||||
raise ValueError("led status int() must be between 0 and 3")
|
||||
raise ValueError("led status must be between 0 and 3")
|
||||
|
||||
A1 = property(_get_leda1, _set_leda1)
|
||||
A2 = property(_get_leda2, _set_leda2)
|
||||
@@ -591,7 +604,7 @@ class Gateway(Device):
|
||||
|
||||
def get_rawbytes(self):
|
||||
"""Gibt die Bytes aus, die dieses Device verwendet.
|
||||
@return bytes() des Devices"""
|
||||
@return <class 'bytes'> des Devices"""
|
||||
return bytes(self._ba_devdata)
|
||||
|
||||
|
||||
@@ -629,7 +642,7 @@ class Virtual(Gateway):
|
||||
self._filelock.acquire()
|
||||
|
||||
for io in self.get_inputs():
|
||||
self._ba_devdata[io._slc_address] = io.defaultvalue
|
||||
self._ba_devdata[io._slc_address] = io._defaultvalue
|
||||
|
||||
# Outpus auf Bus schreiben
|
||||
try:
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# python3-RevPiModIO
|
||||
#
|
||||
# Webpage: https://revpimodio.org/
|
||||
# (c) Sven Sager, License: LGPLv3
|
||||
#
|
||||
# -*- coding: utf-8 -*-
|
||||
"""RevPiModIO Helperklassen und Tools."""
|
||||
import warnings
|
||||
from threading import Event, Lock, Thread
|
||||
@@ -263,7 +263,7 @@ class ProcimgWriter(Thread):
|
||||
|
||||
def get_refresh(self):
|
||||
"""Gibt Zykluszeit zurueck.
|
||||
@return int() Zykluszeit in Millisekunden"""
|
||||
@return <class 'int'> Zykluszeit in Millisekunden"""
|
||||
return int(self._refresh * 1000)
|
||||
|
||||
def run(self):
|
||||
@@ -362,7 +362,7 @@ class ProcimgWriter(Thread):
|
||||
|
||||
def set_refresh(self, value):
|
||||
"""Setzt die Zykluszeit in Millisekunden.
|
||||
@param value int() Millisekunden"""
|
||||
@param value <class 'int'> Millisekunden"""
|
||||
if type(value) == int and 10 <= value <= 2000:
|
||||
waitdiff = self._refresh - self._adjwait
|
||||
self._refresh = value / 1000
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# python3-RevPiModIO
|
||||
#
|
||||
# Webpage: https://revpimodio.org/
|
||||
# (c) Sven Sager, License: LGPLv3
|
||||
#
|
||||
# -*- coding: utf-8 -*-
|
||||
"""RevPiModIO Modul fuer die Verwaltung der IOs."""
|
||||
import struct
|
||||
from threading import Event
|
||||
@@ -31,7 +31,7 @@ class IOList(object):
|
||||
|
||||
def __contains__(self, key):
|
||||
"""Prueft ob IO existiert.
|
||||
@param key IO-Name str() oder Byte int()
|
||||
@param key IO-Name <class 'str'> oder Byte <class 'int'>
|
||||
@return True, wenn IO vorhanden / Byte belegt"""
|
||||
if type(key) == int:
|
||||
return key in self.__dict_iobyte \
|
||||
@@ -87,7 +87,9 @@ class IOList(object):
|
||||
elif type(key) == slice:
|
||||
return [
|
||||
self.__dict_iobyte[int_io]
|
||||
for int_io in range(key.start, key.stop)
|
||||
for int_io in range(
|
||||
key.start, key.stop, 1 if key.step is None else key.step
|
||||
)
|
||||
]
|
||||
else:
|
||||
return getattr(self, key)
|
||||
@@ -139,7 +141,7 @@ class IOList(object):
|
||||
)
|
||||
)
|
||||
else:
|
||||
# Bereits überschriebene bytes() sind ungültig
|
||||
# Bereits überschriebene bytes sind ungültig
|
||||
raise MemoryError(
|
||||
"new io '{}' overlaps memory of '{}'".format(
|
||||
io._name, oldio._name
|
||||
@@ -189,7 +191,7 @@ class DeadIO(object):
|
||||
"""Klasse, mit der ersetzte IOs verwaltet werden."""
|
||||
|
||||
def __init__(self, deadio):
|
||||
"""Instantiierung der DeadIO()-Klasse.
|
||||
"""Instantiierung der DeadIO-Klasse.
|
||||
@param deadio IO, der ersetzt wurde"""
|
||||
self.__deadio = deadio
|
||||
|
||||
@@ -204,22 +206,23 @@ class IOBase(object):
|
||||
"""Basisklasse fuer alle IO-Objekte.
|
||||
|
||||
Die Basisfunktionalitaet ermoeglicht das Lesen und Schreiben der Werte
|
||||
als bytes() oder bool(). Dies entscheidet sich bei der Instantiierung.
|
||||
Wenn eine Bittadresse angegeben wird, werden bool()-Werte erwartet
|
||||
und zurueckgegeben, ansonsten bytes().
|
||||
als <class bytes'> oder <class 'bool'>. Dies entscheidet sich bei der
|
||||
Instantiierung.
|
||||
Wenn eine Bittadresse angegeben wird, werden <class 'bool'>-Werte erwartet
|
||||
und zurueckgegeben, ansonsten <class bytes'>.
|
||||
|
||||
Diese Klasse dient als Basis fuer andere IO-Klassen mit denen die Werte
|
||||
auch als int() verwendet werden koennen.
|
||||
auch als <class 'int'> verwendet werden koennen.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, parentdevice, valuelist, iotype, byteorder, signed):
|
||||
"""Instantiierung der IOBase()-Klasse.
|
||||
"""Instantiierung der IOBase-Klasse.
|
||||
|
||||
@param parentdevice Parentdevice auf dem der IO liegt
|
||||
@param valuelist Datenliste fuer Instantiierung
|
||||
@param iotype io.Type() Wert
|
||||
@param byteorder Byteorder 'little' / 'big' fuer int() Berechnung
|
||||
@param iotype <class 'Type'> Wert
|
||||
@param byteorder Byteorder 'little'/'big' fuer <class 'int'> Berechnung
|
||||
@param sigend Intberechnung mit Vorzeichen durchfuehren
|
||||
|
||||
"""
|
||||
@@ -244,8 +247,8 @@ class IOBase(object):
|
||||
int_startaddress, int_startaddress + self._length
|
||||
)
|
||||
# Defaultvalue aus Zahl in Bytes umrechnen
|
||||
if str(valuelist[1]).isnumeric():
|
||||
self.defaultvalue = int(valuelist[1]).to_bytes(
|
||||
if str(valuelist[1]).isdigit():
|
||||
self._defaultvalue = int(valuelist[1]).to_bytes(
|
||||
self._length, byteorder=self._byteorder
|
||||
)
|
||||
else:
|
||||
@@ -254,12 +257,13 @@ class IOBase(object):
|
||||
if len(valuelist[1]) != self._length:
|
||||
raise ValueError(
|
||||
"given bytes for default value must have a length "
|
||||
"of {}".format(self._length)
|
||||
"of {} but {} was given"
|
||||
"".format(self._length, len(valuelist[1]))
|
||||
)
|
||||
else:
|
||||
self.defaultvalue = valuelist[1]
|
||||
self._defaultvalue = valuelist[1]
|
||||
else:
|
||||
self.defaultvalue = bytes(self._length)
|
||||
self._defaultvalue = bytes(self._length)
|
||||
|
||||
else:
|
||||
# Höhere Bits als 7 auf nächste Bytes umbrechen
|
||||
@@ -267,11 +271,11 @@ class IOBase(object):
|
||||
self._slc_address = slice(
|
||||
int_startaddress, int_startaddress + 1
|
||||
)
|
||||
self.defaultvalue = bool(int(valuelist[1]))
|
||||
self._defaultvalue = bool(int(valuelist[1]))
|
||||
|
||||
def __bool__(self):
|
||||
"""bool()-wert der Klasse.
|
||||
@return IO-Wert als bool(). Nur False wenn False oder 0 sonst True"""
|
||||
"""<class 'bool'>-Wert der Klasse.
|
||||
@return <class 'bool'> Nur False wenn False oder 0 sonst True"""
|
||||
if self._bitaddress >= 0:
|
||||
int_byte = int.from_bytes(
|
||||
self._parentdevice._ba_devdata[self._slc_address],
|
||||
@@ -282,7 +286,7 @@ class IOBase(object):
|
||||
return bool(self._parentdevice._ba_devdata[self._slc_address])
|
||||
|
||||
def __str__(self):
|
||||
"""str()-wert der Klasse.
|
||||
"""<class 'str'>-Wert der Klasse.
|
||||
@return Namen des IOs"""
|
||||
return self._name
|
||||
|
||||
@@ -293,12 +297,12 @@ class IOBase(object):
|
||||
|
||||
def _get_byteorder(self):
|
||||
"""Gibt konfigurierte Byteorder zurueck.
|
||||
@return str() Byteorder"""
|
||||
@return <class 'str'> Byteorder"""
|
||||
return self._byteorder
|
||||
|
||||
def _get_iotype(self):
|
||||
"""Gibt io.Type zurueck.
|
||||
@return int() io.Type"""
|
||||
@return <class 'int'> io.Type"""
|
||||
return self._iotype
|
||||
|
||||
def _get_length(self):
|
||||
@@ -311,9 +315,14 @@ class IOBase(object):
|
||||
@return IO Name"""
|
||||
return self._name
|
||||
|
||||
def get_defaultvalue(self):
|
||||
"""Gibt die Defaultvalue von piCtory zurueck.
|
||||
@return Defaultvalue als <class 'byte'> oder <class 'bool'>"""
|
||||
return self._defaultvalue
|
||||
|
||||
def get_value(self):
|
||||
"""Gibt den Wert des IOs als bytes() oder bool() zurueck.
|
||||
@return IO-Wert"""
|
||||
"""Gibt den Wert des IOs zurueck.
|
||||
@return IO-Wert als <class 'bytes'> oder <class 'bool'>"""
|
||||
if self._bitaddress >= 0:
|
||||
int_byte = int.from_bytes(
|
||||
self._parentdevice._ba_devdata[self._slc_address],
|
||||
@@ -376,10 +385,10 @@ class IOBase(object):
|
||||
"""Ersetzt bestehenden IO mit Neuem.
|
||||
|
||||
@param name Name des neuen Inputs
|
||||
@param frm struct() formatierung (1 Zeichen)
|
||||
@param frm struct formatierung (1 Zeichen)
|
||||
@param kwargs Weitere Parameter:
|
||||
- bmk: Bezeichnung fuer Input
|
||||
- bit: Registriert Input als bool() am angegebenen Bit im Byte
|
||||
- bit: Registriert IO als <class 'bool'> am angegebenen Bit im Byte
|
||||
- byteorder: Byteorder fuer den Input, Standardwert=little
|
||||
- defaultvalue: Standardwert fuer Input, Standard ist 0
|
||||
- event: Funktion fuer Eventhandling registrieren
|
||||
@@ -387,7 +396,7 @@ class IOBase(object):
|
||||
- edge: event-Ausfuehren bei RISING, FALLING or BOTH Wertaenderung
|
||||
@see <a target="_blank"
|
||||
href="https://docs.python.org/3/library/struct.html#format-characters"
|
||||
>Python3 struct()</a>
|
||||
>Python3 struct</a>
|
||||
|
||||
"""
|
||||
if not issubclass(type(self._parentdevice), Gateway):
|
||||
@@ -396,13 +405,15 @@ class IOBase(object):
|
||||
"devices only"
|
||||
)
|
||||
|
||||
# StructIO erzeugen und in IO-Liste einfügen
|
||||
# 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
|
||||
@@ -415,8 +426,8 @@ class IOBase(object):
|
||||
)
|
||||
|
||||
def set_value(self, value):
|
||||
"""Setzt den Wert des IOs mit bytes() oder bool().
|
||||
@param value IO-Wert als bytes() oder bool()"""
|
||||
"""Setzt den Wert des IOs.
|
||||
@param value IO-Wert als <class bytes'> oder <class 'bool'>"""
|
||||
if self._iotype == Type.OUT:
|
||||
if self._bitaddress >= 0:
|
||||
# Versuchen egal welchen Typ in Bool zu konvertieren
|
||||
@@ -506,15 +517,15 @@ class IOBase(object):
|
||||
|
||||
Bei Wertaenderung, wird das Warten mit 0 als Rueckgabewert beendet.
|
||||
|
||||
HINWEIS: Wenn ProcimgWriter() keine neuen Daten liefert, wird
|
||||
HINWEIS: Wenn <class 'ProcimgWriter'> keine neuen Daten liefert, wird
|
||||
bis in die Ewigkeit gewartet (nicht bei Angabe von "timeout").
|
||||
|
||||
Wenn edge mit RISING oder FALLING angegeben wird muss diese Flanke
|
||||
ausgeloest werden. Sollte der Wert 1 sein beim Eintritt mit Flanke
|
||||
RISING, wird das Warten erst bei Aenderung von 0 auf 1 beendet.
|
||||
|
||||
Als exitevent kann ein threading.Event()-Objekt uebergeben werden,
|
||||
welches das Warten bei is_set() sofort mit 1 als Rueckgabewert
|
||||
Als exitevent kann ein <class 'threading.Event'>-Objekt uebergeben
|
||||
werden, welches das Warten bei is_set() sofort mit 1 als Rueckgabewert
|
||||
beendet.
|
||||
|
||||
Wenn der Wert okvalue an dem IO fuer das Warten anliegt, wird
|
||||
@@ -526,10 +537,10 @@ class IOBase(object):
|
||||
angegeben Millisekunden! Es wird immer nach oben gerundet!)
|
||||
|
||||
@param edge Flanke RISING, FALLING, BOTH bei der mit True beendet wird
|
||||
@param exitevent thrading.Event() fuer vorzeitiges Beenden mit False
|
||||
@param exitevent <class 'thrading.Event'> fuer vorzeitiges Beenden
|
||||
@param okvalue IO-Wert, bei dem das Warten sofort mit True beendet wird
|
||||
@param timeout Zeit in ms nach der mit False abgebrochen wird
|
||||
@return int() erfolgreich Werte <= 0
|
||||
@return <class 'int'> erfolgreich Werte <= 0
|
||||
- Erfolgreich gewartet
|
||||
Wert 0: IO hat den Wert gewechselt
|
||||
Wert -1: okvalue stimmte mit IO ueberein
|
||||
@@ -600,6 +611,7 @@ class IOBase(object):
|
||||
|
||||
address = property(_get_address)
|
||||
byteorder = property(_get_byteorder)
|
||||
defaultvalue = property(get_defaultvalue)
|
||||
length = property(_get_length)
|
||||
name = property(_get_name)
|
||||
type = property(_get_iotype)
|
||||
@@ -608,19 +620,19 @@ class IOBase(object):
|
||||
|
||||
class IntIO(IOBase):
|
||||
|
||||
"""Klasse fuer den Zugriff auf die Daten mit Konvertierung in int().
|
||||
"""Klasse fuer den Zugriff auf die Daten mit Konvertierung in int.
|
||||
|
||||
Diese Klasse erweitert die Funktion von IOBase() um Funktionen,
|
||||
ueber die mit int() Werten gearbeitet werden kann. Fuer die Umwandlung
|
||||
koennen 'Byteorder' (Default 'little') und 'signed' (Default False) als
|
||||
Parameter gesetzt werden.
|
||||
Diese Klasse erweitert die Funktion von <class 'IOBase'> um Funktionen,
|
||||
ueber die mit <class 'int'> Werten gearbeitet werden kann. Fuer die
|
||||
Umwandlung koennen 'Byteorder' (Default 'little') und 'signed' (Default
|
||||
False) als Parameter gesetzt werden.
|
||||
@see #IOBase IOBase
|
||||
|
||||
"""
|
||||
|
||||
def __int__(self):
|
||||
"""Gibt IO als int() Wert zurueck mit Beachtung byteorder/signed.
|
||||
@return int() ohne Vorzeichen"""
|
||||
"""Gibt IO-Wert zurueck mit Beachtung byteorder/signed.
|
||||
@return IO-Wert als <class 'int'>"""
|
||||
return int.from_bytes(
|
||||
self._parentdevice._ba_devdata[self._slc_address],
|
||||
byteorder=self._byteorder,
|
||||
@@ -633,11 +645,12 @@ class IntIO(IOBase):
|
||||
return self._signed
|
||||
|
||||
def _set_byteorder(self, value):
|
||||
"""Setzt Byteorder fuer int() Umwandlung.
|
||||
@param value str() 'little' or 'big'"""
|
||||
"""Setzt Byteorder fuer <class 'int'> Umwandlung.
|
||||
@param value <class 'str'> 'little' or 'big'"""
|
||||
if not (value == "little" or value == "big"):
|
||||
raise ValueError("byteorder must be 'little' or 'big'")
|
||||
self._byteorder = value
|
||||
self._defaultvalue = self._defaultvalue[::-1]
|
||||
|
||||
def _set_signed(self, value):
|
||||
"""Left fest, ob der Wert Vorzeichenbehaftet behandelt werden soll.
|
||||
@@ -646,9 +659,16 @@ class IntIO(IOBase):
|
||||
raise ValueError("signed must be <class 'bool'> True or False")
|
||||
self._signed = value
|
||||
|
||||
def get_intdefaultvalue(self):
|
||||
"""Gibt die Defaultvalue als <class 'int'> zurueck.
|
||||
@return <class 'int'> Defaultvalue"""
|
||||
return int.from_bytes(
|
||||
self._defaultvalue, byteorder=self._byteorder, signed=self._signed
|
||||
)
|
||||
|
||||
def get_int(self):
|
||||
"""Gibt IO als int() Wert zurueck mit Beachtung byteorder/signed.
|
||||
@return int() Wert"""
|
||||
"""Gibt IO-Wert zurueck mit Beachtung byteorder/signed.
|
||||
@return IO-Wert als <class 'int'>"""
|
||||
return int.from_bytes(
|
||||
self._parentdevice._ba_devdata[self._slc_address],
|
||||
byteorder=self._byteorder,
|
||||
@@ -657,7 +677,7 @@ class IntIO(IOBase):
|
||||
|
||||
def set_int(self, value):
|
||||
"""Setzt IO mit Beachtung byteorder/signed.
|
||||
@param value int()"""
|
||||
@param value <class 'int'> Wert"""
|
||||
if type(value) == int:
|
||||
self.set_value(value.to_bytes(
|
||||
self._length,
|
||||
@@ -671,16 +691,16 @@ class IntIO(IOBase):
|
||||
)
|
||||
|
||||
byteorder = property(IOBase._get_byteorder, _set_byteorder)
|
||||
defaultvalue = property(get_intdefaultvalue)
|
||||
signed = property(_get_signed, _set_signed)
|
||||
value = property(get_int, set_int)
|
||||
|
||||
|
||||
class StructIO(IOBase):
|
||||
|
||||
"""Klasse fuer den Zugriff auf Daten ueber ein definierten struct().
|
||||
"""Klasse fuer den Zugriff auf Daten ueber ein definierten struct.
|
||||
|
||||
Diese Klasse ueberschreibt get_value() und set_value() der IOBase()
|
||||
Klasse. Sie stellt ueber struct die Werte in der gewuenschten Formatierung
|
||||
Sie stellt ueber struct die Werte in der gewuenschten Formatierung
|
||||
bereit. Der struct-Formatwert wird bei der Instantiierung festgelegt.
|
||||
@see #IOBase IOBase
|
||||
|
||||
@@ -691,10 +711,10 @@ class StructIO(IOBase):
|
||||
|
||||
@param parentio ParentIO Objekt, welches ersetzt wird
|
||||
@param name Name des neuen IO
|
||||
@param frm struct() formatierung (1 Zeichen)
|
||||
@param frm struct formatierung (1 Zeichen)
|
||||
@param kwargs Weitere Parameter:
|
||||
- bmk: Bezeichnung fuer Output
|
||||
- bit: Registriert Outputs als bool() am angegebenen Bit im Byte
|
||||
- bit: Registriert IO als <class 'bool'> am angegebenen Bit im Byte
|
||||
- byteorder: Byteorder fuer den Input, Standardwert=little
|
||||
- defaultvalue: Standardwert fuer Output, Standard ist 0
|
||||
|
||||
@@ -709,7 +729,7 @@ class StructIO(IOBase):
|
||||
bitaddress = "" if frm != "?" else str(kwargs.get("bit", 0))
|
||||
if bitaddress == "" or (0 <= int(bitaddress) < 8):
|
||||
|
||||
bitlength = "1" if bitaddress.isnumeric() else \
|
||||
bitlength = "1" if bitaddress.isdigit() else \
|
||||
struct.calcsize(bofrm + frm) * 8
|
||||
|
||||
# [name,default,anzbits,adressbyte,export,adressid,bmk,bitaddress]
|
||||
@@ -752,8 +772,8 @@ class StructIO(IOBase):
|
||||
)
|
||||
|
||||
def _get_frm(self):
|
||||
"""Ruft die struct() Formatierung ab.
|
||||
@return struct() Formatierung"""
|
||||
"""Ruft die struct Formatierung ab.
|
||||
@return struct Formatierung"""
|
||||
return self.__frm
|
||||
|
||||
def _get_signed(self):
|
||||
@@ -761,6 +781,14 @@ class StructIO(IOBase):
|
||||
@return True, wenn Vorzeichenbehaftet"""
|
||||
return self._signed
|
||||
|
||||
def get_structdefaultvalue(self):
|
||||
"""Gibt die Defaultvalue mit struct Formatierung zurueck.
|
||||
@return Defaultvalue vom Typ der struct-Formatierung"""
|
||||
if self._bitaddress >= 0:
|
||||
return self._defaultvalue
|
||||
else:
|
||||
return struct.unpack(self.__frm, self._defaultvalue)[0]
|
||||
|
||||
def get_structvalue(self):
|
||||
"""Gibt den Wert mit struct Formatierung zurueck.
|
||||
@return Wert vom Typ der struct-Formatierung"""
|
||||
@@ -777,6 +805,7 @@ class StructIO(IOBase):
|
||||
else:
|
||||
self.set_value(struct.pack(self.__frm, value))
|
||||
|
||||
defaultvalue = property(get_structdefaultvalue)
|
||||
frm = property(_get_frm)
|
||||
signed = property(_get_signed)
|
||||
value = property(get_structvalue, set_structvalue)
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# python3-RevPiModIO
|
||||
#
|
||||
# Webpage: https://revpimodio.org/
|
||||
# (c) Sven Sager, License: LGPLv3
|
||||
#
|
||||
# -*- coding: utf-8 -*-
|
||||
"""RevPiModIO Hauptklasse."""
|
||||
import warnings
|
||||
from json import load as jload
|
||||
@@ -33,24 +33,25 @@ class RevPiModIO(object):
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
def __init__(
|
||||
self, autorefresh=False, monitoring=False, syncoutputs=True,
|
||||
procimg=None, configrsc=None, simulator=False):
|
||||
"""Instantiiert die Grundfunktionen.
|
||||
|
||||
@param kwargs Weitere Parameter:
|
||||
- autorefresh: Wenn True, alle Devices zu autorefresh hinzufuegen
|
||||
- configrsc: Pfad zur piCtory Konfigurationsdatei
|
||||
- procimg: Pfad zum Prozessabbild
|
||||
- monitoring: In- und Outputs werden gelesen, niemals geschrieben
|
||||
- simulator: Laed das Modul als Simulator und vertauscht IOs
|
||||
- syncoutputs: Aktuell gesetzte Outputs vom Prozessabbild einlesen
|
||||
@param autorefresh Wenn True, alle Devices zu autorefresh hinzufuegen
|
||||
@param monitoring In- und Outputs werden gelesen, niemals geschrieben
|
||||
@param syncoutputs Aktuell gesetzte Outputs vom Prozessabbild einlesen
|
||||
@param procimg Abweichender Pfad zum Prozessabbild
|
||||
@param configrsc Abweichender Pfad zur piCtory Konfigurationsdatei
|
||||
@param simulator Laed das Modul als Simulator und vertauscht IOs
|
||||
|
||||
"""
|
||||
self._autorefresh = kwargs.get("autorefresh", False)
|
||||
self._configrsc = kwargs.get("configrsc", None)
|
||||
self._monitoring = kwargs.get("monitoring", False)
|
||||
self._procimg = kwargs.get("procimg", "/dev/piControl0")
|
||||
self._simulator = kwargs.get("simulator", False)
|
||||
self._syncoutputs = kwargs.get("syncoutputs", True)
|
||||
self._autorefresh = autorefresh
|
||||
self._configrsc = configrsc
|
||||
self._monitoring = monitoring
|
||||
self._procimg = "/dev/piControl0" if procimg is None else procimg
|
||||
self._simulator = simulator
|
||||
self._syncoutputs = syncoutputs
|
||||
|
||||
# TODO: bei simulator und procimg prüfen ob datei existiert / anlegen?
|
||||
|
||||
@@ -123,7 +124,7 @@ class RevPiModIO(object):
|
||||
if _searchtype is None or dev["type"] == _searchtype:
|
||||
if dev["name"] in self._lst_devselect:
|
||||
lst_found.append(dev)
|
||||
elif dev["position"].isnumeric() \
|
||||
elif dev["position"].isdigit() \
|
||||
and int(dev["position"]) in self._lst_devselect:
|
||||
lst_found.append(dev)
|
||||
|
||||
@@ -151,14 +152,6 @@ class RevPiModIO(object):
|
||||
self, device, simulator=self._simulator
|
||||
)
|
||||
self.core = dev_new
|
||||
|
||||
# Für RS485 errors defaults laden und schreiben
|
||||
# NOTE: Soll das wirklich gemacht werden?
|
||||
for io in dev_new.get_outputs():
|
||||
io.set_value(io.defaultvalue)
|
||||
if not self._monitoring:
|
||||
self.writeprocimg(dev_new)
|
||||
|
||||
elif device["type"] == "LEFT_RIGHT":
|
||||
# IOs
|
||||
dev_new = devicemodule.Device(
|
||||
@@ -287,7 +280,7 @@ class RevPiModIO(object):
|
||||
|
||||
def _set_cycletime(self, milliseconds):
|
||||
"""Setzt Aktualisierungsrate der Prozessabbild-Synchronisierung.
|
||||
@param milliseconds int() in Millisekunden"""
|
||||
@param milliseconds <class 'int'> in Millisekunden"""
|
||||
self._imgwriter.refresh = milliseconds
|
||||
|
||||
def _set_maxioerrors(self, value):
|
||||
@@ -413,8 +406,8 @@ class RevPiModIO(object):
|
||||
self._looprunning = False
|
||||
|
||||
def get_jconfigrsc(self):
|
||||
"""Laed die piCotry Konfiguration und erstellt ein dict().
|
||||
@return dict() der piCtory Konfiguration"""
|
||||
"""Laed die piCotry Konfiguration und erstellt ein <class 'dict'>.
|
||||
@return <class 'dict'> der piCtory Konfiguration"""
|
||||
# piCtory Konfiguration prüfen
|
||||
if self._configrsc is not None:
|
||||
if not access(self._configrsc, F_OK | R_OK):
|
||||
@@ -681,7 +674,7 @@ class RevPiModIO(object):
|
||||
|
||||
for dev in mylist:
|
||||
for io in dev.get_outputs():
|
||||
io.set_value(io.defaultvalue)
|
||||
io.set_value(io._defaultvalue)
|
||||
|
||||
def syncoutputs(self, device=None):
|
||||
"""Lesen aller aktuell gesetzten Outputs im Prozessabbild.
|
||||
@@ -794,7 +787,9 @@ class RevPiModIOSelected(RevPiModIO):
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, deviceselection, **kwargs):
|
||||
def __init__(
|
||||
self, deviceselection, autorefresh=False, monitoring=False,
|
||||
syncoutputs=True, procimg=None, configrsc=None, simulator=False):
|
||||
"""Instantiiert nur fuer angegebene Devices die Grundfunktionen.
|
||||
|
||||
Der Parameter deviceselection kann eine einzelne
|
||||
@@ -802,11 +797,12 @@ class RevPiModIOSelected(RevPiModIO):
|
||||
mehreren Positionen / Namen
|
||||
|
||||
@param deviceselection Positionsnummer oder Devicename
|
||||
@param kwargs Weitere Parameter
|
||||
@see #RevPiModIO.__init__ RevPiModIO.__init__(...)
|
||||
|
||||
"""
|
||||
super().__init__(**kwargs)
|
||||
super().__init__(
|
||||
autorefresh, monitoring, syncoutputs, procimg, configrsc, simulator
|
||||
)
|
||||
|
||||
# Device liste erstellen
|
||||
if type(deviceselection) == list:
|
||||
@@ -818,7 +814,8 @@ class RevPiModIOSelected(RevPiModIO):
|
||||
for vdev in self._lst_devselect:
|
||||
if type(vdev) != int and type(vdev) != str:
|
||||
raise ValueError(
|
||||
"need device position as int() or device name as str()"
|
||||
"need device position as <class 'int'> or device name as "
|
||||
"<class 'str'>"
|
||||
)
|
||||
|
||||
self._configure()
|
||||
@@ -854,14 +851,19 @@ class RevPiModIODriver(RevPiModIOSelected):
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, vdev, **kwargs):
|
||||
def __init__(
|
||||
self, virtdev, autorefresh=False, monitoring=False,
|
||||
syncoutputs=True, procimg=None, configrsc=None):
|
||||
"""Instantiiert die Grundfunktionen.
|
||||
|
||||
@param vdev Virtuelles Device fuer die Verwendung / oder list()
|
||||
@param kwargs Weitere Parameter (nicht monitoring und simulator)
|
||||
Parameter 'monitoring' und 'simulator' stehen hier nicht zur
|
||||
Verfuegung, da diese automatisch gesetzt werden.
|
||||
|
||||
@param virtdev Virtuelles Device oder mehrere als <class 'list'>
|
||||
@see #RevPiModIO.__init__ RevPiModIO.__init__(...)
|
||||
|
||||
"""
|
||||
kwargs["monitoring"] = False
|
||||
kwargs["simulator"] = True
|
||||
super().__init__(vdev, **kwargs)
|
||||
# Parent mit monitoring=False und simulator=True laden
|
||||
super().__init__(
|
||||
virtdev, autorefresh, False, syncoutputs, procimg, configrsc, True
|
||||
)
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# python3-RevPiModIO
|
||||
#
|
||||
# Webpage: https://revpimodio.org/
|
||||
# (c) Sven Sager, License: LGPLv3
|
||||
#
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Bildet die Summary-Sektion von piCtory ab."""
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user