Merge branch 'master' into release/v3.3.x

This commit is contained in:
Me No Dev 2025-03-27 13:39:40 +02:00 committed by GitHub
commit d81c19534f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
50 changed files with 778 additions and 294 deletions

View file

@ -2,93 +2,6 @@
build_all=false build_all=false
chunks_count=0 chunks_count=0
last_check_files=""
last_check_result=""
gh_output=""
# Define the file patterns
core_files=(
'\.github/.*'
'cores/.*'
'package/.*'
'tools/.*'
'platform\.txt'
'programmers\.txt'
'variants/esp32/.*'
'variants/esp32c3/.*'
'variants/esp32c6/.*'
'variants/esp32h2/.*'
'variants/esp32p4/.*'
'variants/esp32s2/.*'
'variants/esp32s3/.*'
)
library_files=(
'libraries/.*/examples/.*'
'libraries/.*/src/.*'
)
networking_files=(
'libraries/Network/src/.*'
)
fs_files=(
'libraries/FS/src/.*'
)
static_sketches_files=(
'libraries/NetworkClientSecure/examples/WiFiClientSecure/WiFiClientSecure\.ino'
'libraries/BLE/examples/Server/Server\.ino'
'libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer\.ino'
'libraries/Insights/examples/MinimalDiagnostics/MinimalDiagnostics\.ino'
'libraries/NetworkClientSecure/src/.*'
'libraries/BLE/src/.*'
'libraries/Insights/src/.*'
)
idf_files=(
'idf_component\.yml'
'Kconfig\.projbuild'
'CMakeLists\.txt'
'variants/esp32c2/.*'
)
# Function to check if any files match the patterns
check_files() {
local patterns=("$@")
local files_found=""
for pattern in "${patterns[@]}"; do
echo "Checking pattern: $pattern"
matched_files=$(echo "$gh_output" | grep -E "$pattern")
echo "matched_files: $matched_files"
files_found+="$matched_files "
done
last_check_files=$(echo "$files_found" | xargs)
if [[ -n $last_check_files ]]; then
last_check_result="true"
else
last_check_result="false"
fi
echo "last_check_result: $last_check_result"
}
if [[ $IS_PR != 'true' ]]; then
gh_output=$(gh api repos/espressif/arduino-esp32/commits/"$GITHUB_SHA" --jq '.files[].filename')
else
gh_output=$(gh pr diff "$PR_NUM" --name-only)
fi
echo "gh_output: $gh_output"
# Output the results
check_files "${core_files[@]}"
CORE_CHANGED=$last_check_result
check_files "${library_files[@]}"
LIB_CHANGED=$last_check_result
LIB_FILES=$last_check_files
check_files "${networking_files[@]}"
NETWORKING_CHANGED=$last_check_result
check_files "${fs_files[@]}"
FS_CHANGED=$last_check_result
check_files "${static_sketches_files[@]}"
STATIC_SKETCHES_CHANGED=$last_check_result
check_files "${idf_files[@]}"
IDF_CHANGED=$last_check_result
if [[ $CORE_CHANGED == 'true' ]] || [[ $IS_PR != 'true' ]]; then if [[ $CORE_CHANGED == 'true' ]] || [[ $IS_PR != 'true' ]]; then
echo "Core files changed or not a PR. Building all." echo "Core files changed or not a PR. Building all."
@ -163,9 +76,9 @@ chunks+="]"
{ {
echo "build_all=$build_all" echo "build_all=$build_all"
echo "build_libraries=$LIB_CHANGED" echo "build_libraries=$BUILD_LIBRARIES"
echo "build_static_sketches=$STATIC_SKETCHES_CHANGED" echo "build_static_sketches=$BUILD_STATIC_SKETCHES"
echo "build_idf=$IDF_CHANGED" echo "build_idf=$BUILD_IDF"
echo "chunk_count=$chunks_count" echo "chunk_count=$chunks_count"
echo "chunks=$chunks" echo "chunks=$chunks"
} >> "$GITHUB_OUTPUT" } >> "$GITHUB_OUTPUT"

View file

@ -15,7 +15,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
ref: ${{ github.event.client_payload.branch }} ref: ${{ github.event.client_payload.branch }}
@ -32,13 +32,13 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
ref: ${{ github.event.client_payload.branch }} ref: ${{ github.event.client_payload.branch }}
- run: npm install - run: npm install
- name: Setup jq - name: Setup jq
uses: dcarbone/install-jq-action@v1.0.1 uses: dcarbone/install-jq-action@e397bd87438d72198f81efd21f876461183d383a # v3.0.1
- id: set-test-chunks - id: set-test-chunks
name: Set Chunks name: Set Chunks
@ -64,7 +64,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
ref: ${{ github.event.client_payload.branch }} ref: ${{ github.event.client_payload.branch }}
@ -74,7 +74,7 @@ jobs:
FQBN: ${{ toJSON(matrix.chunk) }} FQBN: ${{ toJSON(matrix.chunk) }}
- name: Compile sketch - name: Compile sketch
uses: P-R-O-C-H-Y/compile-sketches@main uses: P-R-O-C-H-Y/compile-sketches@a62f069b92dc8f5053da4ac439ea6d1950cf6379 # main
with: with:
platforms: | platforms: |
${{ env.REPOSITORY }} ${{ env.REPOSITORY }}

View file

@ -22,10 +22,10 @@ jobs:
steps: steps:
# This step makes the contents of the repository available to the workflow # This step makes the contents of the repository available to the workflow
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup jq - name: Setup jq
uses: dcarbone/install-jq-action@v1.0.1 uses: dcarbone/install-jq-action@e397bd87438d72198f81efd21f876461183d383a # v3.0.1
- name: Get board name - name: Get board name
run: bash .github/scripts/find_new_boards.sh ${{ github.repository }} ${{github.base_ref}} run: bash .github/scripts/find_new_boards.sh ${{ github.repository }} ${{github.base_ref}}
@ -47,7 +47,7 @@ jobs:
steps: steps:
# This step makes the contents of the repository available to the workflow # This step makes the contents of the repository available to the workflow
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Check if build.board is uppercase - name: Check if build.board is uppercase
run: | run: |
@ -60,7 +60,7 @@ jobs:
fi fi
- name: Get libs cache - name: Get libs cache
uses: actions/cache@v4 uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with: with:
key: libs-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package/package_esp32_index.template.json', 'tools/get.py') }} key: libs-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package/package_esp32_index.template.json', 'tools/get.py') }}
path: | path: |
@ -73,7 +73,7 @@ jobs:
./tools/xtensa-* ./tools/xtensa-*
- name: Compile sketch - name: Compile sketch
uses: P-R-O-C-H-Y/compile-sketches@main uses: P-R-O-C-H-Y/compile-sketches@a62f069b92dc8f5053da4ac439ea6d1950cf6379 # main
with: with:
platforms: | platforms: |
${{ env.REPOSITORY }} ${{ env.REPOSITORY }}

View file

@ -18,7 +18,7 @@ jobs:
all_changed_files: ${{ steps.verify-changed-files.outputs.all_changed_files }} all_changed_files: ${{ steps.verify-changed-files.outputs.all_changed_files }}
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
fetch-depth: 2 fetch-depth: 2
ref: ${{ github.event.pull_request.head.ref }} ref: ${{ github.event.pull_request.head.ref }}
@ -30,15 +30,16 @@ jobs:
echo "Make sure you are using a branch inside the repository and not a fork." echo "Make sure you are using a branch inside the repository and not a fork."
- name: Verify Python Tools Changed - name: Verify Python Tools Changed
uses: tj-actions/changed-files@2f7c5bfce28377bc069a65ba478de0a74aa0ca32 # v46.0.1
id: verify-changed-files id: verify-changed-files
run: | with:
CHANGED_FILES=$(git diff-tree --no-commit-id --name-only -r ^HEAD -- tools/get.py tools/espota.py tools/gen_esp32part.py tools/gen_insights_package.py | xargs) fetch_depth: "2"
echo "all_changed_files=$CHANGED_FILES" >> $GITHUB_OUTPUT since_last_remote_commit: "true"
if [ -n "$CHANGED_FILES" ]; then files: |
echo "any_changed=true" >> $GITHUB_OUTPUT tools/get.py
else tools/espota.py
echo "any_changed=false" >> $GITHUB_OUTPUT tools/gen_esp32part.py
fi tools/gen_insights_package.py
- name: List all changed files - name: List all changed files
shell: bash shell: bash
@ -88,25 +89,30 @@ jobs:
for tool in ${{ env.CHANGED_TOOLS }}; do for tool in ${{ env.CHANGED_TOOLS }}; do
echo "tool $tool was changed" echo "tool $tool was changed"
done done
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
token: ${{ secrets.TOOLS_UPLOAD_PAT }} token: ${{ secrets.TOOLS_UPLOAD_PAT }}
ref: ${{ github.event.pull_request.head.ref }} ref: ${{ github.event.pull_request.head.ref }}
- name: Set up Python 3.8 - name: Set up Python 3.8
uses: actions/setup-python@master uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
with: with:
python-version: 3.8 python-version: 3.8
- name: Install dependencies - name: Install dependencies
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip install pyinstaller requests pip install pyinstaller requests
- name: Build with PyInstaller - name: Build with PyInstaller
shell: bash shell: bash
run: | run: |
for tool in ${{ env.CHANGED_TOOLS }}; do for tool in ${{ env.CHANGED_TOOLS }}; do
pyinstaller --distpath ./${{ env.DISTPATH }} -F --icon=.github/pytools/espressif.ico tools/$tool.py pyinstaller --distpath ./${{ env.DISTPATH }} -F --icon=.github/pytools/espressif.ico tools/$tool.py
done done
- name: Sign binaries - name: Sign binaries
if: matrix.os == 'windows-latest' if: matrix.os == 'windows-latest'
env: env:
@ -119,12 +125,14 @@ jobs:
{ {
./.github/pytools/Sign-File.ps1 -Path ./${{ env.DISTPATH }}/$node.exe ./.github/pytools/Sign-File.ps1 -Path ./${{ env.DISTPATH }}/$node.exe
} }
- name: Test binaries - name: Test binaries
shell: bash shell: bash
run: | run: |
for tool in ${{ env.CHANGED_TOOLS }}; do for tool in ${{ env.CHANGED_TOOLS }}; do
./${{ env.DISTPATH }}/$tool${{ matrix.EXTEN }} -h ./${{ env.DISTPATH }}/$tool${{ matrix.EXTEN }} -h
done done
- name: Push binary to tools - name: Push binary to tools
if: matrix.os == 'windows-latest' if: matrix.os == 'windows-latest'
env: env:
@ -135,8 +143,9 @@ jobs:
cp -f ./${{ env.DISTPATH }}/$tool.exe tools/$tool.exe cp -f ./${{ env.DISTPATH }}/$tool.exe tools/$tool.exe
done done
bash .github/scripts/upload_py_tools.sh "${{ env.CHANGED_TOOLS }}" bash .github/scripts/upload_py_tools.sh "${{ env.CHANGED_TOOLS }}"
- name: Archive artifact - name: Archive artifact
uses: actions/upload-artifact@master uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: ${{ env.DISTPATH }} name: ${{ env.DISTPATH }}
path: ${{ env.DISTPATH }} path: ${{ env.DISTPATH }}

View file

@ -12,12 +12,12 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Check out PR head - name: Check out PR head
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
- name: DangerJS pull request linter - name: DangerJS pull request linter
uses: espressif/shared-github-dangerjs@v1 uses: espressif/shared-github-dangerjs@fb17367fd3e8ff7412603b8e946d9b19ffdb2d7f # v1
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with: with:

View file

@ -21,14 +21,16 @@ jobs:
run: run:
shell: bash shell: bash
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
submodules: true submodules: true
- uses: actions/setup-python@v5
- uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
with: with:
cache-dependency-path: docs/requirements.txt cache-dependency-path: docs/requirements.txt
cache: "pip" cache: "pip"
python-version: "3.10" python-version: "3.10"
- name: Build - name: Build
run: | run: |
sudo apt update sudo apt update
@ -38,8 +40,9 @@ jobs:
cd ./docs cd ./docs
PATH=/home/runner/.local/bin:$PATH pip3 install -r requirements.txt --prefer-binary PATH=/home/runner/.local/bin:$PATH pip3 install -r requirements.txt --prefer-binary
PATH=/home/runner/.local/bin:$PATH SPHINXOPTS="-W" build-docs -l en PATH=/home/runner/.local/bin:$PATH SPHINXOPTS="-W" build-docs -l en
- name: Archive Docs - name: Archive Docs
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: docs name: docs
path: docs path: docs

View file

@ -26,14 +26,17 @@ jobs:
run: | run: |
echo "Release workflow failed. Exiting..." echo "Release workflow failed. Exiting..."
exit 1 exit 1
- uses: actions/checkout@v4
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
submodules: true submodules: true
- uses: actions/setup-python@v5
- uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
with: with:
cache-dependency-path: docs/requirements.txt cache-dependency-path: docs/requirements.txt
cache: "pip" cache: "pip"
python-version: "3.10" python-version: "3.10"
- name: Deploy Documentation - name: Deploy Documentation
env: env:
# Deploy to production server # Deploy to production server

View file

@ -15,7 +15,9 @@ jobs:
name: Build GitHub Pages name: Build GitHub Pages
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Copy Files - name: Copy Files
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View file

