From db82b27607eab33581f914f72b9013c45954859b Mon Sep 17 00:00:00 2001
From: Fabian Peller <fabian.peller-konrad@kit.edu>
Date: Thu, 18 May 2023 17:11:52 +0200
Subject: [PATCH] add sanity checks and refresh button for manager gui

---
 .../SkillManagerMonitorWidget.ui              | 22 +++++-
 .../SkillManagerMonitorWidgetController.cpp   | 16 +++-
 .../SkillManagerMonitorWidgetController.h     |  1 +
 .../manager/SkillManagerComponentPlugin.cpp   | 74 +++++++++++++------
 4 files changed, 84 insertions(+), 29 deletions(-)

diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui
index 1e80202ef..7c25a1b84 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui
@@ -78,14 +78,17 @@
         <string>Manager</string>
        </property>
        <layout class="QGridLayout" name="gridLayout">
-        <item row="2" column="0">
+        <item row="3" column="1">
+         <widget class="QDoubleSpinBox" name="doubleSpinBoxUpdateFreq"/>
+        </item>
+        <item row="3" column="0">
          <widget class="QLabel" name="label">
           <property name="text">
            <string>Update Frequency:</string>
           </property>
          </widget>
         </item>
-        <item row="3" column="0" colspan="3">
+        <item row="4" column="0" colspan="3">
          <widget class="QTreeWidget" name="treeWidgetSkills">
           <column>
            <property name="text">
@@ -104,8 +107,19 @@
           </column>
          </widget>
         </item>
-        <item row="2" column="1">
-         <widget class="QDoubleSpinBox" name="doubleSpinBoxUpdateFreq"/>
+        <item row="2" column="0">
+         <widget class="QCheckBox" name="autoUpdateCheckBox">
+          <property name="text">
+           <string>Auto Update</string>
+          </property>
+         </widget>
+        </item>
+        <item row="2" column="2">
+         <widget class="QPushButton" name="refreshNowPushButton">
+          <property name="text">
+           <string>Refresh Now</string>
+          </property>
+         </widget>
         </item>
        </layout>
       </widget>
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
index 85237f794..f9fa41252 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
@@ -99,7 +99,7 @@ namespace armarx
         connect(refreshSkillsResultTimer,
                 &QTimer::timeout,
                 this,
-                &SkillManagerMonitorWidgetController::refreshSkills);
+                &SkillManagerMonitorWidgetController::refreshSkillsPeriodically);
 
         connect(widget.pushButtonCopy,
                 &QPushButton::clicked,
@@ -123,6 +123,11 @@ namespace armarx
                 &QTreeWidget::currentItemChanged,
                 this,
                 &SkillManagerMonitorWidgetController::skillSelectionChanged);
+
+        connect(widget.refreshNowPushButton,
+                &QPushButton::clicked,
+                this,
+                &SkillManagerMonitorWidgetController::refreshSkills);
     }
 
     SkillManagerMonitorWidgetController::~SkillManagerMonitorWidgetController()
@@ -169,6 +174,15 @@ namespace armarx
         refreshSkillsResultTimer->setInterval(f);
     }
 
