mirror of
https://github.com/naruxde/revpimodio2.git
synced 2025-11-08 22:03:53 +01:00
Use struct module to pack net commands, send files with length
The struct module is more efficient than int.to_bytes. piCtory and ReplaceIO file length in the first 4 bytes of transmission
This commit is contained in:
@@ -5,6 +5,7 @@ import warnings
|
|||||||
from configparser import ConfigParser
|
from configparser import ConfigParser
|
||||||
from json import loads as jloads
|
from json import loads as jloads
|
||||||
from re import compile
|
from re import compile
|
||||||
|
from struct import pack, unpack
|
||||||
from threading import Event, Lock, Thread
|
from threading import Event, Lock, Thread
|
||||||
|
|
||||||
from revpimodio2 import DeviceNotFoundError
|
from revpimodio2 import DeviceNotFoundError
|
||||||
@@ -27,10 +28,11 @@ _syspictoryh = b'\x01PH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
|||||||
# ReplaceIO Konfiguration laden
|
# ReplaceIO Konfiguration laden
|
||||||
_sysreplaceio = b'\x01RP\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
_sysreplaceio = b'\x01RP\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
||||||
_sysreplaceioh = b'\x01RH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
_sysreplaceioh = b'\x01RH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
||||||
# Übertragene Bytes schreiben
|
|
||||||
_sysflush = b'\x01SD\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x17'
|
|
||||||
# Hashvalues
|
# Hashvalues
|
||||||
HASH_FAIL = b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
|
HASH_FAIL = b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
|
||||||
|
# Header start/stop
|
||||||
|
HEADER_START = b'\x01'
|
||||||
|
HEADER_STOP = b'\x17'
|
||||||
|
|
||||||
|
|
||||||
class AclException(Exception):
|
class AclException(Exception):
|
||||||
@@ -272,11 +274,11 @@ class NetFH(Thread):
|
|||||||
self._slavesock.sendall(_sysdeldirty)
|
self._slavesock.sendall(_sysdeldirty)
|
||||||
else:
|
else:
|
||||||
# Nur bestimmte Dirtybytes löschen
|
# Nur bestimmte Dirtybytes löschen
|
||||||
self._slavesock.sendall(
|
# b CM ii xx c0000000 b = 16
|
||||||
b'\x01EY' +
|
self._slavesock.sendall(pack(
|
||||||
position.to_bytes(length=2, byteorder="little") +
|
"=c2sH2xc7xc",
|
||||||
b'\x00\x00\xFE\x00\x00\x00\x00\x00\x00\x00\x17'
|
HEADER_START, b'EY', position, b'\xfe', HEADER_STOP
|
||||||
)
|
))
|
||||||
|
|
||||||
check = self._slavesock.recv(1)
|
check = self._slavesock.recv(1)
|
||||||
if check != b'\x1e':
|
if check != b'\x1e':
|
||||||
@@ -330,8 +332,11 @@ class NetFH(Thread):
|
|||||||
raise ValueError("flush of closed file")
|
raise ValueError("flush of closed file")
|
||||||
|
|
||||||
with self.__socklock:
|
with self.__socklock:
|
||||||
self.__by_buff += _sysflush
|
# b CM ii ii 00000000 b = 16
|
||||||
self._slavesock.sendall(self.__by_buff)
|
self._slavesock.sendall(pack(
|
||||||
|
"=c2sHH8xc",
|
||||||
|
HEADER_START, b'FD', len(self.__by_buff), self.__int_buff, HEADER_STOP
|
||||||
|
) + self.__by_buff)
|
||||||
|
|
||||||
# Puffer immer leeren
|
# Puffer immer leeren
|
||||||
self.__int_buff = 0
|
self.__int_buff = 0
|
||||||
@@ -405,13 +410,11 @@ class NetFH(Thread):
|
|||||||
raise TypeError("arg must be <class 'bytes'>")
|
raise TypeError("arg must be <class 'bytes'>")
|
||||||
|
|
||||||
with self.__socklock:
|
with self.__socklock:
|
||||||
self._slavesock.sendall(
|
# b CM xx ii iiii0000 b = 16
|
||||||
b'\x01IC' +
|
self._slavesock.sendall(pack(
|
||||||
request.to_bytes(length=4, byteorder="little") +
|
"=c2s2xHI4xc",
|
||||||
len(arg).to_bytes(length=2, byteorder="little") +
|
HEADER_START, b'IC', len(arg), request, HEADER_STOP
|
||||||
b'\x00\x00\x00\x00\x00\x00\x17' +
|
) + arg)
|
||||||
arg
|
|
||||||
)
|
|
||||||
|
|
||||||
# Rückmeldebyte auswerten
|
# Rückmeldebyte auswerten
|
||||||
blockok = self._slavesock.recv(1)
|
blockok = self._slavesock.recv(1)
|
||||||
@@ -435,12 +438,11 @@ class NetFH(Thread):
|
|||||||
raise ValueError("read of closed file")
|
raise ValueError("read of closed file")
|
||||||
|
|
||||||
with self.__socklock:
|
with self.__socklock:
|
||||||
self._slavesock.sendall(
|
# b CM ii ii 00000000 b = 16
|
||||||
b'\x01DA' +
|
self._slavesock.sendall(pack(
|
||||||
self.__position.to_bytes(length=2, byteorder="little") +
|
"=c2sHH8xc",
|
||||||
length.to_bytes(length=2, byteorder="little") +
|
HEADER_START, b'DA', self.__position, length, HEADER_STOP
|
||||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
))
|
||||||
)
|
|
||||||
|
|
||||||
self.__position += length
|
self.__position += length
|
||||||
|
|
||||||
@@ -476,18 +478,27 @@ class NetFH(Thread):
|
|||||||
self._slavesock.sendall(_syspictory)
|
self._slavesock.sendall(_syspictory)
|
||||||
|
|
||||||
self.__buff_recv.clear()
|
self.__buff_recv.clear()
|
||||||
while not self.__sockend.is_set():
|
recv_lenght = 4
|
||||||
count = self._slavesock.recv_into(self.__buff_block, self.__buff_size)
|
while recv_lenght > 0:
|
||||||
|
count = self._slavesock.recv_into(
|
||||||
|
self.__buff_block, recv_lenght
|
||||||
|
)
|
||||||
if count == 0:
|
if count == 0:
|
||||||
self.__sockerr.set()
|
|
||||||
raise IOError("readpictory error on network")
|
raise IOError("readpictory error on network")
|
||||||
self.__buff_recv += self.__buff_block[:count]
|
self.__buff_recv += self.__buff_block[:count]
|
||||||
|
recv_lenght -= count
|
||||||
|
|
||||||
if b'\x04' in self.__buff_recv:
|
recv_lenght = unpack("=I", self.__buff_recv)[0]
|
||||||
# Found EndOfText byte
|
while recv_lenght > 0:
|
||||||
break
|
count = self._slavesock.recv_into(
|
||||||
|
self.__buff_block, min(recv_lenght, self.__buff_size)
|
||||||
|
)
|
||||||
|
if count == 0:
|
||||||
|
raise IOError("readpictory error on network")
|
||||||
|
self.__buff_recv += self.__buff_block[:count]
|
||||||
|
recv_lenght -= count
|
||||||
|
|
||||||
return bytes(self.__buff_recv[:-1])
|
return bytes(self.__buff_recv[4:])
|
||||||
|
|
||||||
def readreplaceio(self) -> bytes:
|
def readreplaceio(self) -> bytes:
|
||||||
"""
|
"""
|
||||||
@@ -507,18 +518,27 @@ class NetFH(Thread):
|
|||||||
self._slavesock.sendall(_sysreplaceio)
|
self._slavesock.sendall(_sysreplaceio)
|
||||||
|
|
||||||
self.__buff_recv.clear()
|
self.__buff_recv.clear()
|
||||||
while not self.__sockend.is_set():
|
recv_lenght = 4
|
||||||
count = self._slavesock.recv_into(self.__buff_block, self.__buff_size)
|
while recv_lenght > 0:
|
||||||
|
count = self._slavesock.recv_into(
|
||||||
|
self.__buff_block, recv_lenght
|
||||||
|
)
|
||||||
if count == 0:
|
if count == 0:
|
||||||
self.__sockerr.set()
|
|
||||||
raise IOError("readreplaceio error on network")
|
raise IOError("readreplaceio error on network")
|
||||||
self.__buff_recv += self.__buff_block[:count]
|
self.__buff_recv += self.__buff_block[:count]
|
||||||
|
recv_lenght -= count
|
||||||
|
|
||||||
if b'\x04' in self.__buff_recv:
|
recv_lenght = unpack("=I", self.__buff_recv)[0]
|
||||||
# Found EndOfText byte
|
while recv_lenght > 0:
|
||||||
break
|
count = self._slavesock.recv_into(
|
||||||
|
self.__buff_block, min(recv_lenght, self.__buff_size)
|
||||||
|
)
|
||||||
|
if count == 0:
|
||||||
|
raise IOError("readpictory error on network")
|
||||||
|
self.__buff_recv += self.__buff_block[:count]
|
||||||
|
recv_lenght -= count
|
||||||
|
|
||||||
return bytes(self.__buff_recv[:-1])
|
return bytes(self.__buff_recv[4:])
|
||||||
|
|
||||||
def run(self) -> None:
|
def run(self) -> None:
|
||||||
"""Handler fuer Synchronisierung."""
|
"""Handler fuer Synchronisierung."""
|
||||||
@@ -602,13 +622,11 @@ class NetFH(Thread):
|
|||||||
try:
|
try:
|
||||||
self.__socklock.acquire()
|
self.__socklock.acquire()
|
||||||
|
|
||||||
self._slavesock.sendall(
|
# b CM ii ii 00000000 b = 16
|
||||||
b'\x01EY' +
|
self._slavesock.sendall(pack(
|
||||||
position.to_bytes(length=2, byteorder="little") +
|
"=c2sHH8xc",
|
||||||
len(dirtybytes).to_bytes(length=2, byteorder="little") +
|
HEADER_START, b'EY', position, len(dirtybytes), HEADER_STOP
|
||||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x17' +
|
) + dirtybytes)
|
||||||
dirtybytes
|
|
||||||
)
|
|
||||||
|
|
||||||
check = self._slavesock.recv(1)
|
check = self._slavesock.recv(1)
|
||||||
if check != b'\x1e':
|
if check != b'\x1e':
|
||||||
@@ -645,11 +663,11 @@ class NetFH(Thread):
|
|||||||
try:
|
try:
|
||||||
self.__socklock.acquire()
|
self.__socklock.acquire()
|
||||||
|
|
||||||
self._slavesock.sendall(
|
# b CM ii xx 00000000 b = 16
|
||||||
b'\x01CF' +
|
self._slavesock.sendall(pack(
|
||||||
value.to_bytes(length=2, byteorder="little") +
|
"=c2sH10xc",
|
||||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
|
HEADER_START, b'CF', value, HEADER_STOP
|
||||||
)
|
))
|
||||||
check = self._slavesock.recv(1)
|
check = self._slavesock.recv(1)
|
||||||
if check != b'\x1e':
|
if check != b'\x1e':
|
||||||
raise IOError("set timeout error on network")
|
raise IOError("set timeout error on network")
|
||||||
@@ -689,10 +707,8 @@ class NetFH(Thread):
|
|||||||
self.__int_buff += 1
|
self.__int_buff += 1
|
||||||
|
|
||||||
# Datenblöcke mit Group Seperator in Puffer ablegen
|
# Datenblöcke mit Group Seperator in Puffer ablegen
|
||||||
self.__by_buff += b'\x01SD' + \
|
self.__by_buff += self.__position.to_bytes(length=2, byteorder="little") + \
|
||||||
self.__position.to_bytes(length=2, byteorder="little") + \
|
|
||||||
len(bytebuff).to_bytes(length=2, byteorder="little") + \
|
len(bytebuff).to_bytes(length=2, byteorder="little") + \
|
||||||
b'\x1d\x00\x00\x00\x00\x00\x00\x00\x17' + \
|
|
||||||
bytebuff
|
bytebuff
|
||||||
|
|
||||||
# TODO: Bufferlänge und dann flushen?
|
# TODO: Bufferlänge und dann flushen?
|
||||||
|
|||||||
Reference in New Issue
Block a user