From 2ff41cfcccae62313eeb455cae9f6d0f41015f27 Mon Sep 17 00:00:00 2001
From: NaruX
Date: Tue, 26 Dec 2017 14:09:12 +0100
Subject: [PATCH] StuctIO kann nun COUNTs Bytes zu einem IO zusammenfassen
Fehlermeldungen in NetFH mit warnings realisiert
---
doc/revpimodio2.io.html | 15 +++++++++++++--
revpimodio2/io.py | 27 ++++++++++++++++++++++-----
revpimodio2/netio.py | 11 ++++++++---
3 files changed, 43 insertions(+), 10 deletions(-)
diff --git a/doc/revpimodio2.io.html b/doc/revpimodio2.io.html
index d8ca045..73586cf 100644
--- a/doc/revpimodio2.io.html
+++ b/doc/revpimodio2.io.html
@@ -389,13 +389,24 @@ 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)
+struct formatierung (1 Zeichen) oder 'ANZAHLs' z.B. '8s'
- kwargs
-
Weitere Parameter:
@@ -927,7 +938,7 @@ ParentIO Objekt, welches ersetzt wird
Name des neuen IO
- frm
-
-struct formatierung (1 Zeichen)
+struct formatierung (1 Zeichen) oder 'ANZAHLs' z.B. '8s'
- kwargs
-
Weitere Parameter:
diff --git a/revpimodio2/io.py b/revpimodio2/io.py
index 4e50f5b..ae239d3 100644
--- a/revpimodio2/io.py
+++ b/revpimodio2/io.py
@@ -7,6 +7,7 @@
#
"""RevPiModIO Modul fuer die Verwaltung der IOs."""
import struct
+from re import match as rematch
from threading import Event
from revpimodio2 import RISING, FALLING, BOTH, INP, OUT, MEM, consttostr
@@ -468,8 +469,19 @@ class IOBase(object):
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)
+ @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
@@ -815,7 +827,7 @@ 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) oder 'ANZAHLs' z.B. '8s'
@param kwargs Weitere Parameter:
- bmk: Bezeichnung fuer IO
- bit: Registriert IO als am angegebenen Bit im Byte
@@ -823,7 +835,10 @@ class StructIO(IOBase):
- defaultvalue: Standardwert fuer IO, Standard vom ersetzter IO
"""
- if len(frm) == 1:
+ # Mehrfach s prüfen 8s
+ regex = rematch("[0-9]*s", frm)
+
+ if len(frm) == 1 or regex is not None and regex.end() == len(frm):
# Byteorder prüfen und übernehmen
byteorder = kwargs.get("byteorder", parentio._byteorder)
if not (byteorder == "little" or byteorder == "big"):
@@ -863,7 +878,9 @@ class StructIO(IOBase):
bitaddress
]
else:
- raise AttributeError("parameter frm has to be a single sign")
+ raise AttributeError(
+ "parameter frm has to be a single sign or 'COUNTs' e.g. '8s'"
+ )
# Basisklasse instantiieren
super().__init__(
@@ -888,7 +905,7 @@ class StructIO(IOBase):
def _get_frm(self):
"""Ruft die struct Formatierung ab.
@return struct Formatierung"""
- return self.__frm[1]
+ return self.__frm[1:]
def _get_signed(self):
"""Ruft ab, ob der Wert Vorzeichenbehaftet behandelt werden soll.
diff --git a/revpimodio2/netio.py b/revpimodio2/netio.py
index e85ee26..b8bf4e6 100644
--- a/revpimodio2/netio.py
+++ b/revpimodio2/netio.py
@@ -7,6 +7,7 @@
#
"""RevPiModIO Hauptklasse fuer Netzwerkzugriff."""
import socket
+import warnings
from json import loads as jloads
from threading import Thread, Event, Lock
@@ -252,14 +253,18 @@ class NetFH(Thread):
self._slavesock.send(_syssync)
data = self._slavesock.recv(2)
except IOError:
- print("ioerror in run()")
+ warnings.warn(
+ "network error in sync of NetFH", RuntimeWarning
+ )
self.__sockerr.set()
else:
if data != b'\x06\x16':
- print("data error in run():", str(data))
+ warnings.warn(
+ "data error in sync of NetFH", RuntimeWarning
+ )
self.__sockerr.set()
- self.__socklock.release()
+ self.__socklock.release()
self.__trigger = False
def seek(self, position):