From e46e08390807baab41a740143c6324796802e6b2 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Wed, 13 May 2020 10:21:50 +0200
Subject: [PATCH] Add ObjectPoseObserver component

---
 source/RobotAPI/components/CMakeLists.txt     |   1 +
 .../ObjectPoseObserver/CMakeLists.txt         |  34 +++++
 .../ObjectPoseObserver/ObjectPoseObserver.cpp | 118 ++++++++++++++++++
 .../ObjectPoseObserver/ObjectPoseObserver.h   | 109 ++++++++++++++++
 .../components/ObjectPoseObserver/main.cpp    |  32 +++++
 .../ObjectPoseObserver/test/CMakeLists.txt    |   5 +
 .../test/ObjectPoseObserverTest.cpp           |  37 ++++++
 7 files changed, 336 insertions(+)
 create mode 100644 source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt
 create mode 100644 source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp
 create mode 100644 source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h
 create mode 100644 source/RobotAPI/components/ObjectPoseObserver/main.cpp
 create mode 100644 source/RobotAPI/components/ObjectPoseObserver/test/CMakeLists.txt
 create mode 100644 source/RobotAPI/components/ObjectPoseObserver/test/ObjectPoseObserverTest.cpp

diff --git a/source/RobotAPI/components/CMakeLists.txt b/source/RobotAPI/components/CMakeLists.txt
index a001f08c8..e3adea9f2 100644
--- a/source/RobotAPI/components/CMakeLists.txt
+++ b/source/RobotAPI/components/CMakeLists.txt
@@ -13,6 +13,7 @@ add_subdirectory(KITHandUnit)
 add_subdirectory(KITProstheticHandUnit)
 add_subdirectory(MultiHandUnit)
 add_subdirectory(NaturalIKTest)
+add_subdirectory(ObjectPoseObserver)
 add_subdirectory(RobotHealth)
 add_subdirectory(RobotNameService)
 add_subdirectory(RobotState)