@ -23,16 +23,44 @@
] ]
}, },
{ {
"source-url": "https://github.com/me-no-dev/ESPAsyncWebServer.git", "source-url": "https://github.com/ESP32Async/ESPAsyncWebServer.git",
"required-libs": [ "required-libs": [
{"source-url": "https://github.com/me-no-dev/AsyncTCP.git"} {"source-url": "https://github.com/ESP32Async/AsyncTCP.git"}
], ],
"exclude_targets": [], "exclude_targets": [],
"sketch_path": [ "sketch_path": [
"~/Arduino/libraries/ESPAsyncWebServer/examples/Auth/Auth.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/CORS/CORS.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/CaptivePortal/CaptivePortal.ino", "~/Arduino/libraries/ESPAsyncWebServer/examples/CaptivePortal/CaptivePortal.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/ESP_AsyncFSBrowser/ESP_AsyncFSBrowser.ino", "~/Arduino/libraries/ESPAsyncWebServer/examples/CatchAllHandler/CatchAllHandler.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/regex_patterns/regex_patterns.ino", "~/Arduino/libraries/ESPAsyncWebServer/examples/ChunkResponse/ChunkResponse.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/simple_server/simple_server.ino" "~/Arduino/libraries/ESPAsyncWebServer/examples/ChunkRetryResponse/ChunkRetryResponse.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/EndBegin/EndBegin.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/Filters/Filters.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/FlashResponse/FlashResponse.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/HeaderManipulation/HeaderManipulation.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/Headers/Headers.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/Json/Json.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/Logging/Logging.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/MessagePack/MessagePack.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/Middleware/Middleware.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/Params/Params.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/PartitionDownloader/PartitionDownloader.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/PerfTests/PerfTests.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/RateLimit/RateLimit.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/Redirect/Redirect.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/RequestContinuation/RequestContinuation.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/RequestContinuationComplete/RequestContinuationComplete.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/ResumableDownload/ResumableDownload.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/Rewrite/Rewrite.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/ServerSentEvents/ServerSentEvents.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/ServerState/ServerState.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/SkipServerMiddleware/SkipServerMiddleware.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/SlowChunkResponse/SlowChunkResponse.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/StaticFile/StaticFile.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/Templates/Templates.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/Upload/Upload.ino",
"~/Arduino/libraries/ESPAsyncWebServer/examples/WebSocket/WebSocket.ino"
] ]
}, },
{ {

View file

@ -62,10 +62,10 @@ jobs:
steps: steps:
# This step makes the contents of the repository available to the workflow # This step makes the contents of the repository available to the workflow
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Compile sketch - name: Compile sketch
uses: P-R-O-C-H-Y/compile-sketches@main uses: P-R-O-C-H-Y/compile-sketches@a62f069b92dc8f5053da4ac439ea6d1950cf6379 # main
with: with:
platforms: | platforms: |
${{ env.REPOSITORY }} ${{ env.REPOSITORY }}
@ -80,7 +80,7 @@ jobs:
- --warnings="all" - --warnings="all"
- name: Upload artifact - name: Upload artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: ${{ env.SKETCHES_REPORTS_ARTIFACT_NAME }}-${{ matrix.target }} name: ${{ env.SKETCHES_REPORTS_ARTIFACT_NAME }}-${{ matrix.target }}
path: ${{ env.SKETCHES_REPORTS_PATH }} path: ${{ env.SKETCHES_REPORTS_PATH }}
@ -92,7 +92,7 @@ jobs:
steps: steps:
# Check out repository # Check out repository
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
token: ${{ env.GITHUB_TOKEN }} token: ${{ env.GITHUB_TOKEN }}
fetch-depth: "0" fetch-depth: "0"
@ -102,14 +102,14 @@ jobs:
# This step is needed to get the size data produced by the compile jobs # This step is needed to get the size data produced by the compile jobs
- name: Download sketches reports artifact - name: Download sketches reports artifact
uses: actions/download-artifact@v4 uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with: with:
pattern: ${{ env.SKETCHES_REPORTS_ARTIFACT_NAME }}-* pattern: ${{ env.SKETCHES_REPORTS_ARTIFACT_NAME }}-*
merge-multiple: true merge-multiple: true
path: ${{ env.SKETCHES_REPORTS_PATH }} path: ${{ env.SKETCHES_REPORTS_PATH }}
- name: Report results - name: Report results
uses: P-R-O-C-H-Y/report-size-deltas@main uses: P-R-O-C-H-Y/report-size-deltas@4a79caa6dcc3579024293638b97156106edc588e # main
with: with:
sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }} sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }}
destination-file: ${{ env.RESULT_LIBRARY_TEST_FILE }} destination-file: ${{ env.RESULT_LIBRARY_TEST_FILE }}
@ -136,8 +136,9 @@ jobs:
env: env:
PR_NUM: ${{ github.event.number }} PR_NUM: ${{ github.event.number }}
run: echo $PR_NUM > pr_num.txt run: echo $PR_NUM > pr_num.txt
- name: Upload PR number - name: Upload PR number
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: pr_number name: pr_number
path: ./pr_num.txt path: ./pr_num.txt

View file

@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Report success - name: Report success
uses: actions/github-script@v7 uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
with: with:
script: | script: |
const owner = '${{ github.repository_owner }}'; const owner = '${{ github.repository_owner }}';
@ -43,7 +43,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Report pending - name: Report pending
uses: actions/github-script@v7 uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
with: with:
script: | script: |
const owner = '${{ github.repository_owner }}'; const owner = '${{ github.repository_owner }}';

View file

@ -23,7 +23,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout latest commit - name: Checkout latest commit
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
fetch-depth: 2 fetch-depth: 2
@ -34,7 +34,7 @@ jobs:
GH_TOKEN: ${{ github.token }} GH_TOKEN: ${{ github.token }}
- name: Set up Python 3 - name: Set up Python 3
uses: actions/setup-python@v5 uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
with: with:
cache-dependency-path: tools/pre-commit/requirements.txt cache-dependency-path: tools/pre-commit/requirements.txt
cache: "pip" cache: "pip"
@ -46,7 +46,7 @@ jobs:
echo "PY_HASH=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV echo "PY_HASH=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
- name: Restore pre-commit cache - name: Restore pre-commit cache
uses: actions/cache/restore@v4 uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
id: restore-cache id: restore-cache
with: with:
path: | path: |
@ -58,28 +58,13 @@ jobs:
- name: Get changed files - name: Get changed files
id: changed-files id: changed-files
env: uses: tj-actions/changed-files@2f7c5bfce28377bc069a65ba478de0a74aa0ca32 # v46.0.1
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUM: ${{ github.event.pull_request.number }}
IS_PR: ${{ github.event_name == 'pull_request' }}
GITHUB_SHA: ${{ github.sha }}
run: |
if [[ $IS_PR != 'true' ]]; then
files_changed=$(gh api repos/espressif/arduino-esp32/commits/"$GITHUB_SHA" --jq '.files[].filename' | xargs)
else
files_changed=$(gh pr diff "$PR_NUM" --name-only | xargs)
fi
echo "all_changed_files=$files_changed" >> $GITHUB_OUTPUT
echo "Changed files:"
for file in $files_changed; do
echo " $file"
done
- name: Run pre-commit hooks in changed files - name: Run pre-commit hooks in changed files
run: pre-commit run --color=always --show-diff-on-failure --files ${{ steps.changed-files.outputs.all_changed_files }} run: pre-commit run --color=always --show-diff-on-failure --files ${{ steps.changed-files.outputs.all_changed_files }}
- name: Save pre-commit cache - name: Save pre-commit cache
uses: actions/cache/save@v4 uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
if: ${{ always() && steps.restore-cache.outputs.cache-hit != 'true' }} if: ${{ always() && steps.restore-cache.outputs.cache-hit != 'true' }}
continue-on-error: true continue-on-error: true
with: with:
@ -88,7 +73,7 @@ jobs:
key: ${{ steps.restore-cache.outputs.cache-primary-key }} key: ${{ steps.restore-cache.outputs.cache-primary-key }}
- name: Push changes using pre-commit-ci-lite - name: Push changes using pre-commit-ci-lite
uses: pre-commit-ci/lite-action@v1.1.0 uses: pre-commit-ci/lite-action@5d6cc0eb514c891a40562a58a8e71576c5c7fb43 # v1.1.0
# Only push changes in PRs # Only push changes in PRs
if: ${{ always() && github.event_name == 'pull_request' }} if: ${{ always() && github.event_name == 'pull_request' }}
with: with:

View file

@ -44,12 +44,12 @@ jobs:
- name: Read the pr_num file - name: Read the pr_num file
id: pr_num_reader id: pr_num_reader
uses: juliangruber/read-file-action@v1 uses: juliangruber/read-file-action@b549046febe0fe86f8cb4f93c24e284433f9ab58 # v1.1.7
with: with:
path: ./artifacts/workflows/pr_num.txt path: ./artifacts/workflows/pr_num.txt
- name: Report results - name: Report results
uses: P-R-O-C-H-Y/report-size-deltas@libs uses: P-R-O-C-H-Y/report-size-deltas@256d1f13e4195cd7fd436d2f959e6dc4d5e4b406 # libs
with: with:
sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }} sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }}
github-token: ${{ env.GITHUB_TOKEN }} github-token: ${{ env.GITHUB_TOKEN }}

View file

@ -14,8 +14,8 @@ jobs:
name: Sizes Comparison Results name: Sizes Comparison Results
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout gh-pages branch
uses: actions/checkout@v4 # This step checks out the repository's code at gh-pages branch uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
ref: gh-pages ref: gh-pages
@ -34,7 +34,7 @@ jobs:
mv v2.x_cli_compile/*.json artifacts/sizes-report/master/ mv v2.x_cli_compile/*.json artifacts/sizes-report/master/
- name: Report results - name: Report results
uses: P-R-O-C-H-Y/report-size-deltas@sizes_v2 uses: P-R-O-C-H-Y/report-size-deltas@2043188c68f483a7b50527c4eacf609d05bb67a5 # sizes_v2
with: with:
sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }} sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }}
github-token: ${{ env.GITHUB_TOKEN }} github-token: ${{ env.GITHUB_TOKEN }}

View file

@ -21,8 +21,8 @@ jobs:
github.event.workflow_run.conclusion == 'success' github.event.workflow_run.conclusion == 'success'
steps: steps:
- name: Checkout code - name: Checkout gh-pages branch
uses: actions/checkout@v4 # This step checks out the repository's code at gh-pages branch uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
ref: gh-pages ref: gh-pages
@ -60,12 +60,12 @@ jobs:
- name: Read the pr_num file - name: Read the pr_num file
id: pr_num_reader id: pr_num_reader
uses: juliangruber/read-file-action@v1 uses: juliangruber/read-file-action@b549046febe0fe86f8cb4f93c24e284433f9ab58 # v1.1.7
with: with:
path: ./artifacts/sizes-report/pr_num.txt path: ./artifacts/sizes-report/pr_num.txt
- name: Report results - name: Report results
uses: P-R-O-C-H-Y/report-size-deltas@sizes_v2 uses: P-R-O-C-H-Y/report-size-deltas@2043188c68f483a7b50527c4eacf609d05bb67a5 # sizes_v2
with: with:
sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }} sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }}
github-token: ${{ env.GITHUB_TOKEN }} github-token: ${{ env.GITHUB_TOKEN }}

View file

@ -67,7 +67,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: ${{ !(github.event_name == 'pull_request' && startsWith(github.head_ref, 'release/')) }} if: ${{ !(github.event_name == 'pull_request' && startsWith(github.head_ref, 'release/')) }}
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- run: bash ./.github/scripts/check-cmakelists.sh - run: bash ./.github/scripts/check-cmakelists.sh
gen-chunks: gen-chunks:
@ -83,23 +83,69 @@ jobs:
chunks: ${{ steps.set-chunks.outputs.chunks }} chunks: ${{ steps.set-chunks.outputs.chunks }}
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
fetch-depth: 2 fetch-depth: 2
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@2f7c5bfce28377bc069a65ba478de0a74aa0ca32 # v46.0.1
with:
files_yaml: |
core:
- '.github/**'
- 'cores/**'
- 'package/**'
- 'tools/**'
- 'platform.txt'
- 'programmers.txt'
- "variants/esp32/**/*"
- "variants/esp32c3/**/*"
- "variants/esp32c6/**/*"
- "variants/esp32h2/**/*"
- "variants/esp32p4/**/*"
- "variants/esp32s2/**/*"
- "variants/esp32s3/**/*"
libraries:
- 'libraries/**/examples/**'
- 'libraries/**/src/**'
networking:
- 'libraries/Network/src/**'
fs:
- 'libraries/FS/src/**'
static_sketeches:
- 'libraries/NetworkClientSecure/examples/WiFiClientSecure/WiFiClientSecure.ino'
- 'libraries/BLE/examples/Server/Server.ino'
- 'libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino'
- 'libraries/Insights/examples/MinimalDiagnostics/MinimalDiagnostics.ino'
- 'libraries/NetworkClientSecure/src/**'
- 'libraries/BLE/src/**'
- 'libraries/Insights/src/**'
idf:
- 'idf_component.yml'
- 'Kconfig.projbuild'
- 'CMakeLists.txt'
- "variants/esp32c2/**/*"
- name: Set chunks - name: Set chunks
id: set-chunks id: set-chunks
env: env:
LIB_FILES: ${{ steps.changed-files.outputs.libraries_all_changed_files }}
IS_PR: ${{ github.event_name == 'pull_request' }} IS_PR: ${{ github.event_name == 'pull_request' }}
PR_NUM: ${{ github.event.pull_request.number }}
MAX_CHUNKS: ${{ env.MAX_CHUNKS }} MAX_CHUNKS: ${{ env.MAX_CHUNKS }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} BUILD_IDF: ${{ steps.changed-files.outputs.idf_any_changed == 'true' }}
BUILD_LIBRARIES: ${{ steps.changed-files.outputs.libraries_any_changed == 'true' }}
BUILD_STATIC_SKETCHES: ${{ steps.changed-files.outputs.static_sketeches_any_changed == 'true' }}
FS_CHANGED: ${{ steps.changed-files.outputs.fs_any_changed == 'true' }}
NETWORKING_CHANGED: ${{ steps.changed-files.outputs.networking_any_changed == 'true' }}
CORE_CHANGED: ${{ steps.changed-files.outputs.core_any_changed == 'true' }}
LIB_CHANGED: ${{ steps.changed-files.outputs.libraries_any_changed == 'true' }}
run: | run: |
bash ./.github/scripts/set_push_chunks.sh bash ./.github/scripts/set_push_chunks.sh
- name: Upload sketches found - name: Upload sketches found
if: ${{ steps.set-chunks.outputs.build_all == 'false' && steps.set-chunks.outputs.build_libraries == 'true' }} if: ${{ steps.set-chunks.outputs.build_all == 'false' && steps.set-chunks.outputs.build_libraries == 'true' }}
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: sketches_found name: sketches_found
path: sketches_found.txt path: sketches_found.txt
@ -118,13 +164,13 @@ jobs:
chunk: ${{ fromJson(needs.gen-chunks.outputs.chunks) }} chunk: ${{ fromJson(needs.gen-chunks.outputs.chunks) }}
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-python@v5 - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
with: with:
python-version: "3.x" python-version: "3.x"
- name: Get libs cache - name: Get libs cache
uses: actions/cache@v4 uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with: with:
key: libs-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package/package_esp32_index.template.json', 'tools/get.py') }} key: libs-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package/package_esp32_index.template.json', 'tools/get.py') }}
path: | path: |
@ -152,7 +198,7 @@ jobs:
- name: Download sketches found - name: Download sketches found
if: ${{ needs.gen-chunks.outputs.build_all == 'false' && needs.gen-chunks.outputs.build_libraries == 'true' }} if: ${{ needs.gen-chunks.outputs.build_all == 'false' && needs.gen-chunks.outputs.build_libraries == 'true' }}
uses: actions/download-artifact@v4 uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with: with:
name: sketches_found name: sketches_found
@ -162,7 +208,7 @@ jobs:
#Upload cli compile json as artifact #Upload cli compile json as artifact
- name: Upload cli compile json - name: Upload cli compile json
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: pr_cli_compile_${{ matrix.chunk }} name: pr_cli_compile_${{ matrix.chunk }}
path: cli_compile_${{ matrix.chunk }}.json path: cli_compile_${{ matrix.chunk }}.json
@ -180,8 +226,8 @@ jobs:
os: [windows-latest, macOS-latest] os: [windows-latest, macOS-latest]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-python@v5 - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
with: with:
python-version: "3.x" python-version: "3.x"
- name: Build Sketches - name: Build Sketches
@ -217,10 +263,11 @@ jobs:
container: espressif/idf:${{ matrix.idf_ver }} container: espressif/idf:${{ matrix.idf_ver }}
steps: steps:
- name: Check out arduino-esp32 as a component - name: Check out arduino-esp32 as a component
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
submodules: recursive submodules: recursive
path: components/arduino-esp32 path: components/arduino-esp32
- name: Build - name: Build
env: env:
IDF_TARGET: ${{ matrix.idf_target }} IDF_TARGET: ${{ matrix.idf_target }}
@ -240,7 +287,7 @@ jobs:
steps: steps:
# Check out repository # Check out repository
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
token: ${{secrets.GITHUB_TOKEN}} token: ${{secrets.GITHUB_TOKEN}}
fetch-depth: "0" fetch-depth: "0"
@ -249,7 +296,7 @@ jobs:
run: git checkout remotes/origin/gh-pages run: git checkout remotes/origin/gh-pages
- name: Download sketches reports artifact - name: Download sketches reports artifact
uses: actions/download-artifact@v4 uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with: with:
pattern: pr_cli_compile_* pattern: pr_cli_compile_*
merge-multiple: true merge-multiple: true
@ -279,8 +326,9 @@ jobs:
env: env:
PR_NUM: ${{ github.event.number }} PR_NUM: ${{ github.event.number }}
run: echo $PR_NUM > pr_num.txt run: echo $PR_NUM > pr_num.txt
- name: Upload PR number - name: Upload PR number
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: pr_number name: pr_number
path: ./pr_num.txt path: ./pr_num.txt

