From d97cc5c0ac18f927dd6f882fe489de9a3ba36502 Mon Sep 17 00:00:00 2001 From: lljwork2021 Date: Wed, 9 Sep 2026 18:53:59 +0800 Subject: [PATCH] system/xrcedds: add eProsima Micro XRCE-DDS Add a lightweight Micro XRCE-DDS Client integration with UDP transport support and a publisher example. Signed-off-by: lljwork2021 --- examples/xrcedds/CMakeLists.txt | 38 ++++ examples/xrcedds/HelloWorld.idl | 5 + examples/xrcedds/Kconfig | 29 +++ examples/xrcedds/Make.defs | 25 +++ examples/xrcedds/Makefile | 33 +++ examples/xrcedds/hello_world.c | 66 ++++++ examples/xrcedds/hello_world.h | 58 ++++++ examples/xrcedds/xrcedds_pub_main.c | 225 +++++++++++++++++++++ system/xrcedds/.gitignore | 3 + system/xrcedds/CMakeLists.txt | 88 ++++++++ system/xrcedds/Kconfig | 50 +++++ system/xrcedds/Make.defs | 35 ++++ system/xrcedds/Makefile | 106 ++++++++++ system/xrcedds/include/ucdr/config.h | 42 ++++ system/xrcedds/include/uxr/client/config.h | 61 ++++++ 15 files changed, 864 insertions(+) create mode 100644 examples/xrcedds/CMakeLists.txt create mode 100644 examples/xrcedds/HelloWorld.idl create mode 100644 examples/xrcedds/Kconfig create mode 100644 examples/xrcedds/Make.defs create mode 100644 examples/xrcedds/Makefile create mode 100644 examples/xrcedds/hello_world.c create mode 100644 examples/xrcedds/hello_world.h create mode 100644 examples/xrcedds/xrcedds_pub_main.c create mode 100644 system/xrcedds/.gitignore create mode 100644 system/xrcedds/CMakeLists.txt create mode 100644 system/xrcedds/Kconfig create mode 100644 system/xrcedds/Make.defs create mode 100644 system/xrcedds/Makefile create mode 100644 system/xrcedds/include/ucdr/config.h create mode 100644 system/xrcedds/include/uxr/client/config.h diff --git a/examples/xrcedds/CMakeLists.txt b/examples/xrcedds/CMakeLists.txt new file mode 100644 index 00000000000..af52894a224 --- /dev/null +++ b/examples/xrcedds/CMakeLists.txt @@ -0,0 +1,38 @@ +# ############################################################################## +# apps/examples/xrcedds/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +if(CONFIG_EXAMPLES_XRCEDDS_PUB) + nuttx_add_application( + NAME + ${CONFIG_EXAMPLES_XRCEDDS_PUB_PROGNAME} + SRCS + xrcedds_pub_main.c + hello_world.c + STACKSIZE + ${CONFIG_EXAMPLES_XRCEDDS_PUB_STACKSIZE} + PRIORITY + ${CONFIG_EXAMPLES_XRCEDDS_PUB_PRIORITY} + MODULE + ${CONFIG_EXAMPLES_XRCEDDS_PUB} + DEPENDS + xrcedds) +endif() diff --git a/examples/xrcedds/HelloWorld.idl b/examples/xrcedds/HelloWorld.idl new file mode 100644 index 00000000000..842ab81d93e --- /dev/null +++ b/examples/xrcedds/HelloWorld.idl @@ -0,0 +1,5 @@ +struct HelloWorld +{ + unsigned long index; + string message; +}; diff --git a/examples/xrcedds/Kconfig b/examples/xrcedds/Kconfig new file mode 100644 index 00000000000..3f0117279b0 --- /dev/null +++ b/examples/xrcedds/Kconfig @@ -0,0 +1,29 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +menuconfig EXAMPLES_XRCEDDS_PUB + tristate "XRCEDDS publisher demo" + default n + depends on SYSTEM_XRCEDDS && NET_UDP && NET_IPv4 + ---help--- + Build the PublishHelloWorldClient command. It connects to a + Micro XRCE-DDS Agent through the built-in UDP transport and + publishes HelloWorld samples. + +if EXAMPLES_XRCEDDS_PUB + +config EXAMPLES_XRCEDDS_PUB_PROGNAME + string "Publisher command name" + default "PublishHelloWorldClient" + +config EXAMPLES_XRCEDDS_PUB_PRIORITY + int "Publisher task priority" + default 100 + +config EXAMPLES_XRCEDDS_PUB_STACKSIZE + int "Publisher task stack size" + default 4096 + +endif diff --git a/examples/xrcedds/Make.defs b/examples/xrcedds/Make.defs new file mode 100644 index 00000000000..1c5fbb881a2 --- /dev/null +++ b/examples/xrcedds/Make.defs @@ -0,0 +1,25 @@ +############################################################################ +# apps/examples/xrcedds/Make.defs +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +ifneq ($(CONFIG_EXAMPLES_XRCEDDS_PUB),) +CONFIGURED_APPS += $(APPDIR)/examples/xrcedds +endif diff --git a/examples/xrcedds/Makefile b/examples/xrcedds/Makefile new file mode 100644 index 00000000000..acf1e7a6f32 --- /dev/null +++ b/examples/xrcedds/Makefile @@ -0,0 +1,33 @@ +############################################################################ +# apps/examples/xrcedds/Makefile +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(APPDIR)/Make.defs + +PROGNAME = $(CONFIG_EXAMPLES_XRCEDDS_PUB_PROGNAME) +PRIORITY = $(CONFIG_EXAMPLES_XRCEDDS_PUB_PRIORITY) +STACKSIZE = $(CONFIG_EXAMPLES_XRCEDDS_PUB_STACKSIZE) +MODULE = $(CONFIG_EXAMPLES_XRCEDDS_PUB) + +MAINSRC = xrcedds_pub_main.c +CSRCS += hello_world.c + +include $(APPDIR)/Application.mk diff --git a/examples/xrcedds/hello_world.c b/examples/xrcedds/hello_world.c new file mode 100644 index 00000000000..51e31c4dc7e --- /dev/null +++ b/examples/xrcedds/hello_world.c @@ -0,0 +1,66 @@ +/**************************************************************************** + * apps/examples/xrcedds/hello_world.c + * + * Implements the HelloWorld type described by HelloWorld.idl. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include "hello_world.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +bool hello_world_serialize_topic(struct ucdrBuffer *writer, + const struct hello_world_s *topic) +{ + ucdr_serialize_uint32_t(writer, topic->index); + ucdr_serialize_string(writer, topic->message); + + return !writer->error; +} + +bool hello_world_deserialize_topic(struct ucdrBuffer *reader, + struct hello_world_s *topic) +{ + ucdr_deserialize_uint32_t(reader, &topic->index); + ucdr_deserialize_string(reader, topic->message, 255); + + return !reader->error; +} + +uint32_t hello_world_topic_size(const struct hello_world_s *topic, + uint32_t size) +{ + uint32_t previous_size = size; + + size += ucdr_alignment(size, 4) + 4; + size += ucdr_alignment(size, 4) + 4 + strlen(topic->message) + 1; + + return size - previous_size; +} diff --git a/examples/xrcedds/hello_world.h b/examples/xrcedds/hello_world.h new file mode 100644 index 00000000000..07cb78b3e5a --- /dev/null +++ b/examples/xrcedds/hello_world.h @@ -0,0 +1,58 @@ +/**************************************************************************** + * apps/examples/xrcedds/hello_world.h + * + * Declares the HelloWorld type described by HelloWorld.idl. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __APPS_EXAMPLES_XRCEDDS_HELLO_WORLD_H +#define __APPS_EXAMPLES_XRCEDDS_HELLO_WORLD_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +struct hello_world_s +{ + uint32_t index; + char message[255]; +}; + +struct ucdrBuffer; + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +bool hello_world_serialize_topic(struct ucdrBuffer *writer, + const struct hello_world_s *topic); +bool hello_world_deserialize_topic(struct ucdrBuffer *reader, + struct hello_world_s *topic); +uint32_t hello_world_topic_size(const struct hello_world_s *topic, + uint32_t size); + +#endif /* __APPS_EXAMPLES_XRCEDDS_HELLO_WORLD_H */ diff --git a/examples/xrcedds/xrcedds_pub_main.c b/examples/xrcedds/xrcedds_pub_main.c new file mode 100644 index 00000000000..540c753ad61 --- /dev/null +++ b/examples/xrcedds/xrcedds_pub_main.c @@ -0,0 +1,225 @@ +/**************************************************************************** + * apps/examples/xrcedds/xrcedds_pub_main.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "hello_world.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define STREAM_HISTORY 8 +#define BUFFER_SIZE (UXR_CONFIG_UDP_TRANSPORT_MTU * STREAM_HISTORY) + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * main + ****************************************************************************/ + +int main(int argc, FAR char *argv[]) +{ + uxrUDPTransport transport; + uxrSession session; + uxrStreamId reliable_out; + uint8_t out_stream_buffer[BUFFER_SIZE]; + uint8_t in_stream_buffer[BUFFER_SIZE]; + uxrObjectId participant_id; + uxrObjectId topic_id; + uxrObjectId publisher_id; + uxrObjectId datawriter_id; + const char *participant_xml; + const char *topic_xml; + const char *publisher_xml; + const char *datawriter_xml; + uint16_t participant_req; + uint16_t topic_req; + uint16_t publisher_req; + uint16_t datawriter_req; + uint8_t status[4]; + uint16_t requests[4]; + bool connected; + uint32_t count; + char *ip; + char *port; + uint32_t max_topics; + + /* Parse the command line. */ + + if (argc < 3 || atoi(argv[2]) == 0) + { + printf("usage: %s ip port []\n", argv[0]); + return 0; + } + + ip = argv[1]; + port = argv[2]; + max_topics = argc == 4 ? atoi(argv[3]) : UINT32_MAX; + + /* Create the UDP transport. */ + + if (!uxr_init_udp_transport(&transport, UXR_IPv4, ip, port)) + { + printf("Error at create transport.\n"); + return 1; + } + + /* Create the session. */ + + uxr_init_session(&session, &transport.comm, 0xaaaabbbb); + if (!uxr_create_session(&session)) + { + printf("Error at create session.\n"); + return 1; + } + + /* Create the reliable streams. */ + + reliable_out = uxr_create_output_reliable_stream(&session, + out_stream_buffer, + BUFFER_SIZE, + STREAM_HISTORY); + uxr_create_input_reliable_stream(&session, in_stream_buffer, + BUFFER_SIZE, STREAM_HISTORY); + + /* Create the DDS entities. */ + + participant_id = uxr_object_id(0x01, UXR_PARTICIPANT_ID); + participant_xml = "" + "" + "" + "default_xrce_participant" + "" + "" + ""; + participant_req = uxr_buffer_create_participant_xml(&session, reliable_out, + participant_id, 0, + participant_xml, + UXR_REPLACE); + + topic_id = uxr_object_id(0x01, UXR_TOPIC_ID); + topic_xml = "" + "" + "HelloWorldTopic" + "HelloWorld" + "" + ""; + topic_req = uxr_buffer_create_topic_xml(&session, reliable_out, topic_id, + participant_id, topic_xml, + UXR_REPLACE); + + publisher_id = uxr_object_id(0x01, UXR_PUBLISHER_ID); + publisher_xml = ""; + publisher_req = uxr_buffer_create_publisher_xml(&session, reliable_out, + publisher_id, + participant_id, + publisher_xml, + UXR_REPLACE); + + datawriter_id = uxr_object_id(0x01, UXR_DATAWRITER_ID); + datawriter_xml = "" + "" + "" + "NO_KEY" + "HelloWorldTopic" + "HelloWorld" + "" + "" + ""; + datawriter_req = uxr_buffer_create_datawriter_xml(&session, reliable_out, + datawriter_id, + publisher_id, + datawriter_xml, + UXR_REPLACE); + + /* Send the create entities message and wait for its status. */ + + requests[0] = participant_req; + requests[1] = topic_req; + requests[2] = publisher_req; + requests[3] = datawriter_req; + + if (!uxr_run_session_until_all_status(&session, 1000, requests, status, 4)) + { + printf("Error at create entities: participant: %d topic: %d " + "publisher: %d datawriter: %d\n", + status[0], status[1], status[2], status[3]); + return 1; + } + + /* Wait for the Agent to match the DataWriter before sending. */ + + sleep(3); + + /* Publish samples until the requested number is reached or the session + * is disconnected. + */ + + connected = true; + count = 0; + + while (connected && count < max_topics) + { + struct hello_world_s topic; + ucdrBuffer ub; + uint32_t topic_size; + + topic.index = ++count; + strlcpy(topic.message, "Hello DDS world!", + sizeof(topic.message)); + + topic_size = hello_world_topic_size(&topic, 0); + + uxr_prepare_output_stream(&session, reliable_out, datawriter_id, &ub, + topic_size); + hello_world_serialize_topic(&ub, &topic); + + printf("Send topic: %s, id: %" PRIu32 "\n", topic.message, + topic.index); + connected = uxr_run_session_time(&session, 1000); + } + + /* Delete the session and close the transport. */ + + uxr_delete_session(&session); + uxr_close_udp_transport(&transport); + + return 0; +} diff --git a/system/xrcedds/.gitignore b/system/xrcedds/.gitignore new file mode 100644 index 00000000000..4132a751941 --- /dev/null +++ b/system/xrcedds/.gitignore @@ -0,0 +1,3 @@ +/Micro-XRCE-DDS-Client/ +/Micro-CDR/ +/*.tar.gz diff --git a/system/xrcedds/CMakeLists.txt b/system/xrcedds/CMakeLists.txt new file mode 100644 index 00000000000..e6ed9913c69 --- /dev/null +++ b/system/xrcedds/CMakeLists.txt @@ -0,0 +1,88 @@ +# ############################################################################## +# apps/system/xrcedds/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +if(CONFIG_SYSTEM_XRCEDDS) + set(XRCEDDS_VERSION 3.0.1) + set(MICROCDR_VERSION 2.0.2) + set(XRCEDDS_DIR ${CMAKE_CURRENT_LIST_DIR}/Micro-XRCE-DDS-Client) + set(MICROCDR_DIR ${CMAKE_CURRENT_LIST_DIR}/Micro-CDR) + set(XRCEDDS_URL https://github.com/eProsima/Micro-XRCE-DDS-Client/archive) + set(MICROCDR_URL https://github.com/eProsima/Micro-CDR/archive) + + if(NOT EXISTS ${XRCEDDS_DIR}) + FetchContent_Declare( + xrcedds_fetch + URL ${XRCEDDS_URL}/refs/tags/v${XRCEDDS_VERSION}.tar.gz SOURCE_DIR + ${XRCEDDS_DIR} BINARY_DIR + ${NUTTX_APPS_BINDIR}/system/xrcedds/xrcedds-client + DOWNLOAD_NO_PROGRESS true + TIMEOUT 30) + FetchContent_GetProperties(xrcedds_fetch) + if(NOT xrcedds_fetch_POPULATED) + FetchContent_Populate(xrcedds_fetch) + endif() + endif() + + if(NOT EXISTS ${MICROCDR_DIR}) + FetchContent_Declare( + microcdr_fetch + URL ${MICROCDR_URL}/refs/tags/v${MICROCDR_VERSION}.tar.gz SOURCE_DIR + ${MICROCDR_DIR} BINARY_DIR + ${NUTTX_APPS_BINDIR}/system/xrcedds/microcdr + DOWNLOAD_NO_PROGRESS true + TIMEOUT 30) + FetchContent_GetProperties(microcdr_fetch) + if(NOT microcdr_fetch_POPULATED) + FetchContent_Populate(microcdr_fetch) + endif() + endif() + + file( + GLOB XRCEDDS_SRCS ${XRCEDDS_DIR}/src/c/core/serialization/*.c + ${XRCEDDS_DIR}/src/c/core/session/*.c + ${XRCEDDS_DIR}/src/c/core/session/stream/*.c ${XRCEDDS_DIR}/src/c/util/*.c) + + list(APPEND XRCEDDS_SRCS + ${XRCEDDS_DIR}/src/c/profile/transport/ip/udp/udp_transport.c + ${XRCEDDS_DIR}/src/c/profile/transport/ip/udp/udp_transport_posix.c) + + if(CONFIG_SYSTEM_XRCEDDS_STREAM_FRAMING) + file(GLOB XRCEDDS_FRAMING_SRCS + ${XRCEDDS_DIR}/src/c/profile/transport/stream_framing/*.c) + list(APPEND XRCEDDS_SRCS ${XRCEDDS_FRAMING_SRCS}) + endif() + + file(GLOB MICROCDR_SRCS ${MICROCDR_DIR}/src/c/*.c + ${MICROCDR_DIR}/src/c/types/*.c) + + nuttx_add_library(xrcedds STATIC) + target_sources(xrcedds PRIVATE ${XRCEDDS_SRCS} ${MICROCDR_SRCS}) + target_include_directories( + xrcedds PRIVATE ${CMAKE_CURRENT_LIST_DIR}/include ${XRCEDDS_DIR}/include + ${XRCEDDS_DIR}/src/c ${MICROCDR_DIR}/include) + + set_property( + TARGET nuttx + APPEND + PROPERTY NUTTX_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_LIST_DIR}/include + ${XRCEDDS_DIR}/include ${MICROCDR_DIR}/include) +endif() diff --git a/system/xrcedds/Kconfig b/system/xrcedds/Kconfig new file mode 100644 index 00000000000..73ff164e907 --- /dev/null +++ b/system/xrcedds/Kconfig @@ -0,0 +1,50 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +menuconfig SYSTEM_XRCEDDS + bool "eProsima Micro XRCE-DDS" + default n + ---help--- + Enable a lightweight build of Micro XRCE-DDS Client 3.0.1 and + Micro-CDR 2.0.2. Only the core client and the built-in UDP + transport are built; ROS 2, micro-ROS, discovery, and other + transports are not included. + +if SYSTEM_XRCEDDS + +config SYSTEM_XRCEDDS_STREAM_FRAMING + bool "Byte-stream transport framing" + default n + ---help--- + Enable HDLC framing for byte-stream transports such as UART. + The built-in UDP transport preserves packet boundaries, so this + is not needed for the UDP publisher demo. + +config SYSTEM_XRCEDDS_MTU + int "UDP transport MTU" + range 64 65535 + default 512 + +config SYSTEM_XRCEDDS_MAX_OUTPUT_BEST_EFFORT_STREAMS + int "Maximum output best-effort streams" + range 1 127 + default 1 + +config SYSTEM_XRCEDDS_MAX_OUTPUT_RELIABLE_STREAMS + int "Maximum output reliable streams" + range 1 127 + default 1 + +config SYSTEM_XRCEDDS_MAX_INPUT_BEST_EFFORT_STREAMS + int "Maximum input best-effort streams" + range 1 127 + default 1 + +config SYSTEM_XRCEDDS_MAX_INPUT_RELIABLE_STREAMS + int "Maximum input reliable streams" + range 1 127 + default 1 + +endif diff --git a/system/xrcedds/Make.defs b/system/xrcedds/Make.defs new file mode 100644 index 00000000000..abf4cd4aaeb --- /dev/null +++ b/system/xrcedds/Make.defs @@ -0,0 +1,35 @@ +############################################################################ +# apps/system/xrcedds/Make.defs +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +ifneq ($(CONFIG_SYSTEM_XRCEDDS),) +CONFIGURED_APPS += $(APPDIR)/system/xrcedds + +XRCEDDS_DIR := $(APPDIR)/system/xrcedds + +CFLAGS += ${INCDIR_PREFIX}"$(XRCEDDS_DIR)/include" +CFLAGS += ${INCDIR_PREFIX}"$(XRCEDDS_DIR)/Micro-XRCE-DDS-Client/include" +CFLAGS += ${INCDIR_PREFIX}"$(XRCEDDS_DIR)/Micro-CDR/include" + +CXXFLAGS += ${INCDIR_PREFIX}"$(XRCEDDS_DIR)/include" +CXXFLAGS += ${INCDIR_PREFIX}"$(XRCEDDS_DIR)/Micro-XRCE-DDS-Client/include" +CXXFLAGS += ${INCDIR_PREFIX}"$(XRCEDDS_DIR)/Micro-CDR/include" +endif diff --git a/system/xrcedds/Makefile b/system/xrcedds/Makefile new file mode 100644 index 00000000000..6619436ae27 --- /dev/null +++ b/system/xrcedds/Makefile @@ -0,0 +1,106 @@ +############################################################################ +# apps/system/xrcedds/Makefile +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(APPDIR)/Make.defs + +XRCEDDS_VERSION := 3.0.1 +MICROCDR_VERSION := 2.0.2 +XRCEDDS_TARBALL := Micro-XRCE-DDS-Client-$(XRCEDDS_VERSION).tar.gz +MICROCDR_TARBALL := Micro-CDR-$(MICROCDR_VERSION).tar.gz +XRCEDDS_UNPACK := Micro-XRCE-DDS-Client +MICROCDR_UNPACK := Micro-CDR +XRCEDDS_CSRC := $(XRCEDDS_UNPACK)$(DELIM)src$(DELIM)c +MICROCDR_CSRC := $(MICROCDR_UNPACK)$(DELIM)src$(DELIM)c +XRCEDDS_URL := https://github.com/eProsima/Micro-XRCE-DDS-Client/archive +MICROCDR_URL := https://github.com/eProsima/Micro-CDR/archive + +CFLAGS += ${INCDIR_PREFIX}"$(XRCEDDS_CSRC)" + +XRCEDDS_CORE := $(XRCEDDS_CSRC)$(DELIM)core +XRCEDDS_UTIL := $(XRCEDDS_CSRC)$(DELIM)util +XRCEDDS_SESSION := $(XRCEDDS_CORE)$(DELIM)session +XRCEDDS_STREAM := $(XRCEDDS_SESSION)$(DELIM)stream +XRCEDDS_TRANSPORT := $(XRCEDDS_CSRC)$(DELIM)profile$(DELIM)transport +XRCEDDS_UDP := $(XRCEDDS_TRANSPORT)$(DELIM)ip$(DELIM)udp + +CSRCS += $(XRCEDDS_CORE)$(DELIM)serialization$(DELIM)xrce_header.c +CSRCS += $(XRCEDDS_CORE)$(DELIM)serialization$(DELIM)xrce_subheader.c +CSRCS += $(XRCEDDS_CORE)$(DELIM)serialization$(DELIM)xrce_types.c +CSRCS += $(XRCEDDS_SESSION)$(DELIM)common_create_entities.c +CSRCS += $(XRCEDDS_SESSION)$(DELIM)create_entities_bin.c +CSRCS += $(XRCEDDS_SESSION)$(DELIM)create_entities_ref.c +CSRCS += $(XRCEDDS_SESSION)$(DELIM)create_entities_xml.c +CSRCS += $(XRCEDDS_SESSION)$(DELIM)object_id.c +CSRCS += $(XRCEDDS_SESSION)$(DELIM)read_access.c +CSRCS += $(XRCEDDS_SESSION)$(DELIM)session.c +CSRCS += $(XRCEDDS_SESSION)$(DELIM)session_info.c +CSRCS += $(XRCEDDS_SESSION)$(DELIM)submessage.c +CSRCS += $(XRCEDDS_SESSION)$(DELIM)write_access.c +CSRCS += $(XRCEDDS_STREAM)$(DELIM)input_best_effort_stream.c +CSRCS += $(XRCEDDS_STREAM)$(DELIM)input_reliable_stream.c +CSRCS += $(XRCEDDS_STREAM)$(DELIM)output_best_effort_stream.c +CSRCS += $(XRCEDDS_STREAM)$(DELIM)output_reliable_stream.c +CSRCS += $(XRCEDDS_STREAM)$(DELIM)seq_num.c +CSRCS += $(XRCEDDS_STREAM)$(DELIM)stream_id.c +CSRCS += $(XRCEDDS_STREAM)$(DELIM)stream_storage.c +CSRCS += $(XRCEDDS_UTIL)$(DELIM)ping.c +CSRCS += $(XRCEDDS_UTIL)$(DELIM)time.c + +CSRCS += $(XRCEDDS_UDP)$(DELIM)udp_transport.c +CSRCS += $(XRCEDDS_UDP)$(DELIM)udp_transport_posix.c + +ifeq ($(CONFIG_SYSTEM_XRCEDDS_STREAM_FRAMING),y) +XRCEDDS_FRAMING := $(XRCEDDS_TRANSPORT)$(DELIM)stream_framing +CSRCS += $(XRCEDDS_FRAMING)$(DELIM)stream_framing_protocol.c +endif + +CSRCS += $(MICROCDR_CSRC)$(DELIM)common.c +CSRCS += $(MICROCDR_CSRC)$(DELIM)types$(DELIM)array.c +CSRCS += $(MICROCDR_CSRC)$(DELIM)types$(DELIM)basic.c +CSRCS += $(MICROCDR_CSRC)$(DELIM)types$(DELIM)sequence.c +CSRCS += $(MICROCDR_CSRC)$(DELIM)types$(DELIM)string.c + +$(XRCEDDS_TARBALL): + $(Q) echo "Downloading Micro XRCE-DDS Client $(XRCEDDS_VERSION)" + $(Q) curl -L -o $@ $(XRCEDDS_URL)/refs/tags/v$(XRCEDDS_VERSION).tar.gz + +$(MICROCDR_TARBALL): + $(Q) echo "Downloading Micro-CDR $(MICROCDR_VERSION)" + $(Q) curl -L -o $@ $(MICROCDR_URL)/refs/tags/v$(MICROCDR_VERSION).tar.gz + +$(XRCEDDS_UNPACK): $(XRCEDDS_TARBALL) + $(Q) tar zxf $< + $(Q) mv Micro-XRCE-DDS-Client-$(XRCEDDS_VERSION) $@ + +$(MICROCDR_UNPACK): $(MICROCDR_TARBALL) + $(Q) tar zxf $< + $(Q) mv Micro-CDR-$(MICROCDR_VERSION) $@ + +context:: $(XRCEDDS_UNPACK) $(MICROCDR_UNPACK) + +distclean:: + $(call DELFILE,$(XRCEDDS_TARBALL)) + $(call DELFILE,$(MICROCDR_TARBALL)) + $(call DELDIR,$(XRCEDDS_UNPACK)) + $(call DELDIR,$(MICROCDR_UNPACK)) + +include $(APPDIR)/Application.mk diff --git a/system/xrcedds/include/ucdr/config.h b/system/xrcedds/include/ucdr/config.h new file mode 100644 index 00000000000..9e27b0a331d --- /dev/null +++ b/system/xrcedds/include/ucdr/config.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * apps/system/xrcedds/include/ucdr/config.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + ****************************************************************************/ + +#ifndef __APPS_SYSTEM_XRCEDDS_INCLUDE_UCDR_CONFIG_H +#define __APPS_SYSTEM_XRCEDDS_INCLUDE_UCDR_CONFIG_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#define MICROCDR_VERSION_MAJOR 2 +#define MICROCDR_VERSION_MINOR 0 +#define MICROCDR_VERSION_MICRO 2 +#define MICROCDR_VERSION_STR "2.0.2" + +#ifdef CONFIG_ENDIAN_BIG +# define UCDR_MACHINE_ENDIANNESS UCDR_BIG_ENDIANNESS +#else +# define UCDR_MACHINE_ENDIANNESS UCDR_LITTLE_ENDIANNESS +#endif + +#endif /* __APPS_SYSTEM_XRCEDDS_INCLUDE_UCDR_CONFIG_H */ diff --git a/system/xrcedds/include/uxr/client/config.h b/system/xrcedds/include/uxr/client/config.h new file mode 100644 index 00000000000..4bd89f7b951 --- /dev/null +++ b/system/xrcedds/include/uxr/client/config.h @@ -0,0 +1,61 @@ +/**************************************************************************** + * apps/system/xrcedds/include/uxr/client/config.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + ****************************************************************************/ + +#ifndef __APPS_SYSTEM_XRCEDDS_INCLUDE_UXR_CLIENT_CONFIG_H +#define __APPS_SYSTEM_XRCEDDS_INCLUDE_UXR_CLIENT_CONFIG_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#define UXR_CLIENT_VERSION_MAJOR 3 +#define UXR_CLIENT_VERSION_MINOR 0 +#define UXR_CLIENT_VERSION_MICRO 1 +#define UXR_CLIENT_VERSION_STR "3.0.1" + +#define UCLIENT_PROFILE_UDP +#define UCLIENT_PLATFORM_POSIX +#define UCLIENT_TWEAK_XRCE_WRITE_LIMIT + +#ifdef CONFIG_SYSTEM_XRCEDDS_STREAM_FRAMING +# define UCLIENT_PROFILE_STREAM_FRAMING +#endif + +#define UXR_CONFIG_MAX_OUTPUT_BEST_EFFORT_STREAMS \ + CONFIG_SYSTEM_XRCEDDS_MAX_OUTPUT_BEST_EFFORT_STREAMS +#define UXR_CONFIG_MAX_OUTPUT_RELIABLE_STREAMS \ + CONFIG_SYSTEM_XRCEDDS_MAX_OUTPUT_RELIABLE_STREAMS +#define UXR_CONFIG_MAX_INPUT_BEST_EFFORT_STREAMS \ + CONFIG_SYSTEM_XRCEDDS_MAX_INPUT_BEST_EFFORT_STREAMS +#define UXR_CONFIG_MAX_INPUT_RELIABLE_STREAMS \ + CONFIG_SYSTEM_XRCEDDS_MAX_INPUT_RELIABLE_STREAMS + +#define UXR_CONFIG_MAX_SESSION_CONNECTION_ATTEMPTS 10 +#define UXR_CONFIG_MIN_SESSION_CONNECTION_INTERVAL 1000 +#define UXR_CONFIG_MIN_HEARTBEAT_TIME_INTERVAL 100 + +#ifdef UCLIENT_PROFILE_UDP +# define UXR_CONFIG_UDP_TRANSPORT_MTU CONFIG_SYSTEM_XRCEDDS_MTU +#endif + +#endif /* __APPS_SYSTEM_XRCEDDS_INCLUDE_UXR_CLIENT_CONFIG_H */