From d91445c9cd68045f42a7cf4cd8bc80507cf78ad6 Mon Sep 17 00:00:00 2001
From: Fabian PK <fabian.peller-konrad@kit.edu>
Date: Tue, 27 Jul 2021 15:48:34 +0200
Subject: [PATCH] different consollidation modes

---
 .../armem/core/longtermmemory/Memory.cpp      | 12 ++++++
 .../armem/core/longtermmemory/Memory.h        | 42 +++++++++++++------
 .../armem/server/ComponentPlugin.cpp          |  8 +---
 .../armem/server/MemoryToIceAdapter.cpp       | 17 +++++++-
 4 files changed, 59 insertions(+), 20 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.cpp b/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.cpp
index fbea444e9..ab894ea64 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.cpp
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.cpp
@@ -26,6 +26,18 @@ namespace armarx::armem::ltm
         return true;
     }
 
+    void Memory::defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix)
+    {
+        defs->optional(dbsettings.host, prefix + ".ltm.10_host");
+        defs->optional(dbsettings.port, prefix + "ltm.11_port");
+        defs->optional(dbsettings.user, prefix + "ltm.20_user");
+        defs->optional(dbsettings.password, prefix + "ltm.21_password");
+        defs->optional(dbsettings.database, prefix + "ltm.22_database");
+        defs->optional(alwaysTransferSettings.enabled, prefix + "ltm.30_enableAlwaysTransfer", "Enable transfer whenever new data is committed (This disables the other transfer modes!).");
+        defs->optional(periodicTransferSettings.enabled, prefix + "ltm.31_enablePeriodicTransfer", "Enable transfer based on periodic interval.");
+        defs->optional(onFullTransferSettings.enabled, prefix + "ltm.32_enableOnFullTransfer", "Enable transfer whenever the wm is full (see maxHistorySize).");
+    }
+
     wm::Memory Memory::convert() const
     {
         if (!checkConnection())
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.h b/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.h
index 86c00cc61..a11404eca 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.h
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.h
@@ -1,11 +1,18 @@
 #pragma once
 
+// BaseClass
 #include "../base/MemoryBase.h"
 
+// CoreSegment
 #include "CoreSegment.h"
 
+// WM
 #include "../workingmemory/Memory.h"
 
+// Properties
+#include <ArmarXCore/core/application/properties/PluginAll.h>
+#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
+
 namespace armarx::armem::ltm
 {
     /**
@@ -21,29 +28,35 @@ namespace armarx::armem::ltm
         using Base::MemoryBase;
         using Base::operator=;
 
-        enum class PeriodicTransferMode
+        struct TransferSettings
         {
-            MANUAL,
-            TRANSFER_PERIODIC_KEEP,
-            TRANSFER_PERIODIC_DELETE,
+            bool enabled = false;
         };
 
-        enum class FilledTransferMode
+        struct AlwaysTransferSettings : public TransferSettings
         {
-            TRANSFER_LATEST,
-            TRANSFER_LEAST_USED
+
         };
 
-        struct PeriodicTransfer
+        struct PeriodicTransferSettings : public TransferSettings
         {
-            PeriodicTransferMode mode = PeriodicTransferMode::MANUAL;
+            bool deleteFromWMOnTransfer = false;
+            int frequencyHz = 1;
         };
 
-        struct FilledTransfer
+        struct OnFullTransferSettings : public TransferSettings
         {
-            FilledTransferMode mode = FilledTransferMode::TRANSFER_LATEST;
+            enum class Mode
+            {
+                TRANSFER_LATEST,
+                TRANSFER_LEAST_USED
+            };
+
+            Mode mode;
         };
 
+        // PropertyDefinitions related to LTM
+        void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "");
 
         // Conversion
         wm::Memory convert() const;
@@ -71,7 +84,10 @@ namespace armarx::armem::ltm
     public:
         MongoDBConnectionManager::MongoDBSettings dbsettings;
 
-        PeriodicTransfer periodic_transfer;
-        FilledTransferMode filled_transfer;
+        AlwaysTransferSettings alwaysTransferSettings;
+        PeriodicTransferSettings periodicTransferSettings;
+        OnFullTransferSettings onFullTransferSettings;
+
+
     };
 }
diff --git a/source/RobotAPI/libraries/armem/server/ComponentPlugin.cpp b/source/RobotAPI/libraries/armem/server/ComponentPlugin.cpp
index ddb1a96a7..8c814a160 100644
--- a/source/RobotAPI/libraries/armem/server/ComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/armem/server/ComponentPlugin.cpp
@@ -22,12 +22,8 @@ namespace armarx::armem::server::plugins
         ComponentPluginUser& parent = this->parent<ComponentPluginUser>();
         properties->topic(memoryListener, parent.memoryListenerDefaultName);
 
-        properties->optional(parent.longtermMemoryEnabled, "ltm.00_enabled");
-        properties->optional(parent.longtermMemory.dbsettings.host, "ltm.10_host");
-        properties->optional(parent.longtermMemory.dbsettings.port, "ltm.11_port");
-        properties->optional(parent.longtermMemory.dbsettings.user, "ltm.20_user");
-        properties->optional(parent.longtermMemory.dbsettings.password, "ltm.21_password");
-        properties->optional(parent.longtermMemory.dbsettings.database, "ltm.22_database");
+        properties->optional(parent.longtermMemoryEnabled, "memory.ltm.00_enabled");
+        parent.longtermMemory.defineProperties(properties, "memory");
     }
 
 
diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
index c40805a0f..b8634f385 100644
--- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
+++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
@@ -172,7 +172,22 @@ namespace armarx::armem::server
                 result.snapshotID = updateResult.id;
                 result.timeArrived = update.timeArrived;
 
-                // TODO: Add if and param here (fabian.peller)
+                // also store in ltm if transfermode is set to always
+                if (longtermMemory)
+                {
+                    if (longtermMemory->alwaysTransferSettings.enabled)
+                    {
+                        wm::Memory tmp("tmp");
+                        tmp.update(update);
+                        longtermMemory->append(tmp);
+                    }
+                    else
+                    {
+                        // TODO: see below
+                    }
+                }
+
+                // TODO: Consollidate to ltm if onFilledTransfer is enabled (fabian.peller)
                 for (const auto& snapshot : updateResult.removedSnapshots)
                 {
                     ARMARX_DEBUG << "The id " << snapshot.id() << " was removed from wm";
-- 
GitLab