View file

@ -10,14 +10,22 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
fetch-depth: 0 fetch-depth: 0
- uses: actions/setup-python@v5
- name: Set up Python
uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
with: with:
python-version: "3.x" python-version: "3.x"
- run: pip install packaging
- run: pip install pyserial - name: Install packaging
run: pip install packaging
- name: Install pyserial
run: pip install pyserial
- name: Build Release - name: Build Release
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View file

@ -43,7 +43,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Upload - name: Upload
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: event_file name: event_file
path: ${{ github.event_path }} path: ${{ github.event_path }}
@ -62,7 +62,7 @@ jobs:
PERFORMANCE_ENABLED: ${{ contains(github.event.pull_request.labels.*.name, 'perf_test') }} PERFORMANCE_ENABLED: ${{ contains(github.event.pull_request.labels.*.name, 'perf_test') }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
sparse-checkout: .github/scripts/tests_matrix.sh sparse-checkout: .github/scripts/tests_matrix.sh
@ -71,7 +71,7 @@ jobs:
run: bash .github/scripts/tests_matrix.sh run: bash .github/scripts/tests_matrix.sh
- name: Upload - name: Upload
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: matrix_info name: matrix_info
path: info/* path: info/*

View file

@ -22,7 +22,7 @@ jobs:
- name: Check if already built - name: Check if already built
id: cache-build-binaries id: cache-build-binaries
if: github.event.pull_request.number != null if: github.event.pull_request.number != null
uses: actions/cache/restore@v4 uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with: with:
key: tests-${{ env.id }}-bin key: tests-${{ env.id }}-bin
path: | path: |
@ -46,10 +46,10 @@ jobs:
- name: Checkout user repository - name: Checkout user repository
if: ${{ steps.check-build.outputs.enabled == 'true' }} if: ${{ steps.check-build.outputs.enabled == 'true' }}
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Get libs cache - name: Get libs cache
uses: actions/cache@v4 uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
if: ${{ steps.check-build.outputs.enabled == 'true' }} if: ${{ steps.check-build.outputs.enabled == 'true' }}
with: with:
key: libs-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package/package_esp32_index.template.json', 'tools/get.py') }} key: libs-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package/package_esp32_index.template.json', 'tools/get.py') }}
@ -68,7 +68,7 @@ jobs:
bash .github/scripts/tests_build.sh -c -type ${{ inputs.type }} -t ${{ inputs.chip }} bash .github/scripts/tests_build.sh -c -type ${{ inputs.type }} -t ${{ inputs.chip }}
- name: Upload ${{ inputs.chip }} ${{ inputs.type }} binaries as cache - name: Upload ${{ inputs.chip }} ${{ inputs.type }} binaries as cache
uses: actions/cache/save@v4 uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
if: steps.check-build.outputs.enabled == 'true' && github.event.pull_request.number != null if: steps.check-build.outputs.enabled == 'true' && github.event.pull_request.number != null
with: with:
key: tests-${{ env.id }}-bin key: tests-${{ env.id }}-bin
@ -79,7 +79,7 @@ jobs:
~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/sdkconfig ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/sdkconfig
- name: Upload ${{ inputs.chip }} ${{ inputs.type }} binaries as artifacts - name: Upload ${{ inputs.chip }} ${{ inputs.type }} binaries as artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: tests-bin-${{ inputs.chip }}-${{ inputs.type }} name: tests-bin-${{ inputs.chip }}-${{ inputs.type }}
overwrite: true overwrite: true

View file

@ -37,7 +37,7 @@ jobs:
- name: Check if already passed - name: Check if already passed
id: cache-results id: cache-results
if: github.event.pull_request.number != null if: github.event.pull_request.number != null
uses: actions/cache/restore@v4 uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with: with:
key: tests-${{ env.id }}-results-hw key: tests-${{ env.id }}-results-hw
path: | path: |
@ -59,13 +59,13 @@ jobs:
- name: Checkout user repository - name: Checkout user repository
if: ${{ steps.check-tests.outputs.enabled == 'true' }} if: ${{ steps.check-tests.outputs.enabled == 'true' }}
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
sparse-checkout: | sparse-checkout: |
* *
# setup-python currently only works on ubuntu images # setup-python currently only works on ubuntu images
# - uses: actions/setup-python@v5 # - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
# if: ${{ steps.check-tests.outputs.enabled == 'true' }} # if: ${{ steps.check-tests.outputs.enabled == 'true' }}
# with: # with:
# cache-dependency-path: tests/requirements.txt # cache-dependency-path: tests/requirements.txt
@ -82,7 +82,7 @@ jobs:
- name: Get binaries - name: Get binaries
if: ${{ steps.check-tests.outputs.enabled == 'true' }} if: ${{ steps.check-tests.outputs.enabled == 'true' }}
uses: actions/download-artifact@v4 uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with: with:
name: tests-bin-${{ inputs.chip }}-${{ inputs.type }} name: tests-bin-${{ inputs.chip }}-${{ inputs.type }}
path: | path: |
@ -99,7 +99,7 @@ jobs:
bash .github/scripts/tests_run.sh -c -type ${{ inputs.type }} -t ${{ inputs.chip }} -i 0 -m 1 -e bash .github/scripts/tests_run.sh -c -type ${{ inputs.type }} -t ${{ inputs.chip }} -i 0 -m 1 -e
- name: Upload ${{ inputs.chip }} ${{ inputs.type }} hardware results as cache - name: Upload ${{ inputs.chip }} ${{ inputs.type }} hardware results as cache
uses: actions/cache/save@v4 uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
if: steps.check-tests.outputs.enabled == 'true' && github.event.pull_request.number != null if: steps.check-tests.outputs.enabled == 'true' && github.event.pull_request.number != null
with: with:
key: tests-${{ env.id }}-results-hw key: tests-${{ env.id }}-results-hw
@ -108,7 +108,7 @@ jobs:
tests/**/result_*.json tests/**/result_*.json
- name: Upload ${{ inputs.chip }} ${{ inputs.type }} hardware results as artifacts - name: Upload ${{ inputs.chip }} ${{ inputs.type }} hardware results as artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: always() if: always()
with: with:
name: tests-results-hw-${{ inputs.chip }}-${{ inputs.type }} name: tests-results-hw-${{ inputs.chip }}-${{ inputs.type }}

View file

@ -21,7 +21,7 @@ jobs:
- name: Check if already passed - name: Check if already passed
id: get-cache-results id: get-cache-results
if: github.event.pull_request.number != null if: github.event.pull_request.number != null
uses: actions/cache/restore@v4 uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with: with:
key: tests-${{ env.id }}-results-qemu key: tests-${{ env.id }}-results-qemu
path: | path: |
@ -43,7 +43,7 @@ jobs:
- name: Checkout user repository - name: Checkout user repository
if: ${{ steps.check-tests.outputs.enabled == 'true' }} if: ${{ steps.check-tests.outputs.enabled == 'true' }}
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
ref: ${{ github.event.pull_request.head.sha || github.sha }} ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false persist-credentials: false
@ -60,7 +60,7 @@ jobs:
cd .github cd .github
curl https://codeload.github.com/${{ github.repository }}/tar.gz/master | tar -xz --strip=2 arduino-esp32-master/.github curl https://codeload.github.com/${{ github.repository }}/tar.gz/master | tar -xz --strip=2 arduino-esp32-master/.github
- uses: actions/setup-python@v5 - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
if: ${{ steps.check-tests.outputs.enabled == 'true' }} if: ${{ steps.check-tests.outputs.enabled == 'true' }}
with: with:
cache-dependency-path: tests/requirements.txt cache-dependency-path: tests/requirements.txt
@ -74,14 +74,14 @@ jobs:
pip install -r tests/requirements.txt --extra-index-url https://dl.espressif.com/pypi pip install -r tests/requirements.txt --extra-index-url https://dl.espressif.com/pypi
- name: Install APT dependencies - name: Install APT dependencies
uses: awalsh128/cache-apt-pkgs-action@v1.4.2 uses: awalsh128/cache-apt-pkgs-action@5902b33ae29014e6ca012c5d8025d4346556bd40 # v1.4.3
if: ${{ steps.check-tests.outputs.enabled == 'true' }} if: ${{ steps.check-tests.outputs.enabled == 'true' }}
with: with:
packages: libpixman-1-0 libnuma1 libglib2.0-0 libslirp0 libsdl2-2.0-0 packages: libpixman-1-0 libnuma1 libglib2.0-0 libslirp0 libsdl2-2.0-0
version: 1.0 version: 1.0
- name: Get QEMU version - name: Get QEMU version
uses: pozetroninc/github-action-get-latest-release@v0.7.0 uses: pozetroninc/github-action-get-latest-release@2a61c339ea7ef0a336d1daa35ef0cb1418e7676c # v0.8.0
if: ${{ steps.check-tests.outputs.enabled == 'true' }} if: ${{ steps.check-tests.outputs.enabled == 'true' }}
id: get-qemu-version id: get-qemu-version
with: with:
@ -92,7 +92,7 @@ jobs:
- name: Cache QEMU - name: Cache QEMU
id: cache-qemu id: cache-qemu
uses: actions/cache@v4 uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
if: ${{ steps.check-tests.outputs.enabled == 'true' }} if: ${{ steps.check-tests.outputs.enabled == 'true' }}
with: with:
path: | path: |
@ -113,7 +113,7 @@ jobs:
- name: Get binaries - name: Get binaries
if: ${{ steps.check-tests.outputs.enabled == 'true' }} if: ${{ steps.check-tests.outputs.enabled == 'true' }}
uses: actions/download-artifact@v4 uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with: with:
name: tests-bin-${{ inputs.chip }}-${{ inputs.type }} name: tests-bin-${{ inputs.chip }}-${{ inputs.type }}
path: | path: |
@ -124,7 +124,7 @@ jobs:
run: QEMU_PATH="${{ env.QEMU_INSTALL_PATH }}" bash .github/scripts/tests_run.sh -c -type ${{inputs.type}} -t ${{inputs.chip}} -i 0 -m 1 -Q run: QEMU_PATH="${{ env.QEMU_INSTALL_PATH }}" bash .github/scripts/tests_run.sh -c -type ${{inputs.type}} -t ${{inputs.chip}} -i 0 -m 1 -Q
- name: Upload ${{ inputs.chip }} ${{ inputs.type }} QEMU results as cache - name: Upload ${{ inputs.chip }} ${{ inputs.type }} QEMU results as cache
uses: actions/cache/save@v4 uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
if: steps.check-tests.outputs.enabled == 'true' && github.event.pull_request.number != null if: steps.check-tests.outputs.enabled == 'true' && github.event.pull_request.number != null
with: with:
key: tests-${{ env.id }}-results-qemu key: tests-${{ env.id }}-results-qemu
@ -133,7 +133,7 @@ jobs:
tests/**/result_*.json tests/**/result_*.json
- name: Upload ${{ inputs.chip }} ${{ inputs.type }} QEMU results as artifacts - name: Upload ${{ inputs.chip }} ${{ inputs.type }} QEMU results as artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: always() if: always()
with: with:
name: tests-results-qemu-${{ inputs.chip }}-${{ inputs.type }} name: tests-results-qemu-${{ inputs.chip }}-${{ inputs.type }}

View file

@ -24,12 +24,12 @@ jobs:
pull-requests: write pull-requests: write
contents: write contents: write
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
ref: gh-pages ref: gh-pages
- name: Download and Extract Artifacts - name: Download and Extract Artifacts
uses: dawidd6/action-download-artifact@v6 uses: dawidd6/action-download-artifact@07ab29fd4a977ae4d2b275087cf67563dfdf0295 # v9
with: with:
run_id: ${{ github.event.workflow_run.id }} run_id: ${{ github.event.workflow_run.id }}
path: ./artifacts path: ./artifacts
@ -83,7 +83,7 @@ jobs:
echo "Wokwi tests: https://github.com/${{ github.repository }}/actions/runs/${{ github.event.workflow_run.id }}" echo "Wokwi tests: https://github.com/${{ github.repository }}/actions/runs/${{ github.event.workflow_run.id }}"
- name: Publish Unit Test Results - name: Publish Unit Test Results
uses: EnricoMi/publish-unit-test-result-action@v2 uses: EnricoMi/publish-unit-test-result-action@170bf24d20d201b842d7a52403b73ed297e6645b # v2.18.0
with: with:
commit: ${{ env.original_sha }} commit: ${{ env.original_sha }}
event_file: ./artifacts/parent-artifacts/event_file/event.json event_file: ./artifacts/parent-artifacts/event_file/event.json
@ -95,7 +95,7 @@ jobs:
json_suite_details: true json_suite_details: true
- name: Upload JSON - name: Upload JSON
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: ${{ always() }} if: ${{ always() }}
with: with:
name: unity_results name: unity_results
@ -109,7 +109,7 @@ jobs:
- name: Clean up caches - name: Clean up caches
if: always() if: always()
uses: actions/github-script@v7 uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
with: with:
script: | script: |
const ref = process.env.original_ref; const ref = process.env.original_ref;
@ -139,7 +139,7 @@ jobs:
}); });
- name: Report conclusion - name: Report conclusion
uses: actions/github-script@v7 uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
if: always() if: always()
with: with:
script: | script: |
@ -175,7 +175,7 @@ jobs:
- name: Generate badge - name: Generate badge
if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} # codespell:ignore cancelled if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} # codespell:ignore cancelled
uses: jaywcjlove/generated-badges@v1.0.13 uses: jaywcjlove/generated-badges@0e078ae4d4bab3777ea4f137de496ab44688f5ad # v1.0.13
with: with:
label: Runtime Tests label: Runtime Tests
status: ${{ job.status == 'success' && 'passing' || 'failing' }} status: ${{ job.status == 'success' && 'passing' || 'failing' }}

