Bugfix: Calculate correct lengths despite IO gaps in incorrect piCtory file

This commit is contained in:
2021-04-14 09:09:10 +02:00
parent 687c7ab91a
commit 89a447abb9
3 changed files with 10 additions and 14 deletions

View File

@@ -125,7 +125,7 @@ class Device(object):
""" """
__slots__ = "__my_io_list", "_ba_devdata", "_ba_datacp", \ __slots__ = "__my_io_list", "_ba_devdata", "_ba_datacp", \
"_dict_events", "_filelock", "_length", "_modio", "_name", \ "_dict_events", "_filelock", "_modio", "_name", \
"_offset", "_position", "_producttype", "_selfupdate", \ "_offset", "_position", "_producttype", "_selfupdate", \
"_slc_devoff", "_slc_inp", "_slc_inpoff", "_slc_mem", \ "_slc_devoff", "_slc_inp", "_slc_inpoff", "_slc_mem", \
"_slc_memoff", "_slc_out", "_slc_outoff", "_shared_procimg", \ "_slc_memoff", "_slc_out", "_slc_outoff", "_shared_procimg", \
@@ -143,9 +143,10 @@ class Device(object):
""" """
self._modio = parentmodio self._modio = parentmodio
self._ba_devdata = bytearray()
self._ba_datacp = bytearray() # Copy for event detection
self._dict_events = {} self._dict_events = {}
self._filelock = Lock() self._filelock = Lock()
self._length = 0
self.__my_io_list = [] self.__my_io_list = []
self._selfupdate = False self._selfupdate = False
self._shared_procimg = parentmodio._shared_procimg self._shared_procimg = parentmodio._shared_procimg
@@ -173,7 +174,7 @@ class Device(object):
) )
# SLCs mit offset berechnen # SLCs mit offset berechnen
self._slc_devoff = slice(self._offset, self._offset + self._length) self._slc_devoff = slice(self._offset, self._offset + self.length)
self._slc_inpoff = slice( self._slc_inpoff = slice(
self._slc_inp.start + self._offset, self._slc_inp.start + self._offset,
self._slc_inp.stop + self._offset self._slc_inp.stop + self._offset
@@ -187,10 +188,6 @@ class Device(object):
self._slc_mem.stop + self._offset self._slc_mem.stop + self._offset
) )
# Neues bytearray und Kopie für mainloop anlegen
self._ba_devdata = bytearray(self._length)
self._ba_datacp = bytearray()
# Alle restlichen attribute an Klasse anhängen # Alle restlichen attribute an Klasse anhängen
self.bmk = dict_device.get("bmk", "") self.bmk = dict_device.get("bmk", "")
self.catalognr = dict_device.get("catalogNr", "") self.catalognr = dict_device.get("catalogNr", "")
@@ -268,7 +265,7 @@ class Device(object):
:return: <class 'int'> :return: <class 'int'>
""" """
return self._length return len(self._ba_devdata)
def __str__(self): def __str__(self):
""" """
@@ -349,14 +346,13 @@ class Device(object):
# IO registrieren # IO registrieren
self._modio.io._private_register_new_io_object(io_new) self._modio.io._private_register_new_io_object(io_new)
self._length += io_new._length
# Kleinste und größte Speicheradresse ermitteln # Kleinste und größte Speicheradresse ermitteln
if io_new._slc_address.start < int_min: if io_new._slc_address.start < int_min:
int_min = io_new._slc_address.start int_min = io_new._slc_address.start
if io_new._slc_address.stop > int_max: if io_new._slc_address.stop > int_max:
int_max = io_new._slc_address.stop int_max = io_new._slc_address.stop
self._ba_devdata += bytearray(int_max - int_min)
return slice(int_min, int_max) return slice(int_min, int_max)
def _devconfigure(self): def _devconfigure(self):
@@ -586,14 +582,14 @@ class Core(Base):
self._slc_errorcnt = None self._slc_errorcnt = None
self._slc_errorlimit1 = None self._slc_errorlimit1 = None
self._slc_errorlimit2 = None self._slc_errorlimit2 = None
if self._length == 9: if self.length == 9:
# 9 Byte = Core1.1 # 9 Byte = Core1.1
self._slc_cycle = slice(1, 2) self._slc_cycle = slice(1, 2)
self._slc_errorcnt = slice(2, 4) self._slc_errorcnt = slice(2, 4)
self._slc_led = slice(4, 5) self._slc_led = slice(4, 5)
self._slc_errorlimit1 = slice(5, 7) self._slc_errorlimit1 = slice(5, 7)
self._slc_errorlimit2 = slice(7, 9) self._slc_errorlimit2 = slice(7, 9)
elif self._length == 11: elif self.length == 11:
# 11 Byte = Core1.2 / Connect # 11 Byte = Core1.2 / Connect
self._slc_cycle = slice(1, 2) self._slc_cycle = slice(1, 2)
self._slc_errorcnt = slice(2, 4) self._slc_errorcnt = slice(2, 4)

View File

@@ -305,7 +305,7 @@ class RevPiModIO(object):
if self._length < dev_new._offset: if self._length < dev_new._offset:
self._length = dev_new._offset self._length = dev_new._offset
self._length += dev_new._length self._length += dev_new.length
# Auf doppelte Namen prüfen, da piCtory dies zulässt # Auf doppelte Namen prüfen, da piCtory dies zulässt
if hasattr(self.device, dev_new._name): if hasattr(self.device, dev_new._name):

View File

@@ -17,7 +17,7 @@ setup(
license="LGPLv3", license="LGPLv3",
name="revpimodio2", name="revpimodio2",
version="2.5.6a", version="2.5.6b",
packages=["revpimodio2"], packages=["revpimodio2"],
python_requires="~=3.2", python_requires="~=3.2",