diff --git a/src/Targets/Microchip/AVR8/Avr8.cpp b/src/Targets/Microchip/AVR8/Avr8.cpp index 00e364b5..5945dd85 100644 --- a/src/Targets/Microchip/AVR8/Avr8.cpp +++ b/src/Targets/Microchip/AVR8/Avr8.cpp @@ -268,7 +268,7 @@ namespace Targets::Microchip::Avr8 this->targetDescriptionFile.targetPeripheralDescriptorsByKey(), this->targetDescriptionFile.targetPadDescriptorsByKey(), this->targetDescriptionFile.targetPinoutDescriptorsByKey(), - this->targetDescriptionFile.targetVariantDescriptors(), + this->targetDescriptionFile.targetVariantDescriptorsByKey(), this->getBreakpointResources() }; diff --git a/src/Targets/RiscV/RiscV.cpp b/src/Targets/RiscV/RiscV.cpp index 555f2487..549e00ad 100644 --- a/src/Targets/RiscV/RiscV.cpp +++ b/src/Targets/RiscV/RiscV.cpp @@ -91,7 +91,7 @@ namespace Targets::RiscV this->targetDescriptionFile.targetPeripheralDescriptorsByKey(), this->targetDescriptionFile.targetPadDescriptorsByKey(), this->targetDescriptionFile.targetPinoutDescriptorsByKey(), - this->targetDescriptionFile.targetVariantDescriptors(), + this->targetDescriptionFile.targetVariantDescriptorsByKey(), {} // TODO: populate this }; diff --git a/src/Targets/TargetDescription/TargetDescriptionFile.cpp b/src/Targets/TargetDescription/TargetDescriptionFile.cpp index 192e3017..2314e27b 100644 --- a/src/Targets/TargetDescription/TargetDescriptionFile.cpp +++ b/src/Targets/TargetDescription/TargetDescriptionFile.cpp @@ -348,11 +348,14 @@ namespace Targets::TargetDescription return output; } - std::vector TargetDescriptionFile::targetVariantDescriptors() const { - auto output = std::vector{}; + std::map TargetDescriptionFile::targetVariantDescriptorsByKey() const { + auto output = std::map{}; - for (const auto& variant : this->variants) { - output.emplace_back(TargetDescriptionFile::targetVariantDescriptorFromVariant(variant)); + for (const auto& [key, variant] : this->variantsByKey) { + output.emplace( + key, + TargetDescriptionFile::targetVariantDescriptorFromVariant(variant) + ); } return output; @@ -474,7 +477,8 @@ namespace Targets::TargetDescription !element.isNull(); element = element.nextSiblingElement("variant") ) { - this->variants.emplace_back(TargetDescriptionFile::variantFromXml(element)); + auto variant = TargetDescriptionFile::variantFromXml(element); + this->variantsByKey.emplace(variant.key, std::move(variant)); } } @@ -920,6 +924,7 @@ namespace Targets::TargetDescription Variant TargetDescriptionFile::variantFromXml(const QDomElement& xmlElement) { return { + TargetDescriptionFile::getAttribute(xmlElement, "key"), TargetDescriptionFile::getAttribute(xmlElement, "name"), TargetDescriptionFile::getAttribute(xmlElement, "pinout-key") }; @@ -1190,6 +1195,7 @@ namespace Targets::TargetDescription TargetVariantDescriptor TargetDescriptionFile::targetVariantDescriptorFromVariant(const Variant& variant) { return { + variant.key, variant.name, variant.pinoutKey }; diff --git a/src/Targets/TargetDescription/TargetDescriptionFile.hpp b/src/Targets/TargetDescription/TargetDescriptionFile.hpp index 6a877bf7..c88865f1 100644 --- a/src/Targets/TargetDescription/TargetDescriptionFile.hpp +++ b/src/Targets/TargetDescription/TargetDescriptionFile.hpp @@ -153,7 +153,7 @@ namespace Targets::TargetDescription [[nodiscard]] std::map targetPeripheralDescriptorsByKey() const; [[nodiscard]] std::map targetPadDescriptorsByKey() const; [[nodiscard]] std::map targetPinoutDescriptorsByKey() const; - [[nodiscard]] std::vector targetVariantDescriptors() const; + [[nodiscard]] std::map targetVariantDescriptorsByKey() const; [[nodiscard]] std::vector gpioPortPeripheralDescriptors() const; protected: @@ -165,7 +165,7 @@ namespace Targets::TargetDescription std::map> peripheralsByKey; std::map> padsByKey; std::map> pinoutsByKey; - std::vector variants; + std::map> variantsByKey; TargetDescriptionFile() = default; virtual ~TargetDescriptionFile() = default; diff --git a/src/Targets/TargetDescription/Variant.hpp b/src/Targets/TargetDescription/Variant.hpp index d2abe2af..268aba7a 100644 --- a/src/Targets/TargetDescription/Variant.hpp +++ b/src/Targets/TargetDescription/Variant.hpp @@ -6,14 +6,17 @@ namespace Targets::TargetDescription { struct Variant { + std::string key; std::string name; std::string pinoutKey; Variant( + const std::string& key, const std::string& name, const std::string& pinoutKey ) - : name(name) + : key(key) + , name(name) , pinoutKey(pinoutKey) {} }; diff --git a/src/Targets/TargetDescriptor.cpp b/src/Targets/TargetDescriptor.cpp index b720e0b3..15b119a3 100644 --- a/src/Targets/TargetDescriptor.cpp +++ b/src/Targets/TargetDescriptor.cpp @@ -15,7 +15,7 @@ namespace Targets std::map&& peripheralDescriptorsByKey, std::map&& padDescriptorsByKey, std::map&& pinoutDescriptorsByKey, - std::vector&& variantDescriptors, + std::map&& variantDescriptorsByKey, const BreakpointResources& breakpointResources ) : name(name) @@ -26,7 +26,7 @@ namespace Targets , peripheralDescriptorsByKey(std::move(peripheralDescriptorsByKey)) , padDescriptorsByKey(std::move(padDescriptorsByKey)) , pinoutDescriptorsByKey(std::move(pinoutDescriptorsByKey)) - , variantDescriptors(std::move(variantDescriptors)) + , variantDescriptorsByKey(std::move(variantDescriptorsByKey)) , breakpointResources(breakpointResources) {} @@ -141,4 +141,28 @@ namespace Targets return descriptor->get(); } + + std::optional< + std::reference_wrapper + > TargetDescriptor::tryGetVariantDescriptor(const std::string& key) const { + const auto descriptorIt = this->variantDescriptorsByKey.find(key); + + if (descriptorIt == this->variantDescriptorsByKey.end()) { + return std::nullopt; + } + + return std::cref(descriptorIt->second); + } + + const TargetVariantDescriptor& TargetDescriptor::getVariantDescriptor(const std::string& key) const { + const auto descriptor = this->tryGetVariantDescriptor(key); + if (!descriptor.has_value()) { + throw Exceptions::InternalFatalErrorException{ + "Failed to get pinout descriptor \"" + std::string{key} + + "\" from target descriptor - descriptor not found" + }; + } + + return descriptor->get(); + } } diff --git a/src/Targets/TargetDescriptor.hpp b/src/Targets/TargetDescriptor.hpp index 5e245970..d5a4418a 100644 --- a/src/Targets/TargetDescriptor.hpp +++ b/src/Targets/TargetDescriptor.hpp @@ -28,7 +28,7 @@ namespace Targets std::map peripheralDescriptorsByKey; std::map padDescriptorsByKey; std::map pinoutDescriptorsByKey; - std::vector variantDescriptors; + std::map variantDescriptorsByKey; BreakpointResources breakpointResources; TargetDescriptor( @@ -40,7 +40,7 @@ namespace Targets std::map&& peripheralDescriptorsByKey, std::map&& padDescriptorsByKey, std::map&& pinoutDescriptorsByKey, - std::vector&& variantDescriptors, + std::map&& variantDescriptorsByKey, const BreakpointResources& breakpointResources ); @@ -85,5 +85,11 @@ namespace Targets ) const; const TargetPinoutDescriptor& getPinoutDescriptor(const std::string& key) const; + + std::optional> tryGetVariantDescriptor( + const std::string& key + ) const; + + const TargetVariantDescriptor& getVariantDescriptor(const std::string& key) const; }; } diff --git a/src/Targets/TargetVariantDescriptor.cpp b/src/Targets/TargetVariantDescriptor.cpp index ffd08004..f28a1dc7 100644 --- a/src/Targets/TargetVariantDescriptor.cpp +++ b/src/Targets/TargetVariantDescriptor.cpp @@ -5,10 +5,12 @@ namespace Targets { TargetVariantDescriptor::TargetVariantDescriptor( + const std::string& key, const std::string& name, const std::string& pinoutKey ) - : name(name) + : key(key) + , name(name) , pinoutKey(pinoutKey) {} } diff --git a/src/Targets/TargetVariantDescriptor.hpp b/src/Targets/TargetVariantDescriptor.hpp index e87b138f..8363f7f3 100644 --- a/src/Targets/TargetVariantDescriptor.hpp +++ b/src/Targets/TargetVariantDescriptor.hpp @@ -7,10 +7,12 @@ namespace Targets struct TargetVariantDescriptor { public: + const std::string key; std::string name; std::string pinoutKey; TargetVariantDescriptor( + const std::string& key, const std::string& name, const std::string& pinoutKey ); @@ -19,6 +21,5 @@ namespace Targets TargetVariantDescriptor& operator = (const TargetVariantDescriptor& other) = delete; TargetVariantDescriptor(TargetVariantDescriptor&& other) noexcept = default; - TargetVariantDescriptor& operator = (TargetVariantDescriptor&& other) noexcept = default; }; }