mirror of
https://github.com/naruxde/revpicommander.git
synced 2025-11-08 16:43:53 +01:00
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:
@@ -3,4 +3,5 @@
|
||||
__author__ = "Sven Sager"
|
||||
__copyright__ = "Copyright (C) 2023 Sven Sager"
|
||||
__license__ = "GPLv3"
|
||||
__package__ = "revpicommander"
|
||||
__version__ = "0.9.10rc5"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user