|
| 1 | +#include <micro_ros_arduino.h> |
| 2 | +#include <example_interfaces/srv/add_two_ints.h> |
| 3 | +#include <stdio.h> |
| 4 | +#include <rcl/error_handling.h> |
| 5 | +#include <rclc/rclc.h> |
| 6 | +#include <rclc/executor.h> |
| 7 | +#include <std_msgs/msg/int64.h> |
| 8 | + |
| 9 | +rcl_init_options_t options; |
| 10 | +rcl_node_options_t node_ops; |
| 11 | +rcl_node_t node; |
| 12 | +rclc_support_t support; |
| 13 | +rcl_allocator_t allocator; |
| 14 | +rclc_executor_t executor; |
| 15 | + |
| 16 | +rcl_service_options_t service_options; |
| 17 | +rcl_service_t serv; |
| 18 | +const rosidl_service_type_support_t * service_type_support; |
| 19 | +rcl_wait_set_t wait_set; |
| 20 | +rmw_request_id_t req_id; |
| 21 | +example_interfaces__srv__AddTwoInts_Response res; |
| 22 | +example_interfaces__srv__AddTwoInts_Request req; |
| 23 | + |
| 24 | +const char * service_name = "/add_two_ints"; |
| 25 | + |
| 26 | +void setup() { |
| 27 | + delay(1000); |
| 28 | + |
| 29 | + allocator = rcl_get_default_allocator(); |
| 30 | + |
| 31 | + options = rcl_get_zero_initialized_init_options(); |
| 32 | + rcl_init_options_init(&options, rcl_get_default_allocator()); |
| 33 | + |
| 34 | + rclc_support_init(&support, 0, NULL, &allocator); |
| 35 | + |
| 36 | + node_ops = rcl_node_get_default_options(); |
| 37 | + node = rcl_get_zero_initialized_node(); |
| 38 | + rclc_node_init_default(&node, "micro_ros_service_server_node", "", &support); |
| 39 | + |
| 40 | + // init server |
| 41 | + service_options = rcl_service_get_default_options(); |
| 42 | + serv = rcl_get_zero_initialized_service(); |
| 43 | + service_type_support = ROSIDL_GET_SRV_TYPE_SUPPORT(example_interfaces, srv, AddTwoInts); |
| 44 | + rcl_service_init(&serv, &node, service_type_support, service_name, &service_options); |
| 45 | + wait_set = rcl_get_zero_initialized_wait_set(); |
| 46 | + rcl_wait_set_init(&wait_set, 0, 0, 0, 1, 1, 0, &support.context, rcl_get_default_allocator()); |
| 47 | + |
| 48 | + executor = rclc_executor_get_zero_initialized_executor(); |
| 49 | + rclc_executor_init(&executor, &support.context, 1, &allocator); |
| 50 | +} |
| 51 | + |
| 52 | + |
| 53 | +void loop() { |
| 54 | + delay(100); |
| 55 | + rcl_wait_set_clear(&wait_set); |
| 56 | + |
| 57 | + size_t index; |
| 58 | + rcl_wait_set_add_service(&wait_set, &serv, &index); |
| 59 | + |
| 60 | + rcl_wait(&wait_set, RCL_MS_TO_NS(100)); |
| 61 | + for (size_t i = 0; i < wait_set.size_of_services; i++) { |
| 62 | + if (wait_set.services[i]) { |
| 63 | + example_interfaces__srv__AddTwoInts_Request__init(&req); |
| 64 | + |
| 65 | + rcl_take_request(&serv, &req_id, &req); |
| 66 | + |
| 67 | + example_interfaces__srv__AddTwoInts_Response__init(&res); |
| 68 | + |
| 69 | + res.sum = req.a + req.b; |
| 70 | + rcl_send_response(&serv, &req_id, &res); |
| 71 | + } |
| 72 | + } |
| 73 | +} |
0 commit comments