From f6643d650e3f24ab2ac49a61f48041d3e49f263e Mon Sep 17 00:00:00 2001
From: Fabian Reister <fabian.reister@kit.edu>
Date: Tue, 4 Jan 2022 19:02:08 +0100
Subject: [PATCH] memory subscriber: subscriptions via topic

---
 .../client/services/MemorySubscriber.cpp      | 25 +++++++++++++++++++
 .../client/services/MemorySubscriber.h        |  4 +++
 .../components/Navigator/Navigator.cpp        |  2 +-
 3 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/source/armarx/navigation/client/services/MemorySubscriber.cpp b/source/armarx/navigation/client/services/MemorySubscriber.cpp
index f759b164..033ea36f 100644
--- a/source/armarx/navigation/client/services/MemorySubscriber.cpp
+++ b/source/armarx/navigation/client/services/MemorySubscriber.cpp
@@ -27,12 +27,37 @@ namespace armarx::navigation::client
         ARMARX_INFO << "MemorySubscriber: will handle all events newer than " << lastMemoryPoll
                     << ".";
 
+        // subscription api
+        armem::MemoryID subscriptionID;
+        subscriptionID.coreSegmentName = "Events";
+        subscriptionID.providerSegmentName = callerId;
+
+        // TODO add: memoryNameSystem.subscribe(subscriptionID, this, &MemorySubscriber::onEntityUpdate);
+
+        // polling api
         ARMARX_TRACE;
         task = new armarx::PeriodicTask<MemorySubscriber>(
             this, &MemorySubscriber::runPollMemoryEvents, 20);
         task->start();
     }
 
+    void
+    MemorySubscriber::onEntityUpdate(const armem::MemoryID& subscriptionID,
+                                     const std::vector<armem::MemoryID>& snapshotIDs)
+    {
+        ARMARX_INFO << "Received " << snapshotIDs.size() << " events from memory";
+        const armem::client::QueryResult qResult = memoryReader.queryMemoryIDs(snapshotIDs);
+
+        if (not qResult.success) /* c++20 [[unlikely]] */
+        {
+            ARMARX_WARNING << deactivateSpam(0.1F) << "Memory lookup failed.";
+            return;
+        }
+
+        handleEvents(qResult.memory);
+    }
+
+
     void
     MemorySubscriber::handleEvent(const armem::wm::EntityInstance& memoryEntity)
     {
diff --git a/source/armarx/navigation/client/services/MemorySubscriber.h b/source/armarx/navigation/client/services/MemorySubscriber.h
index 5a9fcbc6..059305dd 100644
--- a/source/armarx/navigation/client/services/MemorySubscriber.h
+++ b/source/armarx/navigation/client/services/MemorySubscriber.h
@@ -38,6 +38,10 @@ namespace armarx::navigation::client
         void runPollMemoryEvents();
         void handleEvents(const armem::wm::Memory& memory);
 
+
+        void onEntityUpdate(const armem::MemoryID& subscriptionID,
+                            const std::vector<armem::MemoryID>& snapshotIDs);
+                            
     private:
         const std::string callerId;
         armem::client::MemoryNameSystem& memoryNameSystem;
diff --git a/source/armarx/navigation/components/Navigator/Navigator.cpp b/source/armarx/navigation/components/Navigator/Navigator.cpp
index 6532665f..8d0ad97d 100644
--- a/source/armarx/navigation/components/Navigator/Navigator.cpp
+++ b/source/armarx/navigation/components/Navigator/Navigator.cpp
@@ -50,6 +50,7 @@
 
 #include "RobotAPI/components/ArViz/Client/Elements.h"
 #include "RobotAPI/components/ArViz/Client/elements/Color.h"
+#include "RobotAPI/libraries/armem/core/MemoryID.h"
 #include "RobotAPI/libraries/armem/core/Time.h"
 #include "RobotAPI/libraries/armem_vision/OccupancyGridHelper.h"
 #include "RobotAPI/libraries/armem_vision/client/occupancy_grid/Reader.h"
@@ -163,7 +164,6 @@ namespace armarx::navigation::components
         navRemoteGui = std::make_unique<NavigatorRemoteGui>(remoteGui, *this);
         navRemoteGui->enable();
 
-
         initialized = true;
 
         ARMARX_INFO << "Initialized. Will now respond to navigation requests.";
-- 
GitLab