From e2f30738703bbf2e122cb83be0b3f457805e0836 Mon Sep 17 00:00:00 2001
From: joana <uhfpm@student.kit.edu>
Date: Mon, 22 Jan 2024 13:53:49 +0100
Subject: [PATCH] Make sure statistics for recording are saved if recording is
 interupted due to stopping the component

---
 source/RobotAPI/libraries/armem/server/ltm/Memory.h    | 10 +++++-----
 .../libraries/armem/server/ltm/detail/MemoryBase.h     |  4 ++--
 .../RobotAPI/libraries/armem/server/plugins/Plugin.cpp | 10 ++++++++++
 .../armem/server/test/ForgettingExperiments.cpp        |  7 +++++++
 4 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/server/ltm/Memory.h b/source/RobotAPI/libraries/armem/server/ltm/Memory.h
index b3cd24b8b..05d04551d 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/Memory.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/Memory.h
@@ -49,6 +49,11 @@ namespace armarx::armem::server::ltm
 
         void createPropertyDefinitions(PropertyDefinitionsPtr& defs, const std::string& prefix) override;
 
+        /**
+         * @brief getAndSaveStatistics generates and saves statistics for a LTM recording
+         */
+        void getAndSaveStatistics();
+
     protected:
         void _loadAllReferences(armem::wm::Memory&) final;
         void _resolve(armem::wm::Memory&) final;
@@ -56,11 +61,6 @@ namespace armarx::armem::server::ltm
         void _directlyStore(const armem::wm::Memory&) final;
 
     private:
-        /**
-         * @brief getAndSaveStatistics generates and saves statistics for a LTM recording
-         */
-        void getAndSaveStatistics();
-
         std::time_t current_date;
     };
 } // namespace armarx::armem::server::ltm
diff --git a/source/RobotAPI/libraries/armem/server/ltm/detail/MemoryBase.h b/source/RobotAPI/libraries/armem/server/ltm/detail/MemoryBase.h
index 99839aab4..99df8e2e6 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/detail/MemoryBase.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/detail/MemoryBase.h
@@ -303,8 +303,8 @@ namespace armarx::armem::server::ltm::detail
         {
             bool enabled_on_startup = false;
             std::string configuration_on_startup =
-                "{ \"SnapshotFrequencyFilter\": {\"WaitingTimeInMsForFilter\" : 500}, "
-                "\"PngConverter\": {}, \"ExrConverter\": {}}";
+                "{ \"SnapshotFrequencyFilter\": {\"WaitingTimeInMsForFilter\" : 50}, "
+                "\"PngConverter\": {}, \"ExrConverter\": {}}"; //record with 20 fps as standard
             std::string export_name = "MemoryExport";
             std::string export_path = "/tmp/ltm";
         } p;
diff --git a/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp b/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp
index 14b4f7dc1..da889f795 100644
--- a/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp
+++ b/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp
@@ -133,6 +133,16 @@ namespace armarx::armem::server::plugins
 
         statistics_saved = true;
         */
+        try{
+            if(longtermMemory.isRecording()){
+                ARMARX_INFO << "Recording still in progress, stopping component anyways. "
+                               "Saving statistics...";
+                longtermMemory.getAndSaveStatistics();
+            }
+        } catch(...){
+            ARMARX_WARNING << "Statistics could not be saved for recording that was interrupted by "
+                              "disconnecting the component";
+        }
 
         if (clientPlugin->isMemoryNameSystemEnabled() and clientPlugin->getMemoryNameSystemClient())
         {
diff --git a/source/RobotAPI/libraries/armem/server/test/ForgettingExperiments.cpp b/source/RobotAPI/libraries/armem/server/test/ForgettingExperiments.cpp
index 0025f3e20..9e84d09f9 100644
--- a/source/RobotAPI/libraries/armem/server/test/ForgettingExperiments.cpp
+++ b/source/RobotAPI/libraries/armem/server/test/ForgettingExperiments.cpp
@@ -84,6 +84,7 @@ void save_statistics(
 
     //get current date:
     auto now = std::chrono::high_resolution_clock::now();
+    auto now_ax_datetime = DateTime::Now();
     auto now_time = std::chrono::high_resolution_clock::to_time_t(now);
     auto time = localtime(&now_time);
 
@@ -97,6 +98,12 @@ void save_statistics(
 
     bool ended_without_recording = false;
 
+    if(firstStoppedRecording.toMilliSecondsSinceEpoch() < firstStartedRecording.toMilliSecondsSinceEpoch()){
+        //this can happen if the recording is not propperly stopped but interrupted by stopping
+        //the component
+        firstStoppedRecording = now_ax_datetime;
+    }
+
     for(const auto& filter: stats){
        filter_statistics(filter.second, memoryName,firstStartedRecording, firstStoppedRecording, &jsonData);
     }
-- 
GitLab