diff --git a/source/RobotAPI/components/units/RobotUnit/util/RtTiming.h b/source/RobotAPI/components/units/RobotUnit/util/RtTiming.h index 243f1a119df65ab1f5a9f79a5f53d243fe8b102c..2fa3ffe573037a4c7b27b55a5a8fe43129156c7b 100644 --- a/source/RobotAPI/components/units/RobotUnit/util/RtTiming.h +++ b/source/RobotAPI/components/units/RobotUnit/util/RtTiming.h @@ -24,18 +24,25 @@ #pragma once #include <chrono> -//#include <ArmarXCore/core/time/TimeUtil.h> #include "ControlThreadOutputBuffer.h" namespace armarx { + namespace rt_timing::constants + { + inline constexpr const std::int64_t seconds2MicroSeconds = 1e6; + + static constexpr const std::int64_t nanoSeconds2MicroSeconds = 1000; + } // namespace rt_timing::constants inline IceUtil::Time rtNow() { + using namespace rt_timing::constants; struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); - return IceUtil::Time::microSeconds(ts.tv_sec * 1e6 + ts.tv_nsec / 1000); + return IceUtil::Time::microSeconds(ts.tv_sec * seconds2MicroSeconds + + ts.tv_nsec / nanoSeconds2MicroSeconds); } } // namespace armarx @@ -52,7 +59,7 @@ namespace armarx //! \ingroup VirtualTime //! Prints duration with comment in front of it if it took longer than threshold #define RT_TIMING_CEND_COMMENT(name, comment, thresholdMs) \ - if ((armarx::rtNow() - name).toMilliSeconds() >= thresholdMs) \ + if ((armarx::rtNow() - name).toMilliSecondsDouble() >= thresholdMs) \ RT_TIMING_END_COMMENT(name, comment) //! \ingroup VirtualTime //! Prints duration if it took longer than thresholdMs diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp index b4c59389a918789222beb3595a29ec49320775df..5e79a0a8d032429dacc6ef9ccc69e8fa0edde788 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp @@ -97,6 +97,12 @@ namespace armarx::aron type::IntEnumPtr enumType = type::IntEnum::DynamicCast(type); data::IntPtr enumData = data::Int::DynamicCast(data); + if (enumType == nullptr or enumData == nullptr) + { + ARMARX_WARNING << "Enum Type or Data is NULL"; + return; + } + std::string name = enumType->getValueName(enumData->getValue()); value << name; } diff --git a/source/RobotAPI/libraries/aron/converter/ivt/IVTConverter.cpp b/source/RobotAPI/libraries/aron/converter/ivt/IVTConverter.cpp index 715fe6526fc51e7078c97b769c85ec61bd437907..7d177ee2bfe68be685c514eaecbfe38dcf7b3dd4 100644 --- a/source/RobotAPI/libraries/aron/converter/ivt/IVTConverter.cpp +++ b/source/RobotAPI/libraries/aron/converter/ivt/IVTConverter.cpp @@ -39,13 +39,17 @@ namespace armarx::aron::data::converter throw error::AronException( __PRETTY_FUNCTION__, "The size of an NDArray does not match.", nav->getPath()); } + auto dims = nav->getShape(); auto ret = std::make_shared<CByteImage>(); + ret->Set(dims[0], dims[1], static_cast<CByteImage::ImageType>(std::stoi(nav->getType()))); + memcpy(reinterpret_cast<unsigned char*>(ret->pixels), nav->getData(), std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>())); + return ret; } diff --git a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp index a42d7808284d958d965cfba0dd70aa866a47cc17..3d775f587834aa3a62fd42d1be353eb23a8fc0d4 100644 --- a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp +++ b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp @@ -121,7 +121,7 @@ namespace armarx::plugins { ARMARX_CHECK(execId.skillId.isSkillSpecified()); - const std::unique_lock l(skillExecutionsMutex); + const std::shared_lock l(skillExecutionsMutex); if (skillExecutions.find(execId) == skillExecutions.end()) { ARMARX_WARNING << "Skill execution for skill '" + execId.skillId.toString() + @@ -137,7 +137,7 @@ namespace armarx::plugins { std::map<skills::SkillExecutionID, skills::SkillStatusUpdate> skillUpdates; - const std::scoped_lock l(skillExecutionsMutex); + const std::shared_lock l(skillExecutionsMutex); for (const auto& [key, impl] : skillExecutions) { const std::scoped_lock l2(impl.skillStatusesMutex); @@ -151,7 +151,7 @@ namespace armarx::plugins { ARMARX_CHECK(skillId.isFullySpecified()); - const std::unique_lock l(skillFactoriesMutex); + const std::shared_lock l(skillFactoriesMutex); if (skillFactories.find(skillId) == skillFactories.end()) { std::stringstream ss; @@ -175,7 +175,7 @@ namespace armarx::plugins SkillProviderComponentPlugin::getSkillDescriptions() const { std::map<skills::SkillID, skills::SkillDescription> skillDesciptions; - const std::unique_lock l(skillFactoriesMutex); + const std::shared_lock l(skillFactoriesMutex); for (const auto& [key, fac] : skillFactories) { ARMARX_CHECK(key.isFullySpecified()); @@ -215,6 +215,7 @@ namespace armarx::plugins executionRequest.parameters, executionRequest.callbackInterface)); wrapper = &it.first->second; + // ATTENTION NOT DEFINED BEHAVIOR } // async start execution. But we wait for the execution to finish at the end of this method @@ -269,6 +270,7 @@ namespace armarx::plugins executionRequest.parameters, executionRequest.callbackInterface)); wrapper = &it.first->second; + // ATTENTION NOT DEFINED BEHAVIOR } wrapper->execution = std::thread( @@ -303,7 +305,7 @@ namespace armarx::plugins { ARMARX_CHECK(executionId.skillId.isFullySpecified()); - const std::scoped_lock l{skillExecutionsMutex}; + std::shared_lock l{skillExecutionsMutex}; auto it = skillExecutions.find(executionId); if (it == skillExecutions.end()) { @@ -329,7 +331,7 @@ namespace armarx::plugins { ARMARX_CHECK(executionId.skillId.isFullySpecified()); - const std::unique_lock l(skillExecutionsMutex); + std::shared_lock l(skillExecutionsMutex); auto it = skillExecutions.find(executionId); if (it == skillExecutions.end()) { @@ -363,7 +365,7 @@ namespace armarx::plugins { ARMARX_CHECK(executionId.skillId.isFullySpecified()); - const std::unique_lock l(skillExecutionsMutex); + std::shared_lock l(skillExecutionsMutex); auto it = skillExecutions.find(executionId); if (it == skillExecutions.end()) { diff --git a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h index 812cc0a8814db843793038ebdd16a3a927c912cf..20ffe1fbdb75ee9f4b5831dbd406180f7acf22fc 100644 --- a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h +++ b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h @@ -104,10 +104,10 @@ namespace armarx::plugins skills::manager::dti::SkillManagerInterfacePrx manager; skills::provider::dti::SkillProviderInterfacePrx myPrx; - mutable std::mutex skillFactoriesMutex; + mutable std::shared_mutex skillFactoriesMutex; std::map<skills::SkillID, std::unique_ptr<skills::SkillBlueprint>> skillFactories; - mutable std::mutex skillExecutionsMutex; + mutable std::shared_mutex skillExecutionsMutex; std::map<skills::SkillExecutionID, skills::detail::SkillRuntime> skillExecutions; friend class armarx::SkillProviderComponentPluginUser;