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"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"
__package__ = "revpicommander"
__version__ = "0.9.10rc5"

View File

@@ -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

View File

@@ -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,8 +255,7 @@ 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:
elif rc == act_as_text:
sender.setProperty("struct_type", "text")
elif rc == act_as_number:
sender.setProperty("struct_type", "number")
@@ -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",

View File

@@ -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):

View File

@@ -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