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.
This commit is contained in:
2023-01-26 19:43:14 +01:00
parent d203958b5f
commit 43d03cc254
5 changed files with 40 additions and 8 deletions

View File

@@ -3,4 +3,5 @@
__author__ = "Sven Sager" __author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager" __copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3" __license__ = "GPLv3"
__package__ = "revpicommander"
__version__ = "0.9.10rc5" __version__ = "0.9.10rc5"

View File

@@ -197,6 +197,7 @@ class DebugControl(QtWidgets.QWidget, Ui_wid_debugcontrol):
win = self.dict_windows[position] win = self.dict_windows[position]
for io in self.dict_ios[io_type][position]: # type: list for io in self.dict_ios[io_type][position]: # type: list
# ['name', bytelen, byte_address, 'bmk', bitaddress, 'byteorder', signed] # ['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]]) value_procimg = bytes(ba_values[io[2]:io[2] + io[1]])
if io[4] >= 0: if io[4] >= 0:
# Bit-IO # Bit-IO

View File

@@ -82,6 +82,7 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
bit_address = io[4] bit_address = io[4]
byteorder = io[5] byteorder = io[5]
signed = io[6] signed = io[6]
word_order = io[7] if len(io) > 7 else "ignored"
val = container.findChild(self.search_class, name) val = container.findChild(self.search_class, name)
if val is not None: if val is not None:
@@ -100,14 +101,15 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
lbl.setObjectName("lbl_".format(name)) lbl.setObjectName("lbl_".format(name))
lbl.setStyleSheet(self.style_sheet) 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) val.setParent(container)
layout.insertRow(counter, val, lbl) layout.insertRow(counter, val, lbl)
self.splitter.setSizes([1, 1]) self.splitter.setSizes([1, 1])
def _create_widget( 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.""" """Create widget in functions address space to use lambda functions."""
if bit_address >= 0: if bit_address >= 0:
val = QtWidgets.QCheckBox() val = QtWidgets.QCheckBox()
@@ -160,6 +162,7 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
val.setProperty("bit_address", bit_address) val.setProperty("bit_address", bit_address)
val.setProperty("byte_length", byte_length) val.setProperty("byte_length", byte_length)
val.setProperty("signed", signed) val.setProperty("signed", signed)
val.setProperty("word_order", word_order)
self.__qwa[name] = val self.__qwa[name] = val
return val return val
@@ -203,6 +206,9 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
act_as_number = QtWidgets.QAction(self.tr("as number")) act_as_number = QtWidgets.QAction(self.tr("as number"))
men.addAction(act_as_number) men.addAction(act_as_number)
men.addSeparator() men.addSeparator()
else:
act_as_text = None
act_as_number = None
act_signed = QtWidgets.QAction(self.tr("signed"), men) act_signed = QtWidgets.QAction(self.tr("signed"), men)
act_signed.setCheckable(True) act_signed.setCheckable(True)
@@ -214,6 +220,14 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
act_byteorder.setChecked(sender.property("big_endian") or False) act_byteorder.setChecked(sender.property("big_endian") or False)
men.addAction(act_byteorder) 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)) rc = men.exec(sender.mapToGlobal(point))
if not rc: if not rc:
men.deleteLater() men.deleteLater()
@@ -232,6 +246,8 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
sender.setMaximum(max_value) sender.setMaximum(max_value)
elif rc == act_byteorder: elif rc == act_byteorder:
sender.setProperty("big_endian", act_byteorder.isChecked()) 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"): if sender.property("frm"):
sender.setProperty("frm", "{0}{1}".format( 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() sender.property("struct_type").lower() if act_signed.isChecked()
else sender.property("struct_type").upper() else sender.property("struct_type").upper()
)) ))
elif sender.property("byte_length") > 4: elif rc == act_as_text:
if rc == act_as_text: sender.setProperty("struct_type", "text")
sender.setProperty("struct_type", "text") elif rc == act_as_number:
elif rc == act_as_number: sender.setProperty("struct_type", "number")
sender.setProperty("struct_type", "number")
self.set_value(sender.objectName(), actual_value) self.set_value(sender.objectName(), actual_value)
men.deleteLater() men.deleteLater()
@@ -335,6 +350,10 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
:param just_last_value: Just set last value property :param just_last_value: Just set last value property
""" """
child = self.__qwa[io_name] 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"): if child.property("frm"):
value = struct.unpack(child.property("frm"), value)[0] value = struct.unpack(child.property("frm"), value)[0]
elif type(value) == bytes: elif type(value) == bytes:
@@ -349,6 +368,7 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
).format(value, io_name) ).format(value, io_name)
) )
if child.property("struct_type") == "number": if child.property("struct_type") == "number":
# fixme: Crashs with too much bytes
value = str(int.from_bytes( value = str(int.from_bytes(
value, value,
byteorder="big" if child.property("big_endian") else "little", byteorder="big" if child.property("big_endian") else "little",

View File

@@ -676,6 +676,16 @@ def all_revpi_settings() -> [RevPiSettings]:
return [RevPiSettings(i) for i in range(count_settings)] 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(): def import_old_settings():
"""Try to import saved connections from old storage to new setting object.""" """Try to import saved connections from old storage to new setting object."""
if settings.value("revpicommander/imported_settings", False, type=bool): if settings.value("revpicommander/imported_settings", False, type=bool):

View File

@@ -11,12 +11,12 @@ from os.path import dirname, join
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5 import QtCore, QtGui, QtWidgets
from revpicommander.backgroundworker import BackgroundWaiter
from . import __version__ from . import __version__
from . import helper from . import helper
from . import proginit as pi from . import proginit as pi
from . import revpilogfile from . import revpilogfile
from .avahisearch import AvahiSearch from .avahisearch import AvahiSearch
from .backgroundworker import BackgroundWaiter
from .debugcontrol import DebugControl from .debugcontrol import DebugControl
from .helper import ConnectionFail, RevPiSettings from .helper import ConnectionFail, RevPiSettings
from .revpifiles import RevPiFiles from .revpifiles import RevPiFiles