diff --git a/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt b/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt
new file mode 100644
index 000000000..0da706a1c
--- /dev/null
+++ b/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt
@@ -0,0 +1,34 @@
+armarx_component_set_name("ObjectPoseObserver")
+
+
+set(COMPONENT_LIBS
+    ArmarXCore ArmarXCoreInterfaces
+    RobotAPIComponentPlugins
+
+    ${PROJECT_NAME}Interfaces
+)
+
+set(SOURCES
+    ObjectPoseObserver.cpp
+)
+set(HEADERS
+    ObjectPoseObserver.h
+)
+
+
+armarx_add_component("${SOURCES}" "${HEADERS}")
+
+#find_package(MyLib QUIET)
+#armarx_build_if(MyLib_FOUND "MyLib not available")
+# all target_include_directories must be guarded by if(Xyz_FOUND)
+# for multiple libraries write: if(X_FOUND AND Y_FOUND)....
+#if(MyLib_FOUND)
+#    target_include_directories(ObjectPoseObserver PUBLIC ${MyLib_INCLUDE_DIRS})
+#endif()
+
+# add unit tests
+add_subdirectory(test)
+
+armarx_component_set_name("ObjectPoseObserverApp")
+set(COMPONENT_LIBS ObjectPoseObserver)
+armarx_add_component_executable(main.cpp)
diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp
new file mode 100644
index 000000000..4bfd62e21
--- /dev/null
+++ b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp
@@ -0,0 +1,118 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::ArmarXObjects::ObjectPoseObserver
+ * @author     Rainer Kartmann ( rainer dot kartmann at kit dot edu )
+ * @date       2020
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#include "ObjectPoseObserver.h"
+
+
+namespace armarx
+{
+    ObjectPoseObserverPropertyDefinitions::ObjectPoseObserverPropertyDefinitions(std::string prefix) :
+        armarx::ObserverPropertyDefinitions(prefix)
+    {
+    }
+
+    armarx::PropertyDefinitionsPtr ObjectPoseObserver::createPropertyDefinitions()
+    {
+        armarx::PropertyDefinitionsPtr defs(new ObjectPoseObserverPropertyDefinitions(getConfigIdentifier()));
+
+        return defs;
+    }
+
+
+    std::string ObjectPoseObserver::getDefaultName() const
+    {
+        return "ObjectPoseObserver";
+    }
+
+    void ObjectPoseObserver::onInitObserver()
+    {
+    }
+
+    void ObjectPoseObserver::onConnectObserver()
+    {
+    }
+
+    void ObjectPoseObserver::onDisconnectComponent()
+    {
+    }
+
+    void ObjectPoseObserver::onExitObserver()
+    {
+    }
+
+
+    void ObjectPoseObserver::reportProviderInfo(const std::string& providerName, const objpose::ProviderInfo& info, const Ice::Current&)
+    {
+
+    }
+
+    void ObjectPoseObserver::reportObjectPoses(const std::string& providerName, const objpose::ObjectPoseSeq& candidates, const Ice::Current&)
+    {
+
+    }
+
+    objpose::InfoMap ObjectPoseObserver::getAvailableProvidersWithInfo(const Ice::Current&)
+    {
+        return {};
+    }
+
+    Ice::StringSeq ObjectPoseObserver::getAvailableProviderNames(const Ice::Current&)
+    {
+        return {};
+    }
+
+    objpose::ProviderInfo ObjectPoseObserver::getProviderInfo(const std::string& providerName, const Ice::Current&)
+    {
+        return {};
+    }
+
+    bool ObjectPoseObserver::hasProvider(const std::string& providerName, const Ice::Current&)
+    {
+        return {};
+    }
+
+    objpose::ObjectPoseSeq ObjectPoseObserver::getObjectPoses(const Ice::Current&)
+    {
+        return {};
+    }
+
+    objpose::ObjectPoseSeq ObjectPoseObserver::getObjectPosesByProvider(const std::string& providerName, const Ice::Current&)
+    {
+        return {};
+    }
+
+    Ice::Int ObjectPoseObserver::getUpdateCounterByProvider(const std::string& providerName, const Ice::Current&)
+    {
+        return {};
+    }
+
+    StringIntDictionary ObjectPoseObserver::getAllUpdateCounters(const Ice::Current&)
+    {
+        return {};
+    }
+
+    bool ObjectPoseObserver::setProviderConfig(const std::string& providerName, const StringVariantBaseMap& config, const Ice::Current&)
+    {
+        return {};
+    }
+
+}
diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h
new file mode 100644
index 000000000..e00b4bc45
--- /dev/null
+++ b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h
@@ -0,0 +1,109 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::ArmarXObjects::ObjectPoseObserver
+ * @author     Rainer Kartmann ( rainer dot kartmann at kit dot edu )
+ * @date       2020
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#pragma once
+
+
+#include <ArmarXCore/observers/Observer.h>
+
+#include <RobotAPI/interface/objectpose/ObjectPoseObserver.h>
+#include <RobotAPI/libraries/RobotAPIComponentPlugins/ArVizComponentPlugin.h>
+
+#define ICE_CURRENT_ARG const Ice::Current& = Ice::emptyCurrent
+
+
+namespace armarx
+{
+    /**
+     * @class ObjectPoseObserverPropertyDefinitions
+     * @brief Property definitions of `ObjectPoseObserver`.
+     */
+    class ObjectPoseObserverPropertyDefinitions :
+            public ObserverPropertyDefinitions
+    {
+    public:
+        ObjectPoseObserverPropertyDefinitions(std::string prefix);
+    };
+
+
+
+    /**
+     * @defgroup Component-ObjectPoseObserver ObjectPoseObserver
+     * @ingroup RobotAPI-Components
+     * A description of the component ObjectPoseObserver.
+     *
+     * @class ObjectPoseObserver
+     * @ingroup Component-ObjectPoseObserver
+     * @brief Brief description of class ObjectPoseObserver.
+     *
+     * Detailed description of class ObjectPoseObserver.
+     */
+    class ObjectPoseObserver :
+            virtual public Observer
+            , virtual public objpose::ObjectPoseObserverInterface
+            , virtual public armarx::ArVizComponentPluginUser
+    {
+    public:
+
+        /// @see armarx::ManagedIceObject::getDefaultName()
+        std::string getDefaultName() const override;
+
+
+        // ObjectPoseTopic interface
+    public:
+        void reportProviderInfo(const std::string& providerName, const objpose::ProviderInfo& info, ICE_CURRENT_ARG) override;
+        void reportObjectPoses(const std::string& providerName, const objpose::ObjectPoseSeq& candidates, ICE_CURRENT_ARG) override;
+
+        // ObjectPoseObserverInterface interface
+    public:
+        objpose::InfoMap getAvailableProvidersWithInfo(ICE_CURRENT_ARG) override;
+        Ice::StringSeq getAvailableProviderNames(ICE_CURRENT_ARG) override;
+        objpose::ProviderInfo getProviderInfo(const std::string& providerName, ICE_CURRENT_ARG) override;
+        bool hasProvider(const std::string& providerName, ICE_CURRENT_ARG) override;
+
+        objpose::ObjectPoseSeq getObjectPoses(ICE_CURRENT_ARG) override;
+        objpose::ObjectPoseSeq getObjectPosesByProvider(const std::string& providerName, ICE_CURRENT_ARG) override;
+
+        Ice::Int getUpdateCounterByProvider(const std::string& providerName, ICE_CURRENT_ARG) override;
+        StringIntDictionary getAllUpdateCounters(ICE_CURRENT_ARG) override;
+        bool setProviderConfig(const std::string& providerName, const StringVariantBaseMap& config, ICE_CURRENT_ARG) override;
+
+
+    protected:
+
+        void onInitObserver() override;
+        void onConnectObserver() override;
+
+        void onDisconnectComponent() override;
+        void onExitObserver() override;
+
+        armarx::PropertyDefinitionsPtr createPropertyDefinitions() override;
+
+
+    private:
+
+
+    };
+
+}
+
+#undef ICE_CURRENT_ARG
diff --git a/source/RobotAPI/components/ObjectPoseObserver/main.cpp b/source/RobotAPI/components/ObjectPoseObserver/main.cpp
new file mode 100644
index 000000000..d83c2d5e8
--- /dev/null
+++ b/source/RobotAPI/components/ObjectPoseObserver/main.cpp
@@ -0,0 +1,32 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::application::ObjectPoseObserver
+ * @author     Rainer Kartmann ( rainer dot kartmann at kit dot edu )
+ * @date       2020
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#include <RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h>
+
+#include <ArmarXCore/core/application/Application.h>
+#include <ArmarXCore/core/Component.h>
+#include <ArmarXCore/core/logging/Logging.h>
+
+int main(int argc, char* argv[])
+{
+    return armarx::runSimpleComponentApp < armarx::ObjectPoseObserver > (argc, argv, "ObjectPoseObserver");
+}
diff --git a/source/RobotAPI/components/ObjectPoseObserver/test/CMakeLists.txt b/source/RobotAPI/components/ObjectPoseObserver/test/CMakeLists.txt
new file mode 100644
index 000000000..878921745
--- /dev/null
+++ b/source/RobotAPI/components/ObjectPoseObserver/test/CMakeLists.txt
@@ -0,0 +1,5 @@
+
+# Libs required for the tests
+SET(LIBS ${LIBS} ArmarXCore ObjectPoseObserver)
+
+armarx_add_test(ObjectPoseObserverTest ObjectPoseObserverTest.cpp "${LIBS}")
diff --git a/source/RobotAPI/components/ObjectPoseObserver/test/ObjectPoseObserverTest.cpp b/source/RobotAPI/components/ObjectPoseObserver/test/ObjectPoseObserverTest.cpp
new file mode 100644
index 000000000..c75c9d76a
--- /dev/null
+++ b/source/RobotAPI/components/ObjectPoseObserver/test/ObjectPoseObserverTest.cpp
@@ -0,0 +1,37 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::ArmarXObjects::ObjectPoseObserver
+ * @author     Rainer Kartmann ( rainer dot kartmann at kit dot edu )
+ * @date       2020
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#define BOOST_TEST_MODULE RobotAPI::ArmarXObjects::ObjectPoseObserver
+
+#define ARMARX_BOOST_TEST
+
+#include <RobotAPI/Test.h>
+#include <RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h>
+
+#include <iostream>
+
+BOOST_AUTO_TEST_CASE(testExample)
+{
+    armarx::ObjectPoseObserver instance;
+
+    BOOST_CHECK_EQUAL(true, true);
+}
-- 
GitLab