diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 94ad9314b9a56c..4d5be76434e8f8 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -14,7 +14,7 @@
"mounts": [
"source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind"
],
- "initializeCommand": ".devcontainer/build.sh --tag matter-dev-environment:local --version 22",
+ "initializeCommand": "bash .devcontainer/build.sh --tag matter-dev-environment:local --version 22",
"image": "matter-dev-environment:local",
"remoteUser": "vscode",
"customizations": {
diff --git a/.github/.wordlist.txt b/.github/.wordlist.txt
index 58a06086679e06..155e909a43f526 100644
--- a/.github/.wordlist.txt
+++ b/.github/.wordlist.txt
@@ -523,6 +523,7 @@ epochStartTime
eq
errorValue
esd
+espcoredump
ESPPORT
Espressif
esptool
@@ -1621,4 +1622,4 @@ zephyrproject
zhengyaohan
Zigbee
zigbeealliance
-zigbeethread
\ No newline at end of file
+zigbeethread
diff --git a/.github/workflows/cherry-picks.yaml b/.github/workflows/cherry-picks.yaml
index 6d9b5339b40b9e..a062aa5fcf9b87 100644
--- a/.github/workflows/cherry-picks.yaml
+++ b/.github/workflows/cherry-picks.yaml
@@ -14,7 +14,6 @@ jobs:
(github.event.pull_request.merged == true)
&& (
(contains(github.event.pull_request.labels.*.name, 'sve'))
- || (contains(github.event.pull_request.labels.*.name, 'spec'))
|| (contains(github.event.pull_request.labels.*.name, 'request sve'))
|| (contains(github.event.pull_request.labels.*.name, 'cert blocker'))
)
@@ -27,11 +26,12 @@ jobs:
uses: carloscastrojumo/github-cherry-pick-action@v1.0.9
with:
token: ${{ secrets.MATTER_PAT }}
- branch: sve-2
+ branch: 1.3-sve
labels: |
sve cherry pick
reviewers: |
woody-apple
andy31415
+ raju-apple
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/darwin-tests.yaml b/.github/workflows/darwin-tests.yaml
index 05943be5b0e155..e6e14ec4929a11 100644
--- a/.github/workflows/darwin-tests.yaml
+++ b/.github/workflows/darwin-tests.yaml
@@ -100,6 +100,7 @@ jobs:
--target darwin-x64-bridge-${BUILD_VARIANT} \
--target darwin-x64-lit-icd-${BUILD_VARIANT} \
--target darwin-x64-microwave-oven-${BUILD_VARIANT} \
+ --target darwin-x64-rvc-${BUILD_VARIANT} \
build \
--copy-artifacts-to objdir-clone \
"
@@ -120,6 +121,7 @@ jobs:
--tv-app ./out/darwin-x64-tv-app-${BUILD_VARIANT}/chip-tv-app \
--bridge-app ./out/darwin-x64-bridge-${BUILD_VARIANT}/chip-bridge-app \
--microwave-oven-app ./out/darwin-x64-microwave-oven-${BUILD_VARIANT}/chip-microwave-oven-app \
+ --rvc-app ./out/darwin-x64-rvc-${BUILD_VARIANT}/chip-rvc-app \
"
- name: Run OTA Test
run: |
diff --git a/.github/workflows/examples-efr32.yaml b/.github/workflows/examples-efr32.yaml
index 36c490956d9ae8..1dae68ced0f4a7 100644
--- a/.github/workflows/examples-efr32.yaml
+++ b/.github/workflows/examples-efr32.yaml
@@ -38,7 +38,7 @@ jobs:
if: github.actor != 'restyled-io[bot]'
container:
- image: ghcr.io/project-chip/chip-build-efr32:35
+ image: ghcr.io/project-chip/chip-build-efr32:36
volumes:
- "/tmp/bloat_reports:/tmp/bloat_reports"
steps:
diff --git a/.github/workflows/examples-tv-app.yaml b/.github/workflows/examples-tv-app.yaml
new file mode 100644
index 00000000000000..fff6cbb39d1acb
--- /dev/null
+++ b/.github/workflows/examples-tv-app.yaml
@@ -0,0 +1,72 @@
+# Copyright (c) 2023 Project CHIP Authors
+#
+# 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.
+
+name: Build example - TV App and TV Casting App
+
+on:
+ push:
+ pull_request:
+ merge_group:
+
+concurrency:
+ group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }}
+ cancel-in-progress: true
+
+env:
+ CHIP_NO_LOG_TIMESTAMPS: true
+
+jobs:
+ tv-app:
+ name: TV App
+
+ env:
+ BUILD_TYPE: tv_app
+
+ runs-on: ubuntu-latest
+ if: github.actor != 'restyled-io[bot]'
+
+ container:
+ image: ghcr.io/project-chip/chip-build-android:35
+ volumes:
+ - "/tmp/bloat_reports:/tmp/bloat_reports"
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Checkout submodules & Bootstrap
+ uses: ./.github/actions/checkout-submodules-and-bootstrap
+ with:
+ platform: android
+ - name: Set up environment for size reports
+ uses: ./.github/actions/setup-size-reports
+ if: ${{ !env.ACT }}
+ with:
+ gh-context: ${{ toJson(github) }}
+ - name: Build Android arm64-tv-casting-app
+ run: |
+ ./scripts/run_in_build_env.sh \
+ "./scripts/build/build_examples.py --target android-arm64-tv-casting-app build"
+ - name: Clean out build output
+ run: rm -rf ./out examples/tv-casting-app/android/App/app/libs/jniLibs/* examples/tv-casting-app/android/App/app/libs/*.jar
+ - name: Build Android arm64-tv-server
+ run: |
+ ./scripts/run_in_build_env.sh \
+ "./scripts/build/build_examples.py --target android-arm64-tv-server build"
+ - name: Clean out build output
+ run: rm -rf ./out examples/tv-app/android/App/app/libs/jniLibs/* examples/tv-app/android/App/app/libs/*.jar
+ - name: Uploading Size Reports
+ uses: ./.github/actions/upload-size-reports
+ if: ${{ !env.ACT }}
+ with:
+ platform-name: TVApp
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 189f63837c841e..d811fe05fa888f 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -93,35 +93,25 @@ jobs:
--known-failure app/AttributeAccessInterface.h \
--known-failure app/AttributeAccessToken.h \
--known-failure app/att-storage.h \
- --known-failure app/BufferedReadCallback.h \
--known-failure app/CommandHandler.h \
--known-failure app/CommandHandlerInterface.h \
- --known-failure app/CommandPathParams.h \
- --known-failure app/CommandPathRegistry.h \
- --known-failure app/CommandResponseSender.h \
--known-failure app/CommandSender.h \
--known-failure app/CommandSenderLegacyCallback.h \
--known-failure app/CompatEnumNames.h \
- --known-failure app/ConcreteAttributePath.h \
- --known-failure app/ConcreteCommandPath.h \
--known-failure app/data-model/ListLargeSystemExtensions.h \
--known-failure app/EventHeader.h \
--known-failure app/EventLoggingDelegate.h \
--known-failure app/EventLogging.h \
--known-failure app/EventLoggingTypes.h \
- --known-failure app/EventManagement.h \
--known-failure app/InteractionModelHelper.h \
- --known-failure app/ObjectList.h \
--known-failure app/ReadClient.h \
--known-failure app/ReadHandler.h \
--known-failure app/ReadPrepareParams.h \
--known-failure app/reporting/tests/MockReportScheduler.cpp \
--known-failure app/reporting/tests/MockReportScheduler.h \
- --known-failure app/server/AppDelegate.h \
--known-failure app/TestEventTriggerDelegate.h \
--known-failure app/util/af.h \
--known-failure app/util/af-types.h \
- --known-failure app/util/attribute-metadata.h \
--known-failure app/util/attribute-storage.cpp \
--known-failure app/util/attribute-storage.h \
--known-failure app/util/attribute-storage-null-handling.h \
@@ -141,11 +131,7 @@ jobs:
--known-failure app/util/im-client-callbacks.h \
--known-failure app/util/MatterCallbacks.h \
--known-failure app/util/message.cpp \
- --known-failure app/util/mock/Constants.h \
- --known-failure app/util/mock/Functions.h \
- --known-failure app/util/mock/MockNodeConfig.h \
--known-failure app/util/odd-sized-integers.h \
- --known-failure app/util/types_stub.h \
--known-failure app/util/util.cpp \
--known-failure app/util/util.h \
--known-failure app/WriteClient.h \
diff --git a/.github/workflows/release_artifacts.yaml b/.github/workflows/release_artifacts.yaml
index c82e9f59a27674..65896c73b3faca 100644
--- a/.github/workflows/release_artifacts.yaml
+++ b/.github/workflows/release_artifacts.yaml
@@ -68,7 +68,7 @@ jobs:
runs-on: ubuntu-latest
container:
- image: ghcr.io/project-chip/chip-build-efr32:35
+ image: ghcr.io/project-chip/chip-build-efr32:36
steps:
- name: Checkout
uses: actions/checkout@v4
diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml
index 05d2670edd665e..83d921c2fa4188 100644
--- a/.github/workflows/tests.yaml
+++ b/.github/workflows/tests.yaml
@@ -213,6 +213,7 @@ jobs:
--target linux-x64-bridge-${BUILD_VARIANT} \
--target linux-x64-lit-icd-${BUILD_VARIANT} \
--target linux-x64-microwave-oven-${BUILD_VARIANT} \
+ --target linux-x64-rvc-${BUILD_VARIANT} \
build \
--copy-artifacts-to objdir-clone \
"
@@ -234,6 +235,7 @@ jobs:
--bridge-app ./out/linux-x64-bridge-${BUILD_VARIANT}/chip-bridge-app \
--lit-icd-app ./out/linux-x64-lit-icd-${BUILD_VARIANT}/lit-icd-app \
--microwave-oven-app ./out/linux-x64-microwave-oven-${BUILD_VARIANT}/chip-microwave-oven-app \
+ --rvc-app ./out/linux-x64-rvc-${BUILD_VARIANT}/chip-rvc-app \
"
- name: Run purposeful failure tests using the python parser sending commands to chip-tool
@@ -274,6 +276,7 @@ jobs:
--bridge-app ./out/linux-x64-bridge-${BUILD_VARIANT}/chip-bridge-app \
--lit-icd-app ./out/linux-x64-lit-icd-${BUILD_VARIANT}/lit-icd-app \
--microwave-oven-app ./out/linux-x64-microwave-oven-${BUILD_VARIANT}/chip-microwave-oven-app \
+ --rvc-app ./out/linux-x64-rvc-${BUILD_VARIANT}/chip-rvc-app \
"
- name: Run Tests using chip-repl (including slow)
if: github.event_name == 'push'
@@ -292,6 +295,7 @@ jobs:
--bridge-app ./out/linux-x64-bridge-${BUILD_VARIANT}/chip-bridge-app \
--lit-icd-app ./out/linux-x64-lit-icd-${BUILD_VARIANT}/lit-icd-app \
--microwave-oven-app ./out/linux-x64-microwave-oven-${BUILD_VARIANT}/chip-microwave-oven-app \
+ --rvc-app ./out/linux-x64-rvc-${BUILD_VARIANT}/chip-rvc-app \
"
- name: Uploading core files
uses: actions/upload-artifact@v4
@@ -359,6 +363,7 @@ jobs:
--target darwin-x64-bridge-${BUILD_VARIANT} \
--target darwin-x64-lit-icd-${BUILD_VARIANT} \
--target darwin-x64-microwave-oven-${BUILD_VARIANT} \
+ --target darwin-x64-rvc-${BUILD_VARIANT} \
build \
--copy-artifacts-to objdir-clone \
"
@@ -381,6 +386,7 @@ jobs:
--bridge-app ./out/darwin-x64-bridge-${BUILD_VARIANT}/chip-bridge-app \
--lit-icd-app ./out/darwin-x64-lit-icd-${BUILD_VARIANT}/lit-icd-app \
--microwave-oven-app ./out/darwin-x64-microwave-oven-${BUILD_VARIANT}/chip-microwave-oven-app \
+ --rvc-app ./out/darwin-x64-rvc-${BUILD_VARIANT}/chip-rvc-app \
"
- name: Run purposeful failure tests using the python parser sending commands to chip-tool
@@ -460,6 +466,7 @@ jobs:
--target linux-x64-lit-icd-ipv6only-no-ble-no-wifi-tsan-clang-test \
--target linux-x64-energy-management-ipv6only-no-ble-no-wifi-tsan-clang-test \
--target linux-x64-microwave-oven-ipv6only-no-ble-no-wifi-tsan-clang-test \
+ --target linux-x64-rvc-ipv6only-no-ble-no-wifi-tsan-clang-test \
--target linux-x64-python-bindings \
build \
--copy-artifacts-to objdir-clone \
@@ -502,9 +509,8 @@ jobs:
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_IDM_1_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json --enable-key 000102030405060708090a0b0c0d0e0f" --script "src/python_testing/TC_IDM_1_4.py" --script-args "--hex-arg PIXIT.DGGEN.TEST_EVENT_TRIGGER_KEY:000102030405060708090a0b0c0d0e0f --storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_IDM_4_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
+ scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_PWRTL_2_1.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_RR_1_1.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
- scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_RVCCLEANM_1_2.py" --script-args "--int-arg PIXIT_ENDPOINT:1 --storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
- scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_RVCRUNM_1_2.py" --script-args "--int-arg PIXIT_ENDPOINT:1 --storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_SC_3_6.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_TIMESYNC_2_1.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS src/app/tests/suites/certification/ci-pics-values --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_TIMESYNC_2_10.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS src/app/tests/suites/certification/ci-pics-values --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
@@ -542,6 +548,15 @@ jobs:
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-microwave-oven-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-microwave-oven-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_file json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_MWOCTRL_2_3.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-microwave-oven-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-microwave-oven-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_file json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_MWOCTRL_2_4.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-microwave-oven-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-microwave-oven-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_file json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_MWOM_1_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
+ scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-rvc-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-rvc-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_file json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_RVCRUNM_1_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS examples/rvc-app/rvc-common/pics/rvc-app-pics-values --endpoint 1 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
+ scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-rvc-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-rvc-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_file json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_RVCRUNM_2_1.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS examples/rvc-app/rvc-common/pics/rvc-app-pics-values --endpoint 1 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto --int-arg PIXIT.RVCRUNM.MODE_CHANGE_OK:0 PIXIT.RVCRUNM.MODE_CHANGE_FAIL:2"'
+ scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-rvc-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-rvc-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_file json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_RVCRUNM_2_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS examples/rvc-app/rvc-common/pics/rvc-app-pics-values --endpoint 1 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto --int-arg PIXIT.RVCRUNM.MODE_A:1 PIXIT.RVCRUNM.MODE_B:2"'
+ scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-rvc-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-rvc-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_file json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_RVCCLEANM_1_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS examples/rvc-app/rvc-common/pics/rvc-app-pics-values --endpoint 1 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
+ scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-rvc-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-rvc-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_file json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_RVCCLEANM_2_1.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS examples/rvc-app/rvc-common/pics/rvc-app-pics-values --endpoint 1 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto --int-arg PIXIT.RVCCLEANM.MODE_CHANGE_FAIL:1 PIXIT.RVCCLEANM.MODE_CHANGE_OK:2"'
+ scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-rvc-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-rvc-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_file json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_RVCCLEANM_2_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS examples/rvc-app/rvc-common/pics/rvc-app-pics-values --endpoint 1 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
+ scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-rvc-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-rvc-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_file json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_RVCOPSTATE_2_1.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS examples/rvc-app/rvc-common/pics/rvc-app-pics-values --endpoint 1 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
+ scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-rvc-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-rvc-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_file json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_RVCOPSTATE_2_3.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS examples/rvc-app/rvc-common/pics/rvc-app-pics-values --endpoint 1 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
+ scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-rvc-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-rvc-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace_file json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_RVCOPSTATE_2_4.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS examples/rvc-app/rvc-common/pics/rvc-app-pics-values --endpoint 1 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
- name: Uploading core files
uses: actions/upload-artifact@v4
if: ${{ failure() && !env.ACT }}
diff --git a/.gitmodules b/.gitmodules
index 61e34cfafd6e94..06fb7f0e347951 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -239,7 +239,7 @@
[submodule "third_party/silabs/gecko_sdk"]
path = third_party/silabs/gecko_sdk
url = https://github.com/SiliconLabs/gecko_sdk.git
- branch = v4.4.0
+ branch = v4.4.1
platforms = silabs
[submodule "third_party/silabs/wiseconnect-wifi-bt-sdk"]
path = third_party/silabs/wiseconnect-wifi-bt-sdk
@@ -249,7 +249,7 @@
[submodule "third_party/silabs/wifi_sdk"]
path = third_party/silabs/wifi_sdk
url = https://github.com/SiliconLabs/wiseconnect.git
- branch = v3.1.1
+ branch = v3.1.3
platforms = silabs
[submodule "editline"]
path = third_party/editline/repo
diff --git a/BUILD.gn b/BUILD.gn
index 838ea743f348c8..a96f2a2e67265a 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -363,6 +363,10 @@ if (current_toolchain != "${dir_pw_toolchain}/default:default") {
enable_linux_lit_icd_app_build =
enable_default_builds && (host_os == "linux" || host_os == "mac")
+ # Build the Linux RVC app example.
+ enable_linux_rvc_app_build =
+ enable_default_builds && (host_os == "linux" || host_os == "mac")
+
# Build the cc13x2x7_26x2x7 lock app example.
enable_cc13x2x7_26x2x7_lock_app_build = enable_ti_simplelink_builds
@@ -744,6 +748,14 @@ if (current_toolchain != "${dir_pw_toolchain}/default:default") {
extra_build_deps += [ ":genio_shell_app" ]
}
+ if (enable_linux_rvc_app_build) {
+ group("linux_rvc_app") {
+ deps = [ "${chip_root}/examples/rvc-app/linux(${standalone_toolchain})" ]
+ }
+
+ extra_build_deps += [ ":linux_rvc_app" ]
+ }
+
group("default") {
deps = extra_build_deps + builds
}
diff --git a/data_model/README.md b/data_model/README.md
index 36f38cae0ff1f8..a26b1c4ff65558 100644
--- a/data_model/README.md
+++ b/data_model/README.md
@@ -17,7 +17,7 @@ update the spec XML files, however this is not done automatically.
You will require access to the following tools locally:
- `scraper`. A binary copy generally available
- [here](https://github.com/csa-data-model/projects/tree/main/DM-Editor/bin/1.2.0/scrape)
+ [here](https://github.com/csa-data-model/projects/tree/main/DM-Editor/bin/scrape)
- Specification repository checkout from
https://github.com/CHIP-Specifications/connectedhomeip-spec
diff --git a/data_model/clusters/ACL-Cluster.xml b/data_model/clusters/ACL-Cluster.xml
index 9ef2f500e96e01..b965eb84234e0d 100644
--- a/data_model/clusters/ACL-Cluster.xml
+++ b/data_model/clusters/ACL-Cluster.xml
@@ -55,10 +55,13 @@ Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
-->
-
+
+
+
+
@@ -112,25 +115,27 @@ Davis, CA 95616, USA
-
+
+
-
+
-
+
+
-
+
-
+
-
+
@@ -150,12 +155,14 @@ Davis, CA 95616, USA
-
+
+
-
+
+
diff --git a/data_model/clusters/AccountLogin.xml b/data_model/clusters/AccountLogin.xml
index 91f675eaba693b..db87d05dc74902 100644
--- a/data_model/clusters/AccountLogin.xml
+++ b/data_model/clusters/AccountLogin.xml
@@ -54,14 +54,20 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
-
+
+
+
+
+
-
+
@@ -70,14 +76,14 @@ Davis, CA 95616, USA
-
+
-
+
@@ -86,12 +92,27 @@ Davis, CA 95616, USA
-
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/AdminCommissioningCluster.xml b/data_model/clusters/AdminCommissioningCluster.xml
index b94b25ec5520c2..eea41bc65b6e2c 100644
--- a/data_model/clusters/AdminCommissioningCluster.xml
+++ b/data_model/clusters/AdminCommissioningCluster.xml
@@ -1,7 +1,5 @@
+
+
+
diff --git a/data_model/clusters/AlarmBase.xml b/data_model/clusters/AlarmBase.xml
index 9ba73c14ab6e63..f4ffc6344a8b90 100644
--- a/data_model/clusters/AlarmBase.xml
+++ b/data_model/clusters/AlarmBase.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -91,7 +96,7 @@ Davis, CA 95616, USA
-
+
@@ -100,7 +105,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/ApplicationBasic.xml b/data_model/clusters/ApplicationBasic.xml
index 086839a2338cfc..fa197a8d1e5cca 100644
--- a/data_model/clusters/ApplicationBasic.xml
+++ b/data_model/clusters/ApplicationBasic.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
diff --git a/data_model/clusters/ApplicationLauncher.xml b/data_model/clusters/ApplicationLauncher.xml
index 5d716981a55d38..6b84436e73d42d 100644
--- a/data_model/clusters/ApplicationLauncher.xml
+++ b/data_model/clusters/ApplicationLauncher.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -111,7 +116,7 @@ Davis, CA 95616, USA
-
+
@@ -124,7 +129,7 @@ Davis, CA 95616, USA
-
+
@@ -134,7 +139,7 @@ Davis, CA 95616, USA
-
+
@@ -145,7 +150,6 @@ Davis, CA 95616, USA
-
diff --git a/data_model/clusters/AudioOutput.xml b/data_model/clusters/AudioOutput.xml
index 176e75b16c19c9..468ba2750152a6 100644
--- a/data_model/clusters/AudioOutput.xml
+++ b/data_model/clusters/AudioOutput.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -111,14 +116,14 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/clusters/BallastConfiguration.xml b/data_model/clusters/BallastConfiguration.xml
index 416b8cd7014beb..f25bef22cb4b6c 100644
--- a/data_model/clusters/BallastConfiguration.xml
+++ b/data_model/clusters/BallastConfiguration.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
@@ -62,6 +64,9 @@ Davis, CA 95616, USA
+
+
+
diff --git a/data_model/clusters/BasicInformationCluster.xml b/data_model/clusters/BasicInformationCluster.xml
index 87fa765f65b2f5..82b9283b0d21d6 100644
--- a/data_model/clusters/BasicInformationCluster.xml
+++ b/data_model/clusters/BasicInformationCluster.xml
@@ -59,8 +59,11 @@ Davis, CA 95616, USA
-
+
+
+
+
@@ -175,50 +178,50 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -226,41 +229,41 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -271,11 +274,11 @@ Davis, CA 95616, USA
-
+
-
+
@@ -293,6 +296,12 @@ Davis, CA 95616, USA
+
+
+
+
+
+
diff --git a/data_model/clusters/Binding-Cluster.xml b/data_model/clusters/Binding-Cluster.xml
index 95f68f1d6ff995..eca291a7d895ff 100644
--- a/data_model/clusters/Binding-Cluster.xml
+++ b/data_model/clusters/Binding-Cluster.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
diff --git a/data_model/clusters/BooleanState.xml b/data_model/clusters/BooleanState.xml
index 5b298075fbaefc..9205310c58f2be 100644
--- a/data_model/clusters/BooleanState.xml
+++ b/data_model/clusters/BooleanState.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
diff --git a/data_model/clusters/BooleanStateConfiguration.xml b/data_model/clusters/BooleanStateConfiguration.xml
index 160cb7fadb7a93..dc17f93a7295f0 100644
--- a/data_model/clusters/BooleanStateConfiguration.xml
+++ b/data_model/clusters/BooleanStateConfiguration.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -164,7 +169,7 @@ Davis, CA 95616, USA
-
+
@@ -173,7 +178,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/Channel.xml b/data_model/clusters/Channel.xml
index 9ace62ca720a53..1809f5262e7166 100644
--- a/data_model/clusters/Channel.xml
+++ b/data_model/clusters/Channel.xml
@@ -54,11 +54,17 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
-
+
+
+
+
+
@@ -67,8 +73,28 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
-
@@ -85,6 +111,17 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
@@ -101,6 +138,22 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -117,6 +170,132 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -142,7 +321,7 @@ Davis, CA 95616, USA
-
+
@@ -155,7 +334,6 @@ Davis, CA 95616, USA
-
@@ -170,7 +348,7 @@ Davis, CA 95616, USA
-
+
@@ -180,12 +358,108 @@ Davis, CA 95616, USA
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ColorControl.xml b/data_model/clusters/ColorControl.xml
index c0b0655261b10b..b913009f852761 100644
--- a/data_model/clusters/ColorControl.xml
+++ b/data_model/clusters/ColorControl.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
@@ -64,6 +66,9 @@ Davis, CA 95616, USA
+
+
+
@@ -123,19 +128,19 @@ Davis, CA 95616, USA
- -
+
-
- -
+
-
- -
+
-
- -
+
-
- -
+
-
@@ -158,13 +163,13 @@ Davis, CA 95616, USA
- -
+
-
- -
+
-
- -
+
-
@@ -356,16 +361,16 @@ Davis, CA 95616, USA
- -
+
-
- -
+
-
- -
+
-
- -
+
-
@@ -434,7 +439,7 @@ Davis, CA 95616, USA
-
+
@@ -449,7 +454,7 @@ Davis, CA 95616, USA
-
+
@@ -460,16 +465,16 @@ Davis, CA 95616, USA
- -
+
-
- -
+
-
- -
+
-
- -
+
-
@@ -489,23 +494,23 @@ Davis, CA 95616, USA
-
+
- -
+
-
- -
+
-
- -
+
-
- -
+
-
@@ -524,23 +529,23 @@ Davis, CA 95616, USA
-
+
- -
+
-
- -
+
-
- -
+
-
- -
+
-
@@ -562,7 +567,7 @@ Davis, CA 95616, USA
-
+
@@ -584,23 +589,23 @@ Davis, CA 95616, USA
-
+
- -
+
-
- -
+
-
- -
+
-
- -
+
-
@@ -619,23 +624,23 @@ Davis, CA 95616, USA
-
+
- -
+
-
- -
+
-
- -
+
-
- -
+
-
@@ -657,7 +662,7 @@ Davis, CA 95616, USA
-
+
@@ -683,7 +688,7 @@ Davis, CA 95616, USA
-
+
@@ -709,7 +714,7 @@ Davis, CA 95616, USA
-
+
@@ -729,7 +734,7 @@ Davis, CA 95616, USA
-
+
@@ -753,7 +758,7 @@ Davis, CA 95616, USA
-
+
@@ -775,7 +780,7 @@ Davis, CA 95616, USA
-
+
@@ -800,7 +805,7 @@ Davis, CA 95616, USA
-
+
@@ -821,7 +826,7 @@ Davis, CA 95616, USA
-
+
@@ -846,7 +851,7 @@ Davis, CA 95616, USA
-
+
@@ -871,7 +876,7 @@ Davis, CA 95616, USA
-
+
@@ -899,13 +904,13 @@ Davis, CA 95616, USA
- -
+
-
- -
+
-
- -
+
-
@@ -914,10 +919,10 @@ Davis, CA 95616, USA
- -
+
-
- -
+
-
@@ -939,7 +944,7 @@ Davis, CA 95616, USA
-
+
@@ -957,7 +962,7 @@ Davis, CA 95616, USA
-
+
@@ -986,7 +991,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/ContentAppObserver.xml b/data_model/clusters/ContentAppObserver.xml
index b426daa5ec3379..184cce14924cda 100644
--- a/data_model/clusters/ContentAppObserver.xml
+++ b/data_model/clusters/ContentAppObserver.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -71,7 +76,7 @@ Davis, CA 95616, USA
-
+
@@ -84,7 +89,6 @@ Davis, CA 95616, USA
-
diff --git a/data_model/clusters/ContentControl.xml b/data_model/clusters/ContentControl.xml
index b51bdff9397448..14996a7c28011a 100644
--- a/data_model/clusters/ContentControl.xml
+++ b/data_model/clusters/ContentControl.xml
@@ -59,6 +59,9 @@ Davis, CA 95616, USA
+
+
+
@@ -255,7 +258,7 @@ Davis, CA 95616, USA
-
+
@@ -269,14 +272,13 @@ Davis, CA 95616, USA
-
+
-
@@ -285,15 +287,15 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -307,7 +309,7 @@ Davis, CA 95616, USA
-
+
@@ -317,19 +319,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -339,7 +341,7 @@ Davis, CA 95616, USA
-
+
@@ -349,7 +351,7 @@ Davis, CA 95616, USA
-
+
@@ -359,7 +361,7 @@ Davis, CA 95616, USA
-
+
@@ -369,7 +371,7 @@ Davis, CA 95616, USA
-
+
@@ -379,7 +381,7 @@ Davis, CA 95616, USA
-
+
@@ -389,7 +391,7 @@ Davis, CA 95616, USA
-
+
@@ -398,7 +400,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/ContentLauncher.xml b/data_model/clusters/ContentLauncher.xml
index 2c310c6f2ccb3d..b8f80de2e51ea7 100644
--- a/data_model/clusters/ContentLauncher.xml
+++ b/data_model/clusters/ContentLauncher.xml
@@ -54,11 +54,17 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
-
+
+
+
+
+
@@ -67,6 +73,15 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
@@ -119,12 +134,21 @@ Davis, CA 95616, USA
-
- -
+
-
-
+ -
+
+
+ -
+
+
+ -
+
+
-
@@ -136,6 +160,16 @@ Davis, CA 95616, USA
-
+ -
+
+
+
+
+ -
+
+
+
+
@@ -206,6 +240,27 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -220,6 +275,23 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -242,7 +314,7 @@ Davis, CA 95616, USA
-
+
@@ -258,8 +330,15 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
-
+
@@ -273,9 +352,11 @@ Davis, CA 95616, USA
+
+
+
-
diff --git a/data_model/clusters/DemandResponseLoadControl.xml b/data_model/clusters/DemandResponseLoadControl.xml
index a5322bfb4f7206..206201b347612c 100644
--- a/data_model/clusters/DemandResponseLoadControl.xml
+++ b/data_model/clusters/DemandResponseLoadControl.xml
@@ -55,13 +55,16 @@ Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
-->
-
+
+
+
+
@@ -192,6 +195,59 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -222,6 +278,41 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -361,14 +452,14 @@ Davis, CA 95616, USA
-
+
-
+
@@ -376,14 +467,14 @@ Davis, CA 95616, USA
-
+
-
+
@@ -394,7 +485,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/Descriptor-Cluster.xml b/data_model/clusters/Descriptor-Cluster.xml
index 9944d8a3f6ea4c..1b17fb4fdfdaea 100644
--- a/data_model/clusters/Descriptor-Cluster.xml
+++ b/data_model/clusters/Descriptor-Cluster.xml
@@ -54,12 +54,17 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
diff --git a/data_model/clusters/DeviceEnergyManagement.xml b/data_model/clusters/DeviceEnergyManagement.xml
index 21f74a737d52cb..e493c5b332182e 100644
--- a/data_model/clusters/DeviceEnergyManagement.xml
+++ b/data_model/clusters/DeviceEnergyManagement.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
@@ -61,6 +63,9 @@ Davis, CA 95616, USA
+
+
+
+
@@ -487,13 +492,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -507,7 +512,7 @@ Davis, CA 95616, USA
-
+
@@ -521,13 +526,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -545,7 +550,7 @@ Davis, CA 95616, USA
-
+
@@ -560,7 +565,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/DiagnosticLogsCluster.xml b/data_model/clusters/DiagnosticLogsCluster.xml
index 14f995ca1855a6..5b67564b18f298 100644
--- a/data_model/clusters/DiagnosticLogsCluster.xml
+++ b/data_model/clusters/DiagnosticLogsCluster.xml
@@ -1,7 +1,5 @@
-
+
+
+
+
@@ -138,11 +139,11 @@ Davis, CA 95616, USA
-
+
-
+
@@ -221,7 +222,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/DishwasherAlarm.xml b/data_model/clusters/DishwasherAlarm.xml
index 7fda78ad163116..b3b67e2bffb500 100644
--- a/data_model/clusters/DishwasherAlarm.xml
+++ b/data_model/clusters/DishwasherAlarm.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance +
508 Second Street, Suite 206 +
Davis, CA 95616, USA
+
+:xrefstyle: short
-->
+
+
+
diff --git a/data_model/clusters/DoorLock.xml b/data_model/clusters/DoorLock.xml
index 4f84afca85ff1e..6284b973eb63e1 100644
--- a/data_model/clusters/DoorLock.xml
+++ b/data_model/clusters/DoorLock.xml
@@ -54,8 +54,10 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
-
+
@@ -64,7 +66,11 @@ Davis, CA 95616, USA
+
+
+
+
@@ -98,14 +104,19 @@ Davis, CA 95616, USA
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -119,6 +130,14 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
@@ -201,6 +220,23 @@ Davis, CA 95616, USA
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
-
@@ -334,6 +370,21 @@ Davis, CA 95616, USA
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
-
@@ -482,6 +533,11 @@ Davis, CA 95616, USA
+ -
+
+
+
+
-
@@ -1053,9 +1109,84 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -1067,7 +1198,7 @@ Davis, CA 95616, USA
-
+
@@ -1079,11 +1210,11 @@ Davis, CA 95616, USA
-
+
-
+
@@ -1098,7 +1229,7 @@ Davis, CA 95616, USA
-
+
@@ -1109,7 +1240,6 @@ Davis, CA 95616, USA
-
@@ -1138,7 +1268,7 @@ Davis, CA 95616, USA
-
+
@@ -1165,7 +1295,7 @@ Davis, CA 95616, USA
-
+
@@ -1181,7 +1311,6 @@ Davis, CA 95616, USA
-
@@ -1209,7 +1338,7 @@ Davis, CA 95616, USA
-
+
@@ -1225,7 +1354,7 @@ Davis, CA 95616, USA
-
+
@@ -1236,7 +1365,7 @@ Davis, CA 95616, USA
-
+
@@ -1259,7 +1388,7 @@ Davis, CA 95616, USA
-
+
@@ -1279,7 +1408,6 @@ Davis, CA 95616, USA
-
@@ -1293,7 +1421,7 @@ Davis, CA 95616, USA
-
+
@@ -1326,7 +1454,7 @@ Davis, CA 95616, USA
-
+
@@ -1341,7 +1469,6 @@ Davis, CA 95616, USA
-
@@ -1377,7 +1504,7 @@ Davis, CA 95616, USA
-
+
@@ -1392,7 +1519,7 @@ Davis, CA 95616, USA
-
+
@@ -1412,7 +1539,7 @@ Davis, CA 95616, USA
-
+
@@ -1427,7 +1554,6 @@ Davis, CA 95616, USA
-
@@ -1450,7 +1576,7 @@ Davis, CA 95616, USA
-
+
@@ -1465,7 +1591,7 @@ Davis, CA 95616, USA
-
+
@@ -1484,7 +1610,7 @@ Davis, CA 95616, USA
-
+
@@ -1495,7 +1621,6 @@ Davis, CA 95616, USA
-
@@ -1520,7 +1645,7 @@ Davis, CA 95616, USA
-
+
@@ -1531,7 +1656,7 @@ Davis, CA 95616, USA
-
+
@@ -1553,7 +1678,7 @@ Davis, CA 95616, USA
-
+
@@ -1573,7 +1698,6 @@ Davis, CA 95616, USA
-
@@ -1587,7 +1711,7 @@ Davis, CA 95616, USA
-
+
@@ -1615,7 +1739,7 @@ Davis, CA 95616, USA
-
+
@@ -1631,7 +1755,6 @@ Davis, CA 95616, USA
-
@@ -1659,7 +1782,7 @@ Davis, CA 95616, USA
-
+
@@ -1675,7 +1798,7 @@ Davis, CA 95616, USA
-
+
@@ -1686,7 +1809,7 @@ Davis, CA 95616, USA
-
+
@@ -1731,7 +1854,7 @@ Davis, CA 95616, USA
-
+
@@ -1742,7 +1865,6 @@ Davis, CA 95616, USA
-
@@ -1792,7 +1914,7 @@ Davis, CA 95616, USA
-
+
@@ -1844,7 +1966,7 @@ Davis, CA 95616, USA
-
+
@@ -1885,7 +2007,6 @@ Davis, CA 95616, USA
-
@@ -1904,7 +2025,7 @@ Davis, CA 95616, USA
-
+
@@ -1914,7 +2035,6 @@ Davis, CA 95616, USA
-
@@ -1939,8 +2059,15 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
-
+
@@ -1951,7 +2078,7 @@ Davis, CA 95616, USA
-
+
@@ -1965,6 +2092,36 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data_model/clusters/EVSE-Attributes.xml b/data_model/clusters/EVSE-Attributes.xml
deleted file mode 100644
index 2d492a27c4c0a1..00000000000000
--- a/data_model/clusters/EVSE-Attributes.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-Classification.xml b/data_model/clusters/EVSE-Classification.xml
deleted file mode 100644
index 22df357be3e9d0..00000000000000
--- a/data_model/clusters/EVSE-Classification.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-ClusterID.xml b/data_model/clusters/EVSE-ClusterID.xml
deleted file mode 100644
index 6f84afeb8d04bc..00000000000000
--- a/data_model/clusters/EVSE-ClusterID.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-Commands.xml b/data_model/clusters/EVSE-Commands.xml
deleted file mode 100644
index 030565e20f8f96..00000000000000
--- a/data_model/clusters/EVSE-Commands.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-DataTypes.xml b/data_model/clusters/EVSE-DataTypes.xml
deleted file mode 100644
index 790d66143c7025..00000000000000
--- a/data_model/clusters/EVSE-DataTypes.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-Definitions.xml b/data_model/clusters/EVSE-Definitions.xml
deleted file mode 100644
index 7ff6135a3d2976..00000000000000
--- a/data_model/clusters/EVSE-Definitions.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-Dependencies.xml b/data_model/clusters/EVSE-Dependencies.xml
deleted file mode 100644
index a87cb67a4623ae..00000000000000
--- a/data_model/clusters/EVSE-Dependencies.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-Events.xml b/data_model/clusters/EVSE-Events.xml
deleted file mode 100644
index 51401775a6fe59..00000000000000
--- a/data_model/clusters/EVSE-Events.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-Features.xml b/data_model/clusters/EVSE-Features.xml
deleted file mode 100644
index a8b48a53b401e9..00000000000000
--- a/data_model/clusters/EVSE-Features.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/data_model/clusters/EVSE-RevisionHistory.xml b/data_model/clusters/EVSE-RevisionHistory.xml
deleted file mode 100644
index 89ca30f749e5e1..00000000000000
--- a/data_model/clusters/EVSE-RevisionHistory.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/data_model/clusters/ElectricalEnergyMeasurement.xml b/data_model/clusters/ElectricalEnergyMeasurement.xml
index c6bf8e73863c41..98020764397116 100644
--- a/data_model/clusters/ElectricalEnergyMeasurement.xml
+++ b/data_model/clusters/ElectricalEnergyMeasurement.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -74,7 +79,59 @@ Davis, CA 95616, USA
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data_model/clusters/ElectricalPowerMeasurement.xml b/data_model/clusters/ElectricalPowerMeasurement.xml
index aa5baeaf368cbb..c695e8db031790 100644
--- a/data_model/clusters/ElectricalPowerMeasurement.xml
+++ b/data_model/clusters/ElectricalPowerMeasurement.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -95,6 +100,68 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data_model/clusters/EnergyCalendar.xml b/data_model/clusters/EnergyCalendar.xml
index a21845d92c47c4..8d3f1b343bb4a7 100644
--- a/data_model/clusters/EnergyCalendar.xml
+++ b/data_model/clusters/EnergyCalendar.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: short
-->
@@ -61,6 +63,9 @@ Davis, CA 95616, USA
+
+
+
diff --git a/data_model/clusters/EnergyEVSE.xml b/data_model/clusters/EnergyEVSE.xml
index f59d41807d43e6..fa15692e78896d 100644
--- a/data_model/clusters/EnergyEVSE.xml
+++ b/data_model/clusters/EnergyEVSE.xml
@@ -54,12 +54,17 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -395,7 +400,6 @@ Davis, CA 95616, USA
-
@@ -405,11 +409,11 @@ Davis, CA 95616, USA
-
+
-
+
@@ -425,7 +429,7 @@ Davis, CA 95616, USA
-
+
@@ -439,11 +443,11 @@ Davis, CA 95616, USA
-
+
-
+
@@ -454,13 +458,13 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/clusters/EnergyPreference.xml b/data_model/clusters/EnergyPreference.xml
index 7156be8eafe025..c3676520ed6d01 100644
--- a/data_model/clusters/EnergyPreference.xml
+++ b/data_model/clusters/EnergyPreference.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
diff --git a/data_model/clusters/EnergyPrice.xml b/data_model/clusters/EnergyPrice.xml
index 23072a6a99ead5..1683fe1bbc13cf 100644
--- a/data_model/clusters/EnergyPrice.xml
+++ b/data_model/clusters/EnergyPrice.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: short
-->
@@ -62,6 +64,9 @@ Davis, CA 95616, USA
+
+
+
@@ -173,7 +178,7 @@ Davis, CA 95616, USA
-
+
@@ -188,7 +193,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/FanControl.xml b/data_model/clusters/FanControl.xml
index acf1d59e54d91e..756a7bd27466b3 100644
--- a/data_model/clusters/FanControl.xml
+++ b/data_model/clusters/FanControl.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: short
-->
@@ -62,6 +64,9 @@ Davis, CA 95616, USA
+
+
+
@@ -277,7 +282,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/FlowMeasurement.xml b/data_model/clusters/FlowMeasurement.xml
index 66ad022c2c64ef..29f9d9d7ae58f9 100644
--- a/data_model/clusters/FlowMeasurement.xml
+++ b/data_model/clusters/FlowMeasurement.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
@@ -61,6 +63,9 @@ Davis, CA 95616, USA
+
+
+
diff --git a/data_model/clusters/GeneralCommissioningCluster.xml b/data_model/clusters/GeneralCommissioningCluster.xml
index a25cdfc6ac934e..635a6635990654 100644
--- a/data_model/clusters/GeneralCommissioningCluster.xml
+++ b/data_model/clusters/GeneralCommissioningCluster.xml
@@ -1,7 +1,5 @@
-
+
+
+
+
@@ -86,21 +89,22 @@ Davis, CA 95616, USA
-
+
-
+
+
-
+
-
+
-
+
-
+
@@ -117,35 +121,35 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -160,13 +164,15 @@ Davis, CA 95616, USA
-
+
+
-
+
+
@@ -184,14 +190,14 @@ Davis, CA 95616, USA
-
+
-
+
@@ -199,20 +205,19 @@ Davis, CA 95616, USA
-
-
+
-
+
@@ -220,7 +225,6 @@ Davis, CA 95616, USA
-
diff --git a/data_model/clusters/Groups.xml b/data_model/clusters/Groups.xml
index 175c9caf26a435..72902e878cbe9f 100644
--- a/data_model/clusters/Groups.xml
+++ b/data_model/clusters/Groups.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
@@ -62,6 +64,9 @@ Davis, CA 95616, USA
+
+
+
@@ -84,7 +89,7 @@ Davis, CA 95616, USA
-
+
@@ -97,7 +102,6 @@ Davis, CA 95616, USA
-
@@ -108,7 +112,7 @@ Davis, CA 95616, USA
-
+
@@ -117,7 +121,6 @@ Davis, CA 95616, USA
-
@@ -132,7 +135,7 @@ Davis, CA 95616, USA
-
+
@@ -143,7 +146,6 @@ Davis, CA 95616, USA
-
@@ -156,7 +158,7 @@ Davis, CA 95616, USA
-
+
@@ -165,7 +167,6 @@ Davis, CA 95616, USA
-
@@ -176,11 +177,11 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/clusters/ICDManagement.xml b/data_model/clusters/ICDManagement.xml
index 3cc6c9bfab4416..2a770a4f97f2b4 100644
--- a/data_model/clusters/ICDManagement.xml
+++ b/data_model/clusters/ICDManagement.xml
@@ -54,21 +54,41 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+// Update Name
-->
-
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
@@ -133,9 +153,28 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -156,7 +195,6 @@ Davis, CA 95616, USA
-
@@ -164,7 +202,7 @@ Davis, CA 95616, USA
-
+
@@ -177,7 +215,7 @@ Davis, CA 95616, USA
-
+
@@ -190,7 +228,6 @@ Davis, CA 95616, USA
-
diff --git a/data_model/clusters/Identify.xml b/data_model/clusters/Identify.xml
index 379e684e51297d..1cdc33aa0df727 100644
--- a/data_model/clusters/Identify.xml
+++ b/data_model/clusters/Identify.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
@@ -62,6 +64,9 @@ Davis, CA 95616, USA
+
+
+
@@ -127,14 +132,14 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/clusters/IlluminanceMeasurement.xml b/data_model/clusters/IlluminanceMeasurement.xml
index c9be9fa6879293..c39daa0e6bdc4d 100644
--- a/data_model/clusters/IlluminanceMeasurement.xml
+++ b/data_model/clusters/IlluminanceMeasurement.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
@@ -61,6 +63,9 @@ Davis, CA 95616, USA
+
+
+
diff --git a/data_model/clusters/KeypadInput.xml b/data_model/clusters/KeypadInput.xml
index f0459e6b1bff1a..4cfb509b06d0be 100644
--- a/data_model/clusters/KeypadInput.xml
+++ b/data_model/clusters/KeypadInput.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -345,7 +350,7 @@ Davis, CA 95616, USA
-
+
@@ -353,7 +358,6 @@ Davis, CA 95616, USA
-
diff --git a/data_model/clusters/Label-Cluster-FixedLabel.xml b/data_model/clusters/Label-Cluster-FixedLabelCluster.xml
similarity index 96%
rename from data_model/clusters/Label-Cluster-FixedLabel.xml
rename to data_model/clusters/Label-Cluster-FixedLabelCluster.xml
index 558664a5d69f72..e73bfc274a9da4 100644
--- a/data_model/clusters/Label-Cluster-FixedLabel.xml
+++ b/data_model/clusters/Label-Cluster-FixedLabelCluster.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
diff --git a/data_model/clusters/Label-Cluster-Label.xml b/data_model/clusters/Label-Cluster-LabelCluster.xml
similarity index 96%
rename from data_model/clusters/Label-Cluster-Label.xml
rename to data_model/clusters/Label-Cluster-LabelCluster.xml
index ee64da775b05cd..f107a0a7b3f12b 100644
--- a/data_model/clusters/Label-Cluster-Label.xml
+++ b/data_model/clusters/Label-Cluster-LabelCluster.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
diff --git a/data_model/clusters/Label-Cluster-UserLabel.xml b/data_model/clusters/Label-Cluster-UserLabelCluster.xml
similarity index 96%
rename from data_model/clusters/Label-Cluster-UserLabel.xml
rename to data_model/clusters/Label-Cluster-UserLabelCluster.xml
index bca4b1453f22de..f7e809ab785c00 100644
--- a/data_model/clusters/Label-Cluster-UserLabel.xml
+++ b/data_model/clusters/Label-Cluster-UserLabelCluster.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
diff --git a/data_model/clusters/LaundryDryerControls.xml b/data_model/clusters/LaundryDryerControls.xml
index 461f08666093b8..a3f7b911fc9e9c 100644
--- a/data_model/clusters/LaundryDryerControls.xml
+++ b/data_model/clusters/LaundryDryerControls.xml
@@ -59,6 +59,9 @@ Davis, CA 95616, USA
+
+
+
diff --git a/data_model/clusters/LaundryWasherControls.xml b/data_model/clusters/LaundryWasherControls.xml
index 5a9d108ccc1b01..16879842721473 100644
--- a/data_model/clusters/LaundryWasherControls.xml
+++ b/data_model/clusters/LaundryWasherControls.xml
@@ -59,6 +59,9 @@ Davis, CA 95616, USA
+
+
+
diff --git a/data_model/clusters/LevelControl.xml b/data_model/clusters/LevelControl.xml
index 8a348a2dc05cbd..6b2b3cace52ec3 100644
--- a/data_model/clusters/LevelControl.xml
+++ b/data_model/clusters/LevelControl.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
@@ -65,6 +67,7 @@ Davis, CA 95616, USA
+
@@ -210,7 +213,7 @@ Davis, CA 95616, USA
-
+
@@ -230,7 +233,7 @@ Davis, CA 95616, USA
-
+
@@ -250,7 +253,7 @@ Davis, CA 95616, USA
-
+
@@ -273,7 +276,7 @@ Davis, CA 95616, USA
-
+
@@ -285,23 +288,23 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
diff --git a/data_model/clusters/LocalizationConfiguration.xml b/data_model/clusters/LocalizationConfiguration.xml
index b264698b6d5393..f3c2d5b2d7662b 100644
--- a/data_model/clusters/LocalizationConfiguration.xml
+++ b/data_model/clusters/LocalizationConfiguration.xml
@@ -59,18 +59,25 @@ Davis, CA 95616, USA
+
+
+
-
+
-
+
-
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/LocalizationTimeFormat.xml b/data_model/clusters/LocalizationTimeFormat.xml
index 204f145f9c8b07..fb8ceea3ee17a8 100644
--- a/data_model/clusters/LocalizationTimeFormat.xml
+++ b/data_model/clusters/LocalizationTimeFormat.xml
@@ -59,6 +59,9 @@ Davis, CA 95616, USA
+
+
+
@@ -132,7 +135,8 @@ Davis, CA 95616, USA
-
+
+
diff --git a/data_model/clusters/LocalizationUnit.xml b/data_model/clusters/LocalizationUnit.xml
index 24c54638b4ffd7..be7ea6a0aa2d78 100644
--- a/data_model/clusters/LocalizationUnit.xml
+++ b/data_model/clusters/LocalizationUnit.xml
@@ -59,6 +59,9 @@ Davis, CA 95616, USA
+
+
+
diff --git a/data_model/clusters/LowPower.xml b/data_model/clusters/LowPower.xml
index f8ee432eef58a7..4c228d3154dfa1 100644
--- a/data_model/clusters/LowPower.xml
+++ b/data_model/clusters/LowPower.xml
@@ -54,14 +54,19 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
-
+
diff --git a/data_model/clusters/MediaInput.xml b/data_model/clusters/MediaInput.xml
index 9ca0f351d1f59f..b7d9d2ef017035 100644
--- a/data_model/clusters/MediaInput.xml
+++ b/data_model/clusters/MediaInput.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -132,22 +137,22 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
diff --git a/data_model/clusters/MediaPlayback.xml b/data_model/clusters/MediaPlayback.xml
index f2cdf5c4a7c851..0a457a446208dd 100644
--- a/data_model/clusters/MediaPlayback.xml
+++ b/data_model/clusters/MediaPlayback.xml
@@ -54,11 +54,17 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
-
+
+
+
+
+
@@ -67,8 +73,73 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
-
@@ -118,6 +189,30 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -172,52 +267,96 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
-
+
+
+
+
+
+
-
+
-
+
@@ -225,7 +364,6 @@ Davis, CA 95616, USA
-
@@ -235,7 +373,7 @@ Davis, CA 95616, USA
-
+
@@ -244,5 +382,92 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Messages.xml b/data_model/clusters/Messages.xml
index 9dd223d9a63f46..cea28ac15f54c9 100644
--- a/data_model/clusters/Messages.xml
+++ b/data_model/clusters/Messages.xml
@@ -55,6 +55,8 @@ Connectivity Standards Alliance +
508 Second Street, Suite 206 +
Davis, CA 95616, USA
+:xrefstyle: short
+
Copyright (C) Connectivity Standards Alliance (2021). All rights reserved. This
information within this document is the property of the Connectivity Standards
Alliance and its use and disclosure are restricted.
@@ -91,6 +93,8 @@ are made.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
@@ -98,6 +102,9 @@ Davis, CA 95616, USA
+
+
+
@@ -245,7 +252,7 @@ Davis, CA 95616, USA
-
+
@@ -275,7 +282,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/MicrowaveOvenControl.xml b/data_model/clusters/MicrowaveOvenControl.xml
index c95d713714854f..d7c6f72f740d3d 100644
--- a/data_model/clusters/MicrowaveOvenControl.xml
+++ b/data_model/clusters/MicrowaveOvenControl.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -114,7 +119,7 @@ Davis, CA 95616, USA
-
+
@@ -139,7 +144,7 @@ Davis, CA 95616, USA
-
+
@@ -166,7 +171,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/ModeBase.xml b/data_model/clusters/ModeBase.xml
index 5774a7fec0c5a5..2a11f85d343b39 100644
--- a/data_model/clusters/ModeBase.xml
+++ b/data_model/clusters/ModeBase.xml
@@ -61,6 +61,9 @@ Davis, CA 95616, USA
+
+
+
@@ -122,7 +125,7 @@ Require at least one standard mode tag. Define reserved ranges for base/derived
-
+
diff --git a/data_model/clusters/ModeSelect.xml b/data_model/clusters/ModeSelect.xml
index 19fe502c1fcfe2..a30a5b9bf8eca5 100644
--- a/data_model/clusters/ModeSelect.xml
+++ b/data_model/clusters/ModeSelect.xml
@@ -60,6 +60,9 @@ Davis, CA 95616, USA
+
+
+
@@ -133,7 +136,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/Mode_DeviceEnergyManagement.xml b/data_model/clusters/Mode_DeviceEnergyManagement.xml
index 4181b9b60ead42..592c7d4290a342 100644
--- a/data_model/clusters/Mode_DeviceEnergyManagement.xml
+++ b/data_model/clusters/Mode_DeviceEnergyManagement.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
diff --git a/data_model/clusters/Mode_Dishwasher.xml b/data_model/clusters/Mode_Dishwasher.xml
index 22d0fab7897696..4ff6e78714f648 100644
--- a/data_model/clusters/Mode_Dishwasher.xml
+++ b/data_model/clusters/Mode_Dishwasher.xml
@@ -54,12 +54,17 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
diff --git a/data_model/clusters/Mode_EVSE.xml b/data_model/clusters/Mode_EVSE.xml
index 2a600e3e381325..de88cb3717c8bf 100644
--- a/data_model/clusters/Mode_EVSE.xml
+++ b/data_model/clusters/Mode_EVSE.xml
@@ -54,10 +54,15 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Mode_LaundryWasher.xml b/data_model/clusters/Mode_LaundryWasher.xml
index e89778fa9ea579..c59b2c3fef9051 100644
--- a/data_model/clusters/Mode_LaundryWasher.xml
+++ b/data_model/clusters/Mode_LaundryWasher.xml
@@ -54,12 +54,17 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
diff --git a/data_model/clusters/Mode_MicrowaveOven.xml b/data_model/clusters/Mode_MicrowaveOven.xml
index cd98c189c12844..6e8a129444b9fd 100644
--- a/data_model/clusters/Mode_MicrowaveOven.xml
+++ b/data_model/clusters/Mode_MicrowaveOven.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -75,12 +80,10 @@ Davis, CA 95616, USA
-
-
+
-
-
+
diff --git a/data_model/clusters/Mode_Oven.xml b/data_model/clusters/Mode_Oven.xml
index 56a369dd425572..f6c7111bb844cd 100644
--- a/data_model/clusters/Mode_Oven.xml
+++ b/data_model/clusters/Mode_Oven.xml
@@ -54,10 +54,15 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/Mode_RVCClean.xml b/data_model/clusters/Mode_RVCClean.xml
index 64118517a03c1b..d1b2272fc7e756 100644
--- a/data_model/clusters/Mode_RVCClean.xml
+++ b/data_model/clusters/Mode_RVCClean.xml
@@ -54,12 +54,17 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
diff --git a/data_model/clusters/Mode_RVCRun.xml b/data_model/clusters/Mode_RVCRun.xml
index 8f49741f7cfeb8..8e19b45a8385fc 100644
--- a/data_model/clusters/Mode_RVCRun.xml
+++ b/data_model/clusters/Mode_RVCRun.xml
@@ -54,12 +54,17 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
diff --git a/data_model/clusters/Mode_Refrigerator.xml b/data_model/clusters/Mode_Refrigerator.xml
index cf6a65721e0efd..d51e30b68d1320 100644
--- a/data_model/clusters/Mode_Refrigerator.xml
+++ b/data_model/clusters/Mode_Refrigerator.xml
@@ -54,12 +54,17 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
diff --git a/data_model/clusters/Mode_WaterHeater.xml b/data_model/clusters/Mode_WaterHeater.xml
index 69fba08b940293..56f1a1e9a66951 100644
--- a/data_model/clusters/Mode_WaterHeater.xml
+++ b/data_model/clusters/Mode_WaterHeater.xml
@@ -54,10 +54,15 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/NetworkCommissioningCluster.xml b/data_model/clusters/NetworkCommissioningCluster.xml
index 0153146c149d26..86c7a01ce9f951 100644
--- a/data_model/clusters/NetworkCommissioningCluster.xml
+++ b/data_model/clusters/NetworkCommissioningCluster.xml
@@ -1,7 +1,5 @@
-
+
+
+
+
@@ -73,6 +76,11 @@ Davis, CA 95616, USA
+
+
+
+
+
@@ -169,15 +177,34 @@ Davis, CA 95616, USA
+
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -191,11 +218,11 @@ Davis, CA 95616, USA
-
+
-
+
@@ -229,17 +256,17 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -265,10 +292,11 @@ Davis, CA 95616, USA
-
+
+
-
+
@@ -302,24 +330,25 @@ Davis, CA 95616, USA
-
+
-
+
-
+
+
-
+
@@ -337,7 +366,7 @@ Davis, CA 95616, USA
-
+
@@ -345,19 +374,18 @@ Davis, CA 95616, USA
-
+
-
+
-
@@ -368,54 +396,68 @@ Davis, CA 95616, USA
-
+
-
+
-
+
+
-
+
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
@@ -423,16 +465,15 @@ Davis, CA 95616, USA
-
+
-
+
-
@@ -443,16 +484,28 @@ Davis, CA 95616, USA
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -460,16 +513,15 @@ Davis, CA 95616, USA
-
+
-
+
-
@@ -479,7 +531,7 @@ Davis, CA 95616, USA
-
+
@@ -487,7 +539,7 @@ Davis, CA 95616, USA
-
+
@@ -495,9 +547,9 @@ Davis, CA 95616, USA
-
+
-
+
@@ -507,5 +559,32 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/data_model/clusters/NetworkIdentityManagement.xml b/data_model/clusters/NetworkIdentityManagement.xml
index 08bee6af5871ff..8769b68583e4b9 100644
--- a/data_model/clusters/NetworkIdentityManagement.xml
+++ b/data_model/clusters/NetworkIdentityManagement.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -119,7 +124,7 @@ Davis, CA 95616, USA
-
+
@@ -130,7 +135,7 @@ Davis, CA 95616, USA
-
+
@@ -141,7 +146,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/OTAProvider.xml b/data_model/clusters/OTAProvider.xml
index 73157662cd6f6e..baf3996d3b911f 100644
--- a/data_model/clusters/OTAProvider.xml
+++ b/data_model/clusters/OTAProvider.xml
@@ -1,7 +1,5 @@
@@ -62,6 +64,9 @@ Davis, CA 95616, USA
+
+
+
diff --git a/data_model/clusters/OnOff.xml b/data_model/clusters/OnOff.xml
index 0d64837ea57fbb..0b1e32af50cddb 100644
--- a/data_model/clusters/OnOff.xml
+++ b/data_model/clusters/OnOff.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
@@ -64,6 +66,9 @@ Davis, CA 95616, USA
+
+
+
@@ -171,11 +176,11 @@ Davis, CA 95616, USA
-
+
-
+
@@ -183,7 +188,7 @@ Davis, CA 95616, USA
-
+
@@ -191,7 +196,7 @@ Davis, CA 95616, USA
-
+
@@ -205,13 +210,13 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/clusters/OperationalCredentialCluster.xml b/data_model/clusters/OperationalCredentialCluster.xml
index ec523ba33671d1..1a2becd5c478a2 100644
--- a/data_model/clusters/OperationalCredentialCluster.xml
+++ b/data_model/clusters/OperationalCredentialCluster.xml
@@ -1,7 +1,5 @@
-
+
+
+
+
@@ -98,10 +99,10 @@ Davis, CA 95616, USA
-
- -
+
-
- -
+
-
-
@@ -115,11 +116,11 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -136,32 +137,34 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
+
-
+
-
+
+
-
+
@@ -175,10 +178,14 @@ Davis, CA 95616, USA
-
+
+
+
+
+
@@ -186,7 +193,7 @@ Davis, CA 95616, USA
-
+
@@ -195,7 +202,6 @@ Davis, CA 95616, USA
-
@@ -206,7 +212,7 @@ Davis, CA 95616, USA
-
+
@@ -215,14 +221,13 @@ Davis, CA 95616, USA
-
-
+
@@ -234,7 +239,6 @@ Davis, CA 95616, USA
-
@@ -245,29 +249,29 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -280,7 +284,6 @@ Davis, CA 95616, USA
-
@@ -294,7 +297,7 @@ Davis, CA 95616, USA
-
+
@@ -302,7 +305,7 @@ Davis, CA 95616, USA
-
+
@@ -310,12 +313,12 @@ Davis, CA 95616, USA
-
+
-
+
-
+
diff --git a/data_model/clusters/OperationalState.xml b/data_model/clusters/OperationalState.xml
index dcb5753b2c1998..0062b38b4b3981 100644
--- a/data_model/clusters/OperationalState.xml
+++ b/data_model/clusters/OperationalState.xml
@@ -60,6 +60,9 @@ Davis, CA 95616, USA
+
+
+
@@ -143,6 +146,53 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data_model/clusters/OperationalState_Oven.xml b/data_model/clusters/OperationalState_Oven.xml
index 947e93f8ec2348..c44ac37b7ccac9 100644
--- a/data_model/clusters/OperationalState_Oven.xml
+++ b/data_model/clusters/OperationalState_Oven.xml
@@ -54,10 +54,15 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance +
508 Second Street, Suite 206 +
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/OperationalState_RVC.xml b/data_model/clusters/OperationalState_RVC.xml
index bc4e5505e45d6d..6426e2639a7b83 100644
--- a/data_model/clusters/OperationalState_RVC.xml
+++ b/data_model/clusters/OperationalState_RVC.xml
@@ -54,32 +54,29 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance +
508 Second Street, Suite 206 +
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
-
-
-
-
-
+
+
-
-
+
-
-
-
-
-
-
-
+
+
+
diff --git a/data_model/clusters/PowerSourceCluster.xml b/data_model/clusters/PowerSourceCluster.xml
index 16d6f0ac98cad5..ffd628de6686b8 100644
--- a/data_model/clusters/PowerSourceCluster.xml
+++ b/data_model/clusters/PowerSourceCluster.xml
@@ -61,6 +61,9 @@ Davis, CA 95616, USA
+
+
+
@@ -911,13 +914,13 @@ Davis, CA 95616, USA
-
+
-
+
@@ -928,12 +931,14 @@ Davis, CA 95616, USA
+
+
-
+
@@ -944,9 +949,10 @@ Davis, CA 95616, USA
+
-
+
@@ -957,13 +963,15 @@ Davis, CA 95616, USA
-
+
+
-
+
-
+
+
-
+
@@ -971,13 +979,15 @@ Davis, CA 95616, USA
-
+
+
-
+
-
+
+
-
+
@@ -985,13 +995,15 @@ Davis, CA 95616, USA
-
+
+
-
+
-
+
+
-
+
diff --git a/data_model/clusters/PowerSourceConfigurationCluster.xml b/data_model/clusters/PowerSourceConfigurationCluster.xml
index 5548bf6ad8e6b5..11e3bd47dd9186 100644
--- a/data_model/clusters/PowerSourceConfigurationCluster.xml
+++ b/data_model/clusters/PowerSourceConfigurationCluster.xml
@@ -59,10 +59,13 @@ Davis, CA 95616, USA
+
+
+
-
+
diff --git a/data_model/clusters/PowerTopology.xml b/data_model/clusters/PowerTopology.xml
index c8d90baeeded19..d8c8a50d22a3a6 100644
--- a/data_model/clusters/PowerTopology.xml
+++ b/data_model/clusters/PowerTopology.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: short
-->
+
+
+
diff --git a/data_model/clusters/PressureMeasurement.xml b/data_model/clusters/PressureMeasurement.xml
index 70093485639090..d9c4a4584404fe 100644
--- a/data_model/clusters/PressureMeasurement.xml
+++ b/data_model/clusters/PressureMeasurement.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
@@ -61,6 +63,9 @@ Davis, CA 95616, USA
+
+
+
diff --git a/data_model/clusters/PumpConfigurationControl.xml b/data_model/clusters/PumpConfigurationControl.xml
index f3fc98a52cee9e..cfd2971a395ecb 100644
--- a/data_model/clusters/PumpConfigurationControl.xml
+++ b/data_model/clusters/PumpConfigurationControl.xml
@@ -62,6 +62,9 @@ Davis, CA 95616, USA
+
+
+
@@ -169,7 +172,206 @@ Davis, CA 95616, USA
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data_model/clusters/RefrigeratorAlarm.xml b/data_model/clusters/RefrigeratorAlarm.xml
index c987c3860a4f52..caad94da1f6fad 100644
--- a/data_model/clusters/RefrigeratorAlarm.xml
+++ b/data_model/clusters/RefrigeratorAlarm.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: short
-->
+
+
+
@@ -73,8 +78,7 @@ Davis, CA 95616, USA
-
-
+
diff --git a/data_model/clusters/ResourceMonitoring.xml b/data_model/clusters/ResourceMonitoring.xml
index 17fc7554ac41f0..6b0e8f3a203ded 100644
--- a/data_model/clusters/ResourceMonitoring.xml
+++ b/data_model/clusters/ResourceMonitoring.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
@@ -164,7 +166,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/Scenes.xml b/data_model/clusters/Scenes.xml
index 0c4347c4e8be8a..5d9be300d1abbc 100644
--- a/data_model/clusters/Scenes.xml
+++ b/data_model/clusters/Scenes.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -116,17 +121,14 @@ Davis, CA 95616, USA
-
-
-
@@ -177,7 +179,7 @@ Davis, CA 95616, USA
-
+
@@ -189,7 +191,7 @@ Davis, CA 95616, USA
-
+
@@ -202,7 +204,6 @@ Davis, CA 95616, USA
-
@@ -216,7 +217,7 @@ Davis, CA 95616, USA
-
+
@@ -228,7 +229,6 @@ Davis, CA 95616, USA
-
@@ -242,7 +242,7 @@ Davis, CA 95616, USA
-
+
@@ -251,7 +251,7 @@ Davis, CA 95616, USA
-
+
@@ -263,7 +263,6 @@ Davis, CA 95616, USA
-
@@ -277,7 +276,7 @@ Davis, CA 95616, USA
-
+
@@ -285,7 +284,6 @@ Davis, CA 95616, USA
-
@@ -295,7 +293,7 @@ Davis, CA 95616, USA
-
+
@@ -307,7 +305,6 @@ Davis, CA 95616, USA
-
@@ -321,7 +318,7 @@ Davis, CA 95616, USA
-
+
@@ -337,7 +334,7 @@ Davis, CA 95616, USA
-
+
@@ -345,7 +342,6 @@ Davis, CA 95616, USA
-
@@ -362,7 +358,7 @@ Davis, CA 95616, USA
-
+
@@ -383,9 +379,8 @@ Davis, CA 95616, USA
-
-
+
diff --git a/data_model/clusters/SmokeCOAlarm.xml b/data_model/clusters/SmokeCOAlarm.xml
index 0db5c78f4e947f..d3d35f13f15f25 100644
--- a/data_model/clusters/SmokeCOAlarm.xml
+++ b/data_model/clusters/SmokeCOAlarm.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -226,7 +231,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/Switch.xml b/data_model/clusters/Switch.xml
index 30602c35bf794f..e7170049ac051f 100644
--- a/data_model/clusters/Switch.xml
+++ b/data_model/clusters/Switch.xml
@@ -59,6 +59,9 @@ Davis, CA 95616, USA
+
+
+
diff --git a/data_model/clusters/TargetNavigator.xml b/data_model/clusters/TargetNavigator.xml
index 343f1427176e41..cfb3a0c17a6f99 100644
--- a/data_model/clusters/TargetNavigator.xml
+++ b/data_model/clusters/TargetNavigator.xml
@@ -54,11 +54,17 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
-
+
+
+
+
+
@@ -95,7 +101,7 @@ Davis, CA 95616, USA
-
+
@@ -106,7 +112,6 @@ Davis, CA 95616, USA
-
@@ -116,4 +121,22 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/TemperatureControl.xml b/data_model/clusters/TemperatureControl.xml
index f457238bab1d8a..70fc100d83bbab 100644
--- a/data_model/clusters/TemperatureControl.xml
+++ b/data_model/clusters/TemperatureControl.xml
@@ -59,6 +59,9 @@ Davis, CA 95616, USA
+
+
+
@@ -73,9 +76,58 @@ Davis, CA 95616, USA
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/data_model/clusters/TemperatureMeasurement.xml b/data_model/clusters/TemperatureMeasurement.xml
index e1603fd3358bc3..540af82bcedd18 100644
--- a/data_model/clusters/TemperatureMeasurement.xml
+++ b/data_model/clusters/TemperatureMeasurement.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
@@ -62,6 +64,9 @@ Davis, CA 95616, USA
+
+
+
diff --git a/data_model/clusters/Thermostat.xml b/data_model/clusters/Thermostat.xml
index 400d55a048a116..756e27940c2cba 100644
--- a/data_model/clusters/Thermostat.xml
+++ b/data_model/clusters/Thermostat.xml
@@ -55,7 +55,7 @@ Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
-->
-
+
@@ -63,7 +63,11 @@ Davis, CA 95616, USA
+
+
+
+
@@ -102,6 +106,17 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
@@ -212,13 +227,36 @@ Davis, CA 95616, USA
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
-
-
-
+
+
+
+
-
@@ -297,7 +335,7 @@ Davis, CA 95616, USA
- -
+
-
-
@@ -372,6 +410,14 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
@@ -451,6 +497,149 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -823,9 +1012,110 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -837,7 +1127,6 @@ Davis, CA 95616, USA
-
@@ -858,7 +1147,7 @@ Davis, CA 95616, USA
-
+
@@ -881,9 +1170,8 @@ Davis, CA 95616, USA
-
-
+
@@ -909,7 +1197,7 @@ Davis, CA 95616, USA
-
+
@@ -923,17 +1211,79 @@ Davis, CA 95616, USA
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/clusters/ThermostatUserInterfaceConfiguration.xml b/data_model/clusters/ThermostatUserInterfaceConfiguration.xml
index 6c8d1d920e6ef7..63fdba001c67a9 100644
--- a/data_model/clusters/ThermostatUserInterfaceConfiguration.xml
+++ b/data_model/clusters/ThermostatUserInterfaceConfiguration.xml
@@ -60,6 +60,9 @@ Davis, CA 95616, USA
+
+
+
diff --git a/data_model/clusters/ThreadBorderRouterDiagnostics.xml b/data_model/clusters/ThreadBorderRouterDiagnostics.xml
index 29b5da9b8511f0..5527c486a0cc51 100644
--- a/data_model/clusters/ThreadBorderRouterDiagnostics.xml
+++ b/data_model/clusters/ThreadBorderRouterDiagnostics.xml
@@ -54,19 +54,23 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
-
+
-
@@ -75,12 +79,11 @@ Davis, CA 95616, USA
-
+
-
diff --git a/data_model/clusters/TimeSync.xml b/data_model/clusters/TimeSync.xml
index 096e0ff2798261..99ec173bc7e6e1 100644
--- a/data_model/clusters/TimeSync.xml
+++ b/data_model/clusters/TimeSync.xml
@@ -1,7 +1,5 @@
+
+
+
@@ -112,19 +116,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -133,22 +137,22 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
-
+
-
+
@@ -178,9 +182,9 @@ Davis, CA 95616, USA
-
+
-
+
@@ -192,10 +196,6 @@ Davis, CA 95616, USA
-
-
-
-
\ No newline at end of file
diff --git a/data_model/clusters/Timer.xml b/data_model/clusters/Timer.xml
deleted file mode 100644
index ad0d864f016e92..00000000000000
--- a/data_model/clusters/Timer.xml
+++ /dev/null
@@ -1,131 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/data_model/clusters/ValveConfigurationControl.xml b/data_model/clusters/ValveConfigurationControl.xml
index 32620ad9cce97d..548fed7d7357c2 100644
--- a/data_model/clusters/ValveConfigurationControl.xml
+++ b/data_model/clusters/ValveConfigurationControl.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -171,7 +176,7 @@ Davis, CA 95616, USA
-
+
@@ -186,7 +191,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/WakeOnLAN.xml b/data_model/clusters/WakeOnLAN.xml
index 799c92a03fd9b8..deb5af5a75ac7d 100644
--- a/data_model/clusters/WakeOnLAN.xml
+++ b/data_model/clusters/WakeOnLAN.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
-
+
+
+
+
diff --git a/data_model/clusters/WaterContentMeasurement.xml b/data_model/clusters/WaterContentMeasurement.xml
index 8b1ff6a9a049bc..85d44793c93ae4 100644
--- a/data_model/clusters/WaterContentMeasurement.xml
+++ b/data_model/clusters/WaterContentMeasurement.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
@@ -61,6 +63,9 @@ Davis, CA 95616, USA
+
+
+
diff --git a/data_model/clusters/WaterHeaterManagement.xml b/data_model/clusters/WaterHeaterManagement.xml
index 073da0094b0b4b..4b6368555bf1d6 100644
--- a/data_model/clusters/WaterHeaterManagement.xml
+++ b/data_model/clusters/WaterHeaterManagement.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
+
+
+
@@ -129,7 +134,7 @@ Davis, CA 95616, USA
-
+
@@ -151,7 +156,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/WiFiNetworkManagement.xml b/data_model/clusters/WiFiNetworkManagement.xml
index 6308eca7e4b184..fbb7a84a4e17b2 100644
--- a/data_model/clusters/WiFiNetworkManagement.xml
+++ b/data_model/clusters/WiFiNetworkManagement.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
-
+
+
+
+
@@ -69,12 +74,11 @@ Davis, CA 95616, USA
-
+
-
diff --git a/data_model/clusters/WindowCovering.xml b/data_model/clusters/WindowCovering.xml
index 3ee6d43ded8bce..7b0afd461fcb96 100644
--- a/data_model/clusters/WindowCovering.xml
+++ b/data_model/clusters/WindowCovering.xml
@@ -54,6 +54,8 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:xrefstyle: basic
-->
@@ -63,6 +65,9 @@ Davis, CA 95616, USA
+
+
+
@@ -608,19 +613,19 @@ Davis, CA 95616, USA
-
+
-
+
-
+
-
+
@@ -633,7 +638,7 @@ Davis, CA 95616, USA
-
+
@@ -655,7 +660,7 @@ Davis, CA 95616, USA
-
+
@@ -668,7 +673,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/bridge-clusters-Actions.xml b/data_model/clusters/bridge-clusters-ActionsCluster.xml
similarity index 87%
rename from data_model/clusters/bridge-clusters-Actions.xml
rename to data_model/clusters/bridge-clusters-ActionsCluster.xml
index 51f7ee79bb4bad..e02b12e43d64a4 100644
--- a/data_model/clusters/bridge-clusters-Actions.xml
+++ b/data_model/clusters/bridge-clusters-ActionsCluster.xml
@@ -54,11 +54,16 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:sectnums:
-->
+
+
+
@@ -159,7 +164,7 @@ Davis, CA 95616, USA
-
+
@@ -181,7 +186,7 @@ Davis, CA 95616, USA
-
+
@@ -189,32 +194,35 @@ Davis, CA 95616, USA
-
+
+
-
+
-
+
+
-
+
-
+
+
-
+
-
+
-
+
-
+
@@ -223,7 +231,7 @@ Davis, CA 95616, USA
-
+
@@ -235,7 +243,7 @@ Davis, CA 95616, USA
-
+
@@ -244,7 +252,7 @@ Davis, CA 95616, USA
-
+
@@ -256,7 +264,7 @@ Davis, CA 95616, USA
-
+
@@ -265,7 +273,7 @@ Davis, CA 95616, USA
-
+
@@ -274,7 +282,7 @@ Davis, CA 95616, USA
-
+
@@ -286,7 +294,7 @@ Davis, CA 95616, USA
-
+
@@ -295,7 +303,7 @@ Davis, CA 95616, USA
-
+
@@ -304,7 +312,7 @@ Davis, CA 95616, USA
-
+
@@ -316,7 +324,7 @@ Davis, CA 95616, USA
-
+
@@ -325,7 +333,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/clusters/bridge-clusters-BridgedDeviceBasicInformation.xml b/data_model/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml
similarity index 95%
rename from data_model/clusters/bridge-clusters-BridgedDeviceBasicInformation.xml
rename to data_model/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml
index 5c4bd86b9ab7e4..1dd336ef3656a3 100644
--- a/data_model/clusters/bridge-clusters-BridgedDeviceBasicInformation.xml
+++ b/data_model/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml
@@ -54,13 +54,18 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:sectnums:
-->
-
+
+
+
+
@@ -129,6 +134,9 @@ Davis, CA 95616, USA
+
+
+
diff --git a/data_model/clusters/energy_management.xml b/data_model/clusters/energy_management.xml
index 792560796cdd4d..93858d1d1b3c89 100644
--- a/data_model/clusters/energy_management.xml
+++ b/data_model/clusters/energy_management.xml
@@ -54,5 +54,7 @@ This notice and disclaimer must be included on all copies of this document.
Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
+
+:toc:
-->
\ No newline at end of file
diff --git a/data_model/clusters/network_infrastructure.xml b/data_model/clusters/network_infrastructure.xml
index 181ee350003454..7e75cc0af8229f 100644
--- a/data_model/clusters/network_infrastructure.xml
+++ b/data_model/clusters/network_infrastructure.xml
@@ -59,4 +59,4 @@ Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
-->
-
\ No newline at end of file
+
diff --git a/data_model/device_types/BaseDeviceType.xml b/data_model/device_types/BaseDeviceType.xml
index a92816ac49d6e1..22cec956aa6061 100644
--- a/data_model/device_types/BaseDeviceType.xml
+++ b/data_model/device_types/BaseDeviceType.xml
@@ -62,23 +62,4 @@ Davis, CA 95616, USA
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/data_model/device_types/Cooktop.xml b/data_model/device_types/Cooktop.xml
index 233c72ed37590a..ea94653008d25a 100644
--- a/data_model/device_types/Cooktop.xml
+++ b/data_model/device_types/Cooktop.xml
@@ -71,9 +71,6 @@ Davis, CA 95616, USA
-
-
-
diff --git a/data_model/clusters/Mode_Laundry.xml b/data_model/device_types/DeviceEnergyManagement.xml
similarity index 73%
rename from data_model/clusters/Mode_Laundry.xml
rename to data_model/device_types/DeviceEnergyManagement.xml
index 63108a01aa876b..9d993a9454ea15 100644
--- a/data_model/clusters/Mode_Laundry.xml
+++ b/data_model/device_types/DeviceEnergyManagement.xml
@@ -55,38 +55,17 @@ Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
-->
-
+
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/data_model/device_types/EVSE.xml b/data_model/device_types/EVSE.xml
index f15b1db770b454..9e6ce7be28f301 100644
--- a/data_model/device_types/EVSE.xml
+++ b/data_model/device_types/EVSE.xml
@@ -65,28 +65,6 @@ Davis, CA 95616, USA
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data_model/device_types/Thermostat.xml b/data_model/device_types/Thermostat.xml
index fc154468e97c5f..cbdedb7c039ed5 100644
--- a/data_model/device_types/Thermostat.xml
+++ b/data_model/device_types/Thermostat.xml
@@ -82,13 +82,13 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/scraper_version b/data_model/scraper_version
index 0495c4a88caed0..e8ea05db81420d 100644
--- a/data_model/scraper_version
+++ b/data_model/scraper_version
@@ -1 +1 @@
-1.2.3
+1.2.4
diff --git a/data_model/spec_sha b/data_model/spec_sha
index ec683a1872fc3e..97f7f06deb9fe9 100644
--- a/data_model/spec_sha
+++ b/data_model/spec_sha
@@ -1 +1 @@
-72ce960f71810d6ca96125aea54e4fb0a9631e34
+b0310bae0264a29665f23a8f3d4dc4f742be6075
diff --git a/docs/guides/README.md b/docs/guides/README.md
index 30356c72273747..4f4ddb231f577b 100644
--- a/docs/guides/README.md
+++ b/docs/guides/README.md
@@ -34,7 +34,6 @@
## Development Guides
- [Access Control](./access-control-guide.md)
-- [IP Commissioning](./ip_commissioning.md)
## Setup Guides
diff --git a/docs/guides/index.md b/docs/guides/index.md
index 8813376f7e3e81..2a5d3a64f5afe7 100644
--- a/docs/guides/index.md
+++ b/docs/guides/index.md
@@ -55,7 +55,6 @@ ti/ti_platform_overview
## Development Guides
- [Access Control](./access-control-guide.md)
-- [IP Commissioning](./ip_commissioning.md)
- [Matter IDL tooling and validation](./matter_idl_tooling.md)
## Setup Guides
diff --git a/docs/guides/ip_commissioning.md b/docs/guides/ip_commissioning.md
deleted file mode 100644
index d1e44d087be435..00000000000000
--- a/docs/guides/ip_commissioning.md
+++ /dev/null
@@ -1,82 +0,0 @@
-# IP commissioning
-
-## Devices
-
-### ESP32 (M5 stack) - all-clusters-app
-
-The M5 doesn’t have an ethernet port, but we can simulate IP connection by
-giving the device wifi credentials. The device will start up advertising as a
-commissionable device.
-
-Compile the device image as follows
-
-```
-Demo->Device Type =
-Component config-> Chip Device Layer -> WiFi Station Options - set up ssid and password
-```
-
-### linux builds
-
-```bash
-gn gen out/debug
-ninja -C out/debug
-```
-
-These devices start in commissioning mode if they do not have stored Matter
-credentials. Linux devices store credentials in the /tmp directory, so to
-re-commission the device from scratch, remove the chip\_\* files from /tmp.
-
-## Controller
-
-### chip-device-ctrl
-
-There are two ways to connect via IP:
-
-**Discover then connect ip**
-
-```
-discover -all
-```
-
-or
-
-```
-discover -qr “[qrcode]”
-```
-
-then
-
-```
-connect -ip []
-```
-
-It is no longer necessary to run resolve after connect - this is done as part of
-the commissioning process
-
-**Connect using the QR code**
-
-```
-connect -qr “[qr code]”
-```
-
-This will discover, connect over IP with the code from the QR and resolve.
-
-### chip-tool
-
-You can connect using chip-tool either using the setup codes or by discovering
-the device on the network using one of the mDNS sub types. To get a list of the
-available options run
-
-```
-chip-tool pairing
-```
-
-For example, to discover, connect and commission using the long discriminator
-
-```
-chip-tool pairing onnetwork-long
-```
-
-where the node id is set to a value of your choice (used to id devices for
-future communication), and the setup pin code and long discriminator are set by
-the device and are normally logged at startup.
diff --git a/examples/air-purifier-app/air-purifier-common/air-purifier-app.matter b/examples/air-purifier-app/air-purifier-common/air-purifier-app.matter
index a801aac5943356..caedd98bf1be48 100644
--- a/examples/air-purifier-app/air-purifier-common/air-purifier-app.matter
+++ b/examples/air-purifier-app/air-purifier-common/air-purifier-app.matter
@@ -1595,7 +1595,7 @@ cluster Thermostat = 513 {
}
/** An interface for controlling a fan in a heating/cooling system. */
-provisional cluster FanControl = 514 {
+cluster FanControl = 514 {
revision 4;
enum AirflowDirectionEnum : enum8 {
diff --git a/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter b/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
index ebb9b3da83929b..62dc0d7d84c3fa 100644
--- a/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
+++ b/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
@@ -4455,6 +4455,27 @@ provisional cluster EnergyEvse = 153 {
timed command ClearTargets(): DefaultSuccess = 7;
}
+/** The Power Topology Cluster provides a mechanism for expressing how power is flowing between endpoints. */
+provisional cluster PowerTopology = 156 {
+ revision 1;
+
+ bitmap Feature : bitmap32 {
+ kNodeTopology = 0x1;
+ kTreeTopology = 0x2;
+ kSetTopology = 0x4;
+ kDynamicPowerFlow = 0x8;
+ }
+
+ readonly attribute optional endpoint_no availableEndpoints[] = 0;
+ readonly attribute optional endpoint_no activeEndpoints[] = 1;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+}
+
/** Attributes and commands for selecting a mode from a list of supported options. */
provisional cluster EnergyEvseMode = 157 {
revision 1;
@@ -5247,7 +5268,7 @@ cluster Thermostat = 513 {
}
/** An interface for controlling a fan in a heating/cooling system. */
-provisional cluster FanControl = 514 {
+cluster FanControl = 514 {
revision 4;
enum AirflowDirectionEnum : enum8 {
@@ -8340,6 +8361,17 @@ endpoint 1 {
handle command ClearTargets;
}
+ server cluster PowerTopology {
+ callback attribute availableEndpoints;
+ callback attribute activeEndpoints;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ callback attribute featureMap;
+ ram attribute clusterRevision default = 1;
+ }
+
server cluster EnergyEvseMode {
callback attribute supportedModes;
callback attribute currentMode;
diff --git a/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap b/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
index 1666cef4adc1b8..0a2a3faf1b37e8 100644
--- a/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
+++ b/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
@@ -14240,6 +14240,144 @@
}
]
},
+ {
+ "name": "Power Topology",
+ "code": 156,
+ "mfgCode": null,
+ "define": "POWER_TOPOLOGY_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "AvailableEndpoints",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ActiveEndpoints",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "GeneratedCommandList",
+ "code": 65528,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AttributeList",
+ "code": 65531,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "FeatureMap",
+ "code": 65532,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ClusterRevision",
+ "code": 65533,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
{
"name": "Energy EVSE Mode",
"code": 157,
diff --git a/examples/all-clusters-app/all-clusters-common/src/power-topology-stub.cpp b/examples/all-clusters-app/all-clusters-common/src/power-topology-stub.cpp
new file mode 100644
index 00000000000000..af2042bd58504d
--- /dev/null
+++ b/examples/all-clusters-app/all-clusters-common/src/power-topology-stub.cpp
@@ -0,0 +1,72 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include
+
+using namespace chip;
+using namespace chip::app::Clusters;
+using namespace chip::app::Clusters::PowerTopology;
+
+namespace chip {
+namespace app {
+namespace Clusters {
+namespace PowerTopology {
+
+class PowerTopologyDelegate : public Delegate
+{
+public:
+ ~PowerTopologyDelegate() = default;
+
+ CHIP_ERROR GetAvailableEndpointAtIndex(size_t index, EndpointId & endpointId) override;
+ CHIP_ERROR GetActiveEndpointAtIndex(size_t index, EndpointId & endpointId) override;
+};
+
+CHIP_ERROR PowerTopologyDelegate::GetAvailableEndpointAtIndex(size_t index, EndpointId & endpointId)
+{
+ return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED;
+}
+
+CHIP_ERROR PowerTopologyDelegate::GetActiveEndpointAtIndex(size_t index, EndpointId & endpointId)
+{
+ return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED;
+}
+
+} // namespace PowerTopology
+} // namespace Clusters
+} // namespace app
+} // namespace chip
+
+static std::unique_ptr gDelegate;
+static std::unique_ptr gInstance;
+
+void emberAfPowerTopologyClusterInitCallback(chip::EndpointId endpointId)
+{
+ VerifyOrDie(endpointId == 1); // this cluster is only enabled for endpoint 1.
+ VerifyOrDie(!gInstance);
+
+ gDelegate = std::make_unique();
+ if (gDelegate)
+ {
+ gInstance = std::make_unique(
+ endpointId, *gDelegate, BitMask(Feature::kSetTopology, Feature::kDynamicPowerFlow),
+ BitMask(OptionalAttributes::kOptionalAttributeAvailableEndpoints,
+ OptionalAttributes::kOptionalAttributeActiveEndpoints));
+
+ gInstance->Init();
+ }
+}
diff --git a/examples/all-clusters-app/esp32/main/CMakeLists.txt b/examples/all-clusters-app/esp32/main/CMakeLists.txt
index 641cbca7b55af0..238f0e899c340d 100644
--- a/examples/all-clusters-app/esp32/main/CMakeLists.txt
+++ b/examples/all-clusters-app/esp32/main/CMakeLists.txt
@@ -90,6 +90,7 @@ set(SRC_DIRS_LIST
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/pump-configuration-and-control-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/power-source-configuration-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/power-source-server"
+ "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/power-topology-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/resource-monitoring-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/temperature-control-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/time-synchronization-server"
diff --git a/examples/all-clusters-app/linux/BUILD.gn b/examples/all-clusters-app/linux/BUILD.gn
index b0fdcd4e0af68f..998f98a19cd3de 100644
--- a/examples/all-clusters-app/linux/BUILD.gn
+++ b/examples/all-clusters-app/linux/BUILD.gn
@@ -48,6 +48,7 @@ source_set("chip-all-clusters-common") {
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/operational-state-delegate-impl.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/oven-modes.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/oven-operational-state-delegate.cpp",
+ "${chip_root}/examples/all-clusters-app/all-clusters-common/src/power-topology-stub.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/resource-monitoring-delegates.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/rvc-modes.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/rvc-operational-state-delegate-impl.cpp",
diff --git a/examples/all-clusters-app/tizen/BUILD.gn b/examples/all-clusters-app/tizen/BUILD.gn
index 4a60be79bc1e49..364e9ce857d5da 100644
--- a/examples/all-clusters-app/tizen/BUILD.gn
+++ b/examples/all-clusters-app/tizen/BUILD.gn
@@ -33,6 +33,7 @@ source_set("chip-all-clusters-common") {
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/energy-evse-stub.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/fan-stub.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/oven-modes.cpp",
+ "${chip_root}/examples/all-clusters-app/all-clusters-common/src/power-topology-stub.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/resource-monitoring-delegates.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/smco-stub.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/static-supported-modes-manager.cpp",
diff --git a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter
index fe32702e2c847d..dbb244cf6265b3 100644
--- a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter
+++ b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter
@@ -3861,7 +3861,7 @@ cluster Thermostat = 513 {
}
/** An interface for controlling a fan in a heating/cooling system. */
-provisional cluster FanControl = 514 {
+cluster FanControl = 514 {
revision 4;
enum AirflowDirectionEnum : enum8 {
diff --git a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/BasicClientFragment.kt b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/BasicClientFragment.kt
index 0662ec08dc2146..f38cacbd259073 100644
--- a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/BasicClientFragment.kt
+++ b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/BasicClientFragment.kt
@@ -17,6 +17,7 @@ import chip.devicecontroller.model.AttributeWriteRequest
import chip.devicecontroller.model.ChipAttributePath
import chip.devicecontroller.model.ChipEventPath
import chip.devicecontroller.model.NodeState
+import chip.devicecontroller.model.Status
import com.google.chip.chiptool.ChipClient
import com.google.chip.chiptool.GenericChipDeviceListener
import com.google.chip.chiptool.R
@@ -191,8 +192,8 @@ class BasicClientFragment : Fragment() {
Log.e(TAG, "Write ${attribute.name} failure", ex)
}
- override fun onResponse(attributePath: ChipAttributePath?) {
- showMessage("Write ${attribute.name} success")
+ override fun onResponse(attributePath: ChipAttributePath, status: Status) {
+ showMessage("Write ${attribute.name} response: $status")
}
},
devicePtr,
diff --git a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/OtaProviderClientFragment.kt b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/OtaProviderClientFragment.kt
index 87735856fa4844..c27159193ed2dc 100644
--- a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/OtaProviderClientFragment.kt
+++ b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/OtaProviderClientFragment.kt
@@ -32,6 +32,7 @@ import chip.devicecontroller.model.AttributeWriteRequest
import chip.devicecontroller.model.ChipAttributePath
import chip.devicecontroller.model.ChipEventPath
import chip.devicecontroller.model.NodeState
+import chip.devicecontroller.model.Status
import com.google.chip.chiptool.ChipClient
import com.google.chip.chiptool.GenericChipDeviceListener
import com.google.chip.chiptool.R
@@ -223,9 +224,9 @@ class OtaProviderClientFragment : Fragment() {
showMessage("Error : ${e.toString()}")
}
- override fun onResponse(attributePath: ChipAttributePath?) {
+ override fun onResponse(attributePath: ChipAttributePath, status: Status) {
Log.d(TAG, "onResponse")
- showMessage("write Success")
+ showMessage("$attributePath : Write response: $status")
}
},
ChipClient.getConnectedDevicePointer(requireContext(), addressUpdateFragment.deviceId),
@@ -350,9 +351,9 @@ class OtaProviderClientFragment : Fragment() {
showMessage("error : ${e.toString()}")
}
- override fun onResponse(attributePath: ChipAttributePath?) {
+ override fun onResponse(attributePath: ChipAttributePath, status: Status) {
Log.d(TAG, "onResponse")
- showMessage("write success")
+ showMessage("$attributePath : Write response: $status")
}
},
ChipClient.getConnectedDevicePointer(requireContext(), addressUpdateFragment.deviceId),
diff --git a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/WildcardFragment.kt b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/WildcardFragment.kt
index 1978951e02e210..af119581a7047f 100644
--- a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/WildcardFragment.kt
+++ b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/WildcardFragment.kt
@@ -27,6 +27,7 @@ import chip.devicecontroller.model.ChipEventPath
import chip.devicecontroller.model.ChipPathId
import chip.devicecontroller.model.InvokeElement
import chip.devicecontroller.model.NodeState
+import chip.devicecontroller.model.Status
import com.google.chip.chiptool.ChipClient
import com.google.chip.chiptool.R
import com.google.chip.chiptool.databinding.WildcardFragmentBinding
@@ -92,8 +93,8 @@ class WildcardFragment : Fragment() {
Log.e(TAG, "Report error for $attributePath: $ex")
}
- override fun onResponse(attributePath: ChipAttributePath?) {
- val text = "$attributePath : Write Success"
+ override fun onResponse(attributePath: ChipAttributePath, status: Status) {
+ val text = "$attributePath : Write response: $status"
requireActivity().runOnUiThread { binding.outputTv.text = text }
}
diff --git a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/clusterinteraction/ClusterDetailFragment.kt b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/clusterinteraction/ClusterDetailFragment.kt
index 50c33bd35c60ba..eb14eee23770bd 100644
--- a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/clusterinteraction/ClusterDetailFragment.kt
+++ b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/clusterinteraction/ClusterDetailFragment.kt
@@ -199,10 +199,19 @@ class ClusterDetailFragment : Fragment() {
private fun castStringToType(data: String, type: Class<*>, underlyingType: Class<*>): Any? {
return when (type) {
- Int::class.java -> data.toInt()
- Boolean::class.java -> data.toBoolean()
+ Int::class.java,
+ java.lang.Integer::class.java -> data.toInt()
+ Boolean::class.java,
+ java.lang.Boolean::class.java -> data.toBoolean()
ByteArray::class.java -> data.encodeToByteArray()
- Long::class.java -> data.toLong()
+ Long::class.java,
+ java.lang.Long::class.java -> data.toLong()
+ Short::class.java,
+ java.lang.Short::class.java -> data.toShort()
+ Double::class.java,
+ java.lang.Double::class.java -> data.toDouble()
+ Float::class.java,
+ java.lang.Float::class.java -> data.toFloat()
Optional::class.java ->
if (data.isEmpty()) Optional.empty()
else Optional.of(castStringToType(data, underlyingType, underlyingType)!!)
diff --git a/examples/chef/chef.py b/examples/chef/chef.py
index 688bdfef490761..816840f8584a45 100755
--- a/examples/chef/chef.py
+++ b/examples/chef/chef.py
@@ -801,6 +801,7 @@ def main() -> int:
'import("${chip_root}/config/standalone/args.gni")',
'chip_shell_cmd_server = false',
'chip_build_libshell = true',
+ 'chip_enable_openthread = false',
'chip_config_network_layer_ble = false',
'chip_device_project_config_include = ""',
'chip_project_config_include = ""',
diff --git a/examples/chef/common/chef-air-quality.h b/examples/chef/common/chef-air-quality.h
index 2eaf3ef28fdf66..e7589488d41d74 100644
--- a/examples/chef/common/chef-air-quality.h
+++ b/examples/chef/common/chef-air-quality.h
@@ -22,10 +22,10 @@
#include
#ifdef MATTER_DM_PLUGIN_AIR_QUALITY_SERVER
-Protocols::InteractionModel::Status chefAirQualityWriteCallback(chip::EndpointId endpoint, chip::ClusterId clusterId,
- const EmberAfAttributeMetadata * attributeMetadata,
- uint8_t * buffer);
-Protocols::InteractionModel::Status chefAirQualityReadCallback(chip::EndpointId endpoint, chip::ClusterId clusterId,
- const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer,
- uint16_t maxReadLength);
+chip::Protocols::InteractionModel::Status chefAirQualityWriteCallback(chip::EndpointId endpoint, chip::ClusterId clusterId,
+ const EmberAfAttributeMetadata * attributeMetadata,
+ uint8_t * buffer);
+chip::Protocols::InteractionModel::Status chefAirQualityReadCallback(chip::EndpointId endpoint, chip::ClusterId clusterId,
+ const EmberAfAttributeMetadata * attributeMetadata,
+ uint8_t * buffer, uint16_t maxReadLength);
#endif
diff --git a/examples/chef/common/chef-channel-manager.cpp b/examples/chef/common/chef-channel-manager.cpp
deleted file mode 100644
index 4a8d6de466d746..00000000000000
--- a/examples/chef/common/chef-channel-manager.cpp
+++ /dev/null
@@ -1,226 +0,0 @@
-/**
- *
- * Copyright (c) 2021 Project CHIP Authors
- * All rights reserved.
- *
- * 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.
- */
-#include
-#include
-#include
-
-using ChangeChannelResponseType = chip::app::Clusters::Channel::Commands::ChangeChannelResponse::Type;
-using ChannelInfoType = chip::app::Clusters::Channel::Structs::ChannelInfoStruct::Type;
-using LineupInfoType = chip::app::Clusters::Channel::Structs::LineupInfoStruct::Type;
-// Include Channel Cluster Server callbacks only when the server is enabled
-#ifdef MATTER_DM_PLUGIN_CHANNEL_SERVER
-#include
-
-using namespace chip;
-using namespace chip::app;
-using namespace chip::app::Clusters::Channel;
-using namespace chip::Uint8;
-
-ChefChannelManager::ChefChannelManager()
-{
- ChannelInfoType abc;
- abc.affiliateCallSign = MakeOptional(chip::CharSpan::fromCharString("KAAL"));
- abc.callSign = MakeOptional(chip::CharSpan::fromCharString("KAAL-TV"));
- abc.name = MakeOptional(chip::CharSpan::fromCharString("ABC"));
- abc.majorNumber = static_cast(6);
- abc.minorNumber = static_cast(0);
- mChannels[mTotalChannels++] = abc;
-
- ChannelInfoType pbs;
- pbs.affiliateCallSign = MakeOptional(chip::CharSpan::fromCharString("KCTS"));
- pbs.callSign = MakeOptional(chip::CharSpan::fromCharString("KCTS-TV"));
- pbs.name = MakeOptional(chip::CharSpan::fromCharString("PBS"));
- pbs.majorNumber = static_cast(9);
- pbs.minorNumber = static_cast(1);
- mChannels[mTotalChannels++] = pbs;
-
- ChannelInfoType pbsKids;
- pbsKids.affiliateCallSign = MakeOptional(chip::CharSpan::fromCharString("KCTS"));
- pbsKids.callSign = MakeOptional(chip::CharSpan::fromCharString("KCTS-TV"));
- pbsKids.name = MakeOptional(chip::CharSpan::fromCharString("PBS Kids"));
- pbsKids.majorNumber = static_cast(9);
- pbsKids.minorNumber = static_cast(2);
- mChannels[mTotalChannels++] = pbsKids;
-
- ChannelInfoType worldChannel;
- worldChannel.affiliateCallSign = MakeOptional(chip::CharSpan::fromCharString("KCTS"));
- worldChannel.callSign = MakeOptional(chip::CharSpan::fromCharString("KCTS-TV"));
- worldChannel.name = MakeOptional(chip::CharSpan::fromCharString("World Channel"));
- worldChannel.majorNumber = static_cast(9);
- worldChannel.minorNumber = static_cast(3);
- mChannels[mTotalChannels++] = worldChannel;
-}
-
-static bool isChannelMatched(const ChannelInfoType & channel, const CharSpan & match)
-{
- if (channel.name.HasValue() && channel.name.Value().data_equal(match))
- {
- return true;
- }
-
- if (channel.affiliateCallSign.HasValue() && channel.affiliateCallSign.Value().data_equal(match))
- {
- return true;
- }
-
- if (channel.callSign.HasValue() && channel.callSign.Value().data_equal(match))
- {
- return true;
- }
-
- StringBuilder<32> nr;
- nr.AddFormat("%d.%d", channel.majorNumber, channel.minorNumber);
- return match.data_equal(CharSpan::fromCharString(nr.c_str()));
-}
-
-CHIP_ERROR ChefChannelManager::HandleGetChannelList(app::AttributeValueEncoder & aEncoder)
-{
- return aEncoder.EncodeList([](const auto & encoder) -> CHIP_ERROR {
- int index = 0;
- for (auto const & channel : ChefChannelManager().mChannels)
- {
- ReturnErrorOnFailure(encoder.Encode(channel));
- index++;
- if (index >= ChefChannelManager().mTotalChannels)
- break;
- }
- return CHIP_NO_ERROR;
- });
-}
-
-CHIP_ERROR ChefChannelManager::HandleGetLineup(app::AttributeValueEncoder & aEncoder)
-{
- LineupInfoType lineup;
- lineup.operatorName = chip::CharSpan::fromCharString("Comcast");
- lineup.lineupName = MakeOptional(chip::CharSpan::fromCharString("Comcast King County"));
- lineup.postalCode = MakeOptional(chip::CharSpan::fromCharString("98052"));
- lineup.lineupInfoType = chip::app::Clusters::Channel::LineupInfoTypeEnum::kMso;
-
- return aEncoder.Encode(lineup);
-}
-
-CHIP_ERROR ChefChannelManager::HandleGetCurrentChannel(app::AttributeValueEncoder & aEncoder)
-{
- return aEncoder.Encode(mChannels[mCurrentChannelIndex]);
-}
-
-void ChefChannelManager::HandleChangeChannel(CommandResponseHelper & helper,
- const chip::CharSpan & match)
-{
- std::array matchedChannels;
-
- uint16_t index = 0;
- uint16_t totalMatchedChannels = 0;
- for (auto const & channel : mChannels)
- {
- // verify if CharSpan matches channel name
- // or callSign or affiliateCallSign or majorNumber.minorNumber
- if (isChannelMatched(channel, match))
- {
- matchedChannels[totalMatchedChannels++] = (channel);
- }
- else if (totalMatchedChannels == 0)
- {
- // "index" is only used when we end up with totalMatchedChannels == 1.
- // In that case, we want it to be the number of non-matching channels we saw before
- // the matching one.
- index++;
- }
- }
-
- ChangeChannelResponseType response;
-
- // Error: Found multiple matches
- if (totalMatchedChannels > 1)
- {
- response.status = chip::app::Clusters::Channel::StatusEnum::kMultipleMatches;
- helper.Success(response);
- }
- else if (totalMatchedChannels == 0)
- {
- // Error: Found no match
- response.status = chip::app::Clusters::Channel::StatusEnum::kNoMatches;
- helper.Success(response);
- }
- else
- {
- response.status = chip::app::Clusters::Channel::StatusEnum::kSuccess;
- response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
- mCurrentChannelIndex = index;
- helper.Success(response);
- }
-}
-
-bool ChefChannelManager::HandleChangeChannelByNumber(const uint16_t & majorNumber, const uint16_t & minorNumber)
-{
- bool channelChanged = false;
- uint16_t index = 0;
- for (auto const & channel : mChannels)
- {
-
- // verify if major & minor matches one of the channel from the list
- if (channel.minorNumber == minorNumber && channel.majorNumber == majorNumber)
- {
- // verify if channel changed by comparing values of current channel with the requested channel
- if (channel.minorNumber != mChannels[mCurrentChannelIndex].minorNumber ||
- channel.majorNumber != mChannels[mCurrentChannelIndex].majorNumber)
- {
- channelChanged = true;
- mCurrentChannelIndex = index;
- }
-
- // return since we've already found the unique matched channel
- return channelChanged;
- }
- index++;
- if (index >= mTotalChannels)
- break;
- }
- return channelChanged;
-}
-
-bool ChefChannelManager::HandleSkipChannel(const int16_t & count)
-{
- int32_t newChannelIndex = static_cast(count) + static_cast(mCurrentChannelIndex);
- uint16_t channelsSize = static_cast(mChannels.size());
-
- // handle newChannelIndex out of range.
- newChannelIndex = newChannelIndex % channelsSize;
-
- if (newChannelIndex < 0)
- {
- newChannelIndex = newChannelIndex + channelsSize;
- }
-
- mCurrentChannelIndex = static_cast(newChannelIndex);
- return true;
-}
-
-uint32_t ChefChannelManager::GetFeatureMap(chip::EndpointId endpoint)
-{
- if (endpoint > MATTER_DM_CHANNEL_CLUSTER_SERVER_ENDPOINT_COUNT)
- {
- return 0;
- }
-
- uint32_t featureMap = 0;
- Attributes::FeatureMap::Get(endpoint, &featureMap);
- return featureMap;
-}
-
-#endif /* MATTER_DM_PLUGIN_CHANNEL_SERVER */
diff --git a/examples/chef/common/chef-channel-manager.h b/examples/chef/common/chef-channel-manager.h
deleted file mode 100644
index 53a1db529a9a4a..00000000000000
--- a/examples/chef/common/chef-channel-manager.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *
- * Copyright (c) 2021 Project CHIP Authors
- * All rights reserved.
- *
- * 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.
- */
-
-#pragma once
-
-#include
-
-class ChefChannelManager : public chip::app::Clusters::Channel::Delegate
-{
-
-public:
- ChefChannelManager();
-
- CHIP_ERROR HandleGetChannelList(chip::app::AttributeValueEncoder & aEncoder);
- CHIP_ERROR HandleGetLineup(chip::app::AttributeValueEncoder & aEncoder);
- CHIP_ERROR HandleGetCurrentChannel(chip::app::AttributeValueEncoder & aEncoder);
-
- void HandleChangeChannel(
- chip::app::CommandResponseHelper & helper,
- const chip::CharSpan & match);
- bool HandleChangeChannelByNumber(const uint16_t & majorNumber, const uint16_t & minorNumber);
- bool HandleSkipChannel(const int16_t & count);
-
- static ChefChannelManager & Instance()
- {
- static ChefChannelManager instance;
- return instance;
- }
-
- // bool HasFeature(chip::EndpointId endpoint, Feature feature);
- uint32_t GetFeatureMap(chip::EndpointId endpoint);
-
- ~ChefChannelManager() = default;
-
-protected:
- static constexpr size_t kMaxChannels = 10;
- uint16_t mCurrentChannelIndex{ 0 };
- uint16_t mTotalChannels{ 0 };
- std::array mChannels;
-};
diff --git a/examples/chef/common/chef-concentration-measurement.h b/examples/chef/common/chef-concentration-measurement.h
index 9b8fc571872c6b..887df7d943ee08 100644
--- a/examples/chef/common/chef-concentration-measurement.h
+++ b/examples/chef/common/chef-concentration-measurement.h
@@ -31,10 +31,11 @@
defined(MATTER_DM_PLUGIN_PM10_CONCENTRATION_MEASUREMENT_SERVER) || \
defined(MATTER_DM_PLUGIN_TOTAL_VOLATILE_ORGANIC_COMPOUNDS_CONCENTRATION_MEASUREMENT_SERVER) || \
defined(MATTER_DM_PLUGIN_RADON_CONCENTRATION_MEASUREMENT_SERVER)
-Protocols::InteractionModel::Status chefConcentrationMeasurementWriteCallback(chip::EndpointId endpoint, chip::ClusterId clusterId,
- const EmberAfAttributeMetadata * attributeMetadata,
- uint8_t * buffer);
-Protocols::InteractionModel::Status chefConcentrationMeasurementReadCallback(chip::EndpointId endpoint, chip::ClusterId clusterId,
- const EmberAfAttributeMetadata * attributeMetadata,
- uint8_t * buffer, uint16_t maxReadLength);
+chip::Protocols::InteractionModel::Status
+chefConcentrationMeasurementWriteCallback(chip::EndpointId endpoint, chip::ClusterId clusterId,
+ const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer);
+chip::Protocols::InteractionModel::Status
+chefConcentrationMeasurementReadCallback(chip::EndpointId endpoint, chip::ClusterId clusterId,
+ const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer,
+ uint16_t maxReadLength);
#endif
diff --git a/examples/chef/common/clusters/audio-output/AudioOutputManager.cpp b/examples/chef/common/clusters/audio-output/AudioOutputManager.cpp
new file mode 100644
index 00000000000000..06a123a6549679
--- /dev/null
+++ b/examples/chef/common/clusters/audio-output/AudioOutputManager.cpp
@@ -0,0 +1,83 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include
+#ifdef MATTER_DM_PLUGIN_AUDIO_OUTPUT_SERVER
+#include "AudioOutputManager.h"
+
+using namespace std;
+using namespace chip::app;
+using namespace chip::app::Clusters::AudioOutput;
+using chip::app::AttributeValueEncoder;
+
+AudioOutputManager::AudioOutputManager()
+{
+ struct OutputData outputData1(1, chip::app::Clusters::AudioOutput::OutputTypeEnum::kHdmi, "HDMI 1");
+ mOutputs.push_back(outputData1);
+ struct OutputData outputData2(2, chip::app::Clusters::AudioOutput::OutputTypeEnum::kHdmi, "HDMI 2");
+ mOutputs.push_back(outputData2);
+ struct OutputData outputData3(3, chip::app::Clusters::AudioOutput::OutputTypeEnum::kHdmi, "HDMI 3");
+ mOutputs.push_back(outputData3);
+
+ mCurrentOutput = 1;
+}
+
+uint8_t AudioOutputManager::HandleGetCurrentOutput()
+{
+ return mCurrentOutput;
+}
+
+CHIP_ERROR AudioOutputManager::HandleGetOutputList(AttributeValueEncoder & aEncoder)
+{
+ return aEncoder.EncodeList([this](const auto & encoder) -> CHIP_ERROR {
+ for (auto const & outputData : mOutputs)
+ {
+ ReturnErrorOnFailure(encoder.Encode(outputData.GetEncodable()));
+ }
+ return CHIP_NO_ERROR;
+ });
+}
+
+bool AudioOutputManager::HandleRenameOutput(const uint8_t & index, const chip::CharSpan & newName)
+{
+ for (auto & outputData : mOutputs)
+ {
+ if (outputData.index == index)
+ {
+ outputData.Rename(newName);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool AudioOutputManager::HandleSelectOutput(const uint8_t & index)
+{
+ for (auto & outputData : mOutputs)
+ {
+ if (outputData.index == index)
+ {
+ mCurrentOutput = index;
+ return true;
+ }
+ }
+
+ return false;
+}
+#endif // MATTER_DM_PLUGIN_AUDIO_OUTPUT_SERVER
diff --git a/examples/chef/common/clusters/audio-output/AudioOutputManager.h b/examples/chef/common/clusters/audio-output/AudioOutputManager.h
new file mode 100644
index 00000000000000..5f9157de773ee7
--- /dev/null
+++ b/examples/chef/common/clusters/audio-output/AudioOutputManager.h
@@ -0,0 +1,58 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include
+#include
+
+class AudioOutputManager : public chip::app::Clusters::AudioOutput::Delegate
+{
+ using OutputInfoType = chip::app::Clusters::AudioOutput::Structs::OutputInfoStruct::Type;
+
+public:
+ AudioOutputManager();
+
+ uint8_t HandleGetCurrentOutput() override;
+ CHIP_ERROR HandleGetOutputList(chip::app::AttributeValueEncoder & aEncoder) override;
+ bool HandleRenameOutput(const uint8_t & index, const chip::CharSpan & name) override;
+ bool HandleSelectOutput(const uint8_t & index) override;
+
+ struct OutputData
+ {
+ uint8_t index;
+ chip::app::Clusters::AudioOutput::OutputTypeEnum outputType;
+ std::string name;
+
+ OutputData(uint8_t i, chip::app::Clusters::AudioOutput::OutputTypeEnum t, const char * n) : index(i), outputType(t), name(n)
+ {}
+ void Rename(const chip::CharSpan & newName) { name.assign(newName.data(), newName.size()); }
+ OutputInfoType GetEncodable() const
+ {
+ OutputInfoType result;
+ result.index = index;
+ result.outputType = outputType;
+ result.name = chip::CharSpan::fromCharString(name.c_str());
+ return result;
+ }
+ };
+
+protected:
+ uint8_t mCurrentOutput = 1;
+ std::vector mOutputs;
+};
diff --git a/examples/chef/common/clusters/channel/ChannelManager.cpp b/examples/chef/common/clusters/channel/ChannelManager.cpp
new file mode 100644
index 00000000000000..36df31af6de280
--- /dev/null
+++ b/examples/chef/common/clusters/channel/ChannelManager.cpp
@@ -0,0 +1,352 @@
+/**
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ *
+ * 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.
+ */
+
+#include
+#ifdef MATTER_DM_PLUGIN_CHANNEL_SERVER
+#include "ChannelManager.h"
+#include
+#include
+
+#include
+#include
+#include
+
+using namespace chip;
+using namespace chip::app;
+using namespace chip::app::Clusters::Channel;
+using namespace chip::Uint8;
+
+ChannelManager::ChannelManager()
+{
+ ChannelInfoType abc;
+ abc.affiliateCallSign = MakeOptional(chip::CharSpan::fromCharString("KAAL"));
+ abc.callSign = MakeOptional(chip::CharSpan::fromCharString("KAAL-TV"));
+ abc.name = MakeOptional(chip::CharSpan::fromCharString("ABC"));
+ abc.majorNumber = static_cast(6);
+ abc.minorNumber = static_cast(0);
+ mChannels.push_back(abc);
+
+ ChannelInfoType pbs;
+ pbs.affiliateCallSign = MakeOptional(chip::CharSpan::fromCharString("KCTS"));
+ pbs.callSign = MakeOptional(chip::CharSpan::fromCharString("KCTS-TV"));
+ pbs.name = MakeOptional(chip::CharSpan::fromCharString("PBS"));
+ pbs.majorNumber = static_cast(9);
+ pbs.minorNumber = static_cast(1);
+ mChannels.push_back(pbs);
+
+ ChannelInfoType pbsKids;
+ pbsKids.affiliateCallSign = MakeOptional(chip::CharSpan::fromCharString("KCTS"));
+ pbsKids.callSign = MakeOptional(chip::CharSpan::fromCharString("KCTS-TV"));
+ pbsKids.name = MakeOptional(chip::CharSpan::fromCharString("PBS Kids"));
+ pbsKids.majorNumber = static_cast(9);
+ pbsKids.minorNumber = static_cast(2);
+ mChannels.push_back(pbsKids);
+
+ ChannelInfoType worldChannel;
+ worldChannel.affiliateCallSign = MakeOptional(chip::CharSpan::fromCharString("KCTS"));
+ worldChannel.callSign = MakeOptional(chip::CharSpan::fromCharString("KCTS-TV"));
+ worldChannel.name = MakeOptional(chip::CharSpan::fromCharString("World Channel"));
+ worldChannel.majorNumber = static_cast(9);
+ worldChannel.minorNumber = static_cast(3);
+ mChannels.push_back(worldChannel);
+
+ mCurrentChannelIndex = 0;
+ mCurrentChannel = mChannels[mCurrentChannelIndex];
+
+ ProgramType program1;
+ program1.identifier = chip::CharSpan::fromCharString("progid-abc1");
+ program1.channel = abc;
+ program1.title = chip::CharSpan::fromCharString("ABC Title1");
+ program1.subtitle = MakeOptional(chip::CharSpan::fromCharString("My Program Subtitle1"));
+ program1.startTime = 0;
+ program1.endTime = 30 * 60;
+
+ mPrograms.push_back(program1);
+
+ ProgramType program_pbs1;
+ program_pbs1.identifier = chip::CharSpan::fromCharString("progid-pbs1");
+ program_pbs1.channel = pbs;
+ program_pbs1.title = chip::CharSpan::fromCharString("PBS Title1");
+ program_pbs1.subtitle = MakeOptional(chip::CharSpan::fromCharString("My Program Subtitle1"));
+ program_pbs1.startTime = 0;
+ program_pbs1.endTime = 30 * 60;
+
+ mPrograms.push_back(program_pbs1);
+
+ ProgramType program2;
+ program2.identifier = chip::CharSpan::fromCharString("progid-abc2");
+ program2.channel = abc;
+ program2.title = chip::CharSpan::fromCharString("My Program Title2");
+ program2.subtitle = MakeOptional(chip::CharSpan::fromCharString("My Program Subtitle2"));
+ program2.startTime = 30 * 60;
+ program2.endTime = 60 * 60;
+
+ mPrograms.push_back(program2);
+
+ ProgramType program3;
+ program3.identifier = chip::CharSpan::fromCharString("progid-abc3");
+ program3.channel = abc;
+ program3.title = chip::CharSpan::fromCharString("My Program Title3");
+ program3.subtitle = MakeOptional(chip::CharSpan::fromCharString("My Program Subtitle3"));
+ program3.startTime = 0;
+ program3.endTime = 60 * 60;
+
+ mPrograms.push_back(program3);
+}
+
+CHIP_ERROR ChannelManager::HandleGetChannelList(AttributeValueEncoder & aEncoder)
+{
+ return aEncoder.EncodeList([](const auto & encoder) -> CHIP_ERROR {
+ for (auto const & channel : ChannelManager().mChannels)
+ {
+ ReturnErrorOnFailure(encoder.Encode(channel));
+ }
+ return CHIP_NO_ERROR;
+ });
+}
+
+CHIP_ERROR ChannelManager::HandleGetLineup(AttributeValueEncoder & aEncoder)
+{
+ LineupInfoType lineup;
+ lineup.operatorName = chip::CharSpan::fromCharString("Comcast");
+ lineup.lineupName = MakeOptional(chip::CharSpan::fromCharString("Comcast King County"));
+ lineup.postalCode = MakeOptional(chip::CharSpan::fromCharString("98052"));
+ lineup.lineupInfoType = LineupInfoTypeEnum::kMso;
+
+ return aEncoder.Encode(lineup);
+}
+
+CHIP_ERROR ChannelManager::HandleGetCurrentChannel(AttributeValueEncoder & aEncoder)
+{
+ return aEncoder.Encode(mCurrentChannel);
+}
+
+bool ChannelManager::isChannelMatched(const ChannelInfoType & channel, const chip::CharSpan & match)
+{
+ StringBuilder<16> channelNum;
+ channelNum.AddFormat("%d.%d", channel.majorNumber, channel.minorNumber);
+
+ auto isMatch = [&match](const Optional & a) { return a.HasValue() && a.Value().data_equal(match); };
+
+ return isMatch(channel.name) || isMatch(channel.affiliateCallSign) || isMatch(channel.callSign) ||
+ match.data_equal(chip::CharSpan::fromCharString(channelNum.c_str()));
+}
+
+void ChannelManager::HandleChangeChannel(CommandResponseHelper & helper, const CharSpan & match)
+{
+ int iMatchedChannel = -1;
+ ChangeChannelResponseType response;
+
+ for (uint16_t i = 0; i < mChannels.size(); i++)
+ {
+ // verify if CharSpan matches channel name
+ // or callSign or affiliateCallSign or majorNumber.minorNumber
+ if (isChannelMatched(mChannels[i], match))
+ {
+ if (iMatchedChannel != -1)
+ {
+ // Error: Found multiple matches
+ response.status = StatusEnum::kMultipleMatches;
+ helper.Success(response);
+ return;
+ }
+ iMatchedChannel = i;
+ }
+ }
+
+ if (iMatchedChannel == -1)
+ {
+ // Error: Found no match
+ response.status = StatusEnum::kNoMatches;
+ helper.Success(response);
+ }
+ else
+ {
+ response.status = StatusEnum::kSuccess;
+ response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
+ mCurrentChannel = mChannels[iMatchedChannel];
+ mCurrentChannelIndex = iMatchedChannel;
+ helper.Success(response);
+ }
+}
+
+bool ChannelManager::HandleChangeChannelByNumber(const uint16_t & majorNumber, const uint16_t & minorNumber)
+{
+ uint16_t index = 0;
+ for (auto const & channel : mChannels)
+ {
+ // verify if major & minor matches one of the channel from the list
+ if (channel.minorNumber == minorNumber && channel.majorNumber == majorNumber)
+ {
+ // verify if channel changed by comparing values of current channel with the requested channel
+ if (channel.minorNumber != mCurrentChannel.minorNumber || channel.majorNumber != mCurrentChannel.majorNumber)
+ {
+ mCurrentChannelIndex = index;
+ mCurrentChannel = channel;
+ return true;
+ }
+ }
+ index++;
+ }
+ return false;
+}
+
+bool ChannelManager::HandleSkipChannel(const int16_t & count)
+{
+ int32_t newChannelIndex = static_cast(count) + static_cast(mCurrentChannelIndex);
+ uint16_t channelsSize = static_cast(mChannels.size());
+
+ // handle newChannelIndex out of range.
+ newChannelIndex = newChannelIndex % channelsSize;
+
+ if (newChannelIndex < 0)
+ {
+ newChannelIndex = newChannelIndex + channelsSize;
+ }
+
+ mCurrentChannelIndex = static_cast(newChannelIndex);
+ mCurrentChannel = mChannels[mCurrentChannelIndex];
+ return true;
+}
+
+void ChannelManager::HandleGetProgramGuide(CommandResponseHelper & helper,
+ const chip::Optional & startTime, const chip::Optional & endTime,
+ const chip::Optional> & channelList,
+ const chip::Optional & pageToken,
+ const chip::Optional> & recordingFlag,
+ const chip::Optional> & externalIdList,
+ const chip::Optional & data)
+{
+
+ // 1. Decode received parameters
+ // 2. Perform search
+ // 3. Return results
+
+ // PageTokenType paging;
+ // paging.limit = MakeOptional(static_cast(10));
+ // paging.after = MakeOptional(chip::CharSpan::fromCharString("after-token"));
+ // paging.before = MakeOptional(chip::CharSpan::fromCharString("before-token"));
+
+ // ChannelPagingStructType channelPaging;
+ // channelPaging.nextToken = MakeOptional>(paging);
+
+ std::vector matches;
+ for (auto const & program : mPrograms)
+ {
+ if (startTime.ValueOr(0) > program.startTime)
+ {
+ continue;
+ }
+ if (endTime.ValueOr(std::numeric_limits::max()) < program.endTime)
+ {
+ continue;
+ }
+ if (channelList.HasValue())
+ {
+ auto iter = channelList.Value().begin();
+ bool match = false;
+ int listCount = 0;
+ while (iter.Next() && !match)
+ {
+ listCount++;
+ auto & channel = iter.GetValue();
+ if (channel.minorNumber != program.channel.minorNumber || channel.majorNumber != program.channel.majorNumber)
+ {
+ continue;
+ }
+ // this sample code does not currently check OTT
+ match = true;
+ }
+ if (!match && listCount > 0)
+ {
+ continue;
+ }
+ }
+ // this sample code does not currently filter on external id list
+ matches.push_back(program);
+ }
+
+ ProgramGuideResponseType response;
+ response.programList = DataModel::List(matches.data(), matches.size());
+ helper.Success(response);
+}
+
+bool ChannelManager::HandleRecordProgram(const chip::CharSpan & programIdentifier, bool shouldRecordSeries,
+ const DataModel::DecodableList & externalIdList,
+ const chip::ByteSpan & data)
+{
+ // Start recording
+ std::string idString(programIdentifier.data(), programIdentifier.size());
+ for (auto & program : mPrograms)
+ {
+ std::string nextIdString(program.identifier.data(), program.identifier.size());
+ if (nextIdString == idString)
+ {
+ program.recordingFlag = MakeOptional(chip::BitMask(
+ shouldRecordSeries ? RecordingFlagBitmap::kRecordSeries : RecordingFlagBitmap::kScheduled));
+ }
+ }
+
+ return true;
+}
+
+bool ChannelManager::HandleCancelRecordProgram(const chip::CharSpan & programIdentifier, bool shouldRecordSeries,
+ const DataModel::DecodableList & externalIdList,
+ const chip::ByteSpan & data)
+{
+ // Cancel recording
+ std::string idString(programIdentifier.data(), programIdentifier.size());
+ for (auto & program : mPrograms)
+ {
+ std::string nextIdString(program.identifier.data(), program.identifier.size());
+ if (nextIdString == idString)
+ {
+ program.recordingFlag = MakeOptional>(0);
+ }
+ }
+ return true;
+}
+
+uint32_t ChannelManager::GetFeatureMap(chip::EndpointId endpoint)
+{
+ if (endpoint >= MATTER_DM_CHANNEL_CLUSTER_SERVER_ENDPOINT_COUNT)
+ {
+ return mDynamicEndpointFeatureMap;
+ }
+
+ uint32_t featureMap = 0;
+ Attributes::FeatureMap::Get(endpoint, &featureMap);
+ return featureMap;
+}
+
+uint16_t ChannelManager::GetClusterRevision(chip::EndpointId endpoint)
+{
+ if (endpoint >= MATTER_DM_CHANNEL_CLUSTER_SERVER_ENDPOINT_COUNT)
+ {
+ return kClusterRevision;
+ }
+
+ uint16_t clusterRevision = 0;
+ bool success =
+ (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == chip::Protocols::InteractionModel::Status::Success);
+ if (!success)
+ {
+ ChipLogError(Zcl, "ChannelManager::GetClusterRevision error reading cluster revision");
+ }
+ return clusterRevision;
+}
+#endif // MATTER_DM_PLUGIN_CHANNEL_SERVER
diff --git a/examples/chef/common/clusters/channel/ChannelManager.h b/examples/chef/common/clusters/channel/ChannelManager.h
new file mode 100644
index 00000000000000..54006c67caf031
--- /dev/null
+++ b/examples/chef/common/clusters/channel/ChannelManager.h
@@ -0,0 +1,78 @@
+/**
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include
+#include
+#include
+
+class ChannelManager : public chip::app::Clusters::Channel::Delegate
+{
+ using RecordingFlagBitmap = chip::app::Clusters::Channel::RecordingFlagBitmap;
+ using ChangeChannelResponseType = chip::app::Clusters::Channel::Commands::ChangeChannelResponse::Type;
+ using ProgramGuideResponseType = chip::app::Clusters::Channel::Commands::ProgramGuideResponse::Type;
+ using ChannelInfoType = chip::app::Clusters::Channel::Structs::ChannelInfoStruct::Type;
+ using AdditionalInfoType = chip::app::Clusters::Channel::Structs::AdditionalInfoStruct::Type;
+ using LineupInfoType = chip::app::Clusters::Channel::Structs::LineupInfoStruct::Type;
+ using PageTokenType = chip::app::Clusters::Channel::Structs::PageTokenStruct::Type;
+ using ProgramType = chip::app::Clusters::Channel::Structs::ProgramStruct::Type;
+ using ChannelPagingType = chip::app::Clusters::Channel::Structs::ChannelPagingStruct::Type;
+ using Feature = chip::app::Clusters::Channel::Feature;
+
+public:
+ ChannelManager();
+
+ CHIP_ERROR HandleGetChannelList(chip::app::AttributeValueEncoder & aEncoder) override;
+ CHIP_ERROR HandleGetLineup(chip::app::AttributeValueEncoder & aEncoder) override;
+ CHIP_ERROR HandleGetCurrentChannel(chip::app::AttributeValueEncoder & aEncoder) override;
+
+ void HandleChangeChannel(chip::app::CommandResponseHelper & helper,
+ const chip::CharSpan & match) override;
+ bool HandleChangeChannelByNumber(const uint16_t & majorNumber, const uint16_t & minorNumber) override;
+ bool HandleSkipChannel(const int16_t & count) override;
+ void HandleGetProgramGuide(chip::app::CommandResponseHelper & helper,
+ const chip::Optional & startTime, const chip::Optional & endTime,
+ const chip::Optional> & channelList,
+ const chip::Optional & pageToken,
+ const chip::Optional> & recordingFlag,
+ const chip::Optional> & externalIdList,
+ const chip::Optional & data) override;
+
+ bool HandleRecordProgram(const chip::CharSpan & programIdentifier, bool shouldRecordSeries,
+ const chip::app::DataModel::DecodableList & externalIdList,
+ const chip::ByteSpan & data) override;
+
+ bool HandleCancelRecordProgram(const chip::CharSpan & programIdentifier, bool shouldRecordSeries,
+ const chip::app::DataModel::DecodableList & externalIdList,
+ const chip::ByteSpan & data) override;
+
+ uint32_t GetFeatureMap(chip::EndpointId endpoint) override;
+ uint16_t GetClusterRevision(chip::EndpointId endpoint) override;
+
+protected:
+ uint16_t mCurrentChannelIndex;
+ ChannelInfoType mCurrentChannel;
+ std::vector mChannels;
+ std::vector mPrograms;
+
+private:
+ bool isChannelMatched(const ChannelInfoType & channel, const chip::CharSpan & match);
+ static constexpr uint32_t mDynamicEndpointFeatureMap =
+ chip::BitMask(Feature::kChannelList, Feature::kLineupInfo).Raw();
+ static constexpr uint16_t kClusterRevision = 2;
+};
diff --git a/examples/chef/common/clusters/keypad-input/KeypadInputManager.cpp b/examples/chef/common/clusters/keypad-input/KeypadInputManager.cpp
new file mode 100644
index 00000000000000..bbae2b399b4c0f
--- /dev/null
+++ b/examples/chef/common/clusters/keypad-input/KeypadInputManager.cpp
@@ -0,0 +1,78 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include
+#ifdef MATTER_DM_PLUGIN_KEYPAD_INPUT_SERVER
+#include "KeypadInputManager.h"
+#include
+#include
+
+using namespace chip;
+using namespace chip::app;
+using namespace chip::app::Clusters::KeypadInput;
+
+using chip::app::CommandResponseHelper;
+
+void KeypadInputManager::HandleSendKey(CommandResponseHelper & helper, const CecKeyCodeType & keycCode)
+{
+ Commands::SendKeyResponse::Type response;
+
+ switch (keycCode)
+ {
+ case CecKeyCodeType::kUp:
+ case CecKeyCodeType::kDown:
+ case CecKeyCodeType::kLeft:
+ case CecKeyCodeType::kRight:
+ case CecKeyCodeType::kSelect:
+ case CecKeyCodeType::kBackward:
+ case CecKeyCodeType::kExit:
+ case CecKeyCodeType::kRootMenu:
+ case CecKeyCodeType::kSetupMenu:
+ case CecKeyCodeType::kEnter:
+ case CecKeyCodeType::kNumber0OrNumber10:
+ case CecKeyCodeType::kNumbers1:
+ case CecKeyCodeType::kNumbers2:
+ case CecKeyCodeType::kNumbers3:
+ case CecKeyCodeType::kNumbers4:
+ case CecKeyCodeType::kNumbers5:
+ case CecKeyCodeType::kNumbers6:
+ case CecKeyCodeType::kNumbers7:
+ case CecKeyCodeType::kNumbers8:
+ case CecKeyCodeType::kNumbers9:
+ response.status = chip::app::Clusters::KeypadInput::StatusEnum::kSuccess;
+ break;
+ default:
+ response.status = chip::app::Clusters::KeypadInput::StatusEnum::kUnsupportedKey;
+ break;
+ }
+
+ helper.Success(response);
+}
+
+uint32_t KeypadInputManager::GetFeatureMap(chip::EndpointId endpoint)
+{
+ if (endpoint >= MATTER_DM_KEYPAD_INPUT_CLUSTER_SERVER_ENDPOINT_COUNT)
+ {
+ return mDynamicEndpointFeatureMap;
+ }
+
+ uint32_t featureMap = 0;
+ Attributes::FeatureMap::Get(endpoint, &featureMap);
+ return featureMap;
+}
+#endif // MATTER_DM_PLUGIN_KEYPAD_INPUT_SERVER
diff --git a/examples/chef/common/clusters/keypad-input/KeypadInputManager.h b/examples/chef/common/clusters/keypad-input/KeypadInputManager.h
new file mode 100644
index 00000000000000..a3c6634166d683
--- /dev/null
+++ b/examples/chef/common/clusters/keypad-input/KeypadInputManager.h
@@ -0,0 +1,37 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include
+
+class KeypadInputManager : public chip::app::Clusters::KeypadInput::Delegate
+{
+ using SendKeyResponseType = chip::app::Clusters::KeypadInput::Commands::SendKeyResponse::Type;
+ using CecKeyCodeType = chip::app::Clusters::KeypadInput::CECKeyCodeEnum;
+ using Feature = chip::app::Clusters::KeypadInput::Feature;
+
+public:
+ void HandleSendKey(chip::app::CommandResponseHelper & helper, const CecKeyCodeType & keyCode) override;
+
+ uint32_t GetFeatureMap(chip::EndpointId endpoint) override;
+
+private:
+ static constexpr uint32_t mDynamicEndpointFeatureMap =
+ chip::BitMask(Feature::kNavigationKeyCodes, Feature::kLocationKeys, Feature::kNumberKeys).Raw();
+};
diff --git a/examples/chef/common/clusters/low-power/LowPowerManager.cpp b/examples/chef/common/clusters/low-power/LowPowerManager.cpp
new file mode 100644
index 00000000000000..1926d0c7150ddd
--- /dev/null
+++ b/examples/chef/common/clusters/low-power/LowPowerManager.cpp
@@ -0,0 +1,28 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include
+#ifdef MATTER_DM_PLUGIN_LOW_POWER_SERVER
+#include "LowPowerManager.h"
+
+bool LowPowerManager::HandleSleep()
+{
+ ChipLogProgress(Zcl, "LowPowerManager::HandleSleep");
+ return true;
+}
+#endif // MATTER_DM_PLUGIN_LOW_POWER_SERVER
diff --git a/examples/chef/common/clusters/low-power/LowPowerManager.h b/examples/chef/common/clusters/low-power/LowPowerManager.h
new file mode 100644
index 00000000000000..92bb1417be514d
--- /dev/null
+++ b/examples/chef/common/clusters/low-power/LowPowerManager.h
@@ -0,0 +1,27 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include
+
+class LowPowerManager : public chip::app::Clusters::LowPower::Delegate
+{
+public:
+ bool HandleSleep() override;
+};
diff --git a/examples/chef/common/clusters/media-input/MediaInputManager.cpp b/examples/chef/common/clusters/media-input/MediaInputManager.cpp
new file mode 100644
index 00000000000000..f7e853cc46a40b
--- /dev/null
+++ b/examples/chef/common/clusters/media-input/MediaInputManager.cpp
@@ -0,0 +1,102 @@
+/**
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ *
+ * 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.
+ */
+
+#include
+#ifdef MATTER_DM_PLUGIN_MEDIA_INPUT_SERVER
+#include "MediaInputManager.h"
+
+using namespace std;
+using namespace chip;
+using namespace chip::app::Clusters::MediaInput;
+
+MediaInputManager::MediaInputManager()
+{
+ struct InputData inputData1(1, chip::app::Clusters::MediaInput::InputTypeEnum::kHdmi, "HDMI 1",
+ "High-Definition Multimedia Interface");
+ mInputs.push_back(inputData1);
+ struct InputData inputData2(2, chip::app::Clusters::MediaInput::InputTypeEnum::kHdmi, "HDMI 2",
+ "High-Definition Multimedia Interface");
+ mInputs.push_back(inputData2);
+ struct InputData inputData3(3, chip::app::Clusters::MediaInput::InputTypeEnum::kHdmi, "HDMI 3",
+ "High-Definition Multimedia Interface");
+ mInputs.push_back(inputData3);
+
+ mCurrentInput = 1;
+}
+
+CHIP_ERROR MediaInputManager::HandleGetInputList(chip::app::AttributeValueEncoder & aEncoder)
+{
+ return aEncoder.EncodeList([this](const auto & encoder) -> CHIP_ERROR {
+ for (auto const & inputData : this->mInputs)
+ {
+ ReturnErrorOnFailure(encoder.Encode(inputData.GetEncodable()));
+ }
+ return CHIP_NO_ERROR;
+ });
+}
+
+uint8_t MediaInputManager::HandleGetCurrentInput()
+{
+ return mCurrentInput;
+}
+
+bool MediaInputManager::HandleSelectInput(const uint8_t index)
+{
+ for (auto const & inputData : mInputs)
+ {
+ if (inputData.index == index)
+ {
+ mCurrentInput = index;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool MediaInputManager::HandleShowInputStatus()
+{
+ ChipLogProgress(Zcl, " MediaInputManager::HandleShowInputStatus()");
+ for (auto const & inputData : mInputs)
+ {
+ ChipLogProgress(Zcl, " [%d] type=%d selected=%d name=%s desc=%s", inputData.index,
+ static_cast(inputData.inputType), (mCurrentInput == inputData.index ? 1 : 0),
+ inputData.name.c_str(), inputData.description.c_str());
+ }
+ return true;
+}
+
+bool MediaInputManager::HandleHideInputStatus()
+{
+ ChipLogProgress(Zcl, " MediaInputManager::HandleHideInputStatus()");
+ return true;
+}
+
+bool MediaInputManager::HandleRenameInput(const uint8_t index, const chip::CharSpan & newName)
+{
+ for (auto & inputData : mInputs)
+ {
+ if (inputData.index == index)
+ {
+ inputData.Rename(newName);
+ return true;
+ }
+ }
+
+ return false;
+}
+#endif // MATTER_DM_PLUGIN_MEDIA_INPUT_SERVER
diff --git a/examples/chef/common/clusters/media-input/MediaInputManager.h b/examples/chef/common/clusters/media-input/MediaInputManager.h
new file mode 100644
index 00000000000000..104db65e2bbe97
--- /dev/null
+++ b/examples/chef/common/clusters/media-input/MediaInputManager.h
@@ -0,0 +1,68 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include
+#include
+#include
+
+class MediaInputManager : public chip::app::Clusters::MediaInput::Delegate
+{
+ using InputInfoType = chip::app::Clusters::MediaInput::Structs::InputInfoStruct::Type;
+
+public:
+ MediaInputManager();
+
+ CHIP_ERROR HandleGetInputList(chip::app::AttributeValueEncoder & aEncoder) override;
+ uint8_t HandleGetCurrentInput() override;
+ bool HandleSelectInput(const uint8_t index) override;
+ bool HandleShowInputStatus() override;
+ bool HandleHideInputStatus() override;
+ bool HandleRenameInput(const uint8_t index, const chip::CharSpan & name) override;
+
+ struct InputData
+ {
+ uint8_t index;
+ chip::app::Clusters::MediaInput::InputTypeEnum inputType;
+ std::string name;
+ std::string description;
+
+ InputData(uint8_t i, chip::app::Clusters::MediaInput::InputTypeEnum t, const char * n, const char * d) :
+ index(i), inputType(t), name(n), description(d)
+ {}
+
+ void Rename(const chip::CharSpan & newName) { name.assign(newName.data(), newName.size()); }
+
+ InputInfoType GetEncodable() const
+ {
+ InputInfoType result;
+ result.index = index;
+ result.inputType = inputType;
+ result.name = chip::CharSpan::fromCharString(name.c_str());
+ result.description = chip::CharSpan::fromCharString(description.c_str());
+ return result;
+ }
+ };
+
+protected:
+ uint8_t mCurrentInput;
+ std::vector mInputs;
+
+private:
+};
diff --git a/examples/chef/common/clusters/media-playback/MediaPlaybackManager.cpp b/examples/chef/common/clusters/media-playback/MediaPlaybackManager.cpp
new file mode 100644
index 00000000000000..512da2966d68b6
--- /dev/null
+++ b/examples/chef/common/clusters/media-playback/MediaPlaybackManager.cpp
@@ -0,0 +1,339 @@
+/**
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ *
+ * 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.
+ */
+
+#include
+#ifdef MATTER_DM_PLUGIN_MEDIA_PLAYBACK_SERVER
+#include "MediaPlaybackManager.h"
+#include
+#include
+
+using namespace std;
+using namespace chip::app::DataModel;
+using namespace chip::app::Clusters::MediaPlayback;
+using namespace chip::Uint8;
+
+using chip::CharSpan;
+using chip::app::AttributeValueEncoder;
+using chip::app::CommandResponseHelper;
+
+PlaybackStateEnum MediaPlaybackManager::HandleGetCurrentState()
+{
+ return mCurrentState;
+}
+
+uint64_t MediaPlaybackManager::HandleGetStartTime()
+{
+ return mStartTime;
+}
+
+uint64_t MediaPlaybackManager::HandleGetDuration()
+{
+ return mDuration;
+}
+
+CHIP_ERROR MediaPlaybackManager::HandleGetSampledPosition(AttributeValueEncoder & aEncoder)
+{
+ return aEncoder.Encode(mPlaybackPosition);
+}
+
+float MediaPlaybackManager::HandleGetPlaybackSpeed()
+{
+ return mPlaybackSpeed;
+}
+
+uint64_t MediaPlaybackManager::HandleGetSeekRangeStart()
+{
+ return mStartTime;
+}
+
+uint64_t MediaPlaybackManager::HandleGetSeekRangeEnd()
+{
+ return mDuration;
+}
+
+CHIP_ERROR MediaPlaybackManager::HandleGetActiveAudioTrack(AttributeValueEncoder & aEncoder)
+{
+ return aEncoder.Encode(mActiveAudioTrack);
+}
+
+CHIP_ERROR MediaPlaybackManager::HandleGetAvailableAudioTracks(AttributeValueEncoder & aEncoder)
+{
+ return aEncoder.EncodeList([this](const auto & encoder) -> CHIP_ERROR {
+ for (auto const & audioTrack : mAvailableAudioTracks)
+ {
+ ReturnErrorOnFailure(encoder.Encode(audioTrack));
+ }
+ return CHIP_NO_ERROR;
+ });
+}
+
+CHIP_ERROR MediaPlaybackManager::HandleGetActiveTextTrack(AttributeValueEncoder & aEncoder)
+{
+ return aEncoder.Encode(mActiveTextTrack);
+}
+
+CHIP_ERROR MediaPlaybackManager::HandleGetAvailableTextTracks(AttributeValueEncoder & aEncoder)
+{
+ return aEncoder.EncodeList([this](const auto & encoder) -> CHIP_ERROR {
+ for (auto const & textTrack : mAvailableTextTracks)
+ {
+ ReturnErrorOnFailure(encoder.Encode(textTrack));
+ }
+ return CHIP_NO_ERROR;
+ });
+}
+
+void MediaPlaybackManager::HandlePlay(CommandResponseHelper & helper)
+{
+ mCurrentState = PlaybackStateEnum::kPlaying;
+ mPlaybackSpeed = 1;
+
+ Commands::PlaybackResponse::Type response;
+ response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
+ response.status = StatusEnum::kSuccess;
+ helper.Success(response);
+}
+
+void MediaPlaybackManager::HandlePause(CommandResponseHelper & helper)
+{
+ mCurrentState = PlaybackStateEnum::kPaused;
+ mPlaybackSpeed = 0;
+
+ Commands::PlaybackResponse::Type response;
+ response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
+ response.status = StatusEnum::kSuccess;
+ helper.Success(response);
+}
+
+void MediaPlaybackManager::HandleStop(CommandResponseHelper & helper)
+{
+ mCurrentState = PlaybackStateEnum::kNotPlaying;
+ mPlaybackSpeed = 0;
+ mPlaybackPosition = { 0, chip::app::DataModel::Nullable(0) };
+
+ Commands::PlaybackResponse::Type response;
+ response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
+ response.status = StatusEnum::kSuccess;
+ helper.Success(response);
+}
+
+void MediaPlaybackManager::HandleFastForward(CommandResponseHelper & helper,
+ const chip::Optional & audioAdvanceUnmuted)
+{
+ if (mPlaybackSpeed == kPlaybackMaxForwardSpeed)
+ {
+ // if already at max speed, return error
+ Commands::PlaybackResponse::Type response;
+ response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
+ response.status = StatusEnum::kSpeedOutOfRange;
+ helper.Success(response);
+ return;
+ }
+
+ mCurrentState = PlaybackStateEnum::kPlaying;
+ mPlaybackSpeed = (mPlaybackSpeed <= 0 ? 1 : mPlaybackSpeed * 2);
+ if (mPlaybackSpeed > kPlaybackMaxForwardSpeed)
+ {
+ // don't exceed max speed
+ mPlaybackSpeed = kPlaybackMaxForwardSpeed;
+ }
+
+ Commands::PlaybackResponse::Type response;
+ response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
+ response.status = StatusEnum::kSuccess;
+ helper.Success(response);
+}
+
+void MediaPlaybackManager::HandlePrevious(CommandResponseHelper & helper)
+{
+ mCurrentState = PlaybackStateEnum::kPlaying;
+ mPlaybackSpeed = 1;
+ mPlaybackPosition = { 0, chip::app::DataModel::Nullable(0) };
+
+ Commands::PlaybackResponse::Type response;
+ response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
+ response.status = StatusEnum::kSuccess;
+ helper.Success(response);
+}
+
+void MediaPlaybackManager::HandleRewind(CommandResponseHelper & helper,
+ const chip::Optional & audioAdvanceUnmuted)
+{
+ if (mPlaybackSpeed == kPlaybackMaxRewindSpeed)
+ {
+ // if already at max speed in reverse, return error
+ Commands::PlaybackResponse::Type response;
+ response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
+ response.status = StatusEnum::kSpeedOutOfRange;
+ helper.Success(response);
+ return;
+ }
+
+ mCurrentState = PlaybackStateEnum::kPlaying;
+ mPlaybackSpeed = (mPlaybackSpeed >= 0 ? -1 : mPlaybackSpeed * 2);
+ if (mPlaybackSpeed < kPlaybackMaxRewindSpeed)
+ {
+ // don't exceed max rewind speed
+ mPlaybackSpeed = kPlaybackMaxRewindSpeed;
+ }
+
+ Commands::PlaybackResponse::Type response;
+ response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
+ response.status = StatusEnum::kSuccess;
+ helper.Success(response);
+}
+
+void MediaPlaybackManager::HandleSkipBackward(CommandResponseHelper & helper,
+ const uint64_t & deltaPositionMilliseconds)
+{
+ uint64_t newPosition = (mPlaybackPosition.position.Value() > deltaPositionMilliseconds
+ ? mPlaybackPosition.position.Value() - deltaPositionMilliseconds
+ : 0);
+ mPlaybackPosition = { 0, chip::app::DataModel::Nullable(newPosition) };
+
+ Commands::PlaybackResponse::Type response;
+ response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
+ response.status = StatusEnum::kSuccess;
+ helper.Success(response);
+}
+
+void MediaPlaybackManager::HandleSkipForward(CommandResponseHelper & helper,
+ const uint64_t & deltaPositionMilliseconds)
+{
+ uint64_t newPosition = mPlaybackPosition.position.Value() + deltaPositionMilliseconds;
+ newPosition = newPosition > mDuration ? mDuration : newPosition;
+ mPlaybackPosition = { 0, chip::app::DataModel::Nullable(newPosition) };
+
+ Commands::PlaybackResponse::Type response;
+ response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
+ response.status = StatusEnum::kSuccess;
+ helper.Success(response);
+}
+
+void MediaPlaybackManager::HandleSeek(CommandResponseHelper & helper,
+ const uint64_t & positionMilliseconds)
+{
+ if (positionMilliseconds > mDuration)
+ {
+ Commands::PlaybackResponse::Type response;
+ response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
+ response.status = StatusEnum::kSeekOutOfRange;
+ helper.Success(response);
+ }
+ else
+ {
+ mPlaybackPosition = { 0, chip::app::DataModel::Nullable(positionMilliseconds) };
+
+ Commands::PlaybackResponse::Type response;
+ response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
+ response.status = StatusEnum::kSuccess;
+ helper.Success(response);
+ }
+}
+
+void MediaPlaybackManager::HandleNext(CommandResponseHelper & helper)
+{
+ mCurrentState = PlaybackStateEnum::kPlaying;
+ mPlaybackSpeed = 1;
+ mPlaybackPosition = { 0, chip::app::DataModel::Nullable(0) };
+
+ Commands::PlaybackResponse::Type response;
+ response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
+ response.status = StatusEnum::kSuccess;
+ helper.Success(response);
+}
+
+void MediaPlaybackManager::HandleStartOver(CommandResponseHelper & helper)
+{
+ mPlaybackPosition = { 0, chip::app::DataModel::Nullable(0) };
+
+ Commands::PlaybackResponse::Type response;
+ response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
+ response.status = StatusEnum::kSuccess;
+ helper.Success(response);
+}
+
+bool MediaPlaybackManager::HandleActivateAudioTrack(const chip::CharSpan & trackId, const uint8_t & audioOutputIndex)
+{
+ std::string idString(trackId.data(), trackId.size());
+ for (auto const & availableAudioTrack : mAvailableAudioTracks)
+ {
+ std::string nextIdString(availableAudioTrack.id.data(), availableAudioTrack.id.size());
+ if (nextIdString == idString)
+ {
+ mActiveAudioTrack = availableAudioTrack;
+ return true;
+ }
+ }
+ return false;
+}
+
+bool MediaPlaybackManager::HandleActivateTextTrack(const chip::CharSpan & trackId)
+{
+ std::string idString(trackId.data(), trackId.size());
+ for (auto const & availableTextTrack : mAvailableTextTracks)
+ {
+ std::string nextIdString(availableTextTrack.id.data(), availableTextTrack.id.size());
+ if (nextIdString == idString)
+ {
+ mActiveTextTrack = availableTextTrack;
+ return true;
+ }
+ }
+ return false;
+}
+
+bool MediaPlaybackManager::HandleDeactivateTextTrack()
+{
+ // Handle Deactivate Text Track
+ if (mActiveTextTrack.id.data() != nullptr)
+ {
+ mActiveTextTrack = {};
+ }
+ return true;
+}
+
+uint32_t MediaPlaybackManager::GetFeatureMap(chip::EndpointId endpoint)
+{
+ if (endpoint >= MATTER_DM_MEDIA_PLAYBACK_CLUSTER_SERVER_ENDPOINT_COUNT)
+ {
+ return mDynamicEndpointFeatureMap;
+ }
+
+ uint32_t featureMap = 0;
+ Attributes::FeatureMap::Get(endpoint, &featureMap);
+ return featureMap;
+}
+
+uint16_t MediaPlaybackManager::GetClusterRevision(chip::EndpointId endpoint)
+{
+ if (endpoint >= MATTER_DM_MEDIA_PLAYBACK_CLUSTER_SERVER_ENDPOINT_COUNT)
+ {
+ return kClusterRevision;
+ }
+
+ uint16_t clusterRevision = 0;
+ bool success =
+ (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == chip::Protocols::InteractionModel::Status::Success);
+ if (!success)
+ {
+ ChipLogError(Zcl, "MediaPlaybackManager::GetClusterRevision error reading cluster revision");
+ }
+ return clusterRevision;
+}
+
+#endif /// MATTER_DM_PLUGIN_MEDIA_PLAYBACK_SERVER
diff --git a/examples/chef/common/clusters/media-playback/MediaPlaybackManager.h b/examples/chef/common/clusters/media-playback/MediaPlaybackManager.h
new file mode 100644
index 00000000000000..79bca10a3c8fb6
--- /dev/null
+++ b/examples/chef/common/clusters/media-playback/MediaPlaybackManager.h
@@ -0,0 +1,117 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include
+#include
+
+class MediaPlaybackManager : public chip::app::Clusters::MediaPlayback::Delegate
+{
+ using PlaybackResponseType = chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::Type;
+ using PlaybackPositionType = chip::app::Clusters::MediaPlayback::Structs::PlaybackPositionStruct::Type;
+ using TrackType = chip::app::Clusters::MediaPlayback::Structs::TrackStruct::Type;
+ using TrackAttributesType = chip::app::Clusters::MediaPlayback::Structs::TrackAttributesStruct::Type;
+ using Feature = chip::app::Clusters::MediaPlayback::Feature;
+
+public:
+ chip::app::Clusters::MediaPlayback::PlaybackStateEnum HandleGetCurrentState() override;
+ uint64_t HandleGetStartTime() override;
+ uint64_t HandleGetDuration() override;
+ CHIP_ERROR HandleGetSampledPosition(chip::app::AttributeValueEncoder & aEncoder) override;
+ float HandleGetPlaybackSpeed() override;
+ uint64_t HandleGetSeekRangeStart() override;
+ uint64_t HandleGetSeekRangeEnd() override;
+ CHIP_ERROR HandleGetActiveAudioTrack(chip::app::AttributeValueEncoder & aEncoder) override;
+ CHIP_ERROR HandleGetAvailableAudioTracks(chip::app::AttributeValueEncoder & aEncoder) override;
+ CHIP_ERROR HandleGetActiveTextTrack(chip::app::AttributeValueEncoder & aEncoder) override;
+ CHIP_ERROR HandleGetAvailableTextTracks(chip::app::AttributeValueEncoder & aEncoder) override;
+
+ void HandlePlay(chip::app::CommandResponseHelper & helper) override;
+ void HandlePause(chip::app::CommandResponseHelper & helper) override;
+ void HandleStop(chip::app::CommandResponseHelper & helper) override;
+ void HandleFastForward(chip::app::CommandResponseHelper & helper,
+ const chip::Optional & audioAdvanceUnmuted) override;
+ void HandlePrevious(chip::app::CommandResponseHelper & helper) override;
+ void HandleRewind(chip::app::CommandResponseHelper & helper,
+ const chip::Optional & audioAdvanceUnmuted) override;
+ void HandleSkipBackward(chip::app::CommandResponseHelper & helper,
+ const uint64_t & deltaPositionMilliseconds) override;
+ void HandleSkipForward(chip::app::CommandResponseHelper & helper,
+ const uint64_t & deltaPositionMilliseconds) override;
+ void HandleSeek(chip::app::CommandResponseHelper & helper,
+ const uint64_t & positionMilliseconds) override;
+ void HandleNext(chip::app::CommandResponseHelper & helper) override;
+ void HandleStartOver(chip::app::CommandResponseHelper & helper) override;
+ bool HandleActivateAudioTrack(const chip::CharSpan & trackId, const uint8_t & audioOutputIndex) override;
+ bool HandleActivateTextTrack(const chip::CharSpan & trackId) override;
+ bool HandleDeactivateTextTrack() override;
+
+ uint32_t GetFeatureMap(chip::EndpointId endpoint) override;
+ uint16_t GetClusterRevision(chip::EndpointId endpoint) override;
+
+protected:
+ // NOTE: it does not make sense to have default state of playing with a speed of 0, but
+ // the CI test cases expect these values, and need to be fixed.
+ chip::app::Clusters::MediaPlayback::PlaybackStateEnum mCurrentState =
+ chip::app::Clusters::MediaPlayback::PlaybackStateEnum::kPlaying;
+ PlaybackPositionType mPlaybackPosition = { 0, chip::app::DataModel::Nullable(0) };
+ TrackType mActiveAudioTrack = { chip::CharSpan("activeAudioTrackId_0", 20),
+ chip::app::DataModel::Nullable(
+ { chip::CharSpan("languageCode1", 13),
+ chip::Optional>(
+ { chip::app::DataModel::MakeNullable(chip::CharSpan("displayName1", 12)) }) }) };
+ std::vector mAvailableAudioTracks = {
+ { chip::CharSpan("activeAudioTrackId_0", 20),
+ chip::app::DataModel::Nullable(
+ { chip::CharSpan("languageCode1", 13),
+ chip::Optional>(
+ { chip::app::DataModel::MakeNullable(chip::CharSpan("displayName1", 12)) }) }) },
+ { chip::CharSpan("activeAudioTrackId_1", 20),
+ chip::app::DataModel::Nullable(
+ { chip::CharSpan("languageCode2", 13),
+ chip::Optional>(
+ { chip::app::DataModel::MakeNullable(chip::CharSpan("displayName2", 12)) }) }) }
+ };
+ TrackType mActiveTextTrack = {};
+ std::vector mAvailableTextTracks = {
+ { chip::CharSpan("activeTextTrackId_0", 19),
+ chip::app::DataModel::Nullable(
+ { chip::CharSpan("languageCode1", 13),
+ chip::Optional>(
+ { chip::app::DataModel::MakeNullable(chip::CharSpan("displayName1", 12)) }) }) },
+ { chip::CharSpan("activeTextTrackId_1", 19),
+ chip::app::DataModel::Nullable(
+ { chip::CharSpan("languageCode2", 13),
+ chip::Optional>(
+ { chip::app::DataModel::MakeNullable(chip::CharSpan("displayName2", 12)) }) }) }
+ };
+ float mPlaybackSpeed = 1.0;
+ uint64_t mStartTime = 0;
+ // Magic number for testing.
+ uint64_t mDuration = 80000;
+ bool mAudioAdvanceMuted = false;
+
+ static const int kPlaybackMaxForwardSpeed = 10;
+ static const int kPlaybackMaxRewindSpeed = -10;
+
+private:
+ static constexpr uint32_t mDynamicEndpointFeatureMap =
+ chip::BitMask(Feature::kAdvancedSeek, Feature::kVariableSpeed).Raw();
+ static constexpr uint16_t kClusterRevision = 2;
+};
diff --git a/examples/chef/common/clusters/target-navigator/TargetNavigatorManager.cpp b/examples/chef/common/clusters/target-navigator/TargetNavigatorManager.cpp
new file mode 100644
index 00000000000000..17acf11b39bf23
--- /dev/null
+++ b/examples/chef/common/clusters/target-navigator/TargetNavigatorManager.cpp
@@ -0,0 +1,94 @@
+/**
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ *
+ * 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.
+ */
+
+#include
+#ifdef MATTER_DM_PLUGIN_TARGET_NAVIGATOR_SERVER
+#include "TargetNavigatorManager.h"
+#include
+
+using namespace std;
+using namespace chip::app;
+using namespace chip::app::Clusters::TargetNavigator;
+
+using chip::CharSpan;
+using chip::app::AttributeValueEncoder;
+using chip::app::CommandResponseHelper;
+
+TargetNavigatorManager::TargetNavigatorManager(std::list targets, uint8_t currentTarget)
+{
+ mTargets = targets;
+ mCurrentTarget = currentTarget;
+}
+
+CHIP_ERROR TargetNavigatorManager::HandleGetTargetList(AttributeValueEncoder & aEncoder)
+{
+ // NOTE: the ids for each target start at 1 so that we can reserve 0 as "no current target"
+ return aEncoder.EncodeList([this](const auto & encoder) -> CHIP_ERROR {
+ int i = 0;
+ for (std::string & entry : mTargets)
+ {
+ Structs::TargetInfoStruct::Type outputInfo;
+ outputInfo.identifier = static_cast(i + 1);
+ outputInfo.name = CharSpan::fromCharString(entry.c_str());
+ ReturnErrorOnFailure(encoder.Encode(outputInfo));
+ i++;
+ }
+ return CHIP_NO_ERROR;
+ });
+}
+
+uint8_t TargetNavigatorManager::HandleGetCurrentTarget()
+{
+ return mCurrentTarget;
+}
+
+void TargetNavigatorManager::HandleNavigateTarget(CommandResponseHelper & helper,
+ const uint64_t & target, const CharSpan & data)
+{
+ NavigateTargetResponseType response;
+ if (target == kNoCurrentTarget || target > mTargets.size())
+ {
+ response.data = chip::MakeOptional(CharSpan::fromCharString("error"));
+ response.status = StatusEnum::kTargetNotFound;
+ helper.Success(response);
+ return;
+ }
+ mCurrentTarget = static_cast(target);
+
+ response.data = chip::MakeOptional(CharSpan::fromCharString("data response"));
+ response.status = StatusEnum::kSuccess;
+ helper.Success(response);
+}
+
+uint16_t TargetNavigatorManager::GetClusterRevision(chip::EndpointId endpoint)
+{
+ if (endpoint >= MATTER_DM_TARGET_NAVIGATOR_CLUSTER_SERVER_ENDPOINT_COUNT)
+ {
+ return kClusterRevision;
+ }
+
+ uint16_t clusterRevision = 0;
+ bool success =
+ (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == chip::Protocols::InteractionModel::Status::Success);
+ if (!success)
+ {
+ ChipLogError(Zcl, "TargetNavigatorManager::GetClusterRevision error reading cluster revision");
+ }
+
+ return clusterRevision;
+}
+#endif // MATTER_DM_PLUGIN_TARGET_NAVIGATOR_SERVER
diff --git a/examples/chef/common/clusters/target-navigator/TargetNavigatorManager.h b/examples/chef/common/clusters/target-navigator/TargetNavigatorManager.h
new file mode 100644
index 00000000000000..21a08b9595cd82
--- /dev/null
+++ b/examples/chef/common/clusters/target-navigator/TargetNavigatorManager.h
@@ -0,0 +1,45 @@
+/**
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include
+
+class TargetNavigatorManager : public chip::app::Clusters::TargetNavigator::Delegate
+{
+ using TargetInfoType = chip::app::Clusters::TargetNavigator::Structs::TargetInfoStruct::Type;
+ using NavigateTargetResponseType = chip::app::Clusters::TargetNavigator::Commands::NavigateTargetResponse::Type;
+
+public:
+ TargetNavigatorManager() : TargetNavigatorManager({ "exampleName", "exampleName" }, kNoCurrentTarget){};
+ TargetNavigatorManager(std::list targets, uint8_t currentTarget);
+
+ CHIP_ERROR HandleGetTargetList(chip::app::AttributeValueEncoder & aEncoder) override;
+ uint8_t HandleGetCurrentTarget() override;
+ void HandleNavigateTarget(chip::app::CommandResponseHelper & responser, const uint64_t & target,
+ const chip::CharSpan & data) override;
+ uint16_t GetClusterRevision(chip::EndpointId endpoint) override;
+
+protected:
+ // NOTE: the ids for each target start at 1 so that we can reserve 0 as "no current target"
+ static const uint8_t kNoCurrentTarget = 0;
+ std::list mTargets;
+ uint8_t mCurrentTarget;
+
+private:
+ static constexpr uint16_t kClusterRevision = 2;
+};
diff --git a/examples/chef/common/clusters/wake-on-lan/WakeOnLanManager.cpp b/examples/chef/common/clusters/wake-on-lan/WakeOnLanManager.cpp
new file mode 100644
index 00000000000000..5f4e2e1ec7b6e2
--- /dev/null
+++ b/examples/chef/common/clusters/wake-on-lan/WakeOnLanManager.cpp
@@ -0,0 +1,68 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include
+#ifdef MATTER_DM_PLUGIN_WAKE_ON_LAN_SERVER
+#include "WakeOnLanManager.h"
+#include
+#include
+#include
+#include
+#include
+
+constexpr char kNullHexMACAddress[] = "000000000000";
+
+using namespace chip;
+using namespace chip::app::Clusters::WakeOnLan;
+
+std::string getMacAddress()
+{
+ uint8_t macBuffer[chip::DeviceLayer::ConfigurationManager::kPrimaryMACAddressLength];
+ MutableByteSpan mac(macBuffer);
+ if (chip::DeviceLayer::ConfigurationMgr().GetPrimaryMACAddress(mac) != CHIP_NO_ERROR)
+ {
+ ChipLogProgress(Zcl, "WakeOnLanManager::getMacAddress no primary MAC configured by DeviceLayer");
+ return kNullHexMACAddress;
+ }
+
+ char macStr[chip::DeviceLayer::ConfigurationManager::kPrimaryMACAddressLength * 2 + 1] = { 0 }; // added null char
+ if (BytesToHex(&macBuffer[0], sizeof(macBuffer), &macStr[0], sizeof(macBuffer) * 2u, chip::Encoding::HexFlags::kUppercase) !=
+ CHIP_NO_ERROR)
+ {
+ ChipLogProgress(Zcl, "WakeOnLanManager::getMacAddress hex conversion failed");
+ return kNullHexMACAddress;
+ }
+
+ return std::string(macStr);
+}
+
+CHIP_ERROR WakeOnLanManager::HandleGetMacAddress(chip::app::AttributeValueEncoder & aEncoder)
+{
+ ChipLogProgress(Zcl, "WakeOnLanManager::HandleGetMacAddress");
+
+ // Spec REQUIRES 48-bit mac addresses. This means at least Thread devices will
+ // fail here.
+ if (chip::DeviceLayer::ConfigurationManager::kPrimaryMACAddressLength != 6)
+ {
+ ChipLogError(Zcl, "WakeOnLanManager: primary MAC address is not 48-bit");
+ return CHIP_ERROR_BUFFER_TOO_SMALL;
+ }
+
+ return aEncoder.Encode(CharSpan::fromCharString(getMacAddress().c_str()));
+}
+#endif // MATTER_DM_PLUGIN_WAKE_ON_LAN_SERVER
diff --git a/examples/chef/common/clusters/wake-on-lan/WakeOnLanManager.h b/examples/chef/common/clusters/wake-on-lan/WakeOnLanManager.h
new file mode 100644
index 00000000000000..63217020e9ab11
--- /dev/null
+++ b/examples/chef/common/clusters/wake-on-lan/WakeOnLanManager.h
@@ -0,0 +1,27 @@
+/*
+ *
+ * Copyright (c) 2021 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include
+
+class WakeOnLanManager : public chip::app::Clusters::WakeOnLan::Delegate
+{
+public:
+ CHIP_ERROR HandleGetMacAddress(chip::app::AttributeValueEncoder & aEncoder) override;
+};
diff --git a/examples/chef/common/stubs.cpp b/examples/chef/common/stubs.cpp
index cff7ffdee4679f..48c48620c98fb0 100644
--- a/examples/chef/common/stubs.cpp
+++ b/examples/chef/common/stubs.cpp
@@ -22,6 +22,8 @@
using chip::app::DataModel::Nullable;
using namespace chip;
+using namespace chip::app;
+using namespace chip::app::Clusters;
Protocols::InteractionModel::Status emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId,
const EmberAfAttributeMetadata * attributeMetadata,
@@ -341,14 +343,127 @@ bool emberAfPluginDoorLockSetCredential(chip::EndpointId endpointId, uint16_t cr
#endif /* MATTER_DM_PLUGIN_DOOR_LOCK_SERVER */
+void emberAfPluginSmokeCoAlarmSelfTestRequestCommand(EndpointId endpointId) {}
+
+void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & attributePath, uint8_t type, uint16_t size,
+ uint8_t * value)
+{
+ ClusterId clusterId = attributePath.mClusterId;
+ AttributeId attributeId = attributePath.mAttributeId;
+ ChipLogProgress(Zcl, "Cluster callback: " ChipLogFormatMEI, ChipLogValueMEI(clusterId));
+
+ if (clusterId == OnOff::Id && attributeId == OnOff::Attributes::OnOff::Id)
+ {
+ ChipLogProgress(Zcl, "OnOff attribute ID: " ChipLogFormatMEI " Type: %u Value: %u, length %u", ChipLogValueMEI(attributeId),
+ type, *value, size);
+ }
+ else if (clusterId == LevelControl::Id)
+ {
+ ChipLogProgress(Zcl, "Level Control attribute ID: " ChipLogFormatMEI " Type: %u Value: %u, length %u",
+ ChipLogValueMEI(attributeId), type, *value, size);
+
+ // WIP Apply attribute change to Light
+ }
+}
+
+/** @brief OnOff Cluster Init
+ *
+ * This function is called when a specific cluster is initialized. It gives the
+ * application an opportunity to take care of cluster initialization procedures.
+ * It is called exactly once for each endpoint where cluster is present.
+ *
+ * TODO Issue #3841
+ * emberAfOnOffClusterInitCallback happens before the stack initialize the cluster
+ * attributes to the default value.
+ * The logic here expects something similar to the deprecated Plugins callback
+ * emberAfPluginOnOffClusterServerPostInitCallback.
+ *
+ */
+void emberAfOnOffClusterInitCallback(EndpointId endpoint) {}
+
+#ifdef MATTER_DM_PLUGIN_AUDIO_OUTPUT_SERVER
+#include "audio-output/AudioOutputManager.h"
+static AudioOutputManager audioOutputManager;
+
+void emberAfAudioOutputClusterInitCallback(EndpointId endpoint)
+{
+ ChipLogProgress(Zcl, "TV Linux App: AudioOutput::SetDefaultDelegate");
+ AudioOutput::SetDefaultDelegate(endpoint, &audioOutputManager);
+}
+#endif
+
#ifdef MATTER_DM_PLUGIN_CHANNEL_SERVER
-#include
+#include "channel/ChannelManager.h"
+static ChannelManager channelManager;
void emberAfChannelClusterInitCallback(EndpointId endpoint)
{
- app::Clusters::Channel::SetDefaultDelegate(endpoint,
- static_cast(&(ChefChannelManager::Instance())));
+ ChipLogProgress(Zcl, "TV Linux App: Channel::SetDefaultDelegate");
+ Channel::SetDefaultDelegate(endpoint, &channelManager);
}
-#endif // MATTER_DM_PLUGIN_CHANNEL_SERVER
+#endif
-void emberAfPluginSmokeCoAlarmSelfTestRequestCommand(EndpointId endpointId) {}
+#ifdef MATTER_DM_PLUGIN_KEYPAD_INPUT_SERVER
+#include "keypad-input/KeypadInputManager.h"
+static KeypadInputManager keypadInputManager;
+
+void emberAfKeypadInputClusterInitCallback(EndpointId endpoint)
+{
+ ChipLogProgress(Zcl, "TV Linux App: KeypadInput::SetDefaultDelegate");
+ KeypadInput::SetDefaultDelegate(endpoint, &keypadInputManager);
+}
+#endif
+
+#ifdef MATTER_DM_PLUGIN_LOW_POWER_SERVER
+#include "low-power/LowPowerManager.h"
+static LowPowerManager lowPowerManager;
+
+void emberAfLowPowerClusterInitCallback(EndpointId endpoint)
+{
+ ChipLogProgress(Zcl, "TV Linux App: LowPower::SetDefaultDelegate");
+ LowPower::SetDefaultDelegate(endpoint, &lowPowerManager);
+}
+#endif
+
+#ifdef MATTER_DM_PLUGIN_MEDIA_INPUT_SERVER
+#include "media-input/MediaInputManager.h"
+static MediaInputManager mediaInputManager;
+void emberAfMediaInputClusterInitCallback(EndpointId endpoint)
+{
+ ChipLogProgress(Zcl, "TV Linux App: MediaInput::SetDefaultDelegate");
+ MediaInput::SetDefaultDelegate(endpoint, &mediaInputManager);
+}
+#endif
+
+#ifdef MATTER_DM_PLUGIN_MEDIA_PLAYBACK_SERVER
+#include "media-playback/MediaPlaybackManager.h"
+static MediaPlaybackManager mediaPlaybackManager;
+
+void emberAfMediaPlaybackClusterInitCallback(EndpointId endpoint)
+{
+ ChipLogProgress(Zcl, "TV Linux App: MediaPlayback::SetDefaultDelegate");
+ MediaPlayback::SetDefaultDelegate(endpoint, &mediaPlaybackManager);
+}
+#endif
+
+#ifdef MATTER_DM_PLUGIN_TARGET_NAVIGATOR_SERVER
+#include "target-navigator/TargetNavigatorManager.h"
+static TargetNavigatorManager targetNavigatorManager;
+
+void emberAfTargetNavigatorClusterInitCallback(EndpointId endpoint)
+{
+ ChipLogProgress(Zcl, "TV Linux App: TargetNavigator::SetDefaultDelegate");
+ TargetNavigator::SetDefaultDelegate(endpoint, &targetNavigatorManager);
+}
+#endif
+
+#ifdef MATTER_DM_PLUGIN_WAKE_ON_LAN_SERVER
+#include "wake-on-lan/WakeOnLanManager.h"
+static WakeOnLanManager wakeOnLanManager;
+
+void emberAfWakeOnLanClusterInitCallback(EndpointId endpoint)
+{
+ ChipLogProgress(Zcl, "TV Linux App: WakeOnLanManager::SetDefaultDelegate");
+ WakeOnLan::SetDefaultDelegate(endpoint, &wakeOnLanManager);
+}
+#endif
diff --git a/examples/chef/devices/rootnode_airpurifier_73a6fe2651.matter b/examples/chef/devices/rootnode_airpurifier_73a6fe2651.matter
index 554cdfa7e42e23..bcc9bd054ff722 100644
--- a/examples/chef/devices/rootnode_airpurifier_73a6fe2651.matter
+++ b/examples/chef/devices/rootnode_airpurifier_73a6fe2651.matter
@@ -1250,7 +1250,7 @@ cluster ActivatedCarbonFilterMonitoring = 114 {
}
/** An interface for controlling a fan in a heating/cooling system. */
-provisional cluster FanControl = 514 {
+cluster FanControl = 514 {
revision 4;
enum AirflowDirectionEnum : enum8 {
diff --git a/examples/chef/devices/rootnode_airpurifier_airqualitysensor_temperaturesensor_humiditysensor_thermostat_56de3d5f45.matter b/examples/chef/devices/rootnode_airpurifier_airqualitysensor_temperaturesensor_humiditysensor_thermostat_56de3d5f45.matter
index 734ed039932a9f..e827ce800b081d 100644
--- a/examples/chef/devices/rootnode_airpurifier_airqualitysensor_temperaturesensor_humiditysensor_thermostat_56de3d5f45.matter
+++ b/examples/chef/devices/rootnode_airpurifier_airqualitysensor_temperaturesensor_humiditysensor_thermostat_56de3d5f45.matter
@@ -1518,7 +1518,7 @@ cluster Thermostat = 513 {
}
/** An interface for controlling a fan in a heating/cooling system. */
-provisional cluster FanControl = 514 {
+cluster FanControl = 514 {
revision 4;
enum AirflowDirectionEnum : enum8 {
diff --git a/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.matter b/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.matter
index c5c71d597ebe74..d8fb307e9d8579 100644
--- a/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.matter
+++ b/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.matter
@@ -1,6 +1,56 @@
// This IDL was generated automatically by ZAP.
// It is for view/code review purposes only.
+/** Attributes and commands for putting a device into Identification mode (e.g. flashing a light). */
+cluster Identify = 3 {
+ revision 4;
+
+ enum EffectIdentifierEnum : enum8 {
+ kBlink = 0;
+ kBreathe = 1;
+ kOkay = 2;
+ kChannelChange = 11;
+ kFinishEffect = 254;
+ kStopEffect = 255;
+ }
+
+ enum EffectVariantEnum : enum8 {
+ kDefault = 0;
+ }
+
+ enum IdentifyTypeEnum : enum8 {
+ kNone = 0;
+ kLightOutput = 1;
+ kVisibleIndicator = 2;
+ kAudibleBeep = 3;
+ kDisplay = 4;
+ kActuator = 5;
+ }
+
+ attribute int16u identifyTime = 0;
+ readonly attribute IdentifyTypeEnum identifyType = 1;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+
+ request struct IdentifyRequest {
+ int16u identifyTime = 0;
+ }
+
+ request struct TriggerEffectRequest {
+ EffectIdentifierEnum effectIdentifier = 0;
+ EffectVariantEnum effectVariant = 1;
+ }
+
+ /** Command description for Identify */
+ command access(invoke: manage) Identify(IdentifyRequest): DefaultSuccess = 0;
+ /** Command description for TriggerEffect */
+ command access(invoke: manage) TriggerEffect(TriggerEffectRequest): DefaultSuccess = 64;
+}
+
/** Attributes and commands for switching devices between 'On' and 'Off' states. */
cluster OnOff = 6 {
revision 6;
@@ -73,6 +123,131 @@ cluster OnOff = 6 {
command OnWithTimedOff(OnWithTimedOffRequest): DefaultSuccess = 66;
}
+/** Attributes and commands for controlling devices that can be set to a level between fully 'On' and fully 'Off.' */
+cluster LevelControl = 8 {
+ revision 5;
+
+ enum MoveModeEnum : enum8 {
+ kUp = 0;
+ kDown = 1;
+ }
+
+ enum StepModeEnum : enum8 {
+ kUp = 0;
+ kDown = 1;
+ }
+
+ bitmap Feature : bitmap32 {
+ kOnOff = 0x1;
+ kLighting = 0x2;
+ kFrequency = 0x4;
+ }
+
+ bitmap OptionsBitmap : bitmap8 {
+ kExecuteIfOff = 0x1;
+ kCoupleColorTempToLevel = 0x2;
+ }
+
+ readonly attribute nullable int8u currentLevel = 0;
+ readonly attribute optional int16u remainingTime = 1;
+ readonly attribute optional int8u minLevel = 2;
+ readonly attribute optional int8u maxLevel = 3;
+ readonly attribute optional int16u currentFrequency = 4;
+ readonly attribute optional int16u minFrequency = 5;
+ readonly attribute optional int16u maxFrequency = 6;
+ attribute OptionsBitmap options = 15;
+ attribute optional int16u onOffTransitionTime = 16;
+ attribute nullable int8u onLevel = 17;
+ attribute optional nullable int16u onTransitionTime = 18;
+ attribute optional nullable int16u offTransitionTime = 19;
+ attribute optional nullable int8u defaultMoveRate = 20;
+ attribute access(write: manage) optional nullable int8u startUpCurrentLevel = 16384;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+
+ request struct MoveToLevelRequest {
+ int8u level = 0;
+ nullable int16u transitionTime = 1;
+ OptionsBitmap optionsMask = 2;
+ OptionsBitmap optionsOverride = 3;
+ }
+
+ request struct MoveRequest {
+ MoveModeEnum moveMode = 0;
+ nullable int8u rate = 1;
+ OptionsBitmap optionsMask = 2;
+ OptionsBitmap optionsOverride = 3;
+ }
+
+ request struct StepRequest {
+ StepModeEnum stepMode = 0;
+ int8u stepSize = 1;
+ nullable int16u transitionTime = 2;
+ OptionsBitmap optionsMask = 3;
+ OptionsBitmap optionsOverride = 4;
+ }
+
+ request struct StopRequest {
+ OptionsBitmap optionsMask = 0;
+ OptionsBitmap optionsOverride = 1;
+ }
+
+ request struct MoveToLevelWithOnOffRequest {
+ int8u level = 0;
+ nullable int16u transitionTime = 1;
+ OptionsBitmap optionsMask = 2;
+ OptionsBitmap optionsOverride = 3;
+ }
+
+ request struct MoveWithOnOffRequest {
+ MoveModeEnum moveMode = 0;
+ nullable int8u rate = 1;
+ OptionsBitmap optionsMask = 2;
+ OptionsBitmap optionsOverride = 3;
+ }
+
+ request struct StepWithOnOffRequest {
+ StepModeEnum stepMode = 0;
+ int8u stepSize = 1;
+ nullable int16u transitionTime = 2;
+ OptionsBitmap optionsMask = 3;
+ OptionsBitmap optionsOverride = 4;
+ }
+
+ request struct StopWithOnOffRequest {
+ OptionsBitmap optionsMask = 0;
+ OptionsBitmap optionsOverride = 1;
+ }
+
+ request struct MoveToClosestFrequencyRequest {
+ int16u frequency = 0;
+ }
+
+ /** Command description for MoveToLevel */
+ command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0;
+ /** Command description for Move */
+ command Move(MoveRequest): DefaultSuccess = 1;
+ /** Command description for Step */
+ command Step(StepRequest): DefaultSuccess = 2;
+ /** Command description for Stop */
+ command Stop(StopRequest): DefaultSuccess = 3;
+ /** Command description for MoveToLevelWithOnOff */
+ command MoveToLevelWithOnOff(MoveToLevelWithOnOffRequest): DefaultSuccess = 4;
+ /** Command description for MoveWithOnOff */
+ command MoveWithOnOff(MoveWithOnOffRequest): DefaultSuccess = 5;
+ /** Command description for StepWithOnOff */
+ command StepWithOnOff(StepWithOnOffRequest): DefaultSuccess = 6;
+ /** Command description for StopWithOnOff */
+ command StopWithOnOff(StopWithOnOffRequest): DefaultSuccess = 7;
+ /** Change the currrent frequency to the provided one, or a close
+ approximation if the exact provided one is not possible. */
+ command MoveToClosestFrequency(MoveToClosestFrequencyRequest): DefaultSuccess = 8;
+}
+
/** The Descriptor Cluster is meant to replace the support from the Zigbee Device Object (ZDO) for describing a node, its endpoints and clusters. */
cluster Descriptor = 29 {
revision 2;
@@ -449,50 +624,6 @@ cluster LocalizationConfiguration = 43 {
readonly attribute int16u clusterRevision = 65533;
}
-/** Nodes should be expected to be deployed to any and all regions of the world. These global regions
- may have differing preferences for how dates and times are conveyed. As such, Nodes that visually
- or audibly convey time information need a mechanism by which they can be configured to use a
- user’s preferred format. */
-cluster TimeFormatLocalization = 44 {
- revision 1; // NOTE: Default/not specifically set
-
- enum CalendarTypeEnum : enum8 {
- kBuddhist = 0;
- kChinese = 1;
- kCoptic = 2;
- kEthiopian = 3;
- kGregorian = 4;
- kHebrew = 5;
- kIndian = 6;
- kIslamic = 7;
- kJapanese = 8;
- kKorean = 9;
- kPersian = 10;
- kTaiwanese = 11;
- kUseActiveLocale = 255;
- }
-
- enum HourFormatEnum : enum8 {
- k12hr = 0;
- k24hr = 1;
- kUseActiveLocale = 255;
- }
-
- bitmap Feature : bitmap32 {
- kCalendarFormat = 0x1;
- }
-
- attribute access(write: manage) HourFormatEnum hourFormat = 0;
- attribute access(write: manage) optional CalendarTypeEnum activeCalendarType = 1;
- readonly attribute optional CalendarTypeEnum supportedCalendarTypes[] = 2;
- readonly attribute command_id generatedCommandList[] = 65528;
- readonly attribute command_id acceptedCommandList[] = 65529;
- readonly attribute event_id eventList[] = 65530;
- readonly attribute attrib_id attributeList[] = 65531;
- readonly attribute bitmap32 featureMap = 65532;
- readonly attribute int16u clusterRevision = 65533;
-}
-
/** This cluster is used to manage global aspects of the Commissioning flow. */
cluster GeneralCommissioning = 48 {
revision 1; // NOTE: Default/not specifically set
@@ -1942,14 +2073,6 @@ endpoint 0 {
ram attribute clusterRevision default = 1;
}
- server cluster TimeFormatLocalization {
- persist attribute hourFormat default = 0;
- persist attribute activeCalendarType default = 0;
- callback attribute supportedCalendarTypes;
- ram attribute featureMap default = 0;
- ram attribute clusterRevision default = 1;
- }
-
server cluster GeneralCommissioning {
ram attribute breadcrumb default = 0x0000000000000000;
callback attribute basicCommissioningInfo;
@@ -2031,7 +2154,7 @@ endpoint 0 {
callback attribute windowStatus;
callback attribute adminFabricIndex;
callback attribute adminVendorId;
- ram attribute featureMap default = 0;
+ ram attribute featureMap default = 1;
ram attribute clusterRevision default = 0x0001;
handle command OpenCommissioningWindow;
@@ -2096,7 +2219,7 @@ endpoint 1 {
callback attribute eventList;
callback attribute attributeList;
ram attribute featureMap default = 0;
- ram attribute clusterRevision default = 4;
+ ram attribute clusterRevision default = 6;
handle command Off;
handle command On;
@@ -2117,6 +2240,7 @@ endpoint 1 {
}
server cluster WakeOnLan {
+ ram attribute MACAddress;
callback attribute generatedCommandList;
callback attribute acceptedCommandList;
callback attribute eventList;
@@ -2143,7 +2267,9 @@ endpoint 1 {
}
server cluster TargetNavigator {
+ emits event TargetUpdated;
callback attribute targetList;
+ ram attribute currentTarget default = 0;
callback attribute generatedCommandList;
callback attribute acceptedCommandList;
callback attribute eventList;
@@ -2156,18 +2282,33 @@ endpoint 1 {
}
server cluster MediaPlayback {
+ emits event StateChanged;
ram attribute currentState default = 0x00;
+ ram attribute startTime default = 0x00;
+ ram attribute duration default = 0;
+ callback attribute sampledPosition;
+ ram attribute playbackSpeed default = 0;
+ ram attribute seekRangeEnd;
+ ram attribute seekRangeStart;
callback attribute generatedCommandList;
callback attribute acceptedCommandList;
callback attribute eventList;
callback attribute attributeList;
- ram attribute featureMap default = 0;
+ ram attribute featureMap default = 3;
ram attribute clusterRevision default = 1;
handle command Play;
handle command Pause;
handle command Stop;
+ handle command StartOver;
+ handle command Previous;
+ handle command Next;
+ handle command Rewind;
+ handle command FastForward;
+ handle command SkipForward;
+ handle command SkipBackward;
handle command PlaybackResponse;
+ handle command Seek;
}
server cluster MediaInput {
@@ -2177,12 +2318,13 @@ endpoint 1 {
callback attribute acceptedCommandList;
callback attribute eventList;
callback attribute attributeList;
- ram attribute featureMap default = 0;
+ ram attribute featureMap default = 1;
ram attribute clusterRevision default = 1;
handle command SelectInput;
handle command ShowInputStatus;
handle command HideInputStatus;
+ handle command RenameInput;
}
server cluster LowPower {
@@ -2201,7 +2343,7 @@ endpoint 1 {
callback attribute acceptedCommandList;
callback attribute eventList;
callback attribute attributeList;
- ram attribute featureMap default = 0;
+ ram attribute featureMap default = 7;
ram attribute clusterRevision default = 1;
handle command SendKey;
@@ -2215,10 +2357,79 @@ endpoint 1 {
callback attribute acceptedCommandList;
callback attribute eventList;
callback attribute attributeList;
- ram attribute featureMap default = 0;
+ ram attribute featureMap default = 1;
ram attribute clusterRevision default = 1;
handle command SelectOutput;
+ handle command RenameOutput;
+ }
+}
+endpoint 2 {
+ device type ma_speaker = 34, version 1;
+
+
+ server cluster Identify {
+ ram attribute identifyTime default = 0x0;
+ ram attribute identifyType default = 0x00;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ ram attribute featureMap default = 0;
+ ram attribute clusterRevision default = 4;
+
+ handle command Identify;
+ handle command TriggerEffect;
+ }
+
+ server cluster OnOff {
+ ram attribute onOff default = 0;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ ram attribute featureMap default = 0;
+ ram attribute clusterRevision default = 6;
+
+ handle command Off;
+ handle command On;
+ handle command Toggle;
+ }
+
+ server cluster LevelControl {
+ ram attribute currentLevel default = 0x00;
+ ram attribute minLevel default = 0x00;
+ ram attribute maxLevel default = 0xFE;
+ ram attribute options default = 0x00;
+ ram attribute onLevel default = 0xFE;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ ram attribute featureMap default = 0;
+ ram attribute clusterRevision default = 5;
+
+ handle command MoveToLevel;
+ handle command Move;
+ handle command Step;
+ handle command Stop;
+ handle command MoveToLevelWithOnOff;
+ handle command MoveWithOnOff;
+ handle command StepWithOnOff;
+ handle command StopWithOnOff;
+ }
+
+ server cluster Descriptor {
+ callback attribute deviceTypeList;
+ callback attribute serverList;
+ callback attribute clientList;
+ callback attribute partsList;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ callback attribute featureMap;
+ callback attribute clusterRevision;
}
}
diff --git a/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.zap b/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.zap
index 245f7ee38016e5..92cb592ebd3407 100644
--- a/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.zap
+++ b/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.zap
@@ -1002,96 +1002,6 @@
}
]
},
- {
- "name": "Time Format Localization",
- "code": 44,
- "mfgCode": null,
- "define": "TIME_FORMAT_LOCALIZATION_CLUSTER",
- "side": "server",
- "enabled": 1,
- "attributes": [
- {
- "name": "HourFormat",
- "code": 0,
- "mfgCode": null,
- "side": "server",
- "type": "HourFormatEnum",
- "included": 1,
- "storageOption": "NVM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "0",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "ActiveCalendarType",
- "code": 1,
- "mfgCode": null,
- "side": "server",
- "type": "CalendarTypeEnum",
- "included": 1,
- "storageOption": "NVM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "0",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "SupportedCalendarTypes",
- "code": 2,
- "mfgCode": null,
- "side": "server",
- "type": "array",
- "included": 1,
- "storageOption": "External",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": null,
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "FeatureMap",
- "code": 65532,
- "mfgCode": null,
- "side": "server",
- "type": "bitmap32",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "0",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "ClusterRevision",
- "code": 65533,
- "mfgCode": null,
- "side": "server",
- "type": "int16u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "1",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- }
- ]
- },
{
"name": "General Commissioning",
"code": 48,
@@ -1989,7 +1899,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0",
+ "defaultValue": "1",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -2632,7 +2542,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "4",
+ "defaultValue": "6",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -2818,6 +2728,22 @@
"side": "server",
"enabled": 1,
"attributes": [
+ {
+ "name": "MACAddress",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "char_string",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "GeneratedCommandList",
"code": 65528,
@@ -3146,6 +3072,22 @@
"maxInterval": 65534,
"reportableChange": 0
},
+ {
+ "name": "CurrentTarget",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "GeneratedCommandList",
"code": 65528,
@@ -3242,6 +3184,15 @@
"maxInterval": 65534,
"reportableChange": 0
}
+ ],
+ "events": [
+ {
+ "name": "TargetUpdated",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "included": 1
+ }
]
},
{
@@ -3276,6 +3227,62 @@
"isIncoming": 1,
"isEnabled": 1
},
+ {
+ "name": "StartOver",
+ "code": 3,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "Previous",
+ "code": 4,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "Next",
+ "code": 5,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "Rewind",
+ "code": 6,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "FastForward",
+ "code": 7,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "SkipForward",
+ "code": 8,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "SkipBackward",
+ "code": 9,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
{
"name": "PlaybackResponse",
"code": 10,
@@ -3283,6 +3290,14 @@
"source": "server",
"isIncoming": 0,
"isEnabled": 1
+ },
+ {
+ "name": "Seek",
+ "code": 11,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
}
],
"attributes": [
@@ -3303,43 +3318,43 @@
"reportableChange": 0
},
{
- "name": "GeneratedCommandList",
- "code": 65528,
+ "name": "StartTime",
+ "code": 1,
"mfgCode": null,
"side": "server",
- "type": "array",
+ "type": "epoch_us",
"included": 1,
- "storageOption": "External",
+ "storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": null,
+ "defaultValue": "0x00",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "AcceptedCommandList",
- "code": 65529,
+ "name": "Duration",
+ "code": 2,
"mfgCode": null,
"side": "server",
- "type": "array",
+ "type": "int64u",
"included": 1,
- "storageOption": "External",
+ "storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": null,
+ "defaultValue": "0",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "EventList",
- "code": 65530,
+ "name": "SampledPosition",
+ "code": 3,
"mfgCode": null,
"side": "server",
- "type": "array",
+ "type": "PlaybackPositionStruct",
"included": 1,
"storageOption": "External",
"singleton": 0,
@@ -3351,74 +3366,179 @@
"reportableChange": 0
},
{
- "name": "AttributeList",
- "code": 65531,
+ "name": "PlaybackSpeed",
+ "code": 4,
"mfgCode": null,
"side": "server",
- "type": "array",
+ "type": "single",
"included": 1,
- "storageOption": "External",
+ "storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": null,
+ "defaultValue": "0",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "FeatureMap",
- "code": 65532,
+ "name": "SeekRangeEnd",
+ "code": 5,
"mfgCode": null,
"side": "server",
- "type": "bitmap32",
+ "type": "int64u",
"included": 1,
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0",
+ "defaultValue": "",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
- "name": "ClusterRevision",
- "code": 65533,
+ "name": "SeekRangeStart",
+ "code": 6,
"mfgCode": null,
"side": "server",
- "type": "int16u",
+ "type": "int64u",
"included": 1,
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
- }
- ]
- },
- {
- "name": "Media Input",
- "code": 1287,
- "mfgCode": null,
- "define": "MEDIA_INPUT_CLUSTER",
- "side": "server",
- "enabled": 1,
- "commands": [
+ },
{
- "name": "SelectInput",
- "code": 0,
+ "name": "GeneratedCommandList",
+ "code": 65528,
"mfgCode": null,
- "source": "client",
- "isIncoming": 1,
- "isEnabled": 1
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
},
{
- "name": "ShowInputStatus",
- "code": 1,
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AttributeList",
+ "code": 65531,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "FeatureMap",
+ "code": 65532,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "3",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ClusterRevision",
+ "code": 65533,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "1",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ],
+ "events": [
+ {
+ "name": "StateChanged",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "included": 1
+ }
+ ]
+ },
+ {
+ "name": "Media Input",
+ "code": 1287,
+ "mfgCode": null,
+ "define": "MEDIA_INPUT_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "commands": [
+ {
+ "name": "SelectInput",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "ShowInputStatus",
+ "code": 1,
"mfgCode": null,
"source": "client",
"isIncoming": 1,
@@ -3431,6 +3551,14 @@
"source": "client",
"isIncoming": 1,
"isEnabled": 1
+ },
+ {
+ "name": "RenameInput",
+ "code": 3,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
}
],
"attributes": [
@@ -3540,7 +3668,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0",
+ "defaultValue": "1",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -3780,7 +3908,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0",
+ "defaultValue": "7",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -3819,6 +3947,14 @@
"source": "client",
"isIncoming": 1,
"isEnabled": 1
+ },
+ {
+ "name": "RenameOutput",
+ "code": 1,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
}
],
"attributes": [
@@ -3928,7 +4064,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0",
+ "defaultValue": "1",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -3953,21 +4089,783 @@
]
}
]
- }
- ],
- "endpoints": [
- {
- "endpointTypeName": "MA-rootdevice",
- "endpointTypeIndex": 0,
- "profileId": 259,
- "endpointId": 0,
- "networkId": 0
},
{
- "endpointTypeName": "Anonymous Endpoint Type",
- "endpointTypeIndex": 1,
- "profileId": 259,
- "endpointId": 1,
+ "id": 3,
+ "name": "Anonymous Endpoint Type",
+ "deviceTypeRef": {
+ "code": 34,
+ "profileId": 259,
+ "label": "MA-speaker",
+ "name": "MA-speaker"
+ },
+ "deviceTypes": [
+ {
+ "code": 34,
+ "profileId": 259,
+ "label": "MA-speaker",
+ "name": "MA-speaker"
+ }
+ ],
+ "deviceVersions": [
+ 1
+ ],
+ "deviceIdentifiers": [
+ 34
+ ],
+ "deviceTypeName": "MA-speaker",
+ "deviceTypeCode": 34,
+ "deviceTypeProfileId": 259,
+ "clusters": [
+ {
+ "name": "Identify",
+ "code": 3,
+ "mfgCode": null,
+ "define": "IDENTIFY_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "commands": [
+ {
+ "name": "Identify",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "TriggerEffect",
+ "code": 64,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "name": "IdentifyTime",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "IdentifyType",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "IdentifyTypeEnum",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x00",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "GeneratedCommandList",
+ "code": 65528,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AttributeList",
+ "code": 65531,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "FeatureMap",
+ "code": 65532,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ClusterRevision",
+ "code": 65533,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "4",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "On/Off",
+ "code": 6,
+ "mfgCode": null,
+ "define": "ON_OFF_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "commands": [
+ {
+ "name": "Off",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "On",
+ "code": 1,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "Toggle",
+ "code": 2,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "name": "OnOff",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "boolean",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "GeneratedCommandList",
+ "code": 65528,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AttributeList",
+ "code": 65531,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "FeatureMap",
+ "code": 65532,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ClusterRevision",
+ "code": 65533,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "6",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Level Control",
+ "code": 8,
+ "mfgCode": null,
+ "define": "LEVEL_CONTROL_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "commands": [
+ {
+ "name": "MoveToLevel",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "Move",
+ "code": 1,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "Step",
+ "code": 2,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "Stop",
+ "code": 3,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "MoveToLevelWithOnOff",
+ "code": 4,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "MoveWithOnOff",
+ "code": 5,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "StepWithOnOff",
+ "code": 6,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "StopWithOnOff",
+ "code": 7,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "name": "CurrentLevel",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x00",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MinLevel",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x00",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "MaxLevel",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0xFE",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Options",
+ "code": 15,
+ "mfgCode": null,
+ "side": "server",
+ "type": "OptionsBitmap",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0x00",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "OnLevel",
+ "code": 17,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0xFE",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "GeneratedCommandList",
+ "code": 65528,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AttributeList",
+ "code": 65531,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "FeatureMap",
+ "code": 65532,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ClusterRevision",
+ "code": 65533,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "5",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
+ {
+ "name": "Descriptor",
+ "code": 29,
+ "mfgCode": null,
+ "define": "DESCRIPTOR_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "attributes": [
+ {
+ "name": "DeviceTypeList",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ServerList",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ClientList",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PartsList",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "GeneratedCommandList",
+ "code": 65528,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AttributeList",
+ "code": 65531,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "FeatureMap",
+ "code": 65532,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ClusterRevision",
+ "code": 65533,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "endpoints": [
+ {
+ "endpointTypeName": "MA-rootdevice",
+ "endpointTypeIndex": 0,
+ "profileId": 259,
+ "endpointId": 0,
+ "networkId": 0
+ },
+ {
+ "endpointTypeName": "Anonymous Endpoint Type",
+ "endpointTypeIndex": 1,
+ "profileId": 259,
+ "endpointId": 1,
+ "networkId": 0
+ },
+ {
+ "endpointTypeName": "Anonymous Endpoint Type",
+ "endpointTypeIndex": 2,
+ "profileId": 259,
+ "endpointId": 2,
"networkId": 0
}
]
diff --git a/examples/chef/devices/rootnode_fan_7N2TobIlOX.matter b/examples/chef/devices/rootnode_fan_7N2TobIlOX.matter
index 71d511aedcc508..097015b4634695 100644
--- a/examples/chef/devices/rootnode_fan_7N2TobIlOX.matter
+++ b/examples/chef/devices/rootnode_fan_7N2TobIlOX.matter
@@ -1286,7 +1286,7 @@ cluster FixedLabel = 64 {
}
/** An interface for controlling a fan in a heating/cooling system. */
-provisional cluster FanControl = 514 {
+cluster FanControl = 514 {
revision 4;
enum AirflowDirectionEnum : enum8 {
diff --git a/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter b/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter
index d1aee2ea4e8135..bcef3bca0f1b1e 100644
--- a/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter
+++ b/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter
@@ -1875,7 +1875,7 @@ cluster Thermostat = 513 {
}
/** An interface for controlling a fan in a heating/cooling system. */
-provisional cluster FanControl = 514 {
+cluster FanControl = 514 {
revision 4;
enum AirflowDirectionEnum : enum8 {
diff --git a/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.matter b/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.matter
index de4a1c961cd506..0aa08d68385f6d 100644
--- a/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.matter
+++ b/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.matter
@@ -1458,7 +1458,7 @@ cluster Thermostat = 513 {
}
/** An interface for controlling a fan in a heating/cooling system. */
-provisional cluster FanControl = 514 {
+cluster FanControl = 514 {
revision 4;
enum AirflowDirectionEnum : enum8 {
diff --git a/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.matter b/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.matter
index fdefbfc5c9dbee..ce01f50bd303e7 100644
--- a/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.matter
+++ b/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.matter
@@ -1678,7 +1678,7 @@ cluster Thermostat = 513 {
}
/** An interface for controlling a fan in a heating/cooling system. */
-provisional cluster FanControl = 514 {
+cluster FanControl = 514 {
revision 4;
enum AirflowDirectionEnum : enum8 {
diff --git a/examples/chef/esp32/main/CMakeLists.txt b/examples/chef/esp32/main/CMakeLists.txt
index e6ab518f3494a9..8278cf9a735675 100644
--- a/examples/chef/esp32/main/CMakeLists.txt
+++ b/examples/chef/esp32/main/CMakeLists.txt
@@ -33,6 +33,7 @@ set(PRIV_INCLUDE_DIRS_LIST
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/third_party/nlio/repo/include"
"${CMAKE_SOURCE_DIR}/../"
"${CMAKE_SOURCE_DIR}/../common"
+ "${CMAKE_SOURCE_DIR}/../common/clusters"
"${CMAKE_SOURCE_DIR}/main/include/"
)
@@ -62,6 +63,14 @@ set(SRC_DIRS_LIST
${SRC_DIRS_LIST}
"${CMAKE_CURRENT_LIST_DIR}"
"${CMAKE_SOURCE_DIR}/../common"
+ "${CMAKE_SOURCE_DIR}/../common/clusters/media-input/"
+ "${CMAKE_SOURCE_DIR}/../common/clusters/low-power/"
+ "${CMAKE_SOURCE_DIR}/../common/clusters/media-playback/"
+ "${CMAKE_SOURCE_DIR}/../common/clusters/target-navigator/"
+ "${CMAKE_SOURCE_DIR}/../common/clusters/wake-on-lan/"
+ "${CMAKE_SOURCE_DIR}/../common/clusters/channel/"
+ "${CMAKE_SOURCE_DIR}/../common/clusters/keypad-input/"
+ "${CMAKE_SOURCE_DIR}/../common/clusters/audio-output/"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/zzz_generated/app-common/app-common/zap-generated/attributes"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/util"
diff --git a/examples/chef/linux/BUILD.gn b/examples/chef/linux/BUILD.gn
index a25c1f5ffa11ce..a119f832e051db 100644
--- a/examples/chef/linux/BUILD.gn
+++ b/examples/chef/linux/BUILD.gn
@@ -43,12 +43,19 @@ chip_data_model("chef-data-model") {
executable("${sample_name}") {
sources = [
"${project_dir}/common/chef-air-quality.cpp",
- "${project_dir}/common/chef-channel-manager.cpp",
"${project_dir}/common/chef-concentration-measurement.cpp",
"${project_dir}/common/chef-fan-control-manager.cpp",
"${project_dir}/common/chef-resource-monitoring-delegates.cpp",
"${project_dir}/common/chef-rvc-mode-delegate.cpp",
"${project_dir}/common/chef-rvc-operational-state-delegate.cpp",
+ "${project_dir}/common/clusters/audio-output/AudioOutputManager.cpp",
+ "${project_dir}/common/clusters/channel/ChannelManager.cpp",
+ "${project_dir}/common/clusters/keypad-input/KeypadInputManager.cpp",
+ "${project_dir}/common/clusters/low-power/LowPowerManager.cpp",
+ "${project_dir}/common/clusters/media-input/MediaInputManager.cpp",
+ "${project_dir}/common/clusters/media-playback/MediaPlaybackManager.cpp",
+ "${project_dir}/common/clusters/target-navigator/TargetNavigatorManager.cpp",
+ "${project_dir}/common/clusters/wake-on-lan/WakeOnLanManager.cpp",
"${project_dir}/common/stubs.cpp",
"${project_dir}/linux/main.cpp",
]
@@ -63,6 +70,7 @@ executable("${sample_name}") {
include_dirs = [
"include",
"${project_dir}/common",
+ "${project_dir}/common/clusters",
]
if (chip_enable_pw_rpc) {
diff --git a/examples/chef/nrfconnect/CMakeLists.txt b/examples/chef/nrfconnect/CMakeLists.txt
index 17556ef398b27a..0a408e829dd04f 100644
--- a/examples/chef/nrfconnect/CMakeLists.txt
+++ b/examples/chef/nrfconnect/CMakeLists.txt
@@ -60,6 +60,7 @@ target_include_directories(app PRIVATE
${GEN_DIR}
${CHEF}
${CHEF}/common
+ ${CHEF}/common/clusters/
${GEN_DIR}/../
${CHIP_ROOT}/src
${CHIP_ROOT}/examples/shell/shell_common/include
@@ -81,12 +82,19 @@ endif()
target_sources(app PRIVATE
${CHEF}/common/chef-air-quality.cpp
- ${CHEF}/common/chef-channel-manager.cpp
${CHEF}/common/chef-concentration-measurement.cpp
${CHEF}/common/chef-fan-control-manager.cpp
${CHEF}/common/chef-resource-monitoring-delegates.cpp
${CHEF}/common/chef-rvc-mode-delegate.cpp
${CHEF}/common/chef-rvc-operational-state-delegate.cpp
+ ${CHEF}/common/clusters/media-input/MediaInputManager.cpp
+ ${CHEF}/common/clusters/low-power/LowPowerManager.cpp
+ ${CHEF}/common/clusters/media-playback/MediaPlaybackManager.cpp
+ ${CHEF}/common/clusters/target-navigator/TargetNavigatorManager.cpp
+ ${CHEF}/common/clusters/wake-on-lan/WakeOnLanManager.cpp
+ ${CHEF}/common/clusters/channel/ChannelManager.cpp
+ ${CHEF}/common/clusters/keypad-input/KeypadInputManager.cpp
+ ${CHEF}/common/clusters/audio-output/AudioOutputManager.cpp
${CHEF}/common/stubs.cpp
${CHEF}/nrfconnect/main.cpp
)
diff --git a/examples/energy-management-app/energy-management-common/energy-management-app.matter b/examples/energy-management-app/energy-management-common/energy-management-app.matter
index c56280b2b72f08..1cedefb6c1e43c 100644
--- a/examples/energy-management-app/energy-management-common/energy-management-app.matter
+++ b/examples/energy-management-app/energy-management-common/energy-management-app.matter
@@ -1770,6 +1770,7 @@ endpoint 0 {
ram attribute lastNetworkingStatus;
ram attribute lastNetworkID;
ram attribute lastConnectErrorValue;
+ callback attribute supportedWiFiBands;
callback attribute generatedCommandList;
callback attribute acceptedCommandList;
callback attribute eventList;
diff --git a/examples/energy-management-app/energy-management-common/energy-management-app.zap b/examples/energy-management-app/energy-management-common/energy-management-app.zap
index d795b4fd482448..88514f105c37f1 100644
--- a/examples/energy-management-app/energy-management-common/energy-management-app.zap
+++ b/examples/energy-management-app/energy-management-common/energy-management-app.zap
@@ -1452,6 +1452,22 @@
"maxInterval": 65534,
"reportableChange": 0
},
+ {
+ "name": "SupportedWiFiBands",
+ "code": 8,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "GeneratedCommandList",
"code": 65528,
diff --git a/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp b/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp
index dc60d748958894..99619fc95b5fb0 100644
--- a/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp
+++ b/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp
@@ -1474,7 +1474,11 @@ CHIP_ERROR GetEpochTS(uint32_t & chipEpoch)
* This should not be certifiable since getting time is a Mandatory
* feature of EVSE Cluster
*/
- VerifyOrDie(err != CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE);
+ if (err == CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE)
+ {
+ ChipLogError(Zcl, "Platform does not support GetClock_RealTimeMS. Check EVSE certification requirements!");
+ return err;
+ }
if (err != CHIP_NO_ERROR)
{
diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt
index e0a95d584130eb..1758fbd868fbfb 100644
--- a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt
+++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt
@@ -67,13 +67,12 @@ class PairOnNetworkLongImReadCommand(
}
fun checkUnitTestClusterGeneralStatus(status: Status): Boolean =
- (status.getStatus() == CLUSTER_ID_TEST_GENERAL_ERROR_STATUS) &&
- !status.getClusterStatus().isPresent()
+ (status.getStatus() == Status.Code.InvalidDataType) && !status.getClusterStatus().isPresent()
fun checkUnitTestClusterClusterStatus(status: Status): Boolean =
- (status.getStatus() == CLUSTER_ID_TEST_CLUSTER_ERROR_STATUS) &&
+ (status.getStatus() == Status.Code.Failure) &&
status.getClusterStatus().isPresent() &&
- status.getClusterStatus().get() == CLUSTER_ID_TEST_CLUSTER_ERROR_CLUSTER_STATUS
+ (status.getClusterStatus().get() == CLUSTER_ID_TEST_CLUSTER_ERROR_CLUSTER_STATUS)
private fun validateResponse(nodeState: NodeState) {
val endpointZero =
@@ -243,8 +242,6 @@ class PairOnNetworkLongImReadCommand(
private const val CLUSTER_ID_BASIC_VERSION = 0L
private const val CLUSTER_ID_TEST_GENERAL_ERROR_BOOLEAN = 0x0031L
private const val CLUSTER_ID_TEST_CLUSTER_ERROR_BOOLEAN = 0x0032L
- private const val CLUSTER_ID_TEST_GENERAL_ERROR_STATUS = 0x8d
- private const val CLUSTER_ID_TEST_CLUSTER_ERROR_STATUS = 1
private const val CLUSTER_ID_TEST_CLUSTER_ERROR_CLUSTER_STATUS = 17
}
}
diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImWriteCommand.kt b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImWriteCommand.kt
index 3e90935d22268e..fdb74c5d065b5c 100644
--- a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImWriteCommand.kt
+++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImWriteCommand.kt
@@ -22,6 +22,7 @@ import chip.devicecontroller.GetConnectedDeviceCallbackJni.GetConnectedDeviceCal
import chip.devicecontroller.WriteAttributesCallback
import chip.devicecontroller.model.AttributeWriteRequest
import chip.devicecontroller.model.ChipAttributePath
+import chip.devicecontroller.model.Status
import com.matter.controller.commands.common.CredentialsIssuer
import java.util.logging.Level
import java.util.logging.Logger
@@ -51,11 +52,8 @@ class PairOnNetworkLongImWriteCommand(
setFailure("write failure")
}
- override fun onResponse(attributePath: ChipAttributePath?) {
- logger.log(Level.INFO, "Write receive OnResponse on ")
- if (attributePath != null) {
- logger.log(Level.INFO, attributePath.toString())
- }
+ override fun onResponse(attributePath: ChipAttributePath, status: Status) {
+ logger.log(Level.INFO, "$attributePath : Write response: $status")
setSuccess()
}
}
diff --git a/examples/lit-icd-app/nrfconnect/.gitignore b/examples/lit-icd-app/nrfconnect/.gitignore
new file mode 100644
index 00000000000000..84c048a73cc2e5
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/.gitignore
@@ -0,0 +1 @@
+/build/
diff --git a/examples/lit-icd-app/nrfconnect/CMakeLists.txt b/examples/lit-icd-app/nrfconnect/CMakeLists.txt
new file mode 100644
index 00000000000000..a9b921016670e7
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/CMakeLists.txt
@@ -0,0 +1,66 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# 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.
+#
+cmake_minimum_required(VERSION 3.13.1)
+
+get_filename_component(CHIP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/third_party/connectedhomeip REALPATH)
+get_filename_component(NRFCONNECT_COMMON ${CHIP_ROOT}/examples/platform/nrfconnect REALPATH)
+get_filename_component(GEN_DIR ${CHIP_ROOT}/zzz_generated/ REALPATH)
+
+include(${CHIP_ROOT}/config/nrfconnect/app/check-nrfconnect-version.cmake)
+
+# Set Kconfig root files that will be processed as a first Kconfig for used child images.
+set(mcuboot_KCONFIG_ROOT ${CHIP_ROOT}/config/nrfconnect/chip-module/Kconfig.mcuboot.root)
+set(multiprotocol_rpmsg_KCONFIG_ROOT ${CHIP_ROOT}/config/nrfconnect/chip-module/Kconfig.multiprotocol_rpmsg.root)
+
+if(NOT CONF_FILE STREQUAL "prj_no_dfu.conf")
+ set(PM_STATIC_YML_FILE ${CMAKE_CURRENT_SOURCE_DIR}/configuration/${BOARD}/pm_static_dfu.yml)
+endif()
+
+list(APPEND ZEPHYR_EXTRA_MODULES ${CHIP_ROOT}/config/nrfconnect/chip-module)
+find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
+
+# -Wmaybe-uninitialized has too many false positives, including on std::optional
+# and chip::Optional. Make it nonfatal.
+#
+# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80635
+target_compile_options(app PRIVATE -Werror -Wno-error=maybe-uninitialized)
+
+project(chip-nrfconnect-lit-icd-app-example)
+
+include(${CHIP_ROOT}/config/nrfconnect/app/enable-gnu-std.cmake)
+include(${CHIP_ROOT}/config/nrfconnect/app/flashing.cmake)
+include(${CHIP_ROOT}/src/app/chip_data_model.cmake)
+
+target_include_directories(app PRIVATE
+ main/include
+ ${GEN_DIR}/app-common
+ ${GEN_DIR}/lit-icd-app
+ ${NRFCONNECT_COMMON}/util/include
+ ${NRFCONNECT_COMMON}/app/include)
+
+target_sources(app PRIVATE
+ main/AppTask.cpp
+ main/main.cpp
+ ${NRFCONNECT_COMMON}/util/LEDWidget.cpp)
+
+chip_configure_data_model(app
+ INCLUDE_SERVER
+ ZAP_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../lit-icd-common/lit-icd-server-app.zap
+)
+
+if(CONFIG_CHIP_OTA_REQUESTOR)
+ target_sources(app PRIVATE ${NRFCONNECT_COMMON}/util/OTAUtil.cpp)
+endif()
diff --git a/examples/lit-icd-app/nrfconnect/Kconfig b/examples/lit-icd-app/nrfconnect/Kconfig
new file mode 100644
index 00000000000000..4d9501ac5cab90
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/Kconfig
@@ -0,0 +1,41 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# 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.
+#
+mainmenu "Matter nRF Connect LIT ICD Example Application"
+
+config STATE_LEDS
+ bool "Use LEDs to indicate the device state"
+ default y
+ help
+ Use LEDs to render the current state of the device such as the progress of commissioning of
+ the device into a network or the factory reset initiation. Note that setting this option to
+ 'n' does not disable the LED indicating the state of the simulated bolt.
+
+# Sample configuration used for Thread networking
+if NET_L2_OPENTHREAD
+
+choice OPENTHREAD_NORDIC_LIBRARY_CONFIGURATION
+ default OPENTHREAD_NORDIC_LIBRARY_MTD
+endchoice
+
+choice OPENTHREAD_DEVICE_TYPE
+ default OPENTHREAD_MTD
+endchoice
+
+endif # NET_L2_OPENTHREAD
+
+rsource "../../../config/nrfconnect/chip-module/Kconfig.features"
+rsource "../../../config/nrfconnect/chip-module/Kconfig.defaults"
+source "Kconfig.zephyr"
diff --git a/examples/lit-icd-app/nrfconnect/README.md b/examples/lit-icd-app/nrfconnect/README.md
new file mode 100644
index 00000000000000..704950fdcac63e
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/README.md
@@ -0,0 +1,401 @@
+# Matter nRF Connect LIT ICD Example Application
+
+The nRF Connect LIT ICD Example allows to test the device that utilizes Long
+Idle Time feature from the Intermittently Connected Device Management cluster.
+It uses buttons to change the device states and LEDs to show the state of these
+changes. You can use this example as a reference for creating your own
+application.
+
+
+
+
+The example is based on
+[Matter](https://github.com/project-chip/connectedhomeip) and Nordic
+Semiconductor's nRF Connect SDK, and was created to facilitate testing and
+certification of a Matter device communicating over a low-power, 802.15.4 Thread
+network.
+
+The example behaves as a Matter accessory, that is a device that can be paired
+into an existing Matter network and can be controlled by this network.
+
+
+
+## Overview
+
+This example is running on the nRF Connect platform, which is based on Nordic
+Semiconductor's
+[nRF Connect SDK](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/index.html)
+and [Zephyr RTOS](https://zephyrproject.org/). Visit Matter's
+[nRF Connect platform overview](../../../docs/guides/nrfconnect_platform_overview.md)
+to read more about the platform structure and dependencies.
+
+By default, the Matter accessory device has IPv6 networking disabled. You must
+pair it with the Matter controller over Bluetooth® LE to get the configuration
+from the controller to use the device within a Thread network. You have to make
+the device discoverable manually (for security reasons). See
+[Bluetooth LE advertising](#bluetooth-le-advertising) to learn how to do this.
+The controller must get the commissioning information from the Matter accessory
+device and provision the device into the network.
+
+The sample uses buttons for changing the device states, and LEDs to show the
+state of these changes.
+
+### Bluetooth LE advertising
+
+In this example, to commission the device onto a Matter network, it must be
+discoverable over Bluetooth LE. For security reasons, you must start Bluetooth
+LE advertising manually after powering up the device by pressing **Button 4**.
+
+### Bluetooth LE rendezvous
+
+In this example, the commissioning procedure is done over Bluetooth LE between a
+Matter device and the Matter controller, where the controller has the
+commissioner role.
+
+To start the rendezvous, the controller must get the commissioning information
+from the Matter device. The data payload is encoded within a QR code, printed to
+the UART console, and shared using an NFC tag. The emulation of the NFC tag
+emulation starts automatically when Bluetooth LE advertising is started and
+stays enabled until Bluetooth LE advertising timeout expires.
+
+#### Thread provisioning
+
+The provisioning operation, which is the Last part of the rendezvous procedure,
+involves sending the Thread network credentials from the Matter controller to
+the Matter device. As a result, the device joins the Thread network and can
+communicate with other devices in the network.
+
+### Device Firmware Upgrade
+
+The example supports over-the-air (OTA) device firmware upgrade (DFU) using
+Matter OTA mechanism, which is enabled by default.
+
+The
+[MCUboot](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/mcuboot/index.html)
+bootloader solution is used to replace the old firmware image with the new one.
+
+#### Matter Over-the-Air Update
+
+The Matter over-the-air update distinguishes two types of nodes: OTA Provider
+and OTA Requestor.
+
+An OTA Provider is a node that hosts a new firmware image and is able to respond
+on an OTA Requestor's queries regarding availability of new firmware images or
+requests to start sending the update packages.
+
+An OTA Requestor is a node that wants to download a new firmware image and sends
+requests to an OTA Provider to start the update process.
+
+#### Bootloader
+
+MCUboot is a secure bootloader used for swapping firmware images of different
+versions and generating proper build output files that can be used in the device
+firmware upgrade process.
+
+The bootloader solution requires an area of flash memory to swap application
+images during the firmware upgrade. Nordic Semiconductor devices use an external
+memory chip for this purpose. The memory chip communicates with the
+microcontroller through the QSPI bus.
+
+See the
+[Building with Device Firmware Upgrade support](#building-with-device-firmware-upgrade-support)
+section to learn how to change MCUboot and flash configuration in this example.
+
+
+
+## Requirements
+
+The application requires a specific revision of the nRF Connect SDK to work
+correctly. See [Setting up the environment](#setting-up-the-environment) for
+more information.
+
+### Supported devices
+
+The example supports building and running on the following devices:
+
+| Hardware platform | Build target | Platform image |
+| ----------------------------------------------------------------------------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
+| [nRF52840 DK](https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52840-DK) | `nrf52840dk_nrf52840` | nRF52840 DK
|
+| [nRF5340 DK](https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF5340-DK) | `nrf5340dk_nrf5340_cpuapp` | nRF5340 DK
|
+
+
+
+## Device UI
+
+This section lists the User Interface elements that you can use to control and
+monitor the state of the device. These correspond to PCB components on the
+platform image.
+
+**LED 1** shows the overall state of the device and its connectivity. The
+following states are possible:
+
+- _Short Flash On (50 ms on/950 ms off)_ — The device is in the
+ unprovisioned (unpaired) state and is waiting for a commissioning
+ application to connect.
+
+- _Rapid Even Flashing (100 ms on/100 ms off)_ — The device is in the
+ unprovisioned state and a commissioning application is connected through
+ Bluetooth LE.
+
+- _Short Flash Off (950ms on/50ms off)_ — The device is fully
+ provisioned, but does not yet have full connectivity for Thread network.
+
+- _Solid On_ — The device is fully provisioned.
+
+**LED 2** is used for the Identify feature purpose. The LED starts blinking
+evenly (500 ms on/500 ms off) when the Identify command of the Identify cluster
+is received on the endpoint 1. The command’s argument can be used to specify the
+duration of the effect.
+
+**Button 1** Pressing the button for more than 3 s initiates the factory reset
+of the device. Releasing the button within the 3-second window cancels the
+factory reset procedure.
+
+**Button 3** Represents the User Active Mode Trigger feature from the
+Intermittently Connected Devices Management cluster. Pressing it puts the ICD
+device in the active mode and makes it responsive.
+
+**Button 4** Starts the NFC tag emulation, enables Bluetooth LE advertising for
+the predefined period of time (15 minutes by default), and makes the device
+discoverable over Bluetooth LE. This button is used during the commissioning
+procedure.
+
+**SEGGER J-Link USB port** can be used to get logs from the device or
+communicate with it using the
+[command line interface](../../../docs/guides/nrfconnect_examples_cli.md).
+
+**NFC port with antenna attached** can be used to start the
+[rendezvous](#bluetooth-le-rendezvous) by providing the commissioning
+information from the Matter device in a data payload that can be shared using
+NFC.
+
+
+
+## Setting up the environment
+
+Before building the example, check out the Matter repository and sync submodules
+using the following command:
+
+ $ python3 scripts/checkout_submodules.py --shallow --platform nrfconnect
+
+> **Note**:
+>
+> For Linux operating system install
+> [SEGGER J-Link Software](https://www.segger.com/downloads/jlink/#J-LinkSoftwareAndDocumentationPack).
+
+### Install Command Line Tools
+
+With admin permissions enabled, download and install the
+[nRF Command Line Tools](https://www.nordicsemi.com/Products/Development-tools/nrf-command-line-tools).
+
+### Install Toolchain Manager
+
+Toolchain Manager is available from
+[nRF Connect for Desktop](https://www.nordicsemi.com/Products/Development-tools/nrf-connect-for-desktop),
+a cross-platform tool that provides different applications that simplify
+installing the nRF Connect SDK. Both the tool and the application are available
+for Windows, Linux, and macOS.
+
+To install the Toolchain Manager app, complete the following steps:
+
+1. [Download nRF Connect for Desktop](https://www.nordicsemi.com/Products/Development-tools/nrf-connect-for-desktop/download#infotabs)
+ for your operating system.
+
+2. Install and run the tool on your machine.
+
+3. In the **APPS** section, click **Install** button on the Toolchain Manager
+ tab.
+
+### Install nRF Connect SDK
+
+Complete the following steps to install the nRF Connect SDK:
+
+1. Open Toolchain Manager in nRF Connect for Desktop.
+
+2. Click the **Install** button next to the
+ [recommended](../../../config/nrfconnect/.nrfconnect-recommended-revision)
+ version of the nRF Connect SDK.
+
+3. A pop-up window will inform you about the current installation directory. If
+ you want to change the directory, click the **Change directory** button.
+ Otherwise, click the **Continue installation** button.
+
+4. When the nRF Connect SDK is installed on your machine, the **Install**
+ button changes to the **Open VS Code** button.
+
+5. Click the dropdown menu next to the **Open VS Code** button for the
+ installed nRF Connect SDK version, and select **Open terminal**.
+
+6. Make sure that the nRF Connect SDK version is compatible with the Matter SDK
+ version:
+
+ ```
+ $ cd {connectedhomeip directory}
+ $ python3 scripts/setup/nrfconnect/update_ncs.py --update
+ ```
+
+Now you can proceed with the [Building](#building) instruction.
+
+
+
+## Building
+
+Complete the following steps to build the sample:
+
+1. Navigate to the example's directory:
+
+ $ cd examples/lit-icd-app/nrfconnect
+
+2. Run the following command to build the example, with _build-target_ replaced
+ with the build target name of the Nordic Semiconductor's kit you own, for
+ example `nrf52840dk_nrf52840`:
+
+ $ west build -b build-target
+
+ You only need to specify the build target on the first build. See
+ [Requirements](#requirements) for the build target names of compatible kits.
+
+The output `zephyr.hex` file will be available in the `build/zephyr/` directory.
+
+### Removing build artifacts
+
+If you're planning to build the example for a different kit or make changes to
+the configuration, remove all build artifacts before building. To do so, use the
+following command:
+
+ $ rm -r build
+
+### Building with release configuration
+
+To build the example with release configuration that disables the diagnostic
+features like logs and command-line interface, run the following command:
+
+ $ west build -b build-target -- -DCONF_FILE=prj_release.conf
+
+Remember to replace _build-target_ with the build target name of the Nordic
+Semiconductor's kit you own.
+
+### Building with Device Firmware Upgrade support
+
+Support for DFU using Matter OTA is enabled by default.
+
+To completely disable support for DFU, run the following command with
+_build-target_ replaced with the build target name of the Nordic Semiconductor
+kit you are using (for example `nrf52840dk_nrf52840`):
+
+ $ west build -b build-target -- -DCONF_FILE=prj_no_dfu.conf
+
+> **Note**:
+>
+> There are two types of Device Firmware Upgrade modes: single-image DFU and
+> multi-image DFU. Single-image mode supports upgrading only one firmware image,
+> the application image, and should be used for single-core nRF52840 DK devices.
+> Multi-image mode allows to upgrade more firmware images and is suitable for
+> upgrading the application core and network core firmware in two-core nRF5340
+> DK devices.
+
+#### Changing bootloader configuration
+
+To change the default MCUboot configuration, edit the `prj.conf` file located in
+the `child_image/mcuboot` directory.
+
+Make sure to keep the configuration consistent with changes made to the
+application configuration. This is necessary for the configuration to work, as
+the bootloader image is a separate application from the user application and it
+has its own configuration file.
+
+#### Changing flash memory settings
+
+In the default configuration, the MCUboot uses the
+[Partition Manager](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/scripts/partition_manager/partition_manager.html#partition-manager)
+to configure flash partitions used for the bootloader application image slot
+purposes. You can change these settings by defining
+[static partitions](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/scripts/partition_manager/partition_manager.html#ug-pm-static).
+This example uses this option to define using an external flash.
+
+To modify the flash settings of your board (that is, your _build-target_, for
+example `nrf52840dk_nrf52840`), edit the `pm_static_dfu.yml` file located in the
+`configuration/build-target/` directory.
+
+
+
+## Configuring the example
+
+The Zephyr ecosystem is based on Kconfig files and the settings can be modified
+using the menuconfig utility.
+
+To open the menuconfig utility, run the following command from the example
+directory:
+
+ $ west build -b build-target -t menuconfig
+
+Remember to replace _build-target_ with the build target name of the Nordic
+Semiconductor's kit you own.
+
+Changes done with menuconfig will be lost if the `build` directory is deleted.
+To make them persistent, save the configuration options in the `prj.conf` file.
+
+### Example build types
+
+The example uses different configuration files depending on the supported
+features. Configuration files are provided for different build types and they
+are located in the application root directory.
+
+The `prj.conf` file represents a debug build type. Other build types are covered
+by dedicated files with the build type added as a suffix to the prj part, as per
+the following list. For example, the release build type file name is
+`prj_release.conf`. If a board has other configuration files, for example
+associated with partition layout or child image configuration, these follow the
+same pattern.
+
+Before you start testing the application, you can select one of the build types
+supported by the sample. This sample supports the following build types,
+depending on the selected board:
+
+- debug -- Debug version of the application - can be used to enable additional
+ features for verifying the application behavior, such as logs or
+ command-line shell.
+- release -- Release version of the application - can be used to enable only
+ the necessary application functionalities to optimize its performance.
+- no_dfu -- Debug version of the application without Device Firmware Upgrade
+ feature support.
+
+For more information, see the
+[Configuring nRF Connect SDK examples](../../../docs/guides/nrfconnect_examples_configuration.md)
+page.
+
+
+
+## Flashing and debugging
+
+To flash the application to the device, use the west tool and run the following
+command from the example directory:
+
+ $ west flash --erase
+
+If you have multiple development kits connected, west will prompt you to pick
+the correct one.
+
+To debug the application on target, run the following command from the example
+directory:
+
+ $ west debug
+
+
+
+## Testing the example
+
+Check the [CLI tutorial](../../../docs/guides/nrfconnect_examples_cli.md) to
+learn how to use command-line interface of the application.
+
+### Testing using Linux CHIPTool
+
+Read the [CHIP Tool user guide](../../../docs/guides/chip_tool_guide.md) to see
+how to use [CHIP Tool for Linux or mac OS](../../chip-tool/README.md) to
+commission and control the application within a Matter-enabled Thread network.
+
+### Testing Device Firmware Upgrade
+
+Read the
+[DFU tutorial](../../../docs/guides/nrfconnect_examples_software_update.md) to
+see how to upgrade your device firmware.
diff --git a/examples/lit-icd-app/nrfconnect/boards/nrf52840dk_nrf52840.overlay b/examples/lit-icd-app/nrfconnect/boards/nrf52840dk_nrf52840.overlay
new file mode 100644
index 00000000000000..7babe0424821ba
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/boards/nrf52840dk_nrf52840.overlay
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * 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.
+ */
+
+/ {
+ chosen {
+ nordic,pm-ext-flash = &mx25r64;
+ };
+
+ /*
+ * In some default configurations within the nRF Connect SDK,
+ * e.g. on nRF52840, the chosen zephyr,entropy node is &cryptocell.
+ * This devicetree overlay ensures that default is overridden wherever it
+ * is set, as this application uses the RNG node for entropy exclusively.
+ */
+ chosen {
+ zephyr,entropy = &rng;
+ };
+};
+
+/* Disable unused peripherals to reduce power consumption */
+&adc {
+ status = "disabled";
+};
+&uart1 {
+ status = "disabled";
+};
+&i2c0 {
+ status = "disabled";
+};
+&pwm0 {
+ status = "disabled";
+};
+&spi1 {
+ status = "disabled";
+};
+&spi3 {
+ status = "disabled";
+};
+&usbd {
+ status = "disabled";
+};
diff --git a/examples/lit-icd-app/nrfconnect/boards/nrf5340dk_nrf5340_cpuapp.overlay b/examples/lit-icd-app/nrfconnect/boards/nrf5340dk_nrf5340_cpuapp.overlay
new file mode 100644
index 00000000000000..12155ffcd1f509
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/boards/nrf5340dk_nrf5340_cpuapp.overlay
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * 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.
+ */
+
+#include
+
+/ {
+ chosen {
+ nordic,pm-ext-flash = &mx25r64;
+ };
+};
+
+/* Set IPC thread priority to the highest value to not collide with other threads. */
+&ipc0 {
+ zephyr,priority = <0 PRIO_COOP>;
+};
+
+/* Disable unused peripherals to reduce power consumption */
+&adc {
+ status = "disabled";
+};
+&i2c1 {
+ status = "disabled";
+};
+&pwm0 {
+ status = "disabled";
+};
+&spi2 {
+ status = "disabled";
+};
+&usbd {
+ status = "disabled";
+};
diff --git a/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf52840dk_nrf52840.overlay b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf52840dk_nrf52840.overlay
new file mode 100644
index 00000000000000..9f9128c6beff60
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf52840dk_nrf52840.overlay
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * 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.
+ */
+
+/ {
+ chosen {
+ nordic,pm-ext-flash = &mx25r64;
+ };
+};
diff --git a/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf52840dk_nrf52840_release.overlay b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf52840dk_nrf52840_release.overlay
new file mode 100644
index 00000000000000..9f9128c6beff60
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf52840dk_nrf52840_release.overlay
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * 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.
+ */
+
+/ {
+ chosen {
+ nordic,pm-ext-flash = &mx25r64;
+ };
+};
diff --git a/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf5340dk_nrf5340_cpuapp.overlay b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf5340dk_nrf5340_cpuapp.overlay
new file mode 100644
index 00000000000000..50069180506973
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf5340dk_nrf5340_cpuapp.overlay
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * 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.
+ */
+/ {
+ chosen {
+ nordic,pm-ext-flash = &mx25r64;
+ };
+};
diff --git a/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf5340dk_nrf5340_cpuapp_release.overlay b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf5340dk_nrf5340_cpuapp_release.overlay
new file mode 100644
index 00000000000000..9f9128c6beff60
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf5340dk_nrf5340_cpuapp_release.overlay
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * 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.
+ */
+
+/ {
+ chosen {
+ nordic,pm-ext-flash = &mx25r64;
+ };
+};
diff --git a/examples/lit-icd-app/nrfconnect/child_image/mcuboot/prj.conf b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/prj.conf
new file mode 100644
index 00000000000000..3f43b733b4bb96
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/prj.conf
@@ -0,0 +1,30 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# 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.
+#
+
+# This target uses Kconfig.mcuboot.defaults to set options common for all
+# samples using mcuboot. This file should contain only options specific for this sample
+# mcuboot configuration or overrides of default values.
+
+CONFIG_MBEDTLS_CFG_FILE="mcuboot-mbedtls-cfg.h"
+
+# Bootloader size optimization
+# Disable not used modules that cannot be set in Kconfig.mcuboot.defaults due to overriding
+# in board files.
+CONFIG_CONSOLE=n
+CONFIG_SERIAL=n
+CONFIG_UART_CONSOLE=n
+CONFIG_USE_SEGGER_RTT=n
+CONFIG_GPIO=n
diff --git a/examples/lit-icd-app/nrfconnect/child_image/mcuboot/prj_release.conf b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/prj_release.conf
new file mode 100644
index 00000000000000..3f43b733b4bb96
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/prj_release.conf
@@ -0,0 +1,30 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# 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.
+#
+
+# This target uses Kconfig.mcuboot.defaults to set options common for all
+# samples using mcuboot. This file should contain only options specific for this sample
+# mcuboot configuration or overrides of default values.
+
+CONFIG_MBEDTLS_CFG_FILE="mcuboot-mbedtls-cfg.h"
+
+# Bootloader size optimization
+# Disable not used modules that cannot be set in Kconfig.mcuboot.defaults due to overriding
+# in board files.
+CONFIG_CONSOLE=n
+CONFIG_SERIAL=n
+CONFIG_UART_CONSOLE=n
+CONFIG_USE_SEGGER_RTT=n
+CONFIG_GPIO=n
diff --git a/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj.conf b/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj.conf
new file mode 100644
index 00000000000000..48deaa9fa18135
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj.conf
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# 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.
+#
+
+# This target uses Kconfig.multiprotocol_rpmsg.defaults to set options common for all
+# samples using multiprotocol_rpmsg. This file should contain only options specific for this sample
+# multiprotocol_rpmsg configuration or overrides of default values.
+
+# Disable not used modules that cannot be set in Kconfig.multiprotocol_rpmsg.defaults due to overriding
+# in board files.
+
+CONFIG_SERIAL=n
+CONFIG_UART_CONSOLE=n
diff --git a/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj_no_dfu.conf b/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj_no_dfu.conf
new file mode 100644
index 00000000000000..48deaa9fa18135
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj_no_dfu.conf
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# 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.
+#
+
+# This target uses Kconfig.multiprotocol_rpmsg.defaults to set options common for all
+# samples using multiprotocol_rpmsg. This file should contain only options specific for this sample
+# multiprotocol_rpmsg configuration or overrides of default values.
+
+# Disable not used modules that cannot be set in Kconfig.multiprotocol_rpmsg.defaults due to overriding
+# in board files.
+
+CONFIG_SERIAL=n
+CONFIG_UART_CONSOLE=n
diff --git a/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj_release.conf b/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj_release.conf
new file mode 100644
index 00000000000000..48deaa9fa18135
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj_release.conf
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# 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.
+#
+
+# This target uses Kconfig.multiprotocol_rpmsg.defaults to set options common for all
+# samples using multiprotocol_rpmsg. This file should contain only options specific for this sample
+# multiprotocol_rpmsg configuration or overrides of default values.
+
+# Disable not used modules that cannot be set in Kconfig.multiprotocol_rpmsg.defaults due to overriding
+# in board files.
+
+CONFIG_SERIAL=n
+CONFIG_UART_CONSOLE=n
diff --git a/examples/lit-icd-app/nrfconnect/configuration/nrf52840dk_nrf52840/pm_static_dfu.yml b/examples/lit-icd-app/nrfconnect/configuration/nrf52840dk_nrf52840/pm_static_dfu.yml
new file mode 100644
index 00000000000000..ce42b39e55ee87
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/configuration/nrf52840dk_nrf52840/pm_static_dfu.yml
@@ -0,0 +1,42 @@
+mcuboot:
+ address: 0x0
+ size: 0x7000
+ region: flash_primary
+mcuboot_pad:
+ address: 0x7000
+ size: 0x200
+app:
+ address: 0x7200
+ size: 0xf3e00
+mcuboot_primary:
+ orig_span: &id001
+ - mcuboot_pad
+ - app
+ span: *id001
+ address: 0x7000
+ size: 0xf4000
+ region: flash_primary
+mcuboot_primary_app:
+ orig_span: &id002
+ - app
+ span: *id002
+ address: 0x7200
+ size: 0xf3e00
+factory_data:
+ address: 0xfb000
+ size: 0x1000
+ region: flash_primary
+settings_storage:
+ address: 0xfc000
+ size: 0x4000
+ region: flash_primary
+mcuboot_secondary:
+ address: 0x0
+ size: 0xf4000
+ device: MX25R64
+ region: external_flash
+external_flash:
+ address: 0xf4000
+ size: 0x70c000
+ device: MX25R64
+ region: external_flash
diff --git a/examples/lit-icd-app/nrfconnect/configuration/nrf5340dk_nrf5340_cpuapp/pm_static_dfu.yml b/examples/lit-icd-app/nrfconnect/configuration/nrf5340dk_nrf5340_cpuapp/pm_static_dfu.yml
new file mode 100644
index 00000000000000..10e8680c363a53
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/configuration/nrf5340dk_nrf5340_cpuapp/pm_static_dfu.yml
@@ -0,0 +1,56 @@
+mcuboot:
+ address: 0x0
+ size: 0x8000
+ region: flash_primary
+mcuboot_pad:
+ address: 0x8000
+ size: 0x200
+app:
+ address: 0x8200
+ size: 0xf2e00
+mcuboot_primary:
+ orig_span: &id001
+ - mcuboot_pad
+ - app
+ span: *id001
+ address: 0x8000
+ size: 0xf3000
+ region: flash_primary
+mcuboot_primary_app:
+ orig_span: &id002
+ - app
+ span: *id002
+ address: 0x8200
+ size: 0xf2e00
+factory_data:
+ address: 0xfb000
+ size: 0x1000
+ region: flash_primary
+settings_storage:
+ address: 0xfc000
+ size: 0x4000
+ region: flash_primary
+mcuboot_primary_1:
+ address: 0x0
+ size: 0x40000
+ device: flash_ctrl
+ region: ram_flash
+mcuboot_secondary:
+ address: 0x0
+ size: 0xf3000
+ device: MX25R64
+ region: external_flash
+mcuboot_secondary_1:
+ address: 0xf3000
+ size: 0x40000
+ device: MX25R64
+ region: external_flash
+external_flash:
+ address: 0x133000
+ size: 0x6CD000
+ device: MX25R64
+ region: external_flash
+pcd_sram:
+ address: 0x20000000
+ size: 0x2000
+ region: sram_primary
diff --git a/examples/lit-icd-app/nrfconnect/main/AppTask.cpp b/examples/lit-icd-app/nrfconnect/main/AppTask.cpp
new file mode 100644
index 00000000000000..50622d0c88b96e
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/main/AppTask.cpp
@@ -0,0 +1,502 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include "AppTask.h"
+#include "AppConfig.h"
+#include "AppEvent.h"
+#include "FabricTableDelegate.h"
+#include "LEDUtil.h"
+
+#include
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+#if CONFIG_CHIP_OTA_REQUESTOR
+#include "OTAUtil.h"
+#endif
+
+#include
+#include
+#include
+
+LOG_MODULE_DECLARE(app, CONFIG_CHIP_APP_LOG_LEVEL);
+
+using namespace ::chip;
+using namespace ::chip::app;
+using namespace ::chip::Credentials;
+using namespace ::chip::DeviceLayer;
+
+namespace {
+constexpr uint32_t kFactoryResetTriggerTimeout = 3000;
+constexpr uint32_t kFactoryResetCancelWindowTimeout = 3000;
+constexpr size_t kAppEventQueueSize = 10;
+constexpr EndpointId kIdentifyEndpointId = 1;
+
+// NOTE! This key is for test/certification only and should not be available in production devices!
+// If CONFIG_CHIP_FACTORY_DATA is enabled, this value is read from the factory data.
+uint8_t sTestEventTriggerEnableKey[TestEventTriggerDelegate::kEnableKeyLength] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff };
+
+K_MSGQ_DEFINE(sAppEventQueue, sizeof(AppEvent), kAppEventQueueSize, alignof(AppEvent));
+k_timer sFunctionTimer;
+
+chip::DeviceLayer::DeviceInfoProviderImpl gExampleDeviceInfoProvider;
+
+Identify sIdentify = { kIdentifyEndpointId, AppTask::IdentifyStartHandler, AppTask::IdentifyStopHandler,
+ Clusters::Identify::IdentifyTypeEnum::kVisibleIndicator };
+
+LEDWidget sStatusLED;
+LEDWidget sIdentifyLED;
+FactoryResetLEDsWrapper<2> sFactoryResetLEDs{ { FACTORY_RESET_SIGNAL_LED, FACTORY_RESET_SIGNAL_LED1 } };
+
+bool sIsNetworkProvisioned = false;
+bool sIsNetworkEnabled = false;
+bool sHaveBLEConnections = false;
+
+} // namespace
+
+namespace LedConsts {
+constexpr uint32_t kBlinkRate_ms{ 500 };
+constexpr uint32_t kIdentifyBlinkRate_ms{ 500 };
+namespace StatusLed {
+namespace Unprovisioned {
+constexpr uint32_t kOn_ms{ 100 };
+constexpr uint32_t kOff_ms{ kOn_ms };
+} // namespace Unprovisioned
+namespace Provisioned {
+constexpr uint32_t kOn_ms{ 50 };
+constexpr uint32_t kOff_ms{ 950 };
+} // namespace Provisioned
+
+} // namespace StatusLed
+} // namespace LedConsts
+
+CHIP_ERROR AppTask::Init()
+{
+ // Initialize CHIP stack
+ LOG_INF("Init CHIP stack");
+
+ CHIP_ERROR err = chip::Platform::MemoryInit();
+ if (err != CHIP_NO_ERROR)
+ {
+ LOG_ERR("Platform::MemoryInit() failed");
+ return err;
+ }
+
+ err = PlatformMgr().InitChipStack();
+ if (err != CHIP_NO_ERROR)
+ {
+ LOG_ERR("PlatformMgr().InitChipStack() failed");
+ return err;
+ }
+
+#if defined(CONFIG_NET_L2_OPENTHREAD)
+ err = ThreadStackMgr().InitThreadStack();
+ if (err != CHIP_NO_ERROR)
+ {
+ LOG_ERR("ThreadStackMgr().InitThreadStack() failed");
+ return err;
+ }
+
+#ifdef CONFIG_OPENTHREAD_MTD_SED
+ err = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_SleepyEndDevice);
+#else
+ err = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_MinimalEndDevice);
+#endif
+ if (err != CHIP_NO_ERROR)
+ {
+ LOG_ERR("ConnectivityMgr().SetThreadDeviceType() failed");
+ return err;
+ }
+#else
+ return CHIP_ERROR_INTERNAL;
+#endif // CONFIG_NET_L2_OPENTHREAD
+
+ // Initialize LEDs
+ LEDWidget::InitGpio();
+ LEDWidget::SetStateUpdateCallback(LEDStateUpdateHandler);
+
+ sStatusLED.Init(SYSTEM_STATE_LED);
+ sIdentifyLED.Init(IDENTIFY_STATE_LED);
+ sIdentifyLED.Set(false);
+
+ UpdateStatusLED();
+
+ // Initialize buttons
+ auto ret = dk_buttons_init(ButtonEventHandler);
+ if (ret)
+ {
+ LOG_ERR("dk_buttons_init() failed");
+ return chip::System::MapErrorZephyr(ret);
+ }
+
+ // Initialize timer user data
+ k_timer_init(&sFunctionTimer, &AppTask::FunctionTimerTimeoutCallback, nullptr);
+ k_timer_user_data_set(&sFunctionTimer, this);
+
+#ifdef CONFIG_CHIP_OTA_REQUESTOR
+ /* OTA image confirmation must be done before the factory data init. */
+ OtaConfirmNewImage();
+#endif
+
+ // Initialize CHIP server
+#if CONFIG_CHIP_FACTORY_DATA
+ ReturnErrorOnFailure(mFactoryDataProvider.Init());
+ SetDeviceInstanceInfoProvider(&mFactoryDataProvider);
+ SetDeviceAttestationCredentialsProvider(&mFactoryDataProvider);
+ SetCommissionableDataProvider(&mFactoryDataProvider);
+ // Read EnableKey from the factory data.
+ MutableByteSpan enableKey(sTestEventTriggerEnableKey);
+ err = mFactoryDataProvider.GetEnableKey(enableKey);
+ if (err != CHIP_NO_ERROR)
+ {
+ LOG_ERR("mFactoryDataProvider.GetEnableKey() failed. Could not delegate a test event trigger");
+ memset(sTestEventTriggerEnableKey, 0, sizeof(sTestEventTriggerEnableKey));
+ }
+#else
+ SetDeviceInstanceInfoProvider(&DeviceInstanceInfoProviderMgrImpl());
+ SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider());
+#endif
+
+ static CommonCaseDeviceServerInitParams initParams;
+ static SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{};
+ static OTATestEventTriggerHandler sOtaTestEventTriggerHandler{};
+ VerifyOrDie(sTestEventTriggerDelegate.Init(ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR);
+ VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR);
+ (void) initParams.InitializeStaticResourcesBeforeServerInit();
+ initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate;
+ ReturnErrorOnFailure(chip::Server::GetInstance().Init(initParams));
+ AppFabricTableDelegate::Init();
+
+ gExampleDeviceInfoProvider.SetStorageDelegate(&Server::GetInstance().GetPersistentStorage());
+ chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider);
+ ConfigurationMgr().LogDeviceConfig();
+ PrintOnboardingCodes(chip::RendezvousInformationFlag(chip::RendezvousInformationFlag::kBLE));
+
+ // Add CHIP event handler and start CHIP thread.
+ // Note that all the initialization code should happen prior to this point to avoid data races
+ // between the main and the CHIP threads
+ PlatformMgr().AddEventHandler(ChipEventHandler, 0);
+ err = PlatformMgr().StartEventLoopTask();
+ if (err != CHIP_NO_ERROR)
+ {
+ LOG_ERR("PlatformMgr().StartEventLoopTask() failed");
+ }
+
+ return err;
+}
+
+CHIP_ERROR AppTask::StartApp()
+{
+ ReturnErrorOnFailure(Init());
+
+ AppEvent event{};
+
+ while (true)
+ {
+ k_msgq_get(&sAppEventQueue, &event, K_FOREVER);
+ DispatchEvent(event);
+ }
+
+ return CHIP_NO_ERROR;
+}
+
+void AppTask::IdentifyStartHandler(Identify *)
+{
+ AppEvent event;
+ event.Type = AppEventType::IdentifyStart;
+ event.Handler = [](const AppEvent &) { sIdentifyLED.Blink(LedConsts::kIdentifyBlinkRate_ms); };
+ PostEvent(event);
+}
+
+void AppTask::IdentifyStopHandler(Identify *)
+{
+ AppEvent event;
+ event.Type = AppEventType::IdentifyStop;
+ event.Handler = [](const AppEvent &) { sIdentifyLED.Set(false); };
+ PostEvent(event);
+}
+
+void AppTask::ButtonEventHandler(uint32_t buttonState, uint32_t hasChanged)
+{
+ AppEvent button_event;
+ button_event.Type = AppEventType::Button;
+
+ if (BLE_ADVERTISEMENT_START_BUTTON_MASK & buttonState & hasChanged)
+ {
+ button_event.ButtonEvent.PinNo = BLE_ADVERTISEMENT_START_BUTTON;
+ button_event.ButtonEvent.Action = static_cast(AppEventType::ButtonPushed);
+ button_event.Handler = StartBLEAdvertisementHandler;
+ PostEvent(button_event);
+ }
+
+ if (FUNCTION_BUTTON_MASK & hasChanged)
+ {
+ button_event.ButtonEvent.PinNo = FUNCTION_BUTTON;
+ button_event.ButtonEvent.Action =
+ static_cast((FUNCTION_BUTTON_MASK & buttonState) ? AppEventType::ButtonPushed : AppEventType::ButtonReleased);
+ button_event.Handler = FunctionHandler;
+ PostEvent(button_event);
+ }
+
+ if (ICD_UAT_BUTTON_MASK & hasChanged)
+ {
+ button_event.ButtonEvent.PinNo = ICD_UAT_BUTTON;
+ button_event.ButtonEvent.Action = static_cast(AppEventType::ButtonPushed);
+ button_event.Handler = IcdUatEventHandler;
+ PostEvent(button_event);
+ }
+}
+
+void AppTask::IcdUatEventHandler(const AppEvent &)
+{
+ Server::GetInstance().GetICDManager().UpdateOperationState(ICDManager::OperationalState::ActiveMode);
+}
+
+void AppTask::FunctionTimerTimeoutCallback(k_timer * timer)
+{
+ if (!timer)
+ {
+ return;
+ }
+
+ AppEvent event;
+ event.Type = AppEventType::Timer;
+ event.TimerEvent.Context = k_timer_user_data_get(timer);
+ event.Handler = FunctionTimerEventHandler;
+ PostEvent(event);
+}
+
+void AppTask::FunctionTimerEventHandler(const AppEvent & event)
+{
+ if (event.Type != AppEventType::Timer || !Instance().mFunctionTimerActive)
+ {
+ return;
+ }
+
+ // If we reached here, the button was held past kFactoryResetTriggerTimeout, initiate factory reset
+ if (Instance().mFunction == FunctionEvent::SoftwareUpdate)
+ {
+ LOG_INF("Factory Reset Triggered. Release button within %ums to cancel.", kFactoryResetTriggerTimeout);
+
+ // Start timer for kFactoryResetCancelWindowTimeout to allow user to cancel, if required.
+ Instance().StartTimer(kFactoryResetCancelWindowTimeout);
+ Instance().mFunction = FunctionEvent::FactoryReset;
+
+ // Turn off all LEDs before starting blink to make sure blink is coordinated.
+ sStatusLED.Set(false);
+ sFactoryResetLEDs.Set(false);
+
+ sStatusLED.Blink(LedConsts::kBlinkRate_ms);
+ sFactoryResetLEDs.Blink(LedConsts::kBlinkRate_ms);
+ }
+ else if (Instance().mFunction == FunctionEvent::FactoryReset)
+ {
+ // Actually trigger Factory Reset
+ Instance().mFunction = FunctionEvent::NoneSelected;
+ chip::Server::GetInstance().ScheduleFactoryReset();
+ }
+ else if (Instance().mFunction == FunctionEvent::AdvertisingStart)
+ {
+ // The button was held past kAdvertisingTriggerTimeout, start BLE advertisement if we have 2 buttons UI
+ StartBLEAdvertisementHandler(event);
+ }
+}
+
+void AppTask::FunctionHandler(const AppEvent & event)
+{
+ if (event.ButtonEvent.PinNo != FUNCTION_BUTTON)
+ return;
+
+ // To trigger software update: press the FUNCTION_BUTTON button briefly (< FACTORY_RESET_TRIGGER_TIMEOUT)
+ // To initiate factory reset: press the FUNCTION_BUTTON for FACTORY_RESET_TRIGGER_TIMEOUT + FACTORY_RESET_CANCEL_WINDOW_TIMEOUT
+ // All LEDs start blinking after FACTORY_RESET_TRIGGER_TIMEOUT to signal factory reset has been initiated.
+ // To cancel factory reset: release the FUNCTION_BUTTON once all LEDs start blinking within the
+ // FACTORY_RESET_CANCEL_WINDOW_TIMEOUT
+ if (event.ButtonEvent.Action == static_cast(AppEventType::ButtonPushed))
+ {
+ if (!Instance().mFunctionTimerActive && Instance().mFunction == FunctionEvent::NoneSelected)
+ {
+ Instance().StartTimer(kFactoryResetTriggerTimeout);
+
+ Instance().mFunction = FunctionEvent::SoftwareUpdate;
+ }
+ }
+ else
+ {
+ // If the button was released before factory reset got initiated, trigger a software update.
+ if (Instance().mFunctionTimerActive && Instance().mFunction == FunctionEvent::SoftwareUpdate)
+ {
+ Instance().CancelTimer();
+ Instance().mFunction = FunctionEvent::NoneSelected;
+ }
+ else if (Instance().mFunctionTimerActive && Instance().mFunction == FunctionEvent::FactoryReset)
+ {
+ sFactoryResetLEDs.Set(false);
+ UpdateStatusLED();
+ Instance().CancelTimer();
+ Instance().mFunction = FunctionEvent::NoneSelected;
+ LOG_INF("Factory Reset has been Canceled");
+ }
+ }
+}
+
+void AppTask::StartBLEAdvertisementHandler(const AppEvent &)
+{
+ if (Server::GetInstance().GetFabricTable().FabricCount() != 0)
+ {
+ LOG_INF("Matter service BLE advertising not started - device is already commissioned");
+ return;
+ }
+
+ if (ConnectivityMgr().IsBLEAdvertisingEnabled())
+ {
+ LOG_INF("BLE advertising is already enabled");
+ return;
+ }
+
+ if (Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow() != CHIP_NO_ERROR)
+ {
+ LOG_ERR("OpenBasicCommissioningWindow() failed");
+ }
+}
+
+void AppTask::UpdateLedStateEventHandler(const AppEvent & event)
+{
+ if (event.Type == AppEventType::UpdateLedState)
+ {
+ event.UpdateLedStateEvent.LedWidget->UpdateState();
+ }
+}
+
+void AppTask::LEDStateUpdateHandler(LEDWidget & ledWidget)
+{
+ AppEvent event;
+ event.Type = AppEventType::UpdateLedState;
+ event.Handler = UpdateLedStateEventHandler;
+ event.UpdateLedStateEvent.LedWidget = &ledWidget;
+ PostEvent(event);
+}
+
+void AppTask::UpdateStatusLED()
+{
+#ifdef CONFIG_STATE_LEDS
+ // Update the status LED.
+ //
+ // If IPv6 network and service provisioned, keep the LED On constantly.
+ //
+ // If the system has BLE connection(s) until the stage above, THEN blink the LED at an even
+ // rate of 100ms.
+ //
+ // Otherwise, blink the LED for a very short time.
+ if (sIsNetworkProvisioned && sIsNetworkEnabled)
+ {
+ sStatusLED.Set(true);
+ }
+ else if (sHaveBLEConnections)
+ {
+ sStatusLED.Blink(LedConsts::StatusLed::Unprovisioned::kOn_ms, LedConsts::StatusLed::Unprovisioned::kOff_ms);
+ }
+ else
+ {
+ sStatusLED.Blink(LedConsts::StatusLed::Provisioned::kOn_ms, LedConsts::StatusLed::Provisioned::kOff_ms);
+ }
+#endif
+}
+
+void AppTask::ChipEventHandler(const ChipDeviceEvent * event, intptr_t /* arg */)
+{
+ switch (event->Type)
+ {
+ case DeviceEventType::kCHIPoBLEAdvertisingChange:
+#ifdef CONFIG_CHIP_NFC_COMMISSIONING
+ if (event->CHIPoBLEAdvertisingChange.Result == kActivity_Started)
+ {
+ if (NFCMgr().IsTagEmulationStarted())
+ {
+ LOG_INF("NFC Tag emulation is already started");
+ }
+ else
+ {
+ ShareQRCodeOverNFC(chip::RendezvousInformationFlags(chip::RendezvousInformationFlag::kBLE));
+ }
+ }
+ else if (event->CHIPoBLEAdvertisingChange.Result == kActivity_Stopped)
+ {
+ NFCMgr().StopTagEmulation();
+ }
+#endif
+ sHaveBLEConnections = ConnectivityMgr().NumBLEConnections() != 0;
+ UpdateStatusLED();
+ break;
+#if defined(CONFIG_NET_L2_OPENTHREAD)
+ case DeviceEventType::kDnssdInitialized:
+#if CONFIG_CHIP_OTA_REQUESTOR
+ InitBasicOTARequestor();
+#endif // CONFIG_CHIP_OTA_REQUESTOR
+ break;
+ case DeviceEventType::kThreadStateChange:
+ sIsNetworkProvisioned = ConnectivityMgr().IsThreadProvisioned();
+ sIsNetworkEnabled = ConnectivityMgr().IsThreadEnabled();
+ UpdateStatusLED();
+ break;
+#endif // CONFIG_NET_L2_OPENTHREAD
+ default:
+ break;
+ }
+}
+
+void AppTask::CancelTimer()
+{
+ k_timer_stop(&sFunctionTimer);
+ Instance().mFunctionTimerActive = false;
+}
+
+void AppTask::StartTimer(uint32_t aTimeoutInMs)
+{
+ k_timer_start(&sFunctionTimer, K_MSEC(aTimeoutInMs), K_NO_WAIT);
+ Instance().mFunctionTimerActive = true;
+}
+
+void AppTask::PostEvent(const AppEvent & event)
+{
+ if (k_msgq_put(&sAppEventQueue, &event, K_NO_WAIT) != 0)
+ {
+ LOG_INF("Failed to post event to app task event queue");
+ }
+}
+
+void AppTask::DispatchEvent(const AppEvent & event)
+{
+ if (event.Handler)
+ {
+ event.Handler(event);
+ }
+ else
+ {
+ LOG_INF("Event received with no handler. Dropping event.");
+ }
+}
diff --git a/examples/lit-icd-app/nrfconnect/main/include/AppConfig.h b/examples/lit-icd-app/nrfconnect/main/include/AppConfig.h
new file mode 100644
index 00000000000000..26f63f5ec1fa06
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/main/include/AppConfig.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include "BoardUtil.h"
+
+// ---- LIT ICD Application example config ----
+
+#define FUNCTION_BUTTON DK_BTN1
+#define FUNCTION_BUTTON_MASK DK_BTN1_MSK
+#define ICD_UAT_BUTTON DK_BTN3
+#define ICD_UAT_BUTTON_MASK DK_BTN3_MSK
+#define BLE_ADVERTISEMENT_START_BUTTON DK_BTN4
+#define BLE_ADVERTISEMENT_START_BUTTON_MASK DK_BTN4_MSK
+#define SYSTEM_STATE_LED DK_LED1
+#define IDENTIFY_STATE_LED DK_LED2
+#define FACTORY_RESET_SIGNAL_LED DK_LED3
+#define FACTORY_RESET_SIGNAL_LED1 DK_LED4
diff --git a/examples/lit-icd-app/nrfconnect/main/include/AppEvent.h b/examples/lit-icd-app/nrfconnect/main/include/AppEvent.h
new file mode 100644
index 00000000000000..27ae7408f52e08
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/main/include/AppEvent.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include
+
+#include "EventTypes.h"
+
+class LEDWidget;
+
+enum class AppEventType : uint8_t
+{
+ None = 0,
+ Button,
+ ButtonPushed,
+ ButtonReleased,
+ Timer,
+ UpdateLedState,
+ IdentifyStart,
+ IdentifyStop,
+};
+
+enum class FunctionEvent : uint8_t
+{
+ NoneSelected = 0,
+ SoftwareUpdate = 0,
+ FactoryReset,
+ AdvertisingStart
+};
+
+struct AppEvent
+{
+ union
+ {
+ struct
+ {
+ uint8_t PinNo;
+ uint8_t Action;
+ } ButtonEvent;
+ struct
+ {
+ void * Context;
+ } TimerEvent;
+ struct
+ {
+ uint8_t Action;
+ int32_t Actor;
+ } LockEvent;
+ struct
+ {
+ LEDWidget * LedWidget;
+ } UpdateLedStateEvent;
+ };
+
+ AppEventType Type{ AppEventType::None };
+ EventHandler Handler;
+};
diff --git a/examples/lit-icd-app/nrfconnect/main/include/AppTask.h b/examples/lit-icd-app/nrfconnect/main/include/AppTask.h
new file mode 100644
index 00000000000000..f1513b2d1e75cb
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/main/include/AppTask.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include
+
+#include "AppEvent.h"
+#include "LEDWidget.h"
+
+#if CONFIG_CHIP_FACTORY_DATA
+#include
+#else
+#include
+#endif
+
+struct k_timer;
+struct Identify;
+
+class AppTask
+{
+public:
+ static AppTask & Instance(void)
+ {
+ static AppTask sAppTask;
+ return sAppTask;
+ };
+ CHIP_ERROR StartApp();
+
+ static void IdentifyStartHandler(Identify *);
+ static void IdentifyStopHandler(Identify *);
+
+ static void PostEvent(const AppEvent & event);
+
+private:
+ CHIP_ERROR Init();
+
+ static void CancelTimer();
+ static void StartTimer(uint32_t timeoutInMs);
+
+ static void DispatchEvent(const AppEvent & event);
+ static void FunctionTimerEventHandler(const AppEvent & event);
+ static void FunctionHandler(const AppEvent & event);
+ static void StartBLEAdvertisementHandler(const AppEvent & event);
+ static void IcdUatEventHandler(const AppEvent & event);
+ static void UpdateLedStateEventHandler(const AppEvent & event);
+
+ static void ChipEventHandler(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg);
+ static void ButtonEventHandler(uint32_t buttonState, uint32_t hasChanged);
+ static void LEDStateUpdateHandler(LEDWidget & ledWidget);
+ static void FunctionTimerTimeoutCallback(k_timer * timer);
+ static void UpdateStatusLED();
+
+ FunctionEvent mFunction = FunctionEvent::NoneSelected;
+ bool mFunctionTimerActive = false;
+
+#if CONFIG_CHIP_FACTORY_DATA
+ chip::DeviceLayer::FactoryDataProvider mFactoryDataProvider;
+#endif
+};
diff --git a/examples/lit-icd-app/nrfconnect/main/include/CHIPProjectConfig.h b/examples/lit-icd-app/nrfconnect/main/include/CHIPProjectConfig.h
new file mode 100644
index 00000000000000..4baa186190f638
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/main/include/CHIPProjectConfig.h
@@ -0,0 +1,28 @@
+/*
+ *
+ * Copyright (c) 2020 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+/**
+ * @file
+ * Example project configuration file for CHIP.
+ *
+ * This is a place to put application or project-specific overrides
+ * to the default configuration values for general CHIP features.
+ *
+ */
+
+#pragma once
diff --git a/examples/lit-icd-app/nrfconnect/main/main.cpp b/examples/lit-icd-app/nrfconnect/main/main.cpp
new file mode 100644
index 00000000000000..0f9b0451e4284d
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/main/main.cpp
@@ -0,0 +1,33 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#include "AppTask.h"
+
+#include
+
+LOG_MODULE_REGISTER(app, CONFIG_CHIP_APP_LOG_LEVEL);
+
+using namespace ::chip;
+
+int main()
+{
+ CHIP_ERROR err = AppTask::Instance().StartApp();
+
+ LOG_ERR("Exited with code %" CHIP_ERROR_FORMAT, err.Format());
+ return err == CHIP_NO_ERROR ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/examples/lit-icd-app/nrfconnect/prj.conf b/examples/lit-icd-app/nrfconnect/prj.conf
new file mode 100644
index 00000000000000..950be7c8c394e4
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/prj.conf
@@ -0,0 +1,46 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# 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.
+#
+
+# This sample uses Kconfig.defaults to set options common for all
+# samples. This file should contain only options specific for this sample
+# or overrides of default values.
+
+# Enable CHIP
+CONFIG_CHIP=y
+CONFIG_CHIP_PROJECT_CONFIG="main/include/CHIPProjectConfig.h"
+CONFIG_STD_CPP17=y
+
+# Add support for LEDs and buttons on Nordic development kits
+CONFIG_DK_LIBRARY=y
+
+# Bluetooth Low Energy configuration
+CONFIG_BT_DEVICE_NAME="MatterLIT"
+
+# Other settings
+CONFIG_THREAD_NAME=y
+CONFIG_MPU_STACK_GUARD=y
+CONFIG_RESET_ON_FATAL_ERROR=n
+
+# Reduce application size
+CONFIG_USE_SEGGER_RTT=n
+
+# Enable Factory Data feature
+CONFIG_CHIP_FACTORY_DATA=y
+CONFIG_CHIP_FACTORY_DATA_BUILD=y
+
+# Enable LIT ICD configuration
+CONFIG_CHIP_ENABLE_ICD_SUPPORT=y
+CONFIG_CHIP_ICD_LIT_SUPPORT=y
diff --git a/examples/lit-icd-app/nrfconnect/prj_no_dfu.conf b/examples/lit-icd-app/nrfconnect/prj_no_dfu.conf
new file mode 100644
index 00000000000000..00607e349a31ab
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/prj_no_dfu.conf
@@ -0,0 +1,48 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# 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.
+#
+
+# This sample uses Kconfig.defaults to set options common for all
+# samples. This file should contain only options specific for this sample
+# or overrides of default values.
+
+# Enable CHIP
+CONFIG_CHIP=y
+CONFIG_CHIP_PROJECT_CONFIG="main/include/CHIPProjectConfig.h"
+CONFIG_STD_CPP17=y
+
+# Add support for LEDs and buttons on Nordic development kits
+CONFIG_DK_LIBRARY=y
+
+# Bluetooth Low Energy configuration
+CONFIG_BT_DEVICE_NAME="MatterLIT"
+
+# Other settings
+CONFIG_THREAD_NAME=y
+CONFIG_MPU_STACK_GUARD=y
+CONFIG_RESET_ON_FATAL_ERROR=n
+
+# Reduce application size
+CONFIG_USE_SEGGER_RTT=n
+
+# Disable Matter OTA DFU
+CONFIG_CHIP_OTA_REQUESTOR=n
+
+# Disable QSPI NOR
+CONFIG_CHIP_QSPI_NOR=n
+
+# Enable LIT ICD configuration
+CONFIG_CHIP_ENABLE_ICD_SUPPORT=y
+CONFIG_CHIP_ICD_LIT_SUPPORT=y
diff --git a/examples/lit-icd-app/nrfconnect/prj_release.conf b/examples/lit-icd-app/nrfconnect/prj_release.conf
new file mode 100644
index 00000000000000..61b6b3dfc6f8f8
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/prj_release.conf
@@ -0,0 +1,60 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# 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.
+#
+
+# This sample uses Kconfig.defaults to set options common for all
+# samples. This file should contain only options specific for this sample
+# or overrides of default values.
+
+# Enable CHIP
+CONFIG_CHIP=y
+CONFIG_CHIP_PROJECT_CONFIG="main/include/CHIPProjectConfig.h"
+CONFIG_STD_CPP17=y
+
+# Add support for LEDs and buttons on Nordic development kits
+CONFIG_DK_LIBRARY=y
+
+# Bluetooth Low Energy configuration
+CONFIG_BT_DEVICE_NAME="MatterLIT"
+
+# Enable system reset on fatal error
+CONFIG_RESET_ON_FATAL_ERROR=y
+
+# Suspend devices when the CPU goes into sleep
+CONFIG_PM_DEVICE=y
+
+# Disable all debug features
+CONFIG_USE_SEGGER_RTT=n
+CONFIG_SHELL=n
+CONFIG_OPENTHREAD_SHELL=n
+CONFIG_CONSOLE=n
+CONFIG_UART_CONSOLE=n
+CONFIG_SERIAL=n
+CONFIG_LOG=n
+CONFIG_LOG_MODE_MINIMAL=n
+CONFIG_ASSERT_VERBOSE=n
+CONFIG_ASSERT_NO_FILE_INFO=y
+CONFIG_PRINTK=n
+CONFIG_PRINTK_SYNC=n
+CONFIG_THREAD_NAME=n
+CONFIG_BOOT_BANNER=n
+
+# Enable Factory Data feature
+CONFIG_CHIP_FACTORY_DATA=y
+CONFIG_CHIP_FACTORY_DATA_BUILD=y
+
+# Enable LIT ICD configuration
+CONFIG_CHIP_ENABLE_ICD_SUPPORT=y
+CONFIG_CHIP_ICD_LIT_SUPPORT=y
diff --git a/examples/lit-icd-app/nrfconnect/third_party/connectedhomeip b/examples/lit-icd-app/nrfconnect/third_party/connectedhomeip
new file mode 120000
index 00000000000000..c866b86874994d
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/third_party/connectedhomeip
@@ -0,0 +1 @@
+../../../..
\ No newline at end of file
diff --git a/examples/platform/silabs/efr32/rs911x/hal/efx32_ncp_host.c b/examples/platform/silabs/efr32/rs911x/hal/efx32_ncp_host.c
index 414153ecd0164c..82976deb6a3b09 100644
--- a/examples/platform/silabs/efr32/rs911x/hal/efx32_ncp_host.c
+++ b/examples/platform/silabs/efr32/rs911x/hal/efx32_ncp_host.c
@@ -15,7 +15,6 @@
*
******************************************************************************/
-#include "FreeRTOS.h"
#include "cmsis_os2.h"
#include "dmadrv.h"
#include "em_cmu.h"
@@ -37,13 +36,16 @@
#include "sl_power_manager.h"
#endif
+#define USART_INITSYNC_BAUDRATE 12500000
+
static bool dma_callback(unsigned int channel, unsigned int sequenceNo, void * userParam);
unsigned int rx_ldma_channel;
unsigned int tx_ldma_channel;
-osMutexId_t spi_transfer_mutex = 0;
+osMutexId_t ncp_transfer_mutex = 0;
static uint32_t dummy_buffer;
+static sl_si91x_host_init_configuration init_config = { 0 };
// LDMA descriptor and transfer configuration structures for USART TX channel
LDMA_Descriptor_t ldmaTXDescriptor;
@@ -70,33 +72,22 @@ static bool dma_callback(unsigned int channel, unsigned int sequenceNo, void * u
static void gpio_interrupt(uint8_t interrupt_number)
{
UNUSED_PARAMETER(interrupt_number);
- sl_si91x_host_set_bus_event(NCP_HOST_BUS_RX_EVENT);
- // GPIO_IntClear(0xAAAA);
-}
-
-void sl_si91x_host_set_sleep_indicator(void)
-{
- GPIO_PinOutSet(SLEEP_CONFIRM_PIN.port, SLEEP_CONFIRM_PIN.pin);
-}
-void sl_si91x_host_clear_sleep_indicator(void)
-{
- GPIO_PinOutClear(SLEEP_CONFIRM_PIN.port, SLEEP_CONFIRM_PIN.pin);
+ if (NULL != init_config.rx_irq)
+ {
+ init_config.rx_irq();
+ }
}
-uint32_t sl_si91x_host_get_wake_indicator(void)
+static void efx32_spi_init(void)
{
- return GPIO_PinInGet(WAKE_INDICATOR_PIN.port, WAKE_INDICATOR_PIN.pin);
-}
+ // Default asynchronous initializer (master mode, 1 Mbps, 8-bit data)
+ USART_InitSync_TypeDef init = USART_INITSYNC_DEFAULT;
-sl_status_t sl_si91x_host_init(void)
-{
- // Enable clock (not needed on xG21)
- CMU_ClockEnable(cmuClock_GPIO, true);
+ init.msbf = true; // MSB first transmission for SPI compatibility
+ init.autoCsEnable = true; // Allow the USART to assert CS
+ init.baudrate = USART_INITSYNC_BAUDRATE;
-#if SL_SPICTRL_MUX
- spi_board_init();
-#endif
// Configure SPI bus pins
GPIO_PinModeSet(SPI_MISO_PIN.port, SPI_MISO_PIN.pin, gpioModeInput, 0);
GPIO_PinModeSet(SPI_MOSI_PIN.port, SPI_MOSI_PIN.pin, gpioModePushPull, 0);
@@ -105,12 +96,6 @@ sl_status_t sl_si91x_host_init(void)
// Enable clock (not needed on xG21)
CMU_ClockEnable(SPI_USART_CMU_CLOCK, true);
- // Default asynchronous initializer (master mode, 1 Mbps, 8-bit data)
- USART_InitSync_TypeDef init = USART_INITSYNC_DEFAULT;
-
- init.msbf = true; // MSB first transmission for SPI compatibility
- init.autoCsEnable = true; // Allow the USART to assert CS
- init.baudrate = 12500000;
/*
* Route USART RX, TX, and CLK to the specified pins. Note that CS is
* not controlled by USART so there is no write to the corresponding
@@ -139,33 +124,64 @@ sl_status_t sl_si91x_host_init(void)
SPI_USART->TIMING |= /*USART_TIMING_TXDELAY_ONE | USART_TIMING_CSSETUP_ONE |*/ USART_TIMING_CSHOLD_ONE;
// SPI_USART->CTRL_SET |= USART_CTRL_SMSDELAY;
+
+ // configure packet pending interrupt priority
+ NVIC_SetPriority(GPIO_ODD_IRQn, PACKET_PENDING_INT_PRI);
+ GPIOINT_CallbackRegister(INTERRUPT_PIN.pin, gpio_interrupt);
+ GPIO_PinModeSet(INTERRUPT_PIN.port, INTERRUPT_PIN.pin, gpioModeInputPullFilter, 0);
+ GPIO_ExtIntConfig(INTERRUPT_PIN.port, INTERRUPT_PIN.pin, INTERRUPT_PIN.pin, true, false, true);
+}
+
+void sl_si91x_host_set_sleep_indicator(void)
+{
+ GPIO_PinOutSet(SLEEP_CONFIRM_PIN.port, SLEEP_CONFIRM_PIN.pin);
+}
+
+void sl_si91x_host_clear_sleep_indicator(void)
+{
+ GPIO_PinOutClear(SLEEP_CONFIRM_PIN.port, SLEEP_CONFIRM_PIN.pin);
+}
+
+uint32_t sl_si91x_host_get_wake_indicator(void)
+{
+ return GPIO_PinInGet(WAKE_INDICATOR_PIN.port, WAKE_INDICATOR_PIN.pin);
+}
+
+sl_status_t sl_si91x_host_init(sl_si91x_host_init_configuration * config)
+{
+ init_config.rx_irq = config->rx_irq;
+ init_config.rx_done = config->rx_done;
+
+ // Enable clock (not needed on xG21)
+ CMU_ClockEnable(cmuClock_GPIO, true);
+
+#if SL_SPICTRL_MUX
+ spi_board_init();
+#endif
+
if (transfer_done_semaphore == NULL)
{
transfer_done_semaphore = osSemaphoreNew(1, 0, NULL);
}
- if (spi_transfer_mutex == 0)
+ if (ncp_transfer_mutex == 0)
{
- spi_transfer_mutex = osMutexNew(NULL);
+ ncp_transfer_mutex = osMutexNew(NULL);
}
- DMADRV_Init();
- DMADRV_AllocateChannel(&rx_ldma_channel, NULL);
- DMADRV_AllocateChannel(&tx_ldma_channel, NULL);
+ efx32_spi_init();
// Start reset line low
GPIO_PinModeSet(RESET_PIN.port, RESET_PIN.pin, gpioModePushPull, 0);
- // configure packet pending interrupt priority
- NVIC_SetPriority(GPIO_ODD_IRQn, PACKET_PENDING_INT_PRI);
-
// Configure interrupt, sleep and wake confirmation pins
- GPIOINT_CallbackRegister(INTERRUPT_PIN.pin, gpio_interrupt);
- GPIO_PinModeSet(INTERRUPT_PIN.port, INTERRUPT_PIN.pin, gpioModeInputPullFilter, 0);
- GPIO_ExtIntConfig(INTERRUPT_PIN.port, INTERRUPT_PIN.pin, INTERRUPT_PIN.pin, true, false, true);
GPIO_PinModeSet(SLEEP_CONFIRM_PIN.port, SLEEP_CONFIRM_PIN.pin, gpioModeWiredOrPullDown, 1);
GPIO_PinModeSet(WAKE_INDICATOR_PIN.port, WAKE_INDICATOR_PIN.pin, gpioModeWiredOrPullDown, 0);
+ DMADRV_Init();
+ DMADRV_AllocateChannel(&rx_ldma_channel, NULL);
+ DMADRV_AllocateChannel(&tx_ldma_channel, NULL);
+
return SL_STATUS_OK;
}
@@ -174,11 +190,7 @@ sl_status_t sl_si91x_host_deinit(void)
return SL_STATUS_OK;
}
-void sl_si91x_host_enable_high_speed_bus()
-{
- // SPI_USART->CTRL_SET |= USART_CTRL_SMSDELAY | USART_CTRL_SSSEARLY;
- // USART_BaudrateSyncSet(SPI_USART, 0, 20000000);
-}
+void sl_si91x_host_enable_high_speed_bus() {}
/*==================================================================*/
/**
@@ -194,7 +206,7 @@ void sl_si91x_host_enable_high_speed_bus()
*/
sl_status_t sl_si91x_host_spi_transfer(const void * tx_buffer, void * rx_buffer, uint16_t buffer_length)
{
- osMutexAcquire(spi_transfer_mutex, 0xFFFFFFFFUL);
+ osMutexAcquire(ncp_transfer_mutex, 0xFFFFFFFFUL);
#if SL_SPICTRL_MUX
sl_wfx_host_spi_cs_assert();
@@ -268,7 +280,7 @@ sl_status_t sl_si91x_host_spi_transfer(const void * tx_buffer, void * rx_buffer,
}
}
- osMutexRelease(spi_transfer_mutex);
+ osMutexRelease(ncp_transfer_mutex);
#if SL_SPICTRL_MUX
sl_wfx_host_spi_cs_deassert();
#endif // SL_SPICTRL_MUX
@@ -288,6 +300,7 @@ void sl_si91x_host_release_from_reset(void)
void sl_si91x_host_enable_bus_interrupt(void)
{
+ NVIC_ClearPendingIRQ(GPIO_ODD_IRQn);
NVIC_EnableIRQ(GPIO_ODD_IRQn);
}
diff --git a/examples/platform/silabs/efr32/rs911x/rs9117.gni b/examples/platform/silabs/efr32/rs911x/rs9117.gni
index 251de0be213fe6..5a561c9f201eab 100644
--- a/examples/platform/silabs/efr32/rs911x/rs9117.gni
+++ b/examples/platform/silabs/efr32/rs911x/rs9117.gni
@@ -27,7 +27,8 @@ rs9117_src_sapi = [
"${wifi_sdk_root}/components/device/silabs/si91x/wireless/sl_net/src/sl_net_rsi_utility.c",
"${wifi_sdk_root}/components/device/silabs/si91x/wireless/sl_net/src/sl_net_si91x_integration_handler.c",
"${wifi_sdk_root}/components/device/silabs/si91x/wireless/sl_net/src/sl_si91x_net_credentials.c",
- "${wifi_sdk_root}/components/device/silabs/si91x/wireless/spi_interface/sl_si91x_spi_driver.c",
+ "${wifi_sdk_root}/components/device/silabs/si91x/wireless/ncp_interface/spi/sl_si91x_spi.c",
+ "${wifi_sdk_root}/components/device/silabs/si91x/wireless/ncp_interface/sl_si91x_ncp_driver.c",
# wifi component
"${wifi_sdk_root}/components/protocol/wifi/src/sl_wifi_callback_framework.c",
diff --git a/examples/platform/silabs/efr32/wf200/host_if.cpp b/examples/platform/silabs/efr32/wf200/host_if.cpp
index 3240c2642a3080..041a1778421ed3 100644
--- a/examples/platform/silabs/efr32/wf200/host_if.cpp
+++ b/examples/platform/silabs/efr32/wf200/host_if.cpp
@@ -607,7 +607,7 @@ static void wfx_events_task(void * p_arg)
{
// Enable the power save
SILABS_LOG("WF200 going to DTIM based sleep");
- sl_wfx_set_power_mode(WFM_PM_MODE_DTIM, WFM_PM_POLL_FAST_PS, BEACON_1);
+ sl_wfx_set_power_mode(WFM_PM_MODE_DTIM, WFM_PM_POLL_FAST_PS, BEACON_1, 0 /*timeout*/);
sl_wfx_enable_device_power_save();
}
#endif /* CHIP_CONFIG_ENABLE_ICD_SERVER */
diff --git a/examples/temperature-measurement-app/esp32/README.md b/examples/temperature-measurement-app/esp32/README.md
index 18d07ff639b06a..99347fc6ead9f4 100644
--- a/examples/temperature-measurement-app/esp32/README.md
+++ b/examples/temperature-measurement-app/esp32/README.md
@@ -51,9 +51,39 @@ chip-tool pairing ble-wifi 1 SSID PASSPHRASE 20202021 3840
chip-tool diagnosticlogs retrieve-logs-request 0 0 1 0
# Read network diagnostic using BDX protocol
-chip-tool diagnosticlogs retrieve-logs-request 1 0 1 0 --TransferFileDesignator network-diag.log
+chip-tool interactive start
+> diagnosticlogs retrieve-logs-request 1 1 1 0 --TransferFileDesignator network-diag.log
+# Retrieve crash over BDX
+> diagnosticlogs retrieve-logs-request 1 1 1 0 --TransferFileDesignator crash.bin
```
+esp-idf supports storing and retrieving
+[core dump in flash](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/core_dump.html#core-dump-to-flash).
+
+To support that, application needs to add core dump partition's entry in
+[partitons.csv](partitions.csv#7) and we need to enable few menuconfig options.
+
+```
+CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH=y
+CONFIG_ESP32_COREDUMP_DATA_FORMAT_ELF=y
+```
+
+This example's partition table and sdkconfig.default are already modified
+
+- Retrieve the core dump using diagnostic logs cluster
+
+ ```
+ # Read crash logs over BDX
+ chip-tool interactive start
+ > diagnosticlogs retrieve-logs-request 1 1 1 0 --TransferFileDesignator crash.bin
+ ```
+
+- Decode the crash logs, using espcoredump.py
+ ```
+ espcoredump.py --chip (CHIP) info_corefile --core /tmp/crash.bin \
+ --core-format elf build/chip-temperature-measurement-app.elf
+ ```
+
## Optimization
Optimization related to WiFi, BLuetooth, Asserts etc are the part of this
diff --git a/examples/temperature-measurement-app/esp32/main/CMakeLists.txt b/examples/temperature-measurement-app/esp32/main/CMakeLists.txt
index 8953d34869b76a..062266652dc303 100644
--- a/examples/temperature-measurement-app/esp32/main/CMakeLists.txt
+++ b/examples/temperature-measurement-app/esp32/main/CMakeLists.txt
@@ -55,7 +55,7 @@ set(SRC_DIRS_LIST
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/providers"
)
-set(PRIV_REQUIRES_LIST chip QRCode bt nvs_flash)
+set(PRIV_REQUIRES_LIST chip QRCode bt nvs_flash bootloader_support espcoredump)
if (CONFIG_ENABLE_PW_RPC)
# Append additional directories for RPC build
@@ -83,7 +83,7 @@ endif (CONFIG_ENABLE_PW_RPC)
idf_component_register(PRIV_INCLUDE_DIRS ${PRIV_INCLUDE_DIRS_LIST}
SRC_DIRS ${SRC_DIRS_LIST}
PRIV_REQUIRES ${PRIV_REQUIRES_LIST}
- EMBED_FILES diagnostic_logs/end_user_support.log diagnostic_logs/network_diag.log diagnostic_logs/crash.log)
+ EMBED_FILES diagnostic_logs/end_user_support.log diagnostic_logs/network_diag.log)
include("${CHIP_ROOT}/build/chip/esp32/esp32_codegen.cmake")
chip_app_component_codegen("${CHIP_ROOT}/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.matter")
diff --git a/examples/temperature-measurement-app/esp32/main/diagnostic-logs-provider-delegate-impl.cpp b/examples/temperature-measurement-app/esp32/main/diagnostic-logs-provider-delegate-impl.cpp
index 4bef0fbd86cc19..5034e3f928788f 100644
--- a/examples/temperature-measurement-app/esp32/main/diagnostic-logs-provider-delegate-impl.cpp
+++ b/examples/temperature-measurement-app/esp32/main/diagnostic-logs-provider-delegate-impl.cpp
@@ -19,10 +19,19 @@
#include
#include
+#if defined(CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH) && defined(CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF)
+#include
+#include
+// Its a bit hackish but we need this in order to pull in the sizeof(core_dump_header_t)
+// we can even use the static 20 but, what if that gets chagned?
+#include "../include_core_dump/esp_core_dump_types.h"
+#endif // defined(CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH) && defined(CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF)
+
using namespace chip;
using namespace chip::app::Clusters::DiagnosticLogs;
LogProvider LogProvider::sInstance;
+LogProvider::CrashLogContext LogProvider::sCrashLogContext;
namespace {
bool IsValidIntent(IntentEnum intent)
@@ -30,24 +39,21 @@ bool IsValidIntent(IntentEnum intent)
return intent != IntentEnum::kUnknownEnumValue;
}
-// end_user_support.log, network_diag.log, and crash.log files are embedded in the firmware
+// end_user_support.log and network_diag.log files are embedded in the firmware
extern const uint8_t endUserSupportLogStart[] asm("_binary_end_user_support_log_start");
extern const uint8_t endUserSupportLogEnd[] asm("_binary_end_user_support_log_end");
extern const uint8_t networkDiagnosticLogStart[] asm("_binary_network_diag_log_start");
extern const uint8_t networkDiagnosticLogEnd[] asm("_binary_network_diag_log_end");
-
-extern const uint8_t crashLogStart[] asm("_binary_crash_log_start");
-extern const uint8_t crashLogEnd[] asm("_binary_crash_log_end");
} // namespace
LogProvider::~LogProvider()
{
- for (auto sessionSpan : mSessionSpanMap)
+ for (auto sessionSpan : mSessionContextMap)
{
Platform::MemoryFree(sessionSpan.second);
}
- mSessionSpanMap.clear();
+ mSessionContextMap.clear();
}
CHIP_ERROR LogProvider::GetLogForIntent(IntentEnum intent, MutableByteSpan & outBuffer, Optional & outTimeStamp,
@@ -69,93 +75,233 @@ CHIP_ERROR LogProvider::GetLogForIntent(IntentEnum intent, MutableByteSpan & out
return CHIP_NO_ERROR;
}
-const uint8_t * LogProvider::GetDataStartForIntent(IntentEnum intent)
+size_t LogProvider::GetSizeForIntent(IntentEnum intent)
{
switch (intent)
{
case IntentEnum::kEndUserSupport:
- return &endUserSupportLogStart[0];
+ return static_cast(endUserSupportLogEnd - endUserSupportLogStart);
case IntentEnum::kNetworkDiag:
- return &networkDiagnosticLogStart[0];
+ return static_cast(networkDiagnosticLogEnd - networkDiagnosticLogStart);
case IntentEnum::kCrashLogs:
- return &crashLogStart[0];
+ return GetCrashSize();
default:
- return nullptr;
+ return 0;
}
}
-size_t LogProvider::GetSizeForIntent(IntentEnum intent)
+size_t LogProvider::GetCrashSize()
{
+ size_t outSize = 0;
+
+#if defined(CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH) && defined(CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF)
+ size_t unusedOutAddr;
+ esp_err_t esp_err = esp_core_dump_image_get(&unusedOutAddr, &outSize);
+ VerifyOrReturnValue(esp_err == ESP_OK, 0, ChipLogError(DeviceLayer, "Failed to get core dump image, esp_err:%d", esp_err));
+#endif // defined(CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH) && defined(CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF)
+
+ return outSize;
+}
+
+CHIP_ERROR LogProvider::MapCrashPartition(CrashLogContext * context)
+{
+#if defined(CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH) && defined(CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF)
+ size_t outAddr, outSize;
+ esp_err_t esp_err = esp_core_dump_image_get(&outAddr, &outSize);
+ VerifyOrReturnError(esp_err == ESP_OK, CHIP_ERROR(ChipError::Range::kPlatform, esp_err),
+ ChipLogError(DeviceLayer, "Failed to get core dump image, esp_err:%d", esp_err));
+
+ /* map the full core dump parition, including the checksum. */
+ esp_err = spi_flash_mmap(outAddr, outSize, SPI_FLASH_MMAP_DATA, &context->mappedAddress, &context->mappedHandle);
+ VerifyOrReturnError(esp_err == ESP_OK, CHIP_ERROR(ChipError::Range::kPlatform, esp_err),
+ ChipLogError(DeviceLayer, "Failed to mmap the crash partition, esp_err:%d", esp_err));
+
+ context->crashSize = static_cast(outSize);
+ return CHIP_NO_ERROR;
+#else
+ return CHIP_ERROR_NOT_FOUND;
+#endif // defined(CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH) && defined(CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF)
+}
+
+CHIP_ERROR LogProvider::PrepareLogContextForIntent(LogContext * context, IntentEnum intent)
+{
+ context->intent = intent;
+
switch (intent)
{
+ case IntentEnum::kEndUserSupport: {
+ context->EndUserSupport.span =
+ ByteSpan(&endUserSupportLogStart[0], static_cast(endUserSupportLogEnd - endUserSupportLogStart));
+ }
+ break;
+
+ case IntentEnum::kNetworkDiag: {
+ context->NetworkDiag.span =
+ ByteSpan(&networkDiagnosticLogStart[0], static_cast(networkDiagnosticLogEnd - networkDiagnosticLogStart));
+ }
+ break;
+
+ case IntentEnum::kCrashLogs: {
+#if defined(CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH) && defined(CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF)
+ sCrashLogContext.Reset();
+ context->Crash.logContext = &sCrashLogContext;
+
+ CHIP_ERROR err = MapCrashPartition(context->Crash.logContext);
+ VerifyOrReturnError(err == CHIP_NO_ERROR, err, context->Crash.logContext = nullptr);
+
+ context->Crash.logContext->readOffset = sizeof(core_dump_header_t);
+ context->Crash.logContext->isMapped = true;
+#else
+ return CHIP_ERROR_NOT_FOUND;
+#endif // defined(CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH) && defined(CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF)
+ }
+ break;
+
+ default:
+ return CHIP_ERROR_INVALID_ARGUMENT;
+ }
+
+ return CHIP_NO_ERROR;
+}
+
+void LogProvider::CleanupLogContextForIntent(LogContext * context)
+{
+ switch (context->intent)
+ {
case IntentEnum::kEndUserSupport:
- return static_cast(endUserSupportLogEnd - endUserSupportLogStart);
+ break;
+
case IntentEnum::kNetworkDiag:
- return static_cast(networkDiagnosticLogEnd - networkDiagnosticLogStart);
- case IntentEnum::kCrashLogs:
- return static_cast(crashLogEnd - crashLogStart);
+ break;
+
+ case IntentEnum::kCrashLogs: {
+#if defined(CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH) && defined(CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF)
+ CrashLogContext * logContext = context->Crash.logContext;
+ spi_flash_munmap(logContext->mappedHandle);
+ logContext->Reset();
+#endif // defined(CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH) && defined(CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF)
+ }
+ break;
+
default:
- return 0;
+ break;
}
}
+CHIP_ERROR LogProvider::GetDataForIntent(LogContext * context, MutableByteSpan & outBuffer, bool & outIsEndOfLog)
+{
+ switch (context->intent)
+ {
+ case IntentEnum::kEndUserSupport: {
+ auto dataSize = context->EndUserSupport.span.size();
+ auto count = std::min(dataSize, outBuffer.size());
+
+ VerifyOrReturnError(CanCastTo(count), CHIP_ERROR_INVALID_ARGUMENT, outBuffer.reduce_size(0));
+ ReturnErrorOnFailure(CopySpanToMutableSpan(ByteSpan(context->EndUserSupport.span.data(), count), outBuffer));
+
+ outIsEndOfLog = dataSize == count;
+ if (!outIsEndOfLog)
+ {
+ // reduce the span after reading count bytes
+ context->EndUserSupport.span = context->EndUserSupport.span.SubSpan(count);
+ }
+ }
+ break;
+
+ case IntentEnum::kNetworkDiag: {
+ auto dataSize = context->NetworkDiag.span.size();
+ auto count = std::min(dataSize, outBuffer.size());
+
+ VerifyOrReturnError(CanCastTo(count), CHIP_ERROR_INVALID_ARGUMENT, outBuffer.reduce_size(0));
+ ReturnErrorOnFailure(CopySpanToMutableSpan(ByteSpan(context->NetworkDiag.span.data(), count), outBuffer));
+
+ outIsEndOfLog = dataSize == count;
+ if (!outIsEndOfLog)
+ {
+ // reduce the span after reading count bytes
+ context->NetworkDiag.span = context->NetworkDiag.span.SubSpan(count);
+ }
+ }
+ break;
+
+ case IntentEnum::kCrashLogs: {
+#if defined(CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH) && defined(CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF)
+ CrashLogContext * logContext = context->Crash.logContext;
+ size_t dataSize = logContext->crashSize - logContext->readOffset;
+ auto count = std::min(dataSize, outBuffer.size());
+
+ VerifyOrReturnError(CanCastTo(count), CHIP_ERROR_INVALID_ARGUMENT, outBuffer.reduce_size(0));
+
+ const uint8_t * readAddr = reinterpret_cast(logContext->mappedAddress) + logContext->readOffset;
+ memcpy(outBuffer.data(), readAddr, count);
+ outBuffer.reduce_size(count);
+
+ logContext->readOffset += count;
+ outIsEndOfLog = dataSize == count;
+#else
+ outBuffer.reduce_size(0);
+ return CHIP_ERROR_NOT_FOUND;
+#endif // defined(CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH) && defined(CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF)
+ }
+ break;
+
+ default:
+ return CHIP_ERROR_INVALID_ARGUMENT;
+ }
+
+ return CHIP_NO_ERROR;
+}
+
CHIP_ERROR LogProvider::StartLogCollection(IntentEnum intent, LogSessionHandle & outHandle, Optional & outTimeStamp,
Optional & outTimeSinceBoot)
{
VerifyOrReturnValue(IsValidIntent(intent), CHIP_ERROR_INVALID_ARGUMENT);
- const uint8_t * dataStart = GetDataStartForIntent(intent);
- VerifyOrReturnError(dataStart, CHIP_ERROR_NOT_FOUND);
-
- size_t dataSize = GetSizeForIntent(intent);
- VerifyOrReturnError(dataSize, CHIP_ERROR_NOT_FOUND);
+ // In case of crash logs we can only mmap at max once, so check before doing anything
+ if (intent == IntentEnum::kCrashLogs)
+ {
+ VerifyOrReturnError(sCrashLogContext.isMapped == false, CHIP_ERROR_INCORRECT_STATE,
+ ChipLogError(DeviceLayer, "Crash partition already mapped"));
+ }
- ByteSpan * span = reinterpret_cast(Platform::MemoryCalloc(1, sizeof(ByteSpan)));
- VerifyOrReturnValue(span, CHIP_ERROR_NO_MEMORY);
+ LogContext * context = reinterpret_cast(Platform::MemoryCalloc(1, sizeof(LogContext)));
+ VerifyOrReturnValue(context != nullptr, CHIP_ERROR_NO_MEMORY);
- *span = ByteSpan(dataStart, dataSize);
+ CHIP_ERROR err = PrepareLogContextForIntent(context, intent);
+ VerifyOrReturnError(err == CHIP_NO_ERROR, err, Platform::MemoryFree(context));
mLogSessionHandle++;
// If the session handle rolls over to UINT16_MAX which is invalid, reset to 0.
VerifyOrDo(mLogSessionHandle != kInvalidLogSessionHandle, mLogSessionHandle = 0);
- outHandle = mLogSessionHandle;
- mSessionSpanMap[mLogSessionHandle] = span;
+ outHandle = mLogSessionHandle;
+ mSessionContextMap[mLogSessionHandle] = context;
+
return CHIP_NO_ERROR;
}
CHIP_ERROR LogProvider::EndLogCollection(LogSessionHandle sessionHandle)
{
VerifyOrReturnValue(sessionHandle != kInvalidLogSessionHandle, CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrReturnValue(mSessionSpanMap.count(sessionHandle), CHIP_ERROR_INVALID_ARGUMENT);
+ VerifyOrReturnValue(mSessionContextMap.count(sessionHandle), CHIP_ERROR_INVALID_ARGUMENT);
- ByteSpan * span = mSessionSpanMap[sessionHandle];
- mSessionSpanMap.erase(sessionHandle);
+ LogContext * context = mSessionContextMap[sessionHandle];
+ VerifyOrReturnError(context, CHIP_ERROR_INCORRECT_STATE);
+
+ CleanupLogContextForIntent(context);
+ Platform::MemoryFree(context);
+ mSessionContextMap.erase(sessionHandle);
- Platform::MemoryFree(span);
return CHIP_NO_ERROR;
}
CHIP_ERROR LogProvider::CollectLog(LogSessionHandle sessionHandle, MutableByteSpan & outBuffer, bool & outIsEndOfLog)
{
VerifyOrReturnValue(sessionHandle != kInvalidLogSessionHandle, CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrReturnValue(mSessionSpanMap.count(sessionHandle), CHIP_ERROR_INVALID_ARGUMENT);
-
- ByteSpan * span = mSessionSpanMap[sessionHandle];
- auto dataSize = span->size();
- auto count = std::min(dataSize, outBuffer.size());
-
- VerifyOrReturnError(CanCastTo(count), CHIP_ERROR_INVALID_ARGUMENT, outBuffer.reduce_size(0));
-
- ReturnErrorOnFailure(CopySpanToMutableSpan(ByteSpan(span->data(), count), outBuffer));
+ VerifyOrReturnValue(mSessionContextMap.count(sessionHandle), CHIP_ERROR_INVALID_ARGUMENT);
- outIsEndOfLog = dataSize == count;
+ LogContext * context = mSessionContextMap[sessionHandle];
+ VerifyOrReturnError(context, CHIP_ERROR_INCORRECT_STATE);
- if (!outIsEndOfLog)
- {
- // reduce the span after reading count bytes
- *span = span->SubSpan(count);
- }
-
- return CHIP_NO_ERROR;
+ return GetDataForIntent(context, outBuffer, outIsEndOfLog);
}
diff --git a/examples/temperature-measurement-app/esp32/main/diagnostic_logs/crash.log b/examples/temperature-measurement-app/esp32/main/diagnostic_logs/crash.log
deleted file mode 100644
index 04089de8ce7afd..00000000000000
--- a/examples/temperature-measurement-app/esp32/main/diagnostic_logs/crash.log
+++ /dev/null
@@ -1,21 +0,0 @@
-W (5047Guru Meditation Error: Core 0 panic'ed (LoadProhibited). Exception was unhandled.
-
-Core 0 register dump:
-PC : 0x4009579a PS : 0x00060c33 A0 : 0x800941e1 A1 : 0x3fff3630
-0x4009579a: uxListRemove at /opt/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/list.c:195
-
-A2 : 0x00000006 A3 : 0x00060c20 A4 : 0x00000000 A5 : 0x00060c23
-A6 : 0xb33fffff A7 : 0xb33fffff A8 : 0x800950f0 A9 : 0x3fff3600
-A10 : 0x00000001 A11 : 0x000000fe A12 : 0x00000000 A13 : 0x00000000
-A14 : 0x00000000 A15 : 0x00000000 SAR : 0x0000000a EXCCAUSE: 0x0000001c
-EXCVADDR: 0x00000016 LBEG : 0x4000c2e0 LEND : 0x4000c2f6 LCOUNT : 0xffffffff
-0x4000c2e0: memcpy in ROM
-0x4000c2f6: memcpy in ROM
-
-Backtrace: 0x40095797:0x3fff3630 0x400941de:0x3fff3650 0x40154b39:0x3fff3670 0x40154b53:0x3fff3690 0x4013e20d:0x3fff36b0 0x40094fa6:0x3fff36d0
-0x40095797: uxListRemove at /opt/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/list.c:202
-0x400941de: vTaskDelete at /opt/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/tasks.c:1434 (discriminator 4)
-0x40154b39: esp_nimble_disable at /opt/espressif/esp-idf/components/bt/host/nimble/nimble/porting/npl/freertos/src/nimble_port_freertos.c:55
-0x40154b53: nimble_port_freertos_deinit at /opt/espressif/esp-idf/components/bt/host/nimble/nimble/porting/npl/freertos/src/nimble_port_freertos.c:80
-0x4013e20d: chip::DeviceLayer::Internal::BLEManagerImpl::bleprph_host_task(void*) at /home/smart/projects/smp_matter/build/esp-idf/chip/../../../../../../../opt/espressif/esp-matter/connectedhomeip/connectedhomeip/config/esp32/third_party/connectedhomeip/src/platform/ESP32/nimble/BLEManagerImpl.cpp:864
-0x40094fa6: vPortTaskWrapper at /opt/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:162
diff --git a/examples/temperature-measurement-app/esp32/main/include/diagnostic-logs-provider-delegate-impl.h b/examples/temperature-measurement-app/esp32/main/include/diagnostic-logs-provider-delegate-impl.h
index d47dccafa6079d..c3d1bd389fb39b 100644
--- a/examples/temperature-measurement-app/esp32/main/include/diagnostic-logs-provider-delegate-impl.h
+++ b/examples/temperature-measurement-app/esp32/main/include/diagnostic-logs-provider-delegate-impl.h
@@ -20,6 +20,7 @@
#include
#include