diff --git a/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.cpp b/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.cpp index 878b2c4da9eaebe2a1ad8216209557296de4a113..7d5db2ec6d4fdf8af417d6ad56fe07adc38fcb7d 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 8d03ff8387a6a4c43e8ce0add837249e53be4301..1c1c3b18fab8bf7d37f02252fd8e2693f2e32263 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 9631e1bbc568421b78223318d1c9901e4b746c62..beb75ddf2593ac4162ca9bb2d9244eb414c2f805 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())