View file

@ -27,7 +27,7 @@ jobs:
types: ${{ steps.set-ref.outputs.types }} types: ${{ steps.set-ref.outputs.types }}
steps: steps:
- name: Report pending - name: Report pending
uses: actions/github-script@v7 uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
with: with:
script: | script: |
const owner = '${{ github.repository_owner }}'; const owner = '${{ github.repository_owner }}';
@ -47,7 +47,7 @@ jobs:
core.info(`${name} is ${state}`); core.info(`${name} is ${state}`);
- name: Download and extract event file - name: Download and extract event file
uses: actions/download-artifact@v4 uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
run-id: ${{ github.event.workflow_run.id }} run-id: ${{ github.event.workflow_run.id }}
@ -55,7 +55,7 @@ jobs:
path: artifacts/event_file path: artifacts/event_file
- name: Download and extract matrix info - name: Download and extract matrix info
uses: actions/download-artifact@v4 uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
run-id: ${{ github.event.workflow_run.id }} run-id: ${{ github.event.workflow_run.id }}
@ -130,7 +130,7 @@ jobs:
echo "ref=$ref" >> $GITHUB_OUTPUT echo "ref=$ref" >> $GITHUB_OUTPUT
- name: Download and extract parent hardware results - name: Download and extract parent hardware results
uses: actions/download-artifact@v4 uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
continue-on-error: true continue-on-error: true
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
@ -140,7 +140,7 @@ jobs:
path: artifacts/results/hw path: artifacts/results/hw
- name: Download and extract parent QEMU results - name: Download and extract parent QEMU results
uses: actions/download-artifact@v4 uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
continue-on-error: true continue-on-error: true
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
@ -150,14 +150,14 @@ jobs:
path: artifacts/results/qemu path: artifacts/results/qemu
- name: Upload parent artifacts - name: Upload parent artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with: with:
name: parent-artifacts name: parent-artifacts
path: artifacts path: artifacts
if-no-files-found: error if-no-files-found: error
- name: Report conclusion - name: Report conclusion
uses: actions/github-script@v7 uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
if: always() if: always()
with: with:
script: | script: |
@ -197,7 +197,7 @@ jobs:
chip: ${{ fromJson(needs.get-artifacts.outputs.targets) }} chip: ${{ fromJson(needs.get-artifacts.outputs.targets) }}
steps: steps:
- name: Report pending - name: Report pending
uses: actions/github-script@v7 uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
with: with:
script: | script: |
const owner = '${{ github.repository_owner }}'; const owner = '${{ github.repository_owner }}';
@ -219,7 +219,7 @@ jobs:
- name: Check if already passed - name: Check if already passed
id: get-cache-results id: get-cache-results
if: needs.get-artifacts.outputs.pr_num if: needs.get-artifacts.outputs.pr_num
uses: actions/cache/restore@v4 uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with: with:
key: tests-${{ env.id }}-results-wokwi key: tests-${{ env.id }}-results-wokwi
path: | path: |
@ -243,11 +243,11 @@ jobs:
# DO NOT CHECKOUT THE USER'S REPOSITORY IN THIS WORKFLOW. IT HAS HIGH SECURITY RISKS. # DO NOT CHECKOUT THE USER'S REPOSITORY IN THIS WORKFLOW. IT HAS HIGH SECURITY RISKS.
- name: Checkout repository - name: Checkout repository
if: ${{ steps.check-tests.outputs.enabled == 'true' }} if: ${{ steps.check-tests.outputs.enabled == 'true' }}
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
ref: ${{ needs.get-artifacts.outputs.base || github.ref }} ref: ${{ needs.get-artifacts.outputs.base || github.ref }}
- uses: actions/setup-python@v5 - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
if: ${{ steps.check-tests.outputs.enabled == 'true' }} if: ${{ steps.check-tests.outputs.enabled == 'true' }}
with: with:
cache-dependency-path: tests/requirements.txt cache-dependency-path: tests/requirements.txt
@ -266,11 +266,11 @@ jobs:
- name: Wokwi CI Server - name: Wokwi CI Server
if: ${{ steps.check-tests.outputs.enabled == 'true' }} if: ${{ steps.check-tests.outputs.enabled == 'true' }}
uses: wokwi/wokwi-ci-server-action@v1 uses: wokwi/wokwi-ci-server-action@a6fabb5a49e080158c7a1d121ea5b789536a82c3 # v1
- name: Get binaries - name: Get binaries
if: ${{ steps.check-tests.outputs.enabled == 'true' }} if: ${{ steps.check-tests.outputs.enabled == 'true' }}
uses: actions/download-artifact@v4 uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
run-id: ${{ github.event.workflow_run.id }} run-id: ${{ github.event.workflow_run.id }}
@ -286,7 +286,7 @@ jobs:
bash .github/scripts/tests_run.sh -c -type ${{ matrix.type }} -t ${{ matrix.chip }} -i 0 -m 1 -W ${{ env.WOKWI_TIMEOUT }} bash .github/scripts/tests_run.sh -c -type ${{ matrix.type }} -t ${{ matrix.chip }} -i 0 -m 1 -W ${{ env.WOKWI_TIMEOUT }}
- name: Upload ${{ matrix.chip }} ${{ matrix.type }} Wokwi results as cache - name: Upload ${{ matrix.chip }} ${{ matrix.type }} Wokwi results as cache
uses: actions/cache/save@v4 uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
if: steps.check-tests.outputs.enabled == 'true' && needs.get-artifacts.outputs.pr_num if: steps.check-tests.outputs.enabled == 'true' && needs.get-artifacts.outputs.pr_num
with: with:
key: tests-${{ env.id }}-results-wokwi key: tests-${{ env.id }}-results-wokwi
@ -295,7 +295,7 @@ jobs:
tests/**/result_*.json tests/**/result_*.json
- name: Upload ${{ matrix.chip }} ${{ matrix.type }} Wokwi results as artifacts - name: Upload ${{ matrix.chip }} ${{ matrix.type }} Wokwi results as artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: always() if: always()
with: with:
name: tests-results-wokwi-${{ matrix.chip }}-${{ matrix.type }} name: tests-results-wokwi-${{ matrix.chip }}-${{ matrix.type }}
@ -305,7 +305,7 @@ jobs:
tests/**/result_*.json tests/**/result_*.json
- name: Report conclusion - name: Report conclusion
uses: actions/github-script@v7 uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
if: always() if: always()
with: with:
script: | script: |

View file

@ -45,13 +45,13 @@ jobs:
echo "Tag: $tag" echo "Tag: $tag"
echo "RELEASE_TAG=$tag" >> $GITHUB_ENV echo "RELEASE_TAG=$tag" >> $GITHUB_ENV
- uses: actions/checkout@v4 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
ref: ${{ inputs.git_ref || env.RELEASE_TAG }} ref: ${{ inputs.git_ref || env.RELEASE_TAG }}
submodules: "recursive" submodules: "recursive"
- name: Upload components to the component registry - name: Upload components to the component registry
uses: espressif/upload-components-ci-action@v1 uses: espressif/upload-components-ci-action@b78a19fa5424714997596d3ecffa634aef8ae20b # v1.0.5
with: with:
name: arduino-esp32 name: arduino-esp32
version: ${{ env.RELEASE_TAG }} version: ${{ env.RELEASE_TAG }}

View file

