diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/FocusedMemoryRegion.hpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/FocusedMemoryRegion.hpp index dc59d23c..cd5c7217 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/FocusedMemoryRegion.hpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/FocusedMemoryRegion.hpp @@ -18,6 +18,7 @@ namespace Bloom { public: MemoryRegionDataType dataType = MemoryRegionDataType::UNKNOWN; + Targets::TargetMemoryEndianness endianness = Targets::TargetMemoryEndianness::LITTLE; explicit FocusedMemoryRegion( const QString& name, diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/HexViewerWidget/ValueAnnotationItem.cpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/HexViewerWidget/ValueAnnotationItem.cpp index fe6b9c7d..6ef2f2d1 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/HexViewerWidget/ValueAnnotationItem.cpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/HexViewerWidget/ValueAnnotationItem.cpp @@ -5,12 +5,20 @@ using namespace Bloom::Widgets; ValueAnnotationItem::ValueAnnotationItem(const FocusedMemoryRegion& focusedMemoryRegion) -: AnnotationItem(focusedMemoryRegion, AnnotationItemPosition::TOP), focusedMemoryRegion(focusedMemoryRegion) { + : AnnotationItem(focusedMemoryRegion, AnnotationItemPosition::TOP) + , focusedMemoryRegion(focusedMemoryRegion) + , endianness(focusedMemoryRegion.endianness) +{ this->labelText = QString(ValueAnnotationItem::DEFAULT_LABEL_TEXT); } void ValueAnnotationItem::setValue(const Targets::TargetMemoryBuffer& value) { this->value = value; + + if (this->endianness == Targets::TargetMemoryEndianness::LITTLE) { + std::reverse(this->value.begin(), this->value.end()); + } + this->refreshLabelText(); this->setToolTip(this->labelText); } diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/HexViewerWidget/ValueAnnotationItem.hpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/HexViewerWidget/ValueAnnotationItem.hpp index 690bc31a..a5553b9b 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/HexViewerWidget/ValueAnnotationItem.hpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/HexViewerWidget/ValueAnnotationItem.hpp @@ -33,6 +33,7 @@ namespace Bloom::Widgets FocusedMemoryRegion focusedMemoryRegion; Targets::TargetMemoryBuffer value; + Targets::TargetMemoryEndianness endianness = Targets::TargetMemoryEndianness::LITTLE; void refreshLabelText(); }; diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/FocusedRegionItem.cpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/FocusedRegionItem.cpp index af60c02d..b5648c95 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/FocusedRegionItem.cpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/FocusedRegionItem.cpp @@ -41,13 +41,21 @@ void FocusedRegionItem::applyChanges() { this->endAddressInput->text().toUInt(nullptr, 16) ); this->memoryRegion.addressRangeInputType = this->getSelectedAddressInputType(); - this->memoryRegion.addressRange = this->memoryRegion.addressRangeInputType == MemoryRegionAddressInputType::RELATIVE ? - this->convertRelativeToAbsoluteAddressRange(inputAddressRange) : inputAddressRange; + this->memoryRegion.addressRange = + this->memoryRegion.addressRangeInputType == MemoryRegionAddressInputType::RELATIVE ? + this->convertRelativeToAbsoluteAddressRange(inputAddressRange) : inputAddressRange; auto selectedDataTypeOptionName = this->dataTypeInput->currentData().toString(); if (FocusedRegionItem::dataTypeOptionsByName.contains(selectedDataTypeOptionName)) { this->memoryRegion.dataType = FocusedRegionItem::dataTypeOptionsByName.at(selectedDataTypeOptionName).dataType; } + + auto selectedEndiannessOptionName = this->endiannessInput->currentData().toString(); + if (FocusedRegionItem::endiannessOptionsByName.contains(selectedEndiannessOptionName)) { + this->memoryRegion.endianness = FocusedRegionItem::endiannessOptionsByName.at( + selectedEndiannessOptionName + ).endianness; + } } void FocusedRegionItem::initFormInputs() { @@ -55,11 +63,16 @@ void FocusedRegionItem::initFormInputs() { const auto& region = this->memoryRegion; this->dataTypeInput = this->formWidget->findChild("data-type-input"); + this->endiannessInput = this->formWidget->findChild("endianness-input"); for (const auto& [optionName, option] : FocusedRegionItem::dataTypeOptionsByName) { this->dataTypeInput->addItem(option.text, optionName); } + for (const auto& [optionName, option] : FocusedRegionItem::endiannessOptionsByName) { + this->endiannessInput->addItem(option.text, optionName); + } + switch (region.dataType) { case MemoryRegionDataType::UNSIGNED_INTEGER: { this->dataTypeInput->setCurrentText(FocusedRegionItem::dataTypeOptionsByName.at("unsigned_integer").text); @@ -77,4 +90,15 @@ void FocusedRegionItem::initFormInputs() { this->dataTypeInput->setCurrentText(FocusedRegionItem::dataTypeOptionsByName.at("other").text); } } + + switch (region.endianness) { + case Targets::TargetMemoryEndianness::LITTLE: { + this->endiannessInput->setCurrentText(FocusedRegionItem::endiannessOptionsByName.at("little").text); + break; + } + case Targets::TargetMemoryEndianness::BIG: { + this->endiannessInput->setCurrentText(FocusedRegionItem::endiannessOptionsByName.at("big").text); + break; + } + } } diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/FocusedRegionItem.hpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/FocusedRegionItem.hpp index 719a608e..264af851 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/FocusedRegionItem.hpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/FocusedRegionItem.hpp @@ -14,6 +14,15 @@ namespace Bloom::Widgets : text(text), dataType(dataType) {}; }; + struct EndiannessOption + { + QString text; + Targets::TargetMemoryEndianness endianness = Targets::TargetMemoryEndianness::LITTLE; + + EndiannessOption(const QString& text, Targets::TargetMemoryEndianness endianness) + : text(text), endianness(endianness) {}; + }; + class FocusedRegionItem: public RegionItem { Q_OBJECT @@ -37,6 +46,7 @@ namespace Bloom::Widgets private: FocusedMemoryRegion memoryRegion; QComboBox* dataTypeInput = nullptr; + QComboBox* endiannessInput = nullptr; static inline const std::map dataTypeOptionsByName = std::map< QString, DataTypeOption @@ -45,6 +55,13 @@ namespace Bloom::Widgets {"unsigned_integer", DataTypeOption("Unsigned Integer", MemoryRegionDataType::UNSIGNED_INTEGER)}, {"signed_integer", DataTypeOption("Signed Integer", MemoryRegionDataType::SIGNED_INTEGER)}, {"ascii", DataTypeOption("ASCII String", MemoryRegionDataType::ASCII_STRING)}, - }); + }); + + static inline const std::map endiannessOptionsByName = std::map< + QString, EndiannessOption + >({ + {"little", EndiannessOption("Little-endian", Targets::TargetMemoryEndianness::LITTLE)}, + {"big", EndiannessOption("Big-endian", Targets::TargetMemoryEndianness::BIG)}, + }); }; } diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/MemoryRegionManagerWindow.cpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/MemoryRegionManagerWindow.cpp index 70bd1c2e..4634df77 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/MemoryRegionManagerWindow.cpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/MemoryRegionManagerWindow.cpp @@ -56,7 +56,7 @@ MemoryRegionManagerWindow::MemoryRegionManagerWindow( } this->setStyleSheet(windowStylesheet.readAll()); - this->setFixedSize(QSize(860, 470)); + this->setFixedSize(QSize(900, 520)); auto uiLoader = UiLoader(this); this->container = uiLoader.load(&windowUiFile, this); diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/Stylesheets/MemoryRegionManagerWindow.qss b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/Stylesheets/MemoryRegionManagerWindow.qss index 3ae7f3d5..2e7e8d55 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/Stylesheets/MemoryRegionManagerWindow.qss +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/Stylesheets/MemoryRegionManagerWindow.qss @@ -109,6 +109,12 @@ max-width: 30px; } +#form-container #data-type-label, +#form-container #endianness-label { + min-width: 75px; + max-width: 75px; +} + #form-container #address-range-description-label, #form-container #value-annotations-description-label, #form-container #integer-width-notice-label { diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/UiFiles/FocusedMemoryRegionForm.ui b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/UiFiles/FocusedMemoryRegionForm.ui index fa60bff5..efa180f8 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/UiFiles/FocusedMemoryRegionForm.ui +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/UiFiles/FocusedMemoryRegionForm.ui @@ -379,7 +379,7 @@ true - Specifying the type of data stored in this region will allow Bloom to present the current value of the data, in the form of a value annotation. + Specifying the type and endianness of the data stored in this region will allow Bloom to present the current value, in the form of a value annotation. @@ -395,6 +395,31 @@ + + + + + + + true + + + Maximum width for integer data types: 64 bits + + + + + + + + 10 + + + + QSizePolicy::Fixed + + + @@ -459,17 +484,55 @@ - - - - - - true - - - Maximum width for integer data types: 64 bits - - + + + + + + + + Endianness: + + + + + + + + 20 + + + + QSizePolicy::Fixed + + + + + + + + + + 150 + + + false + + + + + + + + 10 + + + + QSizePolicy::Fixed + + + + diff --git a/src/ProjectSettings.cpp b/src/ProjectSettings.cpp index da7f89c4..5ce06638 100644 --- a/src/ProjectSettings.cpp +++ b/src/ProjectSettings.cpp @@ -122,6 +122,14 @@ InsightProjectSettings::InsightProjectSettings(const QJsonObject& jsonObject) { region.dataType = dataType.value(); } + const auto endianness = InsightProjectSettings::regionEndiannessByName.valueAt( + regionObj.find("endianness")->toString() + ); + + if (endianness.has_value()) { + region.endianness = endianness.value(); + } + inspectionPaneSettings.focusedMemoryRegions.emplace_back(region); } } @@ -202,11 +210,13 @@ QJsonObject InsightProjectSettings::toJson() const { })); const auto& regionDataTypesByName = InsightProjectSettings::regionDataTypesByName; + const auto& regionEndiannessByName = InsightProjectSettings::regionEndiannessByName; const auto& addressRangeInputTypesByName = InsightProjectSettings::addressRangeInputTypesByName; auto focusedRegions = QJsonArray(); for (const auto& focusedRegion : inspectionPaneSettings.focusedMemoryRegions) { if (!regionDataTypesByName.contains(focusedRegion.dataType) + || !regionEndiannessByName.contains(focusedRegion.endianness) || !addressRangeInputTypesByName.contains(focusedRegion.addressRangeInputType) ) { continue; @@ -223,6 +233,7 @@ QJsonObject InsightProjectSettings::toJson() const { {"createdTimestamp", focusedRegion.createdDate.toSecsSinceEpoch()}, {"addressInputType", addressRangeInputTypesByName.at(focusedRegion.addressRangeInputType)}, {"dataType", regionDataTypesByName.at(focusedRegion.dataType)}, + {"endianness", regionEndiannessByName.at(focusedRegion.endianness)}, }); focusedRegions.push_back(regionObj); diff --git a/src/ProjectSettings.hpp b/src/ProjectSettings.hpp index 8c55faac..2d4f840c 100644 --- a/src/ProjectSettings.hpp +++ b/src/ProjectSettings.hpp @@ -42,6 +42,11 @@ namespace Bloom {MemoryRegionDataType::ASCII_STRING, "ascii_string"}, }; + static const inline BiMap regionEndiannessByName = { + {Targets::TargetMemoryEndianness::LITTLE, "little"}, + {Targets::TargetMemoryEndianness::BIG, "big"}, + }; + static const inline BiMap addressRangeInputTypesByName = { {MemoryRegionAddressInputType::ABSOLUTE, "absolute"}, {MemoryRegionAddressInputType::RELATIVE, "relative"}, diff --git a/src/Targets/TargetMemory.hpp b/src/Targets/TargetMemory.hpp index a49cb3fd..51a11171 100644 --- a/src/Targets/TargetMemory.hpp +++ b/src/Targets/TargetMemory.hpp @@ -5,6 +5,12 @@ namespace Bloom::Targets { + enum class TargetMemoryEndianness: std::uint8_t + { + BIG, + LITTLE, + }; + enum class TargetMemoryType: std::uint8_t { FLASH,