From f33b4d8c70e5aa04d9fe69ae27ceeff846f7a4ec Mon Sep 17 00:00:00 2001 From: Nav Date: Thu, 15 Feb 2024 19:40:22 +0000 Subject: [PATCH] Updated TDF physical interface extraction to align with new TDF format --- src/Targets/TargetDescription/Interface.hpp | 13 ----- .../TargetDescription/PhysicalInterface.hpp | 21 ++++++++ .../TargetDescriptionFile.cpp | 50 +++++++------------ .../TargetDescriptionFile.hpp | 17 ++++--- 4 files changed, 49 insertions(+), 52 deletions(-) delete mode 100644 src/Targets/TargetDescription/Interface.hpp create mode 100644 src/Targets/TargetDescription/PhysicalInterface.hpp diff --git a/src/Targets/TargetDescription/Interface.hpp b/src/Targets/TargetDescription/Interface.hpp deleted file mode 100644 index 6e85c80e..00000000 --- a/src/Targets/TargetDescription/Interface.hpp +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include -#include - -namespace Targets::TargetDescription -{ - struct Interface - { - std::string name; - std::optional type; - }; -} diff --git a/src/Targets/TargetDescription/PhysicalInterface.hpp b/src/Targets/TargetDescription/PhysicalInterface.hpp new file mode 100644 index 00000000..ef7b1140 --- /dev/null +++ b/src/Targets/TargetDescription/PhysicalInterface.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +namespace Targets::TargetDescription +{ + struct PhysicalInterface + { + std::string name; + std::string type; + + PhysicalInterface( + const std::string& name, + const std::string& type + ) + : name(name) + , type(type) + {} + }; +} diff --git a/src/Targets/TargetDescription/TargetDescriptionFile.cpp b/src/Targets/TargetDescription/TargetDescriptionFile.cpp index 9329aa28..7ba926f5 100644 --- a/src/Targets/TargetDescription/TargetDescriptionFile.cpp +++ b/src/Targets/TargetDescription/TargetDescriptionFile.cpp @@ -153,11 +153,21 @@ namespace Targets::TargetDescription ); } + for ( + auto element = deviceElement.firstChildElement("physical-interfaces") + .firstChildElement("physical-interface"); + !element.isNull(); + element = element.nextSiblingElement("physical-interface") + ) { + this->physicalInterfaces.emplace_back( + TargetDescriptionFile::physicalInterfaceFromXml(element) + ); + } + this->loadModules(document); this->loadPeripheralModules(document); this->loadVariants(document); this->loadPinouts(document); - this->loadInterfaces(document); } std::optional TargetDescriptionFile::tryGetAttribute( @@ -324,6 +334,13 @@ namespace Targets::TargetDescription return output; } + PhysicalInterface TargetDescriptionFile::physicalInterfaceFromXml(const QDomElement& xmlElement) { + return PhysicalInterface( + TargetDescriptionFile::getAttribute(xmlElement, "name"), + TargetDescriptionFile::getAttribute(xmlElement, "type") + ); + } + RegisterGroup TargetDescriptionFile::registerGroupFromXml(const QDomElement& xmlElement) { if (!xmlElement.hasAttribute("name")) { throw Exception("Missing register group name attribute"); @@ -650,35 +667,4 @@ namespace Targets::TargetDescription } } } - - void TargetDescriptionFile::loadInterfaces(const QDomDocument& document) { - const auto deviceElement = document.elementsByTagName("device").item(0).toElement(); - - auto interfaceNodes = deviceElement.elementsByTagName("interfaces").item(0).toElement() - .elementsByTagName("interface"); - - for (int interfaceIndex = 0; interfaceIndex < interfaceNodes.count(); interfaceIndex++) { - try { - auto interfaceXml = interfaceNodes.item(interfaceIndex).toElement(); - - if (!interfaceXml.hasAttribute("name")) { - throw Exception("Missing name attribute"); - } - - auto interface = Interface(); - interface.name = interfaceXml.attribute("name").toLower().toStdString(); - - if (interfaceXml.hasAttribute("type")) { - interface.type = interfaceXml.attribute("type").toStdString(); - } - - this->interfacesByName.insert(std::pair(interface.name, interface)); - - } catch (const Exception& exception) { - Logger::debug( - "Failed to extract interface from target description element - " + exception.getMessage() - ); - } - } - } } diff --git a/src/Targets/TargetDescription/TargetDescriptionFile.hpp b/src/Targets/TargetDescription/TargetDescriptionFile.hpp index d240902d..5e9209a4 100644 --- a/src/Targets/TargetDescription/TargetDescriptionFile.hpp +++ b/src/Targets/TargetDescription/TargetDescriptionFile.hpp @@ -13,11 +13,11 @@ #include "AddressSpace.hpp" #include "MemorySegment.hpp" #include "MemorySegmentSection.hpp" +#include "PhysicalInterface.hpp" #include "RegisterGroup.hpp" #include "Module.hpp" #include "Variant.hpp" #include "Pinout.hpp" -#include "Interface.hpp" #include "src/Targets/TargetFamily.hpp" @@ -103,12 +103,12 @@ namespace Targets::TargetDescription std::map deviceAttributesByName; std::map> addressSpacesByKey; std::map> propertyGroupsByKey; + std::vector physicalInterfaces; std::map modulesMappedByName; std::map peripheralModulesMappedByName; std::map> peripheralRegisterGroupsMappedByModuleRegisterGroupName; std::vector variants; std::map pinoutsMappedByName; - std::map interfacesByName; TargetDescriptionFile() = default; virtual ~TargetDescriptionFile() = default; @@ -152,6 +152,14 @@ namespace Targets::TargetDescription */ static MemorySegmentSection memorySegmentSectionFromXml(const QDomElement& xmlElement); + /** + * Constructs a PhysicalInterface from al XML element. + * + * @param xmlElement + * @return + */ + static PhysicalInterface physicalInterfaceFromXml(const QDomElement& xmlElement); + /** * Constructs a RegisterGroup object from an XML element. * @@ -203,10 +211,5 @@ namespace Targets::TargetDescription * Extracts all pinouts and loads them into this->pinoutsMappedByName. */ void loadPinouts(const QDomDocument& document); - - /** - * Extracts all interfaces and loads them into this->interfacesByName - */ - void loadInterfaces(const QDomDocument& document); }; }