diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 03ba499c..25182825 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,18 +13,8 @@ jobs: fail-fast: false matrix: idf_target: [ esp32, esp32s2, esp32s3, esp32c3] - idf_version: [ "espressif/idf:release-v4.1", "espressif/idf:release-v4.2", "espressif/idf:release-v4.3", "espressif/idf:release-v4.4" ] + idf_version: [ "espressif/idf:release-v4.3", "espressif/idf:release-v4.4", "espressif/idf:release-v5.0" ] exclude: - - idf_target: esp32s2 - idf_version: "espressif/idf:release-v4.1" - - idf_target: esp32c3 - idf_version: "espressif/idf:release-v4.1" - - idf_target: esp32c3 - idf_version: "espressif/idf:release-v4.2" - - idf_target: esp32s3 - idf_version: "espressif/idf:release-v4.1" - - idf_target: esp32s3 - idf_version: "espressif/idf:release-v4.2" - idf_target: esp32s3 idf_version: "espressif/idf:release-v4.3" @@ -46,6 +36,8 @@ jobs: pip3 install catkin_pkg lark-parser empy colcon-common-extensions # This line avoids the error when using Python < 3.7 https://importlib-resources.readthedocs.io/en/latest/ pip3 install importlib-resources + # this installs the modules also for global python interpreter, needed for IDF v5 + /usr/bin/pip3 install catkin_pkg lark-parser empy colcon-common-extensions importlib-resources - name: Build sample - int32_publisher shell: bash diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 31031ce3..9c1ccf37 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -14,20 +14,10 @@ jobs: strategy: fail-fast: false matrix: - branch: [foxy, main, galactic] + branch: [foxy, main, humble] idf_target: [ esp32, esp32s2, esp32c3, esp32s3] - idf_version: [ "espressif/idf:release-v4.1", "espressif/idf:release-v4.2", "espressif/idf:release-v4.3", "espressif/idf:release-v4.4" ] + idf_version: [ "espressif/idf:release-v4.3", "espressif/idf:release-v4.4", "espressif/idf:release-v5.0" ] exclude: - - idf_target: esp32s2 - idf_version: "espressif/idf:release-v4.1" - - idf_target: esp32c3 - idf_version: "espressif/idf:release-v4.1" - - idf_target: esp32c3 - idf_version: "espressif/idf:release-v4.2" - - idf_target: esp32s3 - idf_version: "espressif/idf:release-v4.1" - - idf_target: esp32s3 - idf_version: "espressif/idf:release-v4.2" - idf_target: esp32s3 idf_version: "espressif/idf:release-v4.3" container: @@ -49,6 +39,8 @@ jobs: pip3 install catkin_pkg lark-parser empy colcon-common-extensions # This line avoids the error when using Python < 3.7 https://importlib-resources.readthedocs.io/en/latest/ pip3 install importlib-resources + # this installs the modules also for global python interpreter, needed for IDF v5 + /usr/bin/pip3 install catkin_pkg lark-parser empy colcon-common-extensions importlib-resources - name: Build sample - int32_publisher shell: bash @@ -79,7 +71,7 @@ jobs: idf.py build - name: EmbeddedRTPS - if: ${{ matrix.branch == 'galactic' }} + if: ${{ matrix.branch == 'humble' }} shell: bash run: | . $IDF_PATH/export.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 98657da4..b141361f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ idf_component_register(SRCS "network_interfaces/uros_ethernet_netif.c" "network_interfaces/uros_wlan_netif.c" INCLUDE_DIRS "network_interfaces" - REQUIRES nvs_flash) + REQUIRES nvs_flash esp_wifi esp_eth lwip) if(CMAKE_GENERATOR STREQUAL "Unix Makefiles") set(submake "$(MAKE)") @@ -8,6 +8,12 @@ else() set(submake "make") endif() +if (${IDF_VERSION_MAJOR} EQUAL 5) + set(CMAKE_C_STANDARD 17) +else() + set(CMAKE_C_STANDARD 11) +endif() + set(APP_COLCON_META "${PROJECT_DIR}/app-colcon.meta") if(NOT EXISTS "${APP_COLCON_META}") set(APP_COLCON_META "") @@ -26,6 +32,22 @@ message(STATUS "Using Micro XRCE-DDS middleware") set(MIDDLEWARE "microxrcedds") endif() +# Create a list of packages to get includes +idf_build_get_property(PACKAGES BUILD_COMPONENTS) + +# Add includes for each package +foreach(package ${PACKAGES}) + idf_component_get_property(${package}_dir ${package} COMPONENT_DIR) + idf_component_get_property(${package}_includes ${package} INCLUDE_DIRS) + list(TRANSFORM ${package}_includes PREPEND " -I${${package}_dir}/") + string(REPLACE ";" "" ${package}_includes_string "${${package}_includes}") +endforeach() + +# Create a string with all packages with a for loop +foreach(package ${PACKAGES}) + string(APPEND IDF_INCLUDES "${${package}_includes_string}") +endforeach() + execute_process( WORKING_DIRECTORY ${COMPONENT_DIR} COMMAND @@ -36,8 +58,10 @@ execute_process( X_CFLAGS=${CMAKE_C_FLAGS} X_CXX=${CMAKE_CXX_COMPILER} X_CXXFLAGS=${CMAKE_CXX_FLAGS} + C_STANDARD=${CMAKE_C_STANDARD} MIDDLEWARE=${MIDDLEWARE} BUILD_DIR=${CMAKE_BINARY_DIR} + IDF_INCLUDES=${IDF_INCLUDES} IDF_PATH=${IDF_PATH} IDF_TARGET=${IDF_TARGET} APP_COLCON_META=${APP_COLCON_META} diff --git a/README.md b/README.md index ec6c54dd..de88a06d 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ # micro-ROS component for ESP-IDF -This component has been tested in ESP-IDF v4.1, v4.2, v4.3 and v4.4 with ESP32, ESP32-S2, ESP32-S3 and ESP32-C3. +This component has been tested in ESP-IDF v4.3, v4.4, and v5.0 with ESP32, ESP32-S2, ESP32-S3 and ESP32-C3. ## Dependencies @@ -64,7 +64,7 @@ It's possible to build this example application using preconfigured docker conta docker run -it --rm --user espidf --volume="/etc/timezone:/etc/timezone:ro" -v $(pwd):/micro_ros_espidf_component -v /dev:/dev --privileged --workdir /micro_ros_espidf_component microros/esp-idf-microros:latest /bin/bash -c "cd examples/int32_publisher; idf.py menuconfig build flash monitor" ``` -Dockerfile for this container is provided in the ./docker directory and available in dockerhub. +Dockerfile for this container is provided in the ./docker directory and available in dockerhub. This approach uses ESP-IDF v5. ## Using serial transport diff --git a/docker/Dockerfile b/docker/Dockerfile index 811e8962..ab3480fc 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,6 +1,6 @@ -FROM espressif/idf:release-v4.3 +FROM espressif/idf:release-v5.0 ENV DEBIAN_FRONTEND noninteractive RUN echo "Set disable_coredump false" >> /etc/sudo.conf @@ -16,9 +16,10 @@ RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone COPY ./install_micro_ros_deps_script.sh /install_micro_ros_deps_script.sh RUN mkdir -p /tmp/install_micro_ros_deps_script && mv /install_micro_ros_deps_script.sh /tmp/install_micro_ros_deps_script/ && \ - /tmp/install_micro_ros_deps_script/install_micro_ros_deps_script.sh && \ + IDF_EXPORT_QUIET=1 /tmp/install_micro_ros_deps_script/install_micro_ros_deps_script.sh && \ rm -rf /var/lib/apt/lists/* - + +RUN /usr/bin/pip3 --no-cache-dir install catkin_pkg lark-parser empy colcon-common-extensions importlib-resources ARG USER_ID=espidf RUN useradd --create-home --home-dir /home/$USER_ID --shell /bin/bash --user-group --groups adm,sudo $USER_ID && \ diff --git a/esp32_toolchain.cmake.in b/esp32_toolchain.cmake.in index 54da426a..599cca23 100644 --- a/esp32_toolchain.cmake.in +++ b/esp32_toolchain.cmake.in @@ -7,8 +7,10 @@ set(idf_path "@IDF_PATH@") if("${idf_target}" STREQUAL "esp32c3") set(CMAKE_SYSTEM_PROCESSOR riscv) + set(FLAGS "-ffunction-sections -fdata-sections" CACHE STRING "" FORCE) else() set(CMAKE_SYSTEM_PROCESSOR xtensa) + set(FLAGS "-mlongcalls -ffunction-sections -fdata-sections" CACHE STRING "" FORCE) endif() set(CMAKE_CROSSCOMPILING 1) @@ -22,121 +24,12 @@ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_C_COMPILER @CMAKE_C_COMPILER@) set(CMAKE_CXX_COMPILER @CMAKE_CXX_COMPILER@) -set(CMAKE_C_FLAGS_INIT "@CFLAGS@" CACHE STRING "" FORCE) -set(CMAKE_CXX_FLAGS_INIT "@CXXFLAGS@" CACHE STRING "" FORCE) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAGS} ${IDF_INCLUDES}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -fno-rtti ${FLAGS} ${IDF_INCLUDES}") -add_definitions(-DESP_PLATFORM -DLWIP_IPV4 -DLWIP_IPV6 -DPLATFORM_NAME_FREERTOS) +add_compile_definitions(ESP_PLATFORM LWIP_IPV4 LWIP_IPV6 PLATFORM_NAME_FREERTOS) include_directories( "@BUILD_CONFIG_DIR@" - ${idf_path}/components/newlib/platform_include - ${idf_path}/components/freertos/include - ${idf_path}/components/freertos/${CMAKE_SYSTEM_PROCESSOR}/include - ${idf_path}/components/freertos/port/${CMAKE_SYSTEM_PROCESSOR}/include - ${idf_path}/components/esp_hw_support/include - ${idf_path}/components/hal/include - ${idf_path}/components/hal/${idf_target}/include - ${idf_path}/components/heap/include - ${idf_path}/components/log/include - ${idf_path}/components/lwip/include/apps - ${idf_path}/components/lwip/include/apps/sntp - ${idf_path}/components/lwip/lwip/src/include - ${idf_path}/components/lwip/port/esp32/include - ${idf_path}/components/lwip/port/esp32/include/arch - ${idf_path}/components/lwip/port/esp32/tcp_isn - ${idf_path}/components/soc/src/${idf_target}/. - ${idf_path}/components/soc/src/${idf_target}/include - ${idf_path}/components/soc/include ${idf_path}/components/soc/${idf_target}/include - ${idf_path}/components/esp_rom/include - ${idf_path}/components/esp_common/include - ${idf_path}/components/esp_system/include - ${idf_path}/components/${CMAKE_SYSTEM_PROCESSOR}/include - ${idf_path}/components/${CMAKE_SYSTEM_PROCESSOR}/${idf_target}/include - ${idf_path}/components/${idf_target}/include - ${idf_path}/components/driver/include - ${idf_path}/components/driver/${idf_target}/include - ${idf_path}/components/esp_ringbuf/include - ${idf_path}/components/efuse/include - ${idf_path}/components/efuse/${idf_target}/include - ${idf_path}/components/espcoredump/include - ${idf_path}/components/esp_timer/include - ${idf_path}/components/esp_ipc/include - ${idf_path}/components/soc/soc/${idf_target}/include - ${idf_path}/components/soc/soc/${idf_target}/../include - ${idf_path}/components/soc/soc/${idf_target}/private_include - ${idf_path}/components/vfs/include - ${idf_path}/components/esp_wifi/include - ${idf_path}/components/esp_wifi/${idf_target}/include - ${idf_path}/components/esp_event/include - ${idf_path}/components/esp_netif/include - ${idf_path}/components/esp_eth/include - ${idf_path}/components/tcpip_adapter/include - ${idf_path}/components/app_trace/include - ${idf_path}/components/mbedtls/port/include - ${idf_path}/components/mbedtls/mbedtls/include - ${idf_path}/components/mbedtls/esp_crt_bundle/include - ${idf_path}/components/bootloader_support/include - ${idf_path}/components/app_update/include - ${idf_path}/components/spi_flash/include - ${idf_path}/components/wpa_supplicant/include - ${idf_path}/components/wpa_supplicant/port/include - ${idf_path}/components/wpa_supplicant/include/esp_supplicant - ${idf_path}/components/nvs_flash/include - ${idf_path}/components/pthread/include - ${idf_path}/components/perfmon/include - ${idf_path}/components/asio/asio/asio/include - ${idf_path}/components/asio/port/include - ${idf_path}/components/cbor/port/include - ${idf_path}/components/coap/port/include - ${idf_path}/components/coap/port/include/coap - ${idf_path}/components/coap/libcoap/include - ${idf_path}/components/coap/libcoap/include/coap2 - ${idf_path}/components/console - ${idf_path}/components/nghttp/port/include - ${idf_path}/components/nghttp/nghttp2/lib/includes - ${idf_path}/components/esp-tls - ${idf_path}/components/esp_adc_cal/include - ${idf_path}/components/esp_gdbstub/include - ${idf_path}/components/esp_hid/include - ${idf_path}/components/tcp_transport/include - ${idf_path}/components/esp_http_client/include - ${idf_path}/components/esp_http_server/include - ${idf_path}/components/esp_https_ota/include - ${idf_path}/components/protobuf-c/protobuf-c - ${idf_path}/components/protocomm/include/common - ${idf_path}/components/protocomm/include/security - ${idf_path}/components/protocomm/include/transports - ${idf_path}/components/mdns/include - ${idf_path}/components/esp_local_ctrl/include - ${idf_path}/components/sdmmc/include - ${idf_path}/components/esp_serial_slave_link/include - ${idf_path}/components/esp_websocket_client/include - ${idf_path}/components/expat/expat/expat/lib - ${idf_path}/components/expat/port/include - ${idf_path}/components/wear_levelling/include - ${idf_path}/components/fatfs/diskio - ${idf_path}/components/fatfs/vfs - ${idf_path}/components/fatfs/src - ${idf_path}/components/freemodbus/common/include - ${idf_path}/components/idf_test/include - ${idf_path}/components/idf_test/include/${idf_target} - ${idf_path}/components/jsmn/include - ${idf_path}/components/json/cJSON - ${idf_path}/components/libsodium/libsodium/src/libsodium/include - ${idf_path}/components/libsodium/port_include - ${idf_path}/components/mqtt/esp-mqtt/include - ${idf_path}/components/openssl/include - ${idf_path}/components/spiffs/include - ${idf_path}/components/ulp/include - ${idf_path}/components/unity/include - ${idf_path}/components/unity/unity/src - ${idf_path}/components/wifi_provisioning/include - - ${idf_path}/components/freertos/include/esp_additions/freertos - ${idf_path}/components/freertos/include/esp_additions - ${idf_path}/components/esp_hw_support/include - ${idf_path}/components/esp_hw_support/include/soc - ${idf_path}/components/esp_hw_support/include/soc/${idf_target} - ${idf_path}/components/esp_hw_support/port/${idf_target}/. ) diff --git a/examples/int32_publisher/main/main.c b/examples/int32_publisher/main/main.c index adbd296b..2bedc4d1 100644 --- a/examples/int32_publisher/main/main.c +++ b/examples/int32_publisher/main/main.c @@ -28,7 +28,7 @@ void timer_callback(rcl_timer_t * timer, int64_t last_call_time) { RCLC_UNUSED(last_call_time); if (timer != NULL) { - printf("Publishing: %d\n", msg.data); + printf("Publishing: %d\n", (int) msg.data); RCSOFTCHECK(rcl_publish(&publisher, &msg, NULL)); msg.data++; } diff --git a/examples/int32_publisher_custom_transport/main/esp32_serial_transport.c b/examples/int32_publisher_custom_transport/main/esp32_serial_transport.c index 18c8cc15..9f9bb8f7 100644 --- a/examples/int32_publisher_custom_transport/main/esp32_serial_transport.c +++ b/examples/int32_publisher_custom_transport/main/esp32_serial_transport.c @@ -49,6 +49,6 @@ size_t esp32_serial_write(struct uxrCustomTransport* transport, const uint8_t * size_t esp32_serial_read(struct uxrCustomTransport* transport, uint8_t* buf, size_t len, int timeout, uint8_t* err){ size_t * uart_port = (size_t*) transport->args; - const int rxBytes = uart_read_bytes(*uart_port, buf, len, timeout / portTICK_RATE_MS); + const int rxBytes = uart_read_bytes(*uart_port, buf, len, timeout / portTICK_PERIOD_MS); return rxBytes; } \ No newline at end of file diff --git a/examples/int32_publisher_embeddedrtps/main/main.c b/examples/int32_publisher_embeddedrtps/main/main.c index 563f508d..ed676630 100644 --- a/examples/int32_publisher_embeddedrtps/main/main.c +++ b/examples/int32_publisher_embeddedrtps/main/main.c @@ -24,7 +24,7 @@ void timer_callback(rcl_timer_t * timer, int64_t last_call_time) { RCLC_UNUSED(last_call_time); if (timer != NULL) { - printf("Publishing: %d\n", msg.data); + printf("Publishing: %d\n", (int) msg.data); RCSOFTCHECK(rcl_publish(&publisher, &msg, NULL)); msg.data++; } diff --git a/examples/int32_sub_pub/main/main.c b/examples/int32_sub_pub/main/main.c index 2bf739b9..2a071339 100644 --- a/examples/int32_sub_pub/main/main.c +++ b/examples/int32_sub_pub/main/main.c @@ -31,7 +31,7 @@ void timer_callback(rcl_timer_t * timer, int64_t last_call_time) (void) last_call_time; if (timer != NULL) { RCSOFTCHECK(rcl_publish(&publisher, &send_msg, NULL)); - printf("Sent: %d\n", send_msg.data); + printf("Sent: %d\n", (int) send_msg.data); send_msg.data++; } } @@ -39,7 +39,7 @@ void timer_callback(rcl_timer_t * timer, int64_t last_call_time) void subscription_callback(const void * msgin) { const std_msgs__msg__Int32 * msg = (const std_msgs__msg__Int32 *)msgin; - printf("Received: %d\n", msg->data); + printf("Received: %d\n", (int) msg->data); } void micro_ros_task(void * arg) diff --git a/libmicroros.mk b/libmicroros.mk index 3e7e8e91..4dde7e54 100644 --- a/libmicroros.mk +++ b/libmicroros.mk @@ -101,7 +101,10 @@ $(EXTENSIONS_DIR)/micro_ros_src/install: $(EXTENSIONS_DIR)/esp32_toolchain.cmake -DBUILD_TESTING=OFF \ -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) \ -DCMAKE_TOOLCHAIN_FILE=$(EXTENSIONS_DIR)/esp32_toolchain.cmake \ - -DCMAKE_VERBOSE_MAKEFILE=OFF; \ + -DCMAKE_VERBOSE_MAKEFILE=OFF \ + -DIDF_INCLUDES='${IDF_INCLUDES}' \ + -DCMAKE_C_STANDARD=$(C_STANDARD) \ + -DUCLIENT_C_STANDARD=$(C_STANDARD); patch_atomic:$(EXTENSIONS_DIR)/micro_ros_src/install # Workaround https://github.com/micro-ROS/micro_ros_espidf_component/issues/18 @@ -119,6 +122,11 @@ ifeq ($(IDF_TARGET),$(filter $(IDF_TARGET),esp32s2 esp32c3)) $(X_STRIP) atomic_64bits.c.obj --strip-symbol=__atomic_load_8; \ $(X_STRIP) atomic_64bits.c.obj --strip-symbol=__atomic_store_8; \ fi; \ + if [ $(IDF_VERSION_MAJOR) -ge 5 ] && [ $(IDF_VERSION_MINOR) -ge 0 ]; then \ + $(X_STRIP) atomic_64bits.c.obj --strip-symbol=__atomic_load_8; \ + $(X_STRIP) atomic_64bits.c.obj --strip-symbol=__atomic_store_8; \ + $(X_STRIP) atomic_64bits.c.obj --strip-symbol=__atomic_exchange_8; \ + fi; \ $(X_AR) rc -s librcutils.a *.obj; \ cp -rf librcutils.a $(UROS_DIR)/install/lib/librcutils.a; \ rm -rf $(UROS_DIR)/atomic_workaround; \