1111#pragma once
1212
1313#include < chrono>
14+ #include < map>
1415#include < memory>
1516#include < string>
16- #include < unordered_map>
1717#include < vector>
1818
19- #include < unistd.h>
20-
21- #include " diagnostic_msgs/msg/key_value.hpp"
2219#include " rclcpp/rclcpp.hpp"
2320#include " ros2_medkit_msgs/msg/medkit_discovery_hint.hpp"
2421
@@ -34,97 +31,15 @@ class BeaconHelper
3431 std::string display_name;
3532 std::string component_id;
3633 std::vector<std::string> function_ids;
37- std::unordered_map <std::string, std::string> metadata;
34+ std::map <std::string, std::string> metadata;
3835 };
3936
40- BeaconHelper (rclcpp::Node * node, const Config & config)
41- : node_(node), config_(config)
42- {
43- node_->declare_parameter (" beacon_mode" , " none" );
44- mode_ = node_->get_parameter (" beacon_mode" ).as_string ();
45-
46- // Cache process info (constant during lifetime)
47- pid_ = static_cast <uint32_t >(getpid ());
48- char hostname_buf[256 ];
49- hostname_buf[sizeof (hostname_buf) - 1 ] = ' \0 ' ;
50- if (gethostname (hostname_buf, sizeof (hostname_buf) - 1 ) == 0 ) {
51- hostname_ = hostname_buf;
52- }
53-
54- if (mode_ == " topic" ) {
55- init_topic_beacon ();
56- } else if (mode_ == " param" ) {
57- init_param_beacon ();
58- } else if (mode_ != " none" ) {
59- RCLCPP_WARN (
60- node_->get_logger (),
61- " Unknown beacon_mode '%s', expected none/topic/param. Beacon disabled." ,
62- mode_.c_str ());
63- }
64- }
37+ BeaconHelper (rclcpp::Node * node, const Config & config);
6538
6639private:
67- void init_topic_beacon ()
68- {
69- beacon_pub_ = node_->create_publisher <ros2_medkit_msgs::msg::MedkitDiscoveryHint>(
70- " /ros2_medkit/discovery" , 10 );
71-
72- beacon_timer_ = node_->create_wall_timer (
73- std::chrono::seconds (5 ),
74- [this ]() { publish_beacon (); });
75-
76- // Publish immediately on startup
77- publish_beacon ();
78-
79- RCLCPP_INFO (
80- node_->get_logger (), " Topic beacon enabled (entity: %s)" ,
81- config_.entity_id .c_str ());
82- }
83-
84- void init_param_beacon ()
85- {
86- node_->declare_parameter (" ros2_medkit.discovery.entity_id" , config_.entity_id );
87- node_->declare_parameter (" ros2_medkit.discovery.display_name" , config_.display_name );
88- node_->declare_parameter (" ros2_medkit.discovery.component_id" , config_.component_id );
89- node_->declare_parameter (" ros2_medkit.discovery.function_ids" , config_.function_ids );
90- node_->declare_parameter (
91- " ros2_medkit.discovery.process_id" , static_cast <int >(pid_));
92- node_->declare_parameter (" ros2_medkit.discovery.process_name" , node_->get_name ());
93-
94- if (!hostname_.empty ()) {
95- node_->declare_parameter (" ros2_medkit.discovery.hostname" , hostname_);
96- }
97-
98- for (const auto & [key, value] : config_.metadata ) {
99- node_->declare_parameter (" ros2_medkit.discovery.metadata." + key, value);
100- }
101-
102- RCLCPP_INFO (
103- node_->get_logger (), " Parameter beacon enabled (entity: %s)" ,
104- config_.entity_id .c_str ());
105- }
106-
107- void publish_beacon ()
108- {
109- auto msg = ros2_medkit_msgs::msg::MedkitDiscoveryHint ();
110- msg.entity_id = config_.entity_id ;
111- msg.display_name = config_.display_name ;
112- msg.component_id = config_.component_id ;
113- msg.function_ids = config_.function_ids ;
114- msg.process_id = pid_;
115- msg.process_name = node_->get_name ();
116- msg.hostname = hostname_;
117- msg.stamp = node_->now ();
118-
119- for (const auto & [key, value] : config_.metadata ) {
120- diagnostic_msgs::msg::KeyValue kv;
121- kv.key = key;
122- kv.value = value;
123- msg.metadata .push_back (kv);
124- }
125-
126- beacon_pub_->publish (msg);
127- }
40+ void init_topic_beacon ();
41+ void init_param_beacon ();
42+ void publish_beacon ();
12843
12944 rclcpp::Node * node_;
13045 Config config_;
0 commit comments