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:
Nav
2023-05-21 21:08:25 +01:00
parent 5f8242a87a
commit ba03833325
62 changed files with 1304 additions and 1577 deletions

View File

@@ -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");

View File

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

View File

@@ -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);
}

View File

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

View File

@@ -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()) {

View File

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

View File

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

View File

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

View File

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

View File

@@ -46,6 +46,5 @@ namespace Bloom::Widgets::InsightTargetWidgets
void onTargetStateChanged(Targets::TargetState newState);
void onProgrammingModeEnabled();
void onProgrammingModeDisabled();
void onRegistersWritten(Targets::TargetRegisters targetRegisters);
};
}