diff --git a/source/RobotAPI/components/AronComponentConfigExample/AronComponentConfigExample.cpp b/source/RobotAPI/components/AronComponentConfigExample/AronComponentConfigExample.cpp index 7a3a07e6eeea9b3ab866217b2d1c2973714f4fce..861964b43b538bc339267779255ee1c4b5ffeaa2 100644 --- a/source/RobotAPI/components/AronComponentConfigExample/AronComponentConfigExample.cpp +++ b/source/RobotAPI/components/AronComponentConfigExample/AronComponentConfigExample.cpp @@ -28,43 +28,87 @@ namespace armarx { - void AronComponentConfigExample::onInitComponent() + void + AronComponentConfigExample::onInitComponent() { } - void AronComponentConfigExample::onConnectComponent() + void + AronComponentConfigExample::onConnectComponent() { + remote_gui_plugin_->createOrUpdateTab(aron_component_config_plugin_->buildRemoteGui("Config"), + [this](armarx::RemoteGui::TabProxy& prx) + { + prx.receiveUpdates(); + std::lock_guard lock(write_mutex); + if (aron_component_config_plugin_->updateRemoteGui(prx)) + { + remote_gui_plugin_->createOrUpdateTab("", + aron_component_config_plugin_ + ->buildRemoteGui( + "Config")); + } + prx.sendUpdates(); + }); + periodicTask = new SimplePeriodicTask<>([&, this] + { + std::lock_guard lock(write_mutex); + ARMARX_TRACE; + auto& config = + aron_component_config_plugin_->config_.getWriteBuffer(); + config.intMember--; + aron_component_config_plugin_->config_.commitWrite(); + }, 1000); + periodicTask->start(); } - void AronComponentConfigExample::onDisconnectComponent() + void + AronComponentConfigExample::onDisconnectComponent() { } - void AronComponentConfigExample::onExitComponent() + void + AronComponentConfigExample::onExitComponent() { } - armarx::PropertyDefinitionsPtr AronComponentConfigExample::createPropertyDefinitions() + armarx::PropertyDefinitionsPtr + AronComponentConfigExample::createPropertyDefinitions() { armarx::PropertyDefinitionsPtr defs = new AronComponentConfigExamplePropertyDefinitions(getConfigIdentifier()); - auto& config = getConfigWriteBuffer(); - config.boolMember=true; - config.floatMember=100.0f; - config.intMember=1000; - config.stringMember="initial"; - config.longMember=0; - config.subMember.subsubMember.intListMember.insert(config.subMember.subsubMember.intListMember.end(), { 1, 2, 3, 4, 5, 6 }); - config.subMember.subsubMember.stringListMember.insert(config.subMember.subsubMember.stringListMember.end(), {"a", "b", "c", "d", "e"}); - commitConfigWriteBuffer(); + auto& config = aron_component_config_plugin_->config_.getWriteBuffer(); + config.boolMember = true; + config.floatMember = 100.0f; + config.intMember = 1000; + config.stringMember = "initial"; + config.longMember = 0; + config.subMember + .subsubMember + .intListMember + .insert(config.subMember.subsubMember.intListMember.end(), {1, 2, 3, 4, 5, 6}); + config.subMember + .subsubMember + .stringListMember + .insert(config.subMember.subsubMember.stringListMember.end(), {"a", "b", "c", "d", "e"}); + aron_component_config_plugin_->config_.commitWrite(); return defs; } - std::string AronComponentConfigExample::getDefaultName() const + std::string + AronComponentConfigExample::getDefaultName() const { return "ComponentConfigTest"; } + AronComponentConfigExample::AronComponentConfigExample() + { + addPlugin(remote_gui_plugin_, ""); + addPlugin(aron_component_config_plugin_, ""); + } + AronComponentConfigExamplePropertyDefinitions::AronComponentConfigExamplePropertyDefinitions(std::string prefix) : - armarx::ComponentPropertyDefinitions(std::move(prefix)) {} + armarx::ComponentPropertyDefinitions(std::move(prefix)) + { + } } \ No newline at end of file diff --git a/source/RobotAPI/components/AronComponentConfigExample/AronComponentConfigExample.h b/source/RobotAPI/components/AronComponentConfigExample/AronComponentConfigExample.h index d030e645b4762a8d75a7bcb2deac50bb3bd8ec7d..e466b0a6ae20979766da06f839d31f45b76c3574 100644 --- a/source/RobotAPI/components/AronComponentConfigExample/AronComponentConfigExample.h +++ b/source/RobotAPI/components/AronComponentConfigExample/AronComponentConfigExample.h @@ -37,7 +37,6 @@ namespace armarx }; class AronComponentConfigExample : - virtual public armarx::AronComponentConfigPluginUser<armarx::component_config::aron::TestConfig>, virtual public armarx::Component { public: @@ -58,5 +57,13 @@ namespace armarx /// @see PropertyUser::createPropertyDefinitions() armarx::PropertyDefinitionsPtr createPropertyDefinitions() override; + AronComponentConfigExample(); + private: + SimplePeriodicTask<>::pointer_type periodicTask; + std::experimental::observer_ptr<plugins::RemoteGuiComponentPlugin> remote_gui_plugin_{nullptr}; + std::experimental::observer_ptr<plugins::AronComponentConfigPlugin<armarx::component_config::aron::TestConfig>> + aron_component_config_plugin_{nullptr}; + std::mutex write_mutex; + }; } \ No newline at end of file diff --git a/source/RobotAPI/components/AronComponentConfigExample/aron/ComponentConfig.xml b/source/RobotAPI/components/AronComponentConfigExample/aron/ComponentConfig.xml index e449a761672809f64dc903d108b7f6af13aa3878..56dc87b417ab791fe31e9840fc273aa13f88dfe8 100644 --- a/source/RobotAPI/components/AronComponentConfigExample/aron/ComponentConfig.xml +++ b/source/RobotAPI/components/AronComponentConfigExample/aron/ComponentConfig.xml @@ -39,6 +39,16 @@ <int/> </List> </ObjectChild> + <ObjectChild key='stringDictMember'> + <Dict> + <string/> + </Dict> + </ObjectChild> + <ObjectChild key='intDictMember'> + <Dict> + <int/> + </Dict> + </ObjectChild> </Object> <Object name='armarx::component_config::aron::SubConfig'> diff --git a/source/RobotAPI/libraries/aron_component_config/ComponentPlugin.h b/source/RobotAPI/libraries/aron_component_config/ComponentPlugin.h index 568f6244711d4f0b8be8f778c424f7a6f486c286..ae144f245b15cd28cdf0eee59245d7b9d8a94b28 100644 --- a/source/RobotAPI/libraries/aron_component_config/ComponentPlugin.h +++ b/source/RobotAPI/libraries/aron_component_config/ComponentPlugin.h @@ -86,10 +86,9 @@ namespace armarx::plugins return RemoteGui::makeConfigGui(name, config_.getUpToDateReadBuffer()); } - bool updateRemoteGui(armarx::RemoteGui::TabProxy& prx) + bool updateRemoteGui(armarx::RemoteGui::TabProxy& prx) // prx has to be already updated; otherwise nothing will change { ARMARX_TRACE; - prx.receiveUpdates(); armarx::aron::component_config::GetValueFromMapVisitor vis(&prx); auto& cfg = config_.getWriteBuffer(); auto data = std::static_pointer_cast<armarx::aron::data::Variant>(cfg.toAron()); @@ -107,56 +106,5 @@ namespace armarx::plugins armarx::WriteBufferedTripleBuffer<AronStructT> config_; - }; -} - -namespace armarx -{ - template <typename AronStructT> - requires plugins::isAronGenerated<AronStructT> - class AronComponentConfigPluginUser : virtual public ManagedIceObject - { - public: - void onConnectComponent() override - { - remote_gui_plugin_->createOrUpdateTab(aron_component_config_plugin_->buildRemoteGui("Config"), - [this](armarx::RemoteGui::TabProxy& prx) - { - if (aron_component_config_plugin_->updateRemoteGui(prx)) - { - remote_gui_plugin_->createOrUpdateTab("", - aron_component_config_plugin_ - ->buildRemoteGui( - "Config")); - } - }); - } - - AronComponentConfigPluginUser() - { - addPlugin(remote_gui_plugin_, ""); - addPlugin(aron_component_config_plugin_, ""); - } - - AronStructT& getConfigWriteBuffer() - { - return aron_component_config_plugin_->config_.getWriteBuffer(); - } - - void commitConfigWriteBuffer() - { - aron_component_config_plugin_->config_.commitWrite(); - } - - const AronStructT& getUpToDateConfigReadBuffer() const - { - return aron_component_config_plugin_->config_.getUpToDateReadBuffer(); - } - - private: - std::experimental::observer_ptr<plugins::RemoteGuiComponentPlugin> remote_gui_plugin_{nullptr}; - std::experimental::observer_ptr<plugins::AronComponentConfigPlugin<AronStructT>> - aron_component_config_plugin_{nullptr}; - }; } \ No newline at end of file