Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add stop functionality #89

Open
wants to merge 22 commits into
base: rolling
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 102 additions & 28 deletions micro_ros_agent/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@

cmake_minimum_required(VERSION 3.5)

option(BUILD_SHARED_LIBS "Control shared/static building." ON)
option(UBUILD_AGENT_EXECUTABLE "Control shared/static building." ON)

option(UROSAGENT_GENERATE_PROFILE
"Generates agent.refs according to the .msgs provided in the .repos" OFF
)
Expand Down Expand Up @@ -41,15 +44,26 @@ find_package(ament_cmake_gtest REQUIRED)

find_package(micro_ros_msgs REQUIRED)

add_executable(${PROJECT_NAME}
src/main.cpp
include(GNUInstallDirs)
set(BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Installation directory for binaries")
set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Installation directory for C headers")
set(LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Installation directory for libraries")
set(DATA_INSTALL_DIR ${CMAKE_INSTALL_DATADIR} CACHE PATH "Installation directory for data")

# Set source files
set(SRCS
src/agent/Agent.cpp
src/agent/graph_manager/graph_manager.cpp
src/agent/graph_manager/graph_typesupport.cpp
src/agent/utils/demangle.cpp
)

target_include_directories(${PROJECT_NAME}
# Library
add_library(${PROJECT_NAME} ${SRCS})

target_include_directories(${PROJECT_NAME} BEFORE
PUBLIC
$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
PRIVATE
include
)
Expand All @@ -76,16 +90,9 @@ target_link_libraries(${PROJECT_NAME}

target_compile_options(${PROJECT_NAME}
PRIVATE
$<$<C_COMPILER_ID:GNU>:-Wall>
$<$<C_COMPILER_ID:GNU>:-Wextra>
$<$<C_COMPILER_ID:GNU>:-pedantic>
)

set_target_properties(${PROJECT_NAME} PROPERTIES
CXX_STANDARD
14
CXX_STANDARD_REQUIRED
YES
$<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wall>
$<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wextra>
$<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wpedantic>
)

set_target_properties(${PROJECT_NAME} PROPERTIES
Expand All @@ -95,31 +102,98 @@ set_target_properties(${PROJECT_NAME} PROPERTIES
YES
)

target_compile_options(${PROJECT_NAME}
PRIVATE
$<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wall>
$<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wextra>
$<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wpedantic>
)

ament_export_dependencies(microxrcedds_agent)
# Install agent lib
install(
TARGETS
${PROJECT_NAME}
EXPORT
${PROJECT_NAME}Targets
RUNTIME DESTINATION
${BIN_INSTALL_DIR}
LIBRARY DESTINATION
${LIB_INSTALL_DIR}
ARCHIVE DESTINATION
${LIB_INSTALL_DIR}
COMPONENT
libraries
)

ament_package()
# Install includes
install(
DIRECTORY
${PROJECT_SOURCE_DIR}/include/agent
DESTINATION
${INCLUDE_INSTALL_DIR}
FILES_MATCHING
PATTERN "*.hpp"
PATTERN "*.h"
)

# Export library
install(
TARGETS
${PROJECT_NAME}
EXPORT
${PROJECT_NAME}Targets
DESTINATION
lib/${PROJECT_NAME}
${DATA_INSTALL_DIR}/${PROJECT_NAME}/cmake
)

# Package configuration
include(CMakePackageConfigHelpers)

configure_package_config_file(
${PROJECT_SOURCE_DIR}/cmake/Config.cmake.in
${PROJECT_BINARY_DIR}/cmake/config/${PROJECT_NAME}Config.cmake
INSTALL_DESTINATION
${DATA_INSTALL_DIR}/${PROJECT_NAME}/cmake
PATH_VARS
BIN_INSTALL_DIR
INCLUDE_INSTALL_DIR
LIB_INSTALL_DIR
DATA_INSTALL_DIR
)

install(
DIRECTORY
launch
FILES
${PROJECT_BINARY_DIR}/cmake/config/${PROJECT_NAME}Config.cmake
DESTINATION
share/${PROJECT_NAME}
${DATA_INSTALL_DIR}/${PROJECT_NAME}/cmake
)

if(UBUILD_AGENT_EXECUTABLE)
add_executable(micro_ros_agent_bin
${SRCS}
src/main.cpp
)

target_include_directories(micro_ros_agent_bin
PRIVATE
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
)

target_link_libraries(micro_ros_agent_bin ${PROJECT_NAME})

set_target_properties(micro_ros_agent_bin
PROPERTIES OUTPUT_NAME ${PROJECT_NAME})

install(
TARGETS
micro_ros_agent_bin
DESTINATION
lib/${PROJECT_NAME}
)

install(
DIRECTORY
launch
DESTINATION
share/${PROJECT_NAME}
)
endif()

ament_export_dependencies(microxrcedds_agent)

ament_package()

if(UROSAGENT_GENERATE_PROFILE)
set(_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/python")

Expand Down
32 changes: 32 additions & 0 deletions micro_ros_agent/cmake/Config.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima).
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

set(@PROJECT_NAME@_VERSION @PROJECT_VERSION@)

@PACKAGE_INIT@

if(MSVC OR MSVC_IDE)
set_and_check(@PROJECT_NAME@_BIN_DIR "@PACKAGE_BIN_INSTALL_DIR@")
endif()
set_and_check(@PROJECT_NAME@_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@")
set_and_check(@PROJECT_NAME@_LIB_DIR "@PACKAGE_LIB_INSTALL_DIR@")
set_and_check(@PROJECT_NAME@_DATA_DIR "@PACKAGE_DATA_INSTALL_DIR@")

foreach(d @_deps@)
list(GET d 0 _name)
list(GET d 1 _version)
find_package(${_name} ${_version} REQUIRED)
endforeach()

include(${@PROJECT_NAME@_DATA_DIR}/@PROJECT_NAME@/cmake/@[email protected])
29 changes: 23 additions & 6 deletions micro_ros_agent/include/agent/Agent.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,24 +26,41 @@ namespace agent {

class Agent
{
public:

private:
Agent();

~Agent() = default;
~Agent()
{
stop();
}

Agent(const Agent &) = delete;

Agent(Agent &&) = delete;

Agent& operator =(
const Agent &) = delete;

Agent& operator =(
Agent &&) = delete;

public:
static Agent& getInstance();

bool create(
int argc,
char** argv);

void run();

private:
void stop();

private:
bool initialized = false;
eprosima::uxr::AgentInstance& xrce_dds_agent_instance_;
std::map<eprosima::fastdds::dds::DomainId_t, std::shared_ptr<graph_manager::GraphManager>> graph_manager_map_;
std::map<eprosima::fastdds::dds::DomainId_t, graph_manager::GraphManager> graph_manager_map_;

std::shared_ptr<graph_manager::GraphManager> find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id);
graph_manager::GraphManager* find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id);
};

} // namespace agent
Expand Down
49 changes: 36 additions & 13 deletions micro_ros_agent/include/agent/graph_manager/graph_manager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,28 @@ class GraphManager
*/
~GraphManager() = default;

void stop()
{
if (microros_graph_publisher_.joinable())
{
exit = true;
cv_.notify_one();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indent

microros_graph_publisher_.join();
}

subscriber_->delete_datareader(ros_discovery_datareader_);
publisher_->delete_datawriter(ros_to_microros_graph_datawriter_);

participant_->delete_subscriber(subscriber_);
participant_->delete_publisher(publisher_);

// Delete topics
participant_->delete_topic(ros_discovery_topic_);
participant_->delete_topic(ros_to_microros_graph_topic_);

eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->delete_participant(participant_);
}

/**
* @brief Implementation of the notification logic that updates the micro-ROS graph.
*/
Expand Down Expand Up @@ -274,27 +296,28 @@ class GraphManager
std::thread microros_graph_publisher_;
std::mutex mtx_;
std::condition_variable cv_;
volatile bool exit = false;

eprosima::fastdds::dds::DataWriterQos datawriter_qos_;

rmw_dds_common::GraphCache graphCache_;
std::unique_ptr<ParticipantListener> participant_listener_;
std::unique_ptr<DatareaderListener> datareader_listener_;

std::unique_ptr<eprosima::fastdds::dds::TypeSupport> participant_info_typesupport_;
std::unique_ptr<eprosima::fastdds::dds::TypeSupport> microros_graph_info_typesupport_;
std::unique_ptr<eprosima::fastdds::dds::DomainParticipant> participant_;
std::unique_ptr<eprosima::fastdds::dds::Publisher> publisher_;
std::unique_ptr<eprosima::fastdds::dds::Subscriber> subscriber_;
std::unique_ptr<eprosima::fastdds::dds::Topic> ros_discovery_topic_;
std::unique_ptr<eprosima::fastdds::dds::Topic> ros_to_microros_graph_topic_;
std::unique_ptr<eprosima::fastdds::dds::DataWriter> ros_to_microros_graph_datawriter_;
std::unique_ptr<eprosima::fastdds::dds::DataReader> ros_discovery_datareader_;

ParticipantListener participant_listener_;
DatareaderListener datareader_listener_;

eprosima::fastdds::dds::TypeSupport participant_info_typesupport_;
eprosima::fastdds::dds::TypeSupport microros_graph_info_typesupport_;
eprosima::fastdds::dds::DomainParticipant* participant_;
eprosima::fastdds::dds::Publisher* publisher_;
eprosima::fastdds::dds::Subscriber* subscriber_;
eprosima::fastdds::dds::Topic* ros_discovery_topic_;
eprosima::fastdds::dds::Topic* ros_to_microros_graph_topic_;
eprosima::fastdds::dds::DataWriter* ros_to_microros_graph_datawriter_;
eprosima::fastdds::dds::DataReader* ros_discovery_datareader_;
// Store a auxiliary publishers and datawriter for each participant created in micro-ROS
std::map<
const eprosima::fastdds::dds::DomainParticipant*,
std::unique_ptr<eprosima::fastdds::dds::DataWriter>
eprosima::fastdds::dds::DataWriter*
> micro_ros_graph_datawriters_;
};

Expand Down
37 changes: 26 additions & 11 deletions micro_ros_agent/src/agent/Agent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,22 @@ Agent::Agent()
{
}

Agent& Agent::getInstance()
{
static Agent instance;
return instance;
}

bool Agent::create(
int argc,
char** argv)
{
bool result = xrce_dds_agent_instance_.create(argc, argv);
if (result)

if (result && !initialized)
{
initialized = true;

/**
* Add CREATE_PARTICIPANT callback.
*/
Expand Down Expand Up @@ -173,23 +182,29 @@ bool Agent::create(

void Agent::run()
{
return xrce_dds_agent_instance_.run();
xrce_dds_agent_instance_.run();
}

std::shared_ptr<graph_manager::GraphManager> Agent::find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id)
void Agent::stop()
{
xrce_dds_agent_instance_.stop();

auto it = graph_manager_map_.find(domain_id);
for (auto & element : graph_manager_map_)
{
element.second.stop();
}

graph_manager_map_.clear();
}

graph_manager::GraphManager* Agent::find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id)
{
auto it = graph_manager_map_.find(domain_id);

if (it != graph_manager_map_.end()) {
return it->second;
return &it->second;
}else{
return graph_manager_map_.insert(
std::make_pair(
domain_id,
std::make_shared<graph_manager::GraphManager>(domain_id)
)
).first->second;
return &graph_manager_map_.emplace(domain_id, domain_id).first->second;
}
}

Expand Down
Loading