Skip to content

Commit b3ecd0d

Browse files
authored
Feature/add lognsequence sample (#23)
* Added long sequence pub/sub * Update examples * Update memset * Update strcmp * Minor fix * Renaming
1 parent b6997b5 commit b3ecd0d

7 files changed

Lines changed: 171 additions & 2 deletions

File tree

rcl/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ export_executable(int32_multinode)
4141
export_executable(guard_condition)
4242
export_executable(int32_publisher_subscriber)
4343
export_executable(ping_pong)
44+
export_executable(fragmented_publication)
45+
export_executable(fragmented_subscription)
4446

4547
if(EXISTS ${CMAKE_BINARY_DIR}/temp_install/)
4648
install(

rcl/addtwoints_server/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ int main(int argc, const char * const * argv)
3636
size_t index;
3737
RCSOFTCHECK(rcl_wait_set_add_service(&wait_set, &serv, &index))
3838

39-
RCSOFTCHECK(rcl_wait(&wait_set, RCL_MS_TO_NS(1)))
39+
rcl_wait(&wait_set, RCL_MS_TO_NS(1));
4040
for (size_t i = 0; i < wait_set.size_of_services; i++) {
4141
if (wait_set.services[i]) {
4242
rmw_request_id_t req_id;

rcl/fibonacci_action_server/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ int main(int argc, const char * const * argv)
8484
size_t index;
8585
RCSOFTCHECK(rcl_action_wait_set_add_action_server(&wait_set, &action_server, &index))
8686

87-
RCSOFTCHECK(rcl_wait(&wait_set, RCL_MS_TO_NS(200)))
87+
rcl_wait(&wait_set, RCL_MS_TO_NS(200));
8888

8989
bool is_goal_request_ready = false;
9090
bool is_cancel_request_ready = false;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
cmake_minimum_required(VERSION 3.5)
2+
3+
project(fragmented_publication LANGUAGES C)
4+
5+
find_package(ament_cmake REQUIRED)
6+
find_package(rcl REQUIRED)
7+
find_package(std_msgs REQUIRED)
8+
find_package(rmw_microxrcedds REQUIRED)
9+
10+
add_executable(${PROJECT_NAME} main.c)
11+
12+
ament_target_dependencies(${PROJECT_NAME}
13+
rcl
14+
std_msgs
15+
rmw_microxrcedds
16+
)
17+
18+
install(TARGETS ${PROJECT_NAME}
19+
DESTINATION ${PROJECT_NAME}
20+
)

rcl/fragmented_publication/main.c

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#include <rcl/rcl.h>
2+
#include <rcl/error_handling.h>
3+
#include <std_msgs/msg/string.h>
4+
5+
#include <rmw_uros/options.h>
6+
7+
#include <stdio.h>
8+
#include <unistd.h>
9+
10+
#define ARRAY_LEN 4096
11+
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);}}
14+
15+
int main(int argc, const char * const * argv)
16+
{
17+
rcl_init_options_t options = rcl_get_zero_initialized_init_options();
18+
RCCHECK(rcl_init_options_init(&options, rcl_get_default_allocator()))
19+
20+
rcl_context_t context = rcl_get_zero_initialized_context();
21+
RCCHECK(rcl_init(argc, argv, &options, &context))
22+
23+
rcl_node_options_t node_ops = rcl_node_get_default_options();
24+
25+
rcl_node_t node = rcl_get_zero_initialized_node();
26+
RCCHECK(rcl_node_init(&node, "char_long_sequence_publisher_rcl", "", &context, &node_ops))
27+
28+
rcl_publisher_options_t publisher_ops = rcl_publisher_get_default_options();
29+
rcl_publisher_t publisher = rcl_get_zero_initialized_publisher();
30+
RCCHECK(rcl_publisher_init(&publisher, &node, ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, String), "/char_long_sequence", &publisher_ops))
31+
32+
std_msgs__msg__String msg;
33+
msg.data.data = (char * ) malloc(ARRAY_LEN * sizeof(char));
34+
msg.data.size = 0;
35+
msg.data.capacity = ARRAY_LEN;
36+
37+
// Fill the array with a known sequence
38+
memset(msg.data.data,'z',3500);
39+
msg.data.data[3500] = '\0';
40+
msg.data.size = 3501;
41+
42+
sleep(2); // Sleep a while to ensure DDS matching before sending request
43+
44+
rcl_ret_t rc;
45+
do {
46+
rc = rcl_publish(&publisher, (const void*)&msg, NULL);
47+
if (RCL_RET_OK == rc ) {
48+
printf("Sent %ld array\n", msg.data.size);
49+
}else{
50+
printf("Publishing error %d\n", rc);
51+
}
52+
sleep(1);
53+
} while (true);
54+
55+
RCCHECK(rcl_publisher_fini(&publisher, &node))
56+
RCCHECK(rcl_node_fini(&node))
57+
58+
return 0;
59+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
cmake_minimum_required(VERSION 3.5)
2+
3+
project(fragmented_subscription LANGUAGES C)
4+
5+
find_package(ament_cmake REQUIRED)
6+
find_package(rcl REQUIRED)
7+
find_package(std_msgs REQUIRED)
8+
find_package(rmw_microxrcedds REQUIRED)
9+
10+
add_executable(${PROJECT_NAME} main.c)
11+
12+
ament_target_dependencies(${PROJECT_NAME}
13+
rcl
14+
std_msgs
15+
rmw_microxrcedds
16+
)
17+
18+
install(TARGETS ${PROJECT_NAME}
19+
DESTINATION ${PROJECT_NAME}
20+
)

rcl/fragmented_subscription/main.c

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#include <rcl/rcl.h>
2+
#include <rcl/error_handling.h>
3+
#include <std_msgs/msg/string.h>
4+
5+
#include <rmw_uros/options.h>
6+
7+
#include <stdio.h>
8+
9+
#define ARRAY_LEN 4096
10+
11+
#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;}}
12+
#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);}}
13+
14+
int main(int argc, const char * const * argv)
15+
{
16+
rcl_init_options_t options = rcl_get_zero_initialized_init_options();
17+
RCCHECK(rcl_init_options_init(&options, rcl_get_default_allocator()))
18+
19+
rcl_context_t context = rcl_get_zero_initialized_context();
20+
RCCHECK(rcl_init(argc, argv, &options, &context))
21+
22+
rcl_node_options_t node_ops = rcl_node_get_default_options();
23+
rcl_node_t node = rcl_get_zero_initialized_node();
24+
RCCHECK(rcl_node_init(&node, "char_long_sequence_subscriber_rcl", "", &context, &node_ops))
25+
26+
rcl_subscription_options_t subscription_ops = rcl_subscription_get_default_options();
27+
rcl_subscription_t subscription = rcl_get_zero_initialized_subscription();
28+
RCCHECK(rcl_subscription_init(&subscription, &node, ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, String), "/char_long_sequence", &subscription_ops))
29+
30+
rcl_wait_set_t wait_set = rcl_get_zero_initialized_wait_set();
31+
RCCHECK(rcl_wait_set_init(&wait_set, 1, 0, 0, 0, 0, 0, &context, rcl_get_default_allocator()))
32+
33+
std_msgs__msg__String msg;
34+
35+
msg.data.data = (char * ) malloc(ARRAY_LEN * sizeof(char));
36+
msg.data.size = 0;
37+
msg.data.capacity = ARRAY_LEN;
38+
39+
char test_array[ARRAY_LEN];
40+
memset(test_array,'z',ARRAY_LEN);
41+
42+
do {
43+
RCSOFTCHECK(rcl_wait_set_clear(&wait_set))
44+
45+
size_t index;
46+
RCSOFTCHECK(rcl_wait_set_add_subscription(&wait_set, &subscription, &index))
47+
48+
RCSOFTCHECK(rcl_wait(&wait_set, RCL_MS_TO_NS(1)))
49+
50+
if (wait_set.subscriptions[index]) {
51+
52+
53+
rcl_ret_t rc = rcl_take(wait_set.subscriptions[index], &msg, NULL, NULL);
54+
if (RCL_RET_OK == rc) {
55+
56+
// Check if sequence items matches the know pattern
57+
bool pass_test = strncmp(test_array, msg.data.data, msg.data.size) == 0;
58+
59+
printf("I received an %ld array. Test: [%s]\n", msg.data.size, (pass_test) ? "OK" : "FAIL");
60+
}
61+
}
62+
} while ( true );
63+
64+
RCCHECK(rcl_subscription_fini(&subscription, &node))
65+
RCCHECK(rcl_node_fini(&node))
66+
67+
return 0;
68+
}

0 commit comments

Comments
 (0)