From 6798220f4efa9b5a1a530e05541aa8f64bb4f7be Mon Sep 17 00:00:00 2001 From: Mirko Waechter <mirko.waechter@kit.edu> Date: Thu, 4 Oct 2018 17:31:01 +0200 Subject: [PATCH] factory fixes --- .../AbstractFunctionalDevice.cpp | 5 ++ .../ArmarXEtherCAT/AbstractFunctionalDevice.h | 5 ++ .../ArmarXEtherCAT/DeviceContainer.cpp | 81 ++++++++++--------- 3 files changed, 55 insertions(+), 36 deletions(-) diff --git a/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.cpp b/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.cpp index 878b2c4da..7d5db2ec6 100644 --- a/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.cpp +++ b/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.cpp @@ -28,6 +28,11 @@ bool armarx::AbstractFunctionalDevice::isInitialized() const return initialized; } +std::string armarx::AbstractFunctionalDevice::getClassName() const +{ + return className; +} + const armarx::DefaultRapidXmlReaderNode armarx::AbstractFunctionalDevice::getNode() const { return node; diff --git a/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.h b/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.h index 8d03ff838..1c1c3b18f 100644 --- a/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.h +++ b/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.h @@ -34,7 +34,12 @@ namespace armarx virtual void execute() {} + std::string getClassName() const; + protected: + template <typename Base, typename constructorArg, typename SharedPointer> + friend class AbstractFactoryMethod; + std::string className; DefaultRapidXmlReaderNode node; bool initialized = false; }; diff --git a/source/RobotAPI/libraries/ArmarXEtherCAT/DeviceContainer.cpp b/source/RobotAPI/libraries/ArmarXEtherCAT/DeviceContainer.cpp index 9631e1bbc..beb75ddf2 100644 --- a/source/RobotAPI/libraries/ArmarXEtherCAT/DeviceContainer.cpp +++ b/source/RobotAPI/libraries/ArmarXEtherCAT/DeviceContainer.cpp @@ -31,50 +31,59 @@ namespace armarx { -size_t DeviceContainer::load(const MultiNodeRapidXMLReader &rootNodeConfigs, const VirtualRobot::RobotPtr &robot) -{ - size_t addedDevices = 0; - auto children = robot->getChildren(); - auto getSceneObject = [&](const std::string & name) + size_t DeviceContainer::load(const MultiNodeRapidXMLReader& rootNodeConfigs, const VirtualRobot::RobotPtr& robot) { - for (auto& obj : children) + size_t addedDevices = 0; + auto children = robot->getRobotNodes(); + auto getSceneObject = [&](const std::string & name) { - if (obj->getName() == name) + for (auto& obj : children) { - return obj; + if (obj->getName() == name) + { + return VirtualRobot::SceneObjectPtr(obj); + } } - } - return VirtualRobot::SceneObjectPtr(); - }; - //rootNode = rootNodeConfig; - - auto defaultNode = DefaultRapidXmlReaderNode(rootNodeConfigs.nodes("DefaultConfiguration")); - for(auto& node : rootNodeConfigs.nodes(nullptr)) - { - if(node.name()=="DefaultConfiguration") - { - continue; - } - auto name = node.attribute_value("name"); - auto obj = getSceneObject(name); - ARMARX_CHECK_EXPRESSION_W_HINT(obj, name); - auto tuple = std::make_tuple(node, defaultNode, obj); - auto instance = VirtualDeviceFactory::fromName(node.name(),tuple); - if(instance) - { - ARMARX_WARNING << "No factory found for virtual device " << node.name(); - } - else + for (auto& s : robot->getSensors()) + { + if (s->getName() == name) + { + return VirtualRobot::SceneObjectPtr(s); + } + } + return VirtualRobot::SceneObjectPtr(); + }; + //rootNode = rootNodeConfig; + ARMARX_DEBUG << "Device factories: " << VirtualDeviceFactory::getAvailableClasses(); + auto defaultNode = DefaultRapidXmlReaderNode(rootNodeConfigs.nodes("DefaultConfiguration")); + for (auto& node : rootNodeConfigs.nodes(nullptr)) { - devices.push_back(instance); - addedDevices++; + if (node.name() == "DefaultConfiguration" || node.name() == "include" || node.name().empty()) + { + continue; + } + auto name = node.attribute_value("name"); + ARMARX_DEBUG << "Handling: " << node.name() << " name: " << name; + auto obj = getSceneObject(name); + // ARMARX_CHECK_EXPRESSION_W_HINT(obj, name); + auto tuple = std::make_tuple(node, defaultNode, obj); + auto instance = VirtualDeviceFactory::fromName(node.name(), tuple); + if (!instance) + { + ARMARX_WARNING << "No factory found for virtual device " << node.name(); + } + else + { + ARMARX_VERBOSE << "Created instance of type " << node.name(); + devices.push_back(instance); + addedDevices++; + } } - } - return addedDevices; + return addedDevices; -} + } -std::vector<AbstractFunctionalDevicePtr> DeviceContainer::getAllInitializedFunctionalDevices() const + std::vector<AbstractFunctionalDevicePtr> DeviceContainer::getAllInitializedFunctionalDevices() const { std::vector<AbstractFunctionalDevicePtr> returnList; for (AbstractFunctionalDevicePtr& device : getAllFunctionalDevices()) -- GitLab