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"
|
__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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,8 +255,7 @@ 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")
|
||||||
@@ -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",
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user