mirror of
https://github.com/naruxde/revpimodio2.git
synced 2025-11-08 22:03:53 +01:00
Timeouthandling für NetFH verbessert 70 prozent für Sync-Timer
IP-Adresse prüfen und ggf. auflösen
This commit is contained in:
@@ -9,6 +9,7 @@
|
|||||||
import socket
|
import socket
|
||||||
import warnings
|
import warnings
|
||||||
from json import loads as jloads
|
from json import loads as jloads
|
||||||
|
from re import compile
|
||||||
from threading import Thread, Event, Lock
|
from threading import Thread, Event, Lock
|
||||||
|
|
||||||
from .device import Device
|
from .device import Device
|
||||||
@@ -37,7 +38,9 @@ class NetFH(Thread):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, address, timeout=500):
|
def __init__(self, address, timeout=500):
|
||||||
"""Init NetFH-class."""
|
"""Init NetFH-class.
|
||||||
|
@param address IP Adresse des RevPis
|
||||||
|
@param timeout Verbindungstimeout in Millisekunden"""
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.daemon = True
|
self.daemon = True
|
||||||
|
|
||||||
@@ -49,11 +52,11 @@ class NetFH(Thread):
|
|||||||
self.__sockerr = Event()
|
self.__sockerr = Event()
|
||||||
self.__sockend = False
|
self.__sockend = False
|
||||||
self.__socklock = Lock()
|
self.__socklock = Lock()
|
||||||
self.__timeout = timeout / 1000
|
self.__timeout = None
|
||||||
self.__trigger = False
|
self.__trigger = False
|
||||||
self.__waitsync = self.__timeout / 2
|
self.__waitsync = None
|
||||||
|
|
||||||
socket.setdefaulttimeout(self.__timeout)
|
self.__set_systimeout(timeout)
|
||||||
|
|
||||||
# Verbindung herstellen
|
# Verbindung herstellen
|
||||||
self._address = address
|
self._address = address
|
||||||
@@ -71,6 +74,20 @@ class NetFH(Thread):
|
|||||||
"""NetworkFileHandler beenden."""
|
"""NetworkFileHandler beenden."""
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
|
def __set_systimeout(self, value):
|
||||||
|
"""Systemfunktion fuer Timeoutberechnung.
|
||||||
|
@param value Timeout in Millisekunden 100 - 60000"""
|
||||||
|
|
||||||
|
if isinstance(value, int) and (100 <= value <= 60000):
|
||||||
|
self.__timeout = value / 1000
|
||||||
|
socket.setdefaulttimeout(self.__timeout)
|
||||||
|
|
||||||
|
# 70 Prozent vom Timeout für Synctimer verwenden
|
||||||
|
self.__waitsync = self.__timeout / 10 * 7
|
||||||
|
|
||||||
|
else:
|
||||||
|
raise ValueError("value must between 10 and 60000 milliseconds")
|
||||||
|
|
||||||
def _connect(self):
|
def _connect(self):
|
||||||
"""Stellt die Verbindung zu einem RevPiSlave her."""
|
"""Stellt die Verbindung zu einem RevPiSlave her."""
|
||||||
# Neuen Socket aufbauen
|
# Neuen Socket aufbauen
|
||||||
@@ -306,12 +323,10 @@ class NetFH(Thread):
|
|||||||
if self.__sockend:
|
if self.__sockend:
|
||||||
raise ValueError("I/O operation on closed file")
|
raise ValueError("I/O operation on closed file")
|
||||||
|
|
||||||
if type(value) == int and (0 < value <= 65535):
|
# Timeoutwert verarbeiten (könnte Exception auslösen)
|
||||||
self.__timeout = value / 1000
|
self.__set_systimeout(value)
|
||||||
self.__waitsync = self.__timeout / 2 - 0.05
|
|
||||||
|
|
||||||
# Timeouts in Sockets übernehmen
|
# Timeouts in Socket setzen
|
||||||
socket.setdefaulttimeout(self.__timeout)
|
|
||||||
self._slavesock.settimeout(self.__timeout)
|
self._slavesock.settimeout(self.__timeout)
|
||||||
|
|
||||||
with self.__socklock:
|
with self.__socklock:
|
||||||
@@ -327,9 +342,6 @@ class NetFH(Thread):
|
|||||||
|
|
||||||
self.__trigger = True
|
self.__trigger = True
|
||||||
|
|
||||||
else:
|
|
||||||
raise ValueError("value must between 1 and 65535 milliseconds")
|
|
||||||
|
|
||||||
def tell(self):
|
def tell(self):
|
||||||
"""Gibt aktuelle Position zurueck.
|
"""Gibt aktuelle Position zurueck.
|
||||||
@return int aktuelle Position"""
|
@return int aktuelle Position"""
|
||||||
@@ -391,17 +403,19 @@ class RevPiNetIO(_RevPiModIO):
|
|||||||
@param simulator Laedt das Modul als Simulator und vertauscht IOs
|
@param simulator Laedt das Modul als Simulator und vertauscht IOs
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
check_ip = compile(
|
||||||
|
r"^(?P<ipn>(25[0-5]|(2[0-4]|[01]?\d|)\d))(\.(?P=ipn)){3}$"
|
||||||
|
)
|
||||||
|
|
||||||
# Adresse verarbeiten
|
# Adresse verarbeiten
|
||||||
if type(address) == str:
|
if isinstance(address, str):
|
||||||
# TODO: IP-Adresse prüfen
|
|
||||||
self._address = (address, 55234)
|
self._address = (address, 55234)
|
||||||
elif type(address) == tuple:
|
elif isinstance(address, tuple):
|
||||||
if len(address) == 2 \
|
if len(address) == 2 \
|
||||||
and type(address[0]) == str \
|
and isinstance(address[0], str) \
|
||||||
and type(address[1]) == int:
|
and isinstance(address[1], int):
|
||||||
|
|
||||||
# Werte prüfen
|
# Werte prüfen
|
||||||
# TODO: IP-Adresse prüfen
|
|
||||||
if not 0 < address[1] <= 65535:
|
if not 0 < address[1] <= 65535:
|
||||||
raise ValueError("port number out of range 1 - 65535")
|
raise ValueError("port number out of range 1 - 65535")
|
||||||
|
|
||||||
@@ -416,6 +430,16 @@ class RevPiNetIO(_RevPiModIO):
|
|||||||
"like (<class 'str'>, <class 'int'>)"
|
"like (<class 'str'>, <class 'int'>)"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# IP-Adresse prüfen und ggf. auflösen
|
||||||
|
if check_ip.match(self._address[0]) is None:
|
||||||
|
try:
|
||||||
|
ipv4 = socket.gethostname(self._address[0])
|
||||||
|
self._address = (ipv4, self._address[1])
|
||||||
|
except:
|
||||||
|
raise ValueError(
|
||||||
|
"ip '{}' is no valid ip address".format(self._address[0])
|
||||||
|
)
|
||||||
|
|
||||||
# Vererben
|
# Vererben
|
||||||
super().__init__(
|
super().__init__(
|
||||||
autorefresh,
|
autorefresh,
|
||||||
|
|||||||
Reference in New Issue
Block a user