+    void
+    SkillManagerMonitorWidgetController::refreshSkillsPeriodically()
+    {
+        if (widget.autoUpdateCheckBox->isChecked())
+        {
+            refreshSkills();
+        }
+    }
+
     void
     SkillManagerMonitorWidgetController::refreshSkills()
     {
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h
index e30b00cf0..f1ad1bb72 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h
@@ -81,6 +81,7 @@ namespace armarx
 
         void updateTimerFrequency();
         void refreshSkills();
+        void refreshSkillsPeriodically();
 
         void copyCurrentConfig();
         void pasteCurrentConfig();
diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp
index f0171437b..2908d2e77 100644
--- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp
@@ -112,24 +112,32 @@ namespace armarx
             const auto& n = it->first;
             const auto& s = it->second;
 
-            if (s)
+            try
             {
-                skills::callback::dti::SkillProviderCallbackInterfacePrx myPrx;
-                getProxy(myPrx, -1);
+                if (s)
+                {
+                    skills::callback::dti::SkillProviderCallbackInterfacePrx myPrx;
+                    getProxy(myPrx, -1);
 
-                skills::provider::dto::SkillExecutionRequest exInfo;
-                exInfo.skillName = info.skillId.skillName;
-                exInfo.executorName = info.executorName;
-                exInfo.callbackInterface = myPrx;
-                exInfo.params = info.params;
+                    skills::provider::dto::SkillExecutionRequest exInfo;
+                    exInfo.skillName = info.skillId.skillName;
+                    exInfo.executorName = info.executorName;
+                    exInfo.callbackInterface = myPrx;
+                    exInfo.params = info.params;
 
-                return s->executeSkill(exInfo);
+                    return s->executeSkill(exInfo);
+                }
+                else
+                {
+                    remove = true;
+                }
             }
-            else
+            catch (...)
             {
                 remove = true;
             }
 
+
             if (remove)
             {
                 std::scoped_lock l(skillProviderMapMutex);
@@ -137,8 +145,9 @@ namespace armarx
                 SkillProviderInterfacePrxMap& skillProviderMap = this->skillProviderMap;
                 if (auto it = skillProviderMap.find(providerName); it != skillProviderMap.end())
                 {
-                    ARMARX_WARNING << __PRETTY_FUNCTION__ << ": Found disconnected skill provider '"
-                                   << n << "' during execution. Removing it from skills.";
+                    ARMARX_WARNING << __PRETTY_FUNCTION__
+                                   << ": Found disconnected or buggy skill provider '" << n
+                                   << "' during execution. Removing it from skills.";
                     it = skillProviderMap.erase(it);
                 }
             }
@@ -170,14 +179,22 @@ namespace armarx
         {
             const auto& n = it->first;
             const auto& s = it->second;
-            if (s)
+            try
             {
-                s->abortSkill(skillName);
+                if (s)
+                {
+                    s->abortSkill(skillName);
+                }
+                else
+                {
+                    ARMARX_WARNING << __PRETTY_FUNCTION__ << ": Found disconnected skill provider '"
+                                   << n << "'. Removing it from skills on next execute.";
+                }
             }
-            else
+            catch (...)
             {
-                ARMARX_WARNING << __PRETTY_FUNCTION__ << ": Found disconnected skill provider '"
-                               << n << "'. Removing it from skills on next execute.";
+                ARMARX_WARNING << __PRETTY_FUNCTION__ << ": Found buggy skill provider '" << n
+                               << "'. Removing it from skills on next execute.";
             }
         }
     }
@@ -236,16 +253,25 @@ namespace armarx
         {
             const auto& n = it->first;
             const auto& s = it->second;
-            if (s)
+            try
             {
-                skills::provider::dto::SkillStatusUpdateMap m = s->getSkillExecutionStatuses();
-                ret.insert({n, m});
-                it++;
+                if (s)
+                {
+                    skills::provider::dto::SkillStatusUpdateMap m = s->getSkillExecutionStatuses();
+                    ret.insert({n, m});
+                    it++;
+                }
+                else
+                {
+                    ARMARX_WARNING << __PRETTY_FUNCTION__ << ": Found disconnected skill provider '"
+                                   << n << "'. Removing it from skills.";
+                    it = skillProviderMap.erase(it);
+                }
             }
-            else
+            catch (...)
             {
-                ARMARX_WARNING << __PRETTY_FUNCTION__ << ": Found disconnected skill provider '"
-                               << n << "'. Removing it from skills.";
+                ARMARX_WARNING << __PRETTY_FUNCTION__ << ": Found buggy skill provider '" << n
+                               << "'. Removing it from skills.";
                 it = skillProviderMap.erase(it);
             }
         }
-- 
GitLab