99#include <stdio.h>
1010#include <unistd.h>
1111
12- #define RCCHECK (fn ) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){printf("Failed status on line %d: %d. Aborting.\n",__LINE__,(int)temp_rc); return 1;}}
13- #define RCSOFTCHECK (fn ) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){printf("Failed status on line %d: %d. Continuing.\n",__LINE__,(int)temp_rc);}}
12+ #define RCCHECK (fn ) {rcl_ret_t temp_rc = fn; if ((temp_rc != RCL_RET_OK)) {printf( \
13+ "Failed status on line %d: %d. Aborting.\n", __LINE__, (int)temp_rc); return 1;}}
14+ #define RCSOFTCHECK (fn ) {rcl_ret_t temp_rc = fn; if ((temp_rc != RCL_RET_OK)) {printf( \
15+ "Failed status on line %d: %d. Continuing.\n", __LINE__, (int)temp_rc);}}
1416
1517rcl_publisher_t publisher ;
1618rclc_parameter_server_t param_server ;
@@ -20,77 +22,104 @@ std_msgs__msg__Int32 msg;
2022
2123void timer_callback (rcl_timer_t * timer , int64_t last_call_time )
2224{
23- (void ) last_call_time ;
24- (void ) timer ;
25+ (void ) last_call_time ;
26+ (void ) timer ;
2527
26- if (publish )
27- {
28- RCSOFTCHECK (rcl_publish (& publisher , & msg , NULL ));
29- printf ("Sent: %d\n" , msg .data );
28+ if (publish ) {
29+ RCSOFTCHECK (rcl_publish (& publisher , & msg , NULL ));
30+ printf ("Sent: %d\n" , msg .data );
3031
31- msg .data ++ ;
32- }
32+ msg .data ++ ;
33+ }
3334}
3435
35- void on_parameter_changed (Parameter * param )
36+ bool on_parameter_changed (const Parameter * old_param , const Parameter * new_param , void * context )
3637{
37- if (strcmp (param -> name .data , "publish_toogle" ) == 0 && param -> value .type == RCLC_PARAMETER_BOOL )
38- {
39- publish = param -> value .bool_value ;
40- printf ("Publish %s\n" , (publish ) ? "ON" : "OFF" );
41- }
42- else if (strcmp (param -> name .data , "publish_rate_ms" ) == 0 && param -> value .type == RCLC_PARAMETER_INT )
43- {
44- int64_t old ;
45- RCSOFTCHECK (rcl_timer_exchange_period (& timer , RCL_MS_TO_NS (param -> value .integer_value ), & old ));
46- printf ("Publish rate %ld ms\n" , param -> value .integer_value );
47- }
38+ (void ) context ;
39+
40+ if (old_param == NULL && new_param == NULL ) {
41+ printf ("Callback error, both parameters are NULL\n" );
42+ return false;
43+ }
44+
45+ bool ret = true;
46+ if (new_param == NULL ) {
47+ printf ("Delete parameter %s rejected\n" , old_param -> name .data );
48+ ret = false;
49+ } else if (strcmp (
50+ new_param -> name .data ,
51+ "publish_toogle" ) == 0 && new_param -> value .type == RCLC_PARAMETER_BOOL )
52+ {
53+ publish = new_param -> value .bool_value ;
54+ printf ("Publish %s\n" , (publish ) ? "ON" : "OFF" );
55+ } else if (strcmp (
56+ new_param -> name .data ,
57+ "publish_rate_ms" ) == 0 && new_param -> value .type == RCLC_PARAMETER_INT )
58+ {
59+ int64_t old ;
60+ RCSOFTCHECK (rcl_timer_exchange_period (& timer , RCL_MS_TO_NS (new_param -> value .integer_value ), & old ));
61+ printf ("Publish rate %ld ms\n" , new_param -> value .integer_value );
62+ }
63+
64+ return ret ;
4865}
4966
5067int main ()
5168{
52- rcl_allocator_t allocator = rcl_get_default_allocator ();
53- rclc_support_t support ;
54-
55- // create init_options
56- RCCHECK (rclc_support_init (& support , 0 , NULL , & allocator ));
57-
58- // create node
59- rcl_node_t node ;
60- RCCHECK (rclc_node_init_default (& node , "micro_ros_node" , "" , & support ));
61-
62- // create publisher
63- RCCHECK (rclc_publisher_init_default (
64- & publisher ,
65- & node ,
66- ROSIDL_GET_MSG_TYPE_SUPPORT (std_msgs , msg , Int32 ),
67- "micro_ros_pub" ));
68-
69- // Create parameter service
70- rclc_parameter_server_init_default (& param_server , & node );
71-
72- // create timer,
73- RCCHECK (rclc_timer_init_default (
74- & timer ,
75- & support ,
76- RCL_MS_TO_NS (1000 ),
77- timer_callback ));
78-
79- // create executor
80- rclc_executor_t executor = rclc_executor_get_zero_initialized_executor ();
81- RCCHECK (rclc_executor_init (& executor , & support .context , RCLC_PARAMETER_EXECUTOR_HANDLES_NUMBER + 1 , & allocator ));
82- RCCHECK (rclc_executor_add_parameter_server (& executor , & param_server , on_parameter_changed ));
83- RCCHECK (rclc_executor_add_timer (& executor , & timer ));
84-
85- // Add parameters
86- rclc_add_parameter (& param_server , "publish_toogle" , RCLC_PARAMETER_BOOL );
87- rclc_add_parameter (& param_server , "publish_rate_ms" , RCLC_PARAMETER_INT );
88-
89- rclc_parameter_set_bool (& param_server , "publish_toogle" , true);
90- rclc_parameter_set_int (& param_server , "publish_rate_ms" , 1000 );
91-
92- rclc_executor_spin (& executor );
93-
94- RCCHECK (rcl_publisher_fini (& publisher , & node ));
95- RCCHECK (rcl_node_fini (& node ));
69+ rcl_allocator_t allocator = rcl_get_default_allocator ();
70+ rclc_support_t support ;
71+
72+ // create init_options
73+ RCCHECK (rclc_support_init (& support , 0 , NULL , & allocator ));
74+
75+ // create node
76+ rcl_node_t node ;
77+ RCCHECK (rclc_node_init_default (& node , "micro_ros_node" , "" , & support ));
78+
79+ // create publisher
80+ RCCHECK (
81+ rclc_publisher_init_default (
82+ & publisher ,
83+ & node ,
84+ ROSIDL_GET_MSG_TYPE_SUPPORT (std_msgs , msg , Int32 ),
85+ "micro_ros_pub" ));
86+
87+ // Create parameter service
88+ rclc_parameter_server_init_default (& param_server , & node );
89+
90+ // create timer,
91+ RCCHECK (
92+ rclc_timer_init_default (
93+ & timer ,
94+ & support ,
95+ RCL_MS_TO_NS (1000 ),
96+ timer_callback ));
97+
98+ // create executor
99+ rclc_executor_t executor = rclc_executor_get_zero_initialized_executor ();
100+ RCCHECK (
101+ rclc_executor_init (
102+ & executor , & support .context ,
103+ RCLC_EXECUTOR_PARAMETER_SERVER_HANDLES + 1 , & allocator ));
104+ RCCHECK (rclc_executor_add_parameter_server (& executor , & param_server , on_parameter_changed ));
105+ RCCHECK (rclc_executor_add_timer (& executor , & timer ));
106+
107+ // Add parameters
108+ rclc_add_parameter (& param_server , "publish_toogle" , RCLC_PARAMETER_BOOL );
109+ rclc_add_parameter (& param_server , "publish_rate_ms" , RCLC_PARAMETER_INT );
110+
111+ // Add parameters constraints
112+ rclc_add_parameter_description (& param_server , "publish_toogle" , "Publish ON/OFF parameter" , "" );
113+ rclc_add_parameter_description (
114+ & param_server , "publish_rate_ms" , "Publish rate parameter" ,
115+ "Unit: milliseconds" );
116+
117+ // Set parameter initial values
118+ rclc_parameter_set_bool (& param_server , "publish_toogle" , true);
119+ rclc_parameter_set_int (& param_server , "publish_rate_ms" , 1000 );
120+
121+ rclc_executor_spin (& executor );
122+
123+ RCCHECK (rcl_publisher_fini (& publisher , & node ));
124+ RCCHECK (rcl_node_fini (& node ));
96125}
0 commit comments