From ca7ac9fd69f8672d905d9a3ef5f2039b44450504 Mon Sep 17 00:00:00 2001
From: Peter Albrecht <usnlf@student.kit.edu>
Date: Wed, 12 Feb 2025 15:11:54 +0100
Subject: [PATCH] feat: parameter history

---
 .../skills_gui/memory/SkillManagerWrapper.cpp | 39 ++++++++++++++++++-
 .../skills_gui/memory/SkillManagerWrapper.h   | 15 +++++++
 2 files changed, 53 insertions(+), 1 deletion(-)

diff --git a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
index a241634e3..dc26d0dcd 100644
--- a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
+++ b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
@@ -1,6 +1,7 @@
 #include "SkillManagerWrapper.h"
 
 #include <mutex>
+#include <optional>
 
 #include <SimoxUtility/algorithm/string/string_tools.h>
 
@@ -241,6 +242,39 @@ namespace armarx::skills::gui
         // notify registered widgets of update
         emit updateAvailable(filterUpdate(snapshot));
     }
+    
+    std::vector<Parameters> SkillManagerWrapper::getParameterHistoryForSkill(const skills::SkillID& sid) const 
+    {
+        if (not this->skillParameterHistory.contains(sid))
+        {
+            return {};
+        }
+        return this->skillParameterHistory[sid];
+    }
+    
+    void SkillManagerWrapper::addParametersToHistory(const skills::SkillID& sid, const Parameters& params) 
+    {
+        if (not this->skillParameterHistory.contains(sid))
+        {
+            // no history exists for this skill. Assign new
+            this->skillParameterHistory.insert({sid, {params}});
+        }
+        else
+        {
+            // history already exists. Append to list
+            this->skillParameterHistory[sid].emplace_back(params);
+        }
+    }
+    
+    std::optional<Parameters> SkillManagerWrapper::getLatestParametersForSkill(const skills::SkillID& sid) const 
+    {
+        auto parameterList = getParameterHistoryForSkill(sid);
+        if (parameterList.empty())
+        {
+            return std::nullopt;
+        }
+        return parameterList.back();
+    }
 
     const std::optional<ProviderID>
     SkillManagerWrapper::findFirstProvider(SkillMap const& map, SkillID const& skillId)
@@ -391,8 +425,11 @@ namespace armarx::skills::gui
             .parameters = params};
 
         ARMARX_CHECK(skillId.isFullySpecified()); // sanity check
-        ARMARX_IMPORTANT << "Executing skill from GUI: " << skillId << ".";
 
+        this->addParametersToHistory(skillId, params);
+        ARMARX_INFO << "Saved skill parameters to history...";
+        ARMARX_IMPORTANT << "Executing skill from GUI: " << skillId << ".";
+        
         try
         {
             std::scoped_lock l(mutex_memory);
diff --git a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h
index ec25489db..017739a45 100644
--- a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h
+++ b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h
@@ -1,12 +1,14 @@
 #pragma once
 
 #include <mutex>
+#include <vector>
 
 #include <QObject>
 
 #include "RobotAPI/libraries/skills/core/ProviderID.h"
 #include "RobotAPI/libraries/skills/core/SkillDescription.h"
 #include "RobotAPI/libraries/skills/core/SkillExecutionID.h"
+#include "RobotAPI/libraries/skills/core/SkillID.h"
 #include "RobotAPI/libraries/skills/core/SkillStatusUpdate.h"
 #include <RobotAPI/interface/skills/SkillManagerInterface.h>
 
@@ -16,6 +18,10 @@ namespace armarx::skills::gui
     using SkillMap =
         std::map<skills::ProviderID, std::map<skills::SkillID, skills::SkillDescription>>;
 
+    using Parameters = aron::data::DictPtr;
+    using SkillParameterMap =
+        std::map<skills::SkillID, std::vector<Parameters>>;
+
     class SkillManagerWrapper : public QObject
     {
         Q_OBJECT
@@ -112,6 +118,12 @@ namespace armarx::skills::gui
          */
         void updateFromMemory();
 
+        // == Skill Parameters State ==
+
+        std::vector<Parameters> getParameterHistoryForSkill(const skills::SkillID& sid) const;
+        void addParametersToHistory(const skills::SkillID& sid, const Parameters& params);
+        std::optional<Parameters> getLatestParametersForSkill(const skills::SkillID& sid) const;
+
     private:
         mutable std::mutex mutex_memory;
         mutable std::mutex mutex_snapshot;
@@ -119,6 +131,9 @@ namespace armarx::skills::gui
         armarx::skills::manager::dti::SkillManagerInterfacePrx memory;
         std::string currentSkillSearch = "";
 
+        // Store a list of all execution parameters for each skill 
+        SkillParameterMap skillParameterHistory;
+
         Snapshot snapshot;
 
         /**
-- 
GitLab