diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui index 1e80202efb18b2aca77e8ba45b87827e362ae233..7c25a1b848daab3347a7247199aa9a54eefb99bc 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 85237f794613e4b2938b07462864172abebed457..f9fa41252ad6a0f1144bf7eb043f62771061b5fc 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 e30b00cf03e892412a06d85ac29d0cea3ac61bc2..f1ad1bb720ea69503b86b00f75a6e6f09f6058c5 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 f0171437b9b4898a87a48fc2cc2e49d4a467e986..2908d2e77a0a16627d65d2eb757d3ad8431c3271 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); } }