From 521a0eb58923b2d03fb144ba24f6e42a87d24248 Mon Sep 17 00:00:00 2001 From: Sven Sager Date: Thu, 17 Aug 2023 12:08:08 +0200 Subject: [PATCH] fix: Wrong values in buffer with autorefresh and shared_procimg active When using `autofresh` in combination with `shared_procimg`, the outputs were written to the process image, but kept with old values in the local buffer. A query to a set output could therefore display an incorrect value under certain circumstances. Closes: #25 Signed-off-by: Sven Sager --- src/revpimodio2/helper.py | 21 ++++++++++++--------- src/revpimodio2/io.py | 1 + 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/revpimodio2/helper.py b/src/revpimodio2/helper.py index f1e9176..81b9115 100644 --- a/src/revpimodio2/helper.py +++ b/src/revpimodio2/helper.py @@ -531,20 +531,23 @@ class ProcimgWriter(Thread): continue try: - for dev in self._modio._lst_refresh: - if not dev._shared_procimg: - continue - # Set shared outputs before reading process image - for io in dev._shared_write: - if not io._write_to_procimg(): - raise IOError("error on _write_to_procimg") - dev._shared_write.clear() - fh.seek(0) fh.readinto(bytesbuff) for dev in self._modio._lst_refresh: with dev._filelock: + if dev._shared_procimg: + # Set modified outputs one by one + for io in dev._shared_write: + if not io._write_to_procimg(): + raise IOError("error on _write_to_procimg") + dev._shared_write.clear() + + # Read all device bytes, because it is shared + fh.seek(dev.offset) + bytesbuff[dev._slc_devoff] = \ + fh.read(len(dev._ba_devdata)) + if self._modio._monitoring or dev._shared_procimg: # Inputs und Outputs in Puffer dev._ba_devdata[:] = bytesbuff[dev._slc_devoff] diff --git a/src/revpimodio2/io.py b/src/revpimodio2/io.py index df72dc5..ceafcb3 100644 --- a/src/revpimodio2/io.py +++ b/src/revpimodio2/io.py @@ -594,6 +594,7 @@ class IOBase(object): return False else: + # Write one or more bytes to process image value = bytes(self._parentdevice._ba_devdata[self._slc_address]) with self._parentdevice._modio._myfh_lck: try: