mirror of
https://github.com/micro-ROS/micro-ROS-Agent.git
synced 2026-09-06 09:55:15 +02:00
Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8a1b0e54da | ||
|
|
e64e17aa25 | ||
|
|
39d8ed0ba2 | ||
|
|
37566d1c74 | ||
|
|
015343c4c8 |
@@ -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/@PROJECT_NAME@Targets.cmake)
|
||||
@@ -32,20 +32,103 @@ public:
|
||||
|
||||
~Agent() = default;
|
||||
|
||||
/**
|
||||
* @brief Agent class shall not be copy constructible.
|
||||
*/
|
||||
UXR_AGENT_EXPORT Agent(
|
||||
const Agent &) = delete;
|
||||
|
||||
UXR_AGENT_EXPORT Agent(
|
||||
Agent &&) = delete;
|
||||
|
||||
/**
|
||||
* @brief Agent class shall not be copy assignable.
|
||||
*/
|
||||
UXR_AGENT_EXPORT Agent& operator =(
|
||||
const Agent &) = delete;
|
||||
|
||||
UXR_AGENT_EXPORT Agent& operator =(
|
||||
Agent &&) = delete;
|
||||
|
||||
static Agent& getInstance()
|
||||
{
|
||||
static Agent instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
bool create(
|
||||
int argc,
|
||||
char** argv);
|
||||
|
||||
void run();
|
||||
|
||||
private:
|
||||
void stop();
|
||||
|
||||
void add_callbacks();
|
||||
|
||||
private:
|
||||
eprosima::uxr::AgentInstance& xrce_dds_agent_instance_;
|
||||
std::map<eprosima::fastdds::dds::DomainId_t, std::shared_ptr<graph_manager::GraphManager>> graph_manager_map_;
|
||||
|
||||
std::shared_ptr<graph_manager::GraphManager> find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id);
|
||||
bool started = false;
|
||||
};
|
||||
|
||||
template<typename AgentType>
|
||||
class AgentAPI
|
||||
{
|
||||
public:
|
||||
AgentAPI()
|
||||
: agent_instance_(agent_instance_.getInstance())
|
||||
{};
|
||||
|
||||
~AgentAPI() = default;
|
||||
|
||||
void create(uint16_t port)
|
||||
{
|
||||
xrce_dds_agent_instance_API.configure(port);
|
||||
}
|
||||
|
||||
void create(std::string dev, const std::string baudrate);
|
||||
void create(std::vector<std::string> devs, const std::string baudrate);
|
||||
void create(const std::string baudrate);
|
||||
|
||||
void set_verbose_level(uint8_t verbose_level)
|
||||
{
|
||||
xrce_dds_agent_instance_API.set_verbose_level(verbose_level);
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
agent_instance_.add_callbacks();
|
||||
xrce_dds_agent_instance_API.run();
|
||||
}
|
||||
|
||||
void stop()
|
||||
{
|
||||
xrce_dds_agent_instance_API.stop();
|
||||
}
|
||||
|
||||
private:
|
||||
Agent& agent_instance_;
|
||||
eprosima::uxr::AgentInstanceAPI<AgentType> xrce_dds_agent_instance_API;
|
||||
};
|
||||
|
||||
template<> inline UXR_AGENT_EXPORT void AgentAPI<eprosima::uxr::TermiosAgent>::create(std::string dev, const std::string baudrate)
|
||||
{
|
||||
xrce_dds_agent_instance_API.configure(dev, baudrate);
|
||||
}
|
||||
|
||||
template<> inline UXR_AGENT_EXPORT void AgentAPI<eprosima::uxr::MultiTermiosAgent>::create(std::vector<std::string> devs, const std::string baudrate)
|
||||
{
|
||||
xrce_dds_agent_instance_API.configure(devs, baudrate);
|
||||
|
||||
}
|
||||
|
||||
template<> inline UXR_AGENT_EXPORT void AgentAPI<eprosima::uxr::PseudoTerminalAgent>::create(const std::string baudrate)
|
||||
{
|
||||
xrce_dds_agent_instance_API.configure(baudrate);
|
||||
}
|
||||
|
||||
} // namespace agent
|
||||
} // namespace uros
|
||||
#endif // _UROS_AGENT_AGENT_HPP
|
||||
@@ -80,7 +80,16 @@ public:
|
||||
/**
|
||||
* @brief Default destructor.
|
||||
*/
|
||||
~GraphManager() = default;
|
||||
~GraphManager()
|
||||
{
|
||||
exit = true;
|
||||
cv_.notify_one();
|
||||
|
||||
if (microros_graph_publisher_.joinable())
|
||||
{
|
||||
microros_graph_publisher_.join();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Implementation of the notification logic that updates the micro-ROS graph.
|
||||
@@ -298,6 +307,7 @@ private:
|
||||
std::string& node_name,
|
||||
std::string& node_namespace);
|
||||
|
||||
bool exit = false;
|
||||
eprosima::fastdds::dds::DomainId_t domain_id_;
|
||||
bool graph_changed_;
|
||||
bool display_on_change_;
|
||||
|
||||
@@ -29,8 +29,12 @@ bool Agent::create(
|
||||
int argc,
|
||||
char** argv)
|
||||
{
|
||||
bool result = xrce_dds_agent_instance_.create(argc, argv);
|
||||
if (result)
|
||||
return xrce_dds_agent_instance_.create(argc, argv);
|
||||
}
|
||||
|
||||
void Agent::add_callbacks()
|
||||
{
|
||||
if (!started)
|
||||
{
|
||||
/**
|
||||
* Add CREATE_PARTICIPANT callback.
|
||||
@@ -100,7 +104,6 @@ bool Agent::create(
|
||||
const eprosima::fastdds::dds::DomainParticipant* participant,
|
||||
const eprosima::fastdds::dds::DataWriter* datawriter) -> void
|
||||
{
|
||||
|
||||
auto graph_manager_ = find_or_create_graph_manager(participant->get_domain_id());
|
||||
|
||||
// TODO(jamoralp): Workaround for Fast-DDS bug #9977. Remove when fixed
|
||||
@@ -166,9 +169,9 @@ bool Agent::create(
|
||||
eprosima::uxr::Middleware::Kind::FASTDDS,
|
||||
eprosima::uxr::middleware::CallbackKind::DELETE_DATAREADER,
|
||||
std::move(on_delete_datareader));
|
||||
}
|
||||
|
||||
return result;
|
||||
started = true;
|
||||
}
|
||||
}
|
||||
|
||||
void Agent::run()
|
||||
@@ -176,6 +179,11 @@ void Agent::run()
|
||||
return xrce_dds_agent_instance_.run();
|
||||
}
|
||||
|
||||
void Agent::stop()
|
||||
{
|
||||
return xrce_dds_agent_instance_.stop();
|
||||
}
|
||||
|
||||
std::shared_ptr<graph_manager::GraphManager> Agent::find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id)
|
||||
{
|
||||
|
||||
|
||||
@@ -137,10 +137,15 @@ inline void GraphManager::publish_microros_graph()
|
||||
std::unique_lock<std::mutex> lock(mtx_);
|
||||
cv_.wait(lock, [this]()
|
||||
{
|
||||
return this->graph_changed_;
|
||||
return this->graph_changed_ || exit;
|
||||
});
|
||||
}
|
||||
|
||||
if (exit)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if (display_on_change_)
|
||||
{
|
||||
std::cout << "Updated uros Graph: graph changed" << std::endl;
|
||||
|
||||
Reference in New Issue
Block a user