From 1db6f1d7290431e24a39dfa2783c60a92dff520b Mon Sep 17 00:00:00 2001 From: Fabian Reister <fabian.reister@kit.edu> Date: Thu, 5 Sep 2024 15:18:06 +0200 Subject: [PATCH] + VirtualRobotReader::getRobotWaiting: blocking until robot can be loaded --- .../client/common/VirtualRobotReader.cpp | 31 ++++++++++++++++--- .../client/common/VirtualRobotReader.h | 9 ++++++ 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp b/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp index 529aeba90..515a11d94 100644 --- a/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp @@ -24,8 +24,7 @@ namespace armarx::armem::robot_state if (not robotState) { ARMARX_VERBOSE << deactivateSpam(5) << "Querying robot state failed for robot `" - << robot.getName() << "` " - << "(type `" << robot.getType() << "`)!"; + << robot.getName() << "` " << "(type `" << robot.getType() << "`)!"; return false; } @@ -43,8 +42,7 @@ namespace armarx::armem::robot_state if (not robotState) { ARMARX_VERBOSE << deactivateSpam(5) << "Querying robot state failed for robot `" - << robot.getName() << "` " - << "(type `" << robot.getType() << "`)!"; + << robot.getName() << "` " << "(type `" << robot.getType() << "`)!"; return false; } @@ -84,6 +82,29 @@ namespace armarx::armem::robot_state return robot; } + VirtualRobot::RobotPtr + VirtualRobotReader::getRobotWaiting(const std::string& name, + const armem::Time& timestamp, + const VirtualRobot::RobotIO::RobotDescription& loadMode) + { + + VirtualRobot::RobotPtr robot = nullptr; + while (robot == nullptr) + { + // might be nullptr if query fails + robot = getRobot(name, timestamp, loadMode); + + if (robot == nullptr) + { + ARMARX_WARNING << deactivateSpam(1) << "Failed to query robot `" << name + << "`. Will try again ..."; + } + Clock::WaitFor(Duration::MilliSeconds(200)); + } + + return robot; + } + VirtualRobot::RobotPtr VirtualRobotReader::getSynchronizedRobot(const std::string& name, const VirtualRobot::BaseIO::RobotDescription& loadMode, @@ -128,4 +149,4 @@ namespace armarx::armem::robot_state } -} // namespace armarx::armem::robot_state::client::common +} // namespace armarx::armem::robot_state diff --git a/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h b/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h index 0c0eb05aa..571838aa3 100644 --- a/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h +++ b/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h @@ -69,6 +69,15 @@ namespace armarx::armem::robot_state VirtualRobot::RobotIO::RobotDescription::eStructure, bool blocking = true); + /** + @brief In contrast to getRobot(), this function will retry to query the robot until it exists. + */ + [[nodiscard]] VirtualRobot::RobotPtr + getRobotWaiting(const std::string& name, + const armem::Time& timestamp = armem::Time::Invalid(), + const VirtualRobot::RobotIO::RobotDescription& loadMode = + VirtualRobot::RobotIO::RobotDescription::eStructure); + private: [[nodiscard]] VirtualRobot::RobotPtr _getSynchronizedRobot(const std::string& name, -- GitLab