@ -299,6 +299,7 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS
libraries/Zigbee/src/ep/ZigbeeRangeExtender.cpp libraries/Zigbee/src/ep/ZigbeeRangeExtender.cpp
libraries/Zigbee/src/ep/ZigbeeGateway.cpp libraries/Zigbee/src/ep/ZigbeeGateway.cpp
libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp
libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp
) )
set(ARDUINO_LIBRARY_BLE_SRCS set(ARDUINO_LIBRARY_BLE_SRCS

View file

@ -1151,6 +1151,9 @@ esp32s3.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592
esp32s3.menu.PartitionScheme.app5M_little24M_32MB=32M Flash (4.8MB APP/22MB LittleFS) esp32s3.menu.PartitionScheme.app5M_little24M_32MB=32M Flash (4.8MB APP/22MB LittleFS)
esp32s3.menu.PartitionScheme.app5M_little24M_32MB.build.partitions=large_littlefs_32MB esp32s3.menu.PartitionScheme.app5M_little24M_32MB.build.partitions=large_littlefs_32MB
esp32s3.menu.PartitionScheme.app5M_little24M_32MB.upload.maximum_size=4718592 esp32s3.menu.PartitionScheme.app5M_little24M_32MB.upload.maximum_size=4718592
esp32s3.menu.PartitionScheme.app13M_data7M_32MB=32M Flash (13MB APP/6.75MB SPIFFS)
esp32s3.menu.PartitionScheme.app13M_data7M_32MB.build.partitions=default_32MB
esp32s3.menu.PartitionScheme.app13M_data7M_32MB.upload.maximum_size=13107200
esp32s3.menu.PartitionScheme.esp_sr_16=ESP SR 16M (3MB APP/7MB SPIFFS/2.9MB MODEL) esp32s3.menu.PartitionScheme.esp_sr_16=ESP SR 16M (3MB APP/7MB SPIFFS/2.9MB MODEL)
esp32s3.menu.PartitionScheme.esp_sr_16.upload.maximum_size=3145728 esp32s3.menu.PartitionScheme.esp_sr_16.upload.maximum_size=3145728
esp32s3.menu.PartitionScheme.esp_sr_16.upload.extra_flags=0xD10000 {build.path}/srmodels.bin esp32s3.menu.PartitionScheme.esp_sr_16.upload.extra_flags=0xD10000 {build.path}/srmodels.bin
@ -2359,6 +2362,9 @@ esp32s3-octal.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592
esp32s3-octal.menu.PartitionScheme.app5M_little24M_32MB=32M Flash (4.8MB APP/22MB LittleFS) esp32s3-octal.menu.PartitionScheme.app5M_little24M_32MB=32M Flash (4.8MB APP/22MB LittleFS)
esp32s3-octal.menu.PartitionScheme.app5M_little24M_32MB.build.partitions=large_littlefs_32MB esp32s3-octal.menu.PartitionScheme.app5M_little24M_32MB.build.partitions=large_littlefs_32MB
esp32s3-octal.menu.PartitionScheme.app5M_little24M_32MB.upload.maximum_size=4718592 esp32s3-octal.menu.PartitionScheme.app5M_little24M_32MB.upload.maximum_size=4718592
esp32s3-octal.menu.PartitionScheme.app13M_data7M_32MB=32M Flash (13MB APP/6.75MB SPIFFS)
esp32s3-octal.menu.PartitionScheme.app13M_data7M_32MB.build.partitions=default_32MB
esp32s3-octal.menu.PartitionScheme.app13M_data7M_32MB.upload.maximum_size=13107200
esp32s3-octal.menu.CPUFreq.240=240MHz (WiFi) esp32s3-octal.menu.CPUFreq.240=240MHz (WiFi)
esp32s3-octal.menu.CPUFreq.240.build.f_cpu=240000000L esp32s3-octal.menu.CPUFreq.240.build.f_cpu=240000000L
@ -35469,6 +35475,8 @@ XIAO_ESP32S3_Plus.menu.FlashMode.dio.build.flash_freq=80m
XIAO_ESP32S3_Plus.menu.FlashSize.8M=8MB (64Mb) XIAO_ESP32S3_Plus.menu.FlashSize.8M=8MB (64Mb)
XIAO_ESP32S3_Plus.menu.FlashSize.8M.build.flash_size=8MB XIAO_ESP32S3_Plus.menu.FlashSize.8M.build.flash_size=8MB
XIAO_ESP32S3_Plus.menu.FlashSize.16M=16MB (128Mb)
XIAO_ESP32S3_Plus.menu.FlashSize.16M.build.flash_size=16MB
XIAO_ESP32S3_Plus.menu.LoopCore.1=Core 1 XIAO_ESP32S3_Plus.menu.LoopCore.1=Core 1
XIAO_ESP32S3_Plus.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1 XIAO_ESP32S3_Plus.menu.LoopCore.1.build.loop_core=-DARDUINO_RUNNING_CORE=1
@ -35507,6 +35515,12 @@ XIAO_ESP32S3_Plus.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB)
XIAO_ESP32S3_Plus.menu.UploadMode.cdc.upload.use_1200bps_touch=true XIAO_ESP32S3_Plus.menu.UploadMode.cdc.upload.use_1200bps_touch=true
XIAO_ESP32S3_Plus.menu.UploadMode.cdc.upload.wait_for_upload_port=true XIAO_ESP32S3_Plus.menu.UploadMode.cdc.upload.wait_for_upload_port=true
XIAO_ESP32S3_Plus.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS)
XIAO_ESP32S3_Plus.menu.PartitionScheme.fatflash.build.partitions=ffat
XIAO_ESP32S3_Plus.menu.PartitionScheme.fatflash.upload.maximum_size=2097152
XIAO_ESP32S3_Plus.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS)
XIAO_ESP32S3_Plus.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB
XIAO_ESP32S3_Plus.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728
XIAO_ESP32S3_Plus.menu.PartitionScheme.default_8MB=Default with spiffs (3MB APP/1.5MB SPIFFS) XIAO_ESP32S3_Plus.menu.PartitionScheme.default_8MB=Default with spiffs (3MB APP/1.5MB SPIFFS)
XIAO_ESP32S3_Plus.menu.PartitionScheme.default_8MB.build.partitions=default_8MB XIAO_ESP32S3_Plus.menu.PartitionScheme.default_8MB.build.partitions=default_8MB
XIAO_ESP32S3_Plus.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336 XIAO_ESP32S3_Plus.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336

View file

