diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8be22ed65..dc11166c2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,6 +28,7 @@ jobs: - https://raw.githubusercontent.com/ROBOTIS-GIT/OpenCR/master/arduino/opencr_release/package_opencr_index.json''' > arduino-cli.yaml export PATH=$PATH:/github/workspace/bin:/__w/micro_ros_arduino/micro_ros_arduino/bin arduino-cli core install OpenCR:OpenCR -v + arduino-cli core install arduino:samd -v wget https://downloads.arduino.cc/arduino-1.8.13-linux64.tar.xz tar -xf arduino-1.8.13-linux64.tar.xz wget https://www.pjrc.com/teensy/td_153/TeensyduinoInstall.linux64 @@ -46,3 +47,4 @@ jobs: arduino-cli compile --fqbn OpenCR:OpenCR:OpenCR /github/home/Arduino/libraries/micro_ros_arduino-0.0.1/examples/micro-ros_publisher -v arduino-cli compile --fqbn teensy:avr:teensy31 /github/home/Arduino/libraries/micro_ros_arduino-0.0.1/examples/micro-ros_publisher -v arduino-cli compile --fqbn teensy:avr:teensy41 /github/home/Arduino/libraries/micro_ros_arduino-0.0.1/examples/micro-ros_publisher -v + arduino-cli compile --fqbn arduino:samd:arduino_zero_native /github/home/Arduino/libraries/micro_ros_arduino-0.0.1/examples/micro-ros_publisher -v diff --git a/examples/micro-ros_publisher/transport.cpp b/examples/micro-ros_publisher/transport.cpp new file mode 100644 index 000000000..4f6aa30f7 --- /dev/null +++ b/examples/micro-ros_publisher/transport.cpp @@ -0,0 +1,50 @@ +#include + +extern "C" +{ +#include +#include +#include + + int clock_gettime(clockid_t unused, struct timespec *tp) + { + (void)unused; + uint64_t m = micros(); + tp->tv_sec = m / 1000000; + tp->tv_nsec = (m % 1000000) * 1000; + return 0; + } + + bool arduino_serial_platform_open() + { + // Place here your initialization platform code + // Return true if success + SerialUSB.begin(115200); + return true; + } + + bool arduino_serial_platform_close() + { + // Place here your closing platform code + // Return true if success + return true; + } + + size_t arduino_serial_platform_write(uint8_t *buf, size_t len, uint8_t *errcode) + { + // Place here your writing bytes platform code + // Return number of bytes written + (void)errcode; + size_t sent = SerialUSB.write(buf, len); + return sent; + } + + size_t arduino_serial_platform_read(uint8_t *buf, size_t len, int timeout, uint8_t *errcode) + { + // Place here your reading bytes platform code + // Return number of bytes read (max bytes: len) + (void)errcode; + SerialUSB.setTimeout(timeout); + return SerialUSB.readBytes((char *)buf, len); + } +} diff --git a/extras/library_generation/Dockerfile b/extras/library_generation/Dockerfile index 8535e2416..d721e2878 100644 --- a/extras/library_generation/Dockerfile +++ b/extras/library_generation/Dockerfile @@ -18,7 +18,10 @@ RUN git clone https://github.com/micro-ROS/micro-ros-build.git src/micro-ros-bui && rm -rf gcc-arm-none-eabi-5_4-2016q2-20160622-linux.tar.bz2 gcc-arm-none-eabi-5_4-2016q2/share/doc \ && wget https://launchpad.net/gcc-arm-embedded/5.0/5-2016-q3-update/+download/gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2 \ && tar -xvf gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2 \ - && rm -rf gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2 gcc-arm-none-eabi-5_4-2016q3/share/doc + && rm -rf gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2 gcc-arm-none-eabi-5_4-2016q3/share/doc \ + && wget https://launchpad.net/gcc-arm-embedded/4.8/4.8-2014-q1-update/+download/gcc-arm-none-eabi-4_8-2014q1-20140314-linux.tar.bz2 \ + && tar -xvf gcc-arm-none-eabi-4_8-2014q1-20140314-linux.tar.bz2 \ + && rm -rf gcc-arm-none-eabi-4_8-2014q1-20140314-linux.tar.bz2 gcc-arm-none-eabi-4_8-2014q1/share/doc COPY ./entrypoint.sh /entrypoint.sh diff --git a/extras/library_generation/colcon_verylowmem.meta b/extras/library_generation/colcon_verylowmem.meta new file mode 100644 index 000000000..26afdb583 --- /dev/null +++ b/extras/library_generation/colcon_verylowmem.meta @@ -0,0 +1,51 @@ +{ + "names": { + "tracetools": { + "cmake-args": [ + "-DTRACETOOLS_DISABLED=ON", + "-DTRACETOOLS_STATUS_CHECKING_TOOL=OFF" + ] + }, + "rosidl_typesupport": { + "cmake-args": [ + "-DROSIDL_TYPESUPPORT_SINGLE_TYPESUPPORT=ON" + ] + }, + "rcl": { + "cmake-args": [ + "-DBUILD_TESTING=OFF", + "-DRCL_COMMAND_LINE_ENABLED=OFF", + "-DRCL_LOGGING_ENABLED=OFF" + ] + }, + "rcutils": { + "cmake-args": [ + "-DENABLE_TESTING=OFF", + "-DRCUTILS_NO_FILESYSTEM=ON", + "-DRCUTILS_NO_THREAD_SUPPORT=ON", + "-DRCUTILS_NO_64_ATOMIC=ON", + "-DRCUTILS_AVOID_DYNAMIC_ALLOCATION=ON" + ] + }, + "microxrcedds_client": { + "cmake-args": [ + "-DUCLIENT_PIC=OFF", + "-DUCLIENT_PROFILE_UDP=OFF", + "-DUCLIENT_PROFILE_DISCOVERY=OFF", + "-DUCLIENT_PROFILE_SERIAL=ON", + "-DUCLIENT_EXTERNAL_SERIAL=ON" + ] + }, + "rmw_microxrcedds": { + "cmake-args": [ + "-DRMW_UXRCE_MAX_NODES=1", + "-DRMW_UXRCE_MAX_PUBLISHERS=2", + "-DRMW_UXRCE_MAX_SUBSCRIPTIONS=1", + "-DRMW_UXRCE_MAX_SERVICES=0", + "-DRMW_UXRCE_MAX_CLIENTS=1", + "-DRMW_UXRCE_MAX_HISTORY=1", + "-DRMW_UXRCE_TRANSPORT=custom_serial" + ] + } + } +} diff --git a/extras/library_generation/cortex_m0_toolchain.cmake b/extras/library_generation/cortex_m0_toolchain.cmake new file mode 100644 index 000000000..5b7754331 --- /dev/null +++ b/extras/library_generation/cortex_m0_toolchain.cmake @@ -0,0 +1,16 @@ +SET(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_CROSSCOMPILING 1) +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + +set(CMAKE_C_COMPILER $ENV{TOOLCHAIN_PREFIX}gcc) +set(CMAKE_CXX_COMPILER $ENV{TOOLCHAIN_PREFIX}g++) + +SET(CMAKE_C_COMPILER_WORKS 1 CACHE INTERNAL "") +SET(CMAKE_CXX_COMPILER_WORKS 1 CACHE INTERNAL "") + +set(FLAGS "-O2 -fsingle-precision-constant -ffunction-sections -fdata-sections -fno-exceptions -mcpu=cortex-m0 -nostdlib -mthumb -D'RCUTILS_LOG_MIN_SEVERITY=RCUTILS_LOG_MIN_SEVERITY_NONE'" CACHE STRING "" FORCE) + +set(CMAKE_C_FLAGS_INIT "-std=c11 ${FLAGS} -DCLOCK_MONOTONIC=0 -D'__attribute__(x)='" CACHE STRING "" FORCE) +set(CMAKE_CXX_FLAGS_INIT "-std=c++14 ${FLAGS} -fno-rtti -DCLOCK_MONOTONIC=0 -D'__attribute__(x)='" CACHE STRING "" FORCE) + +set(__BIG_ENDIAN__ 0) diff --git a/extras/library_generation/cortex_m3_toolchain.cmake b/extras/library_generation/cortex_m3_toolchain.cmake new file mode 100644 index 000000000..57e4d0948 --- /dev/null +++ b/extras/library_generation/cortex_m3_toolchain.cmake @@ -0,0 +1,16 @@ +SET(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_CROSSCOMPILING 1) +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + +set(CMAKE_C_COMPILER $ENV{TOOLCHAIN_PREFIX}gcc) +set(CMAKE_CXX_COMPILER $ENV{TOOLCHAIN_PREFIX}g++) + +SET(CMAKE_C_COMPILER_WORKS 1 CACHE INTERNAL "") +SET(CMAKE_CXX_COMPILER_WORKS 1 CACHE INTERNAL "") + +set(FLAGS "-O2 -ffunction-sections -fdata-sections -fno-exceptions -mcpu=cortex-m3 -nostdlib -DARDUINO=10813 -mthumb --param max-inline-insns-single=500 -DF_CPU=84000000L -D'RCUTILS_LOG_MIN_SEVERITY=RCUTILS_LOG_MIN_SEVERITY_NONE'" CACHE STRING "" FORCE) + +set(CMAKE_C_FLAGS_INIT "-std=c11 ${FLAGS} -DCLOCK_MONOTONIC=0 -D'__attribute__(x)='" CACHE STRING "" FORCE) +set(CMAKE_CXX_FLAGS_INIT "-std=c++11 ${FLAGS} -fno-rtti -DCLOCK_MONOTONIC=0 -D'__attribute__(x)='" CACHE STRING "" FORCE) + +set(__BIG_ENDIAN__ 0) diff --git a/extras/library_generation/library_generation.sh b/extras/library_generation/library_generation.sh index 7ecf912aa..268258892 100755 --- a/extras/library_generation/library_generation.sh +++ b/extras/library_generation/library_generation.sh @@ -13,6 +13,8 @@ if [ $OPTIND -eq 1 ]; then PLATFORMS+=("opencr1") PLATFORMS+=("teensy4") PLATFORMS+=("teensy3") + PLATFORMS+=("cortex_m0") + PLATFORMS+=("cortex_m3") fi shift $((OPTIND-1)) @@ -94,6 +96,34 @@ if [[ " ${PLATFORMS[@]} " =~ " teensy4 " ]]; then cp -R firmware/build/libmicroros.a /arduino_project/src/imxrt1062/fpv5-d16-hard/libmicroros.a fi +######## Build for SAMD (e.g. Arduino Zero) ######## +if [[ " ${PLATFORMS[@]} " =~ " cortex_m0 " ]]; then + rm -rf firmware/build + + export TOOLCHAIN_PREFIX=/uros_ws/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi- + ros2 run micro_ros_setup build_firmware.sh /arduino_project/extras/library_generation/cortex_m0_toolchain.cmake /arduino_project/extras/library_generation/colcon_verylowmem.meta + + find firmware/build/include/ -name "*.c" -delete + cp -R firmware/build/include/* /arduino_project/src/ + + mkdir -p /arduino_project/src/cortex-m0plus + cp -R firmware/build/libmicroros.a /arduino_project/src/cortex-m0plus/libmicroros.a +fi + +######## Build for SAM (e.g. Arduino Due) ######## +if [[ " ${PLATFORMS[@]} " =~ " cortex_m3 " ]]; then + rm -rf firmware/build + + export TOOLCHAIN_PREFIX=/uros_ws/gcc-arm-none-eabi-4_8-2014q1/bin/arm-none-eabi- + ros2 run micro_ros_setup build_firmware.sh /arduino_project/extras/library_generation/cortex_m3_toolchain.cmake /arduino_project/extras/library_generation/colcon_lowmem.meta + + find firmware/build/include/ -name "*.c" -delete + cp -R firmware/build/include/* /arduino_project/src/ + + mkdir -p /arduino_project/src/cortex-m3 + cp -R firmware/build/libmicroros.a /arduino_project/src/cortex-m3/libmicroros.a +fi + ######## Generate extra files ######## find firmware/mcu_ws/ros2 \( -name "*.srv" -o -name "*.msg" -o -name "*.action" \) | awk -F"/" '{print $(NF-2)"/"$NF}' > /arduino_project/available_ros2_types find firmware/mcu_ws/extra_packages \( -name "*.srv" -o -name "*.msg" -o -name "*.action" \) | awk -F"/" '{print $(NF-2)"/"$NF}' >> /arduino_project/available_ros2_types diff --git a/library.properties b/library.properties index 22bda293a..4631b6903 100644 --- a/library.properties +++ b/library.properties @@ -7,4 +7,4 @@ paragraph=micro-ROS Arduino library url=https://github.com/micro-ROS precompiled=true category=Other -architectures=OpenCR,Teensyduino +architectures=OpenCR,Teensyduino,samd,sam diff --git a/src/arduino_transports.c b/src/arduino_transports.c index 6f5c0b9c7..069b2cb86 100644 --- a/src/arduino_transports.c +++ b/src/arduino_transports.c @@ -5,11 +5,8 @@ #include "teensy_transports.c.in" #elif defined(ARDUINO_ARCH_OPENCR) #include "opencr_transports.c.in" -#else -#error micro-ROS Library not supported for this platform #endif - // TODO: This should be fixed #if defined(ARDUINO_TEENSY32) diff --git a/src/cortex-m0plus/libmicroros.a b/src/cortex-m0plus/libmicroros.a new file mode 100644 index 000000000..94622203f Binary files /dev/null and b/src/cortex-m0plus/libmicroros.a differ diff --git a/src/cortex-m3/libmicroros.a b/src/cortex-m3/libmicroros.a new file mode 100644 index 000000000..40098007e Binary files /dev/null and b/src/cortex-m3/libmicroros.a differ