From 43d03cc254366be5009c2a13d431cc865fa319bf Mon Sep 17 00:00:00 2001 From: Sven Sager Date: Thu, 26 Jan 2023 19:43:14 +0100 Subject: [PATCH] Add option to switch word order on debugios The context menu of a value in debugios has the new Option "Swap Wordorder". This will first swap words and then apply the byte order. --- src/revpicommander/__init__.py | 1 + src/revpicommander/debugcontrol.py | 1 + src/revpicommander/debugios.py | 34 ++++++++++++++++++++++------ src/revpicommander/helper.py | 10 ++++++++ src/revpicommander/revpicommander.py | 2 +- 5 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/revpicommander/__init__.py b/src/revpicommander/__init__.py index f97acda..8cdae28 100644 --- a/src/revpicommander/__init__.py +++ b/src/revpicommander/__init__.py @@ -3,4 +3,5 @@ __author__ = "Sven Sager" __copyright__ = "Copyright (C) 2023 Sven Sager" __license__ = "GPLv3" +__package__ = "revpicommander" __version__ = "0.9.10rc5" diff --git a/src/revpicommander/debugcontrol.py b/src/revpicommander/debugcontrol.py index 6db2708..5df3b5e 100644 --- a/src/revpicommander/debugcontrol.py +++ b/src/revpicommander/debugcontrol.py @@ -197,6 +197,7 @@ class DebugControl(QtWidgets.QWidget, Ui_wid_debugcontrol): win = self.dict_windows[position] for io in self.dict_ios[io_type][position]: # type: list # ['name', bytelen, byte_address, 'bmk', bitaddress, 'byteorder', signed] + # + wordorder since revpipyload 0.9.9 value_procimg = bytes(ba_values[io[2]:io[2] + io[1]]) if io[4] >= 0: # Bit-IO diff --git a/src/revpicommander/debugios.py b/src/revpicommander/debugios.py index c5a2561..71e805c 100644 --- a/src/revpicommander/debugios.py +++ b/src/revpicommander/debugios.py @@ -82,6 +82,7 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios): bit_address = io[4] byteorder = io[5] signed = io[6] + word_order = io[7] if len(io) > 7 else "ignored" val = container.findChild(self.search_class, name) if val is not None: @@ -100,14 +101,15 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios): lbl.setObjectName("lbl_".format(name)) lbl.setStyleSheet(self.style_sheet) - val = self._create_widget(name, byte_length, bit_address, byteorder, signed, read_only) + val = self._create_widget(name, byte_length, bit_address, byteorder, signed, read_only, word_order) val.setParent(container) layout.insertRow(counter, val, lbl) self.splitter.setSizes([1, 1]) def _create_widget( - self, name: str, byte_length: int, bit_address: int, byteorder: str, signed: bool, read_only: bool): + self, name: str, byte_length: int, bit_address: int, byteorder: str, signed: bool, read_only: bool, + word_order: str): """Create widget in functions address space to use lambda functions.""" if bit_address >= 0: val = QtWidgets.QCheckBox() @@ -160,6 +162,7 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios): val.setProperty("bit_address", bit_address) val.setProperty("byte_length", byte_length) val.setProperty("signed", signed) + val.setProperty("word_order", word_order) self.__qwa[name] = val return val @@ -203,6 +206,9 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios): act_as_number = QtWidgets.QAction(self.tr("as number")) men.addAction(act_as_number) men.addSeparator() + else: + act_as_text = None + act_as_number = None act_signed = QtWidgets.QAction(self.tr("signed"), men) act_signed.setCheckable(True) @@ -214,6 +220,14 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios): act_byteorder.setChecked(sender.property("big_endian") or False) men.addAction(act_byteorder) + if sender.property("byte_length") > 2: + act_wordorder = QtWidgets.QAction(self.tr("switch wordorder")) + act_wordorder.setCheckable(True) + act_wordorder.setChecked(sender.property("word_order") == "big") + men.addAction(act_wordorder) + else: + act_wordorder = None + rc = men.exec(sender.mapToGlobal(point)) if not rc: men.deleteLater() @@ -232,6 +246,8 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios): sender.setMaximum(max_value) elif rc == act_byteorder: sender.setProperty("big_endian", act_byteorder.isChecked()) + elif rc == act_wordorder: + sender.setProperty("word_order", "big" if act_wordorder.isChecked() else "little") if sender.property("frm"): sender.setProperty("frm", "{0}{1}".format( @@ -239,11 +255,10 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios): sender.property("struct_type").lower() if act_signed.isChecked() else sender.property("struct_type").upper() )) - elif sender.property("byte_length") > 4: - if rc == act_as_text: - sender.setProperty("struct_type", "text") - elif rc == act_as_number: - sender.setProperty("struct_type", "number") + elif rc == act_as_text: + sender.setProperty("struct_type", "text") + elif rc == act_as_number: + sender.setProperty("struct_type", "number") self.set_value(sender.objectName(), actual_value) men.deleteLater() @@ -335,6 +350,10 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios): :param just_last_value: Just set last value property """ child = self.__qwa[io_name] + + if child.property("word_order") == "big" and type(value) == bytes: + value = helper.swap_word_order(value) + if child.property("frm"): value = struct.unpack(child.property("frm"), value)[0] elif type(value) == bytes: @@ -349,6 +368,7 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios): ).format(value, io_name) ) if child.property("struct_type") == "number": + # fixme: Crashs with too much bytes value = str(int.from_bytes( value, byteorder="big" if child.property("big_endian") else "little", diff --git a/src/revpicommander/helper.py b/src/revpicommander/helper.py index 20b3b25..c556221 100644 --- a/src/revpicommander/helper.py +++ b/src/revpicommander/helper.py @@ -676,6 +676,16 @@ def all_revpi_settings() -> [RevPiSettings]: return [RevPiSettings(i) for i in range(count_settings)] +def swap_word_order(bytes_to_swap) -> bytes: + """Swap word order of an even byte array.""" + array_lenght = len(bytes_to_swap) + swap_array = bytearray(bytes_to_swap) + for i in range(0, array_lenght // 2, 2): + swap_array[-i - 2:array_lenght - i], swap_array[i:i + 2] = \ + swap_array[i:i + 2], swap_array[-i - 2:array_lenght - i] + return bytes(swap_array) + + def import_old_settings(): """Try to import saved connections from old storage to new setting object.""" if settings.value("revpicommander/imported_settings", False, type=bool): diff --git a/src/revpicommander/revpicommander.py b/src/revpicommander/revpicommander.py index d85d500..3395753 100644 --- a/src/revpicommander/revpicommander.py +++ b/src/revpicommander/revpicommander.py @@ -11,12 +11,12 @@ from os.path import dirname, join from PyQt5 import QtCore, QtGui, QtWidgets -from revpicommander.backgroundworker import BackgroundWaiter from . import __version__ from . import helper from . import proginit as pi from . import revpilogfile from .avahisearch import AvahiSearch +from .backgroundworker import BackgroundWaiter from .debugcontrol import DebugControl from .helper import ConnectionFail, RevPiSettings from .revpifiles import RevPiFiles