@ -31,7 +31,8 @@ void printRunningTasks(Print &printer) {
#endif #endif
configRUN_TIME_COUNTER_TYPE ulTotalRunTime = 0; configRUN_TIME_COUNTER_TYPE ulTotalRunTime = 0;
TaskStatus_t *pxTaskStatusArray = NULL; TaskStatus_t *pxTaskStatusArray = NULL;
volatile UBaseType_t uxArraySize = 0, x = 0; volatile UBaseType_t uxArraySize = 0;
uint32_t x = 0;
const char *taskStates[] = {"Running", "Ready", "Blocked", "Suspended", "Deleted", "Invalid"}; const char *taskStates[] = {"Running", "Ready", "Blocked", "Suspended", "Deleted", "Invalid"};
// Take a snapshot of the number of tasks in case it changes while this function is executing. // Take a snapshot of the number of tasks in case it changes while this function is executing.

View file

@ -183,7 +183,7 @@ void BLEAdvertising::setScanFilter(bool scanRequestWhitelistOnly, bool connectWh
* @brief Set the advertisement data that is to be published in a regular advertisement. * @brief Set the advertisement data that is to be published in a regular advertisement.
* @param [in] advertisementData The data to be advertised. * @param [in] advertisementData The data to be advertised.
*/ */
void BLEAdvertising::setAdvertisementData(BLEAdvertisementData &advertisementData) { bool BLEAdvertising::setAdvertisementData(BLEAdvertisementData &advertisementData) {
log_v(">> setAdvertisementData"); log_v(">> setAdvertisementData");
esp_err_t errRc = ::esp_ble_gap_config_adv_data_raw((uint8_t *)advertisementData.getPayload().c_str(), advertisementData.getPayload().length()); esp_err_t errRc = ::esp_ble_gap_config_adv_data_raw((uint8_t *)advertisementData.getPayload().c_str(), advertisementData.getPayload().length());
if (errRc != ESP_OK) { if (errRc != ESP_OK) {
@ -191,13 +191,14 @@ void BLEAdvertising::setAdvertisementData(BLEAdvertisementData &advertisementDat
} }
m_customAdvData = true; // Set the flag that indicates we are using custom advertising data. m_customAdvData = true; // Set the flag that indicates we are using custom advertising data.
log_v("<< setAdvertisementData"); log_v("<< setAdvertisementData");
return ESP_OK == errRc;
} // setAdvertisementData } // setAdvertisementData
/** /**
* @brief Set the advertisement data that is to be published in a scan response. * @brief Set the advertisement data that is to be published in a scan response.
* @param [in] advertisementData The data to be advertised. * @param [in] advertisementData The data to be advertised.
*/ */
void BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisementData) { bool BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisementData) {
log_v(">> setScanResponseData"); log_v(">> setScanResponseData");
esp_err_t errRc = ::esp_ble_gap_config_scan_rsp_data_raw((uint8_t *)advertisementData.getPayload().c_str(), advertisementData.getPayload().length()); esp_err_t errRc = ::esp_ble_gap_config_scan_rsp_data_raw((uint8_t *)advertisementData.getPayload().c_str(), advertisementData.getPayload().length());
if (errRc != ESP_OK) { if (errRc != ESP_OK) {
@ -205,6 +206,7 @@ void BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisementData
} }
m_customScanResponseData = true; // Set the flag that indicates we are using custom scan response data. m_customScanResponseData = true; // Set the flag that indicates we are using custom scan response data.
log_v("<< setScanResponseData"); log_v("<< setScanResponseData");
return ESP_OK == errRc;
} // setScanResponseData } // setScanResponseData
/** /**
@ -212,7 +214,7 @@ void BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisementData
* Start advertising. * Start advertising.
* @return N/A. * @return N/A.
*/ */
void BLEAdvertising::start() { bool BLEAdvertising::start() {
log_v(">> start: customAdvData: %d, customScanResponseData: %d", m_customAdvData, m_customScanResponseData); log_v(">> start: customAdvData: %d, customScanResponseData: %d", m_customAdvData, m_customScanResponseData);
// We have a vector of service UUIDs that we wish to advertise. In order to use the // We have a vector of service UUIDs that we wish to advertise. In order to use the
@ -225,7 +227,7 @@ void BLEAdvertising::start() {
m_advData.p_service_uuid = (uint8_t *)malloc(m_advData.service_uuid_len); m_advData.p_service_uuid = (uint8_t *)malloc(m_advData.service_uuid_len);
if (!m_advData.p_service_uuid) { if (!m_advData.p_service_uuid) {
log_e(">> start failed: out of memory"); log_e(">> start failed: out of memory");
return; return false;
} }
uint8_t *p = m_advData.p_service_uuid; uint8_t *p = m_advData.p_service_uuid;
@ -250,7 +252,7 @@ void BLEAdvertising::start() {
errRc = ::esp_ble_gap_config_adv_data(&m_advData); errRc = ::esp_ble_gap_config_adv_data(&m_advData);
if (errRc != ESP_OK) { if (errRc != ESP_OK) {
log_e("<< esp_ble_gap_config_adv_data: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); log_e("<< esp_ble_gap_config_adv_data: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
return; return false;
} }
} }
@ -266,7 +268,7 @@ void BLEAdvertising::start() {
errRc = ::esp_ble_gap_config_adv_data(&m_scanRespData); errRc = ::esp_ble_gap_config_adv_data(&m_scanRespData);
if (errRc != ESP_OK) { if (errRc != ESP_OK) {
log_e("<< esp_ble_gap_config_adv_data (Scan response): rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); log_e("<< esp_ble_gap_config_adv_data (Scan response): rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
return; return false;
} }
} }
@ -279,9 +281,10 @@ void BLEAdvertising::start() {
errRc = ::esp_ble_gap_start_advertising(&m_advParams); errRc = ::esp_ble_gap_start_advertising(&m_advParams);
if (errRc != ESP_OK) { if (errRc != ESP_OK) {
log_e("<< esp_ble_gap_start_advertising: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); log_e("<< esp_ble_gap_start_advertising: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
return; } else {
log_v("<< start");
} }
log_v("<< start"); return ESP_OK == errRc;
} // start } // start
/** /**
@ -289,14 +292,15 @@ void BLEAdvertising::start() {
* Stop advertising. * Stop advertising.
* @return N/A. * @return N/A.
*/ */
void BLEAdvertising::stop() { bool BLEAdvertising::stop() {
log_v(">> stop"); log_v(">> stop");
esp_err_t errRc = ::esp_ble_gap_stop_advertising(); esp_err_t errRc = ::esp_ble_gap_stop_advertising();
if (errRc != ESP_OK) { if (errRc != ESP_OK) {
log_e("esp_ble_gap_stop_advertising: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); log_e("esp_ble_gap_stop_advertising: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
return; } else {
log_v("<< stop");
} }
log_v("<< stop"); return ESP_OK == errRc;
} // stop } // stop
/** /**
@ -305,17 +309,17 @@ void BLEAdvertising::stop() {
* @param [in] Bluetooth address type. * @param [in] Bluetooth address type.
* Set BLE address. * Set BLE address.
*/ */
bool BLEAdvertising::setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type) {
void BLEAdvertising::setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type) {
log_v(">> setPrivateAddress"); log_v(">> setPrivateAddress");
m_advParams.own_addr_type = type; m_advParams.own_addr_type = type;
esp_err_t errRc = esp_ble_gap_set_rand_addr((uint8_t *)addr); esp_err_t errRc = esp_ble_gap_set_rand_addr((uint8_t *)addr);
if (errRc != ESP_OK) { if (errRc != ESP_OK) {
log_e("esp_ble_gap_set_rand_addr: rc=%d %s", errRc, GeneralUtils::errorToString(errRc)); log_e("esp_ble_gap_set_rand_addr: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
return; } else {
log_v("<< setPrivateAddress");
} }
log_v("<< setPrivateAddress"); return ESP_OK == errRc;
} // setPrivateAddress } // setPrivateAddress
/** /**

View file

@ -54,18 +54,18 @@ public:
bool removeServiceUUID(int index); bool removeServiceUUID(int index);
bool removeServiceUUID(BLEUUID serviceUUID); bool removeServiceUUID(BLEUUID serviceUUID);
bool removeServiceUUID(const char *serviceUUID); bool removeServiceUUID(const char *serviceUUID);
void start(); bool start();
void stop(); bool stop();
void setAppearance(uint16_t appearance); void setAppearance(uint16_t appearance);
void setAdvertisementType(esp_ble_adv_type_t adv_type); void setAdvertisementType(esp_ble_adv_type_t adv_type);
void setAdvertisementChannelMap(esp_ble_adv_channel_t channel_map); void setAdvertisementChannelMap(esp_ble_adv_channel_t channel_map);
void setMaxInterval(uint16_t maxinterval); void setMaxInterval(uint16_t maxinterval);
void setMinInterval(uint16_t mininterval); void setMinInterval(uint16_t mininterval);
void setAdvertisementData(BLEAdvertisementData &advertisementData); bool setAdvertisementData(BLEAdvertisementData &advertisementData);
void setScanFilter(bool scanRequestWhitelistOnly, bool connectWhitelistOnly); void setScanFilter(bool scanRequestWhitelistOnly, bool connectWhitelistOnly);
void setScanResponseData(BLEAdvertisementData &advertisementData); bool setScanResponseData(BLEAdvertisementData &advertisementData);
void setPrivateAddress(esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM); void setPrivateAddress(esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM);
void setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM); bool setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM);
void handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param); void handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param);
void setMinPreferred(uint16_t); void setMinPreferred(uint16_t);

View file

@ -13,7 +13,7 @@
// limitations under the License. // limitations under the License.
/** /**
* @brief This example demonstrates usage of RMT for receiving XJT D12 data * @brief This example demonstrates usage of RMT for receiving XJT D16 data
* *
* The output is the RMT data read and processed * The output is the RMT data read and processed
* *
@ -21,7 +21,7 @@
// //
// Note: This example uses a FrSKY device communication // Note: This example uses a FrSKY device communication
// using XJT D12 protocol // using XJT D16 protocol
// //
// ; 0 bit = 6us low/10us high // ; 0 bit = 6us low/10us high
// ; 1 bit = 14us low/10us high // ; 1 bit = 14us low/10us high

View file

@ -124,7 +124,8 @@ void ETHClass::_onEthEvent(int32_t event_id, void *event_data) {
} }
ETHClass::ETHClass(uint8_t eth_index) ETHClass::ETHClass(uint8_t eth_index)
: _eth_handle(NULL), _eth_index(eth_index), _phy_type(ETH_PHY_MAX), _glue_handle(NULL), _mac(NULL), _phy(NULL) : _eth_handle(NULL), _eth_index(eth_index), _phy_type(ETH_PHY_MAX), _glue_handle(NULL), _mac(NULL), _phy(NULL), _eth_started(false), _link_speed(100),
_full_duplex(true), _auto_negotiation(true)
#if ETH_SPI_SUPPORTS_CUSTOM #if ETH_SPI_SUPPORTS_CUSTOM
, ,
_spi(NULL) _spi(NULL)
@ -136,7 +137,7 @@ ETHClass::ETHClass(uint8_t eth_index)
_pin_mcd(-1), _pin_mdio(-1), _pin_power(-1), _pin_rmii_clock(-1) _pin_mcd(-1), _pin_mdio(-1), _pin_power(-1), _pin_rmii_clock(-1)
#endif /* CONFIG_ETH_USE_ESP32_EMAC */ #endif /* CONFIG_ETH_USE_ESP32_EMAC */
, ,
_task_stack_size(4096) { _task_stack_size(4096), _eth_connected_event_handle(0) {
} }
ETHClass::~ETHClass() {} ETHClass::~ETHClass() {}
@ -351,6 +352,19 @@ bool ETHClass::begin(eth_phy_type_t type, int32_t phy_addr, int mdc, int mdio, i
return false; return false;
} }
// auto negotiation needs to be disabled to change duplex mode and link speed
if (!_auto_negotiation) {
if (!_setAutoNegotiation(_auto_negotiation)) {
return false;
}
if (!_setFullDuplex(_full_duplex)) {
return false;
}
if (!_setLinkSpeed(_link_speed)) {
return false;
}
}
if (_eth_ev_instance == NULL && esp_event_handler_instance_register(ETH_EVENT, ESP_EVENT_ANY_ID, &_eth_event_cb, NULL, &_eth_ev_instance)) { if (_eth_ev_instance == NULL && esp_event_handler_instance_register(ETH_EVENT, ESP_EVENT_ANY_ID, &_eth_event_cb, NULL, &_eth_ev_instance)) {
log_e("event_handler_instance_register for ETH_EVENT Failed!"); log_e("event_handler_instance_register for ETH_EVENT Failed!");
return false; return false;
@ -359,7 +373,7 @@ bool ETHClass::begin(eth_phy_type_t type, int32_t phy_addr, int mdc, int mdio, i
/* attach to receive events */ /* attach to receive events */
initNetif((Network_Interface_ID)(ESP_NETIF_ID_ETH + _eth_index)); initNetif((Network_Interface_ID)(ESP_NETIF_ID_ETH + _eth_index));
Network.onSysEvent(onEthConnected, ARDUINO_EVENT_ETH_CONNECTED); _eth_connected_event_handle = Network.onSysEvent(onEthConnected, ARDUINO_EVENT_ETH_CONNECTED);
ret = esp_eth_start(_eth_handle); ret = esp_eth_start(_eth_handle);
if (ret != ESP_OK) { if (ret != ESP_OK) {
@ -367,6 +381,8 @@ bool ETHClass::begin(eth_phy_type_t type, int32_t phy_addr, int mdc, int mdio, i
return false; return false;
} }
_eth_started = true;
if (!perimanSetPinBus(_pin_rmii_clock, ESP32_BUS_TYPE_ETHERNET_CLK, (void *)(this), -1, -1)) { if (!perimanSetPinBus(_pin_rmii_clock, ESP32_BUS_TYPE_ETHERNET_CLK, (void *)(this), -1, -1)) {
goto err; goto err;
} }
@ -788,6 +804,19 @@ bool ETHClass::beginSPI(
return false; return false;
} }
// auto negotiation needs to be disabled to change duplex mode and link speed
if (!_auto_negotiation) {
if (!_setAutoNegotiation(_auto_negotiation)) {
return false;
}
if (!_setFullDuplex(_full_duplex)) {
return false;
}
if (!_setLinkSpeed(_link_speed)) {
return false;
}
}
if (_eth_ev_instance == NULL && esp_event_handler_instance_register(ETH_EVENT, ESP_EVENT_ANY_ID, &_eth_event_cb, NULL, &_eth_ev_instance)) { if (_eth_ev_instance == NULL && esp_event_handler_instance_register(ETH_EVENT, ESP_EVENT_ANY_ID, &_eth_event_cb, NULL, &_eth_ev_instance)) {
log_e("event_handler_instance_register for ETH_EVENT Failed!"); log_e("event_handler_instance_register for ETH_EVENT Failed!");
return false; return false;
@ -803,6 +832,8 @@ bool ETHClass::beginSPI(
return false; return false;
} }
_eth_started = true;
// If Arduino's SPI is used, cs pin is in GPIO mode // If Arduino's SPI is used, cs pin is in GPIO mode
#if ETH_SPI_SUPPORTS_CUSTOM #if ETH_SPI_SUPPORTS_CUSTOM
if (_spi == NULL) { if (_spi == NULL) {
@ -849,7 +880,7 @@ bool ETHClass::beginSPI(
perimanSetPinBusExtraType(_pin_rst, "ETH_RST"); perimanSetPinBusExtraType(_pin_rst, "ETH_RST");
} }
Network.onSysEvent(onEthConnected, ARDUINO_EVENT_ETH_CONNECTED); _eth_connected_event_handle = Network.onSysEvent(onEthConnected, ARDUINO_EVENT_ETH_CONNECTED);
return true; return true;
@ -885,7 +916,8 @@ static bool empty_ethDetachBus(void *bus_pointer) {
void ETHClass::end(void) { void ETHClass::end(void) {
Network.removeEvent(onEthConnected, ARDUINO_EVENT_ETH_CONNECTED); Network.removeEvent(_eth_connected_event_handle);
_eth_connected_event_handle = 0;
if (_eth_handle != NULL) { if (_eth_handle != NULL) {
if (esp_eth_stop(_eth_handle) != ESP_OK) { if (esp_eth_stop(_eth_handle) != ESP_OK) {
@ -896,6 +928,9 @@ void ETHClass::end(void) {
while (getStatusBits() & ESP_NETIF_STARTED_BIT) { while (getStatusBits() & ESP_NETIF_STARTED_BIT) {
delay(10); delay(10);
} }
_eth_started = false;
//delete glue first //delete glue first
if (_glue_handle != NULL) { if (_glue_handle != NULL) {
if (esp_eth_del_netif_glue(_glue_handle) != ESP_OK) { if (esp_eth_del_netif_glue(_glue_handle) != ESP_OK) {
@ -1009,7 +1044,7 @@ bool ETHClass::fullDuplex() const {
return (link_duplex == ETH_DUPLEX_FULL); return (link_duplex == ETH_DUPLEX_FULL);
} }
bool ETHClass::setFullDuplex(bool on) { bool ETHClass::_setFullDuplex(bool on) {
if (_eth_handle == NULL) { if (_eth_handle == NULL) {
return false; return false;
} }
@ -1021,6 +1056,18 @@ bool ETHClass::setFullDuplex(bool on) {
return err == ESP_OK; return err == ESP_OK;
} }
bool ETHClass::setFullDuplex(bool on) {
if (_eth_started) {
log_e("This method must be called before ETH.begin()");
return false;
}
if (_auto_negotiation) {
log_w("Auto Negotiation MUST be OFF for this setting to be applied");
}
_full_duplex = on;
return true;
}
bool ETHClass::autoNegotiation() const { bool ETHClass::autoNegotiation() const {
if (_eth_handle == NULL) { if (_eth_handle == NULL) {
return false; return false;
@ -1030,7 +1077,7 @@ bool ETHClass::autoNegotiation() const {
return auto_nego; return auto_nego;
} }
bool ETHClass::setAutoNegotiation(bool on) { bool ETHClass::_setAutoNegotiation(bool on) {
if (_eth_handle == NULL) { if (_eth_handle == NULL) {
return false; return false;
} }
@ -1041,6 +1088,15 @@ bool ETHClass::setAutoNegotiation(bool on) {
return err == ESP_OK; return err == ESP_OK;
} }
bool ETHClass::setAutoNegotiation(bool on) {
if (_eth_started) {
log_e("This method must be called before ETH.begin()");
return false;
}
_auto_negotiation = on;
return true;
}
uint32_t ETHClass::phyAddr() const { uint32_t ETHClass::phyAddr() const {
if (_eth_handle == NULL) { if (_eth_handle == NULL) {
return 0; return 0;
@ -1059,7 +1115,7 @@ uint16_t ETHClass::linkSpeed() const {
return (link_speed == ETH_SPEED_10M) ? 10 : 100; return (link_speed == ETH_SPEED_10M) ? 10 : 100;
} }
bool ETHClass::setLinkSpeed(uint16_t speed) { bool ETHClass::_setLinkSpeed(uint16_t speed) {
if (_eth_handle == NULL) { if (_eth_handle == NULL) {
return false; return false;
} }
@ -1071,6 +1127,22 @@ bool ETHClass::setLinkSpeed(uint16_t speed) {
return err == ESP_OK; return err == ESP_OK;
} }
bool ETHClass::setLinkSpeed(uint16_t speed) {
if (speed != 10 && speed != 100) {
log_e("Ethernet currently supports only 10 or 100 Mbps link speed");
return false;
}
if (_eth_started) {
log_e("This method must be called before ETH.begin()");
return false;
}
if (_auto_negotiation) {
log_w("Auto Negotiation MUST be OFF for this setting to be applied");
}
_link_speed = speed;
return true;
}
// void ETHClass::getMac(uint8_t* mac) // void ETHClass::getMac(uint8_t* mac)
// { // {
// if(_eth_handle != NULL && mac != NULL){ // if(_eth_handle != NULL && mac != NULL){

View file

@ -229,6 +229,10 @@ private:
esp_eth_netif_glue_handle_t _glue_handle; esp_eth_netif_glue_handle_t _glue_handle;
esp_eth_mac_t *_mac; esp_eth_mac_t *_mac;
esp_eth_phy_t *_phy; esp_eth_phy_t *_phy;
bool _eth_started;
uint16_t _link_speed;
bool _full_duplex;
bool _auto_negotiation;
#if ETH_SPI_SUPPORTS_CUSTOM #if ETH_SPI_SUPPORTS_CUSTOM
SPIClass *_spi; SPIClass *_spi;
char _cs_str[10]; char _cs_str[10];
@ -247,6 +251,7 @@ private:
int8_t _pin_rmii_clock; int8_t _pin_rmii_clock;
#endif /* CONFIG_ETH_USE_ESP32_EMAC */ #endif /* CONFIG_ETH_USE_ESP32_EMAC */
size_t _task_stack_size; size_t _task_stack_size;
network_event_handle_t _eth_connected_event_handle;
static bool ethDetachBus(void *bus_pointer); static bool ethDetachBus(void *bus_pointer);
bool beginSPI( bool beginSPI(
@ -256,6 +261,9 @@ private:
#endif #endif
int sck, int miso, int mosi, spi_host_device_t spi_host, uint8_t spi_freq_mhz int sck, int miso, int mosi, spi_host_device_t spi_host, uint8_t spi_freq_mhz
); );
bool _setFullDuplex(bool on);
bool _setLinkSpeed(uint16_t speed);
bool _setAutoNegotiation(bool on);
friend class EthernetClass; // to access beginSPI friend class EthernetClass; // to access beginSPI
}; };

View file

@ -152,7 +152,8 @@ esp_modem_dce_t *PPPClass::handle() const {
PPPClass::PPPClass() PPPClass::PPPClass()
: _dce(NULL), _pin_tx(-1), _pin_rx(-1), _pin_rts(-1), _pin_cts(-1), _flow_ctrl(ESP_MODEM_FLOW_CONTROL_NONE), _pin_rst(-1), _pin_rst_act_low(true), : _dce(NULL), _pin_tx(-1), _pin_rx(-1), _pin_rts(-1), _pin_cts(-1), _flow_ctrl(ESP_MODEM_FLOW_CONTROL_NONE), _pin_rst(-1), _pin_rst_act_low(true),
_pin_rst_delay(200), _pin(NULL), _apn(NULL), _rx_buffer_size(4096), _tx_buffer_size(512), _mode(ESP_MODEM_MODE_COMMAND), _uart_num(UART_NUM_1) {} _pin_rst_delay(200), _pin(NULL), _apn(NULL), _rx_buffer_size(4096), _tx_buffer_size(512), _mode(ESP_MODEM_MODE_COMMAND), _uart_num(UART_NUM_1),
_ppp_event_handle(0) {}
PPPClass::~PPPClass() {} PPPClass::~PPPClass() {}
@ -360,7 +361,7 @@ bool PPPClass::begin(ppp_modem_model_t model, uint8_t uart_num, int baud_rate) {
} }
} }
Network.onSysEvent(onPppArduinoEvent); _ppp_event_handle = Network.onSysEvent(onPppArduinoEvent);
setStatusBits(ESP_NETIF_STARTED_BIT); setStatusBits(ESP_NETIF_STARTED_BIT);
arduino_event_t arduino_event; arduino_event_t arduino_event;
@ -402,7 +403,8 @@ void PPPClass::end(void) {
} }
_esp_modem = NULL; _esp_modem = NULL;
Network.removeEvent(onPppArduinoEvent); Network.removeEvent(_ppp_event_handle);
_ppp_event_handle = 0;
if (_dce != NULL) { if (_dce != NULL) {
esp_modem_destroy(_dce); esp_modem_destroy(_dce);

View file

@ -108,6 +108,7 @@ private:
int _tx_buffer_size; int _tx_buffer_size;
esp_modem_dce_mode_t _mode; esp_modem_dce_mode_t _mode;
uint8_t _uart_num; uint8_t _uart_num;
network_event_handle_t _ppp_event_handle;
static bool pppDetachBus(void *bus_pointer); static bool pppDetachBus(void *bus_pointer);
}; };

View file

@ -148,7 +148,7 @@ void APClass::_onApEvent(int32_t event_id, void *event_data) {
} }
} }
APClass::APClass() { APClass::APClass() : _wifi_ap_event_handle(0) {
_ap_network_if = this; _ap_network_if = this;
} }
@ -163,7 +163,7 @@ bool APClass::onEnable() {
return false; return false;
} }
if (_esp_netif == NULL) { if (_esp_netif == NULL) {
Network.onSysEvent(_onApArduinoEvent); _wifi_ap_event_handle = Network.onSysEvent(_onApArduinoEvent);
_esp_netif = get_esp_interface_netif(ESP_IF_WIFI_AP); _esp_netif = get_esp_interface_netif(ESP_IF_WIFI_AP);
/* attach to receive events */ /* attach to receive events */
initNetif(ESP_NETIF_ID_AP); initNetif(ESP_NETIF_ID_AP);
@ -172,7 +172,8 @@ bool APClass::onEnable() {
} }
bool APClass::onDisable() { bool APClass::onDisable() {
Network.removeEvent(_onApArduinoEvent); Network.removeEvent(_wifi_ap_event_handle);
_wifi_ap_event_handle = 0;
// we just set _esp_netif to NULL here, so destroyNetif() does not try to destroy it. // we just set _esp_netif to NULL here, so destroyNetif() does not try to destroy it.
// That would be done by WiFi.enableAP(false) if STA is not enabled, or when it gets disabled // That would be done by WiFi.enableAP(false) if STA is not enabled, or when it gets disabled
_esp_netif = NULL; _esp_netif = NULL;

View file

@ -228,7 +228,8 @@ void STAClass::_onStaEvent(int32_t event_id, void *event_data) {
} }
STAClass::STAClass() STAClass::STAClass()
: _minSecurity(WIFI_AUTH_WPA2_PSK), _scanMethod(WIFI_FAST_SCAN), _sortMethod(WIFI_CONNECT_AP_BY_SIGNAL), _autoReconnect(true), _status(WL_STOPPED) { : _minSecurity(WIFI_AUTH_WPA2_PSK), _scanMethod(WIFI_FAST_SCAN), _sortMethod(WIFI_CONNECT_AP_BY_SIGNAL), _autoReconnect(true), _status(WL_STOPPED),
_wifi_sta_event_handle(0) {
_sta_network_if = this; _sta_network_if = this;
} }
@ -276,14 +277,15 @@ bool STAClass::onEnable() {
return false; return false;
} }
/* attach to receive events */ /* attach to receive events */
Network.onSysEvent(_onStaArduinoEvent); _wifi_sta_event_handle = Network.onSysEvent(_onStaArduinoEvent);
initNetif(ESP_NETIF_ID_STA); initNetif(ESP_NETIF_ID_STA);
} }
return true; return true;
} }
bool STAClass::onDisable() { bool STAClass::onDisable() {
Network.removeEvent(_onStaArduinoEvent); Network.removeEvent(_wifi_sta_event_handle);
_wifi_sta_event_handle = 0;
// we just set _esp_netif to NULL here, so destroyNetif() does not try to destroy it. // we just set _esp_netif to NULL here, so destroyNetif() does not try to destroy it.
// That would be done by WiFi.enableSTA(false) if AP is not enabled, or when it gets disabled // That would be done by WiFi.enableSTA(false) if AP is not enabled, or when it gets disabled
_esp_netif = NULL; _esp_netif = NULL;

View file

@ -60,6 +60,8 @@ public:
void _onApEvent(int32_t event_id, void *event_data); void _onApEvent(int32_t event_id, void *event_data);
protected: protected:
network_event_handle_t _wifi_ap_event_handle;
size_t printDriverInfo(Print &out) const; size_t printDriverInfo(Print &out) const;
friend class WiFiGenericClass; friend class WiFiGenericClass;

View file

@ -95,6 +95,7 @@ protected:
wifi_sort_method_t _sortMethod; wifi_sort_method_t _sortMethod;
bool _autoReconnect; bool _autoReconnect;
wl_status_t _status; wl_status_t _status;
network_event_handle_t _wifi_sta_event_handle;
size_t printDriverInfo(Print &out) const; size_t printDriverInfo(Print &out) const;

View file

@ -92,9 +92,6 @@ int16_t
} }
if (esp_wifi_scan_start(&config, false) == ESP_OK) { if (esp_wifi_scan_start(&config, false) == ESP_OK) {
_scanStarted = millis(); _scanStarted = millis();
if (!_scanStarted) { //Prevent 0 from millis overflow
++_scanStarted;
}
WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT); WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT);
WiFiGenericClass::setStatusBits(WIFI_SCANNING_BIT); WiFiGenericClass::setStatusBits(WIFI_SCANNING_BIT);
@ -118,21 +115,20 @@ int16_t
void WiFiScanClass::_scanDone() { void WiFiScanClass::_scanDone() {
esp_wifi_scan_get_ap_num(&(WiFiScanClass::_scanCount)); esp_wifi_scan_get_ap_num(&(WiFiScanClass::_scanCount));
if (WiFiScanClass::_scanResult) { if (WiFiScanClass::_scanResult) {
delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult); free(WiFiScanClass::_scanResult);
WiFiScanClass::_scanResult = nullptr; WiFiScanClass::_scanResult = NULL;
} }
if (WiFiScanClass::_scanCount) { if (WiFiScanClass::_scanCount) {
WiFiScanClass::_scanResult = new (std::nothrow) wifi_ap_record_t[WiFiScanClass::_scanCount]; WiFiScanClass::_scanResult = calloc(WiFiScanClass::_scanCount, sizeof(wifi_ap_record_t));
if (!WiFiScanClass::_scanResult) { if (!WiFiScanClass::_scanResult) {
WiFiScanClass::_scanCount = 0; WiFiScanClass::_scanCount = 0;
} else if (esp_wifi_scan_get_ap_records(&(WiFiScanClass::_scanCount), (wifi_ap_record_t *)_scanResult) != ESP_OK) { } else if (esp_wifi_scan_get_ap_records(&(WiFiScanClass::_scanCount), (wifi_ap_record_t *)_scanResult) != ESP_OK) {
delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult); free(WiFiScanClass::_scanResult);
WiFiScanClass::_scanResult = nullptr; WiFiScanClass::_scanResult = NULL;
WiFiScanClass::_scanCount = 0; WiFiScanClass::_scanCount = 0;
} }
} }
WiFiScanClass::_scanStarted = 0; //Reset after a scan is completed for normal behavior
WiFiGenericClass::setStatusBits(WIFI_SCAN_DONE_BIT); WiFiGenericClass::setStatusBits(WIFI_SCAN_DONE_BIT);
WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT); WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT);
} }
@ -161,15 +157,13 @@ int16_t WiFiScanClass::scanComplete() {
} }
if (WiFiGenericClass::getStatusBits() & WIFI_SCANNING_BIT) { if (WiFiGenericClass::getStatusBits() & WIFI_SCANNING_BIT) {
// Check if the delay expired, return WIFI_SCAN_FAILED in this case
if ((millis() - WiFiScanClass::_scanStarted) > WiFiScanClass::_scanTimeout) {
WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT);
return WIFI_SCAN_FAILED;
}
return WIFI_SCAN_RUNNING; return WIFI_SCAN_RUNNING;
} }
// last one to avoid time affecting Async mode
if (WiFiScanClass::_scanStarted
&& (millis() - WiFiScanClass::_scanStarted)
> WiFiScanClass::_scanTimeout) { //Check is scan was started and if the delay expired, return WIFI_SCAN_FAILED in this case
WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT);
return WIFI_SCAN_FAILED;
}
return WIFI_SCAN_FAILED; return WIFI_SCAN_FAILED;
} }
@ -179,11 +173,12 @@ int16_t WiFiScanClass::scanComplete() {
*/ */
void WiFiScanClass::scanDelete() { void WiFiScanClass::scanDelete() {
WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT); WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT);
WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT);
if (WiFiScanClass::_scanResult) { if (WiFiScanClass::_scanResult) {
delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult); free(WiFiScanClass::_scanResult);
WiFiScanClass::_scanResult = nullptr; WiFiScanClass::_scanResult = NULL;
WiFiScanClass::_scanCount = 0;
} }
WiFiScanClass::_scanCount = 0;
} }
/** /**

View file

@ -0,0 +1,78 @@
# Arduino-ESP32 Zigbee Illuminance Sensor Example
This example demonstrates how to use the Zigbee library to create an end device illuminance sensor and use it as a Home Automation (HA) extended illuminance sensor.
# Supported Targets
Currently, this example supports the following targets.
| Supported Targets | ESP32-C6 | ESP32-H2 |
| ----------------- | -------- | -------- |
## Illuminance Sensor Functions
1. Initialize a Zigbee illuminance sensor.
2. Measure illuminance value.
3. Report the measured value to the Zigbee network.
## Hardware Required
* ESP32-H2 or ESP32-C6 development board
* A USB cable for power supply and programming
* Some kind of light sensor, such as a photoresistor
### Configure the Project
In this example the raw analog value of a light sensor is used to calculate illuminance.
Alter the calculation according to your use case and calibrate it to receive correct lux values.
Set the illuminance sensor GPIO by changing the `illuminance_sensor_pin` variable to the pin to the pin to which your sensor is connected.
Set the button GPIO by changing the `button` variable. By default, it's the pin `BOOT_PIN` (BOOT button on ESP32-C6 and ESP32-H2).
#### Using Arduino IDE
To get more information about the Espressif boards see [Espressif Development Kits](https://www.espressif.com/en/products/devkits).
* Before Compile/Verify, select the correct board: `Tools -> Board`.
* Select the End device Zigbee mode: `Tools -> Zigbee mode: Zigbee ED (end device)`
* Select Partition Scheme for Zigbee: `Tools -> Partition Scheme: Zigbee 4MB with spiffs`
* Enable USB CDC to be able to use the serial monitor: `Tools -> USB CDC On Boot: Enabled`
* Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port.
* Optional: Set debug level to verbose to see all logs from Zigbee stack: `Tools -> Core Debug Level: Verbose`.
## Troubleshooting
If the End device flashed with this example is not connecting to the coordinator, erase the flash of the End device before flashing the example to the board. It is recommended to do this if you re-flash the coordinator.
You can do the following:
* In the Arduino IDE go to the Tools menu and set `Erase All Flash Before Sketch Upload` to `Enabled`.
* Add to the sketch `Zigbee.factoryReset();` to reset the device and Zigbee stack.
By default, the coordinator network is closed after rebooting or flashing new firmware.
To open the network you have 2 options:
* Open network after reboot by setting `Zigbee.setRebootOpenNetwork(time);` before calling `Zigbee.begin();`.
* In application you can anytime call `Zigbee.openNetwork(time);` to open the network for devices to join.
***Important: Make sure that you are using a good quality USB cable with data lines and that you have a reliable power source***
* **LED not blinking:** Check the wiring connection and the IO selection.
* **Programming Fail:** If the programming/flash procedure fails, try reducing the serial connection speed.
* **COM port not detected:** Check the USB cable and the USB to Serial driver installation.
If the error persists, you can ask for help at the official [ESP32 forum](https://esp32.com) or see [Contribute](#contribute).
## Contribute
To know how to contribute to this project, see [How to contribute.](https://github.com/espressif/arduino-esp32/blob/master/CONTRIBUTING.rst)
If you have any **feedback** or **issue** to report on this example/library, please open an issue or fix it by creating a new PR. Contributions are more than welcome!
Before creating a new issue, be sure to try Troubleshooting and check if the same issue was already created by someone else.
## Resources
* Official ESP32 Forum: [Link](https://esp32.com)
* Arduino-ESP32 Official Repository: [espressif/arduino-esp32](https://github.com/espressif/arduino-esp32)
* ESP32-C6 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf)
* ESP32-H2 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-h2_datasheet_en.pdf)
* Official ESP-IDF documentation: [ESP-IDF](https://idf.espressif.com)

View file

@ -0,0 +1,141 @@
// Copyright 2025 Espressif Systems (Shanghai) PTE LTD
//
// Licensed 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.
/**
* @brief This example demonstrates Zigbee illuminance sensor.
*
* The example demonstrates how to use Zigbee library to create a end device illuminance sensor.
* The illuminance sensor is a Zigbee end device, which is controlled by a Zigbee coordinator.
*
* Proper Zigbee mode must be selected in Tools->Zigbee mode
* and also the correct partition scheme must be selected in Tools->Partition Scheme.
*
* Please check the README.md for instructions and more detailed description.
*
* Created by MikaFromTheRoof (https://github.com/MikaFromTheRoof)
*/
#ifndef ZIGBEE_MODE_ED
#error "Zigbee end device mode is not selected in Tools->Zigbee mode"
#endif
#include "Zigbee.h"
#define ZIGBEE_ILLUMINANCE_SENSOR_ENDPOINT 9
uint8_t button = BOOT_PIN;
uint8_t illuminance_sensor_pin = 6; // Insert the analog pin to which the sensor (e.g. photoresistor) is connected
ZigbeeIlluminanceSensor zbIlluminanceSensor = ZigbeeIlluminanceSensor(ZIGBEE_ILLUMINANCE_SENSOR_ENDPOINT);
/********************* Illuminance sensor **************************/
static void illuminance_sensor_value_update(void *arg) {
for (;;) {
// read the raw analog value from the sensor
int lsens_analog_raw = analogRead(illuminance_sensor_pin);
Serial.printf("[Illuminance Sensor] raw analog value: %d\r\n", lsens_analog_raw);
// conversion into zigbee raw illuminance value (typically between 0 in darkness and 50000 in direct sunlight)
// depends on the value range of the raw analog sensor values and will need calibration for correct lux values
// for demonstration purpose map the 12-bit ADC value (0-4095) to Zigbee illuminance range (0-50000)
int lsens_illuminance_raw = map(lsens_analog_raw, 0, 4095, 0, 50000);
Serial.printf("[Illuminance Sensor] raw illuminance value: %d\r\n", lsens_illuminance_raw);
// according to zigbee documentation the formular 10^(lsens_illuminance_raw/10000)-1 can be used to calculate lux value from raw illuminance value
// Note: Zigbee2MQTT seems to be using the formular 10^(lsens_illuminance_raw/10000) instead (without -1)
int lsens_illuminance_lux = round(pow(10, (lsens_illuminance_raw / 10000.0)) - 1);
Serial.printf("[Illuminance Sensor] lux value: %d lux\r\n", lsens_illuminance_lux);
// Update illuminance in illuminance sensor EP
zbIlluminanceSensor.setIlluminance(lsens_illuminance_raw); // use raw illuminance here!
delay(1000); // reduce delay (in ms), if you want your device to react more quickly to changes in illuminance
}
}
/********************* Arduino functions **************************/
void setup() {
Serial.begin(115200);
// Optional: configure analog input
analogSetAttenuation(ADC_11db); // set analog to digital converter (ADC) attenuation to 11 dB (up to ~3.3V input)
analogReadResolution(12); // set analog read resolution to 12 bits (value range from 0 to 4095), 12 is default
// Init button for factory reset
pinMode(button, INPUT_PULLUP);
// Optional: Set Zigbee device name and model
zbIlluminanceSensor.setManufacturerAndModel("Espressif", "ZigbeeIlluminanceSensor");
// Optional: Set power source (choose between ZB_POWER_SOURCE_MAINS and ZB_POWER_SOURCE_BATTERY), defaults to unknown
zbIlluminanceSensor.setPowerSource(ZB_POWER_SOURCE_MAINS);
// Set minimum and maximum for raw illuminance value (0 min and 50000 max equals to 0 lux - 100,000 lux)
zbIlluminanceSensor.setMinMaxValue(0, 50000);
// Optional: Set tolerance for raw illuminance value
zbIlluminanceSensor.setTolerance(1);
// Add endpoint to Zigbee Core
Serial.println("Adding Zigbee illuminance sensor endpoint to Zigbee Core");
Zigbee.addEndpoint(&zbIlluminanceSensor);
Serial.println("Starting Zigbee...");
// When all EPs are registered, start Zigbee in End Device mode
if (!Zigbee.begin()) {
Serial.println("Zigbee failed to start!");
Serial.println("Rebooting...");
ESP.restart();
} else {
Serial.println("Zigbee started successfully!");
}
Serial.println("Connecting to network");
while (!Zigbee.connected()) {
Serial.print(".");
delay(100);
}
Serial.println();
// Start illuminance sensor reading task
xTaskCreate(illuminance_sensor_value_update, "illuminance_sensor_update", 2048, NULL, 10, NULL);
// Set reporting schedule for illuminance value measurement in seconds, must be called after Zigbee.begin()
// min_interval and max_interval in seconds, delta
// if min = 1 and max = 0, delta = 1000, reporting is sent when raw illuminance value changes by 1000, but at most once per second
// if min = 0 and max = 10, delta = 1000, reporting is sent every 10 seconds or if raw illuminance value changes by 1000
// if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of illuminance change
// Note: On pairing with Zigbee Home Automation or Zigbee2MQTT the reporting schedule will most likely be overwritten with their default settings
zbIlluminanceSensor.setReporting(1, 0, 1000);
}
/********************* Main loop **************************/
void loop() {
// Checking button for factory reset
if (digitalRead(button) == LOW) { // Push button pressed
// Key debounce handling
delay(100);
int startTime = millis();
while (digitalRead(button) == LOW) {
delay(50);
if ((millis() - startTime) > 3000) {
// If key pressed for more than 3 secs, factory reset Zigbee and reboot
Serial.println("Resetting Zigbee to factory and rebooting in 1s");
delay(1000);
Zigbee.factoryReset();
}
}
// force report of illuminance when button is pressed
zbIlluminanceSensor.report();
}
delay(100);
}

View file

@ -0,0 +1,7 @@
{
"fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed",
"requires": [
"CONFIG_SOC_IEEE802154_SUPPORTED=y",
"CONFIG_ZB_ENABLED=y"
]
}

View file

@ -29,6 +29,7 @@ ZigbeeGateway KEYWORD1
ZigbeeRangeExtender KEYWORD1 ZigbeeRangeExtender KEYWORD1
ZigbeeVibrationSensor KEYWORD1 ZigbeeVibrationSensor KEYWORD1
ZigbeeWindowCovering KEYWORD1 ZigbeeWindowCovering KEYWORD1
ZigbeeIlluminanceSensor KEYWORD1
# Other # Other
zigbee_role_t KEYWORD1 zigbee_role_t KEYWORD1
@ -123,6 +124,9 @@ setHumidity KEYWORD2
setHumidityReporting KEYWORD2 setHumidityReporting KEYWORD2
reportHumidity KEYWORD2 reportHumidity KEYWORD2
# ZigbeeIlluminanceSensor
setIlluminance KEYWORD2
# ZigbeeFlowSensor # ZigbeeFlowSensor
setFlow KEYWORD2 setFlow KEYWORD2

View file

@ -18,6 +18,7 @@
#include "ep/ZigbeeAnalog.h" #include "ep/ZigbeeAnalog.h"
#include "ep/ZigbeeFlowSensor.h" #include "ep/ZigbeeFlowSensor.h"
#include "ep/ZigbeeOccupancySensor.h" #include "ep/ZigbeeOccupancySensor.h"
#include "ep/ZigbeeIlluminanceSensor.h"
#include "ep/ZigbeeCarbonDioxideSensor.h" #include "ep/ZigbeeCarbonDioxideSensor.h"
#include "ep/ZigbeeContactSwitch.h" #include "ep/ZigbeeContactSwitch.h"
#include "ep/ZigbeeDoorWindowHandle.h" #include "ep/ZigbeeDoorWindowHandle.h"

View file

@ -0,0 +1,74 @@
#include "ZigbeeIlluminanceSensor.h"
#if CONFIG_ZB_ENABLED
ZigbeeIlluminanceSensor::ZigbeeIlluminanceSensor(uint8_t endpoint) : ZigbeeEP(endpoint) {
_device_id = ESP_ZB_HA_LIGHT_SENSOR_DEVICE_ID;
esp_zb_light_sensor_cfg_t light_sensor_cfg = ZIGBEE_DEFAULT_ILLUMINANCE_SENSOR_CONFIG();
_cluster_list = esp_zb_light_sensor_clusters_create(&light_sensor_cfg);
_ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_LIGHT_SENSOR_DEVICE_ID, .app_device_version = 0};
}
void ZigbeeIlluminanceSensor::setMinMaxValue(uint16_t min, uint16_t max) {
esp_zb_attribute_list_t *light_measure_cluster =
esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE);
esp_zb_cluster_update_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MIN_MEASURED_VALUE_ID, (void *)&min);
esp_zb_cluster_update_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MAX_MEASURED_VALUE_ID, (void *)&max);
}
void ZigbeeIlluminanceSensor::setTolerance(uint16_t tolerance) {
esp_zb_attribute_list_t *light_measure_cluster =
esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE);
esp_zb_illuminance_meas_cluster_add_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_TOLERANCE_ID, (void *)&tolerance);
}
void ZigbeeIlluminanceSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) {
esp_zb_zcl_reporting_info_t reporting_info;
memset(&reporting_info, 0, sizeof(esp_zb_zcl_reporting_info_t));
reporting_info.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV;
reporting_info.ep = _endpoint;
reporting_info.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT;
reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE;
reporting_info.attr_id = ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MEASURED_VALUE_ID;
reporting_info.u.send_info.min_interval = min_interval;
reporting_info.u.send_info.max_interval = max_interval;
reporting_info.u.send_info.def_min_interval = min_interval;
reporting_info.u.send_info.def_max_interval = max_interval;
reporting_info.u.send_info.delta.u16 = delta;
reporting_info.dst.profile_id = ESP_ZB_AF_HA_PROFILE_ID;
reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC;
esp_zb_lock_acquire(portMAX_DELAY);
esp_zb_zcl_update_reporting_info(&reporting_info);
esp_zb_lock_release();
}
void ZigbeeIlluminanceSensor::setIlluminance(uint16_t illuminanceValue) {
log_v("Updating Illuminance...");
/* Update illuminance sensor measured illuminance */
log_d("Setting Illuminance to %d", illuminanceValue);
esp_zb_lock_acquire(portMAX_DELAY);
esp_zb_zcl_set_attribute_val(
_endpoint, ESP_ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MEASURED_VALUE_ID,
&illuminanceValue, false
);
esp_zb_lock_release();
}
void ZigbeeIlluminanceSensor::report() {
/* Send report attributes command */
esp_zb_zcl_report_attr_cmd_t report_attr_cmd;
report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT;
report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MEASURED_VALUE_ID;
report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI;
report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT;
report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint;
report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC;
esp_zb_lock_acquire(portMAX_DELAY);
esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd);
esp_zb_lock_release();
log_v("Illuminance report sent");
}
#endif // CONFIG_ZB_ENABLED

View file

@ -0,0 +1,51 @@
/* Class of Zigbee Illuminance sensor endpoint inherited from common EP class */
#pragma once
#include "soc/soc_caps.h"
#include "sdkconfig.h"
#if CONFIG_ZB_ENABLED
#include "ZigbeeEP.h"
#include "ha/esp_zigbee_ha_standard.h"
#define ZIGBEE_DEFAULT_ILLUMINANCE_SENSOR_CONFIG() \
{ \
.basic_cfg = \
{ \
.zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \
.power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \
}, \
.identify_cfg = \
{ \
.identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \
}, \
.illuminance_cfg = { \
.measured_value = ESP_ZB_ZCL_ILLUMINANCE_MEASUREMENT_LIGHT_SENSOR_TYPE_DEFAULT_VALUE, \
.min_value = ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MIN_MEASURED_VALUE_MIN_VALUE, \
.max_value = ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MAX_MEASURED_VALUE_MAX_VALUE, \
}, \
}
class ZigbeeIlluminanceSensor : public ZigbeeEP {
public:
ZigbeeIlluminanceSensor(uint8_t endpoint);
~ZigbeeIlluminanceSensor() {}
// Set the illuminance value
void setIlluminance(uint16_t value);
// Set the min and max value for the illuminance sensor
void setMinMaxValue(uint16_t min, uint16_t max);
// Set the tolerance value for the illuminance sensor
void setTolerance(uint16_t tolerance);
// Set the reporting interval for illuminance measurement in seconds and delta
void setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta);
// Report the illuminance value
void report();
};
#endif // CONFIG_ZB_ENABLED

