# SPDX-FileCopyrightText: Brent Rubell for Adafruit Industries, 2023 # # SPDX-License-Identifier: MIT name: WipperSnapper Build CI on: workflow_dispatch: inputs: board: description: 'Build ONLY this board (must match a matrix entry exactly, or leave empty for all)' required: false default: '' pull_request: workflow_call: secrets: GH_REPO_TOKEN: required: true jobs: build-esp32sx-esptool: name: 🏗️ESP32-Sx(lvgl) runs-on: ubuntu-latest strategy: fail-fast: false matrix: arduino-platform: [ "feather_esp32s2", "feather_esp32s2_reverse_tft", "feather_esp32s2_tft", "funhouse_noota", "magtag", "metroesp32s2", "qtpy_esp32s2", "esp32s3_devkitc_1_n8", "feather_esp32s3_4mbflash_2mbpsram", "feather_esp32s3_reverse_tft", "feather_esp32s3_tft", "qtpy_esp32s3_n4r2", "xiao_esp32s3", ] steps: - name: "skip if unwanted" continue-on-error: true if: | github.event_name == 'workflow_dispatch' && github.event.inputs.board != '' && matrix.arduino-platform != github.event.inputs.board run: | echo "don't build this one!"; exit 1 - uses: actions/setup-python@v5 with: python-version: "3.x" - uses: actions/checkout@v4 - name: Get WipperSnapper version run: | git fetch --prune --unshallow --tags git describe --dirty --tags echo >>$GITHUB_ENV WS_VERSION=$(git describe --dirty --tags) - uses: actions/checkout@v4 with: repository: adafruit/ci-arduino ref: ci-wippersnapper path: ci - name: Checkout Board Definitions uses: actions/checkout@v4 with: repository: adafruit/Wippersnapper_Boards path: ws-boards - name: Install CI-Arduino run: bash ci/actions_install.sh - name: Install extra Arduino libraries run: | git clone --quiet --branch 2.2.54 https://github.com/adafruit/SdFat.git /home/runner/Arduino/libraries/SdFat git clone --quiet --branch v4.0.3 https://github.com/milesburton/Arduino-Temperature-Control-Library.git /home/runner/Arduino/libraries/Arduino-Temperature-Control-Library git clone --quiet https://github.com/pstolarz/OneWireNg.git /home/runner/Arduino/libraries/OneWireNg git clone --quiet https://github.com/adafruit/Adafruit_HX8357_Library.git /home/runner/Arduino/libraries/Adafruit_HX8357_Library git clone --quiet https://github.com/adafruit/Adafruit_ILI9341.git /home/runner/Arduino/libraries/Adafruit_ILI9341 git clone --quiet https://github.com/adafruit/Adafruit_STMPE610.git /home/runner/Arduino/libraries/Adafruit_STMPE610 git clone --quiet https://github.com/adafruit/Adafruit-ST7735-Library.git /home/runner/Arduino/libraries/Adafruit-ST7735-Library git clone --quiet https://github.com/adafruit/Adafruit_TouchScreen.git /home/runner/Arduino/libraries/Adafruit_TouchScreen git clone --quiet https://github.com/adafruit/Adafruit_TinyUSB_Arduino /home/runner/Arduino/libraries/Adafruit_TinyUSB_Arduino git clone --depth 1 --branch wippersnapper https://github.com/brentru/lvgl.git /home/runner/Arduino/libraries/lvgl git clone --depth 1 --branch development https://github.com/brentru/Adafruit_LvGL_Glue.git /home/runner/Arduino/libraries/Adafruit_LittlevGL_Glue_Library - name: Download stable Nanopb id: download-nanopb continue-on-error: true run: | wget https://jpa.kapsi.fi/nanopb/download/nanopb-0.4.8.tar.gz - if: ${{ failure() || steps.download-nanopb.outcome != 'success' }} name: Restore cached nanopb id: cache-nanopb-restore uses: actions/cache/restore@v4 env: cache-name: cache-node-modules with: path: ./nanopb-0.4.8.tar.gz key: nanopb-0.4.8.tar.gz - if: ${{ steps.download-nanopb.outcome == 'success' }} name: Save nanopb to cache id: cache-nanopb-save uses: actions/cache/save@v4 env: cache-name: cache-node-modules with: path: ./nanopb-0.4.8.tar.gz key: nanopb-0.4.8.tar.gz - name: Install stable Nanopb run: | tar -xf nanopb-0.4.8.tar.gz # Copy files to WipperSnapper's src/nanopb directory cp nanopb/pb_common.* nanopb/pb_encode.* nanopb/pb_decode.* src/nanopb mv nanopb/pb.h src/nanopb/nanopb.pb.h - name: List all files in Adafruit_LittlevGL_Glue_Library folder run: | ls /home/runner/Arduino/libraries/Adafruit_LittlevGL_Glue_Library - name: Copy lv_conf.h file in Adafruit_LittlevGL_Glue_Library to the arduino library folder run: | cp /home/runner/Arduino/libraries/Adafruit_LittlevGL_Glue_Library/lv_conf.h /home/runner/Arduino/libraries - name: Install Dependencies (esptool) run: | pip3 install esptool - name: Build for ESP32-SX (esptool) run: python3 ci/build_platform.py ${{ matrix.arduino-platform }} --build_timeout 48000 - name: list files run: | ls -Rla examples/ - name: Rename build artifacts to reflect the platform name run: | mv examples/Wippersnapper_demo/build/*/Wippersnapper_demo.ino.bin wippersnapper.${{ matrix.arduino-platform }}.fatfs.${{ env.WS_VERSION }}.bin mv examples/Wippersnapper_demo/build/*/Wippersnapper_demo.ino.elf wippersnapper.${{ matrix.arduino-platform }}.fatfs.${{ env.WS_VERSION }}.elf mv examples/Wippersnapper_demo/build/*/Wippersnapper_demo.ino.map wippersnapper.${{ matrix.arduino-platform }}.fatfs.${{ env.WS_VERSION }}.map mv examples/Wippersnapper_demo/build/*/Wippersnapper_demo.ino.bootloader.bin wippersnapper.${{ matrix.arduino-platform }}.fatfs.${{ env.WS_VERSION }}.bootloader.bin mv examples/Wippersnapper_demo/build/*/Wippersnapper_demo.ino.merged.bin wippersnapper.${{ matrix.arduino-platform }}.fatfs.${{ env.WS_VERSION }}.merged_auto.bin mv examples/Wippersnapper_demo/build/*/Wippersnapper_demo.ino.partitions.bin wippersnapper.${{ matrix.arduino-platform }}.fatfs.${{ env.WS_VERSION }}.partitions.bin - name: Get Board Flash Parameters id: get_board_json run: | board_name=${{ matrix.arduino-platform }} # Remove '_noota' suffix if present board_name=${board_name%_noota} # Remove 'wippersnapper_' prefix if present board_name=${board_name#wippersnapper_} content=$(cat ws-boards/boards/${board_name//_/-}/definition.json) { echo 'boardJson<> "$GITHUB_OUTPUT" - name: fetch tinyuf2 combined.bin run: | BOARD_NAME="${{fromJson(steps.get_board_json.outputs.boardJson).bootloaderBoardName}}" set +e for attempt in 1 2 3; do echo "Attempt $attempt: Fetching tinyuf2 release info for board $BOARD_NAME" API_RESPONSE=$(curl --silent --fail https://api.github.com/repos/adafruit/tinyuf2/releases/latest) if [ $? -ne 0 ]; then echo "Attempt $attempt: curl failed to fetch release info." if [ "$attempt" -eq 3 ]; then exit 1; else sleep $((60 + RANDOM % 40)); continue; fi fi DOWNLOAD_URL=$(echo "$API_RESPONSE" | jq -r '.assets[] | select(.browser_download_url | contains("tinyuf2-'$BOARD_NAME'-") and endswith(".zip")) | .browser_download_url // empty'); JQ_EXIT=$? if [ $JQ_EXIT -ne 0 ] || [ -z "$DOWNLOAD_URL" ]; then echo "Attempt $attempt: jq failed or no matching zip found." if [ "$attempt" -eq 3 ]; then exit 1; else sleep $((60 + RANDOM % 40)); continue; fi fi echo "Attempt $attempt: Downloading $DOWNLOAD_URL" wget "$DOWNLOAD_URL" -O tinyuf2.zip if [ $? -eq 0 ]; then unzip -o tinyuf2.zip -d . if [ $? -ne 0 ]; then echo "Attempt $attempt: unzip failed" if [ "$attempt" -eq 3 ]; then exit 1; else sleep $((60 + RANDOM % 40)); continue; fi fi break else echo "Attempt $attempt: wget failed to download $DOWNLOAD_URL" if [ "$attempt" -eq 3 ]; then exit 1; else sleep $((60 + RANDOM % 40)); fi fi done set -e - name: move partition and bootloader files for tinyuf2 (to match flash_args) run: | # Copy files where they're expected to make flash_args happy mkdir bootloader cp bootloader.bin bootloader/bootloader.bin mkdir partition_table cp partition-table.bin partition_table/partition-table.bin - name: Create new_flash_args file from flash_args with added app bin + output file run: | # Create new_flash_args with esptool parameters first and output file echo "--flash-mode ${{fromJson(steps.get_board_json.outputs.boardJson).esptool.flashMode}}" > new_flash_args echo "--flash-freq ${{fromJson(steps.get_board_json.outputs.boardJson).esptool.flashFreq}}" >> new_flash_args echo "--flash-size ${{fromJson(steps.get_board_json.outputs.boardJson).esptool.flashSize}}" >> new_flash_args echo "-o wippersnapper.${{ matrix.arduino-platform }}.fatfs.${{ env.WS_VERSION }}.combined.bin" >> new_flash_args # Append flash_args content to new_flash_args, skipping the first line tail -n +2 flash_args >> new_flash_args # Append main app to flash_args file echo "0x10000 wippersnapper.${{ matrix.arduino-platform }}.fatfs.${{ env.WS_VERSION }}.bin" >> new_flash_args - name: Check boot_app0 file existence (esp32sx built from core, not-source) id: check_files uses: andstor/file-existence-action@v3 with: files: "/home/runner/.arduino15/packages/esp32/hardware/esp32/*/tools/partitions/boot_app0.bin" - name: list arduino esp32 core files if: steps.check_files.outputs.files_exists == 'true' run: | ls /home/runner/.arduino15/packages/esp32/hardware/esp32/*/tools/partitions - name: list arduino esp32 bsp core files if: steps.check_files.outputs.files_exists == 'false' run: | ls /home/runner/Arduino/hardware/espressif/esp32/tools/partitions - name: boot_app0 file from arduino-cli core if: steps.check_files.outputs.files_exists == 'true' run: cp /home/runner/.arduino15/packages/esp32/hardware/esp32/*/tools/partitions/boot_app0.bin wippersnapper.${{ matrix.arduino-platform }}.fatfs.${{ env.WS_VERSION }}.boot_app0.bin - name: boot_app0 file from esp32 source bsp if: steps.check_files.outputs.files_exists == 'false' run: cp /home/runner/Arduino/hardware/espressif/esp32/tools/partitions/boot_app0.bin wippersnapper.${{ matrix.arduino-platform }}.fatfs.${{ env.WS_VERSION }}.boot_app0.bin - name: Copy boot_app0 file to ota_data_initial.bin (overwrite tinyuf2 boot preference) run: cp wippersnapper.${{ matrix.arduino-platform }}.fatfs.${{ env.WS_VERSION }}.boot_app0.bin ota_data_initial.bin - name: Create combined binary using Esptool merge-bin run: | echo ${{ steps.get_board_json.outputs.boardJson }} echo ${{ fromJson(steps.get_board_json.outputs.boardJson) }} python3 -m esptool --chip ${{fromJson(steps.get_board_json.outputs.boardJson).esptool.chip}} merge-bin @new_flash_args - name: Zip build artifacts run: | zip -r wippersnapper.${{ matrix.arduino-platform }}.fatfs.${{ env.WS_VERSION }}.zip wippersnapper.${{ matrix.arduino-platform }}.fatfs.${{ env.WS_VERSION }}.* - name: Upload build artifacts zip uses: actions/upload-artifact@v4 with: name: build-files-${{ matrix.arduino-platform }}-zip path: | wippersnapper.${{ matrix.arduino-platform }}.fatfs.${{ env.WS_VERSION }}.zip - name: Rename build artifacts to reflect the platform name run: | mv examples/*/build/*/Wippersnapper_demo.ino.uf2 wippersnapper.${{ matrix.arduino-platform }}.${{ env.WS_VERSION }}.uf2 - name: Upload build artifact UF2 file uses: actions/upload-artifact@v4 with: name: build-files-${{ matrix.arduino-platform }}-uf2 path: | wippersnapper.${{ matrix.arduino-platform }}.${{ env.WS_VERSION }}.uf2 build-esp32sx: name: 🏗️ESP32-Sx runs-on: ubuntu-latest strategy: fail-fast: false matrix: arduino-platform: [ "metro_esp32s3", "feather_esp32s3", "qtpy_esp32s3", ] steps: - name: "skip if unwanted" continue-on-error: true if: | github.event_name == 'workflow_dispatch' && github.event.inputs.board != '' && matrix.arduino-platform != github.event.inputs.board run: | echo "don't build this one!"; exit 1 - uses: actions/setup-python@v5 with: python-version: "3.x" - uses: actions/checkout@v4 - name: Get WipperSnapper version run: | git fetch --prune --unshallow --tags git describe --dirty --tags echo >>$GITHUB_ENV WS_VERSION=$(git describe --dirty --tags) - uses: actions/checkout@v4 with: repository: adafruit/ci-arduino ref: ci-wippersnapper path: ci - name: Install CI-Arduino run: bash ci/actions_install.sh - name: Install extra Arduino libraries run: | git clone --quiet --branch v4.0.3 https://github.com/milesburton/Arduino-Temperature-Control-Library.git /home/runner/Arduino/libraries/Arduino-Temperature-Control-Library git clone --quiet https://github.com/pstolarz/OneWireNg.git /home/runner/Arduino/libraries/OneWireNg git clone --quiet https://github.com/adafruit/Adafruit_HX8357_Library.git /home/runner/Arduino/libraries/Adafruit_HX8357_Library git clone --quiet https://github.com/adafruit/Adafruit_ILI9341.git /home/runner/Arduino/libraries/Adafruit_ILI9341 git clone --quiet https://github.com/adafruit/Adafruit_STMPE610.git /home/runner/Arduino/libraries/Adafruit_STMPE610 git clone --quiet https://github.com/adafruit/Adafruit-ST7735-Library.git /home/runner/Arduino/libraries/Adafruit-ST7735-Library git clone --quiet https://github.com/adafruit/Adafruit_TouchScreen.git /home/runner/Arduino/libraries/Adafruit_TouchScreen git clone --quiet https://github.com/adafruit/Adafruit_TinyUSB_Arduino /home/runner/Arduino/libraries/Adafruit_TinyUSB_Arduino git clone --depth 1 --branch wippersnapper https://github.com/brentru/lvgl.git /home/runner/Arduino/libraries/lvgl git clone --depth 1 --branch development https://github.com/brentru/Adafruit_LvGL_Glue.git /home/runner/Arduino/libraries/Adafruit_LittlevGL_Glue_Library - name: Download stable Nanopb id: download-nanopb continue-on-error: true run: | wget https://jpa.kapsi.fi/nanopb/download/nanopb-0.4.8.tar.gz - if: ${{ failure() || steps.download-nanopb.outcome != 'success' }} name: Restore cached nanopb id: cache-nanopb-restore uses: actions/cache/restore@v4 env: cache-name: cache-node-modules with: path: ./nanopb-0.4.8.tar.gz key: nanopb-0.4.8.tar.gz - if: ${{ steps.download-nanopb.outcome == 'success' }} name: Save nanopb to cache id: cache-nanopb-save uses: actions/cache/save@v4 env: cache-name: cache-node-modules with: path: ./nanopb-0.4.8.tar.gz key: nanopb-0.4.8.tar.gz - name: Install stable Nanopb run: | tar -xf nanopb-0.4.8.tar.gz # Copy files to WipperSnapper's src/nanopb directory cp nanopb/pb_common.* nanopb/pb_encode.* nanopb/pb_decode.* src/nanopb mv nanopb/pb.h src/nanopb/nanopb.pb.h - name: List all files in Adafruit_LittlevGL_Glue_Library folder run: | ls /home/runner/Arduino/libraries/Adafruit_LittlevGL_Glue_Library - name: Copy lv_conf.h file in Adafruit_LittlevGL_Glue_Library to the arduino library folder run: | cp /home/runner/Arduino/libraries/Adafruit_LittlevGL_Glue_Library/lv_conf.h /home/runner/Arduino/libraries - name: Build for ESP32-SX run: | python3 ci/build_platform.py ${{ matrix.arduino-platform }} --build_timeout 48000 - name: list files (tree) run: | tree - name: Rename build artifacts to reflect the platform name run: | mv examples/*/build/*/Wippersnapper_demo.ino.uf2 wippersnapper.${{ matrix.arduino-platform }}.${{ env.WS_VERSION }}.uf2 mv examples/*/build/*/Wippersnapper_demo.ino.bin wippersnapper.${{ matrix.arduino-platform }}.${{ env.WS_VERSION }}.bin - name: upload build artifacts uses: actions/upload-artifact@v4 with: name: build-files-${{ matrix.arduino-platform }}.${{ env.WS_VERSION }} path: | wippersnapper.${{ matrix.arduino-platform }}.${{ env.WS_VERSION }}.uf2 wippersnapper.${{ matrix.arduino-platform }}.${{ env.WS_VERSION }}.bin build-esp32: name: 🏗️ESP32/Cx runs-on: ubuntu-latest strategy: fail-fast: false matrix: arduino-platform: [ "wippersnapper_feather_esp32", "qtpy_esp32", "sparklemotionmini_esp32", "sparklemotionstick_esp32", "feather_esp32_v2", "itsybitsy_esp32", "dfrobot_beetle_esp32c3", "wippersnapper_qtpy_esp32c3", "wippersnapper_feather_esp32c6" ] include: - offset: "0x1000" - offset: "0x0" arduino-platform: "dfrobot_beetle_esp32c3" - offset: "0x0" arduino-platform: "wippersnapper_qtpy_esp32c3" - offset: "0x0" arduino-platform: "wippersnapper_feather_esp32c6" steps: - name: "skip if unwanted" continue-on-error: true if: | github.event_name == 'workflow_dispatch' && github.event.inputs.board != '' && matrix.arduino-platform != github.event.inputs.board run: | echo "don't build this one!"; exit 1 - uses: actions/setup-python@v5 with: python-version: "3.x" - uses: actions/checkout@v4 - name: Get WipperSnapper version run: | git fetch --prune --unshallow --tags git describe --dirty --tags echo >>$GITHUB_ENV WS_VERSION=$(git describe --dirty --tags) - uses: actions/checkout@v4 with: repository: adafruit/ci-arduino ref: ci-wippersnapper path: ci - name: Checkout Board Definitions uses: actions/checkout@v4 with: repository: adafruit/Wippersnapper_Boards path: ws-boards - name: Install CI-Arduino run: bash ci/actions_install.sh - name: Install extra Arduino libraries run: | git clone --quiet --branch v4.0.3 https://github.com/milesburton/Arduino-Temperature-Control-Library.git /home/runner/Arduino/libraries/Arduino-Temperature-Control-Library git clone --quiet https://github.com/pstolarz/OneWireNg.git /home/runner/Arduino/libraries/OneWireNg - name: Download stable Nanopb id: download-nanopb continue-on-error: true run: | wget https://jpa.kapsi.fi/nanopb/download/nanopb-0.4.8.tar.gz - if: ${{ failure() || steps.download-nanopb.outcome != 'success' }} name: Restore cached nanopb id: cache-nanopb-restore uses: actions/cache/restore@v4 env: cache-name: cache-node-modules with: path: ./nanopb-0.4.8.tar.gz key: nanopb-0.4.8.tar.gz - if: ${{ steps.download-nanopb.outcome == 'success' }} name: Save nanopb to cache id: cache-nanopb-save uses: actions/cache/save@v4 env: cache-name: cache-node-modules with: path: ./nanopb-0.4.8.tar.gz key: nanopb-0.4.8.tar.gz - name: Install stable Nanopb run: | tar -xf nanopb-0.4.8.tar.gz # Copy files to WipperSnapper's src/nanopb directory cp nanopb/pb_common.* nanopb/pb_encode.* nanopb/pb_decode.* src/nanopb mv nanopb/pb.h src/nanopb/nanopb.pb.h - name: Install Dependencies run: | pip install esptool - name: build ESP32 platforms run: python3 ci/build_platform.py ${{ matrix.arduino-platform }} --build_timeout 48000 - name: Check artifacts run: | ls examples/Wippersnapper_demo/build/* - name: Rename build artifacts to reflect the platform name run: | mv examples/Wippersnapper_demo/build/*/Wippersnapper_demo.ino.bin wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.bin mv examples/Wippersnapper_demo/build/*/Wippersnapper_demo.ino.elf wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.elf mv examples/Wippersnapper_demo/build/*/Wippersnapper_demo.ino.map wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.map mv examples/Wippersnapper_demo/build/*/Wippersnapper_demo.ino.bootloader.bin wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.bootloader.bin mv examples/Wippersnapper_demo/build/*/Wippersnapper_demo.ino.partitions.bin wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.partitions.bin - name: Check boot_app0 file existence (esp32 built from core, not-source) id: check_files uses: andstor/file-existence-action@v3 with: files: "/home/runner/.arduino15/packages/esp32/hardware/esp32/*/tools/partitions/boot_app0.bin" - name: boot_app0 file from arduino-cli core if: steps.check_files.outputs.files_exists == 'true' run: mv /home/runner/.arduino15/packages/esp32/hardware/esp32/*/tools/partitions/boot_app0.bin wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.boot_app0.bin - name: boot_app0 file from esp32 source bsp if: steps.check_files.outputs.files_exists == 'false' run: mv /home/runner/Arduino/hardware/espressif/esp32/tools/partitions/boot_app0.bin wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.boot_app0.bin - name: Get Board Flash Parameters id: get_board_json run: | board_name=${{ matrix.arduino-platform }} # Remove '_noota' suffix if present board_name=${board_name%_noota} # Remove 'wippersnapper_' prefix if present board_name=${board_name#wippersnapper_} content=$(cat ws-boards/boards/${board_name//_/-}/definition.json) { echo 'boardJson<> "$GITHUB_OUTPUT" - name: Create combined binary using Esptool merge-bin run: | echo ${{ steps.get_board_json.outputs.boardJson }} echo ${{ fromJson(steps.get_board_json.outputs.boardJson) }} python3 -m esptool --chip ${{fromJson(steps.get_board_json.outputs.boardJson).esptool.chip}} merge-bin \ --flash-mode ${{fromJson(steps.get_board_json.outputs.boardJson).esptool.flashMode}} \ --flash-freq ${{fromJson(steps.get_board_json.outputs.boardJson).esptool.flashFreq}} \ --flash-size ${{fromJson(steps.get_board_json.outputs.boardJson).esptool.flashSize}} \ -o wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.combined.bin \ ${{ matrix.offset }} wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.bootloader.bin \ 0x8000 wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.partitions.bin \ 0xe000 wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.boot_app0.bin \ 0x10000 wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.bin - name: Zip build artifacts run: | zip -r wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.zip wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.* - name: upload build artifacts zip uses: actions/upload-artifact@v4 with: name: build-files-${{ matrix.arduino-platform }}.${{ env.WS_VERSION }} path: | wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.zip build-samd: name: 🏗️SAMD runs-on: ubuntu-latest strategy: fail-fast: false matrix: arduino-platform: [ "pyportal_tinyusb", "pyportal_titano_tinyusb", "metro_m4_airliftlite_tinyusb", ] steps: - name: "skip if unwanted" continue-on-error: true if: | github.event_name == 'workflow_dispatch' && github.event.inputs.board != '' && matrix.arduino-platform != github.event.inputs.board run: | echo "don't build this one!"; exit 1 - uses: actions/setup-python@v5 with: python-version: "3.x" - uses: actions/checkout@v4 - name: Get WipperSnapper version run: | git fetch --prune --unshallow --tags git describe --dirty --tags echo >>$GITHUB_ENV WS_VERSION=$(git describe --dirty --tags) - uses: actions/checkout@v4 with: repository: adafruit/ci-arduino ref: ci-wippersnapper path: ci - name: Install CI-Arduino run: bash ci/actions_install.sh # manually install Adafruit WiFiNINA library fork - name: Install extra Arduino libraries run: | git clone --quiet https://github.com/adafruit/WiFiNINA.git /home/runner/Arduino/libraries/WiFiNINA git clone --quiet --branch v4.0.3 https://github.com/milesburton/Arduino-Temperature-Control-Library.git /home/runner/Arduino/libraries/Arduino-Temperature-Control-Library git clone --quiet https://github.com/PaulStoffregen/OneWire.git /home/runner/Arduino/libraries/OneWire git clone --quiet https://github.com/adafruit/Adafruit_TinyUSB_Arduino /home/runner/Arduino/libraries/Adafruit_TinyUSB_Arduino - name: Download stable Nanopb id: download-nanopb continue-on-error: true run: | wget https://jpa.kapsi.fi/nanopb/download/nanopb-0.4.8.tar.gz - if: ${{ failure() || steps.download-nanopb.outcome != 'success' }} name: Restore cached nanopb id: cache-nanopb-restore uses: actions/cache/restore@v4 env: cache-name: cache-node-modules with: path: ./nanopb-0.4.8.tar.gz key: nanopb-0.4.8.tar.gz - if: ${{ steps.download-nanopb.outcome == 'success' }} name: Save nanopb to cache id: cache-nanopb-save uses: actions/cache/save@v4 env: cache-name: cache-node-modules with: path: ./nanopb-0.4.8.tar.gz key: nanopb-0.4.8.tar.gz - name: Install stable Nanopb run: | tar -xf nanopb-0.4.8.tar.gz # Copy files to WipperSnapper's src/nanopb directory cp nanopb/pb_common.* nanopb/pb_encode.* nanopb/pb_decode.* src/nanopb mv nanopb/pb.h src/nanopb/nanopb.pb.h - name: build SAMD platforms run: python3 ci/build_platform.py ${{ matrix.arduino-platform }} --build_timeout 48000 - name: Rename build artifacts to reflect the platform name run: | mv examples/*/build/*/Wippersnapper_demo.ino.uf2 wippersnapper.${{ matrix.arduino-platform }}.${{ env.WS_VERSION }}.uf2 mv examples/*/build/*/Wippersnapper_demo.ino.hex wippersnapper.${{ matrix.arduino-platform }}.${{ env.WS_VERSION }}.hex - name: upload build artifacts uses: actions/upload-artifact@v4 with: name: build-files-${{ matrix.arduino-platform }}.${{ env.WS_VERSION }} path: | wippersnapper.${{ matrix.arduino-platform }}.${{ env.WS_VERSION }}.uf2 wippersnapper.${{ matrix.arduino-platform }}.${{ env.WS_VERSION }}.hex build-rp2040: name: 🏗️RP2040 runs-on: ubuntu-latest strategy: fail-fast: false matrix: arduino-platform: ["picow_rp2040_tinyusb", "picow_rp2350_tinyusb", "fruit_jam_tinyusb"] steps: - name: "skip if unwanted" continue-on-error: true if: | github.event_name == 'workflow_dispatch' && github.event.inputs.board != '' && matrix.arduino-platform != github.event.inputs.board run: | echo "don't build this one!"; exit 1 - uses: actions/setup-python@v5 with: python-version: "3.x" - uses: actions/checkout@v4 - name: Get WipperSnapper version run: | git fetch --prune --unshallow --tags git describe --dirty --tags echo >>$GITHUB_ENV WS_VERSION=$(git describe --dirty --tags) - uses: actions/checkout@v4 with: repository: adafruit/ci-arduino ref: ci-wippersnapper path: ci - name: Install CI-Arduino run: bash ci/actions_install.sh # manually install OneWireNG/TempControlLib for OneWireNg (RP2040 Supported OneWire w/backwards compat.) - name: Install extra Arduino libraries run: | git clone --quiet https://github.com/pstolarz/OneWireNg.git /home/runner/Arduino/libraries/OneWireNg git clone --quiet https://github.com/pstolarz/Arduino-Temperature-Control-Library.git /home/runner/Arduino/libraries/Arduino-Temperature-Control-Library git clone --quiet https://github.com/adafruit/Adafruit_TinyUSB_Arduino /home/runner/Arduino/libraries/Adafruit_TinyUSB_Arduino - name: Download stable Nanopb id: download-nanopb continue-on-error: true run: | wget https://jpa.kapsi.fi/nanopb/download/nanopb-0.4.8.tar.gz - if: ${{ failure() || steps.download-nanopb.outcome != 'success' }} name: Restore cached nanopb id: cache-nanopb-restore uses: actions/cache/restore@v4 env: cache-name: cache-node-modules with: path: ./nanopb-0.4.8.tar.gz key: nanopb-0.4.8.tar.gz - if: ${{ steps.download-nanopb.outcome == 'success' }} name: Save nanopb to cache id: cache-nanopb-save uses: actions/cache/save@v4 env: cache-name: cache-node-modules with: path: ./nanopb-0.4.8.tar.gz key: nanopb-0.4.8.tar.gz - name: Install stable Nanopb run: | tar -xf nanopb-0.4.8.tar.gz # Copy files to WipperSnapper's src/nanopb directory cp nanopb/pb_common.* nanopb/pb_encode.* nanopb/pb_decode.* src/nanopb mv nanopb/pb.h src/nanopb/nanopb.pb.h - name: build RP2040 platforms run: python3 ci/build_platform.py ${{ matrix.arduino-platform }} --build_timeout 48000 - name: Rename build artifacts to reflect the platform name run: | mv examples/*/build/*/Wippersnapper_demo.ino.uf2 wippersnapper.${{ matrix.arduino-platform }}.${{ env.WS_VERSION }}.uf2 - name: upload build artifacts uses: actions/upload-artifact@v4 with: name: build-files-${{ matrix.arduino-platform }}.${{ env.WS_VERSION }} path: | wippersnapper.${{ matrix.arduino-platform }}.${{ env.WS_VERSION }}.uf2 build-esp8266: name: 🏗️ESP8266 runs-on: ubuntu-latest strategy: fail-fast: false matrix: arduino-platform: ["feather_esp8266"] steps: - name: "skip if unwanted" continue-on-error: true if: | github.event_name == 'workflow_dispatch' && github.event.inputs.board != '' && matrix.arduino-platform != github.event.inputs.board run: | echo "don't build this one!"; exit 1 - uses: actions/setup-python@v5 with: python-version: "3.x" - uses: actions/checkout@v4 - name: Get WipperSnapper version run: | git fetch --prune --unshallow --tags git describe --dirty --tags echo >>$GITHUB_ENV WS_VERSION=$(git describe --dirty --tags) - uses: actions/checkout@v4 with: repository: adafruit/ci-arduino ref: ci-wippersnapper path: ci - name: Install CI-Arduino run: bash ci/actions_install.sh - name: Install extra Arduino library run: | git clone --quiet --branch v4.0.3 https://github.com/milesburton/Arduino-Temperature-Control-Library.git /home/runner/Arduino/libraries/Arduino-Temperature-Control-Library git clone --quiet https://github.com/PaulStoffregen/OneWire.git /home/runner/Arduino/libraries/OneWire - name: Download stable Nanopb id: download-nanopb continue-on-error: true run: | wget https://jpa.kapsi.fi/nanopb/download/nanopb-0.4.8.tar.gz - if: ${{ failure() || steps.download-nanopb.outcome != 'success' }} name: Restore cached nanopb id: cache-nanopb-restore uses: actions/cache/restore@v4 env: cache-name: cache-node-modules with: path: ./nanopb-0.4.8.tar.gz key: nanopb-0.4.8.tar.gz - if: ${{ steps.download-nanopb.outcome == 'success' }} name: Save nanopb to cache id: cache-nanopb-save uses: actions/cache/save@v4 env: cache-name: cache-node-modules with: path: ./nanopb-0.4.8.tar.gz key: nanopb-0.4.8.tar.gz - name: Install stable Nanopb run: | tar -xf nanopb-0.4.8.tar.gz # Copy files to WipperSnapper's src/nanopb directory cp nanopb/pb_common.* nanopb/pb_encode.* nanopb/pb_decode.* src/nanopb mv nanopb/pb.h src/nanopb/nanopb.pb.h - name: build ESP8266 platforms run: python3 ci/build_platform.py ${{ matrix.arduino-platform }} --build_timeout 48000 - name: list build artifacts run: | ls ls examples/* - name: Rename build artifacts to reflect the platform name run: | mv examples/*/build/*/Wippersnapper_demo.ino.bin wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.bin mv examples/*/build/*/Wippersnapper_demo.ino.elf wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.elf mv examples/*/build/*/Wippersnapper_demo.ino.map wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.map - name: Zip build artifacts run: | zip -r wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.zip wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.* - name: upload build artifacts zip uses: actions/upload-artifact@v4 with: name: build-files-${{ matrix.arduino-platform }}.${{ env.WS_VERSION }} path: | wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.zip build-esp32sx-dev: name: 🏗️ESP32-Sx(DEV) runs-on: ubuntu-latest strategy: fail-fast: false matrix: arduino-platform: [ "esp32s3_devkitc_1_n8_debug", "feather_esp32s2_debug", "feather_esp32s2_tft_debug", "feather_esp32s3_debug", "feather_esp32s3_4mbflash_2mbpsram_debug", "feather_esp32s3_tft_debug", "wippersnapper_feather_esp32s3_reverse_tft_debug", "metroesp32s2_debug", "metro_esp32s3_debug", ] steps: - name: "skip if unwanted" continue-on-error: true if: | github.event_name == 'workflow_dispatch' && github.event.inputs.board != '' && matrix.arduino-platform != github.event.inputs.board run: | echo "don't build this one!"; exit 1 - uses: actions/setup-python@v5 with: python-version: "3.x" - uses: actions/checkout@v4 - name: Get WipperSnapper version run: | git fetch --prune --unshallow --tags git describe --dirty --tags echo >>$GITHUB_ENV WS_VERSION=$(git describe --dirty --tags) - uses: actions/checkout@v4 with: repository: adafruit/ci-arduino ref: ci-wippersnapper path: ci - name: Install CI-Arduino run: bash ci/actions_install.sh - name: Install extra Arduino libraries run: | git clone --quiet --branch v4.0.3 https://github.com/milesburton/Arduino-Temperature-Control-Library.git /home/runner/Arduino/libraries/Arduino-Temperature-Control-Library git clone --quiet https://github.com/pstolarz/OneWireNg.git /home/runner/Arduino/libraries/OneWireNg git clone --quiet https://github.com/adafruit/Adafruit_HX8357_Library.git /home/runner/Arduino/libraries/Adafruit_HX8357_Library git clone --quiet https://github.com/adafruit/Adafruit_ILI9341.git /home/runner/Arduino/libraries/Adafruit_ILI9341 git clone --quiet https://github.com/adafruit/Adafruit_STMPE610.git /home/runner/Arduino/libraries/Adafruit_STMPE610 git clone --quiet https://github.com/adafruit/Adafruit-ST7735-Library.git /home/runner/Arduino/libraries/Adafruit-ST7735-Library git clone --quiet https://github.com/adafruit/Adafruit_TouchScreen.git /home/runner/Arduino/libraries/Adafruit_TouchScreen git clone --quiet https://github.com/adafruit/Adafruit_TinyUSB_Arduino /home/runner/Arduino/libraries/Adafruit_TinyUSB_Arduino git clone --depth 1 --branch wippersnapper https://github.com/brentru/lvgl.git /home/runner/Arduino/libraries/lvgl git clone --depth 1 --branch development https://github.com/brentru/Adafruit_LvGL_Glue.git /home/runner/Arduino/libraries/Adafruit_LittlevGL_Glue_Library - name: Download stable Nanopb id: download-nanopb continue-on-error: true run: | wget https://jpa.kapsi.fi/nanopb/download/nanopb-0.4.8.tar.gz - if: ${{ failure() || steps.download-nanopb.outcome != 'success' }} name: Restore cached nanopb id: cache-nanopb-restore uses: actions/cache/restore@v4 env: cache-name: cache-node-modules with: path: ./nanopb-0.4.8.tar.gz key: nanopb-0.4.8.tar.gz - if: ${{ steps.download-nanopb.outcome == 'success' }} name: Save nanopb to cache id: cache-nanopb-save uses: actions/cache/save@v4 env: cache-name: cache-node-modules with: path: ./nanopb-0.4.8.tar.gz key: nanopb-0.4.8.tar.gz - name: Install stable Nanopb run: | tar -xf nanopb-0.4.8.tar.gz # Copy files to WipperSnapper's src/nanopb directory cp nanopb/pb_common.* nanopb/pb_encode.* nanopb/pb_decode.* src/nanopb mv nanopb/pb.h src/nanopb/nanopb.pb.h - name: List all files in Adafruit_LittlevGL_Glue_Library folder run: | ls /home/runner/Arduino/libraries/Adafruit_LittlevGL_Glue_Library - name: Copy lv_conf.h file in Adafruit_LittlevGL_Glue_Library to the arduino library folder run: | cp /home/runner/Arduino/libraries/Adafruit_LittlevGL_Glue_Library/lv_conf.h /home/runner/Arduino/libraries - name: Build for ESP32-SX run: python3 ci/build_platform.py ${{ matrix.arduino-platform }} --build_timeout 48000 - name: list run: | ls ls -R examples/*/build/ - name: Rename build artifacts to reflect the platform name run: | mv examples/*/build/*/wippersnapper_debug.ino.uf2 wippersnapper.${{ matrix.arduino-platform }}.${{ env.WS_VERSION }}.uf2 mv examples/*/build/*/wippersnapper_debug.ino.bin wippersnapper.${{ matrix.arduino-platform }}.${{ env.WS_VERSION }}.bin - name: upload build artifacts uses: actions/upload-artifact@v4 with: name: build-files-dev-${{ matrix.arduino-platform }}.${{ env.WS_VERSION }} path: | wippersnapper.${{ matrix.arduino-platform }}.${{ env.WS_VERSION }}.uf2 wippersnapper.${{ matrix.arduino-platform }}.${{ env.WS_VERSION }}.bin build-esp32-dev: name: 🏗️ESP32/Cx(DEV) runs-on: ubuntu-latest strategy: fail-fast: false matrix: arduino-platform: [ "wippersnapper_feather_esp32c6_debug", ] include: - offset: "0x1000" - offset: "0x0" arduino-platform: "wippersnapper_feather_esp32c6_debug" steps: - name: "skip if unwanted" continue-on-error: true if: | github.event_name == 'workflow_dispatch' && github.event.inputs.board != '' && matrix.arduino-platform != github.event.inputs.board run: | echo "don't build this one!"; exit 1 - uses: actions/setup-python@v5 with: python-version: "3.x" - uses: actions/checkout@v4 - name: Get WipperSnapper version run: | git fetch --prune --unshallow --tags git describe --dirty --tags echo >>$GITHUB_ENV WS_VERSION=$(git describe --dirty --tags) - uses: actions/checkout@v4 with: repository: adafruit/ci-arduino ref: ci-wippersnapper path: ci - name: Checkout Board Definitions uses: actions/checkout@v4 with: repository: adafruit/Wippersnapper_Boards path: ws-boards - name: Install CI-Arduino run: bash ci/actions_install.sh - name: Install extra Arduino libraries run: | git clone --quiet --branch v4.0.3 https://github.com/milesburton/Arduino-Temperature-Control-Library.git /home/runner/Arduino/libraries/Arduino-Temperature-Control-Library git clone --quiet https://github.com/pstolarz/OneWireNg.git /home/runner/Arduino/libraries/OneWireNg - name: Download stable Nanopb id: download-nanopb continue-on-error: true run: | wget https://jpa.kapsi.fi/nanopb/download/nanopb-0.4.8.tar.gz - if: ${{ failure() || steps.download-nanopb.outcome != 'success' }} name: Restore cached nanopb id: cache-nanopb-restore uses: actions/cache/restore@v4 env: cache-name: cache-node-modules with: path: ./nanopb-0.4.8.tar.gz key: nanopb-0.4.8.tar.gz - if: ${{ steps.download-nanopb.outcome == 'success' }} name: Save nanopb to cache id: cache-nanopb-save uses: actions/cache/save@v4 env: cache-name: cache-node-modules with: path: ./nanopb-0.4.8.tar.gz key: nanopb-0.4.8.tar.gz - name: Install stable Nanopb run: | tar -xf nanopb-0.4.8.tar.gz # Copy files to WipperSnapper's src/nanopb directory cp nanopb/pb_common.* nanopb/pb_encode.* nanopb/pb_decode.* src/nanopb mv nanopb/pb.h src/nanopb/nanopb.pb.h - name: Install Dependencies run: | pip3 install esptool - name: build ESP32 platforms run: python3 ci/build_platform.py ${{ matrix.arduino-platform }} --build_timeout 48000 - name: Check artifacts run: | ls examples/wippersnapper_debug/build/* - name: Rename build artifacts to reflect the platform name run: | mv examples/wippersnapper_debug/build/*/wippersnapper_debug.ino.bin wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.bin mv examples/wippersnapper_debug/build/*/wippersnapper_debug.ino.elf wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.elf mv examples/wippersnapper_debug/build/*/wippersnapper_debug.ino.map wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.map mv examples/wippersnapper_debug/build/*/wippersnapper_debug.ino.bootloader.bin wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.bootloader.bin mv examples/wippersnapper_debug/build/*/wippersnapper_debug.ino.partitions.bin wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.partitions.bin - name: Check boot_app0 file existence (esp32 built from core, not-source) id: check_files uses: andstor/file-existence-action@v3 with: files: "/home/runner/.arduino15/packages/esp32/hardware/esp32/*/tools/partitions/boot_app0.bin" - name: boot_app0 file from arduino-cli core if: steps.check_files.outputs.files_exists == 'true' run: mv /home/runner/.arduino15/packages/esp32/hardware/esp32/*/tools/partitions/boot_app0.bin wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.boot_app0.bin - name: boot_app0 file from esp32 source bsp if: steps.check_files.outputs.files_exists == 'false' run: mv /home/runner/Arduino/hardware/espressif/esp32/tools/partitions/boot_app0.bin wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.boot_app0.bin - name: Get Board Flash Parameters id: get_board_json run: | board_name=${{ matrix.arduino-platform }} # Remove '_noota' suffix if present board_name=${board_name%_noota} # Remove '_debug' suffix if present board_name=${board_name%_debug} # Remove 'wippersnapper_' prefix if present board_name=${board_name#wippersnapper_} content=$(cat ws-boards/boards/${board_name//_/-}/definition.json) { echo 'boardJson<> "$GITHUB_OUTPUT" - name: Create combined binary using Esptool merge-bin run: | echo ${{ steps.get_board_json.outputs.boardJson }} echo ${{ fromJson(steps.get_board_json.outputs.boardJson) }} python3 -m esptool --chip ${{fromJson(steps.get_board_json.outputs.boardJson).esptool.chip}} merge-bin \ --flash-mode ${{fromJson(steps.get_board_json.outputs.boardJson).esptool.flashMode}} \ --flash-freq ${{fromJson(steps.get_board_json.outputs.boardJson).esptool.flashFreq}} \ --flash-size ${{fromJson(steps.get_board_json.outputs.boardJson).esptool.flashSize}} \ -o wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.combined.bin \ ${{ matrix.offset }} wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.bootloader.bin \ 0x8000 wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.partitions.bin \ 0xe000 wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.boot_app0.bin \ 0x10000 wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.bin - name: Zip build artifacts run: | zip -r wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.zip wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.* - name: upload build artifacts zip uses: actions/upload-artifact@v4 with: name: build-files-dev-${{ matrix.arduino-platform }}.${{ env.WS_VERSION }} path: | wippersnapper.${{ matrix.arduino-platform }}.littlefs.${{ env.WS_VERSION }}.zip merge-job-build-files: name: Merge Artifacts for build-files runs-on: ubuntu-latest needs: [build-esp32sx-esptool, build-esp32sx, build-esp32, build-esp8266, build-samd, build-rp2040] steps: - name: Merge Artifacts from Builds uses: actions/upload-artifact/merge@v4 with: name: build-files pattern: build-files-!(dev)-* delete-merged: true merge-job2: name: Merge Artifacts for build-files-dev runs-on: ubuntu-latest needs: [build-esp32sx-dev, build-esp32-dev] steps: - name: Merge Artifacts from Dev Builds uses: actions/upload-artifact/merge@v4 with: name: build-files-dev pattern: build-files-dev-* delete-merged: true clang_and_doxy: name: 🔎Clang & Doxygen runs-on: ubuntu-latest needs: [ build-samd, build-esp32, build-esp32sx, build-esp8266, build-rp2040, ] steps: - uses: actions/setup-python@v5 with: python-version: "3.x" - uses: actions/checkout@v4 - uses: actions/checkout@v4 with: repository: adafruit/ci-arduino ref: ci-wippersnapper path: ci - name: pre-install run: bash ci/actions_install.sh - name: clang run: python3 ci/run-clang-format.py -r -e "ci/*" -e "bin/*" -e src/nanopb -e src/wippersnapper -e src/pb.h -e src/provisioning/tinyusb src/ - name: doxygen env: GH_REPO_TOKEN: ${{ secrets.GH_REPO_TOKEN }} PRETTYNAME: "Adafruit.io WipperSnapper Library" run: bash ci/doxy_gen_and_deploy.sh