Lots of tidying
- Removed generic `avr8` target - Simplified AVR8 target construction - Introduced register descriptor IDs - Simplified GDB register mappings - Simplified target interface contract - Other bits of tidying
This commit is contained in:
@@ -36,13 +36,15 @@ namespace Bloom
|
||||
InsightWindow::InsightWindow(
|
||||
const EnvironmentConfig& environmentConfig,
|
||||
const InsightConfig& insightConfig,
|
||||
InsightProjectSettings& insightProjectSettings
|
||||
InsightProjectSettings& insightProjectSettings,
|
||||
const Targets::TargetDescriptor& targetDescriptor
|
||||
)
|
||||
: QMainWindow(nullptr)
|
||||
, environmentConfig(environmentConfig)
|
||||
, targetConfig(environmentConfig.targetConfig)
|
||||
, insightConfig(insightConfig)
|
||||
, insightProjectSettings(insightProjectSettings)
|
||||
, targetDescriptor(targetDescriptor)
|
||||
{
|
||||
this->setObjectName("main-window");
|
||||
this->setWindowTitle("Bloom Insight");
|
||||
|
||||
@@ -34,7 +34,8 @@ namespace Bloom
|
||||
InsightWindow(
|
||||
const EnvironmentConfig& environmentConfig,
|
||||
const InsightConfig& insightConfig,
|
||||
InsightProjectSettings& insightProjectSettings
|
||||
InsightProjectSettings& insightProjectSettings,
|
||||
const Targets::TargetDescriptor& targetDescriptor
|
||||
);
|
||||
|
||||
void setEnvironmentConfig(const EnvironmentConfig& environmentConfig) {
|
||||
|
||||
@@ -140,7 +140,7 @@ namespace Bloom::Widgets
|
||||
const QDateTime& changeDate
|
||||
) {
|
||||
for (const auto& targetRegister : targetRegisters) {
|
||||
if (targetRegister.descriptor == this->registerDescriptor) {
|
||||
if (targetRegister.descriptorId == this->registerDescriptor.id) {
|
||||
this->addItem(targetRegister.value, changeDate);
|
||||
this->updateCurrentItemValue(targetRegister.value);
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ namespace Bloom::Widgets
|
||||
QString::fromStdString(this->registerDescriptor.description.value_or(""))
|
||||
);
|
||||
|
||||
if (!this->registerDescriptor.writable) {
|
||||
if (!this->registerDescriptor.access.writable) {
|
||||
this->registerValueTextInput->setDisabled(true);
|
||||
this->applyButton->setVisible(false);
|
||||
|
||||
@@ -146,7 +146,7 @@ namespace Bloom::Widgets
|
||||
auto* bitsetWidget = new BitsetWidget(
|
||||
byteNumber,
|
||||
this->registerValue.at(registerByteIndex),
|
||||
!this->registerDescriptor.writable,
|
||||
!this->registerDescriptor.access.writable,
|
||||
this
|
||||
);
|
||||
|
||||
@@ -273,7 +273,7 @@ namespace Bloom::Widgets
|
||||
this->registerValueBitsetWidgetContainer->setDisabled(false);
|
||||
this->refreshValueButton->setDisabled(false);
|
||||
|
||||
if (this->registerDescriptor.writable) {
|
||||
if (this->registerDescriptor.access.writable) {
|
||||
this->registerValueTextInput->setDisabled(false);
|
||||
this->applyButton->setDisabled(false);
|
||||
}
|
||||
@@ -319,7 +319,7 @@ namespace Bloom::Widgets
|
||||
void TargetRegisterInspectorWindow::refreshRegisterValue() {
|
||||
this->registerValueContainer->setDisabled(true);
|
||||
const auto readTargetRegisterTask = QSharedPointer<ReadTargetRegisters>(
|
||||
new ReadTargetRegisters({this->registerDescriptor}),
|
||||
new ReadTargetRegisters({this->registerDescriptor.id}),
|
||||
&QObject::deleteLater
|
||||
);
|
||||
|
||||
@@ -331,7 +331,7 @@ namespace Bloom::Widgets
|
||||
this->registerValueContainer->setDisabled(false);
|
||||
|
||||
for (const auto& targetRegister : targetRegisters) {
|
||||
if (targetRegister.descriptor == this->registerDescriptor) {
|
||||
if (targetRegister.descriptorId == this->registerDescriptor.id) {
|
||||
this->setValue(targetRegister.value);
|
||||
}
|
||||
}
|
||||
@@ -353,7 +353,7 @@ namespace Bloom::Widgets
|
||||
void TargetRegisterInspectorWindow::applyChanges() {
|
||||
this->registerValueContainer->setDisabled(true);
|
||||
const auto targetRegister = Targets::TargetRegister(
|
||||
this->registerDescriptor,
|
||||
this->registerDescriptor.id,
|
||||
this->registerValue
|
||||
);
|
||||
const auto writeRegisterTask = QSharedPointer<WriteTargetRegister>(
|
||||
|
||||
@@ -15,7 +15,7 @@ namespace Bloom::Widgets
|
||||
RegisterGroupItem::RegisterGroupItem(
|
||||
QString name,
|
||||
const std::set<Targets::TargetRegisterDescriptor>& registerDescriptors,
|
||||
std::unordered_map<Targets::TargetRegisterDescriptor, RegisterItem*>& registerItemsByDescriptor
|
||||
std::unordered_map<Targets::TargetRegisterDescriptorId, RegisterItem*>& registerItemsByDescriptorIds
|
||||
)
|
||||
: groupName(name)
|
||||
{
|
||||
@@ -25,7 +25,7 @@ namespace Bloom::Widgets
|
||||
registerItem->setVisible(this->isExpanded());
|
||||
|
||||
this->registerItems.push_back(registerItem);
|
||||
registerItemsByDescriptor.insert(std::pair(registerDescriptor, registerItem));
|
||||
registerItemsByDescriptorIds.insert(std::pair(registerDescriptor.id, registerItem));
|
||||
}
|
||||
|
||||
if (!RegisterGroupItem::registerGroupIconPixmap.has_value()) {
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace Bloom::Widgets
|
||||
explicit RegisterGroupItem(
|
||||
QString name,
|
||||
const std::set<Targets::TargetRegisterDescriptor>& registerDescriptors,
|
||||
std::unordered_map<Targets::TargetRegisterDescriptor, RegisterItem*>& registerItemsByDescriptor
|
||||
std::unordered_map<Targets::TargetRegisterDescriptorId, RegisterItem*>& registerItemsByDescriptorIds
|
||||
);
|
||||
|
||||
bool isExpanded() const {
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <QClipboard>
|
||||
#include <QApplication>
|
||||
#include <set>
|
||||
#include <algorithm>
|
||||
|
||||
#include "src/Insight/UserInterfaces/InsightWindow/UiLoader.hpp"
|
||||
#include "src/Insight/InsightSignals.hpp"
|
||||
@@ -72,36 +73,36 @@ namespace Bloom::Widgets
|
||||
this->filterRegisters(this->searchInput->text());
|
||||
});
|
||||
|
||||
const auto& registerDescriptors = targetDescriptor.registerDescriptorsByType;
|
||||
const auto& registerDescriptors = targetDescriptor.registerDescriptorsById;
|
||||
|
||||
auto registerDescriptorsByGroupName = std::map<QString, std::set<TargetRegisterDescriptor>>({
|
||||
{
|
||||
"CPU General Purpose",
|
||||
std::set<TargetRegisterDescriptor>(
|
||||
registerDescriptors.at(TargetRegisterType::GENERAL_PURPOSE_REGISTER).begin(),
|
||||
registerDescriptors.at(TargetRegisterType::GENERAL_PURPOSE_REGISTER).end()
|
||||
)
|
||||
auto registerDescriptorsByGroupName = std::map<QString, std::set<TargetRegisterDescriptor>>();
|
||||
|
||||
for (const auto& [descriptorId, descriptor] : registerDescriptors) {
|
||||
if (
|
||||
descriptor.type != TargetRegisterType::GENERAL_PURPOSE_REGISTER
|
||||
&& descriptor.type != TargetRegisterType::PORT_REGISTER
|
||||
&& descriptor.type != TargetRegisterType::OTHER
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
});
|
||||
|
||||
for (const auto& registerDescriptor : registerDescriptors.at(TargetRegisterType::OTHER)) {
|
||||
const auto groupName = QString::fromStdString(registerDescriptor.groupName.value_or("other")).toUpper();
|
||||
registerDescriptorsByGroupName[groupName].insert(registerDescriptor);
|
||||
}
|
||||
const auto groupName = descriptor.type == TargetRegisterType::GENERAL_PURPOSE_REGISTER
|
||||
? "CPU General Purpose"
|
||||
: QString::fromStdString(descriptor.groupName.value_or("other")).toUpper();
|
||||
|
||||
registerDescriptorsByGroupName[groupName].insert(descriptor);
|
||||
this->registerDescriptors.insert(descriptor);
|
||||
|
||||
for (const auto& registerDescriptor : registerDescriptors.at(TargetRegisterType::PORT_REGISTER)) {
|
||||
const auto groupName = QString::fromStdString(registerDescriptor.groupName.value_or("other")).toUpper();
|
||||
registerDescriptorsByGroupName[groupName].insert(registerDescriptor);
|
||||
}
|
||||
|
||||
for (const auto& [groupName, registerDescriptors] : registerDescriptorsByGroupName) {
|
||||
this->registerGroupItems.emplace_back(new RegisterGroupItem(
|
||||
groupName,
|
||||
registerDescriptors,
|
||||
this->registerItemsByDescriptor
|
||||
));
|
||||
|
||||
this->registerDescriptors.insert(registerDescriptors.begin(), registerDescriptors.end());
|
||||
this->registerGroupItems.emplace_back(
|
||||
new RegisterGroupItem(
|
||||
groupName,
|
||||
registerDescriptors,
|
||||
this->registerItemsByDescriptorId
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
this->registerListView = new ListView(
|
||||
@@ -144,7 +145,7 @@ namespace Bloom::Widgets
|
||||
this,
|
||||
[this] {
|
||||
if (this->contextMenuRegisterItem != nullptr) {
|
||||
this->refreshRegisterValues(this->contextMenuRegisterItem->registerDescriptor, std::nullopt);
|
||||
this->refreshRegisterValues(this->contextMenuRegisterItem->registerDescriptor.id, std::nullopt);
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -259,19 +260,31 @@ namespace Bloom::Widgets
|
||||
}
|
||||
|
||||
void TargetRegistersPaneWidget::refreshRegisterValues(
|
||||
std::optional<Targets::TargetRegisterDescriptor> registerDescriptor,
|
||||
std::optional<Targets::TargetRegisterDescriptorId> registerDescriptorId,
|
||||
std::optional<std::function<void(void)>> callback
|
||||
) {
|
||||
if (!registerDescriptor.has_value() && this->registerDescriptors.empty()) {
|
||||
if (!registerDescriptorId.has_value() && this->registerDescriptors.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto descriptorIds = Targets::TargetRegisterDescriptorIds();
|
||||
|
||||
if (registerDescriptorId.has_value()) {
|
||||
descriptorIds.insert(*registerDescriptorId);
|
||||
|
||||
} else {
|
||||
std::transform(
|
||||
this->registerDescriptors.begin(),
|
||||
this->registerDescriptors.end(),
|
||||
std::inserter(descriptorIds, descriptorIds.end()),
|
||||
[] (const Targets::TargetRegisterDescriptor& descriptor) {
|
||||
return descriptor.id;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
const auto readRegisterTask = QSharedPointer<ReadTargetRegisters>(
|
||||
new ReadTargetRegisters(
|
||||
registerDescriptor.has_value()
|
||||
? Targets::TargetRegisterDescriptors({*registerDescriptor})
|
||||
: this->registerDescriptors
|
||||
),
|
||||
new ReadTargetRegisters(descriptorIds),
|
||||
&QObject::deleteLater
|
||||
);
|
||||
|
||||
@@ -353,7 +366,7 @@ namespace Bloom::Widgets
|
||||
|
||||
const auto targetStopped = this->targetState == Targets::TargetState::STOPPED;
|
||||
const auto targetStoppedAndValuePresent = targetStopped
|
||||
&& this->currentRegisterValues.contains(this->contextMenuRegisterItem->registerDescriptor);
|
||||
&& this->currentRegisterValuesByDescriptorId.contains(this->contextMenuRegisterItem->registerDescriptor.id);
|
||||
|
||||
this->refreshValueAction->setEnabled(targetStopped);
|
||||
this->copyValueDecimalAction->setEnabled(targetStoppedAndValuePresent);
|
||||
@@ -377,27 +390,26 @@ namespace Bloom::Widgets
|
||||
|
||||
void TargetRegistersPaneWidget::onRegistersRead(const Targets::TargetRegisters& registers) {
|
||||
for (const auto& targetRegister : registers) {
|
||||
const auto& descriptor = targetRegister.descriptor;
|
||||
const auto& previousValueIt = this->currentRegisterValues.find(descriptor);
|
||||
const auto& registerItemIt = this->registerItemsByDescriptor.find(descriptor);
|
||||
const auto& previousValueIt = this->currentRegisterValuesByDescriptorId.find(targetRegister.descriptorId);
|
||||
const auto& registerItemIt = this->registerItemsByDescriptorId.find(targetRegister.descriptorId);
|
||||
|
||||
if (registerItemIt != this->registerItemsByDescriptor.end()) {
|
||||
if (registerItemIt != this->registerItemsByDescriptorId.end()) {
|
||||
auto& registerItem = registerItemIt->second;
|
||||
|
||||
registerItem->setValue(targetRegister.value);
|
||||
registerItem->valueChanged = previousValueIt != this->currentRegisterValues.end()
|
||||
registerItem->valueChanged = previousValueIt != this->currentRegisterValuesByDescriptorId.end()
|
||||
? previousValueIt->second != targetRegister.value
|
||||
: false;
|
||||
}
|
||||
|
||||
this->currentRegisterValues[descriptor] = targetRegister.value;
|
||||
this->currentRegisterValuesByDescriptorId[targetRegister.descriptorId] = targetRegister.value;
|
||||
}
|
||||
|
||||
this->registerListScene->update();
|
||||
}
|
||||
|
||||
void TargetRegistersPaneWidget::clearInlineRegisterValues() {
|
||||
for (auto& [registerDescriptor, registerItem] : this->registerItemsByDescriptor) {
|
||||
for (auto& [registerDescriptorId, registerItem] : this->registerItemsByDescriptorId) {
|
||||
registerItem->clearValue();
|
||||
}
|
||||
|
||||
@@ -411,10 +423,10 @@ namespace Bloom::Widgets
|
||||
|
||||
TargetRegisterInspectorWindow* inspectionWindow = nullptr;
|
||||
|
||||
const auto& currentValueIt = this->currentRegisterValues.find(registerDescriptor);
|
||||
const auto& inspectionWindowIt = this->inspectionWindowsByDescriptor.find(registerDescriptor);
|
||||
const auto& currentValueIt = this->currentRegisterValuesByDescriptorId.find(registerDescriptor.id);
|
||||
const auto& inspectionWindowIt = this->inspectionWindowsByDescriptorId.find(registerDescriptor.id);
|
||||
|
||||
if (inspectionWindowIt != this->inspectionWindowsByDescriptor.end()) {
|
||||
if (inspectionWindowIt != this->inspectionWindowsByDescriptorId.end()) {
|
||||
inspectionWindow = inspectionWindowIt->second;
|
||||
|
||||
} else {
|
||||
@@ -424,13 +436,13 @@ namespace Bloom::Widgets
|
||||
this
|
||||
);
|
||||
|
||||
this->inspectionWindowsByDescriptor.insert(std::pair(
|
||||
registerDescriptor,
|
||||
this->inspectionWindowsByDescriptorId.insert(std::pair(
|
||||
registerDescriptor.id,
|
||||
inspectionWindow
|
||||
));
|
||||
}
|
||||
|
||||
if (currentValueIt != this->currentRegisterValues.end()) {
|
||||
if (currentValueIt != this->currentRegisterValuesByDescriptorId.end()) {
|
||||
inspectionWindow->setValue(currentValueIt->second);
|
||||
}
|
||||
|
||||
@@ -443,9 +455,9 @@ namespace Bloom::Widgets
|
||||
}
|
||||
|
||||
void TargetRegistersPaneWidget::copyRegisterValueHex(const TargetRegisterDescriptor& registerDescriptor) {
|
||||
const auto& valueIt = this->currentRegisterValues.find(registerDescriptor);
|
||||
const auto& valueIt = this->currentRegisterValuesByDescriptorId.find(registerDescriptor.id);
|
||||
|
||||
if (valueIt == this->currentRegisterValues.end()) {
|
||||
if (valueIt == this->currentRegisterValuesByDescriptorId.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -459,9 +471,9 @@ namespace Bloom::Widgets
|
||||
}
|
||||
|
||||
void TargetRegistersPaneWidget::copyRegisterValueDecimal(const TargetRegisterDescriptor& registerDescriptor) {
|
||||
const auto& valueIt = this->currentRegisterValues.find(registerDescriptor);
|
||||
const auto& valueIt = this->currentRegisterValuesByDescriptorId.find(registerDescriptor.id);
|
||||
|
||||
if (valueIt == this->currentRegisterValues.end()) {
|
||||
if (valueIt == this->currentRegisterValuesByDescriptorId.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -475,9 +487,9 @@ namespace Bloom::Widgets
|
||||
}
|
||||
|
||||
void TargetRegistersPaneWidget::copyRegisterValueBinary(const TargetRegisterDescriptor& registerDescriptor) {
|
||||
const auto& valueIt = this->currentRegisterValues.find(registerDescriptor);
|
||||
const auto& valueIt = this->currentRegisterValuesByDescriptorId.find(registerDescriptor.id);
|
||||
|
||||
if (valueIt == this->currentRegisterValues.end()) {
|
||||
if (valueIt == this->currentRegisterValuesByDescriptorId.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace Bloom::Widgets
|
||||
void expandAllRegisterGroups();
|
||||
|
||||
void refreshRegisterValues(
|
||||
std::optional<Targets::TargetRegisterDescriptor> registerDescriptor = std::nullopt,
|
||||
std::optional<Targets::TargetRegisterDescriptorId> registerDescriptorId = std::nullopt,
|
||||
std::optional<std::function<void(void)>> callback = std::nullopt
|
||||
);
|
||||
|
||||
@@ -62,9 +62,9 @@ namespace Bloom::Widgets
|
||||
|
||||
Targets::TargetRegisterDescriptors registerDescriptors;
|
||||
std::vector<RegisterGroupItem*> registerGroupItems;
|
||||
std::unordered_map<Targets::TargetRegisterDescriptor, RegisterItem*> registerItemsByDescriptor;
|
||||
std::unordered_map<Targets::TargetRegisterDescriptor, TargetRegisterInspectorWindow*> inspectionWindowsByDescriptor;
|
||||
std::unordered_map<Targets::TargetRegisterDescriptor, Targets::TargetMemoryBuffer> currentRegisterValues;
|
||||
std::unordered_map<Targets::TargetRegisterDescriptorId, RegisterItem*> registerItemsByDescriptorId;
|
||||
std::unordered_map<Targets::TargetRegisterDescriptorId, TargetRegisterInspectorWindow*> inspectionWindowsByDescriptorId;
|
||||
std::unordered_map<Targets::TargetRegisterDescriptorId, Targets::TargetMemoryBuffer> currentRegisterValuesByDescriptorId;
|
||||
|
||||
Targets::TargetState targetState = Targets::TargetState::UNKNOWN;
|
||||
|
||||
|
||||
@@ -26,13 +26,6 @@ namespace Bloom::Widgets::InsightTargetWidgets
|
||||
&TargetPackageWidget::onTargetStateChanged
|
||||
);
|
||||
|
||||
QObject::connect(
|
||||
insightSignals,
|
||||
&InsightSignals::targetRegistersWritten,
|
||||
this,
|
||||
&TargetPackageWidget::onRegistersWritten
|
||||
);
|
||||
|
||||
QObject::connect(
|
||||
insightSignals,
|
||||
&InsightSignals::programmingModeEnabled,
|
||||
@@ -106,18 +99,4 @@ namespace Bloom::Widgets::InsightTargetWidgets
|
||||
this->setDisabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
void TargetPackageWidget::onRegistersWritten(Targets::TargetRegisters targetRegisters) {
|
||||
if (this->targetState != TargetState::STOPPED) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If a PORT register was just updated, refresh pin states.
|
||||
for (const auto& targetRegister : targetRegisters) {
|
||||
if (targetRegister.descriptor.type == Targets::TargetRegisterType::PORT_REGISTER) {
|
||||
this->refreshPinStates();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +46,5 @@ namespace Bloom::Widgets::InsightTargetWidgets
|
||||
void onTargetStateChanged(Targets::TargetState newState);
|
||||
void onProgrammingModeEnabled();
|
||||
void onProgrammingModeDisabled();
|
||||
void onRegistersWritten(Targets::TargetRegisters targetRegisters);
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user