View file

@ -0,0 +1,7 @@
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0xC80000,
app1, app, ota_1, 0xC90000,0xC80000,
spiffs, data, spiffs, 0x1910000,0x6C0000,
coredump, data, coredump,0x1FF0000,0x10000,
1 # Name Type SubType Offset Size Flags
2 nvs data nvs 0x9000 0x5000
3 otadata data ota 0xe000 0x2000
4 app0 app ota_0 0x10000 0xC80000
5 app1 app ota_1 0xC90000 0xC80000
6 spiffs data spiffs 0x1910000 0x6C0000
7 coredump data coredump 0x1FF0000 0x10000

View file

@ -2,6 +2,7 @@
#define Pins_Arduino_h #define Pins_Arduino_h
#include <stdint.h> #include <stdint.h>
#include <stdbool.h>
#define USB_VID 0x303a #define USB_VID 0x303a
#define USB_PID 0x1001 #define USB_PID 0x1001

View file

@ -2,10 +2,18 @@
#define Pins_Arduino_h #define Pins_Arduino_h
#include <stdint.h> #include <stdint.h>
#include "soc/soc_caps.h"
static const uint8_t LED_BUILTIN = 7; // based on https://www.wemos.cc/en/latest/c3/c3_mini.html
// WS2812 RGB LED on pin 7
#define PIN_RGB_LED 7
// BUILTIN_LED can be used in new Arduino API digitalWrite() like in Blink.ino
static const uint8_t LED_BUILTIN = SOC_GPIO_PIN_COUNT + PIN_RGB_LED;
#define BUILTIN_LED LED_BUILTIN // backward compatibility #define BUILTIN_LED LED_BUILTIN // backward compatibility
#define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN #define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN
// RGB_BUILTIN and RGB_BRIGHTNESS can be used in new Arduino API rgbLedWrite()
#define RGB_BUILTIN LED_BUILTIN
#define RGB_BRIGHTNESS 64
static const uint8_t TX = 21; static const uint8_t TX = 21;
static const uint8_t RX = 20; static const uint8_t RX = 20;

