1+ #include <string.h>
2+ #include <stdio.h>
3+ #include <unistd.h>
4+
5+ #include "freertos/FreeRTOS.h"
6+ #include "freertos/task.h"
7+ #include "esp_log.h"
8+ #include "esp_system.h"
9+
10+ #include <uros_network_interfaces.h>
11+ #include <rcl/rcl.h>
12+ #include <rcl/error_handling.h>
13+ #include <rclc/rclc.h>
14+ #include <rclc/executor.h>
15+ #include <rclc_parameter/rclc_parameter.h>
16+
17+ #include <rmw_microros/rmw_microros.h>
18+ #include <uxr/client/config.h>
19+
20+ #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);vTaskDelete(NULL);}}
21+ #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);}}
22+
23+ rclc_parameter_server_t param_server ;
24+
25+ void timer_callback (rcl_timer_t * timer , int64_t last_call_time )
26+ {
27+ (void ) timer ;
28+ (void ) last_call_time ;
29+
30+ int value ;
31+ rclc_parameter_get_int (& param_server , "param2" , & value );
32+ value ++ ;
33+ rclc_parameter_set_int (& param_server , "param2" , (int64_t ) value );
34+ }
35+
36+ void on_parameter_changed (Parameter * param )
37+ {
38+ printf ("Parameter %s modified." , param -> name .data );
39+ switch (param -> value .type )
40+ {
41+ case RCLC_PARAMETER_BOOL :
42+ printf (" New value: %d (bool)" , param -> value .bool_value );
43+ break ;
44+ case RCLC_PARAMETER_INT :
45+ printf (" New value: %lld (int)" , param -> value .integer_value );
46+ break ;
47+ case RCLC_PARAMETER_DOUBLE :
48+ printf (" New value: %f (double)" , param -> value .double_value );
49+ break ;
50+ default :
51+ break ;
52+ }
53+ printf ("\n" );
54+ }
55+
56+ void micro_ros_task (void * arg )
57+ {
58+
59+ rcl_ret_t rc ;
60+ rcl_allocator_t allocator = rcl_get_default_allocator ();
61+ rclc_support_t support ;
62+
63+ rcl_init_options_t init_options = rcl_get_zero_initialized_init_options ();
64+ RCCHECK (rcl_init_options_init (& init_options , allocator ));
65+ rmw_init_options_t * rmw_options = rcl_init_options_get_rmw_init_options (& init_options );
66+
67+ // Static Agent IP and port can be used instead of autodisvery.
68+ RCCHECK (rmw_uros_options_set_udp_address (CONFIG_MICRO_ROS_AGENT_IP , CONFIG_MICRO_ROS_AGENT_PORT , rmw_options ));
69+
70+ // create init_options
71+ RCCHECK (rclc_support_init_with_options (& support , 0 , NULL , & init_options , & allocator ));
72+
73+ // Create node
74+ rcl_node_t node ;
75+ rclc_node_init_default (& node , "esp32_param_node" , "" , & support );
76+
77+ // Create parameter service
78+ rclc_parameter_server_init_default (& param_server , & node );
79+
80+ // create timer,
81+ rcl_timer_t timer ;
82+ rclc_timer_init_default (
83+ & timer ,
84+ & support ,
85+ RCL_MS_TO_NS (1000 ),
86+ timer_callback );
87+
88+ // Create executor
89+ rclc_executor_t executor ;
90+ rclc_executor_init (& executor , & support .context , RCLC_PARAMETER_EXECUTOR_HANDLES_NUMBER + 1 , & allocator );
91+ rclc_executor_add_parameter_server (& executor , & param_server , on_parameter_changed );
92+ rclc_executor_add_timer (& executor , & timer );
93+
94+ // Add parameters
95+ rclc_add_parameter (& param_server , "param1" , RCLC_PARAMETER_BOOL );
96+ rclc_add_parameter (& param_server , "param2" , RCLC_PARAMETER_INT );
97+ rclc_add_parameter (& param_server , "param3" , RCLC_PARAMETER_DOUBLE );
98+
99+ rclc_parameter_set_bool (& param_server , "param1" , false);
100+ rclc_parameter_set_int (& param_server , "param2" , 10 );
101+ rclc_parameter_set_double (& param_server , "param3" , 0.01 );
102+
103+ bool param1 ;
104+ int param2 ;
105+ double param3 ;
106+
107+ rclc_parameter_get_bool (& param_server , "param1" , & param1 );
108+ rclc_parameter_get_int (& param_server , "param2" , & param2 );
109+ rclc_parameter_get_double (& param_server , "param3" , & param3 );
110+
111+ while (1 ){
112+ rclc_executor_spin_some (& executor , RCL_MS_TO_NS (100 ));
113+ usleep (100000 );
114+ }
115+
116+ // clean up
117+ rc = rclc_executor_fini (& executor );
118+ rc += rclc_parameter_server_fini (& param_server , & node );
119+ rc += rcl_node_fini (& node );
120+
121+ if (rc != RCL_RET_OK ) {
122+ printf ("Error while cleaning up!\n" );
123+ }
124+
125+ vTaskDelete (NULL );
126+ }
127+
128+ void app_main (void )
129+ {
130+ #ifdef UCLIENT_PROFILE_UDP
131+ // Start the networking if required
132+ ESP_ERROR_CHECK (uros_network_interface_initialize ());
133+ #endif // UCLIENT_PROFILE_UDP
134+
135+ //pin micro-ros task in APP_CPU to make PRO_CPU to deal with wifi:
136+ xTaskCreate (micro_ros_task ,
137+ "uros_task" ,
138+ CONFIG_MICRO_ROS_APP_STACK ,
139+ NULL ,
140+ CONFIG_MICRO_ROS_APP_TASK_PRIO ,
141+ NULL );
142+ }
0 commit comments