diff --git a/doc/release/master/systemReady.md b/doc/release/master/systemReady.md new file mode 100644 index 00000000000..e547fb38867 --- /dev/null +++ b/doc/release/master/systemReady.md @@ -0,0 +1,7 @@ +systemReady {#master} +----------------------- + +### yarp +#### devices +* added systemReady device that opens some ports when called. It is useful for synchronize processes opened with yarprobotinterface and yarpmanager to avoid crashes when some processes are not started + diff --git a/src/devices/CMakeLists.txt b/src/devices/CMakeLists.txt index 2453db464e0..9c4e0461467 100644 --- a/src/devices/CMakeLists.txt +++ b/src/devices/CMakeLists.txt @@ -101,6 +101,8 @@ yarp_begin_plugin_library(yarpmod add_subdirectory(mobileBaseVelocityControl) add_subdirectory(mobileBaseVelocityControlMsgs) add_subdirectory(odometry2D) + add_subdirectory(systemReady) + add_subdirectory(awaitSystemReady) add_subdirectory(portaudio) # DEPRECATED Since YARP 3.2 diff --git a/src/devices/awaitSystemReady/AwaitSystemReady_nws_yarp.cpp b/src/devices/awaitSystemReady/AwaitSystemReady_nws_yarp.cpp new file mode 100644 index 00000000000..e91615155bf --- /dev/null +++ b/src/devices/awaitSystemReady/AwaitSystemReady_nws_yarp.cpp @@ -0,0 +1,42 @@ +/* + * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT) + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#include "AwaitSystemReady_nws_yarp.h" +#include +#include +#include + +YARP_LOG_COMPONENT(AWAITSYSTEMREADY_NWS_YARP, "yarp.devices.AwaitSystemReady_nws_yarp") + +AwaitSystemReady_nws_yarp::AwaitSystemReady_nws_yarp() +{ +} + +bool AwaitSystemReady_nws_yarp::open(yarp::os::Searchable &config) +{ + if (config.check("PORT_LIST")) { + // skips the first one since it is PORT_LIST + yarp::os::Bottle port_list = config.findGroup("PORT_LIST").tail(); + for (int index = 0; index < port_list.size(); index++) { + std::string current_port_property = port_list.get(index).toString(); + std::string token; + int pos; + char delimiter = ' '; + pos = current_port_property.find(delimiter); + token = current_port_property.substr(0, pos); + std::string current_port_name = port_list.find(token).asString(); + yarp::os::NetworkBase::waitPort(current_port_name); + } + return true; + } + yCError(AWAITSYSTEMREADY_NWS_YARP) << "missing PORT_LIST group"; + return false; +} + + +bool AwaitSystemReady_nws_yarp::close() +{ + return true; +} diff --git a/src/devices/awaitSystemReady/AwaitSystemReady_nws_yarp.h b/src/devices/awaitSystemReady/AwaitSystemReady_nws_yarp.h new file mode 100644 index 00000000000..bea91e75e64 --- /dev/null +++ b/src/devices/awaitSystemReady/AwaitSystemReady_nws_yarp.h @@ -0,0 +1,55 @@ +/* + * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT) + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef YARP_AWAITSYSTEMREADY_NWS_YARP_H + +#include + + +/** + * @ingroup dev_impl_network_servers + * + * \section AwaitSystemReady_nws_yarp Device description + * \brief `AwaitSystemReady_nws_yarp`: A yarp nws to wait port for synchronization: + * it waits for the specified ports inside the PORT_LIST group. + * Related to SystemReady_nws_yarp. + * + * Parameters required by this device are: + * | Parameter name | SubParameter | Type | Units | Default Value | Required | Description | + * |:-------------------:|:-----------------------:|:-------:|:--------------:|:-------------:|:-----------------------------: |:-----------------------------------------------------| + * | PORT_NAME | - | group | | | Yes | the group inside which port names are located | + * + * example of xml file with a fake odometer + * + * \code{.unparsed} + * + * + * + * + * + * + * /pippo + * /pluto + * + * + * + * + * \endcode + * + */ + +class AwaitSystemReady_nws_yarp : + public yarp::dev::DeviceDriver +{ +public: + AwaitSystemReady_nws_yarp(); + + // DeviceDriver + bool open(yarp::os::Searchable ¶ms) override; + bool close() override; + +}; + +#endif // YARP_AWAITSYSTEMREADY_NWS_YARP_H diff --git a/src/devices/awaitSystemReady/CMakeLists.txt b/src/devices/awaitSystemReady/CMakeLists.txt new file mode 100644 index 00000000000..f7347ca2f07 --- /dev/null +++ b/src/devices/awaitSystemReady/CMakeLists.txt @@ -0,0 +1,47 @@ +# SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT) +# SPDX-License-Identifier: BSD-3-Clause + + +yarp_prepare_plugin(awaitSystemReady_nws_yarp + CATEGORY device + TYPE AwaitSystemReady_nws_yarp + INCLUDE AwaitSystemReady_nws_yarp.h + EXTRA_CONFIG + WRAPPER=awaitSystemReady_nws_yarp + DEFAULT ON +) + +if(NOT SKIP_awaitSystemReady_nws_yarp) + yarp_add_plugin(yarp_awaitSystemReady_nws_yarp) + + target_sources(yarp_awaitSystemReady_nws_yarp + PRIVATE + AwaitSystemReady_nws_yarp.cpp + AwaitSystemReady_nws_yarp.h + ) + + target_link_libraries(yarp_awaitSystemReady_nws_yarp + PRIVATE + YARP::YARP_os + YARP::YARP_sig + YARP::YARP_dev + ) + list(APPEND YARP_${YARP_PLUGIN_MASTER}_PRIVATE_DEPS + YARP_os + YARP_sig + YARP_dev + ) + + yarp_install( + TARGETS yarp_awaitSystemReady_nws_yarp + EXPORT YARP_${YARP_PLUGIN_MASTER} + COMPONENT ${YARP_PLUGIN_MASTER} + LIBRARY DESTINATION ${YARP_DYNAMIC_PLUGINS_INSTALL_DIR} + ARCHIVE DESTINATION ${YARP_STATIC_PLUGINS_INSTALL_DIR} + YARP_INI DESTINATION ${YARP_PLUGIN_MANIFESTS_INSTALL_DIR} + ) + + set(YARP_${YARP_PLUGIN_MASTER}_PRIVATE_DEPS ${YARP_${YARP_PLUGIN_MASTER}_PRIVATE_DEPS} PARENT_SCOPE) + + set_property(TARGET yarp_awaitSystemReady_nws_yarp PROPERTY FOLDER "Plugins/Device/NWS") +endif() diff --git a/src/devices/systemReady/CMakeLists.txt b/src/devices/systemReady/CMakeLists.txt new file mode 100644 index 00000000000..421d9337474 --- /dev/null +++ b/src/devices/systemReady/CMakeLists.txt @@ -0,0 +1,47 @@ +# SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT) +# SPDX-License-Identifier: BSD-3-Clause + + +yarp_prepare_plugin(systemReady_nws_yarp + CATEGORY device + TYPE SystemReady_nws_yarp + INCLUDE SystemReady_nws_yarp.h + EXTRA_CONFIG + WRAPPER=systemReady_nws_yarp + DEFAULT ON +) + +if(NOT SKIP_systemReady_nws_yarp) + yarp_add_plugin(yarp_systemReady_nws_yarp) + + target_sources(yarp_systemReady_nws_yarp + PRIVATE + SystemReady_nws_yarp.cpp + SystemReady_nws_yarp.h + ) + + target_link_libraries(yarp_systemReady_nws_yarp + PRIVATE + YARP::YARP_os + YARP::YARP_sig + YARP::YARP_dev + ) + list(APPEND YARP_${YARP_PLUGIN_MASTER}_PRIVATE_DEPS + YARP_os + YARP_sig + YARP_dev + ) + + yarp_install( + TARGETS yarp_systemReady_nws_yarp + EXPORT YARP_${YARP_PLUGIN_MASTER} + COMPONENT ${YARP_PLUGIN_MASTER} + LIBRARY DESTINATION ${YARP_DYNAMIC_PLUGINS_INSTALL_DIR} + ARCHIVE DESTINATION ${YARP_STATIC_PLUGINS_INSTALL_DIR} + YARP_INI DESTINATION ${YARP_PLUGIN_MANIFESTS_INSTALL_DIR} + ) + + set(YARP_${YARP_PLUGIN_MASTER}_PRIVATE_DEPS ${YARP_${YARP_PLUGIN_MASTER}_PRIVATE_DEPS} PARENT_SCOPE) + + set_property(TARGET yarp_systemReady_nws_yarp PROPERTY FOLDER "Plugins/Device/NWS") +endif() diff --git a/src/devices/systemReady/SystemReady_nws_yarp.cpp b/src/devices/systemReady/SystemReady_nws_yarp.cpp new file mode 100644 index 00000000000..a4bfb90932a --- /dev/null +++ b/src/devices/systemReady/SystemReady_nws_yarp.cpp @@ -0,0 +1,52 @@ +/* + * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT) + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#include "SystemReady_nws_yarp.h" +#include +#include + +YARP_LOG_COMPONENT(SYSTEMREADY_NWS_YARP, "yarp.devices.SystemReady_nws_yarp") + +SystemReady_nws_yarp::SystemReady_nws_yarp() +{ +} + +bool SystemReady_nws_yarp::open(yarp::os::Searchable &config) +{ + if (config.check("PORT_LIST")) { + // skips the first one since it is PORT_LIST + yarp::os::Bottle port_list = config.findGroup("PORT_LIST").tail(); + for (int index = 0; index < port_list.size(); index++) { + std::string current_port_property = port_list.get(index).toString(); + std::string token; + int pos; + char delimiter = ' '; + pos = current_port_property.find(delimiter); + token = current_port_property.substr(0, pos); + std::string current_port_name = port_list.find(token).asString(); + yarp::os::Port* current_port = new yarp::os::Port; + port_pointers_list.push_back(current_port); + if(!current_port->open(current_port_name)){ + yCError(SYSTEMREADY_NWS_YARP) << "error opening " << current_port_name; + close(); + return false; + } + } + return true; + } + yCError(SYSTEMREADY_NWS_YARP) << "missing PORT_LIST group"; + return false; +} + + +bool SystemReady_nws_yarp::close() +{ + for (auto elem: port_pointers_list){ + elem->close(); + delete elem; + } + port_pointers_list.clear(); + return true; +} diff --git a/src/devices/systemReady/SystemReady_nws_yarp.h b/src/devices/systemReady/SystemReady_nws_yarp.h new file mode 100644 index 00000000000..5b74525cd21 --- /dev/null +++ b/src/devices/systemReady/SystemReady_nws_yarp.h @@ -0,0 +1,61 @@ +/* + * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT) + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef YARP_SYSTEMREADY_NWS_YARP_H +#define YARP_SYSTEMREADY_NWS_YARP_H + +#include +#include +#include + + +/** + * @ingroup dev_impl_network_servers + * + * \section SystemReady_nws_yarp_parameters Device description + * \brief `SystemReady_nws_yarp`: A yarp nws to open port for synchronization: + * it opens the specified ports inside the PORT_LIST group. + * Related to awaitSystemReady_nws_yarp. + * + * Parameters required by this device are: + * | Parameter name | SubParameter | Type | Units | Default Value | Required | Description | + * |:-------------------:|:-----------------------:|:-------:|:--------------:|:-------------:|:-----------------------------: |:-----------------------------------------------------| + * | PORT_NAME | - | group | | | Yes | the group inside which port names are located | + * + * example of xml file with a fake odometer + * + * \code{.unparsed} + * + * + * + * + * + * + * /pippo + * /pluto + * + * + * + * + * \endcode + * + */ + +class SystemReady_nws_yarp : + public yarp::dev::DeviceDriver +{ +public: + SystemReady_nws_yarp(); + + // DeviceDriver + bool open(yarp::os::Searchable ¶ms) override; + bool close() override; + +private: + std::vector port_pointers_list; + +}; + +#endif // YARP_SYSTEMREADY_NWS_YARP_H