View file

@ -4,10 +4,18 @@
#define Pins_Arduino_h #define Pins_Arduino_h
#include <stdint.h> #include <stdint.h>
#include "soc/soc_caps.h"
static const uint8_t LED_BUILTIN = 7; // based on https://www.wemos.cc/en/latest/c3/c3_pico.html
// WS2812 RGB LED on pin 7
#define PIN_RGB_LED 7
// BUILTIN_LED can be used in new Arduino API digitalWrite() like in Blink.ino
static const uint8_t LED_BUILTIN = SOC_GPIO_PIN_COUNT + PIN_RGB_LED;
#define BUILTIN_LED LED_BUILTIN // backward compatibility #define BUILTIN_LED LED_BUILTIN // backward compatibility
#define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN #define LED_BUILTIN LED_BUILTIN // allow testing #ifdef LED_BUILTIN
// RGB_BUILTIN and RGB_BRIGHTNESS can be used in new Arduino API rgbLedWrite()
#define RGB_BUILTIN LED_BUILTIN
#define RGB_BRIGHTNESS 64
static const uint8_t TX = 21; static const uint8_t TX = 21;
static const uint8_t RX = 20; static const uint8_t RX = 20;
@ -17,7 +25,7 @@ static const uint8_t SCL = 10;
static const uint8_t VBAT = 3; static const uint8_t VBAT = 3;
static const uint8_t SCK = 2; static const uint8_t SCK = 1;
static const uint8_t MISO = 0; static const uint8_t MISO = 0;
static const uint8_t MOSI = 4; static const uint8_t MOSI = 4;
static const uint8_t SS = 5; static const uint8_t SS = 5;