diff --git a/.github/workflows/cirque.yaml b/.github/workflows/cirque.yaml index e71ea876e5100a..9f1bfc207f92c8 100644 --- a/.github/workflows/cirque.yaml +++ b/.github/workflows/cirque.yaml @@ -71,7 +71,7 @@ jobs: - name: Get Cirque Bootstrap cache key id: cirque-bootstrap-cache-key run: echo "val=$(scripts/tests/cirque_tests.sh cachekeyhash)" >> $GITHUB_OUTPUT - - uses: Wandalen/wretry.action@v1.3.0 + - uses: Wandalen/wretry.action@v1.4.4 name: Cirque Bootstrap cache if: ${{ !env.ACT }} continue-on-error: true diff --git a/.github/workflows/darwin-tests.yaml b/.github/workflows/darwin-tests.yaml index 288166dfb87130..05943be5b0e155 100644 --- a/.github/workflows/darwin-tests.yaml +++ b/.github/workflows/darwin-tests.yaml @@ -99,6 +99,7 @@ jobs: --target darwin-x64-tv-app-${BUILD_VARIANT} \ --target darwin-x64-bridge-${BUILD_VARIANT} \ --target darwin-x64-lit-icd-${BUILD_VARIANT} \ + --target darwin-x64-microwave-oven-${BUILD_VARIANT} \ build \ --copy-artifacts-to objdir-clone \ " @@ -118,6 +119,7 @@ jobs: --ota-requestor-app ./out/darwin-x64-ota-requestor-${BUILD_VARIANT}/chip-ota-requestor-app \ --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 \ " - name: Run OTA Test run: | diff --git a/.github/workflows/examples-k32w.yaml b/.github/workflows/examples-k32w.yaml index 363111a26c0a9c..be2d372e88c177 100644 --- a/.github/workflows/examples-k32w.yaml +++ b/.github/workflows/examples-k32w.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-k32w:32 + image: ghcr.io/project-chip/chip-build-k32w:33 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml index 9b4eabfb63046e..fadc0da4a42f3c 100644 --- a/.github/workflows/gradle-wrapper-validation.yml +++ b/.github/workflows/gradle-wrapper-validation.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: Wandalen/wretry.action@v1.3.0 + - uses: Wandalen/wretry.action@v1.4.4 name: Gradle Validation continue-on-error: true with: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 613c3aeb6b4e47..189f63837c841e 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -119,7 +119,6 @@ jobs: --known-failure app/reporting/tests/MockReportScheduler.h \ --known-failure app/server/AppDelegate.h \ --known-failure app/TestEventTriggerDelegate.h \ - --known-failure app/util/af-enums.h \ --known-failure app/util/af.h \ --known-failure app/util/af-types.h \ --known-failure app/util/attribute-metadata.h \ @@ -137,7 +136,6 @@ jobs: --known-failure app/util/ember-compatibility-functions.cpp \ --known-failure app/util/endpoint-config-api.h \ --known-failure app/util/endpoint-config-defines.h \ - --known-failure app/util/error-mapping.h \ --known-failure app/util/generic-callbacks.h \ --known-failure app/util/generic-callback-stubs.cpp \ --known-failure app/util/im-client-callbacks.h \ @@ -198,7 +196,7 @@ jobs: - name: Check for incorrect error use in VerifyOrExit if: always() run: | - git grep -n "VerifyOrExit(.*, [A-Za-z]*_ERROR" -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 + git grep -I -n "VerifyOrExit(.*, [A-Za-z]*_ERROR" -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 # git grep exits with 0 if it finds a match, but we want # to fail (exit nonzero) on match. And we want to exclude this file, @@ -206,7 +204,7 @@ jobs: - name: Check for use of PRI*8, which are not supported on some libcs. if: always() run: | - git grep -n "PRI.8" -- './*' ':(exclude).github/workflows/lint.yml' ':(exclude)third_party/lwip/repo/lwip/src/include/lwip/arch.h' && exit 1 || exit 0 + git grep -I -n "PRI.8" -- './*' ':(exclude).github/workflows/lint.yml' ':(exclude)third_party/lwip/repo/lwip/src/include/lwip/arch.h' && exit 1 || exit 0 # git grep exits with 0 if it finds a match, but we want # to fail (exit nonzero) on match. And we want to exclude this file, @@ -214,7 +212,7 @@ jobs: - name: Check for use of PRI*16, which are not supported on some libcs. if: always() run: | - git grep -n "PRI.16" -- './*' ':(exclude).github/workflows/lint.yml' ':(exclude)third_party/lwip/repo/lwip/src/include/lwip/arch.h' && exit 1 || exit 0 + git grep -I -n "PRI.16" -- './*' ':(exclude).github/workflows/lint.yml' ':(exclude)third_party/lwip/repo/lwip/src/include/lwip/arch.h' && exit 1 || exit 0 # git grep exits with 0 if it finds a match, but we want # to fail (exit nonzero) on match. And we want to exclude this file, @@ -227,7 +225,7 @@ jobs: # TODO: TLVDebug should ideally not be excluded here. # TODO: protocol_decoder.cpp should ideally not be excluded here. # TODO: PersistentStorageMacros.h should ideally not be excluded here. - git grep -n "PRI.64" -- './*' ':(exclude).github/workflows/lint.yml' ':(exclude)examples/chip-tool' ':(exclude)examples/tv-casting-app' ':(exclude)src/app/MessageDef/MessageDefHelper.cpp' ':(exclude)src/app/tests/integration/chip_im_initiator.cpp' ':(exclude)src/lib/core/TLVDebug.cpp' ':(exclude)src/lib/dnssd/tests/TestTxtFields.cpp' ':(exclude)src/lib/format/protocol_decoder.cpp' ':(exclude)src/lib/support/PersistentStorageMacros.h' ':(exclude)src/messaging/tests/echo/echo_requester.cpp' ':(exclude)src/platform/Linux' ':(exclude)src/platform/Ameba' ':(exclude)src/platform/ESP32' ':(exclude)src/platform/webos' ':(exclude)zzz_generated/chip-tool' ':(exclude)src/tools/chip-cert/Cmd_PrintCert.cpp' && exit 1 || exit 0 + git grep -I -n "PRI.64" -- './*' ':(exclude).github/workflows/lint.yml' ':(exclude)examples/chip-tool' ':(exclude)examples/tv-casting-app' ':(exclude)src/app/MessageDef/MessageDefHelper.cpp' ':(exclude)src/app/tests/integration/chip_im_initiator.cpp' ':(exclude)src/lib/core/TLVDebug.cpp' ':(exclude)src/lib/dnssd/tests/TestTxtFields.cpp' ':(exclude)src/lib/format/protocol_decoder.cpp' ':(exclude)src/lib/support/PersistentStorageMacros.h' ':(exclude)src/messaging/tests/echo/echo_requester.cpp' ':(exclude)src/platform/Linux' ':(exclude)src/platform/Ameba' ':(exclude)src/platform/ESP32' ':(exclude)src/platform/webos' ':(exclude)zzz_generated/chip-tool' ':(exclude)src/tools/chip-cert/Cmd_PrintCert.cpp' && exit 1 || exit 0 # git grep exits with 0 if it finds a match, but we want # to fail (exit nonzero) on match. And we want to exclude this file, @@ -262,7 +260,7 @@ jobs: - name: Check for use of 0x%u and the like, which lead to misleading output. if: always() run: | - git grep -n '0x%[0-9l.-]*[^0-9lxX".-]' -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 + git grep -I -n '0x%[0-9l.-]*[^0-9lxX".-]' -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 # git grep exits with 0 if it finds a match, but we want # to fail (exit nonzero) on match. And we want to exclude this file, @@ -270,7 +268,7 @@ jobs: - name: Check for use of '"0x" PRIu*' and the like, which lead to misleading output. if: always() run: | - git grep -n '0x%[0-9-]*" *PRI[^xX]' -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 + git grep -I -n '0x%[0-9-]*" *PRI[^xX]' -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 # git grep exits with 0 if it finds a match, but we want # to fail (exit nonzero) on match. @@ -286,7 +284,7 @@ jobs: - name: Check for use of 'emberAfReadAttribute' instead of the type-safe getters if: always() run: | - git grep -n 'emberAfReadAttribute' -- './*' ':(exclude).github/workflows/lint.yml' ':(exclude)src/app/util/af.h' ':(exclude)zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp' ':(exclude)src/app/zap-templates/templates/app/attributes/Accessors-src.zapt' ':(exclude)src/app/util/attribute-table.cpp' && exit 1 || exit 0 + git grep -I -n 'emberAfReadAttribute' -- './*' ':(exclude).github/workflows/lint.yml' ':(exclude)src/app/util/af.h' ':(exclude)zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp' ':(exclude)src/app/zap-templates/templates/app/attributes/Accessors-src.zapt' ':(exclude)src/app/util/attribute-table.cpp' && exit 1 || exit 0 # git grep exits with 0 if it finds a match, but we want # to fail (exit nonzero) on match. And we want to exclude this file, @@ -296,7 +294,7 @@ jobs: - name: Check for use of 'emberAfWriteAttribute' instead of the type-safe setters if: always() run: | - git grep -n 'emberAfWriteAttribute' -- './*' ':(exclude).github/workflows/lint.yml' ':(exclude)src/app/util/af.h' ':(exclude)zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp' ':(exclude)src/app/zap-templates/templates/app/attributes/Accessors-src.zapt' ':(exclude)src/app/util/attribute-table.cpp' ':(exclude)examples/common/pigweed/rpc_services/Attributes.h' ':(exclude)src/app/util/attribute-table.h' ':(exclude)src/app/util/ember-compatibility-functions.cpp' && exit 1 || exit 0 + git grep -I -n 'emberAfWriteAttribute' -- './*' ':(exclude).github/workflows/lint.yml' ':(exclude)src/app/util/af.h' ':(exclude)zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.cpp' ':(exclude)src/app/zap-templates/templates/app/attributes/Accessors-src.zapt' ':(exclude)src/app/util/attribute-table.cpp' ':(exclude)examples/common/pigweed/rpc_services/Attributes.h' ':(exclude)src/app/util/attribute-table.h' ':(exclude)src/app/util/ember-compatibility-functions.cpp' && exit 1 || exit 0 # Run python Linter (flake8) and verify python files # ignore some style errors, restyler should do that @@ -311,7 +309,7 @@ jobs: - name: Check for use of "SuccessOrExit(CHIP_ERROR_*)", which should probably be "SuccessOrExit(err = CHIP_ERROR_*)" if: always() run: | - git grep -n 'SuccessOrExit(CHIP_ERROR' -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 + git grep -I -n 'SuccessOrExit(CHIP_ERROR' -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 # git grep exits with 0 if it finds a match, but we want # to fail (exit nonzero) on match. And we want to exclude this file, @@ -319,4 +317,4 @@ jobs: - name: Check for use of "SuccessOrExit(something-without-assignment(", which should probably be "SuccessOrExit(err = something(" if: always() run: | - git grep -n 'SuccessOrExit([^=)]*(' -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 + git grep -I -n 'SuccessOrExit([^=)]*(' -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index cba353a8ecfebd..9d6fcf4ec31bba 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -212,6 +212,7 @@ jobs: --target linux-x64-tv-app-${BUILD_VARIANT} \ --target linux-x64-bridge-${BUILD_VARIANT} \ --target linux-x64-lit-icd-${BUILD_VARIANT} \ + --target linux-x64-microwave-oven-${BUILD_VARIANT} \ build \ --copy-artifacts-to objdir-clone \ " @@ -232,6 +233,7 @@ jobs: --tv-app ./out/linux-x64-tv-app-${BUILD_VARIANT}/chip-tv-app \ --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 \ " - name: Run purposeful failure tests using the python parser sending commands to chip-tool @@ -271,6 +273,7 @@ jobs: --tv-app ./out/linux-x64-tv-app-${BUILD_VARIANT}/chip-tv-app \ --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 \ " - name: Run Tests using chip-repl (including slow) if: github.event_name == 'push' @@ -288,6 +291,7 @@ jobs: --tv-app ./out/linux-x64-tv-app-${BUILD_VARIANT}/chip-tv-app \ --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 \ " - name: Uploading core files uses: actions/upload-artifact@v4 @@ -354,6 +358,7 @@ jobs: --target darwin-x64-tv-app-${BUILD_VARIANT} \ --target darwin-x64-bridge-${BUILD_VARIANT} \ --target darwin-x64-lit-icd-${BUILD_VARIANT} \ + --target darwin-x64-microwave-oven-${BUILD_VARIANT} \ build \ --copy-artifacts-to objdir-clone \ " @@ -374,7 +379,8 @@ jobs: --ota-requestor-app ./out/darwin-x64-ota-requestor-${BUILD_VARIANT}/chip-ota-requestor-app \ --tv-app ./out/darwin-x64-tv-app-${BUILD_VARIANT}/chip-tv-app \ --bridge-app ./out/darwin-x64-bridge-${BUILD_VARIANT}/chip-bridge-app \ - --lit-icd-app ./out/darwin-x64-lit-icd-${BUILD_VARIANT}/lit-icd-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 \ " - name: Run purposeful failure tests using the python parser sending commands to chip-tool @@ -453,6 +459,7 @@ jobs: --target linux-x64-lock-ipv6only-no-ble-no-wifi-tsan-clang-test \ --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-python-bindings \ build \ --copy-artifacts-to objdir-clone \ @@ -476,9 +483,16 @@ jobs: scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-lock-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-lock-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_DRLK_2_3.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_DeviceBasicComposition.py" --script-args "--storage-path admin_storage.json --manual-code 10054912339 --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-lock-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-lock-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_DeviceConformance.py" --script-args "--storage-path admin_storage.json --manual-code 10054912339 --bool-arg ignore_in_progress:True allow_provisional:True --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 --tests test_TC_IDM_10_2"' + scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-energy-management-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-energy-management-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_EEM_2_1.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --hex-arg enableKey:000102030405060708090a0b0c0d0e0f --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-energy-management-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-energy-management-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_EEM_2_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --hex-arg enableKey:000102030405060708090a0b0c0d0e0f --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-energy-management-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-energy-management-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_EEM_2_3.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --hex-arg enableKey:000102030405060708090a0b0c0d0e0f --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-energy-management-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-energy-management-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_EEM_2_4.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --hex-arg enableKey:000102030405060708090a0b0c0d0e0f --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-energy-management-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-energy-management-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_EEM_2_5.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --hex-arg enableKey:000102030405060708090a0b0c0d0e0f --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-energy-management-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-energy-management-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_EEVSE_2_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --hex-arg enableKey:000102030405060708090a0b0c0d0e0f --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-energy-management-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-energy-management-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_EEVSE_2_4.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --hex-arg enableKey:000102030405060708090a0b0c0d0e0f --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-energy-management-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-energy-management-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_EEVSE_2_5.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --hex-arg enableKey:000102030405060708090a0b0c0d0e0f --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-energy-management-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-energy-management-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_EPM_2_1.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --hex-arg enableKey:000102030405060708090a0b0c0d0e0f --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-energy-management-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-energy-management-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_EPM_2_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --hex-arg enableKey:000102030405060708090a0b0c0d0e0f --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-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_FAN_3_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_FAN_3_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_FAN_3_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"' @@ -486,7 +500,7 @@ 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_FAN_3_5.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-lit-icd-ipv6only-no-ble-no-wifi-tsan-clang-test/lit-icd-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_ICDM_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_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" --script "src/python_testing/TC_IDM_1_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-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"' @@ -513,6 +527,10 @@ jobs: scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --script "src/python_testing/TestMatterTestingSupport.py" --script-args "--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 --script "src/python_testing/TestSpecParsingSupport.py" --script-args "--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/TestTimeSyncTrustedTimeSourceRunner.py' + 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_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-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"' - name: Uploading core files uses: actions/upload-artifact@v4 if: ${{ failure() && !env.ACT }} diff --git a/BUILD.gn b/BUILD.gn index 89861ea79af5d0..e201b56ceac00d 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -347,6 +347,10 @@ if (current_toolchain != "${dir_pw_toolchain}/default:default") { enable_linux_lighting_app_build = enable_default_builds && (host_os == "linux" || host_os == "mac") + # Build the Linux microwave oven app example. + enable_microwave_oven_app_build = + enable_default_builds && (host_os == "linux" || host_os == "mac") + # Build the Linux thermostat app example. enable_linux_thermostat_app_build = enable_default_builds && (host_os == "linux" || host_os == "mac") @@ -594,6 +598,14 @@ if (current_toolchain != "${dir_pw_toolchain}/default:default") { extra_build_deps += [ ":linux_bridge_app" ] } + if (enable_microwave_oven_app_build) { + group("linux_microwave_oven_app") { + deps = [ "${chip_root}/examples/microwave-oven-app/linux(${standalone_toolchain})" ] + } + + extra_build_deps += [ ":linux_microwave_oven_app" ] + } + if (enable_linux_lighting_app_build) { group("linux_lighting_app") { deps = [ diff --git a/src/app/tests/suites/commands/delay/BUILD.gn b/config/nxp/lib/pw_rpc/BUILD.gn similarity index 50% rename from src/app/tests/suites/commands/delay/BUILD.gn rename to config/nxp/lib/pw_rpc/BUILD.gn index de0babc859026f..05962da9299912 100644 --- a/src/app/tests/suites/commands/delay/BUILD.gn +++ b/config/nxp/lib/pw_rpc/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2022 Project CHIP Authors +# 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. @@ -12,23 +12,27 @@ # See the License for the specific language governing permissions and # limitations under the License. -import("//build_overrides/build.gni") import("//build_overrides/chip.gni") +import("//build_overrides/pigweed.gni") +import("$dir_pw_build/target_types.gni") -static_library("delay") { - output_name = "libDelayCommands" +static_library("pw_rpc") { + output_name = "libPwRpc" - sources = [ - "DelayCommands.cpp", - "DelayCommands.h", + public_configs = [ "${dir_pigweed}/pw_hdlc:default_config" ] + deps = [ + "$dir_pw_rpc:server", + "$dir_pw_rpc/nanopb:echo_service", + "${chip_root}/examples/platform/nxp/pw_sys_io:pw_sys_io_nxp", + "${dir_pigweed}/pw_hdlc:pw_rpc", + dir_pw_assert, + dir_pw_hdlc, + dir_pw_log, ] - cflags = [ "-Wconversion" ] + deps += pw_build_LINK_DEPS - public_deps = [ - "${chip_root}/src/app/common:simulated", - "${chip_root}/src/lib/support", - "${chip_root}/src/platform", - "${chip_root}/src/system", - ] + output_dir = "${root_out_dir}/lib" + + complete_static_lib = true } diff --git a/src/app/tests/suites/pics/BUILD.gn b/config/nxp/lib/pw_rpc/pw_rpc.gni similarity index 56% rename from src/app/tests/suites/pics/BUILD.gn rename to config/nxp/lib/pw_rpc/pw_rpc.gni index df8ae17dded523..68255db8bb96da 100644 --- a/src/app/tests/suites/pics/BUILD.gn +++ b/config/nxp/lib/pw_rpc/pw_rpc.gni @@ -1,4 +1,4 @@ -# Copyright (c) 2021 Project CHIP Authors +# 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. @@ -12,22 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -import("//build_overrides/build.gni") import("//build_overrides/chip.gni") +import("//build_overrides/pigweed.gni") -static_library("pics") { - output_name = "libPICS" +pw_log_BACKEND = "$dir_pw_log_basic" +pw_assert_BACKEND = "$dir_pw_assert_log:check_backend" +pw_rpc_CONFIG = "$dir_pw_rpc:disable_global_mutex" +pw_sys_io_BACKEND = "${chip_root}/examples/platform/nxp/pw_sys_io:pw_sys_io_nxp" - sources = [ - "PICSBooleanExpressionParser.cpp", - "PICSBooleanExpressionParser.h", - "PICSBooleanReader.cpp", - "PICSBooleanReader.h", - "PICSNormalizer.cpp", - "PICSNormalizer.h", - ] +pw_build_LINK_DEPS = [ + "$dir_pw_assert:impl", + "$dir_pw_log:impl", +] - cflags = [ "-Wconversion" ] - - public_deps = [ "${chip_root}/src/lib/support" ] -} +dir_pw_third_party_nanopb = "${chip_root}/third_party/nanopb/repo" diff --git a/config/tizen/chip-gn/platform/BUILD.gn b/config/tizen/chip-gn/platform/BUILD.gn index bea16af373fd15..7d2f25e9bcf4f8 100644 --- a/config/tizen/chip-gn/platform/BUILD.gn +++ b/config/tizen/chip-gn/platform/BUILD.gn @@ -20,10 +20,6 @@ import("${chip_root}/config/tizen/chip-gn/args.gni") import("${build_root}/config/linux/pkg_config.gni") import("${chip_root}/src/platform/device.gni") -pkg_config("capi-system-peripheral-io") { - packages = [ "capi-system-peripheral-io" ] -} - pkg_config("dlog") { packages = [ "dlog" ] } @@ -73,7 +69,6 @@ source_set("tizen") { ":glib", ":capi-appfw-preference", ":capi-system-info", - ":capi-system-peripheral-io", ] if (chip_mdns == "platform") { diff --git a/data_model/clusters/ConcentrationMeasurement.xml b/data_model/clusters/ConcentrationMeasurement.xml index c5e2971406f676..4b51cffa124321 100644 --- a/data_model/clusters/ConcentrationMeasurement.xml +++ b/data_model/clusters/ConcentrationMeasurement.xml @@ -261,4 +261,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/clusters/DemandResponseLoadControl.xml b/data_model/clusters/DemandResponseLoadControl.xml index 170cde68e8acff..a5322bfb4f7206 100644 --- a/data_model/clusters/DemandResponseLoadControl.xml +++ b/data_model/clusters/DemandResponseLoadControl.xml @@ -248,17 +248,14 @@ Davis, CA 95616, USA - - - @@ -266,13 +263,11 @@ Davis, CA 95616, USA - - @@ -286,7 +281,6 @@ Davis, CA 95616, USA - @@ -294,7 +288,6 @@ Davis, CA 95616, USA - @@ -302,7 +295,6 @@ Davis, CA 95616, USA - @@ -310,7 +302,6 @@ Davis, CA 95616, USA - diff --git a/data_model/clusters/DeviceEnergyManagement.xml b/data_model/clusters/DeviceEnergyManagement.xml index 6d6477cc72fb7c..21f74a737d52cb 100644 --- a/data_model/clusters/DeviceEnergyManagement.xml +++ b/data_model/clusters/DeviceEnergyManagement.xml @@ -130,10 +130,10 @@ Davis, CA 95616, USA - + - + @@ -237,13 +237,13 @@ Davis, CA 95616, USA - + - + - + @@ -257,36 +257,31 @@ Davis, CA 95616, USA - + - - - - - @@ -294,181 +289,146 @@ Davis, CA 95616, USA - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -477,7 +437,6 @@ Davis, CA 95616, USA - @@ -486,7 +445,6 @@ Davis, CA 95616, USA - @@ -498,7 +456,6 @@ Davis, CA 95616, USA - diff --git a/data_model/clusters/DiagnosticsGeneral.xml b/data_model/clusters/DiagnosticsGeneral.xml index 3ea1b41fc62a75..072d75d64acc31 100644 --- a/data_model/clusters/DiagnosticsGeneral.xml +++ b/data_model/clusters/DiagnosticsGeneral.xml @@ -58,9 +58,14 @@ Davis, CA 95616, USA - + + + + + + @@ -176,40 +181,32 @@ Davis, CA 95616, USA - - - - - - - - @@ -289,6 +286,33 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/clusters/ElectricalEnergyMeasurement.xml b/data_model/clusters/ElectricalEnergyMeasurement.xml index bcf229c0266009..c6bf8e73863c41 100644 --- a/data_model/clusters/ElectricalEnergyMeasurement.xml +++ b/data_model/clusters/ElectricalEnergyMeasurement.xml @@ -67,50 +67,21 @@ Davis, CA 95616, USA - - - - - - + + - - - - - - - - - - - - - - - - - + + - + - - - - - - - - - - - + @@ -120,17 +91,7 @@ Davis, CA 95616, USA - - - - - - - - - - - + @@ -140,7 +101,7 @@ Davis, CA 95616, USA - + @@ -150,47 +111,7 @@ Davis, CA 95616, USA - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -200,122 +121,57 @@ Davis, CA 95616, USA - + - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - + - - - - + - - - - - - - - - - - - - - - - - - - - + + + + + + + - - + + + + + + + - + - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - + + + + + + + diff --git a/data_model/clusters/ElectricalPowerMeasurement.xml b/data_model/clusters/ElectricalPowerMeasurement.xml index 996fb0ce59ec11..aa5baeaf368cbb 100644 --- a/data_model/clusters/ElectricalPowerMeasurement.xml +++ b/data_model/clusters/ElectricalPowerMeasurement.xml @@ -59,238 +59,151 @@ Davis, CA 95616, USA - + - + - + - + - + - + - - - - - - - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + + + + + + + + + + - + - + + - + - + + + + + + + + + + + + + + + + + + - + + - + - + - + + - + - + - + + - + - + - + + - + - + - + + - + - + - + + + + + + + + + - + @@ -299,7 +212,7 @@ Davis, CA 95616, USA - + @@ -308,51 +221,28 @@ Davis, CA 95616, USA - - - - - - - + - + - - + + - + - - - + + + + - + - - - - - - - - - - - - - - - - - - - - + + diff --git a/data_model/clusters/EnergyCalendar.xml b/data_model/clusters/EnergyCalendar.xml index 0f9cf3c087ecf8..a21845d92c47c4 100644 --- a/data_model/clusters/EnergyCalendar.xml +++ b/data_model/clusters/EnergyCalendar.xml @@ -195,9 +195,21 @@ Davis, CA 95616, USA - - - + + + + + + + + + + + + + + + diff --git a/data_model/clusters/EnergyEVSE.xml b/data_model/clusters/EnergyEVSE.xml index c788edc054ede0..f59d41807d43e6 100644 --- a/data_model/clusters/EnergyEVSE.xml +++ b/data_model/clusters/EnergyEVSE.xml @@ -227,12 +227,10 @@ Davis, CA 95616, USA - - @@ -241,7 +239,6 @@ Davis, CA 95616, USA - @@ -277,19 +274,19 @@ Davis, CA 95616, USA - + - + - + @@ -297,7 +294,7 @@ Davis, CA 95616, USA - + @@ -421,11 +418,11 @@ Davis, CA 95616, USA - + - + @@ -439,7 +436,7 @@ Davis, CA 95616, USA - + @@ -512,7 +509,7 @@ Davis, CA 95616, USA - + diff --git a/data_model/clusters/EnergyPreference.xml b/data_model/clusters/EnergyPreference.xml index fa50bbe839ae65..7156be8eafe025 100644 --- a/data_model/clusters/EnergyPreference.xml +++ b/data_model/clusters/EnergyPreference.xml @@ -85,11 +85,9 @@ Davis, CA 95616, USA - - diff --git a/data_model/clusters/EnergyPrice.xml b/data_model/clusters/EnergyPrice.xml index b358e75ab53a5c..23072a6a99ead5 100644 --- a/data_model/clusters/EnergyPrice.xml +++ b/data_model/clusters/EnergyPrice.xml @@ -113,15 +113,12 @@ Davis, CA 95616, USA - - - @@ -129,35 +126,28 @@ Davis, CA 95616, USA - - - - - - - diff --git a/data_model/clusters/Group-Key-Management-Cluster.xml b/data_model/clusters/Group-Key-Management-Cluster.xml index ad86b24e3bd387..43e7a395ac8467 100644 --- a/data_model/clusters/Group-Key-Management-Cluster.xml +++ b/data_model/clusters/Group-Key-Management-Cluster.xml @@ -87,16 +87,13 @@ Davis, CA 95616, USA - - - diff --git a/data_model/clusters/ICDManagement.xml b/data_model/clusters/ICDManagement.xml index f138e7037687b6..3cc6c9bfab4416 100644 --- a/data_model/clusters/ICDManagement.xml +++ b/data_model/clusters/ICDManagement.xml @@ -79,11 +79,11 @@ Davis, CA 95616, USA - + - + @@ -185,7 +185,7 @@ Davis, CA 95616, USA - + @@ -197,7 +197,7 @@ Davis, CA 95616, USA - + diff --git a/data_model/clusters/Messages.xml b/data_model/clusters/Messages.xml index a976e7d260f0ff..9dd223d9a63f46 100644 --- a/data_model/clusters/Messages.xml +++ b/data_model/clusters/Messages.xml @@ -193,35 +193,35 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + @@ -248,10 +248,32 @@ Davis, CA 95616, USA - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -262,4 +284,44 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data_model/clusters/ModeBase.xml b/data_model/clusters/ModeBase.xml index 1e6a81807e29a2..5774a7fec0c5a5 100644 --- a/data_model/clusters/ModeBase.xml +++ b/data_model/clusters/ModeBase.xml @@ -70,29 +70,24 @@ 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 2fff860458f0e5..19fe502c1fcfe2 100644 --- a/data_model/clusters/ModeSelect.xml +++ b/data_model/clusters/ModeSelect.xml @@ -69,29 +69,24 @@ Davis, CA 95616, USA - - - - - diff --git a/data_model/clusters/Mode_DeviceEnergyManagement.xml b/data_model/clusters/Mode_DeviceEnergyManagement.xml index dc28204cecb511..4181b9b60ead42 100644 --- a/data_model/clusters/Mode_DeviceEnergyManagement.xml +++ b/data_model/clusters/Mode_DeviceEnergyManagement.xml @@ -62,30 +62,10 @@ Davis, CA 95616, USA - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/data_model/clusters/OccupancySensing.xml b/data_model/clusters/OccupancySensing.xml index 1dd5cbe6156865..d52f118b70cbde 100644 --- a/data_model/clusters/OccupancySensing.xml +++ b/data_model/clusters/OccupancySensing.xml @@ -55,11 +55,12 @@ Connectivity Standards Alliance 508 Second Street, Suite 206 Davis, CA 95616, USA --> - + + @@ -159,12 +160,10 @@ Davis, CA 95616, USA - - diff --git a/data_model/clusters/PowerSourceConfigurationCluster.xml b/data_model/clusters/PowerSourceConfigurationCluster.xml index b2eb27fd4bd7cc..5548bf6ad8e6b5 100644 --- a/data_model/clusters/PowerSourceConfigurationCluster.xml +++ b/data_model/clusters/PowerSourceConfigurationCluster.xml @@ -59,7 +59,7 @@ Davis, CA 95616, USA - + diff --git a/data_model/clusters/PowerTopology.xml b/data_model/clusters/PowerTopology.xml new file mode 100644 index 00000000000000..c8d90baeeded19 --- /dev/null +++ b/data_model/clusters/PowerTopology.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data_model/clusters/ResourceMonitoring.xml b/data_model/clusters/ResourceMonitoring.xml index 9772efbd429982..17fc7554ac41f0 100644 --- a/data_model/clusters/ResourceMonitoring.xml +++ b/data_model/clusters/ResourceMonitoring.xml @@ -116,12 +116,10 @@ Davis, CA 95616, USA - - @@ -171,4 +169,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/clusters/Scenes.xml b/data_model/clusters/Scenes.xml index 2168c164a02460..0c4347c4e8be8a 100644 --- a/data_model/clusters/Scenes.xml +++ b/data_model/clusters/Scenes.xml @@ -1,59 +1,59 @@ - @@ -73,50 +73,39 @@ Davis, CA 95616, USA - - - - - - - - - - - @@ -146,24 +135,22 @@ Davis, CA 95616, USA - - + - + - + - diff --git a/data_model/clusters/Thermostat.xml b/data_model/clusters/Thermostat.xml index b7e811bb8738ae..400d55a048a116 100644 --- a/data_model/clusters/Thermostat.xml +++ b/data_model/clusters/Thermostat.xml @@ -451,27 +451,16 @@ Davis, CA 95616, USA - - - - - - - - - - + - - @@ -701,7 +690,7 @@ Davis, CA 95616, USA - + @@ -742,7 +731,7 @@ Davis, CA 95616, USA - + @@ -772,7 +761,7 @@ Davis, CA 95616, USA - + @@ -898,7 +887,7 @@ Davis, CA 95616, USA - + diff --git a/data_model/clusters/WaterContentMeasurement.xml b/data_model/clusters/WaterContentMeasurement.xml index bca3f6de8e4101..8b1ff6a9a049bc 100644 --- a/data_model/clusters/WaterContentMeasurement.xml +++ b/data_model/clusters/WaterContentMeasurement.xml @@ -87,4 +87,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/clusters/WiFiNetworkManagement.xml b/data_model/clusters/WiFiNetworkManagement.xml new file mode 100644 index 00000000000000..6308eca7e4b184 --- /dev/null +++ b/data_model/clusters/WiFiNetworkManagement.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data_model/clusters/bridge-clusters-Actions.xml b/data_model/clusters/bridge-clusters-Actions.xml index ccacb56e8b2576..51f7ee79bb4bad 100644 --- a/data_model/clusters/bridge-clusters-Actions.xml +++ b/data_model/clusters/bridge-clusters-Actions.xml @@ -157,28 +157,22 @@ Davis, CA 95616, USA - - - - - - diff --git a/data_model/device_types/Aggregator.xml b/data_model/device_types/Aggregator.xml index f9bff7aa27cd55..4e0eb1cee512c3 100644 --- a/data_model/device_types/Aggregator.xml +++ b/data_model/device_types/Aggregator.xml @@ -60,7 +60,7 @@ Davis, CA 95616, USA - + diff --git a/data_model/device_types/ColorTemperatureLight.xml b/data_model/device_types/ColorTemperatureLight.xml index 210ce03b2da41c..5d6ac140803e23 100644 --- a/data_model/device_types/ColorTemperatureLight.xml +++ b/data_model/device_types/ColorTemperatureLight.xml @@ -60,7 +60,7 @@ Davis, CA 95616, USA - + @@ -114,12 +114,6 @@ Davis, CA 95616, USA - - - - - - diff --git a/data_model/device_types/ContentApp.xml b/data_model/device_types/ContentApp.xml index a6eb1a4ca0d424..0db03141e7f9a1 100644 --- a/data_model/device_types/ContentApp.xml +++ b/data_model/device_types/ContentApp.xml @@ -61,7 +61,6 @@ Davis, CA 95616, USA - diff --git a/data_model/device_types/DimmableLight.xml b/data_model/device_types/DimmableLight.xml index ce5dce7c8bf192..42c7d20fb4caad 100644 --- a/data_model/device_types/DimmableLight.xml +++ b/data_model/device_types/DimmableLight.xml @@ -55,12 +55,11 @@ Connectivity Standards Alliance 508 Second Street, Suite 206 Davis, CA 95616, USA --> - + - @@ -114,12 +113,6 @@ Davis, CA 95616, USA - - - - - - diff --git a/data_model/device_types/DimmablePlug-InUnit.xml b/data_model/device_types/DimmablePlug-InUnit.xml index 0756ed62baf9c0..a41db3ad0ae255 100644 --- a/data_model/device_types/DimmablePlug-InUnit.xml +++ b/data_model/device_types/DimmablePlug-InUnit.xml @@ -60,7 +60,7 @@ Davis, CA 95616, USA - + @@ -114,12 +114,6 @@ Davis, CA 95616, USA - - - - - - diff --git a/data_model/device_types/DoorLockController.xml b/data_model/device_types/DoorLockController.xml index a41cdad0e1bf5a..0e4529c8b5e381 100644 --- a/data_model/device_types/DoorLockController.xml +++ b/data_model/device_types/DoorLockController.xml @@ -63,16 +63,6 @@ Davis, CA 95616, USA - - - - - - - - - - diff --git a/data_model/device_types/EVSE.xml b/data_model/device_types/EVSE.xml index 42636733090c9c..f15b1db770b454 100644 --- a/data_model/device_types/EVSE.xml +++ b/data_model/device_types/EVSE.xml @@ -68,12 +68,6 @@ Davis, CA 95616, USA - - - - - - diff --git a/data_model/device_types/ElectricalSensor.xml b/data_model/device_types/ElectricalSensor.xml new file mode 100644 index 00000000000000..62c6dd9b4128b2 --- /dev/null +++ b/data_model/device_types/ElectricalSensor.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data_model/device_types/ExtendedColorLight.xml b/data_model/device_types/ExtendedColorLight.xml index a0337009f660eb..73490485fa27fa 100644 --- a/data_model/device_types/ExtendedColorLight.xml +++ b/data_model/device_types/ExtendedColorLight.xml @@ -60,7 +60,7 @@ Davis, CA 95616, USA - + @@ -114,12 +114,6 @@ Davis, CA 95616, USA - - - - - - diff --git a/data_model/device_types/NetworkInfraManager.xml b/data_model/device_types/NetworkInfraManager.xml index 750a97f22cad86..cc7e22295f40be 100644 --- a/data_model/device_types/NetworkInfraManager.xml +++ b/data_model/device_types/NetworkInfraManager.xml @@ -65,5 +65,8 @@ Davis, CA 95616, USA + + + \ No newline at end of file diff --git a/data_model/device_types/OnOffLight.xml b/data_model/device_types/OnOffLight.xml index ea520612b9dc42..9762c718dcc05b 100644 --- a/data_model/device_types/OnOffLight.xml +++ b/data_model/device_types/OnOffLight.xml @@ -55,12 +55,11 @@ Connectivity Standards Alliance 508 Second Street, Suite 206 Davis, CA 95616, USA --> - + - @@ -114,12 +113,6 @@ Davis, CA 95616, USA - - - - - - diff --git a/data_model/device_types/OnOffPlug-inUnit.xml b/data_model/device_types/OnOffPlug-inUnit.xml index d63e3b22e81aae..41d0a1398ad6f3 100644 --- a/data_model/device_types/OnOffPlug-inUnit.xml +++ b/data_model/device_types/OnOffPlug-inUnit.xml @@ -55,12 +55,11 @@ Connectivity Standards Alliance 508 Second Street, Suite 206 Davis, CA 95616, USA --> - + - @@ -114,12 +113,6 @@ Davis, CA 95616, USA - - - - - - diff --git a/data_model/device_types/PowerSource.xml b/data_model/device_types/PowerSource.xml index 3767d5c19ad025..9ed71e905535bd 100644 --- a/data_model/device_types/PowerSource.xml +++ b/data_model/device_types/PowerSource.xml @@ -55,21 +55,14 @@ 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/TemperatureControlledCabinet.xml b/data_model/device_types/TemperatureControlledCabinet.xml index 090931ace14f61..b39861690cad61 100644 --- a/data_model/device_types/TemperatureControlledCabinet.xml +++ b/data_model/device_types/TemperatureControlledCabinet.xml @@ -66,6 +66,14 @@ Davis, CA 95616, USA + + + + + + + + diff --git a/data_model/device_types/Thermostat.xml b/data_model/device_types/Thermostat.xml index 8676fe965ef280..fc154468e97c5f 100644 --- a/data_model/device_types/Thermostat.xml +++ b/data_model/device_types/Thermostat.xml @@ -97,9 +97,6 @@ Davis, CA 95616, USA - - - diff --git a/data_model/spec_sha b/data_model/spec_sha index 9c275037d5b895..ec683a1872fc3e 100644 --- a/data_model/spec_sha +++ b/data_model/spec_sha @@ -1 +1 @@ -7e16e82e5264105bdc61d6bc8fe18095959b8292 +72ce960f71810d6ca96125aea54e4fb0a9631e34 diff --git a/docs/QUICK_START.md b/docs/QUICK_START.md index 5a4027e3dc7278..97f0f76b3b0436 100644 --- a/docs/QUICK_START.md +++ b/docs/QUICK_START.md @@ -19,7 +19,7 @@ combination listed below. |
Border Router
|
Node
| Description | | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [**ot-br**](https://openthread.io/guides/border-router/build)
Thread Border Router
  • RasPi
  • BeagleBone | **lighting-app**
  • [Nordic nRF5x](https://github.com/project-chip/connectedhomeip/tree/master/examples/lighting-app/nrfconnect/README.md)
  • [NXP K32W](https://github.com/project-chip/connectedhomeip/tree/master/examples/lighting-app/nxp/k32w/k32w0/README.md)
  • [Qorvo QPG6100](https://github.com/project-chip/connectedhomeip/tree/master/examples/lighting-app/qpg)
  • [Silicon Labs EFR32](https://github.com/project-chip/connectedhomeip/tree/master/examples/lighting-app/efr32/README.md) | The Lighting example is supported by many of the available Thread platforms. See the chip-tool controller instructions for how to actuate the light on/off cluster. | +| [**ot-br**](https://openthread.io/guides/border-router/build)
    Thread Border Router
  • RasPi
  • BeagleBone | **lighting-app**
  • [Nordic nRF5x](https://github.com/project-chip/connectedhomeip/tree/master/examples/lighting-app/nrfconnect/README.md)
  • [NXP K32W](https://github.com/project-chip/connectedhomeip/tree/master/examples/lighting-app/nxp/k32w/k32w0/README.md)
  • [Qorvo QPG6100](https://github.com/project-chip/connectedhomeip/tree/master/examples/lighting-app/qpg)
  • [Silicon Labs EFR32](https://github.com/project-chip/connectedhomeip/tree/master/examples/lighting-app/silabs/README.md) | The Lighting example is supported by many of the available Thread platforms. See the chip-tool controller instructions for how to actuate the light on/off cluster. | | [**ot-br**](https://openthread.io/guides/border-router/build)
    Thread Border Router
  • RasPi
  • BeagleBone | **lock-app**
  • [Nordic nRF5x](https://github.com/project-chip/connectedhomeip/tree/master/examples/lock-app/nrfconnect/README.md)
  • [NXP K32W](https://github.com/project-chip/connectedhomeip/tree/master/examples/lock-app/nxp/k32w/k32w0/README.md)
  • [Qorvo QPG6100](https://github.com/project-chip/connectedhomeip/tree/master/examples/lock-app/qpg)
  • [Silicon Labs EFR32](https://github.com/project-chip/connectedhomeip/tree/master/examples/lock-app/efr32/README.md)
  • [TI CC13x2x7](https://github.com/project-chip/connectedhomeip/tree/master/examples/lock-app/cc13x2x7_26x2x7/README.md) | The Lock example is supported by many of the available Thread and Wi-Fi platforms. | ## Controllers diff --git a/docs/guides/silabs_efr32_software_update.md b/docs/guides/silabs_efr32_software_update.md index ec57cc4acaa372..9f94753aa7d29f 100644 --- a/docs/guides/silabs_efr32_software_update.md +++ b/docs/guides/silabs_efr32_software_update.md @@ -8,7 +8,7 @@ all of the EFR32 example applications. ## Running the OTA Download scenario - For Matter with OpenThread: Bring up the OpenThread Border Router as - discussed in examples/lighting-app/efr32/README.md and get its operational + discussed in examples/lighting-app/silabs/README.md and get its operational dataset. - On a Linux or Darwin platform build the chip-tool and the ota-provider-app diff --git a/docs/guides/simulated_device_linux.md b/docs/guides/simulated_device_linux.md index 686a5387eb6eb9..81d36c90347115 100644 --- a/docs/guides/simulated_device_linux.md +++ b/docs/guides/simulated_device_linux.md @@ -11,11 +11,6 @@ If some parameters need to be overridden, a `CHIPProjectConfig.h` file can be placed under an ‘include’ folder into the app folder. For example `examples/placeholder/linux/apps/app1/include/CHIPProjectConfig.h` -In order to generate specific tests for a given accessory, a -[examples/placeholder/linux/apps/app1/tests.js](../../examples/placeholder/linux/apps/app1/tests.js) -file can be added into the application directory. The tests listed there are the -one that will be executed once the application has been commissioned. - Simulated Device: simulation of an application in which tests can be added. It is defined by a ZAP config file and tests can be added with a [YAML file](../../src/app/tests/suites/certification/Test_TC_DM_1_3_Simulated.yaml). @@ -66,7 +61,7 @@ Now that the building is completed there is a `chip-app1` binary created. This binary can be executed on a linux os with test commands. ``` -./out/debug/simulated/chip-app1 --command [TEST NAME] +./scripts/tests/yaml/runner.py [TEST NAME] app1 ``` ## Interacting with the simulated app @@ -99,8 +94,7 @@ interact with it using chip-tool ## Adding simulated Tests via YAML In order to validate commissioner/controller behavior, tests need to be added to -the simulated device test framework. To achieve this, YAML files are created and -new code is generated. +the simulated device test framework. To achieve this, YAML files are created. 1. YAML test file are located in [YAML folder](../../src/app/tests/suites/certification/) @@ -124,26 +118,3 @@ new code is generated. 5. [Test_TC_DM_1_3_Simulated](../../src/app/tests/suites/certification/Test_TC_DM_1_3_Simulated.yaml) is an example of a written test that runs on the simulated device. - -6. Next, it will need to be added to - [examples/placeholder/linux/apps/app1/tests.js](../../examples/placeholder/linux/apps/app1/tests.js) - in the following array: - - ```javascript - const tests = ["Test_TC_DM_1_3_Simulated"]; - ``` - -7. Then, the code will be generated using ZAP. - - ``` - ./scripts/tools/zap/generate.py examples/placeholder/linux/apps/app1/config.zap -t examples/placeholder/templates/templates.json -o zzz_generated/placeholder/app1/zap-generated - ``` - - The following command can be used to generate and compile: - - ``` - ./scripts/examples/gn_build_test_example.sh app1 - ``` - -8) When submitting code for review, create 2 commits. One for YAML changes and - second for generated code. diff --git a/docs/guides/ti/matter_cc2674_migration.md b/docs/guides/ti/matter_cc2674_migration.md index 03a0c2e4f41e62..994954d6ae7a53 100644 --- a/docs/guides/ti/matter_cc2674_migration.md +++ b/docs/guides/ti/matter_cc2674_migration.md @@ -11,8 +11,6 @@ project accordingly. Example projects can be found in the following location: The following must be installed on your system before proceeding: - [SysConfig](https://www.ti.com/tool/SYSCONFIG) v1.16.2 or later -- [SIMPLELINK-LOWPOWER-F2-SDK](https://www.ti.com/tool/SIMPLELINK-LOWPOWER-SDK) - v7.10.01.24 ## Matter source code changes @@ -22,12 +20,20 @@ CC2674P10 device - `examples/[application]/cc13x4_26x4/args.gni`, modify/add the following defines for the CC2674 - - `ti_simplelink_board = CC2674` - - `ti_simplelink_device = CC2674P10RGZ` -- `third_party/ti_simplelink_sdk/repo_cc13xx_cc26xx`, replace this folder - contents with the 7.10.01.24 version from - [TI's downloads page](https://www.ti.com/tool/download/SIMPLELINK-LOWPOWER-F2-SDK/7.10.01.24) - which is required to add support SDK for the CC2674P10 device. + - `ti_simplelink_board = "CC2674"` + - `ti_simplelink_device = "CC2674P10RGZ"` +- `third_party/ti_simplelink_sdk/repo_cc13xx_cc26xx/source/ti/common/flash/no_rtos/extFlash/bsp.h`, + modify the SPI GPIO pins to the value below: + +``` +#define BSP_IOID_FLASH_CS IOID_20 +#define BSP_SPI_MOSI IOID_9 +#define BSP_SPI_MISO IOID_8 +#define BSP_SPI_CLK_FLASH IOID_10 + +``` + +The GPIO pin values for SPI will need to be adjusted based on your design. ## Configuring `chip.syscfg` in the SysConfig GUI diff --git a/examples/air-purifier-app/air-purifier-common/include/relative-humidity-sensor-manager.h b/examples/air-purifier-app/air-purifier-common/include/relative-humidity-sensor-manager.h index 23c82787b0203e..f950121b5a22b2 100644 --- a/examples/air-purifier-app/air-purifier-common/include/relative-humidity-sensor-manager.h +++ b/examples/air-purifier-app/air-purifier-common/include/relative-humidity-sensor-manager.h @@ -19,6 +19,7 @@ #pragma once #include +#include namespace chip { namespace app { @@ -31,19 +32,20 @@ class RelativeHumiditySensorManager void Init() { - EmberAfStatus status = RelativeHumidityMeasurement::Attributes::MinMeasuredValue::Set(mEndpointId, 0); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + Protocols::InteractionModel::Status status = RelativeHumidityMeasurement::Attributes::MinMeasuredValue::Set(mEndpointId, 0); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, ChipLogError(NotSpecified, "Failed to set RelativeHumidityMeasurement MinMeasuredValue attribute")); status = RelativeHumidityMeasurement::Attributes::MaxMeasuredValue::Set(mEndpointId, 10000); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, ChipLogError(NotSpecified, "Failed to set RelativeHumidityMeasurement MaxMeasuredValue attribute")); }; void OnHumidityChangeHandler(uint16_t newValue) { - EmberAfStatus status = RelativeHumidityMeasurement::Attributes::MeasuredValue::Set(mEndpointId, newValue); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + Protocols::InteractionModel::Status status = + RelativeHumidityMeasurement::Attributes::MeasuredValue::Set(mEndpointId, newValue); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, ChipLogError(NotSpecified, "Failed to set RelativeHumidityMeasurement MeasuredValue attribute")); ChipLogDetail(NotSpecified, "The new RelativeHumidityMeasurement value: %d", newValue); } diff --git a/examples/air-purifier-app/air-purifier-common/include/temperature-sensor-manager.h b/examples/air-purifier-app/air-purifier-common/include/temperature-sensor-manager.h index 339d02588f52bc..f7061393d76cb6 100644 --- a/examples/air-purifier-app/air-purifier-common/include/temperature-sensor-manager.h +++ b/examples/air-purifier-app/air-purifier-common/include/temperature-sensor-manager.h @@ -19,6 +19,7 @@ #pragma once #include +#include namespace chip { namespace app { @@ -31,19 +32,19 @@ class TemperatureSensorManager void Init() { - EmberAfStatus status = TemperatureMeasurement::Attributes::MinMeasuredValue::Set(mEndpointId, -500); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + Protocols::InteractionModel::Status status = TemperatureMeasurement::Attributes::MinMeasuredValue::Set(mEndpointId, -500); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, ChipLogError(NotSpecified, "Failed to set TemperatureMeasurement MinMeasuredValue attribute")); status = TemperatureMeasurement::Attributes::MaxMeasuredValue::Set(mEndpointId, 6000); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, ChipLogError(NotSpecified, "Failed to set TemperatureMeasurement MaxMeasuredValue attribute")); } void OnTemperatureChangeHandler(int16_t newValue) { - EmberAfStatus status = TemperatureMeasurement::Attributes::MeasuredValue::Set(mEndpointId, newValue); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + Protocols::InteractionModel::Status status = TemperatureMeasurement::Attributes::MeasuredValue::Set(mEndpointId, newValue); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, ChipLogError(NotSpecified, "Failed to set TemperatureMeasurement MeasuredValue attribute")); ChipLogDetail(NotSpecified, "The new TemperatureMeasurement value: %d", newValue); } diff --git a/examples/air-purifier-app/air-purifier-common/src/air-purifier-manager.cpp b/examples/air-purifier-app/air-purifier-common/src/air-purifier-manager.cpp index 7ce8ac5f338fcc..22e938ddfa4023 100644 --- a/examples/air-purifier-app/air-purifier-common/src/air-purifier-manager.cpp +++ b/examples/air-purifier-app/air-purifier-common/src/air-purifier-manager.cpp @@ -17,7 +17,6 @@ */ #include -#include using namespace chip; using namespace chip::app; @@ -147,7 +146,7 @@ Status AirPurifierManager::HandleStep(FanControl::StepDirectionEnum aDirection, } } - return ToInteractionModelStatus(FanControl::Attributes::SpeedSetting::Set(mEndpointId, newSpeedSetting)); + return FanControl::Attributes::SpeedSetting::Set(mEndpointId, newSpeedSetting); } void AirPurifierManager::HandleFanControlAttributeChange(AttributeId attributeId, uint8_t type, uint16_t size, uint8_t * value) @@ -197,12 +196,13 @@ void AirPurifierManager::PercentSettingWriteCallback(uint8_t aNewPercentSetting) if (aNewPercentSetting != percentCurrent) { ChipLogDetail(NotSpecified, "AirPurifierManager::PercentSettingWriteCallback: %d", aNewPercentSetting); - percentCurrent = aNewPercentSetting; - EmberAfStatus status = FanControl::Attributes::PercentCurrent::Set(mEndpointId, percentCurrent); - if (status != EMBER_ZCL_STATUS_SUCCESS) + percentCurrent = aNewPercentSetting; + Status status = FanControl::Attributes::PercentCurrent::Set(mEndpointId, percentCurrent); + if (status != Status::Success) { ChipLogError(NotSpecified, - "AirPurifierManager::PercentSettingWriteCallback: failed to set PercentCurrent attribute: %d", status); + "AirPurifierManager::PercentSettingWriteCallback: failed to set PercentCurrent attribute: %d", + to_underlying(status)); } } } @@ -212,12 +212,12 @@ void AirPurifierManager::SpeedSettingWriteCallback(uint8_t aNewSpeedSetting) if (aNewSpeedSetting != speedCurrent) { ChipLogDetail(NotSpecified, "AirPurifierManager::SpeedSettingWriteCallback: %d", aNewSpeedSetting); - speedCurrent = aNewSpeedSetting; - EmberAfStatus status = FanControl::Attributes::SpeedCurrent::Set(mEndpointId, speedCurrent); - if (status != EMBER_ZCL_STATUS_SUCCESS) + speedCurrent = aNewSpeedSetting; + Status status = FanControl::Attributes::SpeedCurrent::Set(mEndpointId, speedCurrent); + if (status != Status::Success) { ChipLogError(NotSpecified, "AirPurifierManager::SpeedSettingWriteCallback: failed to set SpeedCurrent attribute: %d", - status); + to_underlying(status)); } // Determine if the speed change should also change the fan mode @@ -300,10 +300,11 @@ void AirPurifierManager::SetSpeedSetting(DataModel::Nullable aNewSpeedS if (aNewSpeedSetting.Value() != speedCurrent) { - EmberAfStatus status = FanControl::Attributes::SpeedSetting::Set(mEndpointId, aNewSpeedSetting); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = FanControl::Attributes::SpeedSetting::Set(mEndpointId, aNewSpeedSetting); + if (status != Status::Success) { - ChipLogError(NotSpecified, "AirPurifierManager::SetSpeedSetting: failed to set SpeedSetting attribute: %d", status); + ChipLogError(NotSpecified, "AirPurifierManager::SetSpeedSetting: failed to set SpeedSetting attribute: %d", + to_underlying(status)); } } } @@ -311,11 +312,12 @@ void AirPurifierManager::SetSpeedSetting(DataModel::Nullable aNewSpeedS DataModel::Nullable AirPurifierManager::GetSpeedSetting() { DataModel::Nullable speedSetting; - EmberAfStatus status = FanControl::Attributes::SpeedSetting::Get(mEndpointId, speedSetting); + Status status = FanControl::Attributes::SpeedSetting::Get(mEndpointId, speedSetting); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogError(NotSpecified, "AirPurifierManager::GetSpeedSetting: failed to get SpeedSetting attribute: %d", status); + ChipLogError(NotSpecified, "AirPurifierManager::GetSpeedSetting: failed to get SpeedSetting attribute: %d", + to_underlying(status)); } return speedSetting; @@ -324,11 +326,12 @@ DataModel::Nullable AirPurifierManager::GetSpeedSetting() DataModel::Nullable AirPurifierManager::GetPercentSetting() { DataModel::Nullable percentSetting; - EmberAfStatus status = FanControl::Attributes::PercentSetting::Get(mEndpointId, percentSetting); + Status status = FanControl::Attributes::PercentSetting::Get(mEndpointId, percentSetting); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogError(NotSpecified, "AirPurifierManager::GetPercentSetting: failed to get PercentSetting attribute: %d", status); + ChipLogError(NotSpecified, "AirPurifierManager::GetPercentSetting: failed to get PercentSetting attribute: %d", + to_underlying(status)); } return percentSetting; diff --git a/examples/air-purifier-app/air-purifier-common/src/thermostat-manager.cpp b/examples/air-purifier-app/air-purifier-common/src/thermostat-manager.cpp index c2536e4d99e38b..8d511d24e550dc 100644 --- a/examples/air-purifier-app/air-purifier-common/src/thermostat-manager.cpp +++ b/examples/air-purifier-app/air-purifier-common/src/thermostat-manager.cpp @@ -17,6 +17,9 @@ */ #include "thermostat-manager.h" +#include + +using chip::Protocols::InteractionModel::Status; using namespace chip; using namespace chip::app; @@ -26,19 +29,19 @@ void ThermostatManager::Init() { BitMask FeatureMap; FeatureMap.Set(Thermostat::Feature::kHeating); - EmberAfStatus status = Thermostat::Attributes::FeatureMap::Set(mEndpointId, FeatureMap.Raw()); + Status status = Thermostat::Attributes::FeatureMap::Set(mEndpointId, FeatureMap.Raw()); status = Thermostat::Attributes::ControlSequenceOfOperation::Set(mEndpointId, Thermostat::ControlSequenceOfOperationEnum::kHeatingOnly); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + VerifyOrReturn(Status::Success == status, ChipLogError(NotSpecified, "Failed to set Thermostat ControlSequenceOfOperation attribute")); status = Thermostat::Attributes::AbsMinHeatSetpointLimit::Set(mEndpointId, 500); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + VerifyOrReturn(Status::Success == status, ChipLogError(NotSpecified, "Failed to set Thermostat MinHeatSetpointLimit attribute")); status = Thermostat::Attributes::AbsMaxHeatSetpointLimit::Set(mEndpointId, 3000); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + VerifyOrReturn(Status::Success == status, ChipLogError(NotSpecified, "Failed to set Thermostat MaxHeatSetpointLimit attribute")); } @@ -46,8 +49,8 @@ void ThermostatManager::HeatingSetpointWriteCallback(int16_t newValue) { ChipLogDetail(NotSpecified, "ThermostatManager::HeatingSetpointWriteCallback: %d", newValue); Thermostat::SystemModeEnum systemMode; - EmberAfStatus status = Thermostat::Attributes::SystemMode::Get(mEndpointId, &systemMode); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(NotSpecified, "Failed to get Thermostat SystemMode attribute")); + Status status = Thermostat::Attributes::SystemMode::Get(mEndpointId, &systemMode); + VerifyOrReturn(Status::Success == status, ChipLogError(NotSpecified, "Failed to get Thermostat SystemMode attribute")); // A new setpoint has been set, so we shall infer that the we want to be in Heating mode if (systemMode == Thermostat::SystemModeEnum::kOff) @@ -58,7 +61,7 @@ void ThermostatManager::HeatingSetpointWriteCallback(int16_t newValue) // Check the current temperature and turn on the heater if needed DataModel::Nullable localTemperature; status = Thermostat::Attributes::LocalTemperature::Get(mEndpointId, localTemperature); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + VerifyOrReturn(Status::Success == status, ChipLogError(NotSpecified, "Failed to get TemperatureMeasurement MeasuredValue attribute")); if (localTemperature.Value() < newValue) @@ -81,14 +84,13 @@ void ThermostatManager::SystemModeWriteCallback(uint8_t newValue) else if ((Thermostat::SystemModeEnum) newValue == Thermostat::SystemModeEnum::kHeat) { DataModel::Nullable localTemperature; - EmberAfStatus status = Thermostat::Attributes::LocalTemperature::Get(mEndpointId, localTemperature); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + Status status = Thermostat::Attributes::LocalTemperature::Get(mEndpointId, localTemperature); + VerifyOrReturn(Status::Success == status, ChipLogError(NotSpecified, "Failed to get TemperatureMeasurement MeasuredValue attribute")); int16_t heatingSetpoint; status = Thermostat::Attributes::OccupiedHeatingSetpoint::Get(mEndpointId, &heatingSetpoint); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(NotSpecified, "Failed to get Thermostat HeatingSetpoint attribute")); + VerifyOrReturn(Status::Success == status, ChipLogError(NotSpecified, "Failed to get Thermostat HeatingSetpoint attribute")); if (localTemperature.Value() < heatingSetpoint) { @@ -99,8 +101,8 @@ void ThermostatManager::SystemModeWriteCallback(uint8_t newValue) void ThermostatManager::OnLocalTemperatureChangeCallback(int16_t temperature) { - EmberAfStatus status = Thermostat::Attributes::LocalTemperature::Set(mEndpointId, temperature); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + Status status = Thermostat::Attributes::LocalTemperature::Set(mEndpointId, temperature); + VerifyOrReturn(Status::Success == status, ChipLogError(NotSpecified, "Failed to set TemperatureMeasurement MeasuredValue attribute")); } @@ -122,14 +124,13 @@ void ThermostatManager::SetHeating(bool isHeating) runningState.Clear(Thermostat::RelayStateBitmap::kHeat); } - EmberAfStatus status = Thermostat::Attributes::ThermostatRunningState::Set(mEndpointId, runningState); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(NotSpecified, "Failed to set Thermostat RunningState attribute")); + Status status = Thermostat::Attributes::ThermostatRunningState::Set(mEndpointId, runningState); + VerifyOrReturn(Status::Success == status, ChipLogError(NotSpecified, "Failed to set Thermostat RunningState attribute")); } void ThermostatManager::SetHeatMode(bool heat) { - EmberAfStatus status = Thermostat::Attributes::SystemMode::Set( + Status status = Thermostat::Attributes::SystemMode::Set( mEndpointId, heat ? Thermostat::SystemModeEnum::kHeat : Thermostat::SystemModeEnum::kOff); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(NotSpecified, "Failed to set Thermostat SystemMode attribute")); + VerifyOrReturn(Status::Success == status, ChipLogError(NotSpecified, "Failed to set Thermostat SystemMode attribute")); } diff --git a/examples/air-quality-sensor-app/air-quality-sensor-common/include/relative-humidity-sensor-manager.h b/examples/air-quality-sensor-app/air-quality-sensor-common/include/relative-humidity-sensor-manager.h index 4759f6096c84fc..0de2fa76e5ba61 100644 --- a/examples/air-quality-sensor-app/air-quality-sensor-common/include/relative-humidity-sensor-manager.h +++ b/examples/air-quality-sensor-app/air-quality-sensor-common/include/relative-humidity-sensor-manager.h @@ -1,4 +1,5 @@ #include +#include #pragma once @@ -11,19 +12,20 @@ class RelativeHumiditySensorManager public: RelativeHumiditySensorManager(EndpointId aEndpointId) : mEndpointId(aEndpointId) { - EmberAfStatus status = RelativeHumidityMeasurement::Attributes::MinMeasuredValue::Set(mEndpointId, 0); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + Protocols::InteractionModel::Status status = RelativeHumidityMeasurement::Attributes::MinMeasuredValue::Set(mEndpointId, 0); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, ChipLogError(NotSpecified, "Failed to set RelativeHumidityMeasurement MinMeasuredValue attribute")); status = RelativeHumidityMeasurement::Attributes::MaxMeasuredValue::Set(mEndpointId, 100); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, ChipLogError(NotSpecified, "Failed to set RelativeHumidityMeasurement MaxMeasuredValue attribute")); }; void OnHumidityChangeHandler(uint16_t newValue) { - EmberAfStatus status = RelativeHumidityMeasurement::Attributes::MeasuredValue::Set(mEndpointId, newValue); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + Protocols::InteractionModel::Status status = + RelativeHumidityMeasurement::Attributes::MeasuredValue::Set(mEndpointId, newValue); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, ChipLogError(NotSpecified, "Failed to set RelativeHumidityMeasurement MeasuredValue attribute")); ChipLogDetail(NotSpecified, "The new RelativeHumidityMeasurement value: %d", newValue); } diff --git a/examples/air-quality-sensor-app/air-quality-sensor-common/include/temperature-sensor-manager.h b/examples/air-quality-sensor-app/air-quality-sensor-common/include/temperature-sensor-manager.h index 3a0fc0cd0f4646..37f26e1412a886 100644 --- a/examples/air-quality-sensor-app/air-quality-sensor-common/include/temperature-sensor-manager.h +++ b/examples/air-quality-sensor-app/air-quality-sensor-common/include/temperature-sensor-manager.h @@ -1,6 +1,8 @@ -#include #pragma once +#include + +#include namespace chip { namespace app { @@ -11,19 +13,19 @@ class TemperatureSensorManager public: TemperatureSensorManager(EndpointId aEndpointId) : mEndpointId(aEndpointId) { - EmberAfStatus status = TemperatureMeasurement::Attributes::MinMeasuredValue::Set(mEndpointId, -5); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + Protocols::InteractionModel::Status status = TemperatureMeasurement::Attributes::MinMeasuredValue::Set(mEndpointId, -5); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, ChipLogError(NotSpecified, "Failed to set TemperatureMeasurement MinMeasuredValue attribute")); status = TemperatureMeasurement::Attributes::MaxMeasuredValue::Set(mEndpointId, 60); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, ChipLogError(NotSpecified, "Failed to set TemperatureMeasurement MaxMeasuredValue attribute")); }; void OnTemperatureChangeHandler(int16_t newValue) { - EmberAfStatus status = TemperatureMeasurement::Attributes::MeasuredValue::Set(mEndpointId, newValue); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, + Protocols::InteractionModel::Status status = TemperatureMeasurement::Attributes::MeasuredValue::Set(mEndpointId, newValue); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, ChipLogError(NotSpecified, "Failed to set TemperatureMeasurement MeasuredValue attribute")); ChipLogDetail(NotSpecified, "The new TemperatureMeasurement value: %d", newValue); } 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 17d4637b212453..91ab01644ddc7b 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 @@ -2732,7 +2732,7 @@ provisional cluster OvenMode = 73 { /** This cluster supports remotely monitoring and controling the different typs of functionality available to a drying device, such as a laundry dryer. */ -cluster LaundryDryerControls = 74 { +provisional cluster LaundryDryerControls = 74 { revision 1; enum DrynessLevelEnum : enum8 { diff --git a/examples/all-clusters-app/all-clusters-common/include/operational-state-delegate-impl.h b/examples/all-clusters-app/all-clusters-common/include/operational-state-delegate-impl.h index 0bcb76f324a1da..5c6f70bd28a50c 100644 --- a/examples/all-clusters-app/all-clusters-common/include/operational-state-delegate-impl.h +++ b/examples/all-clusters-app/all-clusters-common/include/operational-state-delegate-impl.h @@ -20,7 +20,7 @@ #include #include -#include + #include namespace chip { diff --git a/examples/all-clusters-app/all-clusters-common/include/oven-operational-state-delegate.h b/examples/all-clusters-app/all-clusters-common/include/oven-operational-state-delegate.h index 6d7338214f77ae..f68eec20692d0b 100644 --- a/examples/all-clusters-app/all-clusters-common/include/oven-operational-state-delegate.h +++ b/examples/all-clusters-app/all-clusters-common/include/oven-operational-state-delegate.h @@ -20,7 +20,7 @@ #include #include -#include + #include namespace chip { diff --git a/examples/all-clusters-app/all-clusters-common/include/rvc-operational-state-delegate-impl.h b/examples/all-clusters-app/all-clusters-common/include/rvc-operational-state-delegate-impl.h index 4417f9f5a3ab4a..60a2f5d530f9b9 100644 --- a/examples/all-clusters-app/all-clusters-common/include/rvc-operational-state-delegate-impl.h +++ b/examples/all-clusters-app/all-clusters-common/include/rvc-operational-state-delegate-impl.h @@ -20,7 +20,7 @@ #include #include -#include + #include namespace chip { diff --git a/examples/all-clusters-app/all-clusters-common/src/binding-handler.cpp b/examples/all-clusters-app/all-clusters-common/src/binding-handler.cpp index cd16efd4a3f054..95f50acce7c4ef 100644 --- a/examples/all-clusters-app/all-clusters-common/src/binding-handler.cpp +++ b/examples/all-clusters-app/all-clusters-common/src/binding-handler.cpp @@ -73,13 +73,13 @@ static void BoundDeviceChangedHandler(const EmberBindingTableEntry & binding, ch using namespace chip; using namespace chip::app; - if (binding.type == EMBER_MULTICAST_BINDING) + if (binding.type == MATTER_MULTICAST_BINDING) { ChipLogError(NotSpecified, "Group binding is not supported now"); return; } - if (binding.type == EMBER_UNICAST_BINDING && binding.local == 1 && + if (binding.type == MATTER_UNICAST_BINDING && binding.local == 1 && (!binding.clusterId.HasValue() || binding.clusterId.Value() == Clusters::OnOff::Id)) { auto onSuccess = [](const ConcreteCommandPath & commandPath, const StatusIB & status, const auto & dataResponse) { diff --git a/examples/all-clusters-app/all-clusters-common/src/dishwasher-alarm-stub.cpp b/examples/all-clusters-app/all-clusters-common/src/dishwasher-alarm-stub.cpp index 58d393752c8bfd..f700df068b529f 100644 --- a/examples/all-clusters-app/all-clusters-common/src/dishwasher-alarm-stub.cpp +++ b/examples/all-clusters-app/all-clusters-common/src/dishwasher-alarm-stub.cpp @@ -17,7 +17,6 @@ */ #include #include -#include using namespace chip; diff --git a/examples/all-clusters-app/all-clusters-common/src/electrical-power-measurement-stub.cpp b/examples/all-clusters-app/all-clusters-common/src/electrical-power-measurement-stub.cpp index bac73dd0441634..4bcea0e8ed9895 100644 --- a/examples/all-clusters-app/all-clusters-common/src/electrical-power-measurement-stub.cpp +++ b/examples/all-clusters-app/all-clusters-common/src/electrical-power-measurement-stub.cpp @@ -16,239 +16,25 @@ * limitations under the License. */ -#include +#include using namespace chip; using namespace chip::app::Clusters; using namespace chip::app::Clusters::ElectricalPowerMeasurement; -using namespace chip::app::Clusters::ElectricalPowerMeasurement::Structs; -namespace chip { -namespace app { -namespace Clusters { -namespace ElectricalPowerMeasurement { - -static MeasurementAccuracyRangeStruct::Type activeCurrentAccuracyRanges[] = { { .rangeMin = 500, .rangeMax = 1000 } }; - -class StubAccuracyIterator : public Delegate::AccuracyIterator -{ -public: - size_t Count() override; - bool Next(MeasurementAccuracyStruct::Type & output) override; - void Release() override; - -private: - uint8_t mIndex; -}; - -size_t StubAccuracyIterator::Count() -{ - return 1; -} - -bool StubAccuracyIterator::Next(MeasurementAccuracyStruct::Type & output) -{ - if (mIndex >= 1) - { - return false; - } - output.measurementType = MeasurementTypeEnum::kActiveCurrent; - output.measured = true; - output.minMeasuredValue = -10000000; - output.maxMeasuredValue = 10000000; - output.accuracyRanges = DataModel::List(activeCurrentAccuracyRanges); - mIndex++; - return true; -} - -void StubAccuracyIterator::Release() -{ - mIndex = 0; -} - -class StubRangeIterator : public Delegate::RangeIterator -{ -public: - size_t Count() override; - bool Next(MeasurementRangeStruct::Type & output) override; - void Release() override; -}; - -size_t StubRangeIterator::Count() -{ - return 0; -} - -bool StubRangeIterator::Next(MeasurementRangeStruct::Type & output) -{ - return false; -} - -void StubRangeIterator::Release() {} - -class StubHarmonicMeasurementIterator : public Delegate::HarmonicMeasurementIterator -{ -public: - size_t Count() override; - bool Next(HarmonicMeasurementStruct::Type & output) override; - void Release() override; -}; - -size_t StubHarmonicMeasurementIterator::Count() -{ - return 0; -} - -bool StubHarmonicMeasurementIterator::Next(HarmonicMeasurementStruct::Type & output) -{ - return false; -} - -void StubHarmonicMeasurementIterator::Release() {} - -static StubAccuracyIterator accuracyIterator; -static StubRangeIterator rangeIterator; -static StubHarmonicMeasurementIterator harmonicMeasurementIterator; - -class ElectricalPowerMeasurementDelegate : public Delegate -{ -public: - PowerModeEnum GetPowerMode() override; - uint8_t GetNumberOfMeasurementTypes() override; - AccuracyIterator * IterateAccuracy() override; - RangeIterator * IterateRanges() override; - DataModel::Nullable GetVoltage() override; - DataModel::Nullable GetActiveCurrent() override; - DataModel::Nullable GetReactiveCurrent() override; - DataModel::Nullable GetApparentCurrent() override; - DataModel::Nullable GetActivePower() override; - DataModel::Nullable GetReactivePower() override; - DataModel::Nullable GetApparentPower() override; - DataModel::Nullable GetRMSVoltage() override; - DataModel::Nullable GetRMSCurrent() override; - DataModel::Nullable GetRMSPower() override; - DataModel::Nullable GetFrequency() override; - HarmonicMeasurementIterator * IterateHarmonicCurrents() override; - HarmonicMeasurementIterator * IterateHarmonicPhases() override; - DataModel::Nullable GetPowerFactor() override; - DataModel::Nullable GetNeutralCurrent() override; - - ~ElectricalPowerMeasurementDelegate() = default; -}; - -PowerModeEnum ElectricalPowerMeasurementDelegate::GetPowerMode() -{ - return PowerModeEnum::kAc; -} - -uint8_t ElectricalPowerMeasurementDelegate::GetNumberOfMeasurementTypes() -{ - return 1; -} - -Delegate::AccuracyIterator * ElectricalPowerMeasurementDelegate::IterateAccuracy() -{ - return &accuracyIterator; -} - -Delegate::RangeIterator * ElectricalPowerMeasurementDelegate::IterateRanges() -{ - return &rangeIterator; -} - -DataModel::Nullable ElectricalPowerMeasurementDelegate::GetVoltage() -{ - return {}; -} - -DataModel::Nullable ElectricalPowerMeasurementDelegate::GetActiveCurrent() -{ - return {}; -} - -DataModel::Nullable ElectricalPowerMeasurementDelegate::GetReactiveCurrent() -{ - return {}; -} - -DataModel::Nullable ElectricalPowerMeasurementDelegate::GetApparentCurrent() -{ - return {}; -} - -DataModel::Nullable ElectricalPowerMeasurementDelegate::GetActivePower() -{ - return DataModel::Nullable(10000); -} - -DataModel::Nullable ElectricalPowerMeasurementDelegate::GetReactivePower() -{ - return {}; -} - -DataModel::Nullable ElectricalPowerMeasurementDelegate::GetApparentPower() -{ - return {}; -} - -DataModel::Nullable ElectricalPowerMeasurementDelegate::GetRMSVoltage() -{ - return {}; -} - -DataModel::Nullable ElectricalPowerMeasurementDelegate::GetRMSCurrent() -{ - return {}; -} - -DataModel::Nullable ElectricalPowerMeasurementDelegate::GetRMSPower() -{ - return {}; -} - -DataModel::Nullable ElectricalPowerMeasurementDelegate::GetFrequency() -{ - return {}; -} - -Delegate::HarmonicMeasurementIterator * ElectricalPowerMeasurementDelegate::IterateHarmonicCurrents() -{ - return &harmonicMeasurementIterator; -} - -Delegate::HarmonicMeasurementIterator * ElectricalPowerMeasurementDelegate::IterateHarmonicPhases() -{ - return &harmonicMeasurementIterator; -} - -DataModel::Nullable ElectricalPowerMeasurementDelegate::GetPowerFactor() -{ - return {}; -} - -DataModel::Nullable ElectricalPowerMeasurementDelegate::GetNeutralCurrent() -{ - return {}; -} - -} // namespace ElectricalPowerMeasurement -} // namespace Clusters -} // namespace app -} // namespace chip - -static std::unique_ptr gDelegate; -static std::unique_ptr gInstance; +static std::unique_ptr gEPMDelegate; +static std::unique_ptr gEPMInstance; void emberAfElectricalPowerMeasurementClusterInitCallback(chip::EndpointId endpointId) { VerifyOrDie(endpointId == 1); // this cluster is only enabled for endpoint 1. - VerifyOrDie(!gInstance); + VerifyOrDie(!gEPMInstance); - gDelegate = std::make_unique(); - if (gDelegate) + gEPMDelegate = std::make_unique(); + if (gEPMDelegate) { - gInstance = std::make_unique( - endpointId, *gDelegate, + gEPMInstance = std::make_unique( + endpointId, *gEPMDelegate, BitMask(Feature::kDirectCurrent, Feature::kAlternatingCurrent, Feature::kPolyphasePower, Feature::kHarmonics, Feature::kPowerQuality), BitMask( @@ -260,6 +46,6 @@ void emberAfElectricalPowerMeasurementClusterInitCallback(chip::EndpointId endpo OptionalAttributes::kOptionalAttributeFrequency, OptionalAttributes::kOptionalAttributePowerFactor, OptionalAttributes::kOptionalAttributeNeutralCurrent)); - gInstance->Init(); + gEPMInstance->Init(); } } diff --git a/examples/all-clusters-app/all-clusters-common/src/fan-stub.cpp b/examples/all-clusters-app/all-clusters-common/src/fan-stub.cpp index 553532622ddcac..9a9fcccd73f4f2 100644 --- a/examples/all-clusters-app/all-clusters-common/src/fan-stub.cpp +++ b/examples/all-clusters-app/all-clusters-common/src/fan-stub.cpp @@ -22,7 +22,6 @@ #include #include #include -#include #include #include @@ -147,7 +146,7 @@ Status FanControlManager::HandleStep(StepDirectionEnum aDirection, bool aWrap, b } } - return ToInteractionModelStatus(SpeedSetting::Set(mEndpoint, newSpeedSetting)); + return SpeedSetting::Set(mEndpoint, newSpeedSetting); } CHIP_ERROR FanControlManager::Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) diff --git a/examples/all-clusters-app/ameba/chip_main.cmake b/examples/all-clusters-app/ameba/chip_main.cmake index 6cc76ad25e7dd8..0d8b99c117716e 100755 --- a/examples/all-clusters-app/ameba/chip_main.cmake +++ b/examples/all-clusters-app/ameba/chip_main.cmake @@ -179,6 +179,7 @@ list( ${chip_dir}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp ${chip_dir}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementManager.cpp + ${chip_dir}/examples/energy-management-app/energy-management-common/src/ElectricalPowerMeasurementDelegate.cpp ${chip_dir}/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp ${chip_dir}/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp diff --git a/examples/all-clusters-app/ameba/main/BindingHandler.cpp b/examples/all-clusters-app/ameba/main/BindingHandler.cpp index 64ccb619a2edf5..b00322b44e4f0b 100644 --- a/examples/all-clusters-app/ameba/main/BindingHandler.cpp +++ b/examples/all-clusters-app/ameba/main/BindingHandler.cpp @@ -58,7 +58,7 @@ void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, Operation if (data->isReadAttribute) { // It should always enter here if isReadAttribute is true - if (binding.type == EMBER_UNICAST_BINDING && !data->isGroup) + if (binding.type == MATTER_UNICAST_BINDING && !data->isGroup) { switch (data->clusterId) { @@ -82,7 +82,7 @@ void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, Operation } else { - if (binding.type == EMBER_MULTICAST_BINDING && data->isGroup) + if (binding.type == MATTER_MULTICAST_BINDING && data->isGroup) { switch (data->clusterId) { @@ -103,7 +103,7 @@ void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, Operation break; } } - else if (binding.type == EMBER_UNICAST_BINDING && !data->isGroup) + else if (binding.type == MATTER_UNICAST_BINDING && !data->isGroup) { switch (data->clusterId) { @@ -190,7 +190,7 @@ CHIP_ERROR BindingGroupBindCommandHandler(int argc, char ** argv) VerifyOrReturnError(argc == 2, CHIP_ERROR_INVALID_ARGUMENT); EmberBindingTableEntry * entry = Platform::New(); - entry->type = EMBER_MULTICAST_BINDING; + entry->type = MATTER_MULTICAST_BINDING; entry->fabricIndex = atoi(argv[0]); entry->groupId = atoi(argv[1]); entry->local = 1; // Hardcoded to endpoint 1 for now @@ -205,7 +205,7 @@ CHIP_ERROR BindingUnicastBindCommandHandler(int argc, char ** argv) VerifyOrReturnError(argc == 3, CHIP_ERROR_INVALID_ARGUMENT); EmberBindingTableEntry * entry = Platform::New(); - entry->type = EMBER_UNICAST_BINDING; + entry->type = MATTER_UNICAST_BINDING; entry->fabricIndex = atoi(argv[0]); entry->nodeId = atoi(argv[1]); entry->local = 1; // Hardcoded to endpoint 1 for now diff --git a/examples/all-clusters-app/ameba/main/include/ManualDishWasherAlarmCommand.h b/examples/all-clusters-app/ameba/main/include/ManualDishWasherAlarmCommand.h index c1a37be41d385a..0d87a0eefcf828 100644 --- a/examples/all-clusters-app/ameba/main/include/ManualDishWasherAlarmCommand.h +++ b/examples/all-clusters-app/ameba/main/include/ManualDishWasherAlarmCommand.h @@ -19,6 +19,7 @@ #include "controller/InvokeInteraction.h" #include "controller/ReadInteraction.h" #include +#include #if CONFIG_ENABLE_CHIP_SHELL #include "lib/shell/Engine.h" @@ -65,7 +66,7 @@ CHIP_ERROR ManualDishWasherAlarmSetRaiseCommandHandler(int argc, char ** argv) } CHIP_ERROR err = CHIP_NO_ERROR; - EmberAfStatus status; + Protocols::InteractionModel::Status status; DishwasherAlarmServer & serverInstance = DishwasherAlarmServer::Instance(); BitMask supported; // Set dishwasher alarm supported value @@ -88,21 +89,21 @@ CHIP_ERROR ManualDishWasherAlarmSetRaiseCommandHandler(int argc, char ** argv) state.SetField(AlarmMap::kTempTooLow, 1); // 0x08, 8 status = serverInstance.SetSupportedValue(1, supported); // 0x2F, 47 - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { err = CHIP_ERROR_INTERNAL; goto exit; } status = serverInstance.SetMaskValue(1, mask); // 0x2F, 47 - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { err = CHIP_ERROR_INTERNAL; goto exit; } status = serverInstance.SetStateValue(1, state); // 0x0E, 14 - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { err = CHIP_ERROR_INTERNAL; goto exit; @@ -124,7 +125,7 @@ CHIP_ERROR ManualDishWasherAlarmSetLowerCommandHandler(int argc, char ** argv) } CHIP_ERROR err = CHIP_NO_ERROR; - EmberAfStatus status; + Protocols::InteractionModel::Status status; DishwasherAlarmServer & serverInstance = DishwasherAlarmServer::Instance(); BitMask supported; // Set dishwasher alarm supported value @@ -142,21 +143,21 @@ CHIP_ERROR ManualDishWasherAlarmSetLowerCommandHandler(int argc, char ** argv) mask.SetField(AlarmMap::kWaterLevelError, 1); // 0x20, 32 status = serverInstance.SetSupportedValue(1, supported); // 0x2F, 47 - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { err = CHIP_ERROR_INTERNAL; goto exit; } status = serverInstance.SetMaskValue(1, mask); // 0x2F, 47 - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { err = CHIP_ERROR_INTERNAL; goto exit; } status = serverInstance.SetStateValue(1, 0); // Set dishwasher alarm state value 0x00, 0 - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { err = CHIP_ERROR_INTERNAL; goto exit; diff --git a/examples/all-clusters-app/ameba/main/include/ManualRefrigeratorAlarmCommand.h b/examples/all-clusters-app/ameba/main/include/ManualRefrigeratorAlarmCommand.h index d2ec4224a5332f..b4f8974d123a55 100644 --- a/examples/all-clusters-app/ameba/main/include/ManualRefrigeratorAlarmCommand.h +++ b/examples/all-clusters-app/ameba/main/include/ManualRefrigeratorAlarmCommand.h @@ -16,9 +16,12 @@ * limitations under the License. */ +#pragma once + #include "controller/InvokeInteraction.h" #include "controller/ReadInteraction.h" #include +#include #if CONFIG_ENABLE_CHIP_SHELL #include "lib/shell/Engine.h" @@ -60,25 +63,25 @@ CHIP_ERROR ManualRefrigeratorAlarmCommandHandler(int argc, char ** argv) CHIP_ERROR ManualRefrigeratorAlarmDoorOpenCommandHandler(int argc, char ** argv) { CHIP_ERROR err = CHIP_NO_ERROR; - EmberAfStatus status; + Protocols::InteractionModel::Status status; RefrigeratorAlarmServer & serverInstance = RefrigeratorAlarmServer::Instance(); status = serverInstance.SetMaskValue(1, 0); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { err = CHIP_ERROR_INTERNAL; goto exit; } status = serverInstance.SetStateValue(1, 1); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { err = CHIP_ERROR_INTERNAL; goto exit; } status = serverInstance.SetSupportedValue(1, 0); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { err = CHIP_ERROR_INTERNAL; goto exit; @@ -96,25 +99,25 @@ CHIP_ERROR ManualRefrigeratorAlarmDoorOpenCommandHandler(int argc, char ** argv) CHIP_ERROR ManualRefrigeratorAlarmDoorCloseCommandHandler(int argc, char ** argv) { CHIP_ERROR err = CHIP_NO_ERROR; - EmberAfStatus status; + Protocols::InteractionModel::Status status; RefrigeratorAlarmServer & serverInstance = RefrigeratorAlarmServer::Instance(); status = serverInstance.SetMaskValue(1, 1); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { err = CHIP_ERROR_INTERNAL; goto exit; } status = serverInstance.SetStateValue(1, 0); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { err = CHIP_ERROR_INTERNAL; goto exit; } status = serverInstance.SetSupportedValue(1, 1); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { err = CHIP_ERROR_INTERNAL; goto exit; @@ -132,18 +135,18 @@ CHIP_ERROR ManualRefrigeratorAlarmDoorCloseCommandHandler(int argc, char ** argv CHIP_ERROR ManualRefrigeratorAlarmSuppressCommandHandler(int argc, char ** argv) { CHIP_ERROR err = CHIP_NO_ERROR; - EmberAfStatus status; + Protocols::InteractionModel::Status status; RefrigeratorAlarmServer & serverInstance = RefrigeratorAlarmServer::Instance(); status = serverInstance.SetSupportedValue(1, 1); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { err = CHIP_ERROR_INTERNAL; goto exit; } status = serverInstance.SetStateValue(1, 0); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { err = CHIP_ERROR_INTERNAL; goto exit; diff --git a/examples/all-clusters-app/asr/BUILD.gn b/examples/all-clusters-app/asr/BUILD.gn index 263bd8cf7734b7..6f70452fa71bbe 100755 --- a/examples/all-clusters-app/asr/BUILD.gn +++ b/examples/all-clusters-app/asr/BUILD.gn @@ -84,6 +84,7 @@ asr_executable("clusters_app") { "${chip_root}/examples/all-clusters-app/all-clusters-common/src/static-supported-temperature-levels.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementManager.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/src/ElectricalPowerMeasurementDelegate.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp", "${examples_plat_dir}/ButtonHandler.cpp", diff --git a/examples/all-clusters-app/asr/src/AppTask.cpp b/examples/all-clusters-app/asr/src/AppTask.cpp old mode 100755 new mode 100644 index 3f16789c40e69f..92b6aaef3dba49 --- a/examples/all-clusters-app/asr/src/AppTask.cpp +++ b/examples/all-clusters-app/asr/src/AppTask.cpp @@ -38,10 +38,13 @@ #include #include #include +#include #include #include #include +using chip::Protocols::InteractionModel::Status; + using namespace ::chip; using namespace ::chip::Credentials; using namespace ::chip::DeviceManager; @@ -265,11 +268,11 @@ void AppTask::OnOffUpdateClusterState(void) uint8_t onoff = sLightLED.Get(); // write the new on/off value - EmberAfStatus status = app::Clusters::OnOff::Attributes::OnOff::Set(1, onoff); + Status status = app::Clusters::OnOff::Attributes::OnOff::Set(1, onoff); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ASR_LOG("ERR: updating on/off %x", status); + ASR_LOG("ERR: updating on/off %x", to_underlying(status)); } } diff --git a/examples/all-clusters-app/cc13x2x7_26x2x7/BUILD.gn b/examples/all-clusters-app/cc13x2x7_26x2x7/BUILD.gn index 6ec6202ea21209..6cf5941e79d2c4 100644 --- a/examples/all-clusters-app/cc13x2x7_26x2x7/BUILD.gn +++ b/examples/all-clusters-app/cc13x2x7_26x2x7/BUILD.gn @@ -60,7 +60,7 @@ ti_sysconfig("sysconfig") { #"ti_build_config.opt", ] - public_configs = [ ":sdk_dmm_config" ] + public_configs = [ ":sdk_cc13x2x7_26x2x7_dmm_config" ] cflags = [ "-Wno-comment", @@ -89,6 +89,7 @@ ti_simplelink_executable("all-clusters-app") { "${chip_root}/examples/all-clusters-app/all-clusters-common/src/static-supported-temperature-levels.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementManager.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/src/ElectricalPowerMeasurementDelegate.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp", "${chip_root}/examples/providers/DeviceInfoProviderImpl.cpp", diff --git a/examples/all-clusters-app/cc13x4_26x4/BUILD.gn b/examples/all-clusters-app/cc13x4_26x4/BUILD.gn index 02dbebf7e6d8c9..eb118372b7bd33 100644 --- a/examples/all-clusters-app/cc13x4_26x4/BUILD.gn +++ b/examples/all-clusters-app/cc13x4_26x4/BUILD.gn @@ -63,7 +63,7 @@ ti_sysconfig("sysconfig") { #"ti_build_config.opt", ] - public_configs = [ ":sdk_dmm_config" ] + public_configs = [ ":sdk_cc13x4_26x4_dmm_config" ] cflags = [ "-Wno-comment", @@ -92,6 +92,7 @@ ti_simplelink_executable("all-clusters-app") { "${chip_root}/examples/all-clusters-app/all-clusters-common/src/static-supported-temperature-levels.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementManager.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/src/ElectricalPowerMeasurementDelegate.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp", "${chip_root}/examples/providers/DeviceInfoProviderImpl.cpp", diff --git a/examples/all-clusters-app/infineon/psoc6/BUILD.gn b/examples/all-clusters-app/infineon/psoc6/BUILD.gn index f2b9ab939d6f38..9a0fbe3b3b37ac 100644 --- a/examples/all-clusters-app/infineon/psoc6/BUILD.gn +++ b/examples/all-clusters-app/infineon/psoc6/BUILD.gn @@ -120,6 +120,7 @@ psoc6_executable("clusters_app") { "${chip_root}/examples/all-clusters-app/all-clusters-common/src/static-supported-temperature-levels.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementManager.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/src/ElectricalPowerMeasurementDelegate.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp", "${examples_plat_dir}/LEDWidget.cpp", diff --git a/examples/all-clusters-app/infineon/psoc6/src/AppTask.cpp b/examples/all-clusters-app/infineon/psoc6/src/AppTask.cpp index e9f9dc1a171484..b75b5abfc74294 100644 --- a/examples/all-clusters-app/infineon/psoc6/src/AppTask.cpp +++ b/examples/all-clusters-app/infineon/psoc6/src/AppTask.cpp @@ -409,11 +409,11 @@ void AppTask::OnOffUpdateClusterState(intptr_t context) uint8_t onoff = sLightLED.Get(); // write the new on/off value - EmberAfStatus status = app::Clusters::OnOff::Attributes::OnOff::Set(2, onoff); + Protocols::InteractionModel::Status status = app::Clusters::OnOff::Attributes::OnOff::Set(2, onoff); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - P6_LOG("ERR: updating on/off %x", status); + P6_LOG("ERR: updating on/off %x", to_underlying(status)); } } diff --git a/examples/all-clusters-app/linux/AllClustersCommandDelegate.cpp b/examples/all-clusters-app/linux/AllClustersCommandDelegate.cpp index 2da7e0c8900f3d..3145bd605b518c 100644 --- a/examples/all-clusters-app/linux/AllClustersCommandDelegate.cpp +++ b/examples/all-clusters-app/linux/AllClustersCommandDelegate.cpp @@ -296,8 +296,9 @@ void AllClustersAppCommandHandler::OnSwitchLatchedHandler(uint8_t newPosition) { EndpointId endpoint = 1; - EmberAfStatus status = Switch::Attributes::CurrentPosition::Set(endpoint, newPosition); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(NotSpecified, "Failed to set CurrentPosition attribute")); + Protocols::InteractionModel::Status status = Switch::Attributes::CurrentPosition::Set(endpoint, newPosition); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, + ChipLogError(NotSpecified, "Failed to set CurrentPosition attribute")); ChipLogDetail(NotSpecified, "The latching switch is moved to a new position:%d", newPosition); Clusters::SwitchServer::Instance().OnSwitchLatch(endpoint, newPosition); @@ -307,8 +308,9 @@ void AllClustersAppCommandHandler::OnSwitchInitialPressedHandler(uint8_t newPosi { EndpointId endpoint = 1; - EmberAfStatus status = Switch::Attributes::CurrentPosition::Set(endpoint, newPosition); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(NotSpecified, "Failed to set CurrentPosition attribute")); + Protocols::InteractionModel::Status status = Switch::Attributes::CurrentPosition::Set(endpoint, newPosition); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, + ChipLogError(NotSpecified, "Failed to set CurrentPosition attribute")); ChipLogDetail(NotSpecified, "The new position when the momentary switch starts to be pressed:%d", newPosition); Clusters::SwitchServer::Instance().OnInitialPress(endpoint, newPosition); @@ -318,8 +320,9 @@ void AllClustersAppCommandHandler::OnSwitchLongPressedHandler(uint8_t newPositio { EndpointId endpoint = 1; - EmberAfStatus status = Switch::Attributes::CurrentPosition::Set(endpoint, newPosition); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(NotSpecified, "Failed to set CurrentPosition attribute")); + Protocols::InteractionModel::Status status = Switch::Attributes::CurrentPosition::Set(endpoint, newPosition); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, + ChipLogError(NotSpecified, "Failed to set CurrentPosition attribute")); ChipLogDetail(NotSpecified, "The new position when the momentary switch has been pressed for a long time:%d", newPosition); Clusters::SwitchServer::Instance().OnLongPress(endpoint, newPosition); @@ -332,8 +335,9 @@ void AllClustersAppCommandHandler::OnSwitchShortReleasedHandler(uint8_t previous { EndpointId endpoint = 1; - EmberAfStatus status = Switch::Attributes::CurrentPosition::Set(endpoint, 0); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(NotSpecified, "Failed to reset CurrentPosition attribute")); + Protocols::InteractionModel::Status status = Switch::Attributes::CurrentPosition::Set(endpoint, 0); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, + ChipLogError(NotSpecified, "Failed to reset CurrentPosition attribute")); ChipLogDetail(NotSpecified, "The the previous value of the CurrentPosition when the momentary switch has been released:%d", previousPosition); @@ -344,8 +348,9 @@ void AllClustersAppCommandHandler::OnSwitchLongReleasedHandler(uint8_t previousP { EndpointId endpoint = 1; - EmberAfStatus status = Switch::Attributes::CurrentPosition::Set(endpoint, 0); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(NotSpecified, "Failed to reset CurrentPosition attribute")); + Protocols::InteractionModel::Status status = Switch::Attributes::CurrentPosition::Set(endpoint, 0); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, + ChipLogError(NotSpecified, "Failed to reset CurrentPosition attribute")); ChipLogDetail(NotSpecified, "The the previous value of the CurrentPosition when the momentary switch has been released after having been " "pressed for a long time:%d", @@ -358,8 +363,9 @@ void AllClustersAppCommandHandler::OnSwitchMultiPressOngoingHandler(uint8_t newP { EndpointId endpoint = 1; - EmberAfStatus status = Switch::Attributes::CurrentPosition::Set(endpoint, newPosition); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(NotSpecified, "Failed to set CurrentPosition attribute")); + Protocols::InteractionModel::Status status = Switch::Attributes::CurrentPosition::Set(endpoint, newPosition); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, + ChipLogError(NotSpecified, "Failed to set CurrentPosition attribute")); ChipLogDetail(NotSpecified, "The new position when the momentary switch has been pressed in a multi-press sequence:%d", newPosition); ChipLogDetail(NotSpecified, "%d times the momentary switch has been pressed", count); @@ -371,8 +377,9 @@ void AllClustersAppCommandHandler::OnSwitchMultiPressCompleteHandler(uint8_t pre { EndpointId endpoint = 1; - EmberAfStatus status = Switch::Attributes::CurrentPosition::Set(endpoint, 0); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(NotSpecified, "Failed to reset CurrentPosition attribute")); + Protocols::InteractionModel::Status status = Switch::Attributes::CurrentPosition::Set(endpoint, 0); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, + ChipLogError(NotSpecified, "Failed to reset CurrentPosition attribute")); ChipLogDetail(NotSpecified, "The previous position when the momentary switch has been pressed in a multi-press sequence:%d", previousPosition); ChipLogDetail(NotSpecified, "%d times the momentary switch has been pressed", count); diff --git a/examples/all-clusters-app/linux/BUILD.gn b/examples/all-clusters-app/linux/BUILD.gn index 0d1c4ce8cc7ddd..998f98a19cd3de 100644 --- a/examples/all-clusters-app/linux/BUILD.gn +++ b/examples/all-clusters-app/linux/BUILD.gn @@ -19,6 +19,14 @@ import("${build_root}/config/compiler/compiler.gni") import("${chip_root}/src/lib/lib.gni") import("${chip_root}/src/platform/device.gni") +import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni") + +if (chip_enable_pw_rpc) { + import("//build_overrides/pigweed.gni") + import("$dir_pw_build/target_types.gni") + import("${chip_root}/examples/common/pigweed/rpc_config.gni") +} + source_set("chip-all-clusters-common") { sources = [ "${chip_root}/examples/all-clusters-app/all-clusters-common/src/air-quality-instance.cpp", @@ -51,6 +59,7 @@ source_set("chip-all-clusters-common") { "${chip_root}/examples/all-clusters-app/linux/diagnostic-logs-provider-delegate-impl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementManager.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/src/ElectricalPowerMeasurementDelegate.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/device-energy-management-mode.cpp", @@ -77,7 +86,19 @@ source_set("chip-all-clusters-common") { "${chip_root}/examples/energy-management-app/energy-management-common/include", ] - cflags = [ "-Wconversion" ] + if (chip_enable_pw_rpc) { + defines = rpc_defines + sources += rpc_sources + deps += rpc_deps + + deps += pw_build_LINK_DEPS + + include_dirs += [ "${chip_root}/examples/common" ] + } else { + # The system_rpc_server.cc file is in pigweed and doesn't compile with + # -Wconversion, remove check for RPC build only. + cflags = [ "-Wconversion" ] + } if (chip_build_libshell) { defines = [ "ENABLE_CHIP_SHELL" ] diff --git a/examples/all-clusters-app/linux/with_pw_rpc.gni b/examples/all-clusters-app/linux/with_pw_rpc.gni new file mode 100644 index 00000000000000..0f1ab1ea89c121 --- /dev/null +++ b/examples/all-clusters-app/linux/with_pw_rpc.gni @@ -0,0 +1,42 @@ +# 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. + +# add this gni as import in your build args to use pigweed in the example +# 'import("//with_pw_rpc.gni")' + +import("//build_overrides/chip.gni") + +import("${chip_root}/config/standalone/args.gni") + +import("//build_overrides/pigweed.gni") + +pw_log_BACKEND = "$dir_pw_log_basic" +pw_assert_BACKEND = "$dir_pw_assert_log:check_backend" +pw_sys_io_BACKEND = "$dir_pw_sys_io_stdio" +pw_trace_BACKEND = "$dir_pw_trace_tokenized" +pw_unit_test_MAIN = "$dir_pw_unit_test:logging_main" +pw_rpc_system_server_BACKEND = "${chip_root}/config/linux/lib/pw_rpc:pw_rpc" +dir_pw_third_party_nanopb = "${chip_root}/third_party/nanopb/repo" +pw_chrono_SYSTEM_CLOCK_BACKEND = "$dir_pw_chrono_stl:system_clock" +pw_sync_MUTEX_BACKEND = "$dir_pw_sync_stl:mutex_backend" +pw_thread_YIELD_BACKEND = "$dir_pw_thread_stl:yield" +pw_thread_SLEEP_BACKEND = "$dir_pw_thread_stl:sleep" + +pw_build_LINK_DEPS = [ + "$dir_pw_assert:impl", + "$dir_pw_log:impl", +] + +chip_enable_pw_rpc = true +chip_use_pw_logging = true diff --git a/examples/all-clusters-app/mbed/CMakeLists.txt b/examples/all-clusters-app/mbed/CMakeLists.txt index f2b6d9f5e88d27..3d1a179a93bbb2 100644 --- a/examples/all-clusters-app/mbed/CMakeLists.txt +++ b/examples/all-clusters-app/mbed/CMakeLists.txt @@ -72,6 +72,7 @@ target_sources(${APP_TARGET} PRIVATE ${ALL_CLUSTERS_COMMON}/src/smco-stub.cpp ${ALL_CLUSTERS_COMMON}/src/static-supported-modes-manager.cpp ${ALL_CLUSTERS_COMMON}/src/static-supported-temperature-levels.cpp + ${ENERGY_MANAGEMENT_COMMON}/src/ElectricalPowerMeasurementDelegate.cpp ${ENERGY_MANAGEMENT_COMMON}/src/EnergyEvseDelegateImpl.cpp ${ENERGY_MANAGEMENT_COMMON}/src/EnergyEvseManager.cpp ${ENERGY_MANAGEMENT_COMMON}/src/DeviceEnergyManagementDelegateImpl.cpp diff --git a/examples/all-clusters-app/nrfconnect/CMakeLists.txt b/examples/all-clusters-app/nrfconnect/CMakeLists.txt index 49bf4fb7f95e3a..563295e059b46c 100644 --- a/examples/all-clusters-app/nrfconnect/CMakeLists.txt +++ b/examples/all-clusters-app/nrfconnect/CMakeLists.txt @@ -72,6 +72,7 @@ target_sources(app PRIVATE ${ALL_CLUSTERS_COMMON_DIR}/src/resource-monitoring-delegates.cpp ${ENERGY_MANAGEMENT_COMMON_DIR}/src/DeviceEnergyManagementDelegateImpl.cpp ${ENERGY_MANAGEMENT_COMMON_DIR}/src/DeviceEnergyManagementManager.cpp + ${ENERGY_MANAGEMENT_COMMON_DIR}/src/ElectricalPowerMeasurementDelegate.cpp ${ENERGY_MANAGEMENT_COMMON_DIR}/src/EnergyEvseDelegateImpl.cpp ${ENERGY_MANAGEMENT_COMMON_DIR}/src/EnergyEvseManager.cpp ${NRFCONNECT_COMMON}/util/LEDWidget.cpp) diff --git a/examples/all-clusters-app/nrfconnect/main/ZclDoorLockCallbacks.cpp b/examples/all-clusters-app/nrfconnect/main/ZclDoorLockCallbacks.cpp index 2d3a6e4e32f270..eaf2bda516f23e 100644 --- a/examples/all-clusters-app/nrfconnect/main/ZclDoorLockCallbacks.cpp +++ b/examples/all-clusters-app/nrfconnect/main/ZclDoorLockCallbacks.cpp @@ -55,9 +55,9 @@ void emberAfDoorLockClusterInitCallback(EndpointId endpoint) // Set FeatureMap to 0, default is: // (kUser|kAccessSchedules|kRfidCredential|kPinCredential) 0x113 - EmberAfStatus status = DoorLock::Attributes::FeatureMap::Set(endpoint, 0); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Protocols::InteractionModel::Status status = DoorLock::Attributes::FeatureMap::Set(endpoint, 0); + if (status != Protocols::InteractionModel::Status::Success) { - LOG_ERR("Updating feature map %x", status); + LOG_ERR("Updating feature map %x", to_underlying(status)); } } diff --git a/examples/all-clusters-app/nxp/mw320/BUILD.gn b/examples/all-clusters-app/nxp/mw320/BUILD.gn index a858c18e87fed2..65d2df0401dd62 100644 --- a/examples/all-clusters-app/nxp/mw320/BUILD.gn +++ b/examples/all-clusters-app/nxp/mw320/BUILD.gn @@ -88,6 +88,7 @@ mw320_executable("shell_mw320") { "${chip_root}/examples/all-clusters-app/all-clusters-common/src/static-supported-temperature-levels.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementManager.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/src/ElectricalPowerMeasurementDelegate.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp", "${chip_root}/src/lib/shell/streamer_mw320.cpp", diff --git a/examples/all-clusters-app/nxp/mw320/binding-handler.cpp b/examples/all-clusters-app/nxp/mw320/binding-handler.cpp index 6ad25c9d46bc34..ace7da026b253a 100644 --- a/examples/all-clusters-app/nxp/mw320/binding-handler.cpp +++ b/examples/all-clusters-app/nxp/mw320/binding-handler.cpp @@ -74,13 +74,13 @@ static void BoundDeviceChangedHandler(const EmberBindingTableEntry & binding, ch using namespace chip; using namespace chip::app; - if (binding.type == EMBER_MULTICAST_BINDING) + if (binding.type == MATTER_MULTICAST_BINDING) { ChipLogError(NotSpecified, "Group binding is not supported now"); return; } - if (binding.type == EMBER_UNICAST_BINDING && binding.local == 1 && + if (binding.type == MATTER_UNICAST_BINDING && binding.local == 1 && (!binding.clusterId.HasValue() || binding.clusterId.Value() == Clusters::OnOff::Id)) { auto onSuccess = [](const ConcreteCommandPath & commandPath, const StatusIB & status, const auto & dataResponse) { diff --git a/examples/all-clusters-app/nxp/mw320/main.cpp b/examples/all-clusters-app/nxp/mw320/main.cpp index b778d95fc4430b..5f2df7b501e88d 100644 --- a/examples/all-clusters-app/nxp/mw320/main.cpp +++ b/examples/all-clusters-app/nxp/mw320/main.cpp @@ -286,7 +286,7 @@ void GPIO_IRQHandler(void) #endif /* __cplusplus */ /* -EmberAfStatus emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, +Protocols::InteractionModel::Status emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, EmberAfAttributeMetadata * attributeMetadata, uint16_t manufacturerCode, uint8_t * buffer, uint16_t maxReadLength, int32_t index) { @@ -295,7 +295,7 @@ EmberAfStatus emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterI if(clusterId == Clusters::Switch::Id) { *buffer = g_ButtonPress; } - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } */ @@ -1616,20 +1616,21 @@ void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & return; } -EmberAfStatus emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer) +Protocols::InteractionModel::Status emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer) { PRINTF("====> %s() \r\n", __FUNCTION__); - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } -EmberAfStatus emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, - uint16_t maxReadLength) +Protocols::InteractionModel::Status emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer, uint16_t maxReadLength) { // Added for the pairing of TE9 to report the commission_info // default function (in callback-stub.cpp) // PRINTF("-> %s()\n\r", __FUNCTION__); - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } diff --git a/examples/all-clusters-app/openiotsdk/CMakeLists.txt b/examples/all-clusters-app/openiotsdk/CMakeLists.txt index 3b50f286b1683b..6d2fb76c0db919 100644 --- a/examples/all-clusters-app/openiotsdk/CMakeLists.txt +++ b/examples/all-clusters-app/openiotsdk/CMakeLists.txt @@ -65,6 +65,7 @@ target_sources(${APP_TARGET} ${ALL_CLUSTERS_COMMON}/src/resource-monitoring-delegates.cpp ${ALL_CLUSTERS_COMMON}/src/static-supported-modes-manager.cpp ${ALL_CLUSTERS_COMMON}/src/binding-handler.cpp + ${ENERGY_MANAGEMENT_COMMON}/src/ElectricalPowerMeasurementDelegate.cpp ${ENERGY_MANAGEMENT_COMMON}/src/EnergyEvseDelegateImpl.cpp ${ENERGY_MANAGEMENT_COMMON}/src/EnergyEvseManager.cpp ${ENERGY_MANAGEMENT_COMMON}/src/DeviceEnergyManagementDelegateImpl.cpp diff --git a/examples/all-clusters-app/telink/CMakeLists.txt b/examples/all-clusters-app/telink/CMakeLists.txt index ae715a8c41ebfb..2c59e658a7e6dc 100644 --- a/examples/all-clusters-app/telink/CMakeLists.txt +++ b/examples/all-clusters-app/telink/CMakeLists.txt @@ -85,6 +85,7 @@ target_sources(app PRIVATE ${ALL_CLUSTERS_COMMON_DIR}/src/device-energy-management-stub.cpp ${ALL_CLUSTERS_COMMON_DIR}/src/energy-evse-stub.cpp ${ALL_CLUSTERS_COMMON_DIR}/src/resource-monitoring-delegates.cpp + ${ENERGY_MANAGEMENT_COMMON_DIR}/src/ElectricalPowerMeasurementDelegate.cpp ${ENERGY_MANAGEMENT_COMMON_DIR}/src/EnergyEvseDelegateImpl.cpp ${ENERGY_MANAGEMENT_COMMON_DIR}/src/EnergyEvseManager.cpp ${ENERGY_MANAGEMENT_COMMON_DIR}/src/DeviceEnergyManagementDelegateImpl.cpp diff --git a/examples/all-clusters-app/telink/src/ZclDoorLockCallbacks.cpp b/examples/all-clusters-app/telink/src/ZclDoorLockCallbacks.cpp index 2d3a6e4e32f270..eaf2bda516f23e 100644 --- a/examples/all-clusters-app/telink/src/ZclDoorLockCallbacks.cpp +++ b/examples/all-clusters-app/telink/src/ZclDoorLockCallbacks.cpp @@ -55,9 +55,9 @@ void emberAfDoorLockClusterInitCallback(EndpointId endpoint) // Set FeatureMap to 0, default is: // (kUser|kAccessSchedules|kRfidCredential|kPinCredential) 0x113 - EmberAfStatus status = DoorLock::Attributes::FeatureMap::Set(endpoint, 0); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Protocols::InteractionModel::Status status = DoorLock::Attributes::FeatureMap::Set(endpoint, 0); + if (status != Protocols::InteractionModel::Status::Success) { - LOG_ERR("Updating feature map %x", status); + LOG_ERR("Updating feature map %x", to_underlying(status)); } } diff --git a/examples/all-clusters-app/tizen/BUILD.gn b/examples/all-clusters-app/tizen/BUILD.gn index 6387c6446aced8..364e9ce857d5da 100644 --- a/examples/all-clusters-app/tizen/BUILD.gn +++ b/examples/all-clusters-app/tizen/BUILD.gn @@ -40,6 +40,7 @@ source_set("chip-all-clusters-common") { "${chip_root}/examples/all-clusters-app/all-clusters-common/src/static-supported-temperature-levels.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementManager.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/src/ElectricalPowerMeasurementDelegate.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp", ] diff --git a/examples/all-clusters-minimal-app/asr/src/AppTask.cpp b/examples/all-clusters-minimal-app/asr/src/AppTask.cpp index ac9dfe7ba5d8d0..d6f77d2f28a836 100644 --- a/examples/all-clusters-minimal-app/asr/src/AppTask.cpp +++ b/examples/all-clusters-minimal-app/asr/src/AppTask.cpp @@ -221,11 +221,11 @@ void AppTask::OnOffUpdateClusterState(void) uint8_t onoff = sLightLED.Get(); // write the new on/off value - EmberAfStatus status = app::Clusters::OnOff::Attributes::OnOff::Set(2, onoff); + Protocols::InteractionModel::Status status = app::Clusters::OnOff::Attributes::OnOff::Set(2, onoff); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ASR_LOG("ERR: updating on/off %x", status); + ASR_LOG("ERR: updating on/off %x", to_underlying(status)); } } diff --git a/examples/all-clusters-minimal-app/infineon/psoc6/src/AppTask.cpp b/examples/all-clusters-minimal-app/infineon/psoc6/src/AppTask.cpp index 3fcbc365fbc426..7cbaf6f447d405 100644 --- a/examples/all-clusters-minimal-app/infineon/psoc6/src/AppTask.cpp +++ b/examples/all-clusters-minimal-app/infineon/psoc6/src/AppTask.cpp @@ -406,11 +406,11 @@ void AppTask::OnOffUpdateClusterState(intptr_t context) uint8_t onoff = sLightLED.Get(); // write the new on/off value - EmberAfStatus status = app::Clusters::OnOff::Attributes::OnOff::Set(2, onoff); + Protocols::InteractionModel::Status status = app::Clusters::OnOff::Attributes::OnOff::Set(2, onoff); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - P6_LOG("ERR: updating on/off %x", status); + P6_LOG("ERR: updating on/off %x", to_underlying(status)); } } diff --git a/examples/bridge-app/asr/subdevice/SubDeviceManager.cpp b/examples/bridge-app/asr/subdevice/SubDeviceManager.cpp index 72fbcc663d8582..ab0f2ef3b707a1 100644 --- a/examples/bridge-app/asr/subdevice/SubDeviceManager.cpp +++ b/examples/bridge-app/asr/subdevice/SubDeviceManager.cpp @@ -103,8 +103,8 @@ CHIP_ERROR RemoveDeviceEndpoint(SubDevice * dev) return CHIP_ERROR_INTERNAL; } -EmberAfStatus HandleReadBridgedDeviceBasicAttribute(SubDevice * dev, chip::AttributeId attributeId, uint8_t * buffer, - uint16_t maxReadLength) +Protocols::InteractionModel::Status HandleReadBridgedDeviceBasicAttribute(SubDevice * dev, chip::AttributeId attributeId, + uint8_t * buffer, uint16_t maxReadLength) { using namespace BridgedDeviceBasicInformation::Attributes; ChipLogProgress(DeviceLayer, "HandleReadBridgedDeviceBasicAttribute: attrId=%" PRIu32 ", maxReadLength=%u", attributeId, @@ -125,13 +125,14 @@ EmberAfStatus HandleReadBridgedDeviceBasicAttribute(SubDevice * dev, chip::Attri } else { - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } -EmberAfStatus HandleReadOnOffAttribute(SubDevice * dev, chip::AttributeId attributeId, uint8_t * buffer, uint16_t maxReadLength) +Protocols::InteractionModel::Status HandleReadOnOffAttribute(SubDevice * dev, chip::AttributeId attributeId, uint8_t * buffer, + uint16_t maxReadLength) { ChipLogProgress(DeviceLayer, "HandleReadOnOffAttribute: attrId=%" PRIu32 ", maxReadLength=%u", attributeId, maxReadLength); @@ -145,24 +146,25 @@ EmberAfStatus HandleReadOnOffAttribute(SubDevice * dev, chip::AttributeId attrib } else { - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } -EmberAfStatus HandleWriteOnOffAttribute(SubDevice * dev, chip::AttributeId attributeId, uint8_t * buffer) +Protocols::InteractionModel::Status HandleWriteOnOffAttribute(SubDevice * dev, chip::AttributeId attributeId, uint8_t * buffer) { ChipLogProgress(DeviceLayer, "HandleWriteOnOffAttribute: attrId=%" PRIu32, attributeId); - ReturnErrorCodeIf((attributeId != OnOff::Attributes::OnOff::Id) || (!dev->IsReachable()), EMBER_ZCL_STATUS_FAILURE); + ReturnErrorCodeIf((attributeId != OnOff::Attributes::OnOff::Id) || (!dev->IsReachable()), + Protocols::InteractionModel::Status::Failure); dev->SetOnOff(*buffer == 1); - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } -EmberAfStatus emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, - uint16_t maxReadLength) +Protocols::InteractionModel::Status emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer, uint16_t maxReadLength) { uint16_t endpointIndex = emberAfGetDynamicIndexFromEndpoint(endpoint); @@ -181,11 +183,12 @@ EmberAfStatus emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterI } } - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } -EmberAfStatus emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer) +Protocols::InteractionModel::Status emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer) { uint16_t endpointIndex = emberAfGetDynamicIndexFromEndpoint(endpoint); @@ -199,7 +202,7 @@ EmberAfStatus emberAfExternalAttributeWriteCallback(EndpointId endpoint, Cluster } } - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } namespace { diff --git a/examples/bridge-app/asr/subdevice/SubDeviceManager.h b/examples/bridge-app/asr/subdevice/SubDeviceManager.h index 3a91527f33e99c..29ce5067fe7faf 100644 --- a/examples/bridge-app/asr/subdevice/SubDeviceManager.h +++ b/examples/bridge-app/asr/subdevice/SubDeviceManager.h @@ -68,8 +68,8 @@ extern "C" { int AddDeviceEndpoint(SubDevice * dev, EmberAfEndpointType * ep, const Span & deviceTypeList, const Span & dataVersionStorage, chip::EndpointId parentEndpointId); CHIP_ERROR RemoveDeviceEndpoint(SubDevice * dev); -EmberAfStatus HandleReadBridgedDeviceBasicAttribute(SubDevice * dev, chip::AttributeId attributeId, uint8_t * buffer, - uint16_t maxReadLength); +Protocols::InteractionModel::Status HandleReadBridgedDeviceBasicAttribute(SubDevice * dev, chip::AttributeId attributeId, + uint8_t * buffer, uint16_t maxReadLength); void HandleDeviceStatusChanged(SubDevice * dev, SubDevice::Changed_t itemChangedMask); void Init_Bridge_Endpoint(); #ifdef __cplusplus diff --git a/examples/bridge-app/esp32/main/main.cpp b/examples/bridge-app/esp32/main/main.cpp index 92298a488c3186..27cdb3c5e2dab5 100644 --- a/examples/bridge-app/esp32/main/main.cpp +++ b/examples/bridge-app/esp32/main/main.cpp @@ -213,8 +213,8 @@ CHIP_ERROR RemoveDeviceEndpoint(Device * dev) return CHIP_ERROR_INTERNAL; } -EmberAfStatus HandleReadBridgedDeviceBasicAttribute(Device * dev, chip::AttributeId attributeId, uint8_t * buffer, - uint16_t maxReadLength) +Protocols::InteractionModel::Status HandleReadBridgedDeviceBasicAttribute(Device * dev, chip::AttributeId attributeId, + uint8_t * buffer, uint16_t maxReadLength) { using namespace BridgedDeviceBasicInformation::Attributes; ChipLogProgress(DeviceLayer, "HandleReadBridgedDeviceBasicAttribute: attrId=%" PRIu32 ", maxReadLength=%u", attributeId, @@ -236,13 +236,14 @@ EmberAfStatus HandleReadBridgedDeviceBasicAttribute(Device * dev, chip::Attribut } else { - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } -EmberAfStatus HandleReadOnOffAttribute(Device * dev, chip::AttributeId attributeId, uint8_t * buffer, uint16_t maxReadLength) +Protocols::InteractionModel::Status HandleReadOnOffAttribute(Device * dev, chip::AttributeId attributeId, uint8_t * buffer, + uint16_t maxReadLength) { ChipLogProgress(DeviceLayer, "HandleReadOnOffAttribute: attrId=%" PRIu32 ", maxReadLength=%u", attributeId, maxReadLength); @@ -257,24 +258,25 @@ EmberAfStatus HandleReadOnOffAttribute(Device * dev, chip::AttributeId attribute } else { - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } -EmberAfStatus HandleWriteOnOffAttribute(Device * dev, chip::AttributeId attributeId, uint8_t * buffer) +Protocols::InteractionModel::Status HandleWriteOnOffAttribute(Device * dev, chip::AttributeId attributeId, uint8_t * buffer) { ChipLogProgress(DeviceLayer, "HandleWriteOnOffAttribute: attrId=%" PRIu32, attributeId); - ReturnErrorCodeIf((attributeId != OnOff::Attributes::OnOff::Id) || (!dev->IsReachable()), EMBER_ZCL_STATUS_FAILURE); + ReturnErrorCodeIf((attributeId != OnOff::Attributes::OnOff::Id) || (!dev->IsReachable()), + Protocols::InteractionModel::Status::Failure); dev->SetOnOff(*buffer == 1); - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } -EmberAfStatus emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, - uint16_t maxReadLength) +Protocols::InteractionModel::Status emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer, uint16_t maxReadLength) { uint16_t endpointIndex = emberAfGetDynamicIndexFromEndpoint(endpoint); @@ -292,11 +294,12 @@ EmberAfStatus emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterI } } - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } -EmberAfStatus emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer) +Protocols::InteractionModel::Status emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer) { uint16_t endpointIndex = emberAfGetDynamicIndexFromEndpoint(endpoint); @@ -310,7 +313,7 @@ EmberAfStatus emberAfExternalAttributeWriteCallback(EndpointId endpoint, Cluster } } - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } namespace { diff --git a/examples/bridge-app/linux/main.cpp b/examples/bridge-app/linux/main.cpp index 2c825fe8e5e010..80c8b17b7fbed5 100644 --- a/examples/bridge-app/linux/main.cpp +++ b/examples/bridge-app/linux/main.cpp @@ -436,8 +436,8 @@ void HandleDeviceTempSensorStatusChanged(DeviceTempSensor * dev, DeviceTempSenso } } -EmberAfStatus HandleReadBridgedDeviceBasicAttribute(Device * dev, chip::AttributeId attributeId, uint8_t * buffer, - uint16_t maxReadLength) +Protocols::InteractionModel::Status HandleReadBridgedDeviceBasicAttribute(Device * dev, chip::AttributeId attributeId, + uint8_t * buffer, uint16_t maxReadLength) { using namespace BridgedDeviceBasicInformation::Attributes; @@ -464,13 +464,14 @@ EmberAfStatus HandleReadBridgedDeviceBasicAttribute(Device * dev, chip::Attribut } else { - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } -EmberAfStatus HandleReadOnOffAttribute(DeviceOnOff * dev, chip::AttributeId attributeId, uint8_t * buffer, uint16_t maxReadLength) +Protocols::InteractionModel::Status HandleReadOnOffAttribute(DeviceOnOff * dev, chip::AttributeId attributeId, uint8_t * buffer, + uint16_t maxReadLength) { ChipLogProgress(DeviceLayer, "HandleReadOnOffAttribute: attrId=%d, maxReadLength=%d", attributeId, maxReadLength); @@ -485,13 +486,13 @@ EmberAfStatus HandleReadOnOffAttribute(DeviceOnOff * dev, chip::AttributeId attr } else { - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } -EmberAfStatus HandleWriteOnOffAttribute(DeviceOnOff * dev, chip::AttributeId attributeId, uint8_t * buffer) +Protocols::InteractionModel::Status HandleWriteOnOffAttribute(DeviceOnOff * dev, chip::AttributeId attributeId, uint8_t * buffer) { ChipLogProgress(DeviceLayer, "HandleWriteOnOffAttribute: attrId=%d", attributeId); @@ -508,14 +509,14 @@ EmberAfStatus HandleWriteOnOffAttribute(DeviceOnOff * dev, chip::AttributeId att } else { - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } -EmberAfStatus HandleReadTempMeasurementAttribute(DeviceTempSensor * dev, chip::AttributeId attributeId, uint8_t * buffer, - uint16_t maxReadLength) +Protocols::InteractionModel::Status HandleReadTempMeasurementAttribute(DeviceTempSensor * dev, chip::AttributeId attributeId, + uint8_t * buffer, uint16_t maxReadLength) { using namespace TemperatureMeasurement::Attributes; @@ -546,19 +547,19 @@ EmberAfStatus HandleReadTempMeasurementAttribute(DeviceTempSensor * dev, chip::A } else { - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } -EmberAfStatus emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, - uint16_t maxReadLength) +Protocols::InteractionModel::Status emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer, uint16_t maxReadLength) { uint16_t endpointIndex = emberAfGetDynamicIndexFromEndpoint(endpoint); - EmberAfStatus ret = EMBER_ZCL_STATUS_FAILURE; + Protocols::InteractionModel::Status ret = Protocols::InteractionModel::Status::Failure; if ((endpointIndex < CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT) && (gDevices[endpointIndex] != nullptr)) { @@ -643,12 +644,13 @@ class BridgedPowerSourceAttrAccess : public AttributeAccessInterface BridgedPowerSourceAttrAccess gPowerAttrAccess; -EmberAfStatus emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer) +Protocols::InteractionModel::Status emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer) { uint16_t endpointIndex = emberAfGetDynamicIndexFromEndpoint(endpoint); - EmberAfStatus ret = EMBER_ZCL_STATUS_FAILURE; + Protocols::InteractionModel::Status ret = Protocols::InteractionModel::Status::Failure; // ChipLogProgress(DeviceLayer, "emberAfExternalAttributeWriteCallback: ep=%d", endpoint); diff --git a/examples/bridge-app/telink/src/AppTask.cpp b/examples/bridge-app/telink/src/AppTask.cpp index 3b4066bd87c2c7..d21897bd2d36b6 100644 --- a/examples/bridge-app/telink/src/AppTask.cpp +++ b/examples/bridge-app/telink/src/AppTask.cpp @@ -36,8 +36,8 @@ int AddDeviceEndpoint(Device * dev, EmberAfEndpointType * ep, const Span & dataVersionStorage, chip::EndpointId parentEndpointId); CHIP_ERROR RemoveDeviceEndpoint(Device * dev); void HandleDeviceTempSensorStatusChanged(DeviceTempSensor * dev, DeviceTempSensor::Changed_t itemChangedMask); -EmberAfStatus HandleReadTempMeasurementAttribute(DeviceTempSensor * dev, chip::AttributeId attributeId, uint8_t * buffer, - uint16_t maxReadLength); +Protocols::InteractionModel::Status HandleReadTempMeasurementAttribute(DeviceTempSensor * dev, chip::AttributeId attributeId, + uint8_t * buffer, uint16_t maxReadLength); static const int kNodeLabelSize = 32; // Current ZCL implementation of Struct uses a max-size array of 254 bytes @@ -236,8 +236,8 @@ CHIP_ERROR RemoveDeviceEndpoint(Device * dev) return CHIP_ERROR_INTERNAL; } -EmberAfStatus HandleReadBridgedDeviceBasicAttribute(Device * dev, chip::AttributeId attributeId, uint8_t * buffer, - uint16_t maxReadLength) +Protocols::InteractionModel::Status HandleReadBridgedDeviceBasicAttribute(Device * dev, chip::AttributeId attributeId, + uint8_t * buffer, uint16_t maxReadLength) { using namespace chip::app::Clusters::BridgedDeviceBasicInformation::Attributes; ChipLogProgress(DeviceLayer, "HandleReadBridgedDeviceBasicAttribute: attrId=%" PRIu32 ", maxReadLength=%u", attributeId, @@ -264,13 +264,14 @@ EmberAfStatus HandleReadBridgedDeviceBasicAttribute(Device * dev, chip::Attribut } else { - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } -EmberAfStatus HandleReadOnOffAttribute(Device * dev, chip::AttributeId attributeId, uint8_t * buffer, uint16_t maxReadLength) +Protocols::InteractionModel::Status HandleReadOnOffAttribute(Device * dev, chip::AttributeId attributeId, uint8_t * buffer, + uint16_t maxReadLength) { ChipLogProgress(DeviceLayer, "HandleReadOnOffAttribute: attrId=%" PRIu32 ", maxReadLength=%u", attributeId, maxReadLength); @@ -285,24 +286,25 @@ EmberAfStatus HandleReadOnOffAttribute(Device * dev, chip::AttributeId attribute } else { - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } -EmberAfStatus HandleWriteOnOffAttribute(Device * dev, chip::AttributeId attributeId, uint8_t * buffer) +Protocols::InteractionModel::Status HandleWriteOnOffAttribute(Device * dev, chip::AttributeId attributeId, uint8_t * buffer) { ChipLogProgress(DeviceLayer, "HandleWriteOnOffAttribute: attrId=%" PRIu32, attributeId); - ReturnErrorCodeIf((attributeId != Clusters::OnOff::Attributes::OnOff::Id) || (!dev->IsReachable()), EMBER_ZCL_STATUS_FAILURE); + ReturnErrorCodeIf((attributeId != Clusters::OnOff::Attributes::OnOff::Id) || (!dev->IsReachable()), + Protocols::InteractionModel::Status::Failure); dev->SetOnOff(*buffer == 1); - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } -EmberAfStatus emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, - uint16_t maxReadLength) +Protocols::InteractionModel::Status emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer, uint16_t maxReadLength) { using namespace Clusters; @@ -327,11 +329,12 @@ EmberAfStatus emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterI } } - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } -EmberAfStatus emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer) +Protocols::InteractionModel::Status emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer) { uint16_t endpointIndex = emberAfGetDynamicIndexFromEndpoint(endpoint); @@ -345,7 +348,7 @@ EmberAfStatus emberAfExternalAttributeWriteCallback(EndpointId endpoint, Cluster } } - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } namespace { @@ -488,8 +491,8 @@ void HandleDeviceTempSensorStatusChanged(DeviceTempSensor * dev, DeviceTempSenso } } -EmberAfStatus HandleReadTempMeasurementAttribute(DeviceTempSensor * dev, chip::AttributeId attributeId, uint8_t * buffer, - uint16_t maxReadLength) +Protocols::InteractionModel::Status HandleReadTempMeasurementAttribute(DeviceTempSensor * dev, chip::AttributeId attributeId, + uint8_t * buffer, uint16_t maxReadLength) { using namespace Clusters::TemperatureMeasurement::Attributes; @@ -520,10 +523,10 @@ EmberAfStatus HandleReadTempMeasurementAttribute(DeviceTempSensor * dev, chip::A } else { - return EMBER_ZCL_STATUS_FAILURE; + return Protocols::InteractionModel::Status::Failure; } - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } void AppTask::LightingActionEventHandler(AppEvent * aEvent) @@ -590,16 +593,16 @@ void AppTask::UpdateClusterState(void) bool isTurnedOn = sAppTask.mPwmRgbBlueLed.IsTurnedOn(); // write the new on/off value - EmberAfStatus status = Clusters::OnOff::Attributes::OnOff::Set(kExampleEndpointId, isTurnedOn); + Protocols::InteractionModel::Status status = Clusters::OnOff::Attributes::OnOff::Set(kExampleEndpointId, isTurnedOn); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - LOG_ERR("Update OnOff fail: %x", status); + LOG_ERR("Update OnOff fail: %x", to_underlying(status)); } uint8_t setLevel = sAppTask.mPwmRgbBlueLed.GetLevel(); status = Clusters::LevelControl::Attributes::CurrentLevel::Set(kExampleEndpointId, setLevel); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - LOG_ERR("Update CurrentLevel fail: %x", status); + LOG_ERR("Update CurrentLevel fail: %x", to_underlying(status)); } } diff --git a/examples/bridge-app/telink/src/ZclCallbacks.cpp b/examples/bridge-app/telink/src/ZclCallbacks.cpp index b6f5ed558c584e..e83993165acb51 100644 --- a/examples/bridge-app/telink/src/ZclCallbacks.cpp +++ b/examples/bridge-app/telink/src/ZclCallbacks.cpp @@ -43,12 +43,12 @@ using namespace chip::app::Clusters::OnOff; */ void emberAfOnOffClusterInitCallback(EndpointId endpoint) { - EmberAfStatus status; + Protocols::InteractionModel::Status status; bool storedValue; // Read storedValue on/off value status = Attributes::OnOff::Get(1, &storedValue); - if (status == EMBER_ZCL_STATUS_SUCCESS) + if (status == Protocols::InteractionModel::Status::Success) { // Set actual state to stored before reboot GetAppTask().GetPWMDevice().Set(storedValue); diff --git a/examples/chef/chef.py b/examples/chef/chef.py index 47d3c7ad3d34b7..688bdfef490761 100755 --- a/examples/chef/chef.py +++ b/examples/chef/chef.py @@ -730,7 +730,7 @@ def main() -> int: shell.run_cmd(" ".join(nrf_build_cmds)) elif options.build_target == "silabs-thread": - shell.run_cmd(f"cd {_CHEF_SCRIPT_PATH}/efr32") + shell.run_cmd(f"cd {_CHEF_SCRIPT_PATH}/silabs") if options.do_clean: shell.run_cmd(f"rm -rf out/{options.sample_device_type_name}") efr32_cmd_args = [] diff --git a/examples/chef/common/chef-air-quality.cpp b/examples/chef/common/chef-air-quality.cpp index 0770d0c185aa0c..eafff42d538fb6 100644 --- a/examples/chef/common/chef-air-quality.cpp +++ b/examples/chef/common/chef-air-quality.cpp @@ -40,15 +40,16 @@ void emberAfAirQualityClusterInitCallback(chip::EndpointId endpointId) gAirQualityClusterInstance[endpointId] = clusterInstance; } -EmberAfStatus chefAirQualityWriteCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer) +Protocols::InteractionModel::Status chefAirQualityWriteCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer) { - EmberAfStatus ret = EMBER_ZCL_STATUS_SUCCESS; + Protocols::InteractionModel::Status ret = Protocols::InteractionModel::Status::Success; if (gAirQualityClusterInstance.find(endpoint) == gAirQualityClusterInstance.end()) { ChipLogError(DeviceLayer, "Invalid Endpoind ID: %d", endpoint); - return EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT; + return Protocols::InteractionModel::Status::UnsupportedEndpoint; } Instance * clusterInstance = gAirQualityClusterInstance[endpoint]; @@ -63,12 +64,12 @@ EmberAfStatus chefAirQualityWriteCallback(EndpointId endpoint, ClusterId cluster { break; } - ret = EMBER_ZCL_STATUS_UNSUPPORTED_WRITE; + ret = Protocols::InteractionModel::Status::UnsupportedWrite; ChipLogError(DeviceLayer, "Invalid Attribute Update status: %d", static_cast(status)); } break; default: - ret = EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE; + ret = Protocols::InteractionModel::Status::UnsupportedAttribute; ChipLogError(DeviceLayer, "Unsupported Attribute ID: %d", static_cast(attributeId)); break; } @@ -76,11 +77,11 @@ EmberAfStatus chefAirQualityWriteCallback(EndpointId endpoint, ClusterId cluster return ret; } -EmberAfStatus chefAirQualityReadCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, - uint16_t maxReadLength) +Protocols::InteractionModel::Status chefAirQualityReadCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, + uint16_t maxReadLength) { - EmberAfStatus ret = EMBER_ZCL_STATUS_SUCCESS; + Protocols::InteractionModel::Status ret = Protocols::InteractionModel::Status::Success; return ret; } diff --git a/examples/chef/common/chef-air-quality.h b/examples/chef/common/chef-air-quality.h index 39019b03fbb781..2eaf3ef28fdf66 100644 --- a/examples/chef/common/chef-air-quality.h +++ b/examples/chef/common/chef-air-quality.h @@ -22,9 +22,10 @@ #include #ifdef MATTER_DM_PLUGIN_AIR_QUALITY_SERVER -EmberAfStatus chefAirQualityWriteCallback(chip::EndpointId endpoint, chip::ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer); -EmberAfStatus chefAirQualityReadCallback(chip::EndpointId endpoint, chip::ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, - uint16_t maxReadLength); +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); #endif diff --git a/examples/chef/common/chef-concentration-measurement.cpp b/examples/chef/common/chef-concentration-measurement.cpp index 395d6604582edf..2d8b65ba2cad19 100644 --- a/examples/chef/common/chef-concentration-measurement.cpp +++ b/examples/chef/common/chef-concentration-measurement.cpp @@ -55,19 +55,19 @@ static std::map *> template -EmberAfStatus chefConcentrationMeasurementWriteCallback( +Protocols::InteractionModel::Status chefConcentrationMeasurementWriteCallback( std::map *> & map, AttributeId measuredValueId, chip::EndpointId endpoint, chip::ClusterId clusterId, const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer) { - EmberAfStatus ret = EMBER_ZCL_STATUS_SUCCESS; + Protocols::InteractionModel::Status ret = Protocols::InteractionModel::Status::Success; if (map.find(endpoint) == map.end()) { ChipLogError(DeviceLayer, "Invalid Endpoind ID: %d", endpoint); - return EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT; + return Protocols::InteractionModel::Status::UnsupportedEndpoint; } Instance(attributeId)); } return ret; } -EmberAfStatus chefConcentrationMeasurementWriteCallback(chip::EndpointId endpoint, chip::ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer) +Protocols::InteractionModel::Status chefConcentrationMeasurementWriteCallback(chip::EndpointId endpoint, chip::ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer) { - EmberAfStatus ret = EMBER_ZCL_STATUS_SUCCESS; + Protocols::InteractionModel::Status ret = Protocols::InteractionModel::Status::Success; switch (clusterId) { @@ -174,11 +175,11 @@ EmberAfStatus chefConcentrationMeasurementWriteCallback(chip::EndpointId endpoin return ret; } -EmberAfStatus chefConcentrationMeasurementReadCallback(chip::EndpointId endpoint, chip::ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, - uint16_t maxReadLength) +Protocols::InteractionModel::Status chefConcentrationMeasurementReadCallback(chip::EndpointId endpoint, chip::ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer, uint16_t maxReadLength) { - EmberAfStatus ret = EMBER_ZCL_STATUS_SUCCESS; + Protocols::InteractionModel::Status ret = Protocols::InteractionModel::Status::Success; return ret; } diff --git a/examples/chef/common/chef-concentration-measurement.h b/examples/chef/common/chef-concentration-measurement.h index ddd004ebd7047e..9b8fc571872c6b 100644 --- a/examples/chef/common/chef-concentration-measurement.h +++ b/examples/chef/common/chef-concentration-measurement.h @@ -31,9 +31,10 @@ 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) -EmberAfStatus chefConcentrationMeasurementWriteCallback(chip::EndpointId endpoint, chip::ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer); -EmberAfStatus chefConcentrationMeasurementReadCallback(chip::EndpointId endpoint, chip::ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, - uint16_t maxReadLength); +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); #endif diff --git a/examples/chef/common/chef-fan-control-manager.cpp b/examples/chef/common/chef-fan-control-manager.cpp index 56576febd693d4..998491d4a61aeb 100644 --- a/examples/chef/common/chef-fan-control-manager.cpp +++ b/examples/chef/common/chef-fan-control-manager.cpp @@ -22,7 +22,6 @@ #include #include #include -#include #include #include @@ -57,9 +56,9 @@ CHIP_ERROR ChefFanControlManager::ReadPercentCurrent(AttributeValueEncoder & aEn { // Return PercentSetting attribute value for now DataModel::Nullable percentSetting; - EmberAfStatus status = PercentSetting::Get(mEndpoint, percentSetting); + Protocols::InteractionModel::Status status = PercentSetting::Get(mEndpoint, percentSetting); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == status, CHIP_ERROR_READ_FAILED); + VerifyOrReturnError(Protocols::InteractionModel::Status::Success == status, CHIP_ERROR_READ_FAILED); return aEncoder.Encode(percentSetting.ValueOr(0)); } @@ -68,9 +67,9 @@ CHIP_ERROR ChefFanControlManager::ReadSpeedCurrent(AttributeValueEncoder & aEnco { // Return SpeedCurrent attribute value for now DataModel::Nullable speedSetting; - EmberAfStatus status = SpeedSetting::Get(mEndpoint, speedSetting); + Protocols::InteractionModel::Status status = SpeedSetting::Get(mEndpoint, speedSetting); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == status, CHIP_ERROR_READ_FAILED); + VerifyOrReturnError(Protocols::InteractionModel::Status::Success == status, CHIP_ERROR_READ_FAILED); return aEncoder.Encode(speedSetting.ValueOr(0)); } @@ -82,19 +81,19 @@ Status ChefFanControlManager::HandleStep(StepDirectionEnum aDirection, bool aWra VerifyOrReturnError(aDirection != StepDirectionEnum::kUnknownEnumValue, Status::InvalidCommand); - EmberAfStatus status; + Protocols::InteractionModel::Status status; uint8_t speedMax; status = SpeedMax::Get(mEndpoint, &speedMax); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == status, Status::InvalidCommand); + VerifyOrReturnError(Protocols::InteractionModel::Status::Success == status, Status::InvalidCommand); uint8_t speedCurrent; status = SpeedCurrent::Get(mEndpoint, &speedCurrent); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == status, Status::InvalidCommand); + VerifyOrReturnError(Protocols::InteractionModel::Status::Success == status, Status::InvalidCommand); DataModel::Nullable speedSetting; status = SpeedSetting::Get(mEndpoint, speedSetting); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == status, Status::InvalidCommand); + VerifyOrReturnError(Protocols::InteractionModel::Status::Success == status, Status::InvalidCommand); uint8_t newSpeedSetting = speedSetting.ValueOr(0); uint8_t speedValue = speedSetting.ValueOr(speedCurrent); @@ -115,7 +114,7 @@ Status ChefFanControlManager::HandleStep(StepDirectionEnum aDirection, bool aWra }); } - return ToInteractionModelStatus(SpeedSetting::Set(mEndpoint, newSpeedSetting)); + return SpeedSetting::Set(mEndpoint, newSpeedSetting); } CHIP_ERROR ChefFanControlManager::Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) diff --git a/examples/chef/common/chef-rvc-operational-state-delegate.h b/examples/chef/common/chef-rvc-operational-state-delegate.h index c8d63c2bb6efc2..f487e38000771d 100644 --- a/examples/chef/common/chef-rvc-operational-state-delegate.h +++ b/examples/chef/common/chef-rvc-operational-state-delegate.h @@ -20,7 +20,7 @@ #include #include -#include + #include namespace chip { diff --git a/examples/chef/common/stubs.cpp b/examples/chef/common/stubs.cpp index 483919c1c9a952..cff7ffdee4679f 100644 --- a/examples/chef/common/stubs.cpp +++ b/examples/chef/common/stubs.cpp @@ -23,9 +23,9 @@ using chip::app::DataModel::Nullable; using namespace chip; -EmberAfStatus emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, - uint16_t maxReadLength) +Protocols::InteractionModel::Status emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer, uint16_t maxReadLength) { switch (clusterId) { @@ -58,7 +58,7 @@ EmberAfStatus emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterI default: break; } - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } /* @@ -71,8 +71,9 @@ Thread 3 "rootnode_airqua" hit Breakpoint 1, emberAfExternalAttributeWriteCallba 48 '0', mask = 16 '\020'} (gdb) */ -EmberAfStatus emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer) +Protocols::InteractionModel::Status emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer) { switch (clusterId) { @@ -105,7 +106,7 @@ EmberAfStatus emberAfExternalAttributeWriteCallback(EndpointId endpoint, Cluster default: break; } - return EMBER_ZCL_STATUS_SUCCESS; + return Protocols::InteractionModel::Status::Success; } // Include door lock callbacks only when the server is enabled diff --git a/examples/chip-tool/py_matter_chip_tool_adapter/matter_chip_tool_adapter/encoder.py b/examples/chip-tool/py_matter_chip_tool_adapter/matter_chip_tool_adapter/encoder.py index 355a2b18433e31..f4e8e6711d7105 100644 --- a/examples/chip-tool/py_matter_chip_tool_adapter/matter_chip_tool_adapter/encoder.py +++ b/examples/chip-tool/py_matter_chip_tool_adapter/matter_chip_tool_adapter/encoder.py @@ -148,6 +148,17 @@ } }, + 'Bdx': { + 'commands': { + 'Download': { + 'arguments': { + 'LogType': 'log-type', + }, + 'has_endpoint': False, + } + } + }, + 'DelayCommands': { 'alias': 'delay', 'commands': { diff --git a/examples/common/imgui_ui/windows/light.cpp b/examples/common/imgui_ui/windows/light.cpp index 24f88212ae23a1..86899e044b2ed1 100644 --- a/examples/common/imgui_ui/windows/light.cpp +++ b/examples/common/imgui_ui/windows/light.cpp @@ -70,13 +70,13 @@ void Light::UpdateState() { if (mTargetLightIsOn.HasValue()) { - EmberAfStatus status = OnOffServer::Instance().setOnOffValue( + chip::Protocols::InteractionModel::Status status = OnOffServer::Instance().setOnOffValue( mEndpointId, mTargetLightIsOn.Value() ? OnOff::Commands::On::Id : OnOff::Commands::Off::Id, false /* initiatedByLevelChange */); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != chip::Protocols::InteractionModel::Status::Success) { - ChipLogError(AppServer, "Failed to set on/off value: %d", status); + ChipLogError(AppServer, "Failed to set on/off value: %d", chip::to_underlying(status)); } mTargetLightIsOn.ClearValue(); diff --git a/src/app/tests/suites/pics/PICSNormalizer.h b/examples/common/pigweed/nxp/PigweedLoggerMutex.cpp similarity index 71% rename from src/app/tests/suites/pics/PICSNormalizer.h rename to examples/common/pigweed/nxp/PigweedLoggerMutex.cpp index 04f5b028973683..ce5f5a9be0d21d 100644 --- a/src/app/tests/suites/pics/PICSNormalizer.h +++ b/examples/common/pigweed/nxp/PigweedLoggerMutex.cpp @@ -1,5 +1,7 @@ -/** - * Copyright (c) 2022 Project CHIP Authors +/* + * + * Copyright (c) 2023 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. @@ -14,15 +16,12 @@ * limitations under the License. */ -/** - * @file - * @brief Declaration of a method that normalizes a PICS code. - */ +#include "PigweedLoggerMutex.h" + +namespace chip { +namespace rpc { -#include +PigweedLoggerMutex logger_mutex; -class PICSNormalizer -{ -public: - static std::string Normalize(std::string code); -}; +} // namespace rpc +} // namespace chip diff --git a/examples/common/pigweed/nxp/PigweedLoggerMutex.h b/examples/common/pigweed/nxp/PigweedLoggerMutex.h new file mode 100644 index 00000000000000..ecad8995bad61c --- /dev/null +++ b/examples/common/pigweed/nxp/PigweedLoggerMutex.h @@ -0,0 +1,36 @@ +/* + * + * 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. + */ + +#pragma once + +#include "PigweedLogger.h" +#include "RpcService.h" + +namespace chip { +namespace rpc { +class PigweedLoggerMutex : public chip::rpc::Mutex +{ + +public: + void Lock() override { PigweedLogger::Lock(); } + void Unlock() override { PigweedLogger::Unlock(); } +}; + +extern PigweedLoggerMutex logger_mutex; + +} // namespace rpc +} // namespace chip diff --git a/examples/common/pigweed/rpc_config.gni b/examples/common/pigweed/rpc_config.gni new file mode 100644 index 00000000000000..ddd6b0863ebf70 --- /dev/null +++ b/examples/common/pigweed/rpc_config.gni @@ -0,0 +1,53 @@ +# 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. + +import("//build_overrides/chip.gni") +import("//build_overrides/pigweed.gni") + +rpc_defines = [ + "PW_RPC_ENABLED", + "PW_RPC_ATTRIBUTE_SERVICE=1", + "PW_RPC_BUTTON_SERVICE=1", + "PW_RPC_DESCRIPTOR_SERVICE=1", + "PW_RPC_DEVICE_SERVICE=1", + "PW_RPC_LIGHTING_SERVICE=1", + "PW_RPC_TRACING_SERVICE=1", +] + +rpc_sources = [ + "${chip_root}/examples/platform/linux/Rpc.cpp", + "${chip_root}/examples/platform/linux/system_rpc_server.cc", +] + +rpc_deps = [ + "$dir_pw_hdlc:pw_rpc", + "$dir_pw_hdlc:rpc_channel_output", + "$dir_pw_log", + "$dir_pw_rpc:server", + "$dir_pw_rpc/system_server:facade", + "$dir_pw_rpc/system_server:socket", + "$dir_pw_stream:socket_stream", + "$dir_pw_stream:sys_io_stream", + "$dir_pw_sync:mutex", + "$dir_pw_trace", + "$dir_pw_trace_tokenized", + "$dir_pw_trace_tokenized:trace_rpc_service", + "${chip_root}/config/linux/lib/pw_rpc:pw_rpc", + "${chip_root}/examples/common/pigweed:attributes_service.nanopb_rpc", + "${chip_root}/examples/common/pigweed:button_service.nanopb_rpc", + "${chip_root}/examples/common/pigweed:descriptor_service.nanopb_rpc", + "${chip_root}/examples/common/pigweed:device_service.nanopb_rpc", + "${chip_root}/examples/common/pigweed:lighting_service.nanopb_rpc", + "${chip_root}/examples/common/pigweed:rpc_services", +] diff --git a/examples/common/pigweed/rpc_services/internal/StatusUtils.h b/examples/common/pigweed/rpc_services/internal/StatusUtils.h index f92ee66afc44bb..3ea14d3f88923e 100644 --- a/examples/common/pigweed/rpc_services/internal/StatusUtils.h +++ b/examples/common/pigweed/rpc_services/internal/StatusUtils.h @@ -36,15 +36,15 @@ namespace chip { namespace rpc { -constexpr pw::Status ToPwStatus(EmberAfStatus ember_status) +constexpr pw::Status ToPwStatus(Protocols::InteractionModel::Status ember_status) { switch (ember_status) { - case EMBER_ZCL_STATUS_SUCCESS: + case Protocols::InteractionModel::Status::Success: return pw::OkStatus(); - case EMBER_ZCL_STATUS_NOT_FOUND: + case Protocols::InteractionModel::Status::NotFound: return pw::Status::NotFound(); - case EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS: + case Protocols::InteractionModel::Status::UnsupportedAccess: return pw::Status::PermissionDenied(); default: return pw::Status::Unknown(); diff --git a/examples/common/websocket-server/WebSocketServer.cpp b/examples/common/websocket-server/WebSocketServer.cpp index 6fbd47ddd94f9c..623dda3dc47527 100644 --- a/examples/common/websocket-server/WebSocketServer.cpp +++ b/examples/common/websocket-server/WebSocketServer.cpp @@ -26,6 +26,7 @@ constexpr uint16_t kDefaultWebSocketServerPort = 9002; constexpr uint16_t kMaxMessageBufferLen = 8192; +constexpr char kWebSocketServerReadyMessage[] = "== WebSocket Server Ready"; namespace { lws * gWebSocketInstance = nullptr; @@ -153,6 +154,10 @@ static int OnWebSocketCallback(lws * wsi, lws_callback_reasons reason, void * us { gWebSocketInstance = nullptr; } + else if (LWS_CALLBACK_PROTOCOL_INIT == reason) + { + ChipLogProgress(chipTool, "%s", kWebSocketServerReadyMessage); + } return 0; } diff --git a/examples/contact-sensor-app/nxp/k32w/k32w0/main/AppTask.cpp b/examples/contact-sensor-app/nxp/k32w/k32w0/main/AppTask.cpp index 5c942db19b3af5..a46ea5db28df64 100644 --- a/examples/contact-sensor-app/nxp/k32w/k32w0/main/AppTask.cpp +++ b/examples/contact-sensor-app/nxp/k32w/k32w0/main/AppTask.cpp @@ -892,10 +892,10 @@ void AppTask::UpdateClusterStateInternal(intptr_t arg) uint8_t newValue = ContactSensorMgr().IsContactClosed(); // write the new on/off value - EmberAfStatus status = app::Clusters::BooleanState::Attributes::StateValue::Set(1, newValue); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Protocols::InteractionModel::Status status = app::Clusters::BooleanState::Attributes::StateValue::Set(1, newValue); + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: updating boolean status value %x", status); + ChipLogError(NotSpecified, "ERR: updating boolean status value %x", to_underlying(status)); } logBooleanStateEvent(newValue); } diff --git a/examples/contact-sensor-app/nxp/k32w/k32w1/.gn b/examples/contact-sensor-app/nxp/k32w/k32w1/.gn index dec954b4b9ff69..1e848295f6aa5b 100644 --- a/examples/contact-sensor-app/nxp/k32w/k32w1/.gn +++ b/examples/contact-sensor-app/nxp/k32w/k32w1/.gn @@ -26,4 +26,7 @@ default_args = { target_os = "freertos" import("//args.gni") + + # Import default platform configs + import("${chip_root}/src/platform/nxp/k32w/k32w1/args.gni") } diff --git a/examples/contact-sensor-app/nxp/k32w/k32w1/BUILD.gn b/examples/contact-sensor-app/nxp/k32w/k32w1/BUILD.gn index 1404ad8dd36a1c..ed49c7bdd4f7a3 100644 --- a/examples/contact-sensor-app/nxp/k32w/k32w1/BUILD.gn +++ b/examples/contact-sensor-app/nxp/k32w/k32w1/BUILD.gn @@ -14,15 +14,19 @@ # limitations under the License. import("//build_overrides/chip.gni") -import("//build_overrides/k32w1_sdk.gni") +import("//build_overrides/nxp_sdk.gni") import("//build_overrides/openthread.gni") -import("${k32w1_sdk_build_root}/k32w1_executable.gni") -import("${k32w1_sdk_build_root}/k32w1_sdk.gni") +import("${nxp_sdk_build_root}/nxp_sdk.gni") + +import("${nxp_sdk_build_root}/${nxp_sdk_name}/nxp_executable.gni") + +import("${nxp_sdk_build_root}/${nxp_sdk_name}/${nxp_sdk_name}.gni") import("${chip_root}/src/crypto/crypto.gni") import("${chip_root}/src/lib/core/core.gni") import("${chip_root}/src/platform/device.gni") +import("${chip_root}/src/platform/nxp/${nxp_platform}/args.gni") declare_args() { chip_software_version = 0 @@ -85,7 +89,7 @@ k32w1_executable("contact_sensor_app") { deps = [ ":sdk", "${chip_root}/examples/common/QRCode", - "${chip_root}/examples/contact-sensor-app/contact-sensor-common", + "${chip_root}/examples/contact-sensor-app/nxp/zap", "${chip_root}/examples/providers:device_info_provider", "${chip_root}/src/lib", "${chip_root}/src/platform:syscalls_stub", @@ -116,7 +120,6 @@ k32w1_executable("contact_sensor_app") { ldflags = [ "-Wl,--defsym=__heap_size__=0", "-Wl,--defsym=__stack_size__=0x480", - "-Wl,--defsym=gNvmSectors=8", "-Wl,--defsym=lp_ram_lower_limit=0x04000000", "-Wl,--defsym=lp_ram_upper_limit=0x2001C000", "-Wl,-print-memory-usage", @@ -124,6 +127,10 @@ k32w1_executable("contact_sensor_app") { "-T" + rebase_path(ldscript, root_build_dir), ] + if (chip_with_factory_data == 1) { + ldflags += [ "-Wl,--defsym=gUseFactoryData_d=1" ] + } + output_dir = root_out_dir } diff --git a/examples/contact-sensor-app/nxp/k32w/k32w1/README.md b/examples/contact-sensor-app/nxp/k32w/k32w1/README.md index da6e3eb00f2f66..28983f45c89578 100644 --- a/examples/contact-sensor-app/nxp/k32w/k32w1/README.md +++ b/examples/contact-sensor-app/nxp/k32w/k32w1/README.md @@ -19,6 +19,7 @@ into an existing Matter network and can be controlled by this network. - [Bluetooth LE Rendezvous](#bluetooth-le-rendezvous) - [Device UI](#device-ui) - [Building](#building) +- [Manufacturing data](#manufacturing-data) - [Flashing](#flashing) - [Flashing the NBU image](#flashing-the-nbu-image) - [Flashing the host image](#flashing-the-host-image) @@ -108,7 +109,9 @@ initiate a reboot. The reset action can be cancelled by press SW2 button at any point before the 6 second limit. **Button SW3** can be used to change the state of the simulated contact sensor. -The button behaves as a toggle, swapping the state every time it is pressed. +The button behaves as a toggle, swapping the state every time it is short +pressed. When long pressed, it does a clean soft reset that takes into account +Matter shutdown procedure. ## Building @@ -134,8 +137,17 @@ In case that Openthread CLI is needed, chip_with_ot_cli build argument must be set to 1. After a successful build, the `elf` and `srec` files are found in `out/debug/` - +`see the files prefixed with chip-k32w1-contact-example`. After a successful +build, the `elf` and `srec` files are found in `out/debug/` - `see the files prefixed with chip-k32w1-contact-example`. +## Manufacturing data + +Use `chip_with_factory_data=1` in the gn build command to enable factory data. + +For a full guide on manufacturing flow, please see +[Guide for writing manufacturing data on NXP devices](../../../../../docs/guides/nxp_manufacturing_flow.md). + ## Flashing Two images must be written to the board: one for the host (CM33) and one for the diff --git a/examples/contact-sensor-app/nxp/k32w/k32w1/args.gni b/examples/contact-sensor-app/nxp/k32w/k32w1/args.gni index c0497aa27421d2..18c41cb457bc86 100644 --- a/examples/contact-sensor-app/nxp/k32w/k32w1/args.gni +++ b/examples/contact-sensor-app/nxp/k32w/k32w1/args.gni @@ -15,7 +15,6 @@ import("//build_overrides/chip.gni") import("${chip_root}/config/standalone/args.gni") -import("${chip_root}/examples/platform/nxp/k32w/k32w1/args.gni") # SDK target. This is overridden to add our SDK app_config.h & defines. k32w1_sdk_target = get_label_info(":sdk", "label_no_toolchain") @@ -23,3 +22,7 @@ k32w1_sdk_target = get_label_info(":sdk", "label_no_toolchain") chip_enable_ota_requestor = true chip_stack_lock_tracking = "fatal" chip_enable_ble = true + +chip_enable_icd_server = true +chip_persist_subscriptions = true +chip_subscription_timeout_resumption = true diff --git a/examples/contact-sensor-app/nxp/k32w/k32w1/include/CHIPProjectConfig.h b/examples/contact-sensor-app/nxp/k32w/k32w1/include/CHIPProjectConfig.h index af3a7067c99e1a..8846799ed6edc9 100644 --- a/examples/contact-sensor-app/nxp/k32w/k32w1/include/CHIPProjectConfig.h +++ b/examples/contact-sensor-app/nxp/k32w/k32w1/include/CHIPProjectConfig.h @@ -28,6 +28,58 @@ #pragma once +// Use hard-coded test certificates already embedded in generic chip code => set it to 0 +// Use real/development certificates => set it to 1 + file the provisioning section from +// the internal flash +#ifndef CONFIG_CHIP_LOAD_REAL_FACTORY_DATA +#define CONFIG_CHIP_LOAD_REAL_FACTORY_DATA 0 +#endif + +#if CONFIG_CHIP_LOAD_REAL_FACTORY_DATA + +// VID/PID for product => will be used by Basic Information Cluster +#define CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID 0x1037 +#define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID 0xA221 + +// Set the following define to use the Certification Declaration from below and not use it stored in factory data section +#ifndef CHIP_USE_DEVICE_CONFIG_CERTIFICATION_DECLARATION +#define CHIP_USE_DEVICE_CONFIG_CERTIFICATION_DECLARATION 0 +#endif + +#ifndef CHIP_DEVICE_CONFIG_CERTIFICATION_DECLARATION +//-> format_version = 1 +//-> vendor_id = 0x1037 +//-> product_id_array = [ 0xA221 ] +//-> device_type_id = 0x0015 +//-> certificate_id = "ZIG20142ZB330003-24" +//-> security_level = 0 +//-> security_information = 0 +//-> version_number = 0x2694 +//-> certification_type = 1 +//-> dac_origin_vendor_id is not present +//-> dac_origin_product_id is not present +#define CHIP_DEVICE_CONFIG_CERTIFICATION_DECLARATION \ + { \ + 0x30, 0x81, 0xe7, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0, 0x81, 0xd9, 0x30, 0x81, 0xd6, \ + 0x02, 0x01, 0x03, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, \ + 0x44, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x37, 0x04, 0x35, 0x15, 0x24, 0x00, \ + 0x01, 0x25, 0x01, 0x37, 0x10, 0x36, 0x02, 0x05, 0x21, 0xa2, 0x18, 0x24, 0x03, 0x15, 0x2c, 0x04, 0x13, 0x5a, 0x49, \ + 0x47, 0x32, 0x30, 0x31, 0x34, 0x32, 0x5a, 0x42, 0x33, 0x33, 0x30, 0x30, 0x30, 0x33, 0x2d, 0x32, 0x34, 0x24, 0x05, \ + 0x00, 0x24, 0x06, 0x00, 0x25, 0x07, 0x76, 0x98, 0x24, 0x08, 0x01, 0x18, 0x31, 0x7c, 0x30, 0x7a, 0x02, 0x01, 0x03, \ + 0x80, 0x14, 0x62, 0xfa, 0x82, 0x33, 0x59, 0xac, 0xfa, 0xa9, 0x96, 0x3e, 0x1c, 0xfa, 0x14, 0x0a, 0xdd, 0xf5, 0x04, \ + 0xf3, 0x71, 0x60, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, 0x0a, 0x06, \ + 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x04, 0x46, 0x30, 0x44, 0x02, 0x20, 0x1b, 0xf3, 0x13, 0x9b, \ + 0x39, 0xb8, 0x3e, 0x87, 0xde, 0x2e, 0xdf, 0x51, 0xfb, 0xa3, 0xba, 0xcb, 0xc7, 0x4e, 0xef, 0x16, 0x6b, 0xa1, 0x04, \ + 0xa0, 0x05, 0x7f, 0xc3, 0xd4, 0x15, 0x84, 0xd0, 0x44, 0x02, 0x20, 0x32, 0x98, 0xe2, 0x3c, 0x31, 0x16, 0x63, 0x60, \ + 0x2e, 0x58, 0x93, 0x87, 0x50, 0x9e, 0x29, 0x10, 0x9d, 0xe5, 0x9b, 0xcd, 0xab, 0x64, 0x43, 0x08, 0xd6, 0xf6, 0x6f, \ + 0x46, 0x7d, 0x22, 0x24, 0x42 \ + } + +// All remaining data will be pulled from the provisioning region of flash. +#endif + +#else + /** * CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID * @@ -56,18 +108,7 @@ */ #define CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER "TEST_SN" -/** - * CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID - * - * 0xFFF1: Test vendor. - */ -#define CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID 0xFFF1 - -/** - * CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID - * - */ -#define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID 0x8006 +#endif // CONFIG_CHIP_LOAD_REAL_FACTORY_DATA /** * CHIP_DEVICE_CONFIG_DEVICE_HARDWARE_VERSION diff --git a/examples/contact-sensor-app/nxp/k32w/k32w1/main/AppTask.cpp b/examples/contact-sensor-app/nxp/k32w/k32w1/main/AppTask.cpp index c7acba0f3ee1cb..10039bb8c9270e 100644 --- a/examples/contact-sensor-app/nxp/k32w/k32w1/main/AppTask.cpp +++ b/examples/contact-sensor-app/nxp/k32w/k32w1/main/AppTask.cpp @@ -94,6 +94,9 @@ using namespace chip; using namespace chip::app; AppTask AppTask::sAppTask; +#if CONFIG_CHIP_LOAD_REAL_FACTORY_DATA +static AppTask::FactoryDataProvider sFactoryDataProvider; +#endif static Identify gIdentify = { chip::EndpointId{ 1 }, AppTask::OnIdentifyStart, AppTask::OnIdentifyStop, Clusters::Identify::IdentifyTypeEnum::kVisibleIndicator }; @@ -150,8 +153,14 @@ CHIP_ERROR AppTask::Init() // Init ZCL Data Model and start server PlatformMgr().ScheduleWork(InitServer, 0); - // Initialize device attestation config +#if CONFIG_CHIP_LOAD_REAL_FACTORY_DATA + ReturnErrorOnFailure(sFactoryDataProvider.Init()); + SetDeviceInstanceInfoProvider(&sFactoryDataProvider); + SetDeviceAttestationCredentialsProvider(&sFactoryDataProvider); + SetCommissionableDataProvider(&sFactoryDataProvider); +#else SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider()); +#endif // CONFIG_CHIP_LOAD_REAL_FACTORY_DATA // QR code will be used with CHIP Tool AppTask::PrintOnboardingInfo(); @@ -358,7 +367,7 @@ void AppTask::AppTaskMain(void * pvParameter) void AppTask::ButtonEventHandler(uint8_t pin_no, uint8_t button_action) { - if ((pin_no != RESET_BUTTON) && (pin_no != CONTACT_SENSOR_BUTTON) && (pin_no != OTA_BUTTON) && (pin_no != BLE_BUTTON)) + if ((pin_no != RESET_BUTTON) && (pin_no != CONTACT_SENSOR_BUTTON) && (pin_no != SOFT_RESET_BUTTON) && (pin_no != BLE_BUTTON)) { return; } @@ -376,10 +385,10 @@ void AppTask::ButtonEventHandler(uint8_t pin_no, uint8_t button_action) { button_event.Handler = ContactActionEventHandler; } - else if (pin_no == OTA_BUTTON) + else if (pin_no == SOFT_RESET_BUTTON) { - // Starting OTA by button functionality is not used. - // button_event.Handler = OTAHandler; + // Soft reset ensures that platform manager shutdown procedure is called. + button_event.Handler = SoftResetHandler; } else if (pin_no == BLE_BUTTON) { @@ -432,7 +441,7 @@ button_status_t AppTask::KBD_Callback(void * buttonHandle, button_callback_messa case CONTACT_SENSOR_BUTTON: K32W_LOG("pb2 long press"); - ButtonEventHandler(OTA_BUTTON, OTA_BUTTON_PUSH); + ButtonEventHandler(SOFT_RESET_BUTTON, SOFT_RESET_BUTTON_PUSH); break; } break; @@ -561,29 +570,14 @@ void AppTask::ContactActionEventHandler(void * aGenericEvent) } } -void AppTask::OTAHandler(void * aGenericEvent) +void AppTask::SoftResetHandler(void * aGenericEvent) { AppEvent * aEvent = (AppEvent *) aGenericEvent; - if (aEvent->ButtonEvent.PinNo != OTA_BUTTON) + if (aEvent->ButtonEvent.PinNo != SOFT_RESET_BUTTON) return; -#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR - if (sAppTask.mFunction != Function::kNoneSelected) - { - K32W_LOG("Another function is scheduled. Could not initiate OTA!"); - return; - } - - PlatformMgr().ScheduleWork(StartOTAQuery, 0); -#endif -} - -#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR -void AppTask::StartOTAQuery(intptr_t arg) -{ - GetRequestorInstance()->TriggerImmediateQuery(); + PlatformMgrImpl().CleanReset(); } -#endif void AppTask::BleHandler(void * aGenericEvent) { @@ -794,11 +788,11 @@ void AppTask::UpdateClusterStateInternal(intptr_t arg) uint8_t newValue = ContactSensorMgr().IsContactClosed(); // write the new on/off value - EmberAfStatus status = app::Clusters::BooleanState::Attributes::StateValue::Set(1, newValue); + Protocols::InteractionModel::Status status = app::Clusters::BooleanState::Attributes::StateValue::Set(1, newValue); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: updating boolean status value %x", status); + ChipLogError(NotSpecified, "ERR: updating boolean status value %x", to_underlying(status)); } logBooleanStateEvent(newValue); } diff --git a/examples/contact-sensor-app/nxp/k32w/k32w1/main/include/AppTask.h b/examples/contact-sensor-app/nxp/k32w/k32w1/main/include/AppTask.h index 47b644769cfb63..bc19b0a9862ebd 100644 --- a/examples/contact-sensor-app/nxp/k32w/k32w1/main/include/AppTask.h +++ b/examples/contact-sensor-app/nxp/k32w/k32w1/main/include/AppTask.h @@ -30,6 +30,10 @@ #include #include +#if CONFIG_CHIP_LOAD_REAL_FACTORY_DATA +#include +#endif + #include "FreeRTOS.h" #include "fsl_component_button.h" #include "timers.h" @@ -45,6 +49,9 @@ class AppTask { public: +#if CONFIG_CHIP_LOAD_REAL_FACTORY_DATA + using FactoryDataProvider = chip::DeviceLayer::FactoryDataProviderImpl; +#endif CHIP_ERROR StartAppTask(); static void AppTaskMain(void * pvParameter); @@ -74,7 +81,7 @@ class AppTask static void FunctionTimerEventHandler(void * aGenericEvent); static button_status_t KBD_Callback(void * buttonHandle, button_callback_message_t * message, void * callbackParam); static void HandleKeyboard(void); - static void OTAHandler(void * aGenericEvent); + static void SoftResetHandler(void * aGenericEvent); static void BleHandler(void * aGenericEvent); static void BleStartAdvertising(intptr_t arg); static void ContactActionEventHandler(void * aGenericEvent); @@ -89,7 +96,6 @@ class AppTask #if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR static void InitOTA(intptr_t arg); - static void StartOTAQuery(intptr_t arg); #endif static void UpdateClusterStateInternal(intptr_t arg); diff --git a/examples/contact-sensor-app/nxp/k32w/k32w1/main/include/app_config.h b/examples/contact-sensor-app/nxp/k32w/k32w1/main/include/app_config.h index b62ce79567e8db..fbcf14fe7d88d7 100644 --- a/examples/contact-sensor-app/nxp/k32w/k32w1/main/include/app_config.h +++ b/examples/contact-sensor-app/nxp/k32w/k32w1/main/include/app_config.h @@ -23,12 +23,12 @@ #define RESET_BUTTON 1 #define CONTACT_SENSOR_BUTTON 2 -#define OTA_BUTTON 3 +#define SOFT_RESET_BUTTON 3 #define BLE_BUTTON 4 #define RESET_BUTTON_PUSH 1 #define CONTACT_SENSOR_BUTTON_PUSH 2 -#define OTA_BUTTON_PUSH 3 +#define SOFT_RESET_BUTTON_PUSH 3 #define BLE_BUTTON_PUSH 4 #define APP_BUTTON_PUSH 1 diff --git a/src/app/tests/suites/commands/log/BUILD.gn b/examples/contact-sensor-app/nxp/zap/BUILD.gn similarity index 63% rename from src/app/tests/suites/commands/log/BUILD.gn rename to examples/contact-sensor-app/nxp/zap/BUILD.gn index b873bf1c38d96d..be4913cf3552ee 100644 --- a/src/app/tests/suites/commands/log/BUILD.gn +++ b/examples/contact-sensor-app/nxp/zap/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2022 Project CHIP Authors +# 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. @@ -12,21 +12,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -import("//build_overrides/build.gni") import("//build_overrides/chip.gni") +import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni") +import("${chip_root}/src/app/chip_data_model.gni") -static_library("log") { - output_name = "libLogCommands" +chip_data_model("zap") { + zap_file = "contact-sensor-app.zap" - sources = [ - "LogCommands.cpp", - "LogCommands.h", - ] - - cflags = [ "-Wconversion" ] - - public_deps = [ - "${chip_root}/src/app/common:simulated", - "${chip_root}/src/lib/support", - ] + zap_pregenerated_dir = + "${chip_root}/zzz_generated/contact-sensor-app/nxp/zap-generated" + is_server = true } diff --git a/examples/contact-sensor-app/nxp/zap/contact-sensor-app.matter b/examples/contact-sensor-app/nxp/zap/contact-sensor-app.matter new file mode 100644 index 00000000000000..03736833bb02d3 --- /dev/null +++ b/examples/contact-sensor-app/nxp/zap/contact-sensor-app.matter @@ -0,0 +1,1646 @@ +// 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; +} + +/** 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; + + bitmap Feature : bitmap32 { + kTagList = 0x1; + } + + struct DeviceTypeStruct { + devtype_id deviceType = 0; + int16u revision = 1; + } + + struct SemanticTagStruct { + nullable vendor_id mfgCode = 0; + enum8 namespaceID = 1; + enum8 tag = 2; + optional nullable char_string label = 3; + } + + readonly attribute DeviceTypeStruct deviceTypeList[] = 0; + readonly attribute cluster_id serverList[] = 1; + readonly attribute cluster_id clientList[] = 2; + readonly attribute endpoint_no partsList[] = 3; + readonly attribute optional SemanticTagStruct tagList[] = 4; + 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; +} + +/** The Access Control Cluster exposes a data model view of a + Node's Access Control List (ACL), which codifies the rules used to manage + and enforce Access Control for the Node's endpoints and their associated + cluster instances. */ +cluster AccessControl = 31 { + revision 1; // NOTE: Default/not specifically set + + enum AccessControlEntryAuthModeEnum : enum8 { + kPASE = 1; + kCASE = 2; + kGroup = 3; + } + + enum AccessControlEntryPrivilegeEnum : enum8 { + kView = 1; + kProxyView = 2; + kOperate = 3; + kManage = 4; + kAdminister = 5; + } + + enum ChangeTypeEnum : enum8 { + kChanged = 0; + kAdded = 1; + kRemoved = 2; + } + + struct AccessControlTargetStruct { + nullable cluster_id cluster = 0; + nullable endpoint_no endpoint = 1; + nullable devtype_id deviceType = 2; + } + + fabric_scoped struct AccessControlEntryStruct { + fabric_sensitive AccessControlEntryPrivilegeEnum privilege = 1; + fabric_sensitive AccessControlEntryAuthModeEnum authMode = 2; + nullable fabric_sensitive int64u subjects[] = 3; + nullable fabric_sensitive AccessControlTargetStruct targets[] = 4; + fabric_idx fabricIndex = 254; + } + + fabric_scoped struct AccessControlExtensionStruct { + fabric_sensitive octet_string<128> data = 1; + fabric_idx fabricIndex = 254; + } + + fabric_sensitive info event access(read: administer) AccessControlEntryChanged = 0 { + nullable node_id adminNodeID = 1; + nullable int16u adminPasscodeID = 2; + ChangeTypeEnum changeType = 3; + nullable AccessControlEntryStruct latestValue = 4; + fabric_idx fabricIndex = 254; + } + + fabric_sensitive info event access(read: administer) AccessControlExtensionChanged = 1 { + nullable node_id adminNodeID = 1; + nullable int16u adminPasscodeID = 2; + ChangeTypeEnum changeType = 3; + nullable AccessControlExtensionStruct latestValue = 4; + fabric_idx fabricIndex = 254; + } + + attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0; + attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1; + readonly attribute int16u subjectsPerAccessControlEntry = 2; + readonly attribute int16u targetsPerAccessControlEntry = 3; + readonly attribute int16u accessControlEntriesPerFabric = 4; + 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 provides attributes and events for determining basic information about Nodes, which supports both + Commissioning and operational determination of Node characteristics, such as Vendor ID, Product ID and serial number, + which apply to the whole Node. Also allows setting user device information such as location. */ +cluster BasicInformation = 40 { + revision 3; + + enum ColorEnum : enum8 { + kBlack = 0; + kNavy = 1; + kGreen = 2; + kTeal = 3; + kMaroon = 4; + kPurple = 5; + kOlive = 6; + kGray = 7; + kBlue = 8; + kLime = 9; + kAqua = 10; + kRed = 11; + kFuchsia = 12; + kYellow = 13; + kWhite = 14; + kNickel = 15; + kChrome = 16; + kBrass = 17; + kCopper = 18; + kSilver = 19; + kGold = 20; + } + + enum ProductFinishEnum : enum8 { + kOther = 0; + kMatte = 1; + kSatin = 2; + kPolished = 3; + kRugged = 4; + kFabric = 5; + } + + struct CapabilityMinimaStruct { + int16u caseSessionsPerFabric = 0; + int16u subscriptionsPerFabric = 1; + } + + struct ProductAppearanceStruct { + ProductFinishEnum finish = 0; + nullable ColorEnum primaryColor = 1; + } + + critical event StartUp = 0 { + int32u softwareVersion = 0; + } + + critical event ShutDown = 1 { + } + + info event Leave = 2 { + fabric_idx fabricIndex = 0; + } + + info event ReachableChanged = 3 { + boolean reachableNewValue = 0; + } + + readonly attribute int16u dataModelRevision = 0; + readonly attribute char_string<32> vendorName = 1; + readonly attribute vendor_id vendorID = 2; + readonly attribute char_string<32> productName = 3; + readonly attribute int16u productID = 4; + attribute access(write: manage) char_string<32> nodeLabel = 5; + attribute access(write: administer) char_string<2> location = 6; + readonly attribute int16u hardwareVersion = 7; + readonly attribute char_string<64> hardwareVersionString = 8; + readonly attribute int32u softwareVersion = 9; + readonly attribute char_string<64> softwareVersionString = 10; + readonly attribute optional char_string<16> manufacturingDate = 11; + readonly attribute optional char_string<32> partNumber = 12; + readonly attribute optional long_char_string<256> productURL = 13; + readonly attribute optional char_string<64> productLabel = 14; + readonly attribute optional char_string<32> serialNumber = 15; + attribute access(write: manage) optional boolean localConfigDisabled = 16; + readonly attribute optional boolean reachable = 17; + readonly attribute optional char_string<32> uniqueID = 18; + readonly attribute CapabilityMinimaStruct capabilityMinima = 19; + readonly attribute optional ProductAppearanceStruct productAppearance = 20; + readonly attribute int32u specificationVersion = 21; + readonly attribute int16u maxPathsPerInvoke = 22; + 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; + + command MfgSpecificPing(): DefaultSuccess = 0; +} + +/** Provides an interface for providing OTA software updates */ +cluster OtaSoftwareUpdateProvider = 41 { + revision 1; // NOTE: Default/not specifically set + + enum ApplyUpdateActionEnum : enum8 { + kProceed = 0; + kAwaitNextAction = 1; + kDiscontinue = 2; + } + + enum DownloadProtocolEnum : enum8 { + kBDXSynchronous = 0; + kBDXAsynchronous = 1; + kHTTPS = 2; + kVendorSpecific = 3; + } + + enum StatusEnum : enum8 { + kUpdateAvailable = 0; + kBusy = 1; + kNotAvailable = 2; + kDownloadProtocolNotSupported = 3; + } + + 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 QueryImageRequest { + vendor_id vendorID = 0; + int16u productID = 1; + int32u softwareVersion = 2; + DownloadProtocolEnum protocolsSupported[] = 3; + optional int16u hardwareVersion = 4; + optional char_string<2> location = 5; + optional boolean requestorCanConsent = 6; + optional octet_string<512> metadataForProvider = 7; + } + + response struct QueryImageResponse = 1 { + StatusEnum status = 0; + optional int32u delayedActionTime = 1; + optional char_string<256> imageURI = 2; + optional int32u softwareVersion = 3; + optional char_string<64> softwareVersionString = 4; + optional octet_string<32> updateToken = 5; + optional boolean userConsentNeeded = 6; + optional octet_string<512> metadataForRequestor = 7; + } + + request struct ApplyUpdateRequestRequest { + octet_string<32> updateToken = 0; + int32u newVersion = 1; + } + + response struct ApplyUpdateResponse = 3 { + ApplyUpdateActionEnum action = 0; + int32u delayedActionTime = 1; + } + + request struct NotifyUpdateAppliedRequest { + octet_string<32> updateToken = 0; + int32u softwareVersion = 1; + } + + /** Determine availability of a new Software Image */ + command QueryImage(QueryImageRequest): QueryImageResponse = 0; + /** Determine next action to take for a downloaded Software Image */ + command ApplyUpdateRequest(ApplyUpdateRequestRequest): ApplyUpdateResponse = 2; + /** Notify OTA Provider that an update was applied */ + command NotifyUpdateApplied(NotifyUpdateAppliedRequest): DefaultSuccess = 4; +} + +/** Provides an interface for downloading and applying OTA software updates */ +cluster OtaSoftwareUpdateRequestor = 42 { + revision 1; // NOTE: Default/not specifically set + + enum AnnouncementReasonEnum : enum8 { + kSimpleAnnouncement = 0; + kUpdateAvailable = 1; + kUrgentUpdateAvailable = 2; + } + + enum ChangeReasonEnum : enum8 { + kUnknown = 0; + kSuccess = 1; + kFailure = 2; + kTimeOut = 3; + kDelayByProvider = 4; + } + + enum UpdateStateEnum : enum8 { + kUnknown = 0; + kIdle = 1; + kQuerying = 2; + kDelayedOnQuery = 3; + kDownloading = 4; + kApplying = 5; + kDelayedOnApply = 6; + kRollingBack = 7; + kDelayedOnUserConsent = 8; + } + + fabric_scoped struct ProviderLocation { + node_id providerNodeID = 1; + endpoint_no endpoint = 2; + fabric_idx fabricIndex = 254; + } + + info event StateTransition = 0 { + UpdateStateEnum previousState = 0; + UpdateStateEnum newState = 1; + ChangeReasonEnum reason = 2; + nullable int32u targetSoftwareVersion = 3; + } + + critical event VersionApplied = 1 { + int32u softwareVersion = 0; + int16u productID = 1; + } + + info event DownloadError = 2 { + int32u softwareVersion = 0; + int64u bytesDownloaded = 1; + nullable int8u progressPercent = 2; + nullable int64s platformCode = 3; + } + + attribute access(write: administer) ProviderLocation defaultOTAProviders[] = 0; + readonly attribute boolean updatePossible = 1; + readonly attribute UpdateStateEnum updateState = 2; + readonly attribute nullable int8u updateStateProgress = 3; + 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 AnnounceOTAProviderRequest { + node_id providerNodeID = 0; + vendor_id vendorID = 1; + AnnouncementReasonEnum announcementReason = 2; + optional octet_string<512> metadataForNode = 3; + endpoint_no endpoint = 4; + } + + /** Announce the presence of an OTA Provider */ + command AnnounceOTAProvider(AnnounceOTAProviderRequest): DefaultSuccess = 0; +} + +/** This cluster is used to manage global aspects of the Commissioning flow. */ +cluster GeneralCommissioning = 48 { + revision 1; // NOTE: Default/not specifically set + + enum CommissioningErrorEnum : enum8 { + kOK = 0; + kValueOutsideRange = 1; + kInvalidAuthentication = 2; + kNoFailSafe = 3; + kBusyWithOtherAdmin = 4; + } + + enum RegulatoryLocationTypeEnum : enum8 { + kIndoor = 0; + kOutdoor = 1; + kIndoorOutdoor = 2; + } + + struct BasicCommissioningInfo { + int16u failSafeExpiryLengthSeconds = 0; + int16u maxCumulativeFailsafeSeconds = 1; + } + + attribute access(write: administer) int64u breadcrumb = 0; + readonly attribute BasicCommissioningInfo basicCommissioningInfo = 1; + readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2; + readonly attribute RegulatoryLocationTypeEnum locationCapability = 3; + readonly attribute boolean supportsConcurrentConnection = 4; + 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 ArmFailSafeRequest { + int16u expiryLengthSeconds = 0; + int64u breadcrumb = 1; + } + + response struct ArmFailSafeResponse = 1 { + CommissioningErrorEnum errorCode = 0; + char_string<128> debugText = 1; + } + + request struct SetRegulatoryConfigRequest { + RegulatoryLocationTypeEnum newRegulatoryConfig = 0; + char_string<2> countryCode = 1; + int64u breadcrumb = 2; + } + + response struct SetRegulatoryConfigResponse = 3 { + CommissioningErrorEnum errorCode = 0; + char_string debugText = 1; + } + + response struct CommissioningCompleteResponse = 5 { + CommissioningErrorEnum errorCode = 0; + char_string debugText = 1; + } + + /** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */ + command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0; + /** Set the regulatory configuration to be used during commissioning */ + command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2; + /** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */ + fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4; +} + +/** Functionality to configure, enable, disable network credentials and access on a Matter device. */ +cluster NetworkCommissioning = 49 { + revision 1; // NOTE: Default/not specifically set + + enum NetworkCommissioningStatusEnum : enum8 { + kSuccess = 0; + kOutOfRange = 1; + kBoundsExceeded = 2; + kNetworkIDNotFound = 3; + kDuplicateNetworkID = 4; + kNetworkNotFound = 5; + kRegulatoryError = 6; + kAuthFailure = 7; + kUnsupportedSecurity = 8; + kOtherConnectionFailure = 9; + kIPV6Failed = 10; + kIPBindFailed = 11; + kUnknownError = 12; + } + + enum WiFiBandEnum : enum8 { + k2G4 = 0; + k3G65 = 1; + k5G = 2; + k6G = 3; + k60G = 4; + k1G = 5; + } + + bitmap Feature : bitmap32 { + kWiFiNetworkInterface = 0x1; + kThreadNetworkInterface = 0x2; + kEthernetNetworkInterface = 0x4; + kPerDeviceCredentials = 0x8; + } + + bitmap ThreadCapabilitiesBitmap : bitmap16 { + kIsBorderRouterCapable = 0x1; + kIsRouterCapable = 0x2; + kIsSleepyEndDeviceCapable = 0x4; + kIsFullThreadDevice = 0x8; + kIsSynchronizedSleepyEndDeviceCapable = 0x10; + } + + bitmap WiFiSecurityBitmap : bitmap8 { + kUnencrypted = 0x1; + kWEP = 0x2; + kWPAPersonal = 0x4; + kWPA2Personal = 0x8; + kWPA3Personal = 0x10; + kWPA3MatterPDC = 0x20; + } + + struct NetworkInfoStruct { + octet_string<32> networkID = 0; + boolean connected = 1; + optional nullable octet_string<20> networkIdentifier = 2; + optional nullable octet_string<20> clientIdentifier = 3; + } + + struct ThreadInterfaceScanResultStruct { + int16u panId = 0; + int64u extendedPanId = 1; + char_string<16> networkName = 2; + int16u channel = 3; + int8u version = 4; + octet_string<8> extendedAddress = 5; + int8s rssi = 6; + int8u lqi = 7; + } + + struct WiFiInterfaceScanResultStruct { + WiFiSecurityBitmap security = 0; + octet_string<32> ssid = 1; + octet_string<6> bssid = 2; + int16u channel = 3; + WiFiBandEnum wiFiBand = 4; + int8s rssi = 5; + } + + readonly attribute access(read: administer) int8u maxNetworks = 0; + readonly attribute access(read: administer) NetworkInfoStruct networks[] = 1; + readonly attribute optional int8u scanMaxTimeSeconds = 2; + readonly attribute optional int8u connectMaxTimeSeconds = 3; + attribute access(write: administer) boolean interfaceEnabled = 4; + readonly attribute access(read: administer) nullable NetworkCommissioningStatusEnum lastNetworkingStatus = 5; + readonly attribute access(read: administer) nullable octet_string<32> lastNetworkID = 6; + readonly attribute access(read: administer) nullable int32s lastConnectErrorValue = 7; + readonly attribute optional WiFiBandEnum supportedWiFiBands[] = 8; + readonly attribute optional ThreadCapabilitiesBitmap supportedThreadFeatures = 9; + readonly attribute optional int16u threadVersion = 10; + 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 ScanNetworksRequest { + optional nullable octet_string<32> ssid = 0; + optional int64u breadcrumb = 1; + } + + response struct ScanNetworksResponse = 1 { + NetworkCommissioningStatusEnum networkingStatus = 0; + optional char_string debugText = 1; + optional WiFiInterfaceScanResultStruct wiFiScanResults[] = 2; + optional ThreadInterfaceScanResultStruct threadScanResults[] = 3; + } + + request struct AddOrUpdateWiFiNetworkRequest { + octet_string<32> ssid = 0; + octet_string<64> credentials = 1; + optional int64u breadcrumb = 2; + optional octet_string<140> networkIdentity = 3; + optional octet_string<20> clientIdentifier = 4; + optional octet_string<32> possessionNonce = 5; + } + + request struct AddOrUpdateThreadNetworkRequest { + octet_string<254> operationalDataset = 0; + optional int64u breadcrumb = 1; + } + + request struct RemoveNetworkRequest { + octet_string<32> networkID = 0; + optional int64u breadcrumb = 1; + } + + response struct NetworkConfigResponse = 5 { + NetworkCommissioningStatusEnum networkingStatus = 0; + optional char_string<512> debugText = 1; + optional int8u networkIndex = 2; + optional octet_string<140> clientIdentity = 3; + optional octet_string<64> possessionSignature = 4; + } + + request struct ConnectNetworkRequest { + octet_string<32> networkID = 0; + optional int64u breadcrumb = 1; + } + + response struct ConnectNetworkResponse = 7 { + NetworkCommissioningStatusEnum networkingStatus = 0; + optional char_string debugText = 1; + nullable int32s errorValue = 2; + } + + request struct ReorderNetworkRequest { + octet_string<32> networkID = 0; + int8u networkIndex = 1; + optional int64u breadcrumb = 2; + } + + request struct QueryIdentityRequest { + octet_string<20> keyIdentifier = 0; + optional octet_string<32> possessionNonce = 1; + } + + response struct QueryIdentityResponse = 10 { + octet_string<140> identity = 0; + optional octet_string<64> possessionSignature = 1; + } + + /** Detemine the set of networks the device sees as available. */ + command access(invoke: administer) ScanNetworks(ScanNetworksRequest): ScanNetworksResponse = 0; + /** Add or update the credentials for a given Wi-Fi network. */ + command access(invoke: administer) AddOrUpdateWiFiNetwork(AddOrUpdateWiFiNetworkRequest): NetworkConfigResponse = 2; + /** Add or update the credentials for a given Thread network. */ + command access(invoke: administer) AddOrUpdateThreadNetwork(AddOrUpdateThreadNetworkRequest): NetworkConfigResponse = 3; + /** Remove the definition of a given network (including its credentials). */ + command access(invoke: administer) RemoveNetwork(RemoveNetworkRequest): NetworkConfigResponse = 4; + /** Connect to the specified network, using previously-defined credentials. */ + command access(invoke: administer) ConnectNetwork(ConnectNetworkRequest): ConnectNetworkResponse = 6; + /** Modify the order in which networks will be presented in the Networks attribute. */ + command access(invoke: administer) ReorderNetwork(ReorderNetworkRequest): NetworkConfigResponse = 8; + /** Retrieve details about and optionally proof of possession of a network client identity. */ + command access(invoke: administer) QueryIdentity(QueryIdentityRequest): QueryIdentityResponse = 9; +} + +/** The General Diagnostics Cluster, along with other diagnostics clusters, provide a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems. */ +cluster GeneralDiagnostics = 51 { + revision 2; + + enum BootReasonEnum : enum8 { + kUnspecified = 0; + kPowerOnReboot = 1; + kBrownOutReset = 2; + kSoftwareWatchdogReset = 3; + kHardwareWatchdogReset = 4; + kSoftwareUpdateCompleted = 5; + kSoftwareReset = 6; + } + + enum HardwareFaultEnum : enum8 { + kUnspecified = 0; + kRadio = 1; + kSensor = 2; + kResettableOverTemp = 3; + kNonResettableOverTemp = 4; + kPowerSource = 5; + kVisualDisplayFault = 6; + kAudioOutputFault = 7; + kUserInterfaceFault = 8; + kNonVolatileMemoryError = 9; + kTamperDetected = 10; + } + + enum InterfaceTypeEnum : enum8 { + kUnspecified = 0; + kWiFi = 1; + kEthernet = 2; + kCellular = 3; + kThread = 4; + } + + enum NetworkFaultEnum : enum8 { + kUnspecified = 0; + kHardwareFailure = 1; + kNetworkJammed = 2; + kConnectionFailed = 3; + } + + enum RadioFaultEnum : enum8 { + kUnspecified = 0; + kWiFiFault = 1; + kCellularFault = 2; + kThreadFault = 3; + kNFCFault = 4; + kBLEFault = 5; + kEthernetFault = 6; + } + + bitmap Feature : bitmap32 { + kDataModelTest = 0x1; + } + + struct NetworkInterface { + char_string<32> name = 0; + boolean isOperational = 1; + nullable boolean offPremiseServicesReachableIPv4 = 2; + nullable boolean offPremiseServicesReachableIPv6 = 3; + octet_string<8> hardwareAddress = 4; + octet_string IPv4Addresses[] = 5; + octet_string IPv6Addresses[] = 6; + InterfaceTypeEnum type = 7; + } + + critical event HardwareFaultChange = 0 { + HardwareFaultEnum current[] = 0; + HardwareFaultEnum previous[] = 1; + } + + critical event RadioFaultChange = 1 { + RadioFaultEnum current[] = 0; + RadioFaultEnum previous[] = 1; + } + + critical event NetworkFaultChange = 2 { + NetworkFaultEnum current[] = 0; + NetworkFaultEnum previous[] = 1; + } + + critical event BootReason = 3 { + BootReasonEnum bootReason = 0; + } + + readonly attribute NetworkInterface networkInterfaces[] = 0; + readonly attribute int16u rebootCount = 1; + readonly attribute optional int64u upTime = 2; + readonly attribute optional int32u totalOperationalHours = 3; + readonly attribute optional BootReasonEnum bootReason = 4; + readonly attribute optional HardwareFaultEnum activeHardwareFaults[] = 5; + readonly attribute optional RadioFaultEnum activeRadioFaults[] = 6; + readonly attribute optional NetworkFaultEnum activeNetworkFaults[] = 7; + readonly attribute boolean testEventTriggersEnabled = 8; + 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 TestEventTriggerRequest { + octet_string<16> enableKey = 0; + int64u eventTrigger = 1; + } + + response struct TimeSnapshotResponse = 2 { + systime_ms systemTimeMs = 0; + nullable posix_ms posixTimeMs = 1; + } + + request struct PayloadTestRequestRequest { + octet_string<16> enableKey = 0; + int8u value = 1; + int16u count = 2; + } + + response struct PayloadTestResponse = 4 { + octet_string payload = 0; + } + + /** Provide a means for certification tests to trigger some test-plan-specific events */ + command access(invoke: manage) TestEventTrigger(TestEventTriggerRequest): DefaultSuccess = 0; + /** Take a snapshot of system time and epoch time. */ + command TimeSnapshot(): TimeSnapshotResponse = 1; + /** Request a variable length payload response. */ + command PayloadTestRequest(PayloadTestRequestRequest): PayloadTestResponse = 3; +} + +/** The Software Diagnostics Cluster provides a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems. */ +cluster SoftwareDiagnostics = 52 { + revision 1; // NOTE: Default/not specifically set + + bitmap Feature : bitmap32 { + kWatermarks = 0x1; + } + + struct ThreadMetricsStruct { + int64u id = 0; + optional char_string<8> name = 1; + optional int32u stackFreeCurrent = 2; + optional int32u stackFreeMinimum = 3; + optional int32u stackSize = 4; + } + + info event SoftwareFault = 0 { + int64u id = 0; + optional char_string name = 1; + optional octet_string faultRecording = 2; + } + + readonly attribute optional ThreadMetricsStruct threadMetrics[] = 0; + readonly attribute optional int64u currentHeapFree = 1; + readonly attribute optional int64u currentHeapUsed = 2; + readonly attribute optional int64u currentHeapHighWatermark = 3; + 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; + + /** Reception of this command SHALL reset the values: The StackFreeMinimum field of the ThreadMetrics attribute, CurrentHeapHighWaterMark attribute. */ + command access(invoke: manage) ResetWatermarks(): DefaultSuccess = 0; +} + +/** The Thread Network Diagnostics Cluster provides a means to acquire standardized diagnostics metrics that MAY be used by a Node to assist a user or Administrative Node in diagnosing potential problems */ +cluster ThreadNetworkDiagnostics = 53 { + revision 1; // NOTE: Default/not specifically set + + enum ConnectionStatusEnum : enum8 { + kConnected = 0; + kNotConnected = 1; + } + + enum NetworkFaultEnum : enum8 { + kUnspecified = 0; + kLinkDown = 1; + kHardwareFailure = 2; + kNetworkJammed = 3; + } + + enum RoutingRoleEnum : enum8 { + kUnspecified = 0; + kUnassigned = 1; + kSleepyEndDevice = 2; + kEndDevice = 3; + kREED = 4; + kRouter = 5; + kLeader = 6; + } + + bitmap Feature : bitmap32 { + kPacketCounts = 0x1; + kErrorCounts = 0x2; + kMLECounts = 0x4; + kMACCounts = 0x8; + } + + struct NeighborTableStruct { + int64u extAddress = 0; + int32u age = 1; + int16u rloc16 = 2; + int32u linkFrameCounter = 3; + int32u mleFrameCounter = 4; + int8u lqi = 5; + nullable int8s averageRssi = 6; + nullable int8s lastRssi = 7; + int8u frameErrorRate = 8; + int8u messageErrorRate = 9; + boolean rxOnWhenIdle = 10; + boolean fullThreadDevice = 11; + boolean fullNetworkData = 12; + boolean isChild = 13; + } + + struct OperationalDatasetComponents { + boolean activeTimestampPresent = 0; + boolean pendingTimestampPresent = 1; + boolean masterKeyPresent = 2; + boolean networkNamePresent = 3; + boolean extendedPanIdPresent = 4; + boolean meshLocalPrefixPresent = 5; + boolean delayPresent = 6; + boolean panIdPresent = 7; + boolean channelPresent = 8; + boolean pskcPresent = 9; + boolean securityPolicyPresent = 10; + boolean channelMaskPresent = 11; + } + + struct RouteTableStruct { + int64u extAddress = 0; + int16u rloc16 = 1; + int8u routerId = 2; + int8u nextHop = 3; + int8u pathCost = 4; + int8u LQIIn = 5; + int8u LQIOut = 6; + int8u age = 7; + boolean allocated = 8; + boolean linkEstablished = 9; + } + + struct SecurityPolicy { + int16u rotationTime = 0; + int16u flags = 1; + } + + info event ConnectionStatus = 0 { + ConnectionStatusEnum connectionStatus = 0; + } + + info event NetworkFaultChange = 1 { + NetworkFaultEnum current[] = 0; + NetworkFaultEnum previous[] = 1; + } + + readonly attribute nullable int16u channel = 0; + readonly attribute nullable RoutingRoleEnum routingRole = 1; + readonly attribute nullable char_string<16> networkName = 2; + readonly attribute nullable int16u panId = 3; + readonly attribute nullable int64u extendedPanId = 4; + readonly attribute nullable octet_string<17> meshLocalPrefix = 5; + readonly attribute optional int64u overrunCount = 6; + readonly attribute NeighborTableStruct neighborTable[] = 7; + readonly attribute RouteTableStruct routeTable[] = 8; + readonly attribute nullable int32u partitionId = 9; + readonly attribute nullable int16u weighting = 10; + readonly attribute nullable int16u dataVersion = 11; + readonly attribute nullable int16u stableDataVersion = 12; + readonly attribute nullable int8u leaderRouterId = 13; + readonly attribute optional int16u detachedRoleCount = 14; + readonly attribute optional int16u childRoleCount = 15; + readonly attribute optional int16u routerRoleCount = 16; + readonly attribute optional int16u leaderRoleCount = 17; + readonly attribute optional int16u attachAttemptCount = 18; + readonly attribute optional int16u partitionIdChangeCount = 19; + readonly attribute optional int16u betterPartitionAttachAttemptCount = 20; + readonly attribute optional int16u parentChangeCount = 21; + readonly attribute optional int32u txTotalCount = 22; + readonly attribute optional int32u txUnicastCount = 23; + readonly attribute optional int32u txBroadcastCount = 24; + readonly attribute optional int32u txAckRequestedCount = 25; + readonly attribute optional int32u txAckedCount = 26; + readonly attribute optional int32u txNoAckRequestedCount = 27; + readonly attribute optional int32u txDataCount = 28; + readonly attribute optional int32u txDataPollCount = 29; + readonly attribute optional int32u txBeaconCount = 30; + readonly attribute optional int32u txBeaconRequestCount = 31; + readonly attribute optional int32u txOtherCount = 32; + readonly attribute optional int32u txRetryCount = 33; + readonly attribute optional int32u txDirectMaxRetryExpiryCount = 34; + readonly attribute optional int32u txIndirectMaxRetryExpiryCount = 35; + readonly attribute optional int32u txErrCcaCount = 36; + readonly attribute optional int32u txErrAbortCount = 37; + readonly attribute optional int32u txErrBusyChannelCount = 38; + readonly attribute optional int32u rxTotalCount = 39; + readonly attribute optional int32u rxUnicastCount = 40; + readonly attribute optional int32u rxBroadcastCount = 41; + readonly attribute optional int32u rxDataCount = 42; + readonly attribute optional int32u rxDataPollCount = 43; + readonly attribute optional int32u rxBeaconCount = 44; + readonly attribute optional int32u rxBeaconRequestCount = 45; + readonly attribute optional int32u rxOtherCount = 46; + readonly attribute optional int32u rxAddressFilteredCount = 47; + readonly attribute optional int32u rxDestAddrFilteredCount = 48; + readonly attribute optional int32u rxDuplicatedCount = 49; + readonly attribute optional int32u rxErrNoFrameCount = 50; + readonly attribute optional int32u rxErrUnknownNeighborCount = 51; + readonly attribute optional int32u rxErrInvalidSrcAddrCount = 52; + readonly attribute optional int32u rxErrSecCount = 53; + readonly attribute optional int32u rxErrFcsCount = 54; + readonly attribute optional int32u rxErrOtherCount = 55; + readonly attribute optional nullable int64u activeTimestamp = 56; + readonly attribute optional nullable int64u pendingTimestamp = 57; + readonly attribute optional nullable int32u delay = 58; + readonly attribute nullable SecurityPolicy securityPolicy = 59; + readonly attribute nullable octet_string<4> channelPage0Mask = 60; + readonly attribute nullable OperationalDatasetComponents operationalDatasetComponents = 61; + readonly attribute NetworkFaultEnum activeNetworkFaultsList[] = 62; + 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; + + /** Reception of this command SHALL reset the OverrunCount attributes to 0 */ + command access(invoke: manage) ResetCounts(): DefaultSuccess = 0; +} + +/** Commands to trigger a Node to allow a new Administrator to commission it. */ +cluster AdministratorCommissioning = 60 { + revision 1; // NOTE: Default/not specifically set + + enum CommissioningWindowStatusEnum : enum8 { + kWindowNotOpen = 0; + kEnhancedWindowOpen = 1; + kBasicWindowOpen = 2; + } + + enum StatusCode : enum8 { + kBusy = 2; + kPAKEParameterError = 3; + kWindowNotOpen = 4; + } + + bitmap Feature : bitmap32 { + kBasic = 0x1; + } + + readonly attribute CommissioningWindowStatusEnum windowStatus = 0; + readonly attribute nullable fabric_idx adminFabricIndex = 1; + readonly attribute nullable vendor_id adminVendorId = 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; + + request struct OpenCommissioningWindowRequest { + int16u commissioningTimeout = 0; + octet_string PAKEPasscodeVerifier = 1; + int16u discriminator = 2; + int32u iterations = 3; + octet_string<32> salt = 4; + } + + request struct OpenBasicCommissioningWindowRequest { + int16u commissioningTimeout = 0; + } + + /** This command is used by a current Administrator to instruct a Node to go into commissioning mode using enhanced commissioning method. */ + timed command access(invoke: administer) OpenCommissioningWindow(OpenCommissioningWindowRequest): DefaultSuccess = 0; + /** This command is used by a current Administrator to instruct a Node to go into commissioning mode using basic commissioning method, if the node supports it. */ + timed command access(invoke: administer) OpenBasicCommissioningWindow(OpenBasicCommissioningWindowRequest): DefaultSuccess = 1; + /** This command is used by a current Administrator to instruct a Node to revoke any active Open Commissioning Window or Open Basic Commissioning Window command. */ + timed command access(invoke: administer) RevokeCommissioning(): DefaultSuccess = 2; +} + +/** This cluster is used to add or remove Operational Credentials on a Commissionee or Node, as well as manage the associated Fabrics. */ +cluster OperationalCredentials = 62 { + revision 1; // NOTE: Default/not specifically set + + enum CertificateChainTypeEnum : enum8 { + kDACCertificate = 1; + kPAICertificate = 2; + } + + enum NodeOperationalCertStatusEnum : enum8 { + kOK = 0; + kInvalidPublicKey = 1; + kInvalidNodeOpId = 2; + kInvalidNOC = 3; + kMissingCsr = 4; + kTableFull = 5; + kInvalidAdminSubject = 6; + kFabricConflict = 9; + kLabelConflict = 10; + kInvalidFabricIndex = 11; + } + + fabric_scoped struct FabricDescriptorStruct { + octet_string<65> rootPublicKey = 1; + vendor_id vendorID = 2; + fabric_id fabricID = 3; + node_id nodeID = 4; + char_string<32> label = 5; + fabric_idx fabricIndex = 254; + } + + fabric_scoped struct NOCStruct { + fabric_sensitive octet_string noc = 1; + nullable fabric_sensitive octet_string icac = 2; + fabric_idx fabricIndex = 254; + } + + readonly attribute access(read: administer) NOCStruct NOCs[] = 0; + readonly attribute FabricDescriptorStruct fabrics[] = 1; + readonly attribute int8u supportedFabrics = 2; + readonly attribute int8u commissionedFabrics = 3; + readonly attribute octet_string trustedRootCertificates[] = 4; + readonly attribute int8u currentFabricIndex = 5; + 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 AttestationRequestRequest { + octet_string<32> attestationNonce = 0; + } + + response struct AttestationResponse = 1 { + octet_string<900> attestationElements = 0; + octet_string<64> attestationSignature = 1; + } + + request struct CertificateChainRequestRequest { + CertificateChainTypeEnum certificateType = 0; + } + + response struct CertificateChainResponse = 3 { + octet_string<600> certificate = 0; + } + + request struct CSRRequestRequest { + octet_string<32> CSRNonce = 0; + optional boolean isForUpdateNOC = 1; + } + + response struct CSRResponse = 5 { + octet_string NOCSRElements = 0; + octet_string attestationSignature = 1; + } + + request struct AddNOCRequest { + octet_string<400> NOCValue = 0; + optional octet_string<400> ICACValue = 1; + octet_string<16> IPKValue = 2; + int64u caseAdminSubject = 3; + vendor_id adminVendorId = 4; + } + + request struct UpdateNOCRequest { + octet_string NOCValue = 0; + optional octet_string ICACValue = 1; + } + + response struct NOCResponse = 8 { + NodeOperationalCertStatusEnum statusCode = 0; + optional fabric_idx fabricIndex = 1; + optional char_string<128> debugText = 2; + } + + request struct UpdateFabricLabelRequest { + char_string<32> label = 0; + } + + request struct RemoveFabricRequest { + fabric_idx fabricIndex = 0; + } + + request struct AddTrustedRootCertificateRequest { + octet_string rootCACertificate = 0; + } + + /** Sender is requesting attestation information from the receiver. */ + command access(invoke: administer) AttestationRequest(AttestationRequestRequest): AttestationResponse = 0; + /** Sender is requesting a device attestation certificate from the receiver. */ + command access(invoke: administer) CertificateChainRequest(CertificateChainRequestRequest): CertificateChainResponse = 2; + /** Sender is requesting a certificate signing request (CSR) from the receiver. */ + command access(invoke: administer) CSRRequest(CSRRequestRequest): CSRResponse = 4; + /** Sender is requesting to add the new node operational certificates. */ + command access(invoke: administer) AddNOC(AddNOCRequest): NOCResponse = 6; + /** Sender is requesting to update the node operational certificates. */ + fabric command access(invoke: administer) UpdateNOC(UpdateNOCRequest): NOCResponse = 7; + /** This command SHALL be used by an Administrative Node to set the user-visible Label field for a given Fabric, as reflected by entries in the Fabrics attribute. */ + fabric command access(invoke: administer) UpdateFabricLabel(UpdateFabricLabelRequest): NOCResponse = 9; + /** This command is used by Administrative Nodes to remove a given fabric index and delete all associated fabric-scoped data. */ + command access(invoke: administer) RemoveFabric(RemoveFabricRequest): NOCResponse = 10; + /** This command SHALL add a Trusted Root CA Certificate, provided as its CHIP Certificate representation. */ + command access(invoke: administer) AddTrustedRootCertificate(AddTrustedRootCertificateRequest): DefaultSuccess = 11; +} + +/** The Group Key Management Cluster is the mechanism by which group keys are managed. */ +cluster GroupKeyManagement = 63 { + revision 1; // NOTE: Default/not specifically set + + enum GroupKeySecurityPolicyEnum : enum8 { + kTrustFirst = 0; + kCacheAndSync = 1; + } + + bitmap Feature : bitmap32 { + kCacheAndSync = 0x1; + } + + fabric_scoped struct GroupInfoMapStruct { + group_id groupId = 1; + endpoint_no endpoints[] = 2; + optional char_string<16> groupName = 3; + fabric_idx fabricIndex = 254; + } + + fabric_scoped struct GroupKeyMapStruct { + group_id groupId = 1; + int16u groupKeySetID = 2; + fabric_idx fabricIndex = 254; + } + + struct GroupKeySetStruct { + int16u groupKeySetID = 0; + GroupKeySecurityPolicyEnum groupKeySecurityPolicy = 1; + nullable octet_string<16> epochKey0 = 2; + nullable epoch_us epochStartTime0 = 3; + nullable octet_string<16> epochKey1 = 4; + nullable epoch_us epochStartTime1 = 5; + nullable octet_string<16> epochKey2 = 6; + nullable epoch_us epochStartTime2 = 7; + } + + attribute access(write: manage) GroupKeyMapStruct groupKeyMap[] = 0; + readonly attribute GroupInfoMapStruct groupTable[] = 1; + readonly attribute int16u maxGroupsPerFabric = 2; + readonly attribute int16u maxGroupKeysPerFabric = 3; + 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 KeySetWriteRequest { + GroupKeySetStruct groupKeySet = 0; + } + + request struct KeySetReadRequest { + int16u groupKeySetID = 0; + } + + response struct KeySetReadResponse = 2 { + GroupKeySetStruct groupKeySet = 0; + } + + request struct KeySetRemoveRequest { + int16u groupKeySetID = 0; + } + + response struct KeySetReadAllIndicesResponse = 5 { + int16u groupKeySetIDs[] = 0; + } + + /** Write a new set of keys for the given key set id. */ + fabric command access(invoke: administer) KeySetWrite(KeySetWriteRequest): DefaultSuccess = 0; + /** Read the keys for a given key set id. */ + fabric command access(invoke: administer) KeySetRead(KeySetReadRequest): KeySetReadResponse = 1; + /** Revoke a Root Key from a Group */ + fabric command access(invoke: administer) KeySetRemove(KeySetRemoveRequest): DefaultSuccess = 3; + /** Return the list of Group Key Sets associated with the accessing fabric */ + fabric command access(invoke: administer) KeySetReadAllIndices(): KeySetReadAllIndicesResponse = 4; +} + +/** This cluster provides an interface to a boolean state called StateValue. */ +cluster BooleanState = 69 { + revision 1; + + info event StateChange = 0 { + boolean stateValue = 0; + } + + readonly attribute boolean stateValue = 0; + 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; +} + +/** Allows servers to ensure that listed clients are notified when a server is available for communication. */ +cluster IcdManagement = 70 { + revision 2; + + enum OperatingModeEnum : enum8 { + kSIT = 0; + kLIT = 1; + } + + bitmap Feature : bitmap32 { + kCheckInProtocolSupport = 0x1; + kUserActiveModeTrigger = 0x2; + kLongIdleTimeSupport = 0x4; + } + + bitmap UserActiveModeTriggerBitmap : bitmap32 { + kPowerCycle = 0x1; + kSettingsMenu = 0x2; + kCustomInstruction = 0x4; + kDeviceManual = 0x8; + kActuateSensor = 0x10; + kActuateSensorSeconds = 0x20; + kActuateSensorTimes = 0x40; + kActuateSensorLightsBlink = 0x80; + kResetButton = 0x100; + kResetButtonLightsBlink = 0x200; + kResetButtonSeconds = 0x400; + kResetButtonTimes = 0x800; + kSetupButton = 0x1000; + kSetupButtonSeconds = 0x2000; + kSetupButtonLightsBlink = 0x4000; + kSetupButtonTimes = 0x8000; + kAppDefinedButton = 0x10000; + } + + fabric_scoped struct MonitoringRegistrationStruct { + fabric_sensitive node_id checkInNodeID = 1; + fabric_sensitive int64u monitoredSubject = 2; + fabric_idx fabricIndex = 254; + } + + readonly attribute int32u idleModeDuration = 0; + readonly attribute int32u activeModeDuration = 1; + readonly attribute int16u activeModeThreshold = 2; + readonly attribute access(read: administer) optional MonitoringRegistrationStruct registeredClients[] = 3; + readonly attribute access(read: administer) optional int32u ICDCounter = 4; + readonly attribute optional int16u clientsSupportedPerFabric = 5; + readonly attribute optional UserActiveModeTriggerBitmap userActiveModeTriggerHint = 6; + readonly attribute optional char_string<128> userActiveModeTriggerInstruction = 7; + readonly attribute optional OperatingModeEnum operatingMode = 8; + 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 RegisterClientRequest { + node_id checkInNodeID = 0; + int64u monitoredSubject = 1; + octet_string<16> key = 2; + optional octet_string<16> verificationKey = 3; + } + + response struct RegisterClientResponse = 1 { + int32u ICDCounter = 0; + } + + request struct UnregisterClientRequest { + node_id checkInNodeID = 0; + optional octet_string<16> verificationKey = 1; + } + + response struct StayActiveResponse = 4 { + int32u promisedActiveDuration = 0; + } + + /** Register a client to the end device */ + fabric command access(invoke: manage) RegisterClient(RegisterClientRequest): RegisterClientResponse = 0; + /** Unregister a client from an end device */ + fabric command access(invoke: manage) UnregisterClient(UnregisterClientRequest): DefaultSuccess = 2; + /** Request the end device to stay in Active Mode for an additional ActiveModeThreshold */ + command access(invoke: manage) StayActiveRequest(): StayActiveResponse = 3; +} + +endpoint 0 { + device type ma_rootdevice = 22, version 2; + + binding cluster OtaSoftwareUpdateProvider; + + server cluster Descriptor { + callback attribute deviceTypeList; + callback attribute serverList; + callback attribute clientList; + callback attribute partsList; + callback attribute featureMap; + callback attribute clusterRevision; + } + + server cluster AccessControl { + emits event AccessControlEntryChanged; + emits event AccessControlExtensionChanged; + callback attribute acl; + callback attribute subjectsPerAccessControlEntry; + callback attribute targetsPerAccessControlEntry; + callback attribute accessControlEntriesPerFabric; + callback attribute attributeList; + ram attribute featureMap default = 0; + callback attribute clusterRevision; + } + + server cluster BasicInformation { + emits event StartUp; + emits event ShutDown; + emits event Leave; + callback attribute dataModelRevision; + callback attribute vendorName; + callback attribute vendorID; + callback attribute productName; + callback attribute productID; + persist attribute nodeLabel; + callback attribute location; + callback attribute hardwareVersion; + callback attribute hardwareVersionString; + callback attribute softwareVersion; + callback attribute softwareVersionString; + callback attribute capabilityMinima; + callback attribute specificationVersion; + callback attribute maxPathsPerInvoke; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 2; + } + + server cluster OtaSoftwareUpdateRequestor { + emits event StateTransition; + emits event VersionApplied; + emits event DownloadError; + callback attribute defaultOTAProviders; + ram attribute updatePossible default = 1; + ram attribute updateState default = 0; + ram attribute updateStateProgress default = 0; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + + handle command AnnounceOTAProvider; + } + + server cluster GeneralCommissioning { + ram attribute breadcrumb default = 0x0000000000000000; + callback attribute basicCommissioningInfo; + callback attribute regulatoryConfig; + callback attribute locationCapability; + callback attribute supportsConcurrentConnection; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + + handle command ArmFailSafe; + handle command ArmFailSafeResponse; + handle command SetRegulatoryConfig; + handle command SetRegulatoryConfigResponse; + handle command CommissioningComplete; + handle command CommissioningCompleteResponse; + } + + server cluster NetworkCommissioning { + ram attribute maxNetworks; + callback attribute networks; + ram attribute scanMaxTimeSeconds; + ram attribute connectMaxTimeSeconds; + ram attribute interfaceEnabled; + ram attribute lastNetworkingStatus; + ram attribute lastNetworkID; + ram attribute lastConnectErrorValue; + ram attribute featureMap default = 2; + ram attribute clusterRevision default = 1; + + handle command ScanNetworks; + handle command ScanNetworksResponse; + handle command AddOrUpdateThreadNetwork; + handle command RemoveNetwork; + handle command NetworkConfigResponse; + handle command ConnectNetwork; + handle command ConnectNetworkResponse; + handle command ReorderNetwork; + } + + server cluster GeneralDiagnostics { + emits event BootReason; + callback attribute networkInterfaces; + callback attribute rebootCount; + callback attribute activeNetworkFaults; + callback attribute testEventTriggersEnabled default = false; + callback attribute featureMap; + callback attribute clusterRevision; + + handle command TestEventTrigger; + } + + server cluster SoftwareDiagnostics { + callback attribute threadMetrics; + callback attribute currentHeapFree; + callback attribute currentHeapUsed; + callback attribute currentHeapHighWatermark; + callback attribute featureMap; + ram attribute clusterRevision default = 1; + + handle command ResetWatermarks; + } + + server cluster ThreadNetworkDiagnostics { + callback attribute channel; + callback attribute routingRole; + callback attribute networkName; + callback attribute panId; + callback attribute extendedPanId; + callback attribute meshLocalPrefix; + callback attribute overrunCount; + callback attribute neighborTable; + callback attribute routeTable; + callback attribute partitionId; + callback attribute weighting; + callback attribute dataVersion; + callback attribute stableDataVersion; + callback attribute leaderRouterId; + callback attribute detachedRoleCount; + callback attribute childRoleCount; + callback attribute routerRoleCount; + callback attribute leaderRoleCount; + callback attribute attachAttemptCount; + callback attribute partitionIdChangeCount; + callback attribute betterPartitionAttachAttemptCount; + callback attribute parentChangeCount; + callback attribute txTotalCount; + callback attribute txUnicastCount; + callback attribute txBroadcastCount; + callback attribute txAckRequestedCount; + callback attribute txAckedCount; + callback attribute txNoAckRequestedCount; + callback attribute txDataCount; + callback attribute txDataPollCount; + callback attribute txBeaconCount; + callback attribute txBeaconRequestCount; + callback attribute txOtherCount; + callback attribute txRetryCount; + callback attribute txDirectMaxRetryExpiryCount; + callback attribute txIndirectMaxRetryExpiryCount; + callback attribute txErrCcaCount; + callback attribute txErrAbortCount; + callback attribute txErrBusyChannelCount; + callback attribute rxTotalCount; + callback attribute rxUnicastCount; + callback attribute rxBroadcastCount; + callback attribute rxDataCount; + callback attribute rxDataPollCount; + callback attribute rxBeaconCount; + callback attribute rxBeaconRequestCount; + callback attribute rxOtherCount; + callback attribute rxAddressFilteredCount; + callback attribute rxDestAddrFilteredCount; + callback attribute rxDuplicatedCount; + callback attribute rxErrNoFrameCount; + callback attribute rxErrUnknownNeighborCount; + callback attribute rxErrInvalidSrcAddrCount; + callback attribute rxErrSecCount; + callback attribute rxErrFcsCount; + callback attribute rxErrOtherCount; + callback attribute securityPolicy; + callback attribute channelPage0Mask; + callback attribute operationalDatasetComponents; + callback attribute activeNetworkFaultsList; + ram attribute featureMap default = 0x000F; + ram attribute clusterRevision default = 1; + + handle command ResetCounts; + } + + server cluster AdministratorCommissioning { + callback attribute windowStatus; + callback attribute adminFabricIndex; + callback attribute adminVendorId; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + + handle command OpenCommissioningWindow; + handle command RevokeCommissioning; + } + + server cluster OperationalCredentials { + callback attribute NOCs; + callback attribute fabrics; + callback attribute supportedFabrics; + callback attribute commissionedFabrics; + callback attribute trustedRootCertificates; + callback attribute currentFabricIndex; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + + handle command AttestationRequest; + handle command AttestationResponse; + handle command CertificateChainRequest; + handle command CertificateChainResponse; + handle command CSRRequest; + handle command CSRResponse; + handle command AddNOC; + handle command UpdateNOC; + handle command NOCResponse; + handle command UpdateFabricLabel; + handle command RemoveFabric; + handle command AddTrustedRootCertificate; + } + + server cluster GroupKeyManagement { + callback attribute groupKeyMap; + callback attribute groupTable; + callback attribute maxGroupsPerFabric; + callback attribute maxGroupKeysPerFabric; + callback attribute featureMap; + callback attribute clusterRevision; + + handle command KeySetWrite; + handle command KeySetRead; + handle command KeySetReadResponse; + handle command KeySetRemove; + handle command KeySetReadAllIndices; + handle command KeySetReadAllIndicesResponse; + } + + server cluster IcdManagement { + callback attribute idleModeDuration; + callback attribute activeModeDuration; + callback attribute activeModeThreshold; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; + ram attribute featureMap default = 0x0000; + ram attribute clusterRevision default = 1; + } +} +endpoint 1 { + device type ma_contactsensor = 21, version 1; + + + server cluster Identify { + ram attribute identifyTime default = 0x0000; + ram attribute identifyType default = 0x0; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute attributeList; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 4; + + handle command Identify; + handle command TriggerEffect; + } + + server cluster Descriptor { + callback attribute deviceTypeList; + callback attribute serverList; + callback attribute clientList; + callback attribute partsList; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute attributeList; + callback attribute featureMap; + callback attribute clusterRevision; + } + + server cluster BooleanState { + emits event StateChange; + ram attribute stateValue default = 0; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute attributeList; + ram attribute featureMap default = 0; + ram attribute clusterRevision default = 1; + } +} + + diff --git a/examples/contact-sensor-app/nxp/zap/contact-sensor-app.zap b/examples/contact-sensor-app/nxp/zap/contact-sensor-app.zap new file mode 100644 index 00000000000000..bf037957bd2629 --- /dev/null +++ b/examples/contact-sensor-app/nxp/zap/contact-sensor-app.zap @@ -0,0 +1,3576 @@ +{ + "fileFormat": 2, + "featureLevel": 99, + "creator": "zap", + "keyValuePairs": [ + { + "key": "commandDiscovery", + "value": "1" + }, + { + "key": "defaultResponsePolicy", + "value": "always" + }, + { + "key": "manufacturerCodes", + "value": "0x1002" + } + ], + "package": [ + { + "pathRelativity": "relativeToZap", + "path": "../../../../src/app/zap-templates/zcl/zcl.json", + "type": "zcl-properties", + "category": "matter", + "version": 1, + "description": "Matter SDK ZCL data" + }, + { + "pathRelativity": "relativeToZap", + "path": "../../../../src/app/zap-templates/app-templates.json", + "type": "gen-templates-json", + "version": "chip-v1" + } + ], + "endpointTypes": [ + { + "id": 1, + "name": "MA-rootdevice", + "deviceTypeRef": { + "code": 22, + "profileId": 259, + "label": "MA-rootdevice", + "name": "MA-rootdevice" + }, + "deviceTypes": [ + { + "code": 22, + "profileId": 259, + "label": "MA-rootdevice", + "name": "MA-rootdevice" + } + ], + "deviceVersions": [ + 2 + ], + "deviceIdentifiers": [ + 22 + ], + "deviceTypeName": "MA-rootdevice", + "deviceTypeCode": 22, + "deviceTypeProfileId": 259, + "clusters": [ + { + "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": "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": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Access Control", + "code": 31, + "mfgCode": null, + "define": "ACCESS_CONTROL_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "ACL", + "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": "SubjectsPerAccessControlEntry", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "TargetsPerAccessControlEntry", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AccessControlEntriesPerFabric", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int16u", + "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": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ], + "events": [ + { + "name": "AccessControlEntryChanged", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1 + }, + { + "name": "AccessControlExtensionChanged", + "code": 1, + "mfgCode": null, + "side": "server", + "included": 1 + } + ] + }, + { + "name": "Basic Information", + "code": 40, + "mfgCode": null, + "define": "BASIC_INFORMATION_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "DataModelRevision", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "VendorName", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "VendorID", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "vendor_id", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ProductName", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ProductID", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "NodeLabel", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "NVM", + "singleton": 1, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Location", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "HardwareVersion", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "HardwareVersionString", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "SoftwareVersion", + "code": 9, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "SoftwareVersionString", + "code": 10, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CapabilityMinima", + "code": 19, + "mfgCode": null, + "side": "server", + "type": "CapabilityMinimaStruct", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SpecificationVersion", + "code": 21, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MaxPathsPerInvoke", + "code": 22, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 1, + "bounded": 0, + "defaultValue": "", + "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": 1, + "bounded": 0, + "defaultValue": "2", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ], + "events": [ + { + "name": "StartUp", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1 + }, + { + "name": "ShutDown", + "code": 1, + "mfgCode": null, + "side": "server", + "included": 1 + }, + { + "name": "Leave", + "code": 2, + "mfgCode": null, + "side": "server", + "included": 1 + } + ] + }, + { + "name": "OTA Software Update Provider", + "code": 41, + "mfgCode": null, + "define": "OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER", + "side": "client", + "enabled": 1, + "commands": [ + { + "name": "QueryImage", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "QueryImageResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ApplyUpdateRequest", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "ApplyUpdateResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "NotifyUpdateApplied", + "code": 4, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "OTA Software Update Requestor", + "code": 42, + "mfgCode": null, + "define": "OTA_SOFTWARE_UPDATE_REQUESTOR_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "AnnounceOTAProvider", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "DefaultOTAProviders", + "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": "UpdatePossible", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "UpdateState", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "UpdateStateEnum", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "UpdateStateProgress", + "code": 3, + "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": "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": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ], + "events": [ + { + "name": "StateTransition", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1 + }, + { + "name": "VersionApplied", + "code": 1, + "mfgCode": null, + "side": "server", + "included": 1 + }, + { + "name": "DownloadError", + "code": 2, + "mfgCode": null, + "side": "server", + "included": 1 + } + ] + }, + { + "name": "General Commissioning", + "code": 48, + "mfgCode": null, + "define": "GENERAL_COMMISSIONING_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "ArmFailSafe", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ArmFailSafeResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "SetRegulatoryConfig", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "SetRegulatoryConfigResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "CommissioningComplete", + "code": 4, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "CommissioningCompleteResponse", + "code": 5, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "Breadcrumb", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "BasicCommissioningInfo", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "BasicCommissioningInfo", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RegulatoryConfig", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "RegulatoryLocationTypeEnum", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "LocationCapability", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "RegulatoryLocationTypeEnum", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "SupportsConcurrentConnection", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "boolean", + "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": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Network Commissioning", + "code": 49, + "mfgCode": null, + "define": "NETWORK_COMMISSIONING_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "ScanNetworks", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ScanNetworksResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "AddOrUpdateThreadNetwork", + "code": 3, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "RemoveNetwork", + "code": 4, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "NetworkConfigResponse", + "code": 5, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "ConnectNetwork", + "code": 6, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ConnectNetworkResponse", + "code": 7, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "ReorderNetwork", + "code": 8, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "MaxNetworks", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Networks", + "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": "ScanMaxTimeSeconds", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ConnectMaxTimeSeconds", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "InterfaceEnabled", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "LastNetworkingStatus", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "NetworkCommissioningStatusEnum", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "LastNetworkID", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "octet_string", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "LastConnectErrorValue", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "int32s", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "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": "2", + "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": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "General Diagnostics", + "code": 51, + "mfgCode": null, + "define": "GENERAL_DIAGNOSTICS_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "TestEventTrigger", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "NetworkInterfaces", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RebootCount", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ActiveNetworkFaults", + "code": 7, + "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": "TestEventTriggersEnabled", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "false", + "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": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ], + "events": [ + { + "name": "BootReason", + "code": 3, + "mfgCode": null, + "side": "server", + "included": 1 + } + ] + }, + { + "name": "Software Diagnostics", + "code": 52, + "mfgCode": null, + "define": "SOFTWARE_DIAGNOSTICS_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "ResetWatermarks", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "ThreadMetrics", + "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": "CurrentHeapFree", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentHeapUsed", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentHeapHighWatermark", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "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": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Thread Network Diagnostics", + "code": 53, + "mfgCode": null, + "define": "THREAD_NETWORK_DIAGNOSTICS_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "ResetCounts", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "Channel", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RoutingRole", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "RoutingRoleEnum", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "NetworkName", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "PanId", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ExtendedPanId", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "MeshLocalPrefix", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "octet_string", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "OverrunCount", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "int64u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "NeighborTable", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RouteTable", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "PartitionId", + "code": 9, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "Weighting", + "code": 10, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "DataVersion", + "code": 11, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "StableDataVersion", + "code": 12, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "LeaderRouterId", + "code": 13, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "DetachedRoleCount", + "code": 14, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ChildRoleCount", + "code": 15, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RouterRoleCount", + "code": 16, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "LeaderRoleCount", + "code": 17, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "AttachAttemptCount", + "code": 18, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "PartitionIdChangeCount", + "code": 19, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "BetterPartitionAttachAttemptCount", + "code": 20, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ParentChangeCount", + "code": 21, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxTotalCount", + "code": 22, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxUnicastCount", + "code": 23, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxBroadcastCount", + "code": 24, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxAckRequestedCount", + "code": 25, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxAckedCount", + "code": 26, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxNoAckRequestedCount", + "code": 27, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxDataCount", + "code": 28, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxDataPollCount", + "code": 29, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxBeaconCount", + "code": 30, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxBeaconRequestCount", + "code": 31, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxOtherCount", + "code": 32, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxRetryCount", + "code": 33, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxDirectMaxRetryExpiryCount", + "code": 34, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxIndirectMaxRetryExpiryCount", + "code": 35, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxErrCcaCount", + "code": 36, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxErrAbortCount", + "code": 37, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TxErrBusyChannelCount", + "code": 38, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxTotalCount", + "code": 39, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxUnicastCount", + "code": 40, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxBroadcastCount", + "code": 41, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxDataCount", + "code": 42, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxDataPollCount", + "code": 43, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxBeaconCount", + "code": 44, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxBeaconRequestCount", + "code": 45, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxOtherCount", + "code": 46, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxAddressFilteredCount", + "code": 47, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxDestAddrFilteredCount", + "code": 48, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxDuplicatedCount", + "code": 49, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxErrNoFrameCount", + "code": 50, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxErrUnknownNeighborCount", + "code": 51, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxErrInvalidSrcAddrCount", + "code": 52, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxErrSecCount", + "code": 53, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxErrFcsCount", + "code": 54, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "RxErrOtherCount", + "code": 55, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "SecurityPolicy", + "code": 59, + "mfgCode": null, + "side": "server", + "type": "SecurityPolicy", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ChannelPage0Mask", + "code": 60, + "mfgCode": null, + "side": "server", + "type": "octet_string", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "OperationalDatasetComponents", + "code": 61, + "mfgCode": null, + "side": "server", + "type": "OperationalDatasetComponents", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ActiveNetworkFaultsList", + "code": 62, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x000F", + "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": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Administrator Commissioning", + "code": 60, + "mfgCode": null, + "define": "ADMINISTRATOR_COMMISSIONING_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "OpenCommissioningWindow", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "RevokeCommissioning", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "WindowStatus", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "CommissioningWindowStatusEnum", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AdminFabricIndex", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "fabric_idx", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AdminVendorId", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "vendor_id", + "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": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Operational Credentials", + "code": 62, + "mfgCode": null, + "define": "OPERATIONAL_CREDENTIALS_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "AttestationRequest", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "AttestationResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "CertificateChainRequest", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "CertificateChainResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "CSRRequest", + "code": 4, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "CSRResponse", + "code": 5, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "AddNOC", + "code": 6, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "UpdateNOC", + "code": 7, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "NOCResponse", + "code": 8, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "UpdateFabricLabel", + "code": 9, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "RemoveFabric", + "code": 10, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "AddTrustedRootCertificate", + "code": 11, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "NOCs", + "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": "Fabrics", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "SupportedFabrics", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CommissionedFabrics", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "TrustedRootCertificates", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "CurrentFabricIndex", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "int8u", + "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": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Group Key Management", + "code": 63, + "mfgCode": null, + "define": "GROUP_KEY_MANAGEMENT_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "KeySetWrite", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "KeySetRead", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "KeySetReadResponse", + "code": 2, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "KeySetRemove", + "code": 3, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "KeySetReadAllIndices", + "code": 4, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "KeySetReadAllIndicesResponse", + "code": 5, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "GroupKeyMap", + "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": "GroupTable", + "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": "MaxGroupsPerFabric", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "MaxGroupKeysPerFabric", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "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 + } + ] + }, + { + "name": "ICD Management", + "code": 70, + "mfgCode": null, + "define": "ICD_MANAGEMENT_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "IdleModeDuration", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveModeDuration", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveModeThreshold", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16u", + "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": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "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 + } + ] + } + ] + }, + { + "id": 2, + "name": "MA-dimmablelight", + "deviceTypeRef": { + "code": 21, + "profileId": 259, + "label": "MA-contactsensor", + "name": "MA-contactsensor" + }, + "deviceTypes": [ + { + "code": 21, + "profileId": 259, + "label": "MA-contactsensor", + "name": "MA-contactsensor" + } + ], + "deviceVersions": [ + 1 + ], + "deviceIdentifiers": [ + 21 + ], + "deviceTypeName": "MA-contactsensor", + "deviceTypeCode": 21, + "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": "0x0000", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "IdentifyType", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "IdentifyTypeEnum", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0", + "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": "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": 0, + "maxInterval": 65344, + "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": "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": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Boolean State", + "code": 69, + "mfgCode": null, + "define": "BOOLEAN_STATE_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "StateValue", + "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": "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": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ], + "events": [ + { + "name": "StateChange", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1 + } + ] + } + ] + } + ], + "endpoints": [ + { + "endpointTypeName": "MA-rootdevice", + "endpointTypeIndex": 0, + "profileId": 259, + "endpointId": 0, + "networkId": 0 + }, + { + "endpointTypeName": "MA-dimmablelight", + "endpointTypeIndex": 1, + "profileId": 259, + "endpointId": 1, + "networkId": 0 + } + ], + "log": [] +} \ No newline at end of file diff --git a/examples/contact-sensor-app/telink/src/AppTask.cpp b/examples/contact-sensor-app/telink/src/AppTask.cpp index ba6a8d8118a897..dbcf9e1ce48405 100644 --- a/examples/contact-sensor-app/telink/src/AppTask.cpp +++ b/examples/contact-sensor-app/telink/src/AppTask.cpp @@ -95,10 +95,10 @@ void AppTask::UpdateClusterStateInternal(intptr_t arg) ChipLogProgress(NotSpecified, "StateValue::Set : %d", newValue); // write the new boolean state value - EmberAfStatus status = app::Clusters::BooleanState::Attributes::StateValue::Set(1, newValue); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Protocols::InteractionModel::Status status = app::Clusters::BooleanState::Attributes::StateValue::Set(1, newValue); + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: updating boolean status value %x", status); + ChipLogError(NotSpecified, "ERR: updating boolean status value %x", to_underlying(status)); } } diff --git a/examples/darwin-framework-tool/commands/bdx/DownloadLogCommand.h b/examples/darwin-framework-tool/commands/bdx/DownloadLogCommand.h index ce48270d28b6ac..27bbdd676d4971 100644 --- a/examples/darwin-framework-tool/commands/bdx/DownloadLogCommand.h +++ b/examples/darwin-framework-tool/commands/bdx/DownloadLogCommand.h @@ -32,14 +32,23 @@ class DownloadLogCommand : public CHIPCommandBridge "The timeout for getting the log. If the timeout expires, completion will be called with whatever has been " "retrieved by that point (which might be none or a partial log). If the timeout is set to 0, the request will " "not expire and completion will not be called until the log is fully retrieved or an error occurs."); + AddArgument("async", 0, 1, &mIsAsyncCommand, + "By default the command waits for the download to finish before returning. If async is true the command will " + "not wait and the download will proceed in the background"); + AddArgument("filepath", &mFilePath, "An optional filepath to save the download log content to."); } /////////// CHIPCommandBridge Interface ///////// CHIP_ERROR RunCommand() override; - chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(10); } + chip::System::Clock::Timeout GetWaitDuration() const override + { + return chip::System::Clock::Seconds16(mTimeout > 0 ? mTimeout + 10 : 300); + } private: chip::NodeId mNodeId; uint8_t mLogType; uint16_t mTimeout; + chip::Optional mFilePath; + chip::Optional mIsAsyncCommand; }; diff --git a/examples/darwin-framework-tool/commands/bdx/DownloadLogCommand.mm b/examples/darwin-framework-tool/commands/bdx/DownloadLogCommand.mm index 494ec964f14b63..b105b6cb3098c8 100644 --- a/examples/darwin-framework-tool/commands/bdx/DownloadLogCommand.mm +++ b/examples/darwin-framework-tool/commands/bdx/DownloadLogCommand.mm @@ -21,6 +21,7 @@ #import "MTRError_Utils.h" #include "DownloadLogCommand.h" +#include "RemoteDataModelLogger.h" CHIP_ERROR DownloadLogCommand::RunCommand() { @@ -32,27 +33,62 @@ auto logType = static_cast(mLogType); auto queue = dispatch_queue_create("com.chip.bdx.downloader", DISPATCH_QUEUE_SERIAL); + bool shouldWaitForDownload = !mIsAsyncCommand.ValueOr(false); + mIsAsyncCommand.ClearValue(); + + bool dumpToFile = mFilePath.HasValue(); + auto * dumpFilePath = dumpToFile ? [NSString stringWithUTF8String:mFilePath.Value()] : nil; + mFilePath.ClearValue(); + auto * self = this; auto completion = ^(NSURL * url, NSError * error) { // A non-nil url indicates the presence of content, which can occur even in error scenarios like timeouts. + NSString * logContent = nil; if (nil != url) { NSError * readError = nil; auto * data = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:&readError]; - VerifyOrReturn(nil == readError, self->SetCommandExitStatus(MTRErrorToCHIPErrorCode(readError))); + if (nil != readError) { + if (shouldWaitForDownload) { + self->SetCommandExitStatus(MTRErrorToCHIPErrorCode(readError)); + } + return; + } + + logContent = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + NSLog(@"Content: %@", logContent); - auto * content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSLog(@"Content: %@", content); + if (dumpToFile) { + NSError * writeError = nil; + auto * fileManager = [NSFileManager defaultManager]; + [fileManager copyItemAtPath:[url path] toPath:dumpFilePath error:&writeError]; + if (nil != writeError) { + if (shouldWaitForDownload) { + self->SetCommandExitStatus(MTRErrorToCHIPErrorCode(readError)); + } + return; + } + } } - VerifyOrReturn(nil == error, self->SetCommandExitStatus(MTRErrorToCHIPErrorCode(error))); + ChipLogProgress(chipTool, "Diagnostic logs transfer: %s", error ? "Error" : "Success"); + auto err = RemoteDataModelLogger::LogBdxDownload(logContent, error); - // The url is nil when there are no logs on the target device. - if (nil == url) { - NSLog(@"No logs has been found onto node 0x" ChipLogFormatX64, ChipLogValueX64(mNodeId)); + if (CHIP_NO_ERROR != err) { + if (shouldWaitForDownload) { + self->SetCommandExitStatus(err); + } + return; + } + + if (shouldWaitForDownload) { + self->SetCommandExitStatus(MTRErrorToCHIPErrorCode(error)); } - self->SetCommandExitStatus(CHIP_NO_ERROR); }; [device downloadLogOfType:logType timeout:mTimeout queue:queue completion:completion]; + + if (!shouldWaitForDownload) { + SetCommandExitStatus(CHIP_NO_ERROR); + } return CHIP_NO_ERROR; } diff --git a/examples/darwin-framework-tool/commands/common/MTRError.mm b/examples/darwin-framework-tool/commands/common/MTRError.mm index 770c947e05d94b..f7680e822d323d 100644 --- a/examples/darwin-framework-tool/commands/common/MTRError.mm +++ b/examples/darwin-framework-tool/commands/common/MTRError.mm @@ -20,8 +20,6 @@ #import #import -#import -#import #import #import diff --git a/examples/darwin-framework-tool/commands/common/RemoteDataModelLogger.h b/examples/darwin-framework-tool/commands/common/RemoteDataModelLogger.h index 39605e6fb56390..b2cd92df859deb 100644 --- a/examples/darwin-framework-tool/commands/common/RemoteDataModelLogger.h +++ b/examples/darwin-framework-tool/commands/common/RemoteDataModelLogger.h @@ -32,5 +32,6 @@ CHIP_ERROR LogCommandAsJSON(NSNumber * endpointId, NSNumber * clusterId, NSNumbe CHIP_ERROR LogAttributeErrorAsJSON(NSNumber * endpointId, NSNumber * clusterId, NSNumber * attributeId, NSError * error); CHIP_ERROR LogCommandErrorAsJSON(NSNumber * endpointId, NSNumber * clusterId, NSNumber * commandId, NSError * error); CHIP_ERROR LogGetCommissionerNodeId(NSNumber * nodeId); +CHIP_ERROR LogBdxDownload(NSString * content, NSError * error); void SetDelegate(RemoteDataModelLoggerDelegate * delegate); }; // namespace RemoteDataModelLogger diff --git a/examples/darwin-framework-tool/commands/common/RemoteDataModelLogger.mm b/examples/darwin-framework-tool/commands/common/RemoteDataModelLogger.mm index 760fe0bc998ed5..ff12cdc022e515 100644 --- a/examples/darwin-framework-tool/commands/common/RemoteDataModelLogger.mm +++ b/examples/darwin-framework-tool/commands/common/RemoteDataModelLogger.mm @@ -35,6 +35,7 @@ constexpr char kClusterErrorIdKey[] = "clusterError"; constexpr char kValueKey[] = "value"; constexpr char kNodeIdKey[] = "nodeId"; +constexpr char kLogContentIdKey[] = "logContent"; constexpr char kBase64Header[] = "base64:"; @@ -204,5 +205,33 @@ CHIP_ERROR LogGetCommissionerNodeId(NSNumber * value) return gDelegate->LogJSON(valueStr.c_str()); } +CHIP_ERROR LogBdxDownload(NSString * content, NSError * error) +{ + VerifyOrReturnError(gDelegate != nullptr, CHIP_NO_ERROR); + + Json::Value rootValue; + rootValue[kValueKey] = Json::Value(); + + Json::Value jsonValue; + VerifyOrDie(CHIP_NO_ERROR == AsJsonValue(content, jsonValue)); + rootValue[kValueKey][kLogContentIdKey] = jsonValue; + + if (error) { + auto err = MTRErrorToCHIPErrorCode(error); + auto status = chip::app::StatusIB(err); + +#if CHIP_CONFIG_IM_STATUS_CODE_VERBOSE_FORMAT + auto statusName = chip::Protocols::InteractionModel::StatusName(status.mStatus); + rootValue[kValueKey][kErrorIdKey] = statusName; +#else + auto statusName = status.mStatus; + rootValue[kValueKey][kErrorIdKey] = chip::to_underlying(statusName); +#endif // CHIP_CONFIG_IM_STATUS_CODE_VERBOSE_FORMAT + } + + auto valueStr = JsonToString(rootValue); + return gDelegate->LogJSON(valueStr.c_str()); +} + void SetDelegate(RemoteDataModelLoggerDelegate * delegate) { gDelegate = delegate; } }; // namespace RemoteDataModelLogger diff --git a/examples/darwin-framework-tool/commands/interactive/InteractiveCommands.mm b/examples/darwin-framework-tool/commands/interactive/InteractiveCommands.mm index ec0b48b6903fc1..abcde3f021cfcf 100644 --- a/examples/darwin-framework-tool/commands/interactive/InteractiveCommands.mm +++ b/examples/darwin-framework-tool/commands/interactive/InteractiveCommands.mm @@ -19,6 +19,7 @@ #include "InteractiveCommands.h" #include +#include #include #include @@ -72,7 +73,7 @@ void ClearLine() void ENFORCE_FORMAT(3, 0) LoggingCallback(const char * module, uint8_t category, const char * msg, va_list args) { ClearLine(); - chip::Logging::Platform::LogV(module, category, msg, args); + dft::logging::LogRedirectCallback(module, category, msg, args); ClearLine(); } @@ -244,7 +245,7 @@ void ENFORCE_FORMAT(3, 0) InteractiveServerLoggingCallback(const char * module, va_list args_copy; va_copy(args_copy, args); - chip::Logging::Platform::LogV(module, category, msg, args); + dft::logging::LogRedirectCallback(module, category, msg, args); char message[CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE]; vsnprintf(message, sizeof(message), msg, args_copy); diff --git a/examples/darwin-framework-tool/commands/tests/TestCommandBridge.h b/examples/darwin-framework-tool/commands/tests/TestCommandBridge.h deleted file mode 100644 index 0c87c96cfe65d1..00000000000000 --- a/examples/darwin-framework-tool/commands/tests/TestCommandBridge.h +++ /dev/null @@ -1,678 +0,0 @@ -/* - * Copyright (c) 2022 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 "../common/CHIPCommandBridge.h" -#include -#include -#include -#include -#include -#include -#include -#include - -#import - -#import "MTRDevice_Externs.h" -#import "MTRError_Utils.h" - -class TestCommandBridge; - -NS_ASSUME_NONNULL_BEGIN -namespace { -const char basePath[] = "./src/app/tests/suites/commands/delay/scripts/"; -const char * getScriptsFolder() { return basePath; } -} // namespace - -inline constexpr char kDefaultKey[] = "default"; - -@interface TestDeviceControllerDelegate : NSObject -@property TestCommandBridge * commandBridge; -@property chip::NodeId deviceId; -@property BOOL active; // Whether to pass on notifications to the commandBridge - -- (void)controller:(MTRDeviceController *)controller statusUpdate:(MTRCommissioningStatus)status; -- (void)controller:(MTRDeviceController *)controller commissioningSessionEstablishmentDone:(NSError * _Nullable)error; -- (void)controller:(MTRDeviceController *)controller commissioningComplete:(NSError * _Nullable)error; - -- (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithTestCommandBridge:(TestCommandBridge *)commandBridge; -@end - -NS_ASSUME_NONNULL_END - -inline constexpr uint16_t kTimeoutInSeconds = 90; - -class TestCommandBridge : public CHIPCommandBridge, - public ValueChecker, - public ConstraintsChecker, - public PICSChecker, - public LogCommands, - public SystemCommands { -public: - TestCommandBridge(const char * _Nonnull commandName) - : CHIPCommandBridge(commandName) - , mDeviceControllerDelegate([[TestDeviceControllerDelegate alloc] initWithTestCommandBridge:this]) - { - AddArgument("delayInMs", 0, UINT64_MAX, &mDelayInMs); - AddArgument("PICS", &mPICSFilePath); - } - - ~TestCommandBridge() {}; - - /////////// CHIPCommand Interface ///////// - CHIP_ERROR RunCommand() override - { - if (mPICSFilePath.HasValue()) { - PICS.SetValue(PICSBooleanReader::Read(mPICSFilePath.Value())); - } - - mCallbackQueue = dispatch_queue_create("com.chip-tool.command", DISPATCH_QUEUE_SERIAL); - - NextTest(); - return CHIP_NO_ERROR; - } - - chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(kTimeoutInSeconds); } - - virtual void NextTest() = 0; - - // Support for tests that asynchronously come up with a status of some - // sort. Subclasses are expected to compare the provided status to the - // expected status for the test. - virtual void OnStatusUpdate(const chip::app::StatusIB & status) = 0; - - void Exit(std::string message, CHIP_ERROR err = CHIP_ERROR_INTERNAL) override - { - ChipLogError(chipTool, " ***** Test Failure: %s\n", message.c_str()); - SetCommandExitStatus(err); - } - - /////////// DelayCommands ///////// - // This function is a modified version of the one in DelayCommands.cpp and is needed here in order to - // skip compilation of DelayCommands, which needs to link against SDK internals. - CHIP_ERROR WaitForMs( - const char * _Nullable identity, const chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type & value) - { - dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t) (value.ms * NSEC_PER_MSEC)); - dispatch_after(delayTime, mCallbackQueue, ^(void) { - NextTest(); - }); - return CHIP_NO_ERROR; - } - - // This function is identical to DelayCommands.cpp and is needed here in order to - // skip compilation of DelayCommands, which needs to link against SDK internals. - CHIP_ERROR WaitForMessage( - const char * _Nullable identity, const chip::app::Clusters::DelayCommands::Commands::WaitForMessage::Type & value) - { - VerifyOrReturnError(!value.message.empty(), CHIP_ERROR_INVALID_ARGUMENT); - - const char * scriptDir = getScriptsFolder(); - constexpr const char * scriptName = "WaitForMessage.py"; - const char * registerKeyValue = value.registerKey.HasValue() ? value.registerKey.Value().data() : kDefaultKey; - const size_t registerKeyLen = value.registerKey.HasValue() ? value.registerKey.Value().size() : strlen(kDefaultKey); - - char command[128]; - VerifyOrReturnError( - snprintf(command, sizeof(command), "%s%s %.*s %.*s", scriptDir, scriptName, static_cast(registerKeyLen), - registerKeyValue, static_cast(value.message.size()), value.message.data()) - >= 0, - CHIP_ERROR_INTERNAL); - return RunInternal(command); - } - - // This function is identical to DelayCommands.cpp and is needed here in order to - // skip compilation of DelayCommands, which needs to link against SDK internals. - CHIP_ERROR RunInternal(const char * _Nonnull command) - { - VerifyOrReturnError(system(command) == 0, CHIP_ERROR_INTERNAL); - return ContinueOnChipMainThread(CHIP_NO_ERROR); - } - - CHIP_ERROR WaitForCommissionee( - const char * _Nullable identity, const chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type & value) - { - MTRDeviceController * controller = GetCommissioner(identity); - VerifyOrReturnError(controller != nil, CHIP_ERROR_INCORRECT_STATE); - - SetIdentity(identity); - - // Invalidate our existing CASE session; otherwise trying to work with - // our device will just reuse it without establishing a new CASE - // session when a reboot is done on the server, and then our next - // interaction will time out. - if (value.expireExistingSession.ValueOr(true)) { - if (GetDevice(identity) != nil) { - [GetDevice(identity) invalidateCASESession]; - mConnectedDevices[identity] = nil; - } - } - - mConnectedDevices[identity] = [MTRBaseDevice deviceWithNodeID:@(value.nodeId) controller:controller]; - dispatch_async(mCallbackQueue, ^{ - NextTest(); - }); - return CHIP_NO_ERROR; - } - - /////////// CommissionerCommands-like Interface ///////// - CHIP_ERROR PairWithCode( - const char * _Nullable identity, const chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type & value) - { - MTRDeviceController * controller = GetCommissioner(identity); - VerifyOrReturnError(controller != nil, CHIP_ERROR_INCORRECT_STATE); - - SetIdentity(identity); - [controller setDeviceControllerDelegate:mDeviceControllerDelegate queue:mCallbackQueue]; - [mDeviceControllerDelegate setDeviceId:value.nodeId]; - [mDeviceControllerDelegate setActive:YES]; - - NSString * payloadStr = [[NSString alloc] initWithBytes:value.payload.data() - length:value.payload.size() - encoding:NSUTF8StringEncoding]; - NSError * err; - auto * payload = [MTRSetupPayload setupPayloadWithOnboardingPayload:payloadStr error:&err]; - if (err != nil) { - return MTRErrorToCHIPErrorCode(err); - } - BOOL ok = [controller setupCommissioningSessionWithPayload:payload newNodeID:@(value.nodeId) error:&err]; - if (ok == YES) { - return CHIP_NO_ERROR; - } - - return MTRErrorToCHIPErrorCode(err); - } - - CHIP_ERROR GetCommissionerNodeId(const char * _Nullable identity, - const chip::app::Clusters::CommissionerCommands::Commands::GetCommissionerNodeId::Type & value, - void (^_Nonnull OnResponse)(const chip::GetCommissionerNodeIdResponse &)) - { - auto * controller = GetCommissioner(identity); - VerifyOrReturnError(controller != nil, CHIP_ERROR_INCORRECT_STATE); - - auto id = [controller.controllerNodeId unsignedLongLongValue]; - ChipLogProgress(chipTool, "Commissioner Node Id: %llu", id); - - chip::GetCommissionerNodeIdResponse outValue; - outValue.nodeId = id; - - dispatch_async(mCallbackQueue, ^{ - OnResponse(outValue); - }); - - return CHIP_NO_ERROR; - } - - /////////// SystemCommands Interface ///////// - CHIP_ERROR ContinueOnChipMainThread(CHIP_ERROR err) override - { - if (CHIP_NO_ERROR == err) { - dispatch_async(mCallbackQueue, ^{ - NextTest(); - }); - } else { - Exit(chip::ErrorStr(err), err); - } - return CHIP_NO_ERROR; - } - - MTRBaseDevice * _Nullable GetDevice(const char * _Nullable identity) - { - SetIdentity(identity); - return mConnectedDevices[identity]; - } - - // PairingDeleted and PairingComplete need to be public so our pairing - // delegate can call them. - void PairingDeleted() - { - // This should not happen! - Exit("Unexpected deletion of pairing"); - } - - void PairingComplete(chip::NodeId nodeId) - { - MTRDeviceController * commissioner = CurrentCommissioner(); - VerifyOrReturn(commissioner != nil, Exit("No current commissioner")); - - NSError * commissionError = nil; - [commissioner commissionNodeWithID:@(nodeId) - commissioningParams:[[MTRCommissioningParameters alloc] init] - error:&commissionError]; - CHIP_ERROR err = MTRErrorToCHIPErrorCode(commissionError); - if (err != CHIP_NO_ERROR) { - Exit("Failed to kick off commissioning", err); - return; - } - } - -protected: - dispatch_queue_t _Nullable mCallbackQueue; - - void Wait() - { - if (mDelayInMs.HasValue()) { - chip::test_utils::SleepMillis(mDelayInMs.Value()); - } - }; - - chip::Optional mDelayInMs; - chip::Optional mPICSFilePath; - chip::Optional mEndpointId; - chip::Optional mTimeout; - - bool CheckConstraintStartsWith( - const char * _Nonnull itemName, const NSString * _Nonnull current, const char * _Nonnull expected) - { - const chip::CharSpan value([current UTF8String], [current lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); - return ConstraintsChecker::CheckConstraintStartsWith(itemName, value, expected); - } - - bool CheckConstraintEndsWith(const char * _Nonnull itemName, const NSString * _Nonnull current, const char * _Nonnull expected) - { - const chip::CharSpan value([current UTF8String], [current lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); - return ConstraintsChecker::CheckConstraintEndsWith(itemName, value, expected); - } - - bool CheckConstraintIsUpperCase(const char * _Nonnull itemName, const NSString * _Nonnull current, bool expectUpperCase) - { - const chip::CharSpan value([current UTF8String], [current lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); - return ConstraintsChecker::CheckConstraintIsUpperCase(itemName, value, expectUpperCase); - } - - bool CheckConstraintIsLowerCase(const char * _Nonnull itemName, const NSString * _Nonnull current, bool expectLowerCase) - { - const chip::CharSpan value([current UTF8String], [current lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); - return ConstraintsChecker::CheckConstraintIsLowerCase(itemName, value, expectLowerCase); - } - - bool CheckConstraintIsHexString(const char * _Nonnull itemName, const NSString * _Nonnull current, bool expectHexString) - { - const chip::CharSpan value([current UTF8String], [current lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); - return ConstraintsChecker::CheckConstraintIsHexString(itemName, value, expectHexString); - } - - template - bool CheckConstraintContains(const char * _Nonnull itemName, const NSArray * _Nonnull current, T expected) - { - for (id currentElement in current) { - if ([currentElement isEqualToNumber:@(expected)]) { - return true; - } - } - - Exit(std::string(itemName) + " expect the value " + std::to_string(expected) + " but the list does not contains it."); - return false; - } - - template - bool CheckConstraintExcludes(const char * _Nonnull itemName, const NSArray * _Nonnull current, T expected) - { - for (id currentElement in current) { - if ([currentElement isEqualToNumber:@(expected)]) { - Exit(std::string(itemName) + " does not expect the value " + std::to_string(expected) - + " but the list contains it."); - return false; - } - } - - return true; - } - - bool CheckConstraintNotValue( - const char * _Nonnull itemName, const NSString * _Nullable current, const NSString * _Nullable expected) - { - if (current == nil && expected == nil) { - Exit(std::string(itemName) + " got unexpected value. Both values are nil."); - return false; - } - if ((current == nil) != (expected == nil)) { - return true; - } - const chip::CharSpan currentValue([current UTF8String], [current lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); - const chip::CharSpan expectedValue([expected UTF8String], [expected lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); - return ConstraintsChecker::CheckConstraintNotValue(itemName, currentValue, expectedValue); - } - - bool CheckConstraintNotValue( - const char * _Nonnull itemName, const NSData * _Nullable current, const NSData * _Nullable expected) - { - if (current == nil && expected == nil) { - Exit(std::string(itemName) + " got unexpected value. Both values are nil."); - return false; - } - if ((current == nil) != (expected == nil)) { - return true; - } - const chip::ByteSpan currentValue(static_cast([current bytes]), [current length]); - const chip::ByteSpan expectedValue(static_cast([expected bytes]), [expected length]); - return ConstraintsChecker::CheckConstraintNotValue(itemName, currentValue, expectedValue); - } - - bool CheckConstraintNotValue(const char * _Nonnull itemName, const NSNumber * _Nullable current, NSNumber * _Nullable expected) - { - if (current == nil && expected == nil) { - Exit(std::string(itemName) + " got unexpected value. Both values are nil."); - return false; - } - if ((current == nil) != (expected == nil)) { - return true; - } - if ([current isEqualToNumber:expected]) { - Exit(std::string(itemName) + " got unexpected value: " + std::string([[current stringValue] UTF8String])); - return false; - } - - return true; - } - - template - bool CheckConstraintNotValue(const char * _Nonnull itemName, const NSNumber * _Nullable current, T expected) - { - return CheckConstraintNotValue(itemName, current, @(expected)); - } - - template - bool CheckConstraintNotValue(const char * _Nonnull itemName, NSError * _Nullable current, T expected) - { - NSNumber * currentValue = @(MTRErrorToCHIPErrorCode(current).AsInteger()); - return CheckConstraintNotValue(itemName, currentValue, @(expected)); - } - - using ConstraintsChecker::CheckConstraintMinLength; - - bool CheckConstraintMinLength(const char * _Nonnull itemName, NSString * _Nullable current, uint64_t expected) - { - if (current == nil) { - return true; - } - return CheckConstraintMinLength(itemName, [current length], expected); - } - - bool CheckConstraintMinLength(const char * _Nonnull itemName, NSArray * _Nullable current, uint64_t expected) - { - if (current == nil) { - return true; - } - return CheckConstraintMinLength(itemName, [current count], expected); - } - - using ConstraintsChecker::CheckConstraintMaxLength; - - bool CheckConstraintMaxLength(const char * _Nonnull itemName, NSString * _Nullable current, uint64_t expected) - { - if (current == nil) { - return true; - } - return CheckConstraintMaxLength(itemName, [current length], expected); - } - - bool CheckConstraintMaxLength(const char * _Nonnull itemName, NSArray * _Nullable current, uint64_t expected) - { - if (current == nil) { - return true; - } - return CheckConstraintMaxLength(itemName, [current count], expected); - } - - using ConstraintsChecker::CheckConstraintMinValue; - - // Used when the minValue is a saved variable, since ConstraintsChecker does - // not expect Core Foundation types. - template ::value && std::is_signed::value, int> = 0> - bool CheckConstraintMinValue(const char * _Nonnull itemName, T current, const NSNumber * _Nullable expected) - { - if (expected == nil) { - return true; - } - return ConstraintsChecker::CheckConstraintMinValue(itemName, current, [expected longLongValue]); - } - - template ::value && !std::is_signed::value, int> = 0> - bool CheckConstraintMinValue(const char * _Nonnull itemName, T current, const NSNumber * _Nullable expected) - { - if (expected == nil) { - return true; - } - return ConstraintsChecker::CheckConstraintMinValue(itemName, current, [expected unsignedLongLongValue]); - } - - template ::value, int> = 0> - bool CheckConstraintMinValue(const char * _Nonnull itemName, T current, const NSNumber * _Nullable expected) - { - if (expected == nil) { - return true; - } - return ConstraintsChecker::CheckConstraintMinValue(itemName, current, [expected doubleValue]); - } - - using ConstraintsChecker::CheckConstraintMaxValue; - - // Used when the maxValue is a saved variable, since ConstraintsChecker does - // not expect Core Foundation types. - template ::value && std::is_signed::value, int> = 0> - bool CheckConstraintMaxValue(const char * _Nonnull itemName, T current, const NSNumber * _Nullable expected) - { - if (expected == nil) { - return true; - } - return ConstraintsChecker::CheckConstraintMaxValue(itemName, current, [expected longLongValue]); - } - - template ::value && !std::is_signed::value, int> = 0> - bool CheckConstraintMaxValue(const char * _Nonnull itemName, T current, const NSNumber * _Nullable expected) - { - if (expected == nil) { - return true; - } - return ConstraintsChecker::CheckConstraintMaxValue(itemName, current, [expected unsignedLongLongValue]); - } - - template ::value, int> = 0> - bool CheckConstraintMaxValue(const char * _Nonnull itemName, T current, const NSNumber * _Nullable expected) - { - if (expected == nil) { - return true; - } - return ConstraintsChecker::CheckConstraintMaxValue(itemName, current, [expected doubleValue]); - } - - bool CheckConstraintHasValue(const char * _Nonnull itemName, id _Nullable current, bool shouldHaveValue) - { - if (shouldHaveValue && (current == nil)) { - Exit(std::string(itemName) + " expected to have a value but doesn't"); - return false; - } - - if (!shouldHaveValue && (current != nil)) { - Exit(std::string(itemName) + " not expected to have a value but does"); - return false; - } - - return true; - } - - bool CheckValueAsString(const char * _Nonnull itemName, const id _Nonnull current, const NSString * _Nonnull expected) - { - NSString * data = current; - const chip::CharSpan currentValue([data UTF8String], [data lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); - const chip::CharSpan expectedValue([expected UTF8String], [expected lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); - return ValueChecker::CheckValueAsString(itemName, currentValue, expectedValue); - } - - bool CheckValueAsString(const char * _Nonnull itemName, const id _Nonnull current, const NSData * _Nonnull expected) - { - NSData * data = current; - const chip::ByteSpan currentValue(static_cast([data bytes]), [data length]); - const chip::ByteSpan expectedValue(static_cast([expected bytes]), [expected length]); - return ValueChecker::CheckValueAsString(itemName, currentValue, expectedValue); - } - - bool CheckValue(const char * _Nonnull itemName, NSNumber * _Nonnull current, NSNumber * _Nonnull expected) - { - if (![current isEqualToNumber:expected]) { - Exit(std::string(itemName) + " value mismatch: expected " + std::string([[expected stringValue] UTF8String]) - + " but got " + std::string([[current stringValue] UTF8String])); - return false; - } - - return true; - } - - bool CheckValue(const char * _Nonnull itemName, id _Nonnull current, NSNumber * _Nonnull expected) - { - NSNumber * currentValue = current; - return CheckValue(itemName, currentValue, expected); - } - - template - bool CheckValue(const char * _Nonnull itemName, NSNumber * _Nonnull current, T expected) - { - return CheckValue(itemName, current, @(expected)); - } - - template - bool CheckValue(const char * _Nonnull itemName, id _Nonnull current, T expected) - { - NSNumber * currentValue = current; - return CheckValue(itemName, currentValue, @(expected)); - } - - template - bool CheckValue(const char * _Nonnull itemName, NSError * _Nullable current, T expected) - { - - NSNumber * currentValue = @(current.code); - return CheckValue(itemName, currentValue, @(expected)); - } - - template - bool CheckValue(const char * _Nonnull itemName, T current, U expected) - { - - return ValueChecker::CheckValue(itemName, current, expected); - } - - bool CheckValueNonNull(const char * _Nonnull itemName, id _Nullable current) - { - if (current != nil) { - return true; - } - - Exit(std::string(itemName) + " expected to not be null but is"); - return false; - } - - bool CheckValueNull(const char * _Nonnull itemName, id _Nullable current) - { - if (current == nil) { - return true; - } - - Exit(std::string(itemName) + " expected to be null but isn't"); - return false; - } - -private: - TestDeviceControllerDelegate * _Nonnull mDeviceControllerDelegate; - - // Set of our connected devices, keyed by identity. - std::map mConnectedDevices; -}; - -NS_ASSUME_NONNULL_BEGIN - -@implementation TestDeviceControllerDelegate -- (void)controller:(MTRDeviceController *)controller statusUpdate:(MTRCommissioningStatus)status -{ - if (_active) { - if (status == MTRCommissioningStatusSuccess) { - NSLog(@"Secure pairing success"); - } else if (status == MTRCommissioningStatusFailed) { - _active = NO; - NSLog(@"Secure pairing failed"); - _commandBridge->OnStatusUpdate(chip::app::StatusIB(chip::Protocols::InteractionModel::Status::Failure)); - } - } -} - -- (void)controller:(MTRDeviceController *)controller commissioningSessionEstablishmentDone:(NSError * _Nullable)error -{ - if (_active) { - if (error != nil) { - _active = NO; - NSLog(@"Pairing complete with error"); - CHIP_ERROR err = MTRErrorToCHIPErrorCode(error); - _commandBridge->OnStatusUpdate([self convertToStatusIB:err]); - } else { - _commandBridge->PairingComplete(_deviceId); - } - } -} - -- (void)controller:(MTRDeviceController *)controller commissioningComplete:(NSError * _Nullable)error -{ - if (_active) { - _active = NO; - CHIP_ERROR err = MTRErrorToCHIPErrorCode(error); - _commandBridge->OnStatusUpdate([self convertToStatusIB:err]); - } -} - -- (chip::app::StatusIB)convertToStatusIB:(CHIP_ERROR)err -{ - using chip::app::StatusIB; - using namespace chip; - using namespace chip::Protocols::InteractionModel; - using namespace chip::app::Clusters::OperationalCredentials; - - if (CHIP_ERROR_INVALID_PUBLIC_KEY == err) { - return StatusIB(Status::Failure, to_underlying(NodeOperationalCertStatusEnum::kInvalidPublicKey)); - } - if (CHIP_ERROR_WRONG_NODE_ID == err) { - return StatusIB(Status::Failure, to_underlying(NodeOperationalCertStatusEnum::kInvalidNodeOpId)); - } - if (CHIP_ERROR_UNSUPPORTED_CERT_FORMAT == err) { - return StatusIB(Status::Failure, to_underlying(NodeOperationalCertStatusEnum::kInvalidNOC)); - } - if (CHIP_ERROR_FABRIC_EXISTS == err) { - return StatusIB(Status::Failure, to_underlying(NodeOperationalCertStatusEnum::kFabricConflict)); - } - if (CHIP_ERROR_INVALID_FABRIC_INDEX == err) { - return StatusIB(Status::Failure, to_underlying(NodeOperationalCertStatusEnum::kInvalidFabricIndex)); - } - - return StatusIB(err); -} - -- (instancetype)initWithTestCommandBridge:(TestCommandBridge *)commandBridge -{ - if (!(self = [super init])) { - return nil; - } - - _commandBridge = commandBridge; - _active = NO; - return self; -} -@end - -NS_ASSUME_NONNULL_END diff --git a/examples/darwin-framework-tool/logging/logging.h b/examples/darwin-framework-tool/logging/logging.h index 0380286dda4f7c..cf6830a140d7f9 100644 --- a/examples/darwin-framework-tool/logging/logging.h +++ b/examples/darwin-framework-tool/logging/logging.h @@ -20,6 +20,7 @@ namespace dft { namespace logging { void Setup(); +void LogRedirectCallback(const char * moduleName, uint8_t category, const char * format, va_list args); -} +} // namespace logging } // namespace dft diff --git a/examples/dishwasher-app/dishwasher-common/include/operational-state-delegate-impl.h b/examples/dishwasher-app/dishwasher-common/include/operational-state-delegate-impl.h index 9fd023db8194d9..5f017119930e5e 100644 --- a/examples/dishwasher-app/dishwasher-common/include/operational-state-delegate-impl.h +++ b/examples/dishwasher-app/dishwasher-common/include/operational-state-delegate-impl.h @@ -20,7 +20,7 @@ #include #include -#include + #include namespace chip { 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 f593b52d3ab71e..1ab71d2cc0769d 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 @@ -1893,6 +1893,9 @@ endpoint 1 { callback attribute powerMode; callback attribute numberOfMeasurementTypes; callback attribute accuracy; + callback attribute ranges; + callback attribute voltage; + callback attribute activeCurrent; callback attribute activePower; callback attribute generatedCommandList; callback attribute acceptedCommandList; @@ -1904,8 +1907,13 @@ endpoint 1 { server cluster ElectricalEnergyMeasurement { emits event CumulativeEnergyMeasured; + emits event PeriodicEnergyMeasured; callback attribute accuracy; callback attribute cumulativeEnergyImported; + callback attribute cumulativeEnergyExported; + callback attribute periodicEnergyImported; + callback attribute periodicEnergyExported; + callback attribute cumulativeEnergyReset; 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 ed18c81d0738e5..ba1fa29d585485 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 @@ -1719,10 +1719,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -1735,10 +1735,10 @@ "side": "server", "type": "int16u", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "1", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2812,7 +2812,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2828,7 +2828,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2844,12 +2844,60 @@ "storageOption": "External", "singleton": 0, "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Ranges", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, "defaultValue": "", "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 }, + { + "name": "Voltage", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "voltage_mv", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveCurrent", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "amperage_ma", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "ActivePower", "code": 8, @@ -2860,7 +2908,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2876,7 +2924,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2892,7 +2940,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2908,7 +2956,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2924,7 +2972,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2940,7 +2988,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3005,6 +3053,70 @@ "maxInterval": 65534, "reportableChange": 0 }, + { + "name": "CumulativeEnergyExported", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "EnergyMeasurementStruct", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PeriodicEnergyImported", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "EnergyMeasurementStruct", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PeriodicEnergyExported", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "EnergyMeasurementStruct", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CumulativeEnergyReset", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "CumulativeEnergyResetStruct", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "GeneratedCommandList", "code": 65528, @@ -3109,6 +3221,13 @@ "mfgCode": null, "side": "server", "included": 1 + }, + { + "name": "PeriodicEnergyMeasured", + "code": 1, + "mfgCode": null, + "side": "server", + "included": 1 } ] }, diff --git a/examples/energy-management-app/energy-management-common/include/EVSEManufacturerImpl.h b/examples/energy-management-app/energy-management-common/include/EVSEManufacturerImpl.h index f1c3eac6f60dc9..fcae38dcafd2b5 100644 --- a/examples/energy-management-app/energy-management-common/include/EVSEManufacturerImpl.h +++ b/examples/energy-management-app/energy-management-common/include/EVSEManufacturerImpl.h @@ -19,6 +19,7 @@ #pragma once #include +#include #include using chip::Protocols::InteractionModel::Status; @@ -34,13 +35,29 @@ namespace EnergyEvse { class EVSEManufacturer { public: - EVSEManufacturer(EnergyEvseManager * aInstance) { mInstance = aInstance; } - EnergyEvseManager * GetInstance() { return mInstance; } - EnergyEvseDelegate * GetDelegate() + EVSEManufacturer(EnergyEvseManager * aEvseInstance, + ElectricalPowerMeasurement::ElectricalPowerMeasurementInstance * aEPMInstance) { - if (mInstance) + mEvseInstance = aEvseInstance; + mEPMInstance = aEPMInstance; + } + EnergyEvseManager * GetEvseInstance() { return mEvseInstance; } + ElectricalPowerMeasurement::ElectricalPowerMeasurementInstance * GetEPMInstance() { return mEPMInstance; } + + EnergyEvseDelegate * GetEvseDelegate() + { + if (mEvseInstance) + { + return mEvseInstance->GetDelegate(); + } + return nullptr; + } + + ElectricalPowerMeasurement::ElectricalPowerMeasurementDelegate * GetEPMDelegate() + { + if (mEPMInstance) { - return mInstance->GetDelegate(); + return mEPMInstance->GetDelegate(); } return nullptr; } @@ -60,25 +77,42 @@ class EVSEManufacturer */ static void ApplicationCallbackHandler(const EVSECbInfo * cb, intptr_t arg); + /** + * @brief Allows a client application to initialise the Accuracy, Measurement types etc + */ + CHIP_ERROR InitializePowerMeasurementCluster(); + /** * @brief Allows a client application to send in power readings into the system * - * @param[in] aEndpointId - Endpoint to send to EPM Cluster - * @param[in] aActivePower_mW - Power measured in milli-watts - * @param[in] aVoltage_mV - Voltage measured in milli-volts - * @param[in] aCurrent_mA - Current measured in milli-amps + * @param[in] aEndpointId - Endpoint to send to EPM Cluster + * @param[in] aActivePower_mW - ActivePower measured in milli-watts + * @param[in] aVoltage_mV - Voltage measured in milli-volts + * @param[in] aActiveCurrent_mA - ActiveCurrent measured in milli-amps */ CHIP_ERROR SendPowerReading(EndpointId aEndpointId, int64_t aActivePower_mW, int64_t aVoltage_mV, int64_t aCurrent_mA); /** - * @brief Allows a client application to send in energy readings into the system + * @brief Allows a client application to send cumulative energy readings into the system * * This is a helper function to add timestamps to the readings * * @param[in] aCumulativeEnergyImported -total energy imported in milli-watthours * @param[in] aCumulativeEnergyExported -total energy exported in milli-watthours */ - CHIP_ERROR SendEnergyReading(EndpointId aEndpointId, int64_t aCumulativeEnergyImported, int64_t aCumulativeEnergyExported); + CHIP_ERROR SendCumulativeEnergyReading(EndpointId aEndpointId, int64_t aCumulativeEnergyImported, + int64_t aCumulativeEnergyExported); + + /** + * @brief Allows a client application to send periodic energy readings into the system + * + * This is a helper function to add timestamps to the readings + * + * @param[in] aPeriodicEnergyImported - energy imported in milli-watthours in last period + * @param[in] aPeriodicEnergyExported - energy exported in milli-watthours in last period + */ + CHIP_ERROR SendPeriodicEnergyReading(EndpointId aEndpointId, int64_t aCumulativeEnergyImported, + int64_t aCumulativeEnergyExported); /** Fake Meter data generation - used for testing EPM/EEM clusters */ /** @@ -88,14 +122,20 @@ class EVSEManufacturer * @param[in] aPower_mW - the mean power of the load * Positive power indicates Imported energy (e.g. a load) * Negative power indicated Exported energy (e.g. a generator) - * @param[in] aPowerRandomness_mW This is used to scale random power fluctuations around the mean power of the load - * + * @param[in] aPowerRandomness_mW This is used to define the max randomness of the + * random power values around the mean power of the load + * @param[in] aVoltage_mV - the nominal voltage measurement + * @param[in] aVoltageRandomness_mV This is used to define the max randomness of the + * random voltage values + * @param[in] aCurrent_mA - the nominal current measurement + * @param[in] aCurrentRandomness_mA This is used to define the max randomness of the + * random current values * @param[in] aInterval_s - the callback interval in seconds * @param[in] bReset - boolean: true will reset the energy values to 0 */ - void StartFakeReadings(EndpointId aEndpointId, int64_t aPower_mW, uint32_t aPowerRandomness_mW, uint8_t aInterval_s, + void StartFakeReadings(EndpointId aEndpointId, int64_t aPower_mW, uint32_t aPowerRandomness_mW, int64_t aVoltage_mV, + uint32_t aVoltageRandomness_mV, int64_t aCurrent_mA, uint32_t aCurrentRandomness_mA, uint8_t aInterval_s, bool bReset); - /** * @brief Stops any active updates to the fake load data callbacks */ @@ -111,7 +151,8 @@ class EVSEManufacturer static void FakeReadingsTimerExpiry(System::Layer * systemLayer, void * manufacturer); private: - EnergyEvseManager * mInstance; + EnergyEvseManager * mEvseInstance; + ElectricalPowerMeasurement::ElectricalPowerMeasurementInstance * mEPMInstance; int64_t mLastChargingEnergyMeter = 0; int64_t mLastDischargingEnergyMeter = 0; diff --git a/examples/energy-management-app/energy-management-common/include/ElectricalPowerMeasurementDelegate.h b/examples/energy-management-app/energy-management-common/include/ElectricalPowerMeasurementDelegate.h new file mode 100644 index 00000000000000..d6fd4e72928203 --- /dev/null +++ b/examples/energy-management-app/energy-management-common/include/ElectricalPowerMeasurementDelegate.h @@ -0,0 +1,138 @@ +/* + * + * 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 +#include + +namespace chip { +namespace app { +namespace Clusters { +namespace ElectricalPowerMeasurement { + +class ElectricalPowerMeasurementDelegate : public ElectricalPowerMeasurement::Delegate +{ +public: + ~ElectricalPowerMeasurementDelegate() = default; + + static constexpr uint8_t kMaxNumberOfMeasurementTypes = 14; // From spec + static constexpr uint8_t kDefaultNumberOfMeasurementTypes = 1; + + // Attribute Accessors + PowerModeEnum GetPowerMode() override { return mPowerMode; } + uint8_t GetNumberOfMeasurementTypes() override; + + /* These functions are called by the ReadAttribute handler to iterate through lists + * The cluster server will call StartRead to allow the delegate to create a temporary + * lock on the data. + * The delegate is expected to not change these values once StartRead has been called + * until the EndRead() has been called (e.g. releasing a lock on the data) + */ + CHIP_ERROR StartAccuracyRead() override; + CHIP_ERROR GetAccuracyByIndex(uint8_t, Structs::MeasurementAccuracyStruct::Type &) override; + CHIP_ERROR EndAccuracyRead() override; + + CHIP_ERROR StartRangesRead() override; + CHIP_ERROR GetRangeByIndex(uint8_t, Structs::MeasurementRangeStruct::Type &) override; + CHIP_ERROR EndRangesRead() override; + + CHIP_ERROR StartHarmonicCurrentsRead() override; + CHIP_ERROR GetHarmonicCurrentsByIndex(uint8_t, Structs::HarmonicMeasurementStruct::Type &) override; + CHIP_ERROR EndHarmonicCurrentsRead() override; + + CHIP_ERROR StartHarmonicPhasesRead() override; + CHIP_ERROR GetHarmonicPhasesByIndex(uint8_t, Structs::HarmonicMeasurementStruct::Type &) override; + CHIP_ERROR EndHarmonicPhasesRead() override; + + DataModel::Nullable GetVoltage() override { return mVoltage; } + DataModel::Nullable GetActiveCurrent() override { return mActiveCurrent; } + DataModel::Nullable GetReactiveCurrent() override { return mReactiveCurrent; } + DataModel::Nullable GetApparentCurrent() override { return mApparentCurrent; } + DataModel::Nullable GetActivePower() override { return mActivePower; } + DataModel::Nullable GetReactivePower() override { return mReactivePower; } + DataModel::Nullable GetApparentPower() override { return mApparentPower; } + DataModel::Nullable GetRMSVoltage() override { return mRMSVoltage; } + DataModel::Nullable GetRMSCurrent() override { return mRMSCurrent; } + DataModel::Nullable GetRMSPower() override { return mRMSPower; } + DataModel::Nullable GetFrequency() override { return mFrequency; } + DataModel::Nullable GetPowerFactor() override { return mPowerFactor; } + DataModel::Nullable GetNeutralCurrent() override { return mNeutralCurrent; }; + + // Internal Application API to set attribute values + CHIP_ERROR SetPowerMode(PowerModeEnum); + CHIP_ERROR SetVoltage(DataModel::Nullable); + CHIP_ERROR SetActiveCurrent(DataModel::Nullable); + CHIP_ERROR SetReactiveCurrent(DataModel::Nullable); + CHIP_ERROR SetApparentCurrent(DataModel::Nullable); + CHIP_ERROR SetActivePower(DataModel::Nullable); + CHIP_ERROR SetReactivePower(DataModel::Nullable); + CHIP_ERROR SetApparentPower(DataModel::Nullable); + CHIP_ERROR SetRMSVoltage(DataModel::Nullable); + CHIP_ERROR SetRMSCurrent(DataModel::Nullable); + CHIP_ERROR SetRMSPower(DataModel::Nullable); + CHIP_ERROR SetFrequency(DataModel::Nullable); + CHIP_ERROR SetPowerFactor(DataModel::Nullable); + CHIP_ERROR SetNeutralCurrent(DataModel::Nullable); + +private: + // Attribute storage + PowerModeEnum mPowerMode; + DataModel::Nullable mVoltage; + DataModel::Nullable mActiveCurrent; + DataModel::Nullable mReactiveCurrent; + DataModel::Nullable mApparentCurrent; + DataModel::Nullable mActivePower; + DataModel::Nullable mReactivePower; + DataModel::Nullable mApparentPower; + DataModel::Nullable mRMSVoltage; + DataModel::Nullable mRMSCurrent; + DataModel::Nullable mRMSPower; + DataModel::Nullable mFrequency; + DataModel::Nullable mPowerFactor; + DataModel::Nullable mNeutralCurrent; +}; + +class ElectricalPowerMeasurementInstance : public Instance +{ +public: + ElectricalPowerMeasurementInstance(EndpointId aEndpointId, ElectricalPowerMeasurementDelegate & aDelegate, Feature aFeature, + OptionalAttributes aOptionalAttributes) : + ElectricalPowerMeasurement::Instance(aEndpointId, aDelegate, aFeature, aOptionalAttributes) + { + mDelegate = &aDelegate; + } + + // Delete copy constructor and assignment operator. + ElectricalPowerMeasurementInstance(const ElectricalPowerMeasurementInstance &) = delete; + ElectricalPowerMeasurementInstance(const ElectricalPowerMeasurementInstance &&) = delete; + ElectricalPowerMeasurementInstance & operator=(const ElectricalPowerMeasurementInstance &) = delete; + + CHIP_ERROR Init(); + void Shutdown(); + + ElectricalPowerMeasurementDelegate * GetDelegate() { return mDelegate; }; + +private: + ElectricalPowerMeasurementDelegate * mDelegate; +}; + +} // namespace ElectricalPowerMeasurement +} // namespace Clusters +} // namespace app +} // namespace chip diff --git a/examples/energy-management-app/energy-management-common/src/EnergyManagementManager.cpp b/examples/energy-management-app/energy-management-common/include/EnergyEvseMain.h similarity index 83% rename from examples/energy-management-app/energy-management-common/src/EnergyManagementManager.cpp rename to examples/energy-management-app/energy-management-common/include/EnergyEvseMain.h index 884a5bcf5b65ce..2e7e29537ef3b4 100644 --- a/examples/energy-management-app/energy-management-common/src/EnergyManagementManager.cpp +++ b/examples/energy-management-app/energy-management-common/include/EnergyEvseMain.h @@ -1,7 +1,6 @@ /* * - * Copyright (c) 2023 Project CHIP Authors - * Copyright (c) 2019 Google LLC. + * Copyright (c) 2024 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,3 +15,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +#pragma once + +void EvseApplicationInit(); +void EvseApplicationShutdown(); diff --git a/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp b/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp index 28c6b8942ff493..c918d3a729d3a4 100644 --- a/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp +++ b/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp @@ -18,8 +18,6 @@ #include "DeviceEnergyManagementDelegateImpl.h" -#include -#include #include using namespace chip; diff --git a/examples/energy-management-app/energy-management-common/src/EVSEManufacturerImpl.cpp b/examples/energy-management-app/energy-management-common/src/EVSEManufacturerImpl.cpp index 16d3a35b0a30b4..cb7a7a44991e16 100644 --- a/examples/energy-management-app/energy-management-common/src/EVSEManufacturerImpl.cpp +++ b/examples/energy-management-app/energy-management-common/src/EVSEManufacturerImpl.cpp @@ -21,11 +21,14 @@ #include #include #include +#include using namespace chip; using namespace chip::app; +using namespace chip::app::DataModel; using namespace chip::app::Clusters; using namespace chip::app::Clusters::EnergyEvse; +using namespace chip::app::Clusters::ElectricalPowerMeasurement; using namespace chip::app::Clusters::ElectricalEnergyMeasurement; using namespace chip::app::Clusters::ElectricalEnergyMeasurement::Structs; @@ -34,7 +37,7 @@ CHIP_ERROR EVSEManufacturer::Init() /* Manufacturers should modify this to do any custom initialisation */ /* Register callbacks */ - EnergyEvseDelegate * dg = GetEvseManufacturer()->GetDelegate(); + EnergyEvseDelegate * dg = GetEvseManufacturer()->GetEvseDelegate(); if (dg == nullptr) { ChipLogError(AppServer, "EVSE Delegate is not initialized"); @@ -43,6 +46,8 @@ CHIP_ERROR EVSEManufacturer::Init() dg->HwRegisterEvseCallbackHandler(ApplicationCallbackHandler, reinterpret_cast(this)); + ReturnErrorOnFailure(InitializePowerMeasurementCluster()); + /* * This is an example implementation for manufacturers to consider * @@ -66,12 +71,8 @@ CHIP_ERROR EVSEManufacturer::Init() * When the EV is plugged in, and asking for demand change the state * and set the CableAssembly current limit * - * EnergyEvseDelegate * dg = GetEvseManufacturer()->GetDelegate(); - * if (dg == nullptr) - * { - * ChipLogError(AppServer, "Delegate is not initialized"); - * return CHIP_ERROR_UNINITIALIZED; - * } + * EnergyEvseDelegate * dg = GetEvseManufacturer()->GetEvseDelegate(); + * VerifyOrReturnError(dg != nullptr, CHIP_ERROR_UNINITIALIZED); * * dg->HwSetState(StateEnum::kPluggedInDemand); * dg->HwSetCableAssemblyLimit(63000); // 63A = 63000mA @@ -93,68 +94,109 @@ CHIP_ERROR EVSEManufacturer::Shutdown() return CHIP_NO_ERROR; } +/** + * @brief Allows a client application to initialise the Accuracy, Measurement types etc + */ +CHIP_ERROR EVSEManufacturer::InitializePowerMeasurementCluster() +{ + EVSEManufacturer * mn = GetEvseManufacturer(); + VerifyOrReturnError(mn != nullptr, CHIP_ERROR_UNINITIALIZED); + + ElectricalPowerMeasurementDelegate * dg = mn->GetEPMDelegate(); + VerifyOrReturnError(dg != nullptr, CHIP_ERROR_UNINITIALIZED); + + ReturnErrorOnFailure(dg->SetPowerMode(PowerModeEnum::kAc)); + + return CHIP_NO_ERROR; +} + /** * @brief Allows a client application to send in power readings into the system * - * @param[in] aEndpointId - Endpoint to send to EPM Cluster - * @param[in] aActivePower_mW - Power measured in milli-watts - * @param[in] aVoltage_mV - Voltage measured in milli-volts - * @param[in] aCurrent_mA - Current measured in milli-amps + * @param[in] aEndpointId - Endpoint to send to EPM Cluster + * @param[in] aActivePower_mW - ActivePower measured in milli-watts + * @param[in] aVoltage_mV - Voltage measured in milli-volts + * @param[in] aActiveCurrent_mA - ActiveCurrent measured in milli-amps */ CHIP_ERROR EVSEManufacturer::SendPowerReading(EndpointId aEndpointId, int64_t aActivePower_mW, int64_t aVoltage_mV, - int64_t aCurrent_mA) + int64_t aActiveCurrent_mA) { - // TODO add Power Readings when EPM cluster is merged + EVSEManufacturer * mn = GetEvseManufacturer(); + VerifyOrReturnError(mn != nullptr, CHIP_ERROR_UNINITIALIZED); + + ElectricalPowerMeasurementDelegate * dg = mn->GetEPMDelegate(); + VerifyOrReturnError(dg != nullptr, CHIP_ERROR_UNINITIALIZED); + + dg->SetActivePower(MakeNullable(aActivePower_mW)); + dg->SetVoltage(MakeNullable(aVoltage_mV)); + dg->SetActiveCurrent(MakeNullable(aActiveCurrent_mA)); return CHIP_NO_ERROR; } /** - * @brief Allows a client application to send in energy readings into the system + * @brief Allows a client application to send cumulative energy readings into the system * * This is a helper function to add timestamps to the readings * * @param[in] aCumulativeEnergyImported -total energy imported in milli-watthours * @param[in] aCumulativeEnergyExported -total energy exported in milli-watthours */ -CHIP_ERROR EVSEManufacturer::SendEnergyReading(EndpointId aEndpointId, int64_t aCumulativeEnergyImported, - int64_t aCumulativeEnergyExported) +CHIP_ERROR EVSEManufacturer::SendCumulativeEnergyReading(EndpointId aEndpointId, int64_t aCumulativeEnergyImported, + int64_t aCumulativeEnergyExported) { MeasurementData * data = MeasurementDataForEndpoint(aEndpointId); + VerifyOrReturnError(data != nullptr, CHIP_ERROR_UNINITIALIZED); EnergyMeasurementStruct::Type energyImported; EnergyMeasurementStruct::Type energyExported; - // Get current timestamp - uint32_t currentTimestamp; - CHIP_ERROR err = GetEpochTS(currentTimestamp); - if (err != CHIP_NO_ERROR) - { - ChipLogError(AppServer, "GetEpochTS returned error getting timestamp"); - return err; - } - /** IMPORT */ // Copy last endTimestamp into new startTimestamp if it exists energyImported.startTimestamp.ClearValue(); + energyImported.startSystime.ClearValue(); if (data->cumulativeImported.HasValue()) { energyImported.startTimestamp = data->cumulativeImported.Value().endTimestamp; + energyImported.startSystime = data->cumulativeImported.Value().endSystime; } - energyImported.endTimestamp.SetValue(currentTimestamp); energyImported.energy = aCumulativeEnergyImported; /** EXPORT */ // Copy last endTimestamp into new startTimestamp if it exists energyExported.startTimestamp.ClearValue(); + energyExported.startSystime.ClearValue(); if (data->cumulativeExported.HasValue()) { energyExported.startTimestamp = data->cumulativeExported.Value().endTimestamp; + energyExported.startSystime = data->cumulativeExported.Value().endSystime; } - energyExported.endTimestamp.SetValue(currentTimestamp); + energyExported.energy = aCumulativeEnergyExported; + // Get current timestamp + uint32_t currentTimestamp; + CHIP_ERROR err = GetEpochTS(currentTimestamp); + if (err == CHIP_NO_ERROR) + { + // use EpochTS + energyImported.endTimestamp.SetValue(currentTimestamp); + energyExported.endTimestamp.SetValue(currentTimestamp); + } + else + { + ChipLogError(AppServer, "GetEpochTS returned error getting timestamp %" CHIP_ERROR_FORMAT, err.Format()); + + // use systemTime as a fallback + System::Clock::Milliseconds64 system_time_ms = + std::chrono::duration_cast(chip::Server::GetInstance().TimeSinceInit()); + uint64_t nowMS = static_cast(system_time_ms.count()); + + energyImported.endSystime.SetValue(nowMS); + energyExported.endSystime.SetValue(nowMS); + } + // call the SDK to update attributes and generate an event if (!NotifyCumulativeEnergyMeasured(aEndpointId, MakeOptional(energyImported), MakeOptional(energyExported))) { @@ -165,17 +207,97 @@ CHIP_ERROR EVSEManufacturer::SendEnergyReading(EndpointId aEndpointId, int64_t a return CHIP_NO_ERROR; } +/** + * @brief Allows a client application to send periodic energy readings into the system + * + * This is a helper function to add timestamps to the readings + * + * @param[in] aPeriodicEnergyImported - energy imported in milli-watthours in last period + * @param[in] aPeriodicEnergyExported - energy exported in milli-watthours in last period + */ +CHIP_ERROR EVSEManufacturer::SendPeriodicEnergyReading(EndpointId aEndpointId, int64_t aPeriodicEnergyImported, + int64_t aPeriodicEnergyExported) +{ + MeasurementData * data = MeasurementDataForEndpoint(aEndpointId); + VerifyOrReturnError(data != nullptr, CHIP_ERROR_UNINITIALIZED); + + EnergyMeasurementStruct::Type energyImported; + EnergyMeasurementStruct::Type energyExported; + + /** IMPORT */ + // Copy last endTimestamp into new startTimestamp if it exists + energyImported.startTimestamp.ClearValue(); + energyImported.startSystime.ClearValue(); + if (data->periodicImported.HasValue()) + { + energyImported.startTimestamp = data->periodicImported.Value().endTimestamp; + energyImported.startSystime = data->periodicImported.Value().endSystime; + } + + energyImported.energy = aPeriodicEnergyImported; + + /** EXPORT */ + // Copy last endTimestamp into new startTimestamp if it exists + energyExported.startTimestamp.ClearValue(); + energyExported.startSystime.ClearValue(); + if (data->periodicExported.HasValue()) + { + energyExported.startTimestamp = data->periodicExported.Value().endTimestamp; + energyExported.startSystime = data->periodicExported.Value().endSystime; + } + + energyExported.energy = aPeriodicEnergyExported; + + // Get current timestamp + uint32_t currentTimestamp; + CHIP_ERROR err = GetEpochTS(currentTimestamp); + if (err == CHIP_NO_ERROR) + { + // use EpochTS + energyImported.endTimestamp.SetValue(currentTimestamp); + energyExported.endTimestamp.SetValue(currentTimestamp); + } + else + { + ChipLogError(AppServer, "GetEpochTS returned error getting timestamp"); + + // use systemTime as a fallback + System::Clock::Milliseconds64 system_time_ms = + std::chrono::duration_cast(chip::Server::GetInstance().TimeSinceInit()); + uint64_t nowMS = static_cast(system_time_ms.count()); + + energyImported.endSystime.SetValue(nowMS); + energyExported.endSystime.SetValue(nowMS); + } + + // call the SDK to update attributes and generate an event + if (!NotifyPeriodicEnergyMeasured(aEndpointId, MakeOptional(energyImported), MakeOptional(energyExported))) + { + ChipLogError(AppServer, "Failed to notify Cumulative Energy reading."); + return CHIP_ERROR_INTERNAL; + } + + return CHIP_NO_ERROR; +} + struct FakeReadingsData { - bool bEnabled; /* If enabled then the timer callback will re-trigger */ - EndpointId mEndpointId; /* Which endpoint the meter is on */ - uint8_t mInterval_s; /* Interval in seconds to callback */ - int64_t mPower_mW; /* Power on the load in mW (signed value) +ve = imported */ - uint32_t mPowerRandomness_mW; /* The amount to randomize the Power on the load in mW */ + bool bEnabled; /* If enabled then the timer callback will re-trigger */ + EndpointId mEndpointId; /* Which endpoint the meter is on */ + uint8_t mInterval_s; /* Interval in seconds to callback */ + int64_t mPower_mW; /* Active Power on the load in mW (signed value) +ve = imported */ + uint32_t mPowerRandomness_mW; /* The amount to randomize the Power on the load in mW */ + int64_t mVoltage_mV; /* Voltage reading in mV (signed value) */ + uint32_t mVoltageRandomness_mV; /* The amount to randomize the Voltage in mV */ + int64_t mCurrent_mA; /* ActiveCurrent reading in mA (signed value) */ + uint32_t mCurrentRandomness_mA; /* The amount to randomize the ActiveCurrent in mA */ + /* These energy values can only be positive values. * however the underlying energy type (power_mWh) is signed, so keeping with that convention */ - int64_t mTotalEnergyImported = 0; /* Energy Imported which is updated if mPower > 0 */ - int64_t mTotalEnergyExported = 0; /* Energy Imported which is updated if mPower < 0 */ + int64_t mTotalEnergyImported = 0; /* Cumulative Energy Imported which is updated if mPower > 0 */ + int64_t mTotalEnergyExported = 0; /* Cumulative Energy Imported which is updated if mPower < 0 */ + int64_t mPeriodicEnergyImported = 0; /* Periodic Energy Imported which is updated if mPower > 0 */ + int64_t mPeriodicEnergyExported = 0; /* Periodic Energy Imported which is updated if mPower < 0 */ }; static FakeReadingsData gFakeReadingsData; @@ -188,20 +310,30 @@ static FakeReadingsData gFakeReadingsData; * @param[in] aPower_mW - the mean power of the load * Positive power indicates Imported energy (e.g. a load) * Negative power indicated Exported energy (e.g. a generator) - * @param[in] aPowerRandomness_mW This is used to define the std.dev of the + * @param[in] aPowerRandomness_mW This is used to define the max randomness of the * random power values around the mean power of the load - * + * @param[in] aVoltage_mV - the nominal voltage measurement + * @param[in] aVoltageRandomness_mV This is used to define the max randomness of the + * random voltage values + * @param[in] aCurrent_mA - the nominal current measurement + * @param[in] aCurrentRandomness_mA This is used to define the max randomness of the + * random current values * @param[in] aInterval_s - the callback interval in seconds * @param[in] bReset - boolean: true will reset the energy values to 0 */ void EVSEManufacturer::StartFakeReadings(EndpointId aEndpointId, int64_t aPower_mW, uint32_t aPowerRandomness_mW, - uint8_t aInterval_s, bool bReset) + int64_t aVoltage_mV, uint32_t aVoltageRandomness_mV, int64_t aCurrent_mA, + uint32_t aCurrentRandomness_mA, uint8_t aInterval_s, bool bReset) { - gFakeReadingsData.bEnabled = true; - gFakeReadingsData.mEndpointId = aEndpointId; - gFakeReadingsData.mPower_mW = aPower_mW; - gFakeReadingsData.mPowerRandomness_mW = aPowerRandomness_mW; - gFakeReadingsData.mInterval_s = aInterval_s; + gFakeReadingsData.bEnabled = true; + gFakeReadingsData.mEndpointId = aEndpointId; + gFakeReadingsData.mPower_mW = aPower_mW; + gFakeReadingsData.mPowerRandomness_mW = aPowerRandomness_mW; + gFakeReadingsData.mVoltage_mV = aVoltage_mV; + gFakeReadingsData.mVoltageRandomness_mV = aVoltageRandomness_mV; + gFakeReadingsData.mCurrent_mA = aCurrent_mA; + gFakeReadingsData.mCurrentRandomness_mA = aCurrentRandomness_mA; + gFakeReadingsData.mInterval_s = aInterval_s; if (bReset) { @@ -230,29 +362,51 @@ void EVSEManufacturer::FakeReadingsUpdate() return; } - // Update meter values + // Update readings // Avoid using floats - so we will do a basic rand() call which will generate a integer value between 0 and RAND_MAX // first compute power as a mean + some random value in range +/- mPowerRandomness_mW int64_t power = (static_cast(rand()) % (2 * gFakeReadingsData.mPowerRandomness_mW)) - gFakeReadingsData.mPowerRandomness_mW; power += gFakeReadingsData.mPower_mW; // add in the base power - // TODO call the EPM cluster to send a power reading + int64_t voltage = + (static_cast(rand()) % (2 * gFakeReadingsData.mVoltageRandomness_mV)) - gFakeReadingsData.mVoltageRandomness_mV; + voltage += gFakeReadingsData.mVoltage_mV; // add in the base voltage + + /* Note: whilst we could compute a current from the power and voltage, + * there will always be some random error from the sensor + * that measures it. To keep this simple and to avoid doing divides in integer + * format etc use the same approach here too. + * This is meant more as an example to show how to use the APIs, not + * to be a real representation of laws of physics. + */ + int64_t current = + (static_cast(rand()) % (2 * gFakeReadingsData.mCurrentRandomness_mA)) - gFakeReadingsData.mCurrentRandomness_mA; + current += gFakeReadingsData.mCurrent_mA; // add in the base current + + SendPowerReading(gFakeReadingsData.mEndpointId, power, voltage, current); // update the energy meter - we'll assume that the power has been constant during the previous interval if (gFakeReadingsData.mPower_mW > 0) { // Positive power - means power is imported - gFakeReadingsData.mTotalEnergyImported += ((power * gFakeReadingsData.mInterval_s) / 3600); + gFakeReadingsData.mPeriodicEnergyImported = ((power * gFakeReadingsData.mInterval_s) / 3600); + gFakeReadingsData.mPeriodicEnergyExported = 0; + gFakeReadingsData.mTotalEnergyImported += gFakeReadingsData.mPeriodicEnergyImported; } else { - // Negative power - means power is exported, but the cumulative energy is positive - gFakeReadingsData.mTotalEnergyExported += ((-power * gFakeReadingsData.mInterval_s) / 3600); + // Negative power - means power is exported, but the exported energy is reported positive + gFakeReadingsData.mPeriodicEnergyImported = 0; + gFakeReadingsData.mPeriodicEnergyExported = ((-power * gFakeReadingsData.mInterval_s) / 3600); + gFakeReadingsData.mTotalEnergyExported += gFakeReadingsData.mPeriodicEnergyExported; } - SendEnergyReading(gFakeReadingsData.mEndpointId, gFakeReadingsData.mTotalEnergyImported, - gFakeReadingsData.mTotalEnergyExported); + SendPeriodicEnergyReading(gFakeReadingsData.mEndpointId, gFakeReadingsData.mPeriodicEnergyImported, + gFakeReadingsData.mPeriodicEnergyExported); + + SendCumulativeEnergyReading(gFakeReadingsData.mEndpointId, gFakeReadingsData.mTotalEnergyImported, + gFakeReadingsData.mTotalEnergyExported); // start/restart the timer DeviceLayer::SystemLayer().StartTimer(System::Clock::Seconds32(gFakeReadingsData.mInterval_s), FakeReadingsTimerExpiry, this); @@ -322,7 +476,7 @@ EnergyEvseDelegate * GetEvseDelegate() { EVSEManufacturer * mn = GetEvseManufacturer(); VerifyOrDieWithMsg(mn != nullptr, AppServer, "EVSEManufacturer is null"); - EnergyEvseDelegate * dg = mn->GetDelegate(); + EnergyEvseDelegate * dg = mn->GetEvseDelegate(); VerifyOrDieWithMsg(dg != nullptr, AppServer, "EVSE Delegate is null"); return dg; @@ -414,11 +568,16 @@ void SetTestEventTrigger_FakeReadingsLoadStart() EVSEManufacturer * mn = GetEvseManufacturer(); VerifyOrDieWithMsg(mn != nullptr, AppServer, "EVSEManufacturer is null"); - int64_t aPower_mW = 1'000'000; // Fake load 1000 W - uint32_t aPowerRandomness_mW = 20'000; // randomness 20W - uint8_t aInterval_s = 2; // 2s updates - bool bReset = true; - mn->StartFakeReadings(EndpointId(1), aPower_mW, aPowerRandomness_mW, aInterval_s, bReset); + int64_t aPower_mW = 1'000'000; // Fake load 1000 W + uint32_t aPowerRandomness_mW = 20'000; // randomness 20W + int64_t aVoltage_mV = 230'000; // Fake Voltage 230V + uint32_t aVoltageRandomness_mV = 1'000; // randomness 1V + int64_t aCurrent_mA = 4'348; // Fake Current (at 1kW@230V = 4.3478 Amps) + uint32_t aCurrentRandomness_mA = 500; // randomness 500mA + uint8_t aInterval_s = 2; // 2s updates + bool bReset = true; + mn->StartFakeReadings(EndpointId(1), aPower_mW, aPowerRandomness_mW, aVoltage_mV, aVoltageRandomness_mV, aCurrent_mA, + aCurrentRandomness_mA, aInterval_s, bReset); } void SetTestEventTrigger_FakeReadingsGeneratorStart() @@ -426,11 +585,16 @@ void SetTestEventTrigger_FakeReadingsGeneratorStart() EVSEManufacturer * mn = GetEvseManufacturer(); VerifyOrDieWithMsg(mn != nullptr, AppServer, "EVSEManufacturer is null"); - int64_t aPower_mW = -3'000'000; // Fake Generator -3000 W - uint32_t aPowerRandomness_mW = 20'000; // randomness 20W - uint8_t aInterval_s = 5; // 5s updates - bool bReset = true; - mn->StartFakeReadings(EndpointId(1), aPower_mW, aPowerRandomness_mW, aInterval_s, bReset); + int64_t aPower_mW = -3'000'000; // Fake Generator -3000 W + uint32_t aPowerRandomness_mW = 20'000; // randomness 20W + int64_t aVoltage_mV = 230'000; // Fake Voltage 230V + uint32_t aVoltageRandomness_mV = 1'000; // randomness 1V + int64_t aCurrent_mA = -13'043; // Fake Current (at -3kW@230V = -13.0434 Amps) + uint32_t aCurrentRandomness_mA = 500; // randomness 500mA + uint8_t aInterval_s = 5; // 5s updates + bool bReset = true; + mn->StartFakeReadings(EndpointId(1), aPower_mW, aPowerRandomness_mW, aVoltage_mV, aVoltageRandomness_mV, aCurrent_mA, + aCurrentRandomness_mA, aInterval_s, bReset); } void SetTestEventTrigger_FakeReadingsStop() diff --git a/examples/energy-management-app/energy-management-common/src/ElectricalPowerMeasurementDelegate.cpp b/examples/energy-management-app/energy-management-common/src/ElectricalPowerMeasurementDelegate.cpp new file mode 100644 index 00000000000000..fe712d92ae1667 --- /dev/null +++ b/examples/energy-management-app/energy-management-common/src/ElectricalPowerMeasurementDelegate.cpp @@ -0,0 +1,511 @@ +/* + * + * 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 +#include + +#include + +using namespace chip; +using namespace chip::app; +using namespace chip::app::DataModel; +using namespace chip::app::Clusters; +using namespace chip::app::Clusters::ElectricalPowerMeasurement; + +CHIP_ERROR ElectricalPowerMeasurementInstance::Init() +{ + return Instance::Init(); +} + +void ElectricalPowerMeasurementInstance::Shutdown() +{ + Instance::Shutdown(); +} + +// --------------- Internal Attribute Set APIs +CHIP_ERROR ElectricalPowerMeasurementDelegate::SetPowerMode(PowerModeEnum newValue) +{ + PowerModeEnum oldValue = mPowerMode; + + if (EnsureKnownEnumValue(newValue) == PowerModeEnum::kUnknownEnumValue) + { + return CHIP_IM_GLOBAL_STATUS(ConstraintError); + } + + mPowerMode = newValue; + if (oldValue != newValue) + { + ChipLogDetail(AppServer, "mPowerMode updated to %d", static_cast(mPowerMode)); + MatterReportingAttributeChangeCallback(mEndpointId, ElectricalPowerMeasurement::Id, PowerMode::Id); + } + + return CHIP_NO_ERROR; +} + +const MeasurementAccuracyRangeStruct::Type activePowerAccuracyRanges[] = { + // 2 - 5%, 3% Typ + { + .rangeMin = -50'000'000, // -50kW + .rangeMax = -10'000'000, // -10kW + .percentMax = MakeOptional(static_cast(5000)), + .percentMin = MakeOptional(static_cast(2000)), + .percentTypical = MakeOptional(static_cast(3000)), + }, + // 0.1 - 1%, 0.5% Typ + { + .rangeMin = -9'999'999, // -9.999kW + .rangeMax = 9'999'999, // 9.999kW + .percentMax = MakeOptional(static_cast(1000)), + .percentMin = MakeOptional(static_cast(100)), + .percentTypical = MakeOptional(static_cast(500)), + }, + // 2 - 5%, 3% Typ + { + .rangeMin = 10'000'000, // 10 kW + .rangeMax = 50'000'000, // 50 kW + .percentMax = MakeOptional(static_cast(5000)), + .percentMin = MakeOptional(static_cast(2000)), + .percentTypical = MakeOptional(static_cast(3000)), + }, +}; + +const MeasurementAccuracyRangeStruct::Type activeCurrentAccuracyRanges[] = { + // 2 - 5%, 3% Typ + { + .rangeMin = -100'000, // -100A + .rangeMax = -5'000, // -5A + .percentMax = MakeOptional(static_cast(5000)), + .percentMin = MakeOptional(static_cast(2000)), + .percentTypical = MakeOptional(static_cast(3000)), + }, + // 0.1 - 1%, 0.5% Typ + { + .rangeMin = -4'999, // -4.999A + .rangeMax = 4'999, // 4.999A + .percentMax = MakeOptional(static_cast(1000)), + .percentMin = MakeOptional(static_cast(100)), + .percentTypical = MakeOptional(static_cast(500)), + }, + // 2 - 5%, 3% Typ + { + .rangeMin = 5'000, // 5A + .rangeMax = 100'000, // 100 A + .percentMax = MakeOptional(static_cast(5000)), + .percentMin = MakeOptional(static_cast(2000)), + .percentTypical = MakeOptional(static_cast(3000)), + }, +}; + +const MeasurementAccuracyRangeStruct::Type voltageAccuracyRanges[] = { + // 2 - 5%, 3% Typ + { + .rangeMin = -500'000, // -500V + .rangeMax = -100'000, // -100V + .percentMax = MakeOptional(static_cast(5000)), + .percentMin = MakeOptional(static_cast(2000)), + .percentTypical = MakeOptional(static_cast(3000)), + }, + // 0.1 - 1%, 0.5% Typ + { + .rangeMin = -99'999, // -99.999V + .rangeMax = 99'999, // 99.999V + .percentMax = MakeOptional(static_cast(1000)), + .percentMin = MakeOptional(static_cast(100)), + .percentTypical = MakeOptional(static_cast(500)), + }, + // 2 - 5%, 3% Typ + { + .rangeMin = 100'000, // 100 V + .rangeMax = 500'000, // 500 V + .percentMax = MakeOptional(static_cast(5000)), + .percentMin = MakeOptional(static_cast(2000)), + .percentTypical = MakeOptional(static_cast(3000)), + } +}; + +static const Structs::MeasurementAccuracyStruct::Type kMeasurementAccuracies[] = { + { + .measurementType = MeasurementTypeEnum::kActivePower, + .measured = true, + .minMeasuredValue = -50'000'000, // -50 kW + .maxMeasuredValue = 50'000'000, // 50 kW + .accuracyRanges = DataModel::List(activePowerAccuracyRanges), + }, + { + .measurementType = MeasurementTypeEnum::kActiveCurrent, + .measured = true, + .minMeasuredValue = -100'000, // -100A + .maxMeasuredValue = 100'000, // 100A + .accuracyRanges = DataModel::List(activeCurrentAccuracyRanges), + }, + { + .measurementType = MeasurementTypeEnum::kVoltage, + .measured = true, + .minMeasuredValue = -500'000, // -500V + .maxMeasuredValue = 500'000, // 500V + .accuracyRanges = DataModel::List(voltageAccuracyRanges), + }, +}; + +uint8_t ElectricalPowerMeasurementDelegate::GetNumberOfMeasurementTypes() +{ + return ArraySize(kMeasurementAccuracies); +}; + +/* @brief This function is called by the cluster server at the start of read cycle + * This could take a semaphore to stop a background update of the data + */ +CHIP_ERROR ElectricalPowerMeasurementDelegate::StartAccuracyRead() +{ + /* Since we have a static array we don't need to do anything here */ + return CHIP_NO_ERROR; +} + +CHIP_ERROR ElectricalPowerMeasurementDelegate::GetAccuracyByIndex(uint8_t accuracyIndex, + Structs::MeasurementAccuracyStruct::Type & accuracy) +{ + if (accuracyIndex >= ArraySize(kMeasurementAccuracies)) + { + return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED; + } + + accuracy = kMeasurementAccuracies[accuracyIndex]; + + return CHIP_NO_ERROR; +} + +/* @brief This function is called by the cluster server at the end of read cycle + * This could release a semaphore to allow a background update of the data + */ +CHIP_ERROR ElectricalPowerMeasurementDelegate::EndAccuracyRead() +{ + /* Since we have a static array we don't need to do anything here */ + return CHIP_NO_ERROR; +} + +/* @brief This function is called by the cluster server at the start of read cycle + * This could take a semaphore to stop a background update of the data + */ +CHIP_ERROR ElectricalPowerMeasurementDelegate::StartRangesRead() +{ + /* Since we don't an implementation here we don't need to do anything here */ + return CHIP_NO_ERROR; +} + +CHIP_ERROR ElectricalPowerMeasurementDelegate::GetRangeByIndex(uint8_t rangeIndex, Structs::MeasurementRangeStruct::Type & range) +{ + /** TODO - Manufacturers wanting to support this should + * implement an array of + * Structs::MeasurementRangeStruct::Type mMeasurementRanges[]; + * + * their application code should update the relevant measurement 'Range' information including + * - .measurementType + * - .min + * - .max + * - .startTimestamp + * - .endTimestamp + * - .minTimestamp (the time at which the minimum value was recorded) + * - .maxTimestamp (the time at which the maximum value was recorded) + * (and optionally use sys time equivalents) + * + * if (rangeIndex >= ArraySize(mMeasurementRanges)) + * { + * return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED; + * } + * + * range = mMeasurementRanges[rangeIndex]; + * + * return CHIP_NO_ERROR; + */ + + /* Return an empty list for now */ + return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED; +} + +/* @brief This function is called by the cluster server at the end of read cycle + * This could release a semaphore to allow a background update of the data + */ +CHIP_ERROR ElectricalPowerMeasurementDelegate::EndRangesRead() +{ + /* Since we don't an implementation here we don't need to do anything here */ + return CHIP_NO_ERROR; +} + +/* @brief This function is called by the cluster server at the start of read cycle + * This could take a semaphore to stop a background update of the data + */ +CHIP_ERROR ElectricalPowerMeasurementDelegate::StartHarmonicCurrentsRead() +{ + /* Since we don't an implementation here we don't need to do anything here */ + return CHIP_NO_ERROR; +} +CHIP_ERROR +ElectricalPowerMeasurementDelegate::GetHarmonicCurrentsByIndex(uint8_t harmonicCurrentsIndex, + Structs::HarmonicMeasurementStruct::Type & harmonicCurrent) +{ + /** TODO - Manufacturers wanting to support this could implement an array of + * Structs::HarmonicMeasurementStruct::Type mHarmonicCurrentMeasurements[]; + * + * The application code should update the relevant harmonic 'order' information including + * - .order + * - .measurement + * + * The application should also ensure it notifies remote clients that the value has changed + * MatterReportingAttributeChangeCallback(mEndpointId, ElectricalPowerMeasurement::Id, HarmonicCurrents::Id); + */ + + /* if (rangeIndex >= ArraySize(mHarmonicCurrentMeasurements)) + * { + * return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED; + * } + * + * range = mHarmonicCurrentMeasurements[rangeIndex]; + * + * return CHIP_NO_ERROR; + */ + + /* Return an empty list for now */ + return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED; +} +/* @brief This function is called by the cluster server at the end of read cycle + * This could release a semaphore to allow a background update of the data + */ +CHIP_ERROR ElectricalPowerMeasurementDelegate::EndHarmonicCurrentsRead() +{ + /* Since we don't an implementation here we don't need to do anything here */ + return CHIP_NO_ERROR; +} + +/* @brief This function is called by the cluster server at the start of read cycle + * This could take a semaphore to stop a background update of the data + */ +CHIP_ERROR ElectricalPowerMeasurementDelegate::StartHarmonicPhasesRead() +{ + /* Since we don't an implementation here we don't need to do anything here */ + return CHIP_NO_ERROR; +} + +CHIP_ERROR ElectricalPowerMeasurementDelegate::GetHarmonicPhasesByIndex(uint8_t harmonicPhaseIndex, + Structs::HarmonicMeasurementStruct::Type & harmonicPhase) +{ + /** TODO - Manufacturers wanting to support this could implement an array of + * Structs::HarmonicMeasurementStruct::Type mHarmonicPhaseMeasurements[]; + * + * The application code should update the relevant harmonic 'order' information including + * - .order + * - .measurement + * + * The application should also ensure it notifies remote clients that the value has changed + * MatterReportingAttributeChangeCallback(mEndpointId, ElectricalPowerMeasurement::Id, HarmonicPhases::Id); + */ + + /* if (rangeIndex >= ArraySize(mHarmonicPhaseMeasurements)) + * { + * return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED; + * } + * + * range = mHarmonicPhaseMeasurements[rangeIndex]; + * + * return CHIP_NO_ERROR; + */ + + /* Return an empty list for now */ + return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED; +} +/* @brief This function is called by the cluster server at the end of read cycle + * This could release a semaphore to allow a background update of the data + */ +CHIP_ERROR ElectricalPowerMeasurementDelegate::EndHarmonicPhasesRead() +{ + /* Since we don't an implementation here we don't need to do anything here */ + return CHIP_NO_ERROR; +} + +CHIP_ERROR ElectricalPowerMeasurementDelegate::SetVoltage(DataModel::Nullable newValue) +{ + DataModel::Nullable oldValue = mVoltage; + + mVoltage = newValue; + if (oldValue != newValue) + { + // We won't log raw values since these could change frequently + MatterReportingAttributeChangeCallback(mEndpointId, ElectricalPowerMeasurement::Id, Voltage::Id); + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR ElectricalPowerMeasurementDelegate::SetActiveCurrent(DataModel::Nullable newValue) +{ + DataModel::Nullable oldValue = mActiveCurrent; + + mActiveCurrent = newValue; + if (oldValue != newValue) + { + // We won't log raw values since these could change frequently + MatterReportingAttributeChangeCallback(mEndpointId, ElectricalPowerMeasurement::Id, ActiveCurrent::Id); + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR ElectricalPowerMeasurementDelegate::SetReactiveCurrent(DataModel::Nullable newValue) +{ + DataModel::Nullable oldValue = mReactiveCurrent; + + mReactiveCurrent = newValue; + if (oldValue != newValue) + { + // We won't log raw values since these could change frequently + MatterReportingAttributeChangeCallback(mEndpointId, ElectricalPowerMeasurement::Id, ReactiveCurrent::Id); + } + + return CHIP_NO_ERROR; +} +CHIP_ERROR ElectricalPowerMeasurementDelegate::SetApparentCurrent(DataModel::Nullable newValue) +{ + DataModel::Nullable oldValue = mApparentCurrent; + + mApparentCurrent = newValue; + if (oldValue != newValue) + { + // We won't log raw values since these could change frequently + MatterReportingAttributeChangeCallback(mEndpointId, ElectricalPowerMeasurement::Id, ApparentCurrent::Id); + } + + return CHIP_NO_ERROR; +} +CHIP_ERROR ElectricalPowerMeasurementDelegate::SetActivePower(DataModel::Nullable newValue) +{ + DataModel::Nullable oldValue = mActivePower; + + mActivePower = newValue; + if (oldValue != newValue) + { + // We won't log raw values since these could change frequently + MatterReportingAttributeChangeCallback(mEndpointId, ElectricalPowerMeasurement::Id, ActivePower::Id); + } + + return CHIP_NO_ERROR; +} +CHIP_ERROR ElectricalPowerMeasurementDelegate::SetReactivePower(DataModel::Nullable newValue) +{ + DataModel::Nullable oldValue = mReactivePower; + + mReactivePower = newValue; + if (oldValue != newValue) + { + // We won't log raw values since these could change frequently + MatterReportingAttributeChangeCallback(mEndpointId, ElectricalPowerMeasurement::Id, ReactivePower::Id); + } + + return CHIP_NO_ERROR; +} +CHIP_ERROR ElectricalPowerMeasurementDelegate::SetApparentPower(DataModel::Nullable newValue) +{ + DataModel::Nullable oldValue = mApparentPower; + + mApparentPower = newValue; + if (oldValue != newValue) + { + // We won't log raw values since these could change frequently + MatterReportingAttributeChangeCallback(mEndpointId, ElectricalPowerMeasurement::Id, ApparentPower::Id); + } + + return CHIP_NO_ERROR; +} +CHIP_ERROR ElectricalPowerMeasurementDelegate::SetRMSVoltage(DataModel::Nullable newValue) +{ + DataModel::Nullable oldValue = mRMSVoltage; + + mRMSVoltage = newValue; + if (oldValue != newValue) + { + // We won't log raw values since these could change frequently + MatterReportingAttributeChangeCallback(mEndpointId, ElectricalPowerMeasurement::Id, RMSVoltage::Id); + } + + return CHIP_NO_ERROR; +} +CHIP_ERROR ElectricalPowerMeasurementDelegate::SetRMSCurrent(DataModel::Nullable newValue) +{ + DataModel::Nullable oldValue = mRMSCurrent; + + mRMSCurrent = newValue; + if (oldValue != newValue) + { + // We won't log raw values since these could change frequently + MatterReportingAttributeChangeCallback(mEndpointId, ElectricalPowerMeasurement::Id, RMSCurrent::Id); + } + + return CHIP_NO_ERROR; +} +CHIP_ERROR ElectricalPowerMeasurementDelegate::SetRMSPower(DataModel::Nullable newValue) +{ + DataModel::Nullable oldValue = mRMSPower; + + mRMSPower = newValue; + if (oldValue != newValue) + { + // We won't log raw values since these could change frequently + MatterReportingAttributeChangeCallback(mEndpointId, ElectricalPowerMeasurement::Id, RMSPower::Id); + } + + return CHIP_NO_ERROR; +} +CHIP_ERROR ElectricalPowerMeasurementDelegate::SetFrequency(DataModel::Nullable newValue) +{ + DataModel::Nullable oldValue = mFrequency; + + mFrequency = newValue; + if (oldValue != newValue) + { + // We won't log raw values since these could change frequently + MatterReportingAttributeChangeCallback(mEndpointId, ElectricalPowerMeasurement::Id, Frequency::Id); + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR ElectricalPowerMeasurementDelegate::SetPowerFactor(DataModel::Nullable newValue) +{ + DataModel::Nullable oldValue = mPowerFactor; + + mPowerFactor = newValue; + if (oldValue != newValue) + { + // We won't log raw values since these could change frequently + MatterReportingAttributeChangeCallback(mEndpointId, ElectricalPowerMeasurement::Id, PowerFactor::Id); + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR ElectricalPowerMeasurementDelegate::SetNeutralCurrent(DataModel::Nullable newValue) +{ + DataModel::Nullable oldValue = mNeutralCurrent; + + mNeutralCurrent = newValue; + if (oldValue != newValue) + { + // We won't log raw values since these could change frequently + MatterReportingAttributeChangeCallback(mEndpointId, ElectricalPowerMeasurement::Id, NeutralCurrent::Id); + } + + return CHIP_NO_ERROR; +} diff --git a/examples/energy-management-app/energy-management-common/src/EnergyEvseMain.cpp b/examples/energy-management-app/energy-management-common/src/EnergyEvseMain.cpp new file mode 100644 index 00000000000000..92593efe6f8370 --- /dev/null +++ b/examples/energy-management-app/energy-management-common/src/EnergyEvseMain.cpp @@ -0,0 +1,411 @@ +/* + * + * 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 +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#define ENERGY_EVSE_ENDPOINT 1 + +using namespace chip; +using namespace chip::app; +using namespace chip::app::DataModel; +using namespace chip::app::Clusters; +using namespace chip::app::Clusters::EnergyEvse; +using namespace chip::app::Clusters::DeviceEnergyManagement; +using namespace chip::app::Clusters::ElectricalPowerMeasurement; +using namespace chip::app::Clusters::ElectricalEnergyMeasurement; + +static std::unique_ptr gEvseDelegate; +static std::unique_ptr gEvseInstance; +static std::unique_ptr gDEMDelegate; +static std::unique_ptr gDEMInstance; +static std::unique_ptr gEvseManufacturer; +static std::unique_ptr gEPMDelegate; +static std::unique_ptr gEPMInstance; +// Electrical Energy Measurement cluster uses ember to initialise +static std::unique_ptr gEEMAttrAccess; + +EVSEManufacturer * EnergyEvse::GetEvseManufacturer() +{ + return gEvseManufacturer.get(); +} + +/* + * @brief Creates a Delegate and Instance for DEM + * + * The Instance is a container around the Delegate, so + * create the Delegate first, then wrap it in the Instance + * Then call the Instance->Init() to register the attribute and command handlers + */ +CHIP_ERROR DeviceEnergyManagementInit() +{ + if (gDEMDelegate || gDEMInstance) + { + ChipLogError(AppServer, "DEM Instance or Delegate already exist."); + return CHIP_ERROR_INCORRECT_STATE; + } + + gDEMDelegate = std::make_unique(); + if (!gDEMDelegate) + { + ChipLogError(AppServer, "Failed to allocate memory for DeviceEnergyManagementDelegate"); + return CHIP_ERROR_NO_MEMORY; + } + + /* Manufacturer may optionally not support all features, commands & attributes */ + gDEMInstance = std::make_unique( + EndpointId(ENERGY_EVSE_ENDPOINT), *gDEMDelegate, + BitMask( + DeviceEnergyManagement::Feature::kPowerAdjustment, DeviceEnergyManagement::Feature::kPowerForecastReporting, + DeviceEnergyManagement::Feature::kStateForecastReporting, DeviceEnergyManagement::Feature::kStartTimeAdjustment, + DeviceEnergyManagement::Feature::kPausable)); + + if (!gDEMInstance) + { + ChipLogError(AppServer, "Failed to allocate memory for DeviceEnergyManagementManager"); + gDEMDelegate.reset(); + return CHIP_ERROR_NO_MEMORY; + } + + CHIP_ERROR err = gDEMInstance->Init(); /* Register Attribute & Command handlers */ + if (err != CHIP_NO_ERROR) + { + ChipLogError(AppServer, "Init failed on gDEMInstance"); + gDEMInstance.reset(); + gDEMDelegate.reset(); + return err; + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR DeviceEnergyManagementShutdown() +{ + /* Do this in the order Instance first, then delegate + * Ensure we call the Instance->Shutdown to free attribute & command handlers first + */ + if (gDEMInstance) + { + /* deregister attribute & command handlers */ + gDEMInstance->Shutdown(); + gDEMInstance.reset(); + } + if (gDEMDelegate) + { + gDEMDelegate.reset(); + } + return CHIP_NO_ERROR; +} + +/* + * @brief Creates a Delegate and Instance for EVSE cluster + * + * The Instance is a container around the Delegate, so + * create the Delegate first, then wrap it in the Instance + * Then call the Instance->Init() to register the attribute and command handlers + */ +CHIP_ERROR EnergyEvseInit() +{ + CHIP_ERROR err; + + if (gEvseDelegate || gEvseInstance) + { + ChipLogError(AppServer, "EVSE Instance or Delegate already exist."); + return CHIP_ERROR_INCORRECT_STATE; + } + + gEvseDelegate = std::make_unique(); + if (!gEvseDelegate) + { + ChipLogError(AppServer, "Failed to allocate memory for EnergyEvseDelegate"); + return CHIP_ERROR_NO_MEMORY; + } + + /* Manufacturer may optionally not support all features, commands & attributes */ + gEvseInstance = std::make_unique( + EndpointId(ENERGY_EVSE_ENDPOINT), *gEvseDelegate, + BitMask(EnergyEvse::Feature::kChargingPreferences, EnergyEvse::Feature::kPlugAndCharge, + EnergyEvse::Feature::kRfid, EnergyEvse::Feature::kSoCReporting, + EnergyEvse::Feature::kV2x), + BitMask(EnergyEvse::OptionalAttributes::kSupportsUserMaximumChargingCurrent, + EnergyEvse::OptionalAttributes::kSupportsRandomizationWindow, + EnergyEvse::OptionalAttributes::kSupportsApproximateEvEfficiency), + BitMask(EnergyEvse::OptionalCommands::kSupportsStartDiagnostics)); + + if (!gEvseInstance) + { + ChipLogError(AppServer, "Failed to allocate memory for EnergyEvseManager"); + gEvseDelegate.reset(); + return CHIP_ERROR_NO_MEMORY; + } + + err = gEvseInstance->Init(); /* Register Attribute & Command handlers */ + if (err != CHIP_NO_ERROR) + { + ChipLogError(AppServer, "Init failed on gEvseInstance"); + gEvseInstance.reset(); + gEvseDelegate.reset(); + return err; + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR EnergyEvseShutdown() +{ + /* Do this in the order Instance first, then delegate + * Ensure we call the Instance->Shutdown to free attribute & command handlers first + */ + if (gEvseInstance) + { + /* deregister attribute & command handlers */ + gEvseInstance->Shutdown(); + gEvseInstance.reset(); + } + + if (gEvseDelegate) + { + gEvseDelegate.reset(); + } + + return CHIP_NO_ERROR; +} + +/* + * @brief Creates a Delegate and Instance for Electrical Power/Energy Measurement clusters + * + * The Instance is a container around the Delegate, so + * create the Delegate first, then wrap it in the Instance + * Then call the Instance->Init() to register the attribute and command handlers + */ +CHIP_ERROR EnergyMeterInit() +{ + CHIP_ERROR err; + + if (gEPMDelegate || gEPMInstance) + { + ChipLogError(AppServer, "EPM Instance or Delegate already exist."); + return CHIP_ERROR_INCORRECT_STATE; + } + + gEPMDelegate = std::make_unique(); + if (!gEPMDelegate) + { + ChipLogError(AppServer, "Failed to allocate memory for EPM Delegate"); + return CHIP_ERROR_NO_MEMORY; + } + + /* Manufacturer may optionally not support all features, commands & attributes */ + gEPMInstance = std::make_unique( + EndpointId(ENERGY_EVSE_ENDPOINT), *gEPMDelegate, + BitMask(ElectricalPowerMeasurement::Feature::kAlternatingCurrent), + BitMask( + ElectricalPowerMeasurement::OptionalAttributes::kOptionalAttributeRanges, + ElectricalPowerMeasurement::OptionalAttributes::kOptionalAttributeVoltage, + ElectricalPowerMeasurement::OptionalAttributes::kOptionalAttributeActiveCurrent)); + + if (!gEPMInstance) + { + ChipLogError(AppServer, "Failed to allocate memory for EPM Instance"); + gEPMDelegate.reset(); + return CHIP_ERROR_NO_MEMORY; + } + + err = gEPMInstance->Init(); /* Register Attribute & Command handlers */ + if (err != CHIP_NO_ERROR) + { + ChipLogError(AppServer, "Init failed on gEPMInstance"); + gEPMInstance.reset(); + gEPMDelegate.reset(); + return err; + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR EnergyMeterShutdown() +{ + /* Do this in the order Instance first, then delegate + * Ensure we call the Instance->Shutdown to free attribute & command handlers first + */ + if (gEPMInstance) + { + /* deregister attribute & command handlers */ + gEPMInstance->Shutdown(); + gEPMInstance.reset(); + } + + if (gEPMDelegate) + { + gEPMDelegate.reset(); + } + + return CHIP_NO_ERROR; +} + +/* + * @brief Creates a EVSEManufacturer class to hold the EVSE & DEM clusters + * + * The Instance is a container around the Delegate, so + * create the Delegate first, then wrap it in the Instance + * Then call the Instance->Init() to register the attribute and command handlers + */ +CHIP_ERROR EVSEManufacturerInit() +{ + CHIP_ERROR err; + + if (gEvseManufacturer) + { + ChipLogError(AppServer, "EvseManufacturer already exist."); + return CHIP_ERROR_INCORRECT_STATE; + } + + /* Now create EVSEManufacturer */ + gEvseManufacturer = std::make_unique(gEvseInstance.get(), gEPMInstance.get()); + if (!gEvseManufacturer) + { + ChipLogError(AppServer, "Failed to allocate memory for EvseManufacturer"); + return CHIP_ERROR_NO_MEMORY; + } + + /* Call Manufacturer specific init */ + err = gEvseManufacturer->Init(); + if (err != CHIP_NO_ERROR) + { + ChipLogError(AppServer, "Init failed on gEvseManufacturer"); + gEvseManufacturer.reset(); + return err; + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR EVSEManufacturerShutdown() +{ + if (gEvseManufacturer) + { + /* Shutdown the EVSEManufacturer */ + gEvseManufacturer->Shutdown(); + gEvseManufacturer.reset(); + } + + return CHIP_NO_ERROR; +} + +void EvseApplicationInit() +{ + if (DeviceEnergyManagementInit() != CHIP_NO_ERROR) + { + return; + } + + if (EnergyEvseInit() != CHIP_NO_ERROR) + { + DeviceEnergyManagementShutdown(); + return; + } + + if (EnergyMeterInit() != CHIP_NO_ERROR) + { + DeviceEnergyManagementShutdown(); + EnergyEvseShutdown(); + return; + } + + if (EVSEManufacturerInit() != CHIP_NO_ERROR) + { + DeviceEnergyManagementShutdown(); + EnergyEvseShutdown(); + EnergyMeterShutdown(); + return; + } +} + +void EvseApplicationShutdown() +{ + ChipLogDetail(AppServer, "Energy Management App: ApplicationShutdown()"); + + /* Shutdown in reverse order that they were created */ + EVSEManufacturerShutdown(); /* Free the EVSEManufacturer */ + EnergyMeterShutdown(); /* Free the Energy Meter */ + EnergyEvseShutdown(); /* Free the EnergyEvse */ + DeviceEnergyManagementShutdown(); /* Free the DEM */ + + Clusters::DeviceEnergyManagementMode::Shutdown(); + Clusters::EnergyEvseMode::Shutdown(); +} + +void emberAfElectricalEnergyMeasurementClusterInitCallback(chip::EndpointId endpointId) +{ + VerifyOrDie(endpointId == 1); // this cluster is only enabled for endpoint 1. + VerifyOrDie(!gEEMAttrAccess); + + gEEMAttrAccess = std::make_unique( + BitMask( + ElectricalEnergyMeasurement::Feature::kImportedEnergy, ElectricalEnergyMeasurement::Feature::kExportedEnergy, + ElectricalEnergyMeasurement::Feature::kCumulativeEnergy, ElectricalEnergyMeasurement::Feature::kPeriodicEnergy), + BitMask( + ElectricalEnergyMeasurement::OptionalAttributes::kOptionalAttributeCumulativeEnergyReset)); + + // Create an accuracy entry which is between +/-0.5 and +/- 5% across the range of all possible energy readings + ElectricalEnergyMeasurement::Structs::MeasurementAccuracyRangeStruct::Type energyAccuracyRanges[] = { + { .rangeMin = 0, + .rangeMax = 1'000'000'000'000'000, // 1 million Mwh + .percentMax = MakeOptional(static_cast(500)), + .percentMin = MakeOptional(static_cast(50)) } + }; + + ElectricalEnergyMeasurement::Structs::MeasurementAccuracyStruct::Type accuracy = { + .measurementType = MeasurementTypeEnum::kElectricalEnergy, + .measured = true, + .minMeasuredValue = 0, + .maxMeasuredValue = 1'000'000'000'000'000, // 1 million Mwh + .accuracyRanges = + DataModel::List(energyAccuracyRanges) + }; + + // Example of setting CumulativeEnergyReset structure - for now set these to 0 + // but the manufacturer may want to store these in non volatile storage for timestamp (based on epoch_s) + ElectricalEnergyMeasurement::Structs::CumulativeEnergyResetStruct::Type resetStruct = { + .importedResetTimestamp = MakeOptional(MakeNullable(static_cast(0))), + .exportedResetTimestamp = MakeOptional(MakeNullable(static_cast(0))), + .importedResetSystime = MakeOptional(MakeNullable(static_cast(0))), + .exportedResetSystime = MakeOptional(MakeNullable(static_cast(0))), + }; + + if (gEEMAttrAccess) + { + gEEMAttrAccess->Init(); + + SetMeasurementAccuracy(endpointId, accuracy); + SetCumulativeReset(endpointId, MakeOptional(resetStruct)); + } +} diff --git a/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp b/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp index 24643885d54368..f4b3941e8c1ca7 100644 --- a/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp +++ b/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp @@ -35,6 +35,12 @@ CHIP_ERROR EnergyEvseManager::LoadPersistentAttributes() EndpointId aEndpointId = mDelegate->GetEndpointId(); CHIP_ERROR err; + if (aProvider == nullptr) + { + ChipLogError(AppServer, "GetSafeAttributePersistenceProvider returned NULL"); + return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE; + } + // Restore ChargingEnabledUntil value DataModel::Nullable tempChargingEnabledUntil; err = aProvider->ReadScalarValue(ConcreteAttributePath(aEndpointId, EnergyEvse::Id, Attributes::ChargingEnabledUntil::Id), diff --git a/examples/energy-management-app/energy-management-common/src/device-energy-management-mode.cpp b/examples/energy-management-app/energy-management-common/src/device-energy-management-mode.cpp index 9f79f78ee653d5..33235198752182 100644 --- a/examples/energy-management-app/energy-management-common/src/device-energy-management-mode.cpp +++ b/examples/energy-management-app/energy-management-common/src/device-energy-management-mode.cpp @@ -94,7 +94,6 @@ void emberAfDeviceEnergyManagementModeClusterInitCallback(chip::EndpointId endpo VerifyOrDie(!gDeviceEnergyManagementModeDelegate && !gDeviceEnergyManagementModeInstance); gDeviceEnergyManagementModeDelegate = std::make_unique(); gDeviceEnergyManagementModeInstance = - std::make_unique(gDeviceEnergyManagementModeDelegate.get(), 0x1, DeviceEnergyManagementMode::Id, - chip::to_underlying(DeviceEnergyManagementMode::Feature::kOnOff)); + std::make_unique(gDeviceEnergyManagementModeDelegate.get(), 0x1, DeviceEnergyManagementMode::Id, 0); gDeviceEnergyManagementModeInstance->Init(); } diff --git a/examples/energy-management-app/energy-management-common/src/energy-evse-mode.cpp b/examples/energy-management-app/energy-management-common/src/energy-evse-mode.cpp index 0d413682d20f84..ce147839a9496f 100644 --- a/examples/energy-management-app/energy-management-common/src/energy-evse-mode.cpp +++ b/examples/energy-management-app/energy-management-common/src/energy-evse-mode.cpp @@ -91,7 +91,6 @@ void emberAfEnergyEvseModeClusterInitCallback(chip::EndpointId endpointId) { VerifyOrDie(!gEnergyEvseModeDelegate && !gEnergyEvseModeInstance); gEnergyEvseModeDelegate = std::make_unique(); - gEnergyEvseModeInstance = std::make_unique(gEnergyEvseModeDelegate.get(), 0x1, EnergyEvseMode::Id, - chip::to_underlying(EnergyEvseMode::Feature::kOnOff)); + gEnergyEvseModeInstance = std::make_unique(gEnergyEvseModeDelegate.get(), 0x1, EnergyEvseMode::Id, 0); gEnergyEvseModeInstance->Init(); } diff --git a/examples/energy-management-app/esp32/main/CMakeLists.txt b/examples/energy-management-app/esp32/main/CMakeLists.txt index edba8f9671d1bc..ddaff6b83e02f0 100644 --- a/examples/energy-management-app/esp32/main/CMakeLists.txt +++ b/examples/energy-management-app/esp32/main/CMakeLists.txt @@ -66,6 +66,7 @@ set(SRC_DIRS_LIST "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/group-key-mgmt-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/mode-base-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/electrical-energy-measurement-server" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/electrical-power-measurement-server" ) set(PRIV_REQUIRES_LIST chip QRCode bt led_strip app_update openthread driver nvs_flash spi_flash) diff --git a/examples/energy-management-app/esp32/main/main.cpp b/examples/energy-management-app/esp32/main/main.cpp index 2e7e43f730a025..8132b1ba2f3aff 100644 --- a/examples/energy-management-app/esp32/main/main.cpp +++ b/examples/energy-management-app/esp32/main/main.cpp @@ -16,12 +16,7 @@ */ #include "DeviceCallbacks.h" -#include -#include -#include -#include -#include -#include +#include #include "esp_log.h" #include @@ -68,8 +63,6 @@ #include #endif -#define ENERGY_EVSE_ENDPOINT 1 - using namespace ::chip; using namespace chip::app; using namespace chip::app::Clusters; @@ -77,12 +70,6 @@ using namespace ::chip::Credentials; using namespace ::chip::DeviceManager; using namespace ::chip::DeviceLayer; -static std::unique_ptr gEvseDelegate; -static std::unique_ptr gEvseInstance; -static std::unique_ptr gDEMDelegate; -static std::unique_ptr gDEMInstance; -static std::unique_ptr gEvseManufacturer; - #if CONFIG_ENABLE_ESP_INSIGHTS_TRACE extern const char insights_auth_key_start[] asm("_binary_insights_auth_key_txt_start"); extern const char insights_auth_key_end[] asm("_binary_insights_auth_key_txt_end"); @@ -121,233 +108,16 @@ chip::Credentials::DeviceAttestationCredentialsProvider * get_dac_provider(void) } // namespace -EVSEManufacturer * EnergyEvse::GetEvseManufacturer() -{ - return gEvseManufacturer.get(); -} - -/* - * @brief Creates a Delegate and Instance for DEM - * - * The Instance is a container around the Delegate, so - * create the Delegate first, then wrap it in the Instance - * Then call the Instance->Init() to register the attribute and command handlers - */ -CHIP_ERROR DeviceEnergyManagementInit() -{ - if (gDEMDelegate || gDEMInstance) - { - ESP_LOGE(TAG, "DEM Instance or Delegate already exist."); - return CHIP_ERROR_INCORRECT_STATE; - } - - gDEMDelegate = std::make_unique(); - if (!gDEMDelegate) - { - ESP_LOGE(TAG, "Failed to allocate memory for DeviceEnergyManagementDelegate"); - return CHIP_ERROR_NO_MEMORY; - } - - /* Manufacturer may optionally not support all features, commands & attributes */ - gDEMInstance = std::make_unique( - EndpointId(ENERGY_EVSE_ENDPOINT), *gDEMDelegate, - BitMask( - DeviceEnergyManagement::Feature::kPowerAdjustment, DeviceEnergyManagement::Feature::kPowerForecastReporting, - DeviceEnergyManagement::Feature::kStateForecastReporting, DeviceEnergyManagement::Feature::kStartTimeAdjustment, - DeviceEnergyManagement::Feature::kPausable)); - - if (!gDEMInstance) - { - ESP_LOGE(TAG, "Failed to allocate memory for DeviceEnergyManagementManager"); - gDEMDelegate.reset(); - return CHIP_ERROR_NO_MEMORY; - } - - CHIP_ERROR err = gDEMInstance->Init(); /* Register Attribute & Command handlers */ - if (err != CHIP_NO_ERROR) - { - ESP_LOGE(TAG, "Init failed on gDEMInstance, err:%" CHIP_ERROR_FORMAT, err.Format()); - gDEMInstance.reset(); - gDEMDelegate.reset(); - return err; - } - - return CHIP_NO_ERROR; -} - -CHIP_ERROR DeviceEnergyManagementShutdown() -{ - /* Do this in the order Instance first, then delegate - * Ensure we call the Instance->Shutdown to free attribute & command handlers first - */ - if (gDEMInstance) - { - /* deregister attribute & command handlers */ - gDEMInstance->Shutdown(); - gDEMInstance.reset(); - } - if (gDEMDelegate) - { - gDEMDelegate.reset(); - } - return CHIP_NO_ERROR; -} - -/* - * @brief Creates a Delegate and Instance for EVSE cluster - * - * The Instance is a container around the Delegate, so - * create the Delegate first, then wrap it in the Instance - * Then call the Instance->Init() to register the attribute and command handlers - */ -CHIP_ERROR EnergyEvseInit() -{ - CHIP_ERROR err; - - if (gEvseDelegate || gEvseInstance) - { - ESP_LOGE(TAG, "EVSE Instance or Delegate already exist."); - return CHIP_ERROR_INCORRECT_STATE; - } - - gEvseDelegate = std::make_unique(); - if (!gEvseDelegate) - { - ESP_LOGE(TAG, "Failed to allocate memory for EnergyEvseDelegate"); - return CHIP_ERROR_NO_MEMORY; - } - - /* Manufacturer may optionally not support all features, commands & attributes */ - gEvseInstance = std::make_unique( - EndpointId(ENERGY_EVSE_ENDPOINT), *gEvseDelegate, - BitMask(EnergyEvse::Feature::kChargingPreferences, EnergyEvse::Feature::kPlugAndCharge, - EnergyEvse::Feature::kRfid, EnergyEvse::Feature::kSoCReporting, - EnergyEvse::Feature::kV2x), - BitMask(EnergyEvse::OptionalAttributes::kSupportsUserMaximumChargingCurrent, - EnergyEvse::OptionalAttributes::kSupportsRandomizationWindow, - EnergyEvse::OptionalAttributes::kSupportsApproximateEvEfficiency), - BitMask(EnergyEvse::OptionalCommands::kSupportsStartDiagnostics)); - - if (!gEvseInstance) - { - ESP_LOGE(TAG, "Failed to allocate memory for EnergyEvseManager"); - gEvseDelegate.reset(); - return CHIP_ERROR_NO_MEMORY; - } - - err = gEvseInstance->Init(); /* Register Attribute & Command handlers */ - if (err != CHIP_NO_ERROR) - { - ESP_LOGE(TAG, "Init failed on gEvseInstance, err:%" CHIP_ERROR_FORMAT, err.Format()); - gEvseInstance.reset(); - gEvseDelegate.reset(); - return err; - } - - return CHIP_NO_ERROR; -} - -CHIP_ERROR EnergyEvseShutdown() -{ - /* Do this in the order Instance first, then delegate - * Ensure we call the Instance->Shutdown to free attribute & command handlers first - */ - if (gEvseInstance) - { - /* deregister attribute & command handlers */ - gEvseInstance->Shutdown(); - gEvseInstance.reset(); - } - - if (gEvseDelegate) - { - gEvseDelegate.reset(); - } - - return CHIP_NO_ERROR; -} - -/* - * @brief Creates a EVSEManufacturer class to hold the EVSE & DEM clusters - * - * The Instance is a container around the Delegate, so - * create the Delegate first, then wrap it in the Instance - * Then call the Instance->Init() to register the attribute and command handlers - */ -CHIP_ERROR EVSEManufacturerInit() -{ - CHIP_ERROR err; - - if (gEvseManufacturer) - { - ESP_LOGE(TAG, "EvseManufacturer already exist."); - return CHIP_ERROR_INCORRECT_STATE; - } - - /* Now create EVSEManufacturer */ - gEvseManufacturer = std::make_unique(gEvseInstance.get()); - if (!gEvseManufacturer) - { - ESP_LOGE(TAG, "Failed to allocate memory for EvseManufacturer"); - return CHIP_ERROR_NO_MEMORY; - } - - /* Call Manufacturer specific init */ - err = gEvseManufacturer->Init(); - if (err != CHIP_NO_ERROR) - { - ESP_LOGE(TAG, "Init failed on gEvseManufacturer, err:%" CHIP_ERROR_FORMAT, err.Format()); - gEvseManufacturer.reset(); - return err; - } - - return CHIP_NO_ERROR; -} - -CHIP_ERROR EVSEManufacturerShutdown() -{ - if (gEvseManufacturer) - { - /* Shutdown the EVSEManufacturer */ - gEvseManufacturer->Shutdown(); - gEvseManufacturer.reset(); - } - - return CHIP_NO_ERROR; -} - void ApplicationInit() { - if (DeviceEnergyManagementInit() != CHIP_NO_ERROR) - { - return; - } - - if (EnergyEvseInit() != CHIP_NO_ERROR) - { - DeviceEnergyManagementShutdown(); - return; - } - - if (EVSEManufacturerInit() != CHIP_NO_ERROR) - { - DeviceEnergyManagementShutdown(); - EnergyEvseShutdown(); - return; - } + ESP_LOGD(TAG, "Energy Management App: ApplicationInit()"); + EvseApplicationInit(); } void ApplicationShutdown() { ESP_LOGD(TAG, "Energy Management App: ApplicationShutdown()"); - - /* Shutdown in reverse order that they were created */ - EVSEManufacturerShutdown(); /* Free the EVSEManufacturer */ - EnergyEvseShutdown(); /* Free the EnergyEvse */ - DeviceEnergyManagementShutdown(); /* Free the DEM */ - - Clusters::DeviceEnergyManagementMode::Shutdown(); - Clusters::EnergyEvseMode::Shutdown(); + EvseApplicationShutdown(); } static void InitServer(intptr_t context) diff --git a/examples/energy-management-app/linux/BUILD.gn b/examples/energy-management-app/linux/BUILD.gn index 11919a4e8c12a3..99acf81baad1c9 100644 --- a/examples/energy-management-app/linux/BUILD.gn +++ b/examples/energy-management-app/linux/BUILD.gn @@ -39,9 +39,10 @@ executable("chip-energy-management-app") { "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementManager.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EVSEManufacturerImpl.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/src/ElectricalPowerMeasurementDelegate.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseMain.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyManagementManager.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/device-energy-management-mode.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/energy-evse-mode.cpp", "include/CHIPProjectAppConfig.h", diff --git a/examples/energy-management-app/linux/main.cpp b/examples/energy-management-app/linux/main.cpp index a150b82c4bb171..7973c16025d640 100644 --- a/examples/energy-management-app/linux/main.cpp +++ b/examples/energy-management-app/linux/main.cpp @@ -17,260 +17,18 @@ */ #include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#define ENERGY_EVSE_ENDPOINT 1 - -using namespace chip; -using namespace chip::app; -using namespace chip::app::Clusters; - -static std::unique_ptr gEvseDelegate; -static std::unique_ptr gEvseInstance; -static std::unique_ptr gDEMDelegate; -static std::unique_ptr gDEMInstance; -static std::unique_ptr gEvseManufacturer; - -EVSEManufacturer * EnergyEvse::GetEvseManufacturer() -{ - return gEvseManufacturer.get(); -} - -/* - * @brief Creates a Delegate and Instance for DEM - * - * The Instance is a container around the Delegate, so - * create the Delegate first, then wrap it in the Instance - * Then call the Instance->Init() to register the attribute and command handlers - */ -CHIP_ERROR DeviceEnergyManagementInit() -{ - if (gDEMDelegate || gDEMInstance) - { - ChipLogError(AppServer, "DEM Instance or Delegate already exist."); - return CHIP_ERROR_INCORRECT_STATE; - } - - gDEMDelegate = std::make_unique(); - if (!gDEMDelegate) - { - ChipLogError(AppServer, "Failed to allocate memory for DeviceEnergyManagementDelegate"); - return CHIP_ERROR_NO_MEMORY; - } - - /* Manufacturer may optionally not support all features, commands & attributes */ - gDEMInstance = std::make_unique( - EndpointId(ENERGY_EVSE_ENDPOINT), *gDEMDelegate, - BitMask( - DeviceEnergyManagement::Feature::kPowerAdjustment, DeviceEnergyManagement::Feature::kPowerForecastReporting, - DeviceEnergyManagement::Feature::kStateForecastReporting, DeviceEnergyManagement::Feature::kStartTimeAdjustment, - DeviceEnergyManagement::Feature::kPausable)); - - if (!gDEMInstance) - { - ChipLogError(AppServer, "Failed to allocate memory for DeviceEnergyManagementManager"); - gDEMDelegate.reset(); - return CHIP_ERROR_NO_MEMORY; - } - - CHIP_ERROR err = gDEMInstance->Init(); /* Register Attribute & Command handlers */ - if (err != CHIP_NO_ERROR) - { - ChipLogError(AppServer, "Init failed on gDEMInstance"); - gDEMInstance.reset(); - gDEMDelegate.reset(); - return err; - } - - return CHIP_NO_ERROR; -} - -CHIP_ERROR DeviceEnergyManagementShutdown() -{ - /* Do this in the order Instance first, then delegate - * Ensure we call the Instance->Shutdown to free attribute & command handlers first - */ - if (gDEMInstance) - { - /* deregister attribute & command handlers */ - gDEMInstance->Shutdown(); - gDEMInstance.reset(); - } - if (gDEMDelegate) - { - gDEMDelegate.reset(); - } - return CHIP_NO_ERROR; -} - -/* - * @brief Creates a Delegate and Instance for EVSE cluster - * - * The Instance is a container around the Delegate, so - * create the Delegate first, then wrap it in the Instance - * Then call the Instance->Init() to register the attribute and command handlers - */ -CHIP_ERROR EnergyEvseInit() -{ - CHIP_ERROR err; - - if (gEvseDelegate || gEvseInstance) - { - ChipLogError(AppServer, "EVSE Instance or Delegate already exist."); - return CHIP_ERROR_INCORRECT_STATE; - } - - gEvseDelegate = std::make_unique(); - if (!gEvseDelegate) - { - ChipLogError(AppServer, "Failed to allocate memory for EnergyEvseDelegate"); - return CHIP_ERROR_NO_MEMORY; - } - - /* Manufacturer may optionally not support all features, commands & attributes */ - gEvseInstance = std::make_unique( - EndpointId(ENERGY_EVSE_ENDPOINT), *gEvseDelegate, - BitMask(EnergyEvse::Feature::kChargingPreferences, EnergyEvse::Feature::kPlugAndCharge, - EnergyEvse::Feature::kRfid, EnergyEvse::Feature::kSoCReporting, - EnergyEvse::Feature::kV2x), - BitMask(EnergyEvse::OptionalAttributes::kSupportsUserMaximumChargingCurrent, - EnergyEvse::OptionalAttributes::kSupportsRandomizationWindow, - EnergyEvse::OptionalAttributes::kSupportsApproximateEvEfficiency), - BitMask(EnergyEvse::OptionalCommands::kSupportsStartDiagnostics)); - - if (!gEvseInstance) - { - ChipLogError(AppServer, "Failed to allocate memory for EnergyEvseManager"); - gEvseDelegate.reset(); - return CHIP_ERROR_NO_MEMORY; - } - - err = gEvseInstance->Init(); /* Register Attribute & Command handlers */ - if (err != CHIP_NO_ERROR) - { - ChipLogError(AppServer, "Init failed on gEvseInstance"); - gEvseInstance.reset(); - gEvseDelegate.reset(); - return err; - } - - return CHIP_NO_ERROR; -} - -CHIP_ERROR EnergyEvseShutdown() -{ - /* Do this in the order Instance first, then delegate - * Ensure we call the Instance->Shutdown to free attribute & command handlers first - */ - if (gEvseInstance) - { - /* deregister attribute & command handlers */ - gEvseInstance->Shutdown(); - gEvseInstance.reset(); - } - - if (gEvseDelegate) - { - gEvseDelegate.reset(); - } - - return CHIP_NO_ERROR; -} - -/* - * @brief Creates a EVSEManufacturer class to hold the EVSE & DEM clusters - * - * The Instance is a container around the Delegate, so - * create the Delegate first, then wrap it in the Instance - * Then call the Instance->Init() to register the attribute and command handlers - */ -CHIP_ERROR EVSEManufacturerInit() -{ - CHIP_ERROR err; - - if (gEvseManufacturer) - { - ChipLogError(AppServer, "EvseManufacturer already exist."); - return CHIP_ERROR_INCORRECT_STATE; - } - - /* Now create EVSEManufacturer */ - gEvseManufacturer = std::make_unique(gEvseInstance.get()); - if (!gEvseManufacturer) - { - ChipLogError(AppServer, "Failed to allocate memory for EvseManufacturer"); - return CHIP_ERROR_NO_MEMORY; - } - - /* Call Manufacturer specific init */ - err = gEvseManufacturer->Init(); - if (err != CHIP_NO_ERROR) - { - ChipLogError(AppServer, "Init failed on gEvseManufacturer"); - gEvseManufacturer.reset(); - return err; - } - - return CHIP_NO_ERROR; -} - -CHIP_ERROR EVSEManufacturerShutdown() -{ - if (gEvseManufacturer) - { - /* Shutdown the EVSEManufacturer */ - gEvseManufacturer->Shutdown(); - gEvseManufacturer.reset(); - } - - return CHIP_NO_ERROR; -} +#include void ApplicationInit() { - if (DeviceEnergyManagementInit() != CHIP_NO_ERROR) - { - return; - } - - if (EnergyEvseInit() != CHIP_NO_ERROR) - { - DeviceEnergyManagementShutdown(); - return; - } - - if (EVSEManufacturerInit() != CHIP_NO_ERROR) - { - DeviceEnergyManagementShutdown(); - EnergyEvseShutdown(); - return; - } + ChipLogDetail(AppServer, "Energy Management App: ApplicationInit()"); + EvseApplicationInit(); } void ApplicationShutdown() { ChipLogDetail(AppServer, "Energy Management App: ApplicationShutdown()"); - - /* Shutdown in reverse order that they were created */ - EVSEManufacturerShutdown(); /* Free the EVSEManufacturer */ - EnergyEvseShutdown(); /* Free the EnergyEvse */ - DeviceEnergyManagementShutdown(); /* Free the DEM */ - - Clusters::DeviceEnergyManagementMode::Shutdown(); - Clusters::EnergyEvseMode::Shutdown(); + EvseApplicationShutdown(); } int main(int argc, char * argv[]) 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 3e45d62323cfec..e0a95d584130eb 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 @@ -10,6 +10,7 @@ import chip.devicecontroller.model.ChipPathId import chip.devicecontroller.model.DataVersionFilter import chip.devicecontroller.model.EventState import chip.devicecontroller.model.NodeState +import chip.devicecontroller.model.Status import com.matter.controller.commands.common.CredentialsIssuer import java.util.logging.Level import java.util.logging.Logger @@ -34,13 +35,6 @@ class PairOnNetworkLongImReadCommand( eventPath: ChipEventPath?, e: Exception ) { - if (attributePath != null && attributePath.clusterId.getId() == UNIT_TEST_CLUSTER) { - logger.log( - Level.INFO, - "TODO: skip the error check for unit test cluster that covers most error result" - ) - return - } logger.log(Level.INFO, "Read receive onError") setFailure("read failure") } @@ -72,11 +66,20 @@ class PairOnNetworkLongImReadCommand( return cluster.equals(expected) } + fun checkUnitTestClusterGeneralStatus(status: Status): Boolean = + (status.getStatus() == CLUSTER_ID_TEST_GENERAL_ERROR_STATUS) && + !status.getClusterStatus().isPresent() + + fun checkUnitTestClusterClusterStatus(status: Status): Boolean = + (status.getStatus() == CLUSTER_ID_TEST_CLUSTER_ERROR_STATUS) && + status.getClusterStatus().isPresent() && + status.getClusterStatus().get() == CLUSTER_ID_TEST_CLUSTER_ERROR_CLUSTER_STATUS + private fun validateResponse(nodeState: NodeState) { val endpointZero = requireNotNull(nodeState.getEndpointState(0)) { "Endpoint zero not found." } - val endpointOne = requireNotNull(nodeState.getEndpointState(0)) { "Endpoint one not found." } + val endpointOne = requireNotNull(nodeState.getEndpointState(1)) { "Endpoint one not found." } val basicCluster = requireNotNull(endpointZero.getClusterState(CLUSTER_ID_BASIC)) { @@ -93,6 +96,11 @@ class PairOnNetworkLongImReadCommand( "No local config disabled attribute found." } + val unitTestCluster = + requireNotNull(endpointOne.getClusterState(UNIT_TEST_CLUSTER)) { + "Unit test cluster not found." + } + val startUpEvents = requireNotNull(basicCluster.getEventState(EVENT_ID_START_UP)) { "No start up event found." } @@ -122,6 +130,22 @@ class PairOnNetworkLongImReadCommand( require(checkAllAttributesJsonForFixedLabel(clusterAttributes)) { "Invalid fixed label cluster attributes Json ${clusterAttributes}" } + + require( + checkUnitTestClusterGeneralStatus( + unitTestCluster.getAttributeStatuses()[CLUSTER_ID_TEST_GENERAL_ERROR_BOOLEAN]!! + ) + ) { + "Invalid unit test cluster generalStatus check ${unitTestCluster}" + } + + require( + checkUnitTestClusterClusterStatus( + unitTestCluster.getAttributeStatuses()[CLUSTER_ID_TEST_CLUSTER_ERROR_BOOLEAN]!! + ) + ) { + "Invalid unit test cluster clusterStatus check ${unitTestCluster}" + } } override fun onReport(nodeState: NodeState) { @@ -212,10 +236,15 @@ class PairOnNetworkLongImReadCommand( private const val MATTER_PORT = 5540 private const val CLUSTER_ID_BASIC = 0x0028L private const val FIXED_LABEL_CLUSTER = 0x0040L - private const val UNIT_TEST_CLUSTER = 0xfff1fc05 + private const val UNIT_TEST_CLUSTER = 0xfff1fc05L private const val ATTR_ID_LOCAL_CONFIG_DISABLED = 16L private const val EVENT_ID_START_UP = 0L private const val GLOBAL_ATTRIBUTE_LIST = 65531L 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/light-switch-app/ameba/main/BindingHandler.cpp b/examples/light-switch-app/ameba/main/BindingHandler.cpp index 29acdaae952896..0ffcddc67839eb 100644 --- a/examples/light-switch-app/ameba/main/BindingHandler.cpp +++ b/examples/light-switch-app/ameba/main/BindingHandler.cpp @@ -113,7 +113,7 @@ void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, Operation VerifyOrReturn(context != nullptr, ChipLogError(NotSpecified, "OnDeviceConnectedFn: context is null")); BindingCommandData * data = static_cast(context); - if (binding.type == EMBER_MULTICAST_BINDING && data->isGroup) + if (binding.type == MATTER_MULTICAST_BINDING && data->isGroup) { switch (data->clusterId) { @@ -122,7 +122,7 @@ void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, Operation break; } } - else if (binding.type == EMBER_UNICAST_BINDING && !data->isGroup) + else if (binding.type == MATTER_UNICAST_BINDING && !data->isGroup) { switch (data->clusterId) { @@ -246,7 +246,7 @@ CHIP_ERROR BindingGroupBindCommandHandler(int argc, char ** argv) VerifyOrReturnError(argc == 2, CHIP_ERROR_INVALID_ARGUMENT); EmberBindingTableEntry * entry = Platform::New(); - entry->type = EMBER_MULTICAST_BINDING; + entry->type = MATTER_MULTICAST_BINDING; entry->fabricIndex = atoi(argv[0]); entry->groupId = atoi(argv[1]); entry->local = 1; // Hardcoded to endpoint 1 for now @@ -261,7 +261,7 @@ CHIP_ERROR BindingUnicastBindCommandHandler(int argc, char ** argv) VerifyOrReturnError(argc == 3, CHIP_ERROR_INVALID_ARGUMENT); EmberBindingTableEntry * entry = Platform::New(); - entry->type = EMBER_UNICAST_BINDING; + entry->type = MATTER_UNICAST_BINDING; entry->fabricIndex = atoi(argv[0]); entry->nodeId = atoi(argv[1]); entry->local = 1; // Hardcoded to endpoint 1 for now diff --git a/examples/light-switch-app/asr/src/BindingHandler.cpp b/examples/light-switch-app/asr/src/BindingHandler.cpp index bb2d1d754fc70f..10ee9e2332af30 100644 --- a/examples/light-switch-app/asr/src/BindingHandler.cpp +++ b/examples/light-switch-app/asr/src/BindingHandler.cpp @@ -199,7 +199,7 @@ void BindingHandler::LightSwitchChangedHandler(const EmberBindingTableEntry & aB VerifyOrReturn(context != nullptr, ChipLogError(NotSpecified, "OnDeviceConnectedFn: context is null")); BindingData * data = static_cast(context); - if (aBinding.type == EMBER_MULTICAST_BINDING && data->IsGroup) + if (aBinding.type == MATTER_MULTICAST_BINDING && data->IsGroup) { switch (data->ClusterId) { @@ -214,7 +214,7 @@ void BindingHandler::LightSwitchChangedHandler(const EmberBindingTableEntry & aB break; } } - else if (aBinding.type == EMBER_UNICAST_BINDING && !data->IsGroup) + else if (aBinding.type == MATTER_UNICAST_BINDING && !data->IsGroup) { switch (data->ClusterId) { @@ -255,7 +255,7 @@ bool BindingHandler::IsGroupBound() for (auto & entry : bindingTable) { - if (EMBER_MULTICAST_BINDING == entry.type) + if (MATTER_MULTICAST_BINDING == entry.type) { return true; } @@ -273,7 +273,7 @@ void BindingHandler::PrintBindingTable() { switch (entry.type) { - case EMBER_UNICAST_BINDING: + case MATTER_UNICAST_BINDING: ASR_LOG("[%d] UNICAST:", i++); ASR_LOG("\t\t+ Fabric: %d\n \ \t+ LocalEndpoint %d \n \ @@ -283,7 +283,7 @@ void BindingHandler::PrintBindingTable() (int) entry.fabricIndex, (int) entry.local, (int) entry.clusterId.Value(), (int) entry.remote, (int) entry.nodeId); break; - case EMBER_MULTICAST_BINDING: + case MATTER_MULTICAST_BINDING: ASR_LOG("[%d] GROUP:", i++); ASR_LOG("\t\t+ Fabric: %d\n \ \t+ LocalEndpoint %d \n \ @@ -291,10 +291,10 @@ void BindingHandler::PrintBindingTable() \t+ GroupId %d", (int) entry.fabricIndex, (int) entry.local, (int) entry.remote, (int) entry.groupId); break; - case EMBER_UNUSED_BINDING: + case MATTER_UNUSED_BINDING: ASR_LOG("[%d] UNUSED", i++); break; - // case EMBER_MANY_TO_ONE_BINDING: + // case MATTER_MANY_TO_ONE_BINDING: // ASR_LOG("[%d] MANY TO ONE", i++); // break; default: diff --git a/examples/light-switch-app/esp32/main/BindingHandler.cpp b/examples/light-switch-app/esp32/main/BindingHandler.cpp index 5cc520fd2accd0..9602cd1a534414 100644 --- a/examples/light-switch-app/esp32/main/BindingHandler.cpp +++ b/examples/light-switch-app/esp32/main/BindingHandler.cpp @@ -109,7 +109,7 @@ void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, Operation VerifyOrReturn(context != nullptr, ChipLogError(NotSpecified, "OnDeviceConnectedFn: context is null")); BindingCommandData * data = static_cast(context); - if (binding.type == EMBER_MULTICAST_BINDING && data->isGroup) + if (binding.type == MATTER_MULTICAST_BINDING && data->isGroup) { switch (data->clusterId) { @@ -118,7 +118,7 @@ void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, Operation break; } } - else if (binding.type == EMBER_UNICAST_BINDING && !data->isGroup) + else if (binding.type == MATTER_UNICAST_BINDING && !data->isGroup) { switch (data->clusterId) { @@ -244,7 +244,7 @@ CHIP_ERROR BindingGroupBindCommandHandler(int argc, char ** argv) VerifyOrReturnError(argc == 2, CHIP_ERROR_INVALID_ARGUMENT); EmberBindingTableEntry * entry = Platform::New(); - entry->type = EMBER_MULTICAST_BINDING; + entry->type = MATTER_MULTICAST_BINDING; entry->fabricIndex = atoi(argv[0]); entry->groupId = atoi(argv[1]); entry->local = 1; // Hardcoded to endpoint 1 for now @@ -259,7 +259,7 @@ CHIP_ERROR BindingUnicastBindCommandHandler(int argc, char ** argv) VerifyOrReturnError(argc == 3, CHIP_ERROR_INVALID_ARGUMENT); EmberBindingTableEntry * entry = Platform::New(); - entry->type = EMBER_UNICAST_BINDING; + entry->type = MATTER_UNICAST_BINDING; entry->fabricIndex = atoi(argv[0]); entry->nodeId = atoi(argv[1]); entry->local = 1; // Hardcoded to endpoint 1 for now diff --git a/examples/light-switch-app/genio/src/BindingHandler.cpp b/examples/light-switch-app/genio/src/BindingHandler.cpp index c8392f20ac9c4c..e988464b331afe 100644 --- a/examples/light-switch-app/genio/src/BindingHandler.cpp +++ b/examples/light-switch-app/genio/src/BindingHandler.cpp @@ -119,7 +119,7 @@ void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, Operation // Eason+ ChipLogDetail(AppServer, "LightSwitchChangedHandler~~~~~~~"); - if (binding.type == EMBER_MULTICAST_BINDING && data->isGroup) + if (binding.type == MATTER_MULTICAST_BINDING && data->isGroup) { switch (data->clusterId) { @@ -128,7 +128,7 @@ void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, Operation break; } } - else if (binding.type == EMBER_UNICAST_BINDING && !data->isGroup) + else if (binding.type == MATTER_UNICAST_BINDING && !data->isGroup) { switch (data->clusterId) { @@ -243,7 +243,7 @@ CHIP_ERROR BindingGroupBindCommandHandler(int argc, char ** argv) VerifyOrReturnError(argc == 2, CHIP_ERROR_INVALID_ARGUMENT); EmberBindingTableEntry * entry = Platform::New(); - entry->type = EMBER_MULTICAST_BINDING; + entry->type = MATTER_MULTICAST_BINDING; entry->fabricIndex = atoi(argv[0]); entry->groupId = atoi(argv[1]); entry->local = 1; // Hardcoded to endpoint 1 for now @@ -258,7 +258,7 @@ CHIP_ERROR BindingUnicastBindCommandHandler(int argc, char ** argv) VerifyOrReturnError(argc == 3, CHIP_ERROR_INVALID_ARGUMENT); EmberBindingTableEntry * entry = Platform::New(); - entry->type = EMBER_UNICAST_BINDING; + entry->type = MATTER_UNICAST_BINDING; entry->fabricIndex = atoi(argv[0]); entry->nodeId = atoi(argv[1]); entry->local = 1; // Hardcoded to endpoint 1 for now diff --git a/examples/light-switch-app/infineon/cyw30739/src/AppShellCommands.cpp b/examples/light-switch-app/infineon/cyw30739/src/AppShellCommands.cpp index 477ce99fa44c0b..91cc0c74176a53 100644 --- a/examples/light-switch-app/infineon/cyw30739/src/AppShellCommands.cpp +++ b/examples/light-switch-app/infineon/cyw30739/src/AppShellCommands.cpp @@ -361,7 +361,7 @@ CHIP_ERROR GroupBindCommandHandler(int argc, char ** argv) VerifyOrReturnError(argc == 3, CHIP_ERROR_INVALID_ARGUMENT); EmberBindingTableEntry * entry = Platform::New(); - entry->type = EMBER_MULTICAST_BINDING; + entry->type = MATTER_MULTICAST_BINDING; entry->local = 1; // Hardcoded to endpoint 1 for now entry->fabricIndex = atoi(argv[0]); entry->groupId = atoi(argv[1]); @@ -379,7 +379,7 @@ CHIP_ERROR UnicastBindCommandHandler(int argc, char ** argv) VerifyOrReturnError(argc == 4, CHIP_ERROR_INVALID_ARGUMENT); EmberBindingTableEntry * entry = Platform::New(); - entry->type = EMBER_UNICAST_BINDING; + entry->type = MATTER_UNICAST_BINDING; entry->local = 1; // Hardcoded to endpoint 1 for now entry->fabricIndex = atoi(argv[0]); entry->nodeId = atoi(argv[1]); diff --git a/examples/light-switch-app/infineon/cyw30739/src/BindingHandler.cpp b/examples/light-switch-app/infineon/cyw30739/src/BindingHandler.cpp index bcf66efb2dd81a..4df68993fddae4 100644 --- a/examples/light-switch-app/infineon/cyw30739/src/BindingHandler.cpp +++ b/examples/light-switch-app/infineon/cyw30739/src/BindingHandler.cpp @@ -213,7 +213,7 @@ void BindingHandler::LightSwitchChangedHandler(const EmberBindingTableEntry & bi VerifyOrReturn(context != nullptr, printf("Invalid context for Light switch handler\n");); BindingData * data = static_cast(context); - if (binding.type == EMBER_MULTICAST_BINDING && data->IsGroup) + if (binding.type == MATTER_MULTICAST_BINDING && data->IsGroup) { switch (data->ClusterId) { @@ -228,7 +228,7 @@ void BindingHandler::LightSwitchChangedHandler(const EmberBindingTableEntry & bi break; } } - else if (binding.type == EMBER_UNICAST_BINDING && !data->IsGroup) + else if (binding.type == MATTER_UNICAST_BINDING && !data->IsGroup) { switch (data->ClusterId) { @@ -281,7 +281,7 @@ bool BindingHandler::IsGroupBound() for (auto & entry : bindingTable) { - if (EMBER_MULTICAST_BINDING == entry.type) + if (MATTER_MULTICAST_BINDING == entry.type) { return true; } @@ -299,7 +299,7 @@ void BindingHandler::PrintBindingTable() { switch (entry.type) { - case EMBER_UNICAST_BINDING: + case MATTER_UNICAST_BINDING: printf("[%d] UNICAST:", i++); printf("\t\t+ Fabric: %d\n \ \t+ LocalEndpoint %d \n \ @@ -309,7 +309,7 @@ void BindingHandler::PrintBindingTable() (int) entry.fabricIndex, (int) entry.local, (int) entry.clusterId.Value(), (int) entry.remote, (int) entry.nodeId); break; - case EMBER_MULTICAST_BINDING: + case MATTER_MULTICAST_BINDING: printf("[%d] GROUP:", i++); printf("\t\t+ Fabric: %d\n \ \t+ LocalEndpoint %d \n \ @@ -317,7 +317,7 @@ void BindingHandler::PrintBindingTable() \t+ GroupId %d \n", (int) entry.fabricIndex, (int) entry.local, (int) entry.remote, (int) entry.groupId); break; - case EMBER_UNUSED_BINDING: + case MATTER_UNUSED_BINDING: printf("[%d] UNUSED", i++); break; default: diff --git a/examples/light-switch-app/infineon/cyw30739/src/ZclCallbacks.cpp b/examples/light-switch-app/infineon/cyw30739/src/ZclCallbacks.cpp index 852295fffcd23b..a8e252719ae791 100644 --- a/examples/light-switch-app/infineon/cyw30739/src/ZclCallbacks.cpp +++ b/examples/light-switch-app/infineon/cyw30739/src/ZclCallbacks.cpp @@ -33,7 +33,8 @@ void MatterPostAttributeChangeCallback(const app::ConcreteAttributePath & attrib if (attributePath.mAttributeId == Identify::Attributes::IdentifyTime::Id) { uint16_t identifyTime; - if (EMBER_ZCL_STATUS_SUCCESS == Identify::Attributes::IdentifyTime::Get(attributePath.mEndpointId, &identifyTime)) + if (Protocols::InteractionModel::Status::Success == + Identify::Attributes::IdentifyTime::Get(attributePath.mEndpointId, &identifyTime)) { ChipLogProgress(Zcl, "IdentifyTime %u", identifyTime); return; diff --git a/examples/light-switch-app/nrfconnect/main/BindingHandler.cpp b/examples/light-switch-app/nrfconnect/main/BindingHandler.cpp index 886637fd21018a..0d93428f8dca5e 100644 --- a/examples/light-switch-app/nrfconnect/main/BindingHandler.cpp +++ b/examples/light-switch-app/nrfconnect/main/BindingHandler.cpp @@ -198,7 +198,7 @@ void BindingHandler::LightSwitchChangedHandler(const EmberBindingTableEntry & bi VerifyOrReturn(context != nullptr, LOG_ERR("Invalid context for Light switch handler");); BindingData * data = static_cast(context); - if (binding.type == EMBER_MULTICAST_BINDING && data->IsGroup) + if (binding.type == MATTER_MULTICAST_BINDING && data->IsGroup) { switch (data->ClusterId) { @@ -213,7 +213,7 @@ void BindingHandler::LightSwitchChangedHandler(const EmberBindingTableEntry & bi break; } } - else if (binding.type == EMBER_UNICAST_BINDING && !data->IsGroup) + else if (binding.type == MATTER_UNICAST_BINDING && !data->IsGroup) { switch (data->ClusterId) { @@ -259,7 +259,7 @@ bool BindingHandler::IsGroupBound() for (auto & entry : bindingTable) { - if (EMBER_MULTICAST_BINDING == entry.type) + if (MATTER_MULTICAST_BINDING == entry.type) { return true; } @@ -277,7 +277,7 @@ void BindingHandler::PrintBindingTable() { switch (entry.type) { - case EMBER_UNICAST_BINDING: + case MATTER_UNICAST_BINDING: LOG_INF("[%d] UNICAST:", i++); LOG_INF("\t\t+ Fabric: %d\n \ \t+ LocalEndpoint %d \n \ @@ -287,7 +287,7 @@ void BindingHandler::PrintBindingTable() (int) entry.fabricIndex, (int) entry.local, (int) entry.clusterId.Value(), (int) entry.remote, (int) entry.nodeId); break; - case EMBER_MULTICAST_BINDING: + case MATTER_MULTICAST_BINDING: LOG_INF("[%d] GROUP:", i++); LOG_INF("\t\t+ Fabric: %d\n \ \t+ LocalEndpoint %d \n \ @@ -295,7 +295,7 @@ void BindingHandler::PrintBindingTable() \t+ GroupId %d", (int) entry.fabricIndex, (int) entry.local, (int) entry.remote, (int) entry.groupId); break; - case EMBER_UNUSED_BINDING: + case MATTER_UNUSED_BINDING: LOG_INF("[%d] UNUSED", i++); break; default: diff --git a/examples/light-switch-app/qpg/src/AppTask.cpp b/examples/light-switch-app/qpg/src/AppTask.cpp index f02823b178220d..318e61b1e875c8 100644 --- a/examples/light-switch-app/qpg/src/AppTask.cpp +++ b/examples/light-switch-app/qpg/src/AppTask.cpp @@ -495,11 +495,12 @@ void AppTask::UpdateClusterState(void) /* write the new attribute value based on attribute setter API. example API usage of on-off attribute: - EmberAfStatus status = Clusters::OnOff::Attributes::OnOff::Set(QPG_LIGHT_ENDPOINT_ID, LightingMgr().IsTurnedOn()); + Protocols::InteractionModel::Status status = Clusters::OnOff::Attributes::OnOff::Set(QPG_LIGHT_ENDPOINT_ID, + LightingMgr().IsTurnedOn()); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: updating on/off %x", status); + ChipLogError(NotSpecified, "ERR: updating on/off %x", to_underlying(status)); } */ } diff --git a/examples/light-switch-app/qpg/src/binding-handler.cpp b/examples/light-switch-app/qpg/src/binding-handler.cpp index 6369aa0ab06c25..4dae4e12b44155 100644 --- a/examples/light-switch-app/qpg/src/binding-handler.cpp +++ b/examples/light-switch-app/qpg/src/binding-handler.cpp @@ -73,7 +73,7 @@ static void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, Op BindingCommandData * data = static_cast(context); - if (binding.type == EMBER_UNICAST_BINDING) + if (binding.type == MATTER_UNICAST_BINDING) { switch (data->clusterId) { diff --git a/examples/light-switch-app/silabs/README.md b/examples/light-switch-app/silabs/README.md index 615b27c7bc3cd9..401e9b88b41fac 100644 --- a/examples/light-switch-app/silabs/README.md +++ b/examples/light-switch-app/silabs/README.md @@ -254,22 +254,30 @@ combination with JLinkRTTClient as follows: [SVR] Copy/paste the below URL in a browser to see the QR Code: [SVR] https://project-chip.github.io/connectedhomeip/qrcode.html?data=CH%3AI34NM%20-00%200C9SS0 - **LED 0** shows the overall state of the device and its connectivity. The - following states are possible: + **LED 0** - - Short Flash On (50 ms on/950 ms off): The device is in the + - ICD Configuration (Default) - LED is only active under two circumstances: + + 1. Factory reset sequence - LED will blink when initiated upon press and hold of + Button 0 after 3 seconds + 2. An Identify command was received + + - Non-ICD Configuration - 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 + 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 + Short Flash Off (950ms on/50ms off): The device is fully provisioned, but does not yet have full Thread network or service connectivity. - - Solid On: The device is fully provisioned and has full Thread + Solid On: The device is fully provisioned and has full Thread network and service connectivity. **Push Button 0** diff --git a/examples/light-switch-app/silabs/openthread.gni b/examples/light-switch-app/silabs/openthread.gni index 2ea7cd471c2b8a..17cc5885460379 100644 --- a/examples/light-switch-app/silabs/openthread.gni +++ b/examples/light-switch-app/silabs/openthread.gni @@ -35,6 +35,6 @@ sl_ot_idle_interval_ms = 15000 # 15s Idle Intervals sl_ot_active_interval_ms = 500 # 500ms Active Intervals # ICD Matter Configuration flags -sl_idle_mode_interval_s = 3600 # 60min Idle Mode Interval -sl_active_mode_interval_ms = 60000 # 60s Active Mode Interval +sl_idle_mode_duration_s = 3600 # 60min Idle Mode Duration +sl_active_mode_duration_ms = 60000 # 60s Active Mode Duration sl_active_mode_threshold_ms = 1000 # 1s Active Mode Threshold diff --git a/examples/light-switch-app/silabs/src/BindingHandler.cpp b/examples/light-switch-app/silabs/src/BindingHandler.cpp index 3f75f79a60d82c..56f7c306f989d8 100644 --- a/examples/light-switch-app/silabs/src/BindingHandler.cpp +++ b/examples/light-switch-app/silabs/src/BindingHandler.cpp @@ -90,7 +90,7 @@ void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, Operation VerifyOrReturn(context != nullptr, ChipLogError(NotSpecified, "OnDeviceConnectedFn: context is null")); BindingCommandData * data = static_cast(context); - if (binding.type == EMBER_MULTICAST_BINDING && data->isGroup) + if (binding.type == MATTER_MULTICAST_BINDING && data->isGroup) { switch (data->clusterId) { @@ -99,7 +99,7 @@ void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, Operation break; } } - else if (binding.type == EMBER_UNICAST_BINDING && !data->isGroup) + else if (binding.type == MATTER_UNICAST_BINDING && !data->isGroup) { switch (data->clusterId) { diff --git a/examples/light-switch-app/silabs/src/ShellCommands.cpp b/examples/light-switch-app/silabs/src/ShellCommands.cpp index daac5078501858..ee5872276efe19 100644 --- a/examples/light-switch-app/silabs/src/ShellCommands.cpp +++ b/examples/light-switch-app/silabs/src/ShellCommands.cpp @@ -139,7 +139,7 @@ CHIP_ERROR BindingGroupBindCommandHandler(int argc, char ** argv) VerifyOrReturnError(argc == 2, CHIP_ERROR_INVALID_ARGUMENT); EmberBindingTableEntry * entry = Platform::New(); - entry->type = EMBER_MULTICAST_BINDING; + entry->type = MATTER_MULTICAST_BINDING; entry->fabricIndex = atoi(argv[0]); entry->groupId = atoi(argv[1]); entry->local = 1; // Hardcoded to endpoint 1 for now @@ -154,7 +154,7 @@ CHIP_ERROR BindingUnicastBindCommandHandler(int argc, char ** argv) VerifyOrReturnError(argc == 3, CHIP_ERROR_INVALID_ARGUMENT); EmberBindingTableEntry * entry = Platform::New(); - entry->type = EMBER_UNICAST_BINDING; + entry->type = MATTER_UNICAST_BINDING; entry->fabricIndex = atoi(argv[0]); entry->nodeId = atoi(argv[1]); entry->local = 1; // Hardcoded to endpoint 1 for now diff --git a/examples/light-switch-app/telink/src/binding-handler.cpp b/examples/light-switch-app/telink/src/binding-handler.cpp index f982266828c583..39a8cddc2c60f8 100755 --- a/examples/light-switch-app/telink/src/binding-handler.cpp +++ b/examples/light-switch-app/telink/src/binding-handler.cpp @@ -113,7 +113,7 @@ void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, Operation BindingCommandData * data = static_cast(context); data->isGroup = IsGroupBound(); - if (binding.type == EMBER_MULTICAST_BINDING && data->isGroup) + if (binding.type == MATTER_MULTICAST_BINDING && data->isGroup) { switch (data->clusterId) { @@ -122,7 +122,7 @@ void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, Operation break; } } - else if (binding.type == EMBER_UNICAST_BINDING && !data->isGroup) + else if (binding.type == MATTER_UNICAST_BINDING && !data->isGroup) { switch (data->clusterId) { @@ -239,7 +239,7 @@ CHIP_ERROR BindingGroupBindCommandHandler(int argc, char ** argv) VerifyOrReturnError(argc == 2, CHIP_ERROR_INVALID_ARGUMENT); EmberBindingTableEntry * entry = Platform::New(); - entry->type = EMBER_MULTICAST_BINDING; + entry->type = MATTER_MULTICAST_BINDING; entry->fabricIndex = atoi(argv[0]); entry->groupId = atoi(argv[1]); entry->local = 1; // Hardcoded to endpoint 1 for now @@ -254,7 +254,7 @@ CHIP_ERROR BindingUnicastBindCommandHandler(int argc, char ** argv) VerifyOrReturnError(argc == 3, CHIP_ERROR_INVALID_ARGUMENT); EmberBindingTableEntry * entry = Platform::New(); - entry->type = EMBER_UNICAST_BINDING; + entry->type = MATTER_UNICAST_BINDING; entry->fabricIndex = atoi(argv[0]); entry->nodeId = atoi(argv[1]); entry->local = 1; // Hardcoded to endpoint 1 for now @@ -409,7 +409,7 @@ bool IsGroupBound() for (auto & entry : bindingTable) { - if (EMBER_MULTICAST_BINDING == entry.type) + if (MATTER_MULTICAST_BINDING == entry.type) { return true; } diff --git a/examples/lighting-app/asr/src/AppTask.cpp b/examples/lighting-app/asr/src/AppTask.cpp index e9467d294ef136..b72ff5c8588f31 100755 --- a/examples/lighting-app/asr/src/AppTask.cpp +++ b/examples/lighting-app/asr/src/AppTask.cpp @@ -82,13 +82,13 @@ CHIP_ERROR AppTask::StartAppTask() bool IsLightOn() { - EmberAfStatus status; + Protocols::InteractionModel::Status status; bool on = true; status = app::Clusters::OnOff::Attributes::OnOff::Get(1, &on); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ASR_LOG("Error Read OnOff Attribute 0x%02x\n", status); + ASR_LOG("Error Read OnOff Attribute 0x%02x\n", to_underlying(status)); } return on != false; @@ -96,14 +96,14 @@ bool IsLightOn() uint8_t GetLightLevel() { - EmberAfStatus status; + Protocols::InteractionModel::Status status; app::DataModel::Nullable currentLevel; status = app::Clusters::LevelControl::Attributes::CurrentLevel::Get(1, currentLevel); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ASR_LOG("Error Read CurrentLevel Attribute 0x%02x\n", status); + ASR_LOG("Error Read CurrentLevel Attribute 0x%02x\n", to_underlying(status)); return -1; } diff --git a/examples/lighting-app/bouffalolab/common/AppTask.cpp b/examples/lighting-app/bouffalolab/common/AppTask.cpp index a0eb17fd747eec..fafc9943e24890 100644 --- a/examples/lighting-app/bouffalolab/common/AppTask.cpp +++ b/examples/lighting-app/bouffalolab/common/AppTask.cpp @@ -252,22 +252,25 @@ void AppTask::LightingUpdate(app_event_t status) { do { - if (EMBER_ZCL_STATUS_SUCCESS != Clusters::OnOff::Attributes::OnOff::Get(endpoint, &onoff)) + if (Protocols::InteractionModel::Status::Success != Clusters::OnOff::Attributes::OnOff::Get(endpoint, &onoff)) { break; } - if (EMBER_ZCL_STATUS_SUCCESS != Clusters::LevelControl::Attributes::CurrentLevel::Get(endpoint, v)) + if (Protocols::InteractionModel::Status::Success != + Clusters::LevelControl::Attributes::CurrentLevel::Get(endpoint, v)) { break; } - if (EMBER_ZCL_STATUS_SUCCESS != Clusters::ColorControl::Attributes::CurrentHue::Get(endpoint, &hue)) + if (Protocols::InteractionModel::Status::Success != + Clusters::ColorControl::Attributes::CurrentHue::Get(endpoint, &hue)) { break; } - if (EMBER_ZCL_STATUS_SUCCESS != Clusters::ColorControl::Attributes::CurrentSaturation::Get(endpoint, &sat)) + if (Protocols::InteractionModel::Status::Success != + Clusters::ColorControl::Attributes::CurrentSaturation::Get(endpoint, &sat)) { break; } diff --git a/examples/lighting-app/cc13x2x7_26x2x7/BUILD.gn b/examples/lighting-app/cc13x2x7_26x2x7/BUILD.gn index a745c65a1407cf..1292b5f5e9626c 100644 --- a/examples/lighting-app/cc13x2x7_26x2x7/BUILD.gn +++ b/examples/lighting-app/cc13x2x7_26x2x7/BUILD.gn @@ -55,7 +55,7 @@ ti_sysconfig("sysconfig") { ] } - public_configs = [ ":sdk_dmm_config" ] + public_configs = [ ":sdk_cc13x2x7_26x2x7_dmm_config" ] cflags = [ "-Wno-comment", diff --git a/examples/lighting-app/cc13x4_26x4/BUILD.gn b/examples/lighting-app/cc13x4_26x4/BUILD.gn index f4e9ce30d080aa..02d9b0b8763ee7 100644 --- a/examples/lighting-app/cc13x4_26x4/BUILD.gn +++ b/examples/lighting-app/cc13x4_26x4/BUILD.gn @@ -63,7 +63,7 @@ ti_sysconfig("sysconfig") { #"ti_build_config.opt", ] - public_configs = [ ":sdk_dmm_config" ] + public_configs = [ ":sdk_cc13x4_26x4_dmm_config" ] cflags = [ "-Wno-comment", diff --git a/examples/lighting-app/esp32/main/AppTask.cpp b/examples/lighting-app/esp32/main/AppTask.cpp index 33b1505aafc581..562ee4b763faff 100644 --- a/examples/lighting-app/esp32/main/AppTask.cpp +++ b/examples/lighting-app/esp32/main/AppTask.cpp @@ -189,18 +189,18 @@ void AppTask::UpdateClusterState() { ESP_LOGI(TAG, "Writing to OnOff cluster"); // write the new on/off value - EmberAfStatus status = Clusters::OnOff::Attributes::OnOff::Set(kLightEndpointId, AppLED.IsTurnedOn()); + Protocols::InteractionModel::Status status = Clusters::OnOff::Attributes::OnOff::Set(kLightEndpointId, AppLED.IsTurnedOn()); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ESP_LOGE(TAG, "Updating on/off cluster failed: %x", status); + ESP_LOGE(TAG, "Updating on/off cluster failed: %x", to_underlying(status)); } ESP_LOGI(TAG, "Writing to Current Level cluster"); status = Clusters::LevelControl::Attributes::CurrentLevel::Set(kLightEndpointId, AppLED.GetLevel()); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ESP_LOGE(TAG, "Updating level cluster failed: %x", status); + ESP_LOGE(TAG, "Updating level cluster failed: %x", to_underlying(status)); } } diff --git a/examples/lighting-app/genio/src/ZclCallbacks.cpp b/examples/lighting-app/genio/src/ZclCallbacks.cpp index 9d0a4d97c09e9b..30faa57990ba7f 100644 --- a/examples/lighting-app/genio/src/ZclCallbacks.cpp +++ b/examples/lighting-app/genio/src/ZclCallbacks.cpp @@ -55,7 +55,7 @@ void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & } else if (clusterId == ColorControl::Id) { - EmberAfStatus status; + Protocols::InteractionModel::Status status; /* ignore several attributes that are currently not processed */ if ((attributeId == ColorControl::Attributes::RemainingTime::Id) || (attributeId == ColorControl::Attributes::EnhancedColorMode::Id) || diff --git a/examples/lighting-app/infineon/cyw30739/src/LightingManager.cpp b/examples/lighting-app/infineon/cyw30739/src/LightingManager.cpp index b7fa437127bacb..3af2ffad095f9b 100644 --- a/examples/lighting-app/infineon/cyw30739/src/LightingManager.cpp +++ b/examples/lighting-app/infineon/cyw30739/src/LightingManager.cpp @@ -49,12 +49,12 @@ bool LightingManager::IsActionInProgress() bool LightingManager::IsLightOn(void) { - bool on = true; - const EmberAfStatus status = OnOff::Attributes::OnOff::Get(1, &on); + bool on = true; + const Protocols::InteractionModel::Status status = OnOff::Attributes::OnOff::Get(1, &on); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - printf("Error ReadServerAttribute 0x%02x\n", status); + printf("Error ReadServerAttribute 0x%02x\n", to_underlying(status)); } return on != false; @@ -99,20 +99,20 @@ bool LightingManager::InitiateAction(Actor_t aActor, Action_t aAction, uint8_t v void LightingManager::WriteClusterState(uint8_t value) { - const EmberAfStatus status = OnOff::Attributes::OnOff::Set(1, value); + const Protocols::InteractionModel::Status status = OnOff::Attributes::OnOff::Set(1, value); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - printf("Error WriteServerAttribute 0x%02x\n", status); + printf("Error WriteServerAttribute 0x%02x\n", to_underlying(status)); } } void LightingManager::WriteClusterLevel(uint8_t value) { - const EmberAfStatus status = LevelControl::Attributes::CurrentLevel::Set(1, value); + const Protocols::InteractionModel::Status status = LevelControl::Attributes::CurrentLevel::Set(1, value); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - printf("Error WriteServerAttribute 0x%02x\n", status); + printf("Error WriteServerAttribute 0x%02x\n", to_underlying(status)); } } diff --git a/examples/lighting-app/infineon/cyw30739/src/ZclCallbacks.cpp b/examples/lighting-app/infineon/cyw30739/src/ZclCallbacks.cpp index 4f0222ca740ca3..0b00eaec57687a 100644 --- a/examples/lighting-app/infineon/cyw30739/src/ZclCallbacks.cpp +++ b/examples/lighting-app/infineon/cyw30739/src/ZclCallbacks.cpp @@ -53,7 +53,8 @@ void MatterPostAttributeChangeCallback(const app::ConcreteAttributePath & attrib if (attributePath.mAttributeId == Identify::Attributes::IdentifyTime::Id) { uint16_t identifyTime; - if (EMBER_ZCL_STATUS_SUCCESS == Identify::Attributes::IdentifyTime::Get(attributePath.mEndpointId, &identifyTime)) + if (Protocols::InteractionModel::Status::Success == + Identify::Attributes::IdentifyTime::Get(attributePath.mEndpointId, &identifyTime)) { ChipLogProgress(Zcl, "IdentifyTime %u", identifyTime); return; diff --git a/examples/lighting-app/infineon/psoc6/src/AppTask.cpp b/examples/lighting-app/infineon/psoc6/src/AppTask.cpp index 2315086b246594..49e6278ab032c9 100644 --- a/examples/lighting-app/infineon/psoc6/src/AppTask.cpp +++ b/examples/lighting-app/infineon/psoc6/src/AppTask.cpp @@ -555,10 +555,10 @@ void AppTask::UpdateClusterState(intptr_t context) uint8_t newValue = LightMgr().IsLightOn(); // write the new on/off value - EmberAfStatus status = app::Clusters::OnOff::Attributes::OnOff::Set(1, newValue); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Protocols::InteractionModel::Status status = app::Clusters::OnOff::Attributes::OnOff::Set(1, newValue); + if (status != Protocols::InteractionModel::Status::Success) { - P6_LOG("ERR: updating on/off %x", status); + P6_LOG("ERR: updating on/off %x", to_underlying(status)); } } #if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR diff --git a/examples/lighting-app/linux/LightingAppCommandDelegate.cpp b/examples/lighting-app/linux/LightingAppCommandDelegate.cpp index cafc1df1161359..e6ac7b3970c148 100644 --- a/examples/lighting-app/linux/LightingAppCommandDelegate.cpp +++ b/examples/lighting-app/linux/LightingAppCommandDelegate.cpp @@ -259,8 +259,9 @@ void LightingAppCommandHandler::OnSwitchLatchedHandler(uint8_t newPosition) { EndpointId endpoint = 0; - EmberAfStatus status = Switch::Attributes::CurrentPosition::Set(endpoint, newPosition); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(NotSpecified, "Failed to set CurrentPosition attribute")); + Protocols::InteractionModel::Status status = Switch::Attributes::CurrentPosition::Set(endpoint, newPosition); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, + ChipLogError(NotSpecified, "Failed to set CurrentPosition attribute")); ChipLogDetail(NotSpecified, "The latching switch is moved to a new position:%d", newPosition); Clusters::SwitchServer::Instance().OnSwitchLatch(endpoint, newPosition); @@ -270,8 +271,9 @@ void LightingAppCommandHandler::OnSwitchInitialPressedHandler(uint8_t newPositio { EndpointId endpoint = 0; - EmberAfStatus status = Switch::Attributes::CurrentPosition::Set(endpoint, newPosition); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(NotSpecified, "Failed to set CurrentPosition attribute")); + Protocols::InteractionModel::Status status = Switch::Attributes::CurrentPosition::Set(endpoint, newPosition); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, + ChipLogError(NotSpecified, "Failed to set CurrentPosition attribute")); ChipLogDetail(NotSpecified, "The new position when the momentary switch starts to be pressed:%d", newPosition); Clusters::SwitchServer::Instance().OnInitialPress(endpoint, newPosition); @@ -281,8 +283,9 @@ void LightingAppCommandHandler::OnSwitchLongPressedHandler(uint8_t newPosition) { EndpointId endpoint = 0; - EmberAfStatus status = Switch::Attributes::CurrentPosition::Set(endpoint, newPosition); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(NotSpecified, "Failed to set CurrentPosition attribute")); + Protocols::InteractionModel::Status status = Switch::Attributes::CurrentPosition::Set(endpoint, newPosition); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, + ChipLogError(NotSpecified, "Failed to set CurrentPosition attribute")); ChipLogDetail(NotSpecified, "The new position when the momentary switch has been pressed for a long time:%d", newPosition); Clusters::SwitchServer::Instance().OnLongPress(endpoint, newPosition); @@ -292,8 +295,9 @@ void LightingAppCommandHandler::OnSwitchShortReleasedHandler(uint8_t previousPos { EndpointId endpoint = 0; - EmberAfStatus status = Switch::Attributes::CurrentPosition::Set(endpoint, 0); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(NotSpecified, "Failed to reset CurrentPosition attribute")); + Protocols::InteractionModel::Status status = Switch::Attributes::CurrentPosition::Set(endpoint, 0); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, + ChipLogError(NotSpecified, "Failed to reset CurrentPosition attribute")); ChipLogDetail(NotSpecified, "The the previous value of the CurrentPosition when the momentary switch has been released:%d", previousPosition); @@ -304,8 +308,9 @@ void LightingAppCommandHandler::OnSwitchLongReleasedHandler(uint8_t previousPosi { EndpointId endpoint = 0; - EmberAfStatus status = Switch::Attributes::CurrentPosition::Set(endpoint, 0); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(NotSpecified, "Failed to reset CurrentPosition attribute")); + Protocols::InteractionModel::Status status = Switch::Attributes::CurrentPosition::Set(endpoint, 0); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, + ChipLogError(NotSpecified, "Failed to reset CurrentPosition attribute")); ChipLogDetail(NotSpecified, "The the previous value of the CurrentPosition when the momentary switch has been released after having been " "pressed for a long time:%d", @@ -318,8 +323,9 @@ void LightingAppCommandHandler::OnSwitchMultiPressOngoingHandler(uint8_t newPosi { EndpointId endpoint = 0; - EmberAfStatus status = Switch::Attributes::CurrentPosition::Set(endpoint, newPosition); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(NotSpecified, "Failed to set CurrentPosition attribute")); + Protocols::InteractionModel::Status status = Switch::Attributes::CurrentPosition::Set(endpoint, newPosition); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, + ChipLogError(NotSpecified, "Failed to set CurrentPosition attribute")); ChipLogDetail(NotSpecified, "The new position when the momentary switch has been pressed in a multi-press sequence:%d", newPosition); ChipLogDetail(NotSpecified, "%d times the momentary switch has been pressed", count); @@ -331,8 +337,9 @@ void LightingAppCommandHandler::OnSwitchMultiPressCompleteHandler(uint8_t previo { EndpointId endpoint = 0; - EmberAfStatus status = Switch::Attributes::CurrentPosition::Set(endpoint, 0); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(NotSpecified, "Failed to reset CurrentPosition attribute")); + Protocols::InteractionModel::Status status = Switch::Attributes::CurrentPosition::Set(endpoint, 0); + VerifyOrReturn(Protocols::InteractionModel::Status::Success == status, + ChipLogError(NotSpecified, "Failed to reset CurrentPosition attribute")); ChipLogDetail(NotSpecified, "The previous position when the momentary switch has been pressed in a multi-press sequence:%d", previousPosition); ChipLogDetail(NotSpecified, "%d times the momentary switch has been pressed", count); diff --git a/examples/lighting-app/mbed/main/AppTask.cpp b/examples/lighting-app/mbed/main/AppTask.cpp index fdbe8ea0cce291..26403bdb5e5b28 100644 --- a/examples/lighting-app/mbed/main/AppTask.cpp +++ b/examples/lighting-app/mbed/main/AppTask.cpp @@ -462,18 +462,18 @@ void AppTask::UpdateClusterState() uint8_t onoff = LightingMgr().IsTurnedOn(); // write the new on/off value - EmberAfStatus status = app::Clusters::OnOff::Attributes::OnOff::Set(1, onoff); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Protocols::InteractionModel::Status status = app::Clusters::OnOff::Attributes::OnOff::Set(1, onoff); + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "Updating on/off cluster failed: %x", status); + ChipLogError(NotSpecified, "Updating on/off cluster failed: %x", to_underlying(status)); } uint8_t level = LightingMgr().GetLevel(); status = app::Clusters::LevelControl::Attributes::CurrentLevel::Set(1, level); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "Updating level cluster failed: %x", status); + ChipLogError(NotSpecified, "Updating level cluster failed: %x", to_underlying(status)); } } diff --git a/examples/lighting-app/nrfconnect/main/AppTask.cpp b/examples/lighting-app/nrfconnect/main/AppTask.cpp index 494095e04de9dc..5eaa1b1b401524 100644 --- a/examples/lighting-app/nrfconnect/main/AppTask.cpp +++ b/examples/lighting-app/nrfconnect/main/AppTask.cpp @@ -689,19 +689,20 @@ void AppTask::UpdateClusterState() { SystemLayer().ScheduleLambda([this] { // write the new on/off value - EmberAfStatus status = Clusters::OnOff::Attributes::OnOff::Set(kLightEndpointId, mPWMDevice.IsTurnedOn()); + Protocols::InteractionModel::Status status = + Clusters::OnOff::Attributes::OnOff::Set(kLightEndpointId, mPWMDevice.IsTurnedOn()); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - LOG_ERR("Updating on/off cluster failed: %x", status); + LOG_ERR("Updating on/off cluster failed: %x", to_underlying(status)); } // write the current level status = Clusters::LevelControl::Attributes::CurrentLevel::Set(kLightEndpointId, mPWMDevice.GetLevel()); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - LOG_ERR("Updating level cluster failed: %x", status); + LOG_ERR("Updating level cluster failed: %x", to_underlying(status)); } }); } diff --git a/examples/lighting-app/nrfconnect/main/ZclCallbacks.cpp b/examples/lighting-app/nrfconnect/main/ZclCallbacks.cpp index eeb83262bfb804..b872a1c8416d49 100644 --- a/examples/lighting-app/nrfconnect/main/ZclCallbacks.cpp +++ b/examples/lighting-app/nrfconnect/main/ZclCallbacks.cpp @@ -73,12 +73,12 @@ void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & */ void emberAfOnOffClusterInitCallback(EndpointId endpoint) { - EmberAfStatus status; + Protocols::InteractionModel::Status status; bool storedValue; // Read storedValue on/off value status = Attributes::OnOff::Get(endpoint, &storedValue); - if (status == EMBER_ZCL_STATUS_SUCCESS) + if (status == Protocols::InteractionModel::Status::Success) { // Set actual state to the cluster state that was last persisted AppTask::Instance().GetPWMDevice().InitiateAction(storedValue ? PWMDevice::ON_ACTION : PWMDevice::OFF_ACTION, diff --git a/examples/lighting-app/nxp/k32w/k32w0/main/AppTask.cpp b/examples/lighting-app/nxp/k32w/k32w0/main/AppTask.cpp index b1fc51c7c29360..39c9584c883480 100644 --- a/examples/lighting-app/nxp/k32w/k32w0/main/AppTask.cpp +++ b/examples/lighting-app/nxp/k32w/k32w0/main/AppTask.cpp @@ -955,10 +955,10 @@ void AppTask::UpdateClusterStateInternal(intptr_t arg) uint8_t newValue = !LightingMgr().IsTurnedOff(); // write the new on/off value - EmberAfStatus status = app::Clusters::OnOff::Attributes::OnOff::Set(1, newValue); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Protocols::InteractionModel::Status status = app::Clusters::OnOff::Attributes::OnOff::Set(1, newValue); + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: updating on/off %x", status); + ChipLogError(NotSpecified, "ERR: updating on/off %x", to_underlying(status)); } } diff --git a/examples/lighting-app/nxp/k32w/k32w1/.gn b/examples/lighting-app/nxp/k32w/k32w1/.gn index 3d48789e30ab3d..a88f6f5aa7cb3f 100644 --- a/examples/lighting-app/nxp/k32w/k32w1/.gn +++ b/examples/lighting-app/nxp/k32w/k32w1/.gn @@ -25,4 +25,7 @@ default_args = { target_os = "freertos" import("//args.gni") + + # Import default platform configs + import("${chip_root}/src/platform/nxp/k32w/k32w1/args.gni") } diff --git a/examples/lighting-app/nxp/k32w/k32w1/BUILD.gn b/examples/lighting-app/nxp/k32w/k32w1/BUILD.gn index a7643a9f847931..2f327213533e94 100644 --- a/examples/lighting-app/nxp/k32w/k32w1/BUILD.gn +++ b/examples/lighting-app/nxp/k32w/k32w1/BUILD.gn @@ -13,15 +13,26 @@ # limitations under the License. import("//build_overrides/chip.gni") -import("//build_overrides/k32w1_sdk.gni") +import("//build_overrides/nxp_sdk.gni") import("//build_overrides/openthread.gni") +import("${nxp_sdk_build_root}/nxp_sdk.gni") -import("${k32w1_sdk_build_root}/k32w1_executable.gni") -import("${k32w1_sdk_build_root}/k32w1_sdk.gni") +import("${nxp_sdk_build_root}/${nxp_sdk_name}/nxp_executable.gni") + +import("${nxp_sdk_build_root}/${nxp_sdk_name}/${nxp_sdk_name}.gni") import("${chip_root}/src/crypto/crypto.gni") import("${chip_root}/src/lib/core/core.gni") import("${chip_root}/src/platform/device.gni") +import("${chip_root}/src/platform/nxp/${nxp_platform}/args.gni") + +import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni") + +if (chip_enable_pw_rpc) { + import("//build_overrides/pigweed.gni") + import("$dir_pw_build/target_types.gni") + import("${chip_root}/examples/platform/nxp/pw_rpc_server.gni") +} declare_args() { chip_software_version = 0 @@ -65,12 +76,30 @@ k32w1_sdk("sdk") { "CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION=${chip_software_version}", ] } + + if (chip_enable_pw_rpc) { + defines += [ + "PW_RPC_ENABLED", + "STREAMER_UART_FLUSH_DELAY_MS=0", + "STREAMER_UART_SERIAL_MANAGER_RING_BUFFER_SIZE=512", + "BOARD_APP_UART_CLK_FREQ=96000000", + ] + } } k32w1_executable("light_app") { output_name = "chip-k32w1-light-example" - sources = [ + sources = [] + deps = [] + + if (chip_enable_pw_rpc) { + forward_variables_from(pw_rpc_server, "*") + } else { + cflags = [ "-Wconversion" ] + } + + sources += [ "${k32w1_platform_dir}/util/LEDWidget.cpp", "${k32w1_platform_dir}/util/include/LEDWidget.h", "main/AppTask.cpp", @@ -84,7 +113,7 @@ k32w1_executable("light_app") { public = [ "${chip_root}/src/platform/nxp/k32w/k32w1/DefaultTestEventTriggerDelegate.h" ] - deps = [ + deps += [ ":sdk", "${chip_root}/examples/common/QRCode", "${chip_root}/examples/lighting-app/nxp/zap/", @@ -107,9 +136,7 @@ k32w1_executable("light_app") { ] } - cflags = [ "-Wconversion" ] - - if (use_smu2_as_system_memory) { + if (use_smu2_static) { ldscript = "${k32w1_platform_dir}/app/ldscripts/k32w1_app.ld" base_ldscript_dir = "${k32w1_sdk_root}/middleware/wireless/framework/Common/devices/kw45_k32w1/gcc" } else { @@ -121,13 +148,17 @@ k32w1_executable("light_app") { ldflags = [ "-Wl,--defsym=__heap_size__=0", "-Wl,--defsym=__stack_size__=0x480", - "-Wl,--defsym=gNvmSectors=8", + "-Wl,--defsym=gUseFactoryData_d=1", "-Wl,-print-memory-usage", "-Wl,--no-warn-rwx-segments", "-T" + rebase_path(ldscript, root_build_dir), ] - if (use_smu2_as_system_memory) { + if (chip_with_factory_data == 1) { + ldflags += [ "-Wl,--defsym=gUseFactoryData_d=1" ] + } + + if (use_smu2_static) { ldflags += [ "-L" + rebase_path(base_ldscript_dir, root_build_dir) ] } diff --git a/examples/lighting-app/nxp/k32w/k32w1/README.md b/examples/lighting-app/nxp/k32w/k32w1/README.md index 92dca287111449..253c21e04eafbb 100644 --- a/examples/lighting-app/nxp/k32w/k32w1/README.md +++ b/examples/lighting-app/nxp/k32w/k32w1/README.md @@ -22,6 +22,7 @@ into an existing Matter network and can be controlled by this network. - [Device UI](#device-ui) - [Building](#building) - [SMU2](#smu2-memory) +- [Manufacturing data](#manufacturing-data) - [Flashing](#flashing) - [Flashing the NBU image](#flashing-the-nbu-image) - [Flashing the host image](#flashing-the-host-image) @@ -33,6 +34,8 @@ into an existing Matter network and can be controlled by this network. - [Running OTA](#running-ota) - [Known issues](#known-issues) +- [Running RPC console](#running-rpc-console) + ## Introduction @@ -112,7 +115,8 @@ point before the 6 second limit. **Button SW3** can be used to change the state of the simulated light bulb. This can be used to mimic a user manually operating a switch. The button behaves as a -toggle, swapping the state every time it is pressed. +toggle, swapping the state every time it is short pressed. When long pressed, it +does a clean soft reset that takes into account Matter shutdown procedure. ## Building @@ -147,8 +151,8 @@ see the files prefixed with `chip-k32w1-light-example`. Some Matter instances and global variables can be placed in the `NBU` `SMU2` memory. When compiling with OpenThread FTD support (`chip_openthread_ftd=true`) -and with `use_smu2_as_system_memory=true`, the following components are placed -in `SMU2` memory: +and with `use_smu2_static=true`, the following components are placed in `SMU2` +memory: - `gImageProcessor` from `OTAImageProcessorImpl.cpp`. - `gApplicationProcessor` from `OTAHooks.cpp`. @@ -161,8 +165,18 @@ changed, the names must be updated in `k32w1_app.ld`. See [k32w1_app.ld](../../../../platform/nxp/k32w/k32w1/app/ldscripts/k32w1_app.ld) for names and `SMU2` memory range size. -To use the `SMU2` Memory an optimized `NBU` binary is also needed. See -[Flashing the NBU image](#flashing-the-nbu-image). +The OpenThread buffers can be allocated from a 13KB `SMU2` range after a +successful commissioning process until a factory reset is initiated. This way, +the OpenThread buffers will be dynamically allocated instead of statically, +freeing some `SRAM`. To enable this feature compile with OpenThread FTD support +(`chip_openthread_ftd=true`) and with `use_smu2_dynamic=true`. + +## Manufacturing data + +Use `chip_with_factory_data=1` in the gn build command to enable factory data. + +For a full guide on manufacturing flow, please see +[Guide for writing manufacturing data on NXP devices](../../../../../docs/guides/nxp_manufacturing_flow.md). ## Flashing @@ -423,3 +437,22 @@ user@computer1:~/connectedhomeip$ sudo ifconfig eth0 -multicast - If Wi-Fi is used on a RPI4, then a 5Ghz network should be selected. Otherwise, issues related to BLE-WiFi combo may appear. + +## Running RPC console + +To build example with RPC enabled, use the following gn command: +`gn gen out/debug --args='import("//with_pw_rpc.gni") treat_warnings_as_errors=false'` + +The application runs an RPC server and processes events coming from an RPC +client. An example of an RPC client is the `chip-console`, which can be accessed +by running: +`chip-console --device /dev/tty. -b 115200 -o pw_log.out` + +The console should already have been installed in the virtual environment. From +the `chip-console`, a user can send specific commands to the device, e.g.: + +- To toggle the LED (`#define LIGHT_BUTTON 2` in `app_config.h`) + `rpcs.chip.rpc.Button.Event(idx=2)` +- To start BLE advertising (`#define BLE_BUTTON 4` in `app_config.h`) + `rpcs.chip.rpc.Button.Event(idx=4)` +- To reboot the device `rpcs.chip.rpc.Device.Reboot()` diff --git a/examples/lighting-app/nxp/k32w/k32w1/args.gni b/examples/lighting-app/nxp/k32w/k32w1/args.gni index 4efb6421f5ca02..a06e5828acdc45 100644 --- a/examples/lighting-app/nxp/k32w/k32w1/args.gni +++ b/examples/lighting-app/nxp/k32w/k32w1/args.gni @@ -13,7 +13,6 @@ # limitations under the License. import("//build_overrides/chip.gni") -import("${chip_root}/examples/platform/nxp/k32w/k32w1/args.gni") # SDK target. This is overridden to add our SDK app_config.h & defines. k32w1_sdk_target = get_label_info(":sdk", "label_no_toolchain") diff --git a/examples/lighting-app/nxp/k32w/k32w1/include/CHIPProjectConfig.h b/examples/lighting-app/nxp/k32w/k32w1/include/CHIPProjectConfig.h index 07d8b6a92f5e69..536b822d776377 100644 --- a/examples/lighting-app/nxp/k32w/k32w1/include/CHIPProjectConfig.h +++ b/examples/lighting-app/nxp/k32w/k32w1/include/CHIPProjectConfig.h @@ -34,6 +34,58 @@ // including message encryption. Because of this they MUST NEVER BE ENABLED IN PRODUCTION BUILDS. #define CHIP_CONFIG_SECURITY_TEST_MODE 0 +// Use hard-coded test certificates already embedded in generic chip code => set it to 0 +// Use real/development certificates => set it to 1 + file the provisioning section from +// the internal flash +#ifndef CONFIG_CHIP_LOAD_REAL_FACTORY_DATA +#define CONFIG_CHIP_LOAD_REAL_FACTORY_DATA 0 +#endif + +#if CONFIG_CHIP_LOAD_REAL_FACTORY_DATA + +// VID/PID for product => will be used by Basic Information Cluster +#define CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID 0x1037 +#define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID 0xA221 + +// Set the following define to use the Certification Declaration from below and not use it stored in factory data section +#ifndef CHIP_USE_DEVICE_CONFIG_CERTIFICATION_DECLARATION +#define CHIP_USE_DEVICE_CONFIG_CERTIFICATION_DECLARATION 0 +#endif + +#ifndef CHIP_DEVICE_CONFIG_CERTIFICATION_DECLARATION +//-> format_version = 1 +//-> vendor_id = 0x1037 +//-> product_id_array = [ 0xA221 ] +//-> device_type_id = 0x0100 +//-> certificate_id = "ZIG20142ZB330003-24" +//-> security_level = 0 +//-> security_information = 0 +//-> version_number = 0x2694 +//-> certification_type = 1 +//-> dac_origin_vendor_id is not present +//-> dac_origin_product_id is not present +#define CHIP_DEVICE_CONFIG_CERTIFICATION_DECLARATION \ + { \ + 0x30, 0x81, 0xe9, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0, 0x81, 0xdb, 0x30, 0x81, 0xd8, \ + 0x02, 0x01, 0x03, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, \ + 0x45, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x38, 0x04, 0x36, 0x15, 0x24, 0x00, \ + 0x01, 0x25, 0x01, 0x37, 0x10, 0x36, 0x02, 0x05, 0x21, 0xa2, 0x18, 0x25, 0x03, 0x00, 0x01, 0x2c, 0x04, 0x13, 0x5a, \ + 0x49, 0x47, 0x32, 0x30, 0x31, 0x34, 0x32, 0x5a, 0x42, 0x33, 0x33, 0x30, 0x30, 0x30, 0x33, 0x2d, 0x32, 0x34, 0x24, \ + 0x05, 0x00, 0x24, 0x06, 0x00, 0x25, 0x07, 0x76, 0x98, 0x24, 0x08, 0x01, 0x18, 0x31, 0x7d, 0x30, 0x7b, 0x02, 0x01, \ + 0x03, 0x80, 0x14, 0x62, 0xfa, 0x82, 0x33, 0x59, 0xac, 0xfa, 0xa9, 0x96, 0x3e, 0x1c, 0xfa, 0x14, 0x0a, 0xdd, 0xf5, \ + 0x04, 0xf3, 0x71, 0x60, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x30, 0x0a, \ + 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x04, 0x47, 0x30, 0x45, 0x02, 0x21, 0x00, 0x93, 0x77, \ + 0x28, 0xd2, 0xd5, 0x36, 0xea, 0x09, 0xe4, 0xc5, 0xbc, 0x87, 0xa5, 0xa2, 0x44, 0x57, 0xf0, 0xed, 0x24, 0x66, 0xe7, \ + 0x50, 0x61, 0x1b, 0xe1, 0x17, 0x7c, 0x55, 0x0a, 0x83, 0xfa, 0xc3, 0x02, 0x20, 0x21, 0x6c, 0x60, 0x67, 0x4e, 0x3f, \ + 0xbe, 0x30, 0x38, 0xd4, 0x5e, 0x86, 0x1d, 0xe1, 0xe7, 0x6f, 0x7b, 0x1d, 0xd4, 0xfe, 0xbf, 0x79, 0x5a, 0x4e, 0x07, \ + 0x83, 0x46, 0xca, 0x94, 0x92, 0x5f, 0x14 \ + } + +// All remaining data will be pulled from the provisioning region of flash. +#endif + +#else + /** * CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID * @@ -63,6 +115,8 @@ */ #define CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER "TEST_SN" +#endif // CONFIG_CHIP_LOAD_REAL_FACTORY_DATA + /** * CHIP_DEVICE_CONFIG_DEVICE_HARDWARE_VERSION * diff --git a/examples/lighting-app/nxp/k32w/k32w1/main/AppTask.cpp b/examples/lighting-app/nxp/k32w/k32w1/main/AppTask.cpp index 7150003f599588..2eb2f8e095b8b1 100644 --- a/examples/lighting-app/nxp/k32w/k32w1/main/AppTask.cpp +++ b/examples/lighting-app/nxp/k32w/k32w1/main/AppTask.cpp @@ -30,6 +30,9 @@ #include #include #include +#if defined(USE_SMU2_DYNAMIC) +#include +#endif #include #include @@ -88,6 +91,9 @@ using namespace chip; using namespace chip::app; AppTask AppTask::sAppTask; +#if CONFIG_CHIP_LOAD_REAL_FACTORY_DATA +static AppTask::FactoryDataProvider sFactoryDataProvider; +#endif // This key is for testing/certification only and should not be used in production devices. // For production devices this key must be provided from factory data. @@ -135,8 +141,14 @@ CHIP_ERROR AppTask::Init() // Init ZCL Data Model and start server PlatformMgr().ScheduleWork(InitServer, 0); - // Initialize device attestation config +#if CONFIG_CHIP_LOAD_REAL_FACTORY_DATA + ReturnErrorOnFailure(sFactoryDataProvider.Init()); + SetDeviceInstanceInfoProvider(&sFactoryDataProvider); + SetDeviceAttestationCredentialsProvider(&sFactoryDataProvider); + SetCommissionableDataProvider(&sFactoryDataProvider); +#else SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider()); +#endif // CONFIG_CHIP_LOAD_REAL_FACTORY_DATA // QR code will be used with CHIP Tool AppTask::PrintOnboardingInfo(); @@ -213,6 +225,10 @@ void AppTask::InitServer(intptr_t arg) initParams.operationalKeystore = &sK32W1PersistentStorageOpKeystore; #endif +#if defined(USE_SMU2_DYNAMIC) + VerifyOrDie(SMU2::Init(initParams.persistentStorageDelegate) == CHIP_NO_ERROR); +#endif + // Init ZCL Data Model and start server static DefaultTestEventTriggerDelegate sTestEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; @@ -339,7 +355,7 @@ void AppTask::AppTaskMain(void * pvParameter) void AppTask::ButtonEventHandler(uint8_t pin_no, uint8_t button_action) { - if ((pin_no != RESET_BUTTON) && (pin_no != LIGHT_BUTTON) && (pin_no != OTA_BUTTON) && (pin_no != BLE_BUTTON)) + if ((pin_no != RESET_BUTTON) && (pin_no != LIGHT_BUTTON) && (pin_no != SOFT_RESET_BUTTON) && (pin_no != BLE_BUTTON)) { return; } @@ -353,9 +369,10 @@ void AppTask::ButtonEventHandler(uint8_t pin_no, uint8_t button_action) { button_event.Handler = LightActionEventHandler; } - else if (pin_no == OTA_BUTTON) + else if (pin_no == SOFT_RESET_BUTTON) { - // button_event.Handler = OTAHandler; + // Soft reset ensures that platform manager shutdown procedure is called. + button_event.Handler = SoftResetHandler; } else if (pin_no == BLE_BUTTON) { @@ -379,7 +396,7 @@ button_status_t AppTask::KBD_Callback(void * buttonHandle, button_callback_messa switch (pinNb) { case BLE_BUTTON: - K32W_LOG("pb1 short press"); + // K32W_LOG("pb1 short press"); if (sAppTask.mResetTimerActive) { ButtonEventHandler(BLE_BUTTON, RESET_BUTTON_PUSH); @@ -391,7 +408,7 @@ button_status_t AppTask::KBD_Callback(void * buttonHandle, button_callback_messa break; case LIGHT_BUTTON: - K32W_LOG("pb2 short press"); + // K32W_LOG("pb2 short press"); ButtonEventHandler(LIGHT_BUTTON, LIGHT_BUTTON_PUSH); break; } @@ -401,13 +418,13 @@ button_status_t AppTask::KBD_Callback(void * buttonHandle, button_callback_messa switch (pinNb) { case BLE_BUTTON: - K32W_LOG("pb1 long press"); + // K32W_LOG("pb1 long press"); ButtonEventHandler(BLE_BUTTON, RESET_BUTTON_PUSH); break; case LIGHT_BUTTON: - K32W_LOG("pb2 long press"); - ButtonEventHandler(OTA_BUTTON, OTA_BUTTON_PUSH); + // K32W_LOG("pb2 long press"); + ButtonEventHandler(SOFT_RESET_BUTTON, SOFT_RESET_BUTTON_PUSH); break; } break; @@ -529,29 +546,14 @@ void AppTask::LightActionEventHandler(AppEvent * aEvent) } } -void AppTask::OTAHandler(AppEvent * aEvent) +void AppTask::SoftResetHandler(AppEvent * aEvent) { - if (aEvent->ButtonEvent.PinNo != OTA_BUTTON) + if (aEvent->ButtonEvent.PinNo != SOFT_RESET_BUTTON) return; -#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR - if (sAppTask.mFunction != kFunction_NoneSelected) - { - K32W_LOG("Another function is scheduled. Could not initiate OTA!"); - return; - } - - PlatformMgr().ScheduleWork(StartOTAQuery, 0); -#endif + PlatformMgrImpl().CleanReset(); } -#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR -void AppTask::StartOTAQuery(intptr_t arg) -{ - GetRequestorInstance()->TriggerImmediateQuery(); -} -#endif - void AppTask::BleHandler(AppEvent * aEvent) { if (aEvent->ButtonEvent.PinNo != BLE_BUTTON) @@ -807,11 +809,24 @@ void AppTask::PostTurnOnActionRequest(int32_t aActor, LightingManager::Action_t void AppTask::PostEvent(const AppEvent * aEvent) { + portBASE_TYPE taskToWake = pdFALSE; if (sAppEventQueue != NULL) { - if (!xQueueSend(sAppEventQueue, aEvent, 1)) + if (__get_IPSR()) + { + if (!xQueueSendToFrontFromISR(sAppEventQueue, aEvent, &taskToWake)) + { + K32W_LOG("Failed to post event to app task event queue"); + } + + portYIELD_FROM_ISR(taskToWake); + } + else { - K32W_LOG("Failed to post event to app task event queue"); + if (!xQueueSend(sAppEventQueue, aEvent, 1)) + { + K32W_LOG("Failed to post event to app task event queue"); + } } } } @@ -838,10 +853,10 @@ void AppTask::UpdateClusterStateInternal(intptr_t arg) uint8_t newValue = !LightingMgr().IsTurnedOff(); // write the new on/off value - EmberAfStatus status = app::Clusters::OnOff::Attributes::OnOff::Set(1, newValue); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Protocols::InteractionModel::Status status = app::Clusters::OnOff::Attributes::OnOff::Set(1, newValue); + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: updating on/off %x", status); + ChipLogError(NotSpecified, "ERR: updating on/off %x", to_underlying(status)); } } diff --git a/examples/lighting-app/nxp/k32w/k32w1/main/include/AppTask.h b/examples/lighting-app/nxp/k32w/k32w1/main/include/AppTask.h index db81edf168c41e..b5201da2477862 100644 --- a/examples/lighting-app/nxp/k32w/k32w1/main/include/AppTask.h +++ b/examples/lighting-app/nxp/k32w/k32w1/main/include/AppTask.h @@ -27,6 +27,10 @@ #include #include +#if CONFIG_CHIP_LOAD_REAL_FACTORY_DATA +#include +#endif + #include "FreeRTOS.h" #include "fsl_component_button.h" #include "timers.h" @@ -42,6 +46,9 @@ class AppTask { public: +#if CONFIG_CHIP_LOAD_REAL_FACTORY_DATA + using FactoryDataProvider = chip::DeviceLayer::FactoryDataProviderImpl; +#endif CHIP_ERROR StartAppTask(); static void AppTaskMain(void * pvParameter); @@ -56,6 +63,7 @@ class AppTask static void OnIdentifyStop(Identify * identify); static void OnTriggerEffect(Identify * identify); static void OnTriggerEffectComplete(chip::System::Layer * systemLayer, void * appState); + static void ButtonEventHandler(uint8_t pin_no, uint8_t button_action); private: friend AppTask & GetAppTask(void); @@ -71,14 +79,13 @@ class AppTask static void FunctionTimerEventHandler(AppEvent * aEvent); static button_status_t KBD_Callback(void * buttonHandle, button_callback_message_t * message, void * callbackParam); - static void OTAHandler(AppEvent * aEvent); + static void SoftResetHandler(AppEvent * aEvent); static void BleHandler(AppEvent * aEvent); static void BleStartAdvertising(intptr_t arg); static void LightActionEventHandler(AppEvent * aEvent); static void ResetActionEventHandler(AppEvent * aEvent); static void InstallEventHandler(AppEvent * aEvent); - static void ButtonEventHandler(uint8_t pin_no, uint8_t button_action); static void TimerEventHandler(TimerHandle_t xTimer); static void MatterEventHandler(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg); diff --git a/examples/lighting-app/nxp/k32w/k32w1/main/include/app_config.h b/examples/lighting-app/nxp/k32w/k32w1/main/include/app_config.h index ff938f494b089d..1478b53b11aba1 100644 --- a/examples/lighting-app/nxp/k32w/k32w1/main/include/app_config.h +++ b/examples/lighting-app/nxp/k32w/k32w1/main/include/app_config.h @@ -22,12 +22,12 @@ #define RESET_BUTTON 1 #define LIGHT_BUTTON 2 -#define OTA_BUTTON 3 +#define SOFT_RESET_BUTTON 3 #define BLE_BUTTON 4 #define RESET_BUTTON_PUSH 1 #define LIGHT_BUTTON_PUSH 2 -#define OTA_BUTTON_PUSH 3 +#define SOFT_RESET_BUTTON_PUSH 3 #define BLE_BUTTON_PUSH 4 #define APP_BUTTON_PUSH 1 diff --git a/examples/lighting-app/nxp/k32w/k32w1/main/main.cpp b/examples/lighting-app/nxp/k32w/k32w1/main/main.cpp index 7ebd3f3ed3b1b7..53a6efbbb3ffd5 100644 --- a/examples/lighting-app/nxp/k32w/k32w1/main/main.cpp +++ b/examples/lighting-app/nxp/k32w/k32w1/main/main.cpp @@ -35,6 +35,7 @@ #include "FreeRtosHooks.h" #include "app_config.h" +#include "pin_mux.h" using namespace ::chip; using namespace ::chip::Inet; @@ -43,6 +44,10 @@ using namespace ::chip::Logging; #include +#if PW_RPC_ENABLED +#include "Rpc.h" +#endif + typedef void (*InitFunc)(void); extern InitFunc __init_array_start; extern InitFunc __init_array_end; @@ -69,6 +74,17 @@ extern "C" void main_task(void const * argument) /* Used for HW initializations */ otSysInit(0, NULL); +#if PW_RPC_ENABLED + /* set clock */ + CLOCK_SetIpSrc(kCLOCK_Lpuart1, kCLOCK_IpSrcFro192M); + /* enable clock */ + CLOCK_EnableClock(kCLOCK_Lpuart1); + + BOARD_InitPinLPUART1_TX(); + BOARD_InitPinLPUART1_RX(); + chip::rpc::Init(); +#endif + K32W_LOG("Welcome to NXP Lighting Demo App"); /* Mbedtls Threading support is needed because both diff --git a/src/app/tests/suites/commands/system/BUILD.gn b/examples/lighting-app/nxp/k32w/k32w1/with_pw_rpc.gni similarity index 50% rename from src/app/tests/suites/commands/system/BUILD.gn rename to examples/lighting-app/nxp/k32w/k32w1/with_pw_rpc.gni index df9972388b1f33..d6bea63f8402c0 100644 --- a/src/app/tests/suites/commands/system/BUILD.gn +++ b/examples/lighting-app/nxp/k32w/k32w1/with_pw_rpc.gni @@ -1,4 +1,4 @@ -# Copyright (c) 2022 Project CHIP Authors +# 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. @@ -12,21 +12,22 @@ # See the License for the specific language governing permissions and # limitations under the License. -import("//build_overrides/build.gni") -import("//build_overrides/chip.gni") +# add this gni as import in your build args to use pigweed in the example +# 'import("//with_pw_rpc.gni")' -static_library("system") { - output_name = "libSystemCommands" +import("//build_overrides/chip.gni") +import("${chip_root}/config/nxp/lib/pw_rpc/pw_rpc.gni") +import("${chip_root}/examples/platform/nxp/k32w/k32w1/args.gni") - sources = [ - "SystemCommands.cpp", - "SystemCommands.h", - ] +k32w1_sdk_target = get_label_info(":sdk", "label_no_toolchain") - cflags = [ "-Wconversion" ] +chip_enable_ota_requestor = true +chip_stack_lock_tracking = "fatal" +chip_enable_ble = true +chip_enable_pw_rpc = true +chip_with_ot_cli = 0 +is_debug = false +chip_openthread_ftd = true +chip_crypto = "platform" - public_deps = [ - "${chip_root}/src/app/common:simulated", - "${chip_root}/src/lib/support", - ] -} +cpp_standard = "gnu++17" diff --git a/examples/lighting-app/nxp/zap/lighting-on-off.matter b/examples/lighting-app/nxp/zap/lighting-on-off.matter index 9f4e9c51e5e5c3..5241ba629863ab 100644 --- a/examples/lighting-app/nxp/zap/lighting-on-off.matter +++ b/examples/lighting-app/nxp/zap/lighting-on-off.matter @@ -1522,7 +1522,7 @@ cluster GroupKeyManagement = 63 { } endpoint 0 { - device type ma_rootdevice = 22, version 1; + device type ma_rootdevice = 22, version 2; binding cluster OtaSoftwareUpdateProvider; diff --git a/examples/lighting-app/nxp/zap/lighting-on-off.zap b/examples/lighting-app/nxp/zap/lighting-on-off.zap index e7f1d48c378d29..8873c5e9732c85 100644 --- a/examples/lighting-app/nxp/zap/lighting-on-off.zap +++ b/examples/lighting-app/nxp/zap/lighting-on-off.zap @@ -51,7 +51,7 @@ } ], "deviceVersions": [ - 1 + 2 ], "deviceIdentifiers": [ 22 @@ -3994,5 +3994,6 @@ "endpointId": 1, "networkId": 0 } - ] + ], + "log": [] } \ No newline at end of file diff --git a/examples/lighting-app/qpg/src/AppTask.cpp b/examples/lighting-app/qpg/src/AppTask.cpp index 4dafde6ac41960..2bc0ffafec5d2a 100644 --- a/examples/lighting-app/qpg/src/AppTask.cpp +++ b/examples/lighting-app/qpg/src/AppTask.cpp @@ -642,18 +642,19 @@ void AppTask::UpdateClusterState(void) ChipLogProgress(NotSpecified, "UpdateClusterState"); // Write the new on/off value - EmberAfStatus status = Clusters::OnOff::Attributes::OnOff::Set(QPG_LIGHT_ENDPOINT_ID, LightingMgr().IsTurnedOn()); + Protocols::InteractionModel::Status status = + Clusters::OnOff::Attributes::OnOff::Set(QPG_LIGHT_ENDPOINT_ID, LightingMgr().IsTurnedOn()); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: updating on/off %x", status); + ChipLogError(NotSpecified, "ERR: updating on/off %x", to_underlying(status)); } // Write new level value status = Clusters::LevelControl::Attributes::CurrentLevel::Set(QPG_LIGHT_ENDPOINT_ID, LightingMgr().GetLevel()); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: updating level %x", status); + ChipLogError(NotSpecified, "ERR: updating level %x", to_underlying(status)); } }); } diff --git a/examples/lighting-app/qpg/src/ZclCallbacks.cpp b/examples/lighting-app/qpg/src/ZclCallbacks.cpp index 0b75837a64a8cc..e2255bd4e76684 100644 --- a/examples/lighting-app/qpg/src/ZclCallbacks.cpp +++ b/examples/lighting-app/qpg/src/ZclCallbacks.cpp @@ -78,15 +78,15 @@ void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & { xy.x = *reinterpret_cast(value); // get Y from cluster value storage - EmberAfStatus status = ColorControl::Attributes::CurrentY::Get(endpoint, &xy.y); - assert(status == EMBER_ZCL_STATUS_SUCCESS); + Protocols::InteractionModel::Status status = ColorControl::Attributes::CurrentY::Get(endpoint, &xy.y); + assert(status == Protocols::InteractionModel::Status::Success); } if (attributeId == ColorControl::Attributes::CurrentY::Id) { xy.y = *reinterpret_cast(value); // get X from cluster value storage - EmberAfStatus status = ColorControl::Attributes::CurrentX::Get(endpoint, &xy.x); - assert(status == EMBER_ZCL_STATUS_SUCCESS); + Protocols::InteractionModel::Status status = ColorControl::Attributes::CurrentX::Get(endpoint, &xy.x); + assert(status == Protocols::InteractionModel::Status::Success); } ChipLogProgress(Zcl, "New XY color: %u|%u", xy.x, xy.y); @@ -108,22 +108,22 @@ void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & // We only support 8-bit hue. Assuming hue is linear, normalize 16-bit to 8-bit. hsv.h = (uint8_t) ((*reinterpret_cast(value)) >> 8); // get saturation from cluster value storage - EmberAfStatus status = ColorControl::Attributes::CurrentSaturation::Get(endpoint, &hsv.s); - assert(status == EMBER_ZCL_STATUS_SUCCESS); + Protocols::InteractionModel::Status status = ColorControl::Attributes::CurrentSaturation::Get(endpoint, &hsv.s); + assert(status == Protocols::InteractionModel::Status::Success); } else if (attributeId == ColorControl::Attributes::CurrentHue::Id) { hsv.h = *value; // get saturation from cluster value storage - EmberAfStatus status = ColorControl::Attributes::CurrentSaturation::Get(endpoint, &hsv.s); - assert(status == EMBER_ZCL_STATUS_SUCCESS); + Protocols::InteractionModel::Status status = ColorControl::Attributes::CurrentSaturation::Get(endpoint, &hsv.s); + assert(status == Protocols::InteractionModel::Status::Success); } else if (attributeId == ColorControl::Attributes::CurrentSaturation::Id) { hsv.s = *value; // get hue from cluster value storage - EmberAfStatus status = ColorControl::Attributes::CurrentHue::Get(endpoint, &hsv.h); - assert(status == EMBER_ZCL_STATUS_SUCCESS); + Protocols::InteractionModel::Status status = ColorControl::Attributes::CurrentHue::Get(endpoint, &hsv.h); + assert(status == Protocols::InteractionModel::Status::Success); } ChipLogProgress(Zcl, "New HSV color: %u|%u", hsv.h, hsv.s); LightingMgr().InitiateAction(LightingManager::COLOR_ACTION_HSV, 0, sizeof(hsv), (uint8_t *) &hsv); @@ -164,11 +164,11 @@ void emberAfOnOffClusterInitCallback(EndpointId endpoint) XyColor_t xy; bool onOffValue = false; app::DataModel::Nullable currentLevel; - EmberAfStatus status; + Protocols::InteractionModel::Status status; status = OnOff::Attributes::OnOff::Get(1, &onOffValue); - if (status == EMBER_ZCL_STATUS_SUCCESS) + if (status == Protocols::InteractionModel::Status::Success) { LightingMgr().InitiateAction(onOffValue ? LightingManager::ON_ACTION : LightingManager::OFF_ACTION, 0, 1, (uint8_t *) onOffValue); @@ -176,7 +176,7 @@ void emberAfOnOffClusterInitCallback(EndpointId endpoint) /* restore values saved by DeferredAttributePersistenceProvider */ status = LevelControl::Attributes::CurrentLevel::Get(endpoint, currentLevel); - if (status != EMBER_ZCL_STATUS_SUCCESS || currentLevel.IsNull()) + if (status != Protocols::InteractionModel::Status::Success || currentLevel.IsNull()) { return; } @@ -184,12 +184,12 @@ void emberAfOnOffClusterInitCallback(EndpointId endpoint) levelValue = currentLevel.Value(); status = ColorControl::Attributes::CurrentY::Get(endpoint, &xy.y); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { return; } status = ColorControl::Attributes::CurrentX::Get(endpoint, &xy.x); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { return; } diff --git a/examples/lighting-app/silabs/src/AppTask.cpp b/examples/lighting-app/silabs/src/AppTask.cpp index 542dc2fbfd55c8..bce7b06cb5cb07 100644 --- a/examples/lighting-app/silabs/src/AppTask.cpp +++ b/examples/lighting-app/silabs/src/AppTask.cpp @@ -246,10 +246,10 @@ void AppTask::UpdateClusterState(intptr_t context) uint8_t newValue = LightMgr().IsLightOn(); // write the new on/off value - EmberAfStatus status = OnOffServer::Instance().setOnOffValue(1, newValue, false); + Protocols::InteractionModel::Status status = OnOffServer::Instance().setOnOffValue(1, newValue, false); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - SILABS_LOG("ERR: updating on/off %x", status); + SILABS_LOG("ERR: updating on/off %x", to_underlying(status)); } } diff --git a/examples/lighting-app/stm32/src/STM32WB5/AppTask.cpp b/examples/lighting-app/stm32/src/STM32WB5/AppTask.cpp index 4b9d5427adc8f4..d102f8a9dfd421 100644 --- a/examples/lighting-app/stm32/src/STM32WB5/AppTask.cpp +++ b/examples/lighting-app/stm32/src/STM32WB5/AppTask.cpp @@ -444,17 +444,18 @@ void AppTask::UpdateClusterState(void) { ChipLogProgress(NotSpecified, "UpdateClusterState"); // Write the new on/off value - EmberAfStatus status = Clusters::OnOff::Attributes::OnOff::Set(STM32_LIGHT_ENDPOINT_ID, LightingMgr().IsTurnedOn()); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Protocols::InteractionModel::Status status = + Clusters::OnOff::Attributes::OnOff::Set(STM32_LIGHT_ENDPOINT_ID, LightingMgr().IsTurnedOn()); + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: updating on/off %x", status); + ChipLogError(NotSpecified, "ERR: updating on/off %x", to_underlying(status)); } // Write new level value status = Clusters::LevelControl::Attributes::CurrentLevel::Set(STM32_LIGHT_ENDPOINT_ID, LightingMgr().GetLevel()); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: updating level %x", status); + ChipLogError(NotSpecified, "ERR: updating level %x", to_underlying(status)); } } diff --git a/examples/lighting-app/telink/src/AppTask.cpp b/examples/lighting-app/telink/src/AppTask.cpp index fde4a836c90886..54dd2703c16ce9 100644 --- a/examples/lighting-app/telink/src/AppTask.cpp +++ b/examples/lighting-app/telink/src/AppTask.cpp @@ -204,7 +204,7 @@ void AppTask::ActionCompleted(PWMDevice::Action_t aAction, int32_t aActor) void AppTask::UpdateClusterState(void) { - EmberAfStatus status; + Protocols::InteractionModel::Status status; bool isTurnedOn; uint8_t setLevel; @@ -240,15 +240,15 @@ void AppTask::UpdateClusterState(void) // write the new on/off value status = Clusters::OnOff::Attributes::OnOff::Set(kExampleEndpointId, isTurnedOn); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - LOG_ERR("Update OnOff fail: %x", status); + LOG_ERR("Update OnOff fail: %x", to_underlying(status)); } status = Clusters::LevelControl::Attributes::CurrentLevel::Set(kExampleEndpointId, setLevel); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - LOG_ERR("Update CurrentLevel fail: %x", status); + LOG_ERR("Update CurrentLevel fail: %x", to_underlying(status)); } } diff --git a/examples/lighting-app/telink/src/ZclCallbacks.cpp b/examples/lighting-app/telink/src/ZclCallbacks.cpp index 53649639507142..7aebb1ba69bae1 100644 --- a/examples/lighting-app/telink/src/ZclCallbacks.cpp +++ b/examples/lighting-app/telink/src/ZclCallbacks.cpp @@ -130,12 +130,12 @@ void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & */ void emberAfOnOffClusterInitCallback(EndpointId endpoint) { - EmberAfStatus status; + Protocols::InteractionModel::Status status; bool storedValue; // Read storedValue on/off value status = Attributes::OnOff::Get(1, &storedValue); - if (status == EMBER_ZCL_STATUS_SUCCESS) + if (status == Protocols::InteractionModel::Status::Success) { // Set actual state to stored before reboot GetAppTask().GetLightingDevice().Set(storedValue); diff --git a/examples/lighting-app/tizen/BUILD.gn b/examples/lighting-app/tizen/BUILD.gn index c0a38e7c113a91..66b508b74e3284 100644 --- a/examples/lighting-app/tizen/BUILD.gn +++ b/examples/lighting-app/tizen/BUILD.gn @@ -12,9 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. +import("//build_overrides/build.gni") import("//build_overrides/chip.gni") import("//build_overrides/tizen.gni") +import("${build_root}/config/linux/pkg_config.gni") import("${chip_root}/build/chip/linux/gdbus_library.gni") import("${chip_root}/build/chip/tools.gni") import("${chip_root}/src/app/common_flags.gni") @@ -27,6 +29,10 @@ declare_args() { chip_examples_enable_ui = false } +pkg_config("capi-system-peripheral-io") { + packages = [ "capi-system-peripheral-io" ] +} + gdbus_library("chip-lighting-app-manager") { sources = [ "xml/DBusLightApp.xml" ] interface_prefix = "org.tizen.matter.example.lighting" @@ -50,6 +56,8 @@ executable("chip-lighting-app") { "${chip_root}/src/lib", ] + configs += [ ":capi-system-peripheral-io" ] + if (chip_examples_enable_ui) { sources += [ "src/DBusInterface.cpp" ] deps += [ ":chip-lighting-app-manager" ] diff --git a/examples/lighting-app/tizen/src/DBusInterface.cpp b/examples/lighting-app/tizen/src/DBusInterface.cpp index 7c6e29d6a1cc38..e39ca5c1e1232c 100644 --- a/examples/lighting-app/tizen/src/DBusInterface.cpp +++ b/examples/lighting-app/tizen/src/DBusInterface.cpp @@ -206,7 +206,8 @@ void DBusInterface::InitOnOff() { bool isOn = false; auto status = Clusters::OnOff::Attributes::OnOff::Get(mEndpointId, &isOn); - VerifyOrReturn(status == EMBER_ZCL_STATUS_SUCCESS, ChipLogError(NotSpecified, "Error getting OnOff: 0x%x", status)); + VerifyOrReturn(status == Protocols::InteractionModel::Status::Success, + ChipLogError(NotSpecified, "Error getting OnOff: 0x%x", to_underlying(status))); light_app_on_off_set_on_off(mIfaceOnOff, isOn); } @@ -215,14 +216,15 @@ void DBusInterface::InitColor() { uint8_t value = 0; auto status = Clusters::ColorControl::Attributes::ColorMode::Get(mEndpointId, &value); - VerifyOrReturn(status == EMBER_ZCL_STATUS_SUCCESS, ChipLogError(NotSpecified, "Error getting ColorMode: 0x%x", status)); + VerifyOrReturn(status == Protocols::InteractionModel::Status::Success, + ChipLogError(NotSpecified, "Error getting ColorMode: 0x%x", to_underlying(status))); light_app_color_control_set_color_mode(mIfaceColorControl, value); } { uint16_t value = 0; auto status = Clusters::ColorControl::Attributes::ColorTemperatureMireds::Get(mEndpointId, &value); - VerifyOrReturn(status == EMBER_ZCL_STATUS_SUCCESS, - ChipLogError(NotSpecified, "Error getting ColorTemperatureMireds: 0x%x", status)); + VerifyOrReturn(status == Protocols::InteractionModel::Status::Success, + ChipLogError(NotSpecified, "Error getting ColorTemperatureMireds: 0x%x", to_underlying(status))); light_app_color_control_set_color_temperature_mireds(mIfaceColorControl, value); } } diff --git a/examples/lighting-app/tizen/src/LedManager.cpp b/examples/lighting-app/tizen/src/LedManager.cpp index 0848675c7c0fef..474ba612287f16 100644 --- a/examples/lighting-app/tizen/src/LedManager.cpp +++ b/examples/lighting-app/tizen/src/LedManager.cpp @@ -62,7 +62,8 @@ void LedManager::InitOnOff() { bool isOn = false; auto status = Clusters::OnOff::Attributes::OnOff::Get(mEndpointId, &isOn); - VerifyOrReturn(status == EMBER_ZCL_STATUS_SUCCESS, ChipLogError(NotSpecified, "Error getting OnOff: 0x%x", status)); + VerifyOrReturn(status == Protocols::InteractionModel::Status::Success, + ChipLogError(NotSpecified, "Error getting OnOff: 0x%x", to_underlying(status))); SetOnOff(isOn); } diff --git a/examples/lit-icd-app/silabs/README.md b/examples/lit-icd-app/silabs/README.md index f359eacbd23cf4..07ec9c320bcb36 100644 --- a/examples/lit-icd-app/silabs/README.md +++ b/examples/lit-icd-app/silabs/README.md @@ -241,22 +241,30 @@ combination with JLinkRTTClient as follows: [SVR] Copy/paste the below URL in a browser to see the QR Code: [SVR] https://project-chip.github.io/connectedhomeip/qrcode.html?data=CH%3AI34NM%20-00%200C9SS0 - **LED 0** shows the overall state of the device and its connectivity. The - following states are possible: + **LED 0** - - Short Flash On (50 ms on/950 ms off): The device is in the + - ICD Configuration (Default) - LED is only active under two circumstances: + + 1. Factory reset sequence - LED will blink when initiated upon press and hold of + Button 0 after 3 seconds + 2. An Identify command was received + + - Non-ICD Configuration - 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 + 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 + Short Flash Off (950ms on/50ms off): The device is fully provisioned, but does not yet have full Thread network or service connectivity. - - Solid On: The device is fully provisioned and has full Thread + Solid On: The device is fully provisioned and has full Thread network and service connectivity. **Push Button 0** diff --git a/examples/lit-icd-app/silabs/build_for_wifi_args.gni b/examples/lit-icd-app/silabs/build_for_wifi_args.gni index 630cb65b53f45d..139297d45a03db 100644 --- a/examples/lit-icd-app/silabs/build_for_wifi_args.gni +++ b/examples/lit-icd-app/silabs/build_for_wifi_args.gni @@ -30,6 +30,6 @@ sl_use_subscription_synching = true icd_enforce_sit_slow_poll_limit = true # ICD Matter Configuration flags -sl_idle_mode_interval_s = 3600 # 60min Idle Mode Interval -sl_active_mode_interval_ms = 0 # 0 Active Mode Interval +sl_idle_mode_duration_s = 3600 # 60min Idle Mode Duration +sl_active_mode_duration_ms = 0 # 0 Active Mode Duration sl_active_mode_threshold_ms = 30000 # 30s Active Mode Threshold diff --git a/examples/lit-icd-app/silabs/openthread.gni b/examples/lit-icd-app/silabs/openthread.gni index 69bd7b88e6bdc6..8a3bb36475c49c 100644 --- a/examples/lit-icd-app/silabs/openthread.gni +++ b/examples/lit-icd-app/silabs/openthread.gni @@ -38,6 +38,6 @@ sl_ot_idle_interval_ms = 3600000 # 60mins Idle Polling Interval sl_ot_active_interval_ms = 1000 # 1000ms Active Polling Interval # ICD Matter Configuration flags -sl_idle_mode_interval_s = 3600 # 60min Idle Mode Interval -sl_active_mode_interval_ms = 0 # 0 Active Mode Interval +sl_idle_mode_duration_s = 3600 # 60min Idle Mode Duration +sl_active_mode_duration_ms = 0 # 0 Active Mode Duration sl_active_mode_threshold_ms = 5000 # 5s Active Mode Threshold diff --git a/examples/lock-app/asr/src/AppTask.cpp b/examples/lock-app/asr/src/AppTask.cpp old mode 100755 new mode 100644 index 36d53399a991f1..a90d0013761324 --- a/examples/lock-app/asr/src/AppTask.cpp +++ b/examples/lock-app/asr/src/AppTask.cpp @@ -480,11 +480,12 @@ void AppTask::UpdateCluster(intptr_t context) OperationSourceEnum source = OperationSourceEnum::kUnspecified; // write the new lock value - EmberAfStatus status = - DoorLockServer::Instance().SetLockState(1, newState, source) ? EMBER_ZCL_STATUS_SUCCESS : EMBER_ZCL_STATUS_FAILURE; - if (status != EMBER_ZCL_STATUS_SUCCESS) + Protocols::InteractionModel::Status status = DoorLockServer::Instance().SetLockState(1, newState, source) + ? Protocols::InteractionModel::Status::Success + : Protocols::InteractionModel::Status::Failure; + if (status != Protocols::InteractionModel::Status::Success) { - ASR_LOG("ERR: updating lock state %x", status); + ASR_LOG("ERR: updating lock state %x", to_underlying(status)); } } diff --git a/examples/lock-app/cc13x2x7_26x2x7/BUILD.gn b/examples/lock-app/cc13x2x7_26x2x7/BUILD.gn index db4f599aad8f79..8cf4f38dc771f2 100644 --- a/examples/lock-app/cc13x2x7_26x2x7/BUILD.gn +++ b/examples/lock-app/cc13x2x7_26x2x7/BUILD.gn @@ -55,7 +55,7 @@ ti_sysconfig("sysconfig") { ] } - public_configs = [ ":sdk_dmm_config" ] + public_configs = [ ":sdk_cc13x2x7_26x2x7_dmm_config" ] cflags = [ "-Wno-comment", diff --git a/examples/lock-app/cc13x4_26x4/BUILD.gn b/examples/lock-app/cc13x4_26x4/BUILD.gn index 67560cd7469f41..aed45f85bce94b 100644 --- a/examples/lock-app/cc13x4_26x4/BUILD.gn +++ b/examples/lock-app/cc13x4_26x4/BUILD.gn @@ -59,7 +59,7 @@ ti_sysconfig("sysconfig") { #"ti_build_config.opt", ] - public_configs = [ ":sdk_dmm_config" ] + public_configs = [ ":sdk_cc13x4_26x4_dmm_config" ] cflags = [ "-Wno-comment", diff --git a/examples/lock-app/esp32/main/AppTask.cpp b/examples/lock-app/esp32/main/AppTask.cpp index e6a8519b782c18..fbca981316f69b 100644 --- a/examples/lock-app/esp32/main/AppTask.cpp +++ b/examples/lock-app/esp32/main/AppTask.cpp @@ -23,7 +23,7 @@ #include #include #include -#include + #include #include #include @@ -468,9 +468,9 @@ void AppTask::UpdateClusterState(intptr_t context) uint8_t newValue = !BoltLockMgr().IsUnlocked(); // write the new on/off value - EmberAfStatus status = chip::app::Clusters::OnOff::Attributes::OnOff::Set(1, newValue); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Protocols::InteractionModel::Status status = chip::app::Clusters::OnOff::Attributes::OnOff::Set(1, newValue); + if (status != Protocols::InteractionModel::Status::Success) { - ESP_LOGI(TAG, "ERR: updating on/off %x", status); + ESP_LOGI(TAG, "ERR: updating on/off %x", to_underlying(status)); } } diff --git a/examples/lock-app/genio/src/AppTask.cpp b/examples/lock-app/genio/src/AppTask.cpp index 2b331d3cfafd33..7a438dd4974d3d 100644 --- a/examples/lock-app/genio/src/AppTask.cpp +++ b/examples/lock-app/genio/src/AppTask.cpp @@ -596,11 +596,12 @@ void AppTask::UpdateClusterState(intptr_t context) OperationSourceEnum source = OperationSourceEnum::kUnspecified; // write the new lock value - EmberAfStatus status = - DoorLockServer::Instance().SetLockState(1, newState, source) ? EMBER_ZCL_STATUS_SUCCESS : EMBER_ZCL_STATUS_FAILURE; + Protocols::InteractionModel::Status status = DoorLockServer::Instance().SetLockState(1, newState, source) + ? Protocols::InteractionModel::Status::Success + : Protocols::InteractionModel::Status::Failure; - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - MT793X_LOG("ERR: updating lock state %x", status); + MT793X_LOG("ERR: updating lock state %x", to_underlying(status)); } } diff --git a/examples/lock-app/genio/src/ZclCallbacks.cpp b/examples/lock-app/genio/src/ZclCallbacks.cpp index 12688358f0feee..88ebaf641d86c7 100644 --- a/examples/lock-app/genio/src/ZclCallbacks.cpp +++ b/examples/lock-app/genio/src/ZclCallbacks.cpp @@ -61,45 +61,45 @@ void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & */ void emberAfDoorLockClusterInitCallback(EndpointId endpoint) { - EmberAfStatus status; + Protocols::InteractionModel::Status status; status = DoorLock::Attributes::LockType::Set(endpoint, DlLockType::kDeadBolt); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(Zcl, "Failed to set LockType %x", status); + ChipLogError(Zcl, "Failed to set LockType %x", to_underlying(status)); } status = DoorLock::Attributes::NumberOfTotalUsersSupported::Set(endpoint, CONFIG_LOCK_NUM_USERS); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(Zcl, "Failed to set number of users %x", status); + ChipLogError(Zcl, "Failed to set number of users %x", to_underlying(status)); } status = DoorLock::Attributes::NumberOfPINUsersSupported::Set(endpoint, CONFIG_LOCK_NUM_USERS); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(Zcl, "Failed to set number of PIN users %x", status); + ChipLogError(Zcl, "Failed to set number of PIN users %x", to_underlying(status)); } status = DoorLock::Attributes::NumberOfRFIDUsersSupported::Set(endpoint, 0); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(Zcl, "Failed to set number of RFID users %x", status); + ChipLogError(Zcl, "Failed to set number of RFID users %x", to_underlying(status)); } status = DoorLock::Attributes::NumberOfCredentialsSupportedPerUser::Set(endpoint, CONFIG_LOCK_NUM_CREDENTIALS_PER_USER); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(Zcl, "Failed to set number of credentials per user %x", status); + ChipLogError(Zcl, "Failed to set number of credentials per user %x", to_underlying(status)); } // Note: Due to current logic of credential, do not enable PIN and RFID // at the same time. // Set FeatureMap to (kUser|kPinCredential) status = DoorLock::Attributes::FeatureMap::Set(endpoint, 0x101); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(Zcl, "Failed to set number of credentials per user %x", status); + ChipLogError(Zcl, "Failed to set number of credentials per user %x", to_underlying(status)); } } diff --git a/examples/lock-app/infineon/cyw30739/src/main.cpp b/examples/lock-app/infineon/cyw30739/src/main.cpp index a0a92487a807bc..c82cc894bae5af 100644 --- a/examples/lock-app/infineon/cyw30739/src/main.cpp +++ b/examples/lock-app/infineon/cyw30739/src/main.cpp @@ -324,12 +324,13 @@ void UpdateClusterState(intptr_t context) OperationSourceEnum source = OperationSourceEnum::kUnspecified; // write the new lock value - EmberAfStatus status = - DoorLockServer::Instance().SetLockState(1, newState, source) ? EMBER_ZCL_STATUS_SUCCESS : EMBER_ZCL_STATUS_FAILURE; + Protocols::InteractionModel::Status status = DoorLockServer::Instance().SetLockState(1, newState, source) + ? Protocols::InteractionModel::Status::Success + : Protocols::InteractionModel::Status::Failure; - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(Zcl, "ERR: updating lock state %x", status); + ChipLogError(Zcl, "ERR: updating lock state %x", to_underlying(status)); } } diff --git a/examples/lock-app/infineon/psoc6/src/AppTask.cpp b/examples/lock-app/infineon/psoc6/src/AppTask.cpp index e3be287e024442..9f29e32e6c618a 100644 --- a/examples/lock-app/infineon/psoc6/src/AppTask.cpp +++ b/examples/lock-app/infineon/psoc6/src/AppTask.cpp @@ -660,11 +660,12 @@ void AppTask::UpdateCluster(intptr_t context) OperationSourceEnum source = OperationSourceEnum::kUnspecified; // write the new lock value - EmberAfStatus status = - DoorLockServer::Instance().SetLockState(1, newState, source) ? EMBER_ZCL_STATUS_SUCCESS : EMBER_ZCL_STATUS_FAILURE; - if (status != EMBER_ZCL_STATUS_SUCCESS) + Protocols::InteractionModel::Status status = DoorLockServer::Instance().SetLockState(1, newState, source) + ? Protocols::InteractionModel::Status::Success + : Protocols::InteractionModel::Status::Failure; + if (status != Protocols::InteractionModel::Status::Success) { - P6_LOG("ERR: updating lock state %x", status); + P6_LOG("ERR: updating lock state %x", to_underlying(status)); } } diff --git a/examples/lock-app/mbed/main/AppTask.cpp b/examples/lock-app/mbed/main/AppTask.cpp index 4e1d0c70e943cc..2dd5a4463dcf74 100644 --- a/examples/lock-app/mbed/main/AppTask.cpp +++ b/examples/lock-app/mbed/main/AppTask.cpp @@ -461,9 +461,9 @@ void AppTask::UpdateClusterState() uint8_t newValue = !BoltLockMgr().IsUnlocked(); // write the new on/off value - EmberAfStatus status = app::Clusters::OnOff::Attributes::OnOff::Set(1, newValue); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Protocols::InteractionModel::Status status = app::Clusters::OnOff::Attributes::OnOff::Set(1, newValue); + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ZCL update failed: %lx", status); + ChipLogError(NotSpecified, "ZCL update failed: %lx", to_underlying(status)); } } diff --git a/examples/lock-app/nrfconnect/main/ZclCallbacks.cpp b/examples/lock-app/nrfconnect/main/ZclCallbacks.cpp index 99ea77ee21adb9..63040970d9b9df 100644 --- a/examples/lock-app/nrfconnect/main/ZclCallbacks.cpp +++ b/examples/lock-app/nrfconnect/main/ZclCallbacks.cpp @@ -112,10 +112,10 @@ void emberAfDoorLockClusterInitCallback(EndpointId endpoint) { DoorLockServer::Instance().InitServer(endpoint); - const auto logOnFailure = [](EmberAfStatus status, const char * attributeName) { - if (status != EMBER_ZCL_STATUS_SUCCESS) + const auto logOnFailure = [](Protocols::InteractionModel::Status status, const char * attributeName) { + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(Zcl, "Failed to set DoorLock %s: %x", attributeName, status); + ChipLogError(Zcl, "Failed to set DoorLock %s: %x", attributeName, to_underlying(status)); } }; diff --git a/examples/lock-app/nxp/k32w/k32w0/main/AppTask.cpp b/examples/lock-app/nxp/k32w/k32w0/main/AppTask.cpp index 130569791e2e8e..7c6cffaf968c02 100644 --- a/examples/lock-app/nxp/k32w/k32w0/main/AppTask.cpp +++ b/examples/lock-app/nxp/k32w/k32w0/main/AppTask.cpp @@ -777,11 +777,11 @@ void AppTask::UpdateClusterStateInternal(intptr_t arg) } // write the new door lock state - EmberAfStatus status = Attributes::LockState::Set(1, newValue); + chip::Protocols::InteractionModel::Status status = Attributes::LockState::Set(1, newValue); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != chip::Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: updating door lock state %x", status); + ChipLogError(NotSpecified, "ERR: updating door lock state %x", chip::to_underlying(status)); } } diff --git a/examples/lock-app/qpg/src/AppTask.cpp b/examples/lock-app/qpg/src/AppTask.cpp index 54a4b2a5d2a3f3..7f9d922cc8558d 100644 --- a/examples/lock-app/qpg/src/AppTask.cpp +++ b/examples/lock-app/qpg/src/AppTask.cpp @@ -622,10 +622,10 @@ void AppTask::UpdateClusterState(void) if (currentLockState.IsNull()) { - EmberAfStatus status = DoorLock::Attributes::LockState::Set(QPG_LOCK_ENDPOINT_ID, newValue); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Protocols::InteractionModel::Status status = DoorLock::Attributes::LockState::Set(QPG_LOCK_ENDPOINT_ID, newValue); + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: updating DoorLock %x", status); + ChipLogError(NotSpecified, "ERR: updating DoorLock %x", to_underlying(status)); } } else diff --git a/examples/lock-app/qpg/src/ZclCallbacks.cpp b/examples/lock-app/qpg/src/ZclCallbacks.cpp index 51751c43ed4058..05518bff13cabd 100644 --- a/examples/lock-app/qpg/src/ZclCallbacks.cpp +++ b/examples/lock-app/qpg/src/ZclCallbacks.cpp @@ -114,10 +114,10 @@ void emberAfDoorLockClusterInitCallback(EndpointId endpoint) { DoorLockServer::Instance().InitServer(endpoint); - const auto logOnFailure = [](EmberAfStatus status, const char * attributeName) { - if (status != EMBER_ZCL_STATUS_SUCCESS) + const auto logOnFailure = [](Protocols::InteractionModel::Status status, const char * attributeName) { + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(Zcl, "Failed to set DoorLock %s: %x", attributeName, status); + ChipLogError(Zcl, "Failed to set DoorLock %s: %x", attributeName, to_underlying(status)); } }; diff --git a/examples/lock-app/silabs/README.md b/examples/lock-app/silabs/README.md index 1bce8c431bee54..447fe3b9949995 100644 --- a/examples/lock-app/silabs/README.md +++ b/examples/lock-app/silabs/README.md @@ -262,22 +262,30 @@ combination with JLinkRTTClient as follows: [SVR] Copy/paste the below URL in a browser to see the QR Code: [SVR] https://project-chip.github.io/connectedhomeip/qrcode.html?data=CH%3AI34NM%20-00%200C9SS0 - **LED 0** shows the overall state of the device and its connectivity. The - following states are possible: + **LED 0** - - _Short Flash On (50 ms on/950 ms off)_ ; The device is in the + - ICD Configuration (Default) - LED is only active under two circumstances: + + 1. Factory reset sequence - LED will blink when initiated upon press and hold of + Button 0 after 3 seconds + 2. An Identify command was received + + - Non-ICD Configuration - 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 + 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 + Short Flash Off (950ms on/50ms off): The device is fully provisioned, but does not yet have full Thread network or service connectivity. - - _Solid On_ ; The device is fully provisioned and has full Thread + Solid On: The device is fully provisioned and has full Thread network and service connectivity. **LED 1** Simulates the Lock The following states are possible: diff --git a/examples/lock-app/silabs/build_for_wifi_args.gni b/examples/lock-app/silabs/build_for_wifi_args.gni index a9a7ee66170687..25c5a2435d332f 100644 --- a/examples/lock-app/silabs/build_for_wifi_args.gni +++ b/examples/lock-app/silabs/build_for_wifi_args.gni @@ -27,6 +27,6 @@ chip_subscription_timeout_resumption = false sl_use_subscription_synching = true # ICD Matter Configuration flags -sl_idle_mode_interval_s = 600 # 10min Idle Mode Interval -sl_active_mode_interval_ms = 10000 # 10s Active Mode Interval +sl_idle_mode_duration_s = 600 # 10min Idle Mode Duration +sl_active_mode_duration_ms = 10000 # 10s Active Mode Duration sl_active_mode_threshold_ms = 1000 # 1s Active Mode Threshold diff --git a/examples/lock-app/silabs/openthread.gni b/examples/lock-app/silabs/openthread.gni index cde56f8029f6da..3bfa566596aeaf 100644 --- a/examples/lock-app/silabs/openthread.gni +++ b/examples/lock-app/silabs/openthread.gni @@ -35,6 +35,6 @@ sl_ot_idle_interval_ms = 5000 # 5s Idle Intervals sl_ot_active_interval_ms = 500 # 500ms Active Intervals # ICD Matter Configuration flags -sl_idle_mode_interval_s = 600 # 10min Idle Mode Interval -sl_active_mode_interval_ms = 10000 # 10s Active Mode Interval +sl_idle_mode_duration_s = 600 # 10min Idle Mode Duration +sl_active_mode_duration_ms = 10000 # 10s Active Mode Duration sl_active_mode_threshold_ms = 1000 # 1s Active Mode Threshold diff --git a/examples/lock-app/silabs/src/AppTask.cpp b/examples/lock-app/silabs/src/AppTask.cpp index 4e8527f4f4fa1a..2510fa7f351c03 100644 --- a/examples/lock-app/silabs/src/AppTask.cpp +++ b/examples/lock-app/silabs/src/AppTask.cpp @@ -353,11 +353,12 @@ void AppTask::UpdateClusterState(intptr_t context) DlLockState newState = unlocked ? DlLockState::kUnlocked : DlLockState::kLocked; // write the new lock value - EmberAfStatus status = - DoorLockServer::Instance().SetLockState(1, newState) ? EMBER_ZCL_STATUS_SUCCESS : EMBER_ZCL_STATUS_FAILURE; + Protocols::InteractionModel::Status status = DoorLockServer::Instance().SetLockState(1, newState) + ? Protocols::InteractionModel::Status::Success + : Protocols::InteractionModel::Status::Failure; - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - SILABS_LOG("ERR: updating lock state %x", status); + SILABS_LOG("ERR: updating lock state %x", to_underlying(status)); } } diff --git a/examples/microwave-oven-app/microwave-oven-common/include/microwave-oven-device.h b/examples/microwave-oven-app/microwave-oven-common/include/microwave-oven-device.h index 2775d2a3227812..7799ae6fc7574a 100644 --- a/examples/microwave-oven-app/microwave-oven-common/include/microwave-oven-device.h +++ b/examples/microwave-oven-app/microwave-oven-common/include/microwave-oven-device.h @@ -22,7 +22,7 @@ #include #include #include -#include + #include #include #include @@ -230,7 +230,7 @@ class ExampleMicrowaveOvenDevice : public MicrowaveOvenControl::Delegate, static constexpr uint8_t kMaxPowerNum = 90u; static constexpr uint8_t kPowerStepNum = 10u; static constexpr uint32_t kMaxCookTimeSec = 86400u; - static constexpr uint8_t kDefaultPowerSettingNum = 100u; + static constexpr uint8_t kDefaultPowerSettingNum = kMaxPowerNum; // define the mode value static constexpr uint8_t kModeNormal = 0u; diff --git a/examples/microwave-oven-app/microwave-oven-common/src/microwave-oven-device.cpp b/examples/microwave-oven-app/microwave-oven-common/src/microwave-oven-device.cpp index 39e8ab2bf98b73..5ba3eedbc99a03 100644 --- a/examples/microwave-oven-app/microwave-oven-common/src/microwave-oven-device.cpp +++ b/examples/microwave-oven-app/microwave-oven-common/src/microwave-oven-device.cpp @@ -24,10 +24,9 @@ using namespace chip::app::Clusters::OperationalState; using namespace chip::app::Clusters::ModeBase; using namespace chip::app::Clusters::MicrowaveOvenControl; template -using List = chip::app::DataModel::List; -using ModeTagStructType = chip::app::Clusters::detail::Structs::ModeTagStruct::Type; -using OperationalStateEnum = chip::app::Clusters::OperationalState::OperationalStateEnum; -using Status = Protocols::InteractionModel::Status; +using List = chip::app::DataModel::List; +using ModeTagStructType = chip::app::Clusters::detail::Structs::ModeTagStruct::Type; +using Status = Protocols::InteractionModel::Status; void ExampleMicrowaveOvenDevice::MicrowaveOvenInit() { diff --git a/examples/ota-requestor-app/esp32/main/main.cpp b/examples/ota-requestor-app/esp32/main/main.cpp index f8282ccdf22e30..c3ee1d5803b207 100644 --- a/examples/ota-requestor-app/esp32/main/main.cpp +++ b/examples/ota-requestor-app/esp32/main/main.cpp @@ -16,7 +16,6 @@ */ #include "DeviceCallbacks.h" -#include "app/util/af-enums.h" #include "app/util/af.h" #include "esp_heap_caps_init.h" #include "esp_log.h" diff --git a/examples/persistent-storage/cc13x2x7_26x2x7/BUILD.gn b/examples/persistent-storage/cc13x2x7_26x2x7/BUILD.gn index ea0acea00155be..0a8930dff1adb2 100644 --- a/examples/persistent-storage/cc13x2x7_26x2x7/BUILD.gn +++ b/examples/persistent-storage/cc13x2x7_26x2x7/BUILD.gn @@ -46,7 +46,7 @@ ti_sysconfig("sysconfig") { "ti_drivers_config.h", ] - public_configs = [ ":sdk_dmm_config" ] + public_configs = [ ":sdk_cc13x2x7_26x2x7_dmm_config" ] cflags = [ "-Wno-comment", diff --git a/examples/placeholder/linux/BUILD.gn b/examples/placeholder/linux/BUILD.gn index 0752f7ee0fb4fe..089d223c0cd52d 100644 --- a/examples/placeholder/linux/BUILD.gn +++ b/examples/placeholder/linux/BUILD.gn @@ -38,11 +38,7 @@ executable("chip-${chip_tests_zap_config}") { "${chip_root}/examples/common/websocket-server", "${chip_root}/examples/placeholder/linux/apps/${chip_tests_zap_config}:${chip_tests_zap_config}", "${chip_root}/examples/platform/linux:app-main", - "${chip_root}/src/app/tests/suites/commands/delay", - "${chip_root}/src/app/tests/suites/commands/discovery", - "${chip_root}/src/app/tests/suites/commands/log", "${chip_root}/src/app/tests/suites/credentials:dac_provider", - "${chip_root}/src/app/tests/suites/pics", "${chip_root}/src/lib", "${chip_root}/src/lib/support:test_utils", "${chip_root}/src/platform/logging:headers", diff --git a/examples/placeholder/linux/apps/app1/ciTests.json b/examples/placeholder/linux/apps/app1/ciTests.json deleted file mode 100644 index 63ba1ad875563c..00000000000000 --- a/examples/placeholder/linux/apps/app1/ciTests.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "Test": [ - "Test_TC_WNCV_5_1_Simulated", - "Test_TC_OCC_2_4_Simulated", - "Test_TC_DGSW_3_2_Simulated", - "Test_TC_DGETH_3_2_Simulated", - "Test_TC_DGWIFI_3_2_Simulated", - "Test_TC_WNCV_6_1_Simulated", - "Test_TC_WNCV_7_1_Simulated", - "Test_TC_CC_3_4_Simulated", - "Test_TC_CC_4_5_Simulated", - "Test_TC_CC_5_4_Simulated", - "Test_TC_CC_6_4_Simulated", - "Test_TC_CC_7_5_Simulated", - "Test_TC_CC_9_4_Simulated", - "Test_TC_DGTHREAD_3_4_Simulated", - "Test_TC_OO_3_2_Simulated" - ], - "collection": ["Test"] -} diff --git a/examples/placeholder/linux/apps/app1/templates/templates.json b/examples/placeholder/linux/apps/app1/templates/templates.json deleted file mode 100644 index 07ab95ea1c7d99..00000000000000 --- a/examples/placeholder/linux/apps/app1/templates/templates.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "name": "Placeholder templates", - "version": "chip-v1", - "helpers": [ - "partials/helper.js", - "common/StringHelper.js", - "templates/app/helper.js", - "templates/chip/helper.js", - "common/ClusterTestGeneration.js", - "chip-tool/templates/helper.js", - "chip-tool/templates/tests/helper.js" - ], - "resources": { - "pics-metafile": "../../../../../../src/app/tests/suites/certification/PICS.yaml", - "certification-metadir": "../../../../../../src/app/tests/suites/certification", - "test-metadir": "../../../../../../src/app/tests/suites" - }, - "override": "../../../../../../src/app/zap-templates/common/override.js", - "partials": [ - { - "name": "header", - "path": "../../../../../../src/app/zap-templates/partials/header.zapt" - }, - { - "name": "test_cluster", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/test_cluster.zapt" - }, - { - "name": "test_step", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/test_step.zapt" - }, - { - "name": "test_step_response", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/test_step_response.zapt" - }, - { - "name": "maybeCheckExpectedValue", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/checks/maybeCheckExpectedValue.zapt" - }, - { - "name": "maybeCheckExpectedConstraints", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/checks/maybeCheckExpectedConstraints.zapt" - }, - { - "name": "maybeSaveAs", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/saveAs/maybeSaveAs.zapt" - }, - { - "name": "setupSaveAs", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/saveAs/setupSaveAs.zapt" - }, - { - "name": "teardownSaveAs", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/saveAs/teardownSaveAs.zapt" - }, - { - "name": "commandValue", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/command_value.zapt" - }, - { - "name": "valueEquals", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/value_equals.zapt" - } - ], - "templates": [ - { - "path": "../../../../templates/tests-commands.zapt", - "name": "Tests Commands header", - "output": "test/Commands.h" - } - ] -} diff --git a/examples/placeholder/linux/apps/app2/templates/templates.json b/examples/placeholder/linux/apps/app2/templates/templates.json deleted file mode 100644 index 07ab95ea1c7d99..00000000000000 --- a/examples/placeholder/linux/apps/app2/templates/templates.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "name": "Placeholder templates", - "version": "chip-v1", - "helpers": [ - "partials/helper.js", - "common/StringHelper.js", - "templates/app/helper.js", - "templates/chip/helper.js", - "common/ClusterTestGeneration.js", - "chip-tool/templates/helper.js", - "chip-tool/templates/tests/helper.js" - ], - "resources": { - "pics-metafile": "../../../../../../src/app/tests/suites/certification/PICS.yaml", - "certification-metadir": "../../../../../../src/app/tests/suites/certification", - "test-metadir": "../../../../../../src/app/tests/suites" - }, - "override": "../../../../../../src/app/zap-templates/common/override.js", - "partials": [ - { - "name": "header", - "path": "../../../../../../src/app/zap-templates/partials/header.zapt" - }, - { - "name": "test_cluster", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/test_cluster.zapt" - }, - { - "name": "test_step", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/test_step.zapt" - }, - { - "name": "test_step_response", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/test_step_response.zapt" - }, - { - "name": "maybeCheckExpectedValue", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/checks/maybeCheckExpectedValue.zapt" - }, - { - "name": "maybeCheckExpectedConstraints", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/checks/maybeCheckExpectedConstraints.zapt" - }, - { - "name": "maybeSaveAs", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/saveAs/maybeSaveAs.zapt" - }, - { - "name": "setupSaveAs", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/saveAs/setupSaveAs.zapt" - }, - { - "name": "teardownSaveAs", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/saveAs/teardownSaveAs.zapt" - }, - { - "name": "commandValue", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/command_value.zapt" - }, - { - "name": "valueEquals", - "path": "../../../../../../examples/chip-tool/templates/tests/partials/value_equals.zapt" - } - ], - "templates": [ - { - "path": "../../../../templates/tests-commands.zapt", - "name": "Tests Commands header", - "output": "test/Commands.h" - } - ] -} diff --git a/examples/placeholder/linux/include/MatterCallbacks.h b/examples/placeholder/linux/include/MatterCallbacks.h index 0ddddb8f7d2ae9..d7ba67e2b38200 100644 --- a/examples/placeholder/linux/include/MatterCallbacks.h +++ b/examples/placeholder/linux/include/MatterCallbacks.h @@ -19,76 +19,22 @@ #pragma once #include "InteractiveServer.h" -#include "Options.h" #include #include -#include -#include - -#include - -TestCommand * GetTargetTest() -{ - const char * command = LinuxDeviceOptions::GetInstance().command; - if (command == nullptr) - { - return nullptr; - } - - static auto test = GetTestCommand(command); - if (test.get() == nullptr) - { - ChipLogError(chipTool, "Specified test command does not exist: %s", command); - PrintTestCommands(); - return nullptr; - } - - const char * PICSFilePath = LinuxDeviceOptions::GetInstance().PICS; - if (PICSFilePath != nullptr) - { - test->PICS.SetValue(PICSBooleanReader::Read(PICSFilePath)); - } - - return test.get(); -} void MatterPostCommandReceivedCallback(const chip::app::ConcreteCommandPath & commandPath, const chip::Access::SubjectDescriptor & subjectDescriptor) { VerifyOrReturn(!InteractiveServer::GetInstance().Command(commandPath)); - - auto test = GetTargetTest(); - VerifyOrReturn(test != nullptr && test->isRunning); - - ChipLogError(Zcl, "Receive command: Endpoint: %u, Cluster: " ChipLogFormatMEI ", Command: " ChipLogFormatMEI, - commandPath.mEndpointId, ChipLogValueMEI(commandPath.mClusterId), ChipLogValueMEI(commandPath.mCommandId)); - - test->CheckCommandPath(commandPath); } void MatterPostAttributeReadCallback(const chip::app::ConcreteAttributePath & attributePath) { VerifyOrReturn(!InteractiveServer::GetInstance().ReadAttribute(attributePath)); - - auto test = GetTargetTest(); - VerifyOrReturn(test != nullptr && test->isRunning); - - ChipLogError(Zcl, "Receive READ attribute command: Endpoint: %u, Cluster: " ChipLogFormatMEI ", Attribute: " ChipLogFormatMEI, - attributePath.mEndpointId, ChipLogValueMEI(attributePath.mClusterId), ChipLogValueMEI(attributePath.mAttributeId)); - - test->CheckAttributePath(attributePath); } void MatterPostAttributeWriteCallback(const chip::app::ConcreteAttributePath & attributePath) { VerifyOrReturn(!InteractiveServer::GetInstance().WriteAttribute(attributePath)); - - auto test = GetTargetTest(); - VerifyOrReturn(test != nullptr && test->isRunning); - - ChipLogError(Zcl, "Receive WRITE attribute command: Endpoint: %u, Cluster: " ChipLogFormatMEI ", Attribute: " ChipLogFormatMEI, - attributePath.mEndpointId, ChipLogValueMEI(attributePath.mClusterId), ChipLogValueMEI(attributePath.mAttributeId)); - - test->CheckAttributePath(attributePath); } diff --git a/examples/placeholder/linux/include/TestCommand.h b/examples/placeholder/linux/include/TestCommand.h deleted file mode 100644 index 5b0d733d4736dc..00000000000000 --- a/examples/placeholder/linux/include/TestCommand.h +++ /dev/null @@ -1,194 +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 - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -inline constexpr char kIdentityAlpha[] = ""; -inline constexpr char kIdentityBeta[] = ""; -inline constexpr char kIdentityGamma[] = ""; - -class TestCommand : public TestRunner, - public PICSChecker, - public LogCommands, - public DiscoveryCommands, - public DelayCommands, - public ValueChecker, - public ConstraintsChecker -{ -public: - TestCommand(const char * commandName, uint16_t testsCount) : - TestRunner(commandName, testsCount), mCommandPath(0, 0, 0), mAttributePath(0, 0, 0) - {} - virtual ~TestCommand() {} - - void SetCommandExitStatus(CHIP_ERROR status) - { - chip::DeviceLayer::PlatformMgr().StopEventLoopTask(); - mExitCode = (CHIP_NO_ERROR == status ? EXIT_SUCCESS : EXIT_FAILURE); - } - - int GetCommandExitCode() { return mExitCode; } - - template - size_t AddArgument(const char * name, chip::Optional * value) - { - return 0; - } - - template - size_t AddArgument(const char * name, int64_t min, uint64_t max, chip::Optional * value) - { - return 0; - } - - CHIP_ERROR ContinueOnChipMainThread(CHIP_ERROR err) override - { - if (CHIP_NO_ERROR == err) - { - NextTest(); - } - else - { - Exit(chip::ErrorStr(err), err); - } - return CHIP_NO_ERROR; - } - - void Exit(std::string message, CHIP_ERROR err) override - { - LogEnd(message, err); - - if (CHIP_NO_ERROR == err) - { - chip::DeviceLayer::PlatformMgr().ScheduleWork(AsyncExit, reinterpret_cast(this)); - } - else - { - SetCommandExitStatus(err); - } - } - - static void AsyncExit(intptr_t context) - { - TestCommand * command = reinterpret_cast(context); - command->SetCommandExitStatus(CHIP_NO_ERROR); - } - - static void ScheduleNextTest(intptr_t context) - { - TestCommand * command = reinterpret_cast(context); - command->isRunning = true; - command->NextTest(); - } - - static void OnPlatformEvent(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg) - { - switch (event->Type) - { - case chip::DeviceLayer::DeviceEventType::kCommissioningComplete: - ChipLogProgress(chipTool, "Commissioning complete"); - chip::DeviceLayer::PlatformMgr().ScheduleWork(ScheduleNextTest, arg); - chip::DeviceLayer::PlatformMgr().RemoveEventHandler(OnPlatformEvent, arg); - break; - } - } - - void CheckCommandPath(const chip::app::ConcreteCommandPath & commandPath) - { - if (commandPath == mCommandPath) - { - chip::DeviceLayer::PlatformMgr().ScheduleWork(ScheduleNextTest, reinterpret_cast(this)); - return; - } - - ChipLogError(chipTool, "CommandPath does not match"); - SetCommandExitStatus(CHIP_ERROR_INTERNAL); - } - - void CheckAttributePath(const chip::app::ConcreteAttributePath & attributePath) - { - if (attributePath == mAttributePath) - { - chip::DeviceLayer::PlatformMgr().ScheduleWork(ScheduleNextTest, reinterpret_cast(this)); - return; - } - - ChipLogError(chipTool, "AttributePath does not match"); - return SetCommandExitStatus(CHIP_ERROR_INTERNAL); - } - - void ClearAttributeAndCommandPaths() - { - mCommandPath = chip::app::ConcreteCommandPath(0, 0, 0); - mAttributePath = chip::app::ConcreteAttributePath(0, 0, 0); - } - - std::atomic_bool isRunning{ true }; - - CHIP_ERROR WaitAttribute(chip::EndpointId endpointId, chip::ClusterId clusterId, chip::AttributeId attributeId) - { - ClearAttributeAndCommandPaths(); - ChipLogError(chipTool, "[Endpoint: 0x%08x Cluster: %d, Attribute: %d]", endpointId, clusterId, attributeId); - mAttributePath = chip::app::ConcreteAttributePath(endpointId, clusterId, attributeId); - return CHIP_NO_ERROR; - } - - CHIP_ERROR WaitCommand(chip::EndpointId endpointId, chip::ClusterId clusterId, chip::CommandId commandId) - { - ClearAttributeAndCommandPaths(); - ChipLogError(chipTool, "[Endpoint: 0x%08x Cluster: %d, Command: %d]", endpointId, clusterId, commandId); - mCommandPath = chip::app::ConcreteCommandPath(endpointId, clusterId, commandId); - return CHIP_NO_ERROR; - } - -protected: - chip::app::ConcreteCommandPath mCommandPath; - chip::app::ConcreteAttributePath mAttributePath; - chip::Optional mCommissionerNodeId; - chip::Optional mEndpointId; - int mExitCode = EXIT_SUCCESS; - - void SetIdentity(const char * name){}; - - /////////// DelayCommands Interface ///////// - void OnWaitForMs() override { NextTest(); } - - CHIP_ERROR WaitForCommissioning(const char * identity, - const chip::app::Clusters::DelayCommands::Commands::WaitForCommissioning::Type & value) override - { - isRunning = false; - return chip::DeviceLayer::PlatformMgr().AddEventHandler(OnPlatformEvent, reinterpret_cast(this)); - } -}; diff --git a/examples/placeholder/linux/main.cpp b/examples/placeholder/linux/main.cpp index 11f7529e07aa03..ab5fa266dd6392 100644 --- a/examples/placeholder/linux/main.cpp +++ b/examples/placeholder/linux/main.cpp @@ -28,12 +28,6 @@ int main(int argc, char * argv[]) { VerifyOrDie(ChipLinuxAppInit(argc, argv, AppOptions::GetOptions()) == 0); - auto test = GetTargetTest(); - if (test != nullptr) - { - test->NextTest(); - } - LinuxDeviceOptions::GetInstance().dacProvider = AppOptions::GetDACProvider(); auto & server = InteractiveServer::GetInstance(); @@ -44,10 +38,5 @@ int main(int argc, char * argv[]) ChipLinuxAppMainLoop(); - if (test != nullptr) - { - return test->GetCommandExitCode(); - } - return 0; } diff --git a/examples/placeholder/templates/tests-commands.zapt b/examples/placeholder/templates/tests-commands.zapt deleted file mode 100644 index be0474f4632605..00000000000000 --- a/examples/placeholder/templates/tests-commands.zapt +++ /dev/null @@ -1,33 +0,0 @@ -{{> header}} - -#pragma once - -#include "TestCommand.h" - -#include - -{{>test_cluster tests="../linux/apps/app1/ciTests.json" credsIssuerConfigArg=false needsWaitDuration=false}} - -std::unique_ptrGetTestCommand(std::string testName) -{ - {{#chip_tests "../linux/apps/app1/ciTests.json" includeAllClusters=true}} - if (testName == "{{filename}}") - { - return std::unique_ptr<{{filename}}Suite>(new {{filename}}Suite()); - } - {{/chip_tests}} - - return nullptr; -} - -void PrintTestCommands() -{ - {{#chip_tests "../linux/apps/app1/ciTests.json" includeAllClusters=true}} - {{#first}} - ChipLogError(chipTool, "Supported commands:"); - {{/first}} - ChipLogError(chipTool, "\t* {{filename}}"); - {{else}} - ChipLogError("\t No available commands."); - {{/chip_tests}} -} diff --git a/examples/platform/asr/shell/matter_shell.cpp b/examples/platform/asr/shell/matter_shell.cpp index dcd412af5f033e..bfa138f92ff0e5 100644 --- a/examples/platform/asr/shell/matter_shell.cpp +++ b/examples/platform/asr/shell/matter_shell.cpp @@ -83,12 +83,12 @@ void asr_matter_onoff(int value) { ChipLogProgress(Zcl, "updating on/off = %d", value); - EmberAfStatus status = chip::app::Clusters::OnOff::Attributes::OnOff::Set( + Protocols::InteractionModel::Status status = chip::app::Clusters::OnOff::Attributes::OnOff::Set( /* endpoint ID */ 1, (uint8_t *) &value); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogProgress(Zcl, "ERR: updating on/off %x", status); + ChipLogProgress(Zcl, "ERR: updating on/off %x", to_underlying(status)); } } diff --git a/examples/platform/nxp/PigweedLogger.cpp b/examples/platform/nxp/PigweedLogger.cpp new file mode 100644 index 00000000000000..8e7bf277e320fb --- /dev/null +++ b/examples/platform/nxp/PigweedLogger.cpp @@ -0,0 +1,111 @@ +/* + * + * Copyright (c) 2023 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 PigweedLogger.cpp + * + * This file contains basic string writing function, based on Pigweed HDLC + * over UART transport. It allows to send log messages even if the application + * needs to use HDLC/UART for another purpose like the RPC server. + */ + +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "PigweedLogger.h" + +namespace PigweedLogger { +namespace { + +constexpr uint8_t kLogHdlcAddress = 1; // Send log messages to HDLC address 1 (other than RPC communication) +constexpr size_t kWriteBufferSize = 256; // Buffer for constructing HDLC frames + +// Exclusive access to the backend is needed to make sure that log messages coming +// from different threads are not interwoven. +SemaphoreHandle_t sLoggerLock; + +static pw::stream::SysIoWriter sWriter; +static size_t sWriteBufferPos; +static char sWriteBuffer[kWriteBufferSize]; + +static void send(void) +{ + pw::hdlc::WriteUIFrame(kLogHdlcAddress, pw::as_bytes(pw::span(sWriteBuffer, sWriteBufferPos)), sWriter); + sWriteBufferPos = 0; +} + +} // namespace + +void Init(void) +{ + sLoggerLock = xSemaphoreCreateMutex(); + assert(sLoggerLock != NULL); + + pw_sys_io_Init(); +} + +int PutString(const char * buffer, size_t size) +{ + assert(sWriteBufferPos < kWriteBufferSize); + assert(size < kWriteBufferSize); + + Lock(); + + for (size_t i = 0; i < size; ++i) + { + // Send each line excluding "\r\n" in a separate frame + + if (buffer[i] == '\r') + continue; + + if (buffer[i] == '\n') + { + send(); + continue; + } + + sWriteBuffer[sWriteBufferPos++] = buffer[i]; + + if (sWriteBufferPos == kWriteBufferSize) + send(); + } + + Unlock(); + + return size; +} + +void Lock() +{ + xSemaphoreTake(sLoggerLock, portMAX_DELAY); +} + +void Unlock() +{ + xSemaphoreGive(sLoggerLock); +} + +} // namespace PigweedLogger diff --git a/examples/platform/nxp/PigweedLogger.h b/examples/platform/nxp/PigweedLogger.h new file mode 100644 index 00000000000000..8ea1da5dbae92b --- /dev/null +++ b/examples/platform/nxp/PigweedLogger.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2023 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 + +namespace PigweedLogger { + +void Init(void); +int PutString(const char * buffer, size_t size); + +void Lock(); +void Unlock(); + +} // namespace PigweedLogger diff --git a/examples/platform/nxp/Rpc.cpp b/examples/platform/nxp/Rpc.cpp new file mode 100644 index 00000000000000..d9bf744382627c --- /dev/null +++ b/examples/platform/nxp/Rpc.cpp @@ -0,0 +1,144 @@ +/* + * + * Copyright (c) 2023 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 "FreeRTOS.h" +#include "PigweedLogger.h" +#include "PigweedLoggerMutex.h" +#include "pigweed/RpcService.h" +#include "task.h" + +#if defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE +#include "pigweed/rpc_services/Attributes.h" +#endif // defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE + +#if defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE +#include "pigweed/rpc_services/Button.h" +#endif // defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE + +#if defined(PW_RPC_DEVICE_SERVICE) && PW_RPC_DEVICE_SERVICE +#include "pigweed/rpc_services/Device.h" +#endif // defined(PW_RPC_DEVICE_SERVICE) && PW_RPC_DEVICE_SERVICE + +#if defined(PW_RPC_LIGHTING_SERVICE) && PW_RPC_LIGHTING_SERVICE +#include "pigweed/rpc_services/Lighting.h" +#endif // defined(PW_RPC_LIGHTING_SERVICE) && PW_RPC_LIGHTING_SERVICE + +#if defined(PW_RPC_LOCKING_SERVICE) && PW_RPC_LOCKING_SERVICE +#include "pigweed/rpc_services/Locking.h" +#endif // defined(PW_RPC_LOCKING_SERVICE) && PW_RPC_LOCKING_SERVICE + +#define RPC_TASK_STACK_SIZE 2048 +#define RPC_TASK_PRIORITY 1 +TaskHandle_t RpcTaskHandle; + +namespace chip { +namespace rpc { + +#if defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE +class NxpButton final : public Button +{ +public: + pw::Status Event(const chip_rpc_ButtonEvent & request, pw_protobuf_Empty & response) override + { + GetAppTask().ButtonEventHandler(request.idx, request.idx); + return pw::OkStatus(); + } +}; +#endif // defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE + +#if defined(PW_RPC_DEVICE_SERVICE) && PW_RPC_DEVICE_SERVICE +class NxpDevice final : public Device +{ +public: + pw::Status Reboot(const pw_protobuf_Empty & request, pw_protobuf_Empty & response) override + { + mRebootTimer = xTimerCreate("Reboot", kRebootTimerPeriodTicks, false, nullptr, RebootHandler); + xTimerStart(mRebootTimer, pdMS_TO_TICKS(0)); + return pw::OkStatus(); + } + +private: + static constexpr TickType_t kRebootTimerPeriodTicks = 300; + TimerHandle_t mRebootTimer; + + static void RebootHandler(TimerHandle_t) { NVIC_SystemReset(); } +}; +#endif // defined(PW_RPC_DEVICE_SERVICE) && PW_RPC_DEVICE_SERVICE + +namespace { + +#if defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE +Attributes attributes_service; +#endif // defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE + +#if defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE +NxpButton button_service; +#endif // defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE + +#if defined(PW_RPC_DEVICE_SERVICE) && PW_RPC_DEVICE_SERVICE +NxpDevice device_service; +#endif // defined(PW_RPC_DEVICE_SERVICE) && PW_RPC_DEVICE_SERVICE + +#if defined(PW_RPC_LIGHTING_SERVICE) && PW_RPC_LIGHTING_SERVICE +Lighting lighting_service; +#endif // defined(PW_RPC_LIGHTING_SERVICE) && PW_RPC_LIGHTING_SERVICE + +#if defined(PW_RPC_LOCKING_SERVICE) && PW_RPC_LOCKING_SERVICE +Locking locking; +#endif // defined(PW_RPC_LOCKING_SERVICE) && PW_RPC_LOCKING_SERVICE + +void RegisterServices(pw::rpc::Server & server) +{ +#if defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE + server.RegisterService(attributes_service); +#endif // defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE + +#if defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE + server.RegisterService(button_service); +#endif // defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE + +#if defined(PW_RPC_DEVICE_SERVICE) && PW_RPC_DEVICE_SERVICE + server.RegisterService(device_service); +#endif // defined(PW_RPC_DEVICE_SERVICE) && PW_RPC_DEVICE_SERVICE + +#if defined(PW_RPC_LIGHTING_SERVICE) && PW_RPC_LIGHTING_SERVICE + server.RegisterService(lighting_service); +#endif // defined(PW_RPC_LIGHTING_SERVICE) && PW_RPC_LIGHTING_SERVICE + +#if defined(PW_RPC_LOCKING_SERVICE) && PW_RPC_LOCKING_SERVICE + server.RegisterService(locking); +#endif // defined(PW_RPC_LOCKING_SERVICE) && PW_RPC_LOCKING_SERVICE +} + +} // namespace + +void RunRpcService(void *) +{ + Start(RegisterServices, &logger_mutex); +} + +void Init() +{ + PigweedLogger::Init(); + + xTaskCreate(RunRpcService, "RPC_TASK", RPC_TASK_STACK_SIZE, nullptr, RPC_TASK_PRIORITY, &RpcTaskHandle); +} + +} // namespace rpc +} // namespace chip diff --git a/examples/energy-management-app/energy-management-common/include/EnergyManagementManager.h b/examples/platform/nxp/Rpc.h similarity index 83% rename from examples/energy-management-app/energy-management-common/include/EnergyManagementManager.h rename to examples/platform/nxp/Rpc.h index 3dac6f579c609e..741fe7982883cc 100644 --- a/examples/energy-management-app/energy-management-common/include/EnergyManagementManager.h +++ b/examples/platform/nxp/Rpc.h @@ -18,9 +18,13 @@ #pragma once -#include -#include +namespace chip { +namespace rpc { -#include +class LightingService; -#include +void Init(); +void RunRpcService(void *); + +} // namespace rpc +} // namespace chip diff --git a/examples/platform/nxp/k32w/k32w0/scripts/sign-outdir.py b/examples/platform/nxp/k32w/k32w0/scripts/sign-outdir.py index dfaf912ae5283d..ea4a888c9e3555 100644 --- a/examples/platform/nxp/k32w/k32w0/scripts/sign-outdir.py +++ b/examples/platform/nxp/k32w/k32w0/scripts/sign-outdir.py @@ -4,7 +4,7 @@ def main(args): - if os.environ["NXP_K32W0_SDK_ROOT"] != "": + if "NXP_K32W0_SDK_ROOT" in os.environ and os.environ["NXP_K32W0_SDK_ROOT"] != "": sign_images_path = os.environ["NXP_K32W0_SDK_ROOT"] + "/tools/imagetool/sign_images.sh" else: sign_images_path = os.getcwd() + "/../../../../../../../third_party/nxp/k32w0_sdk/repo/core/tools/imagetool/sign_images.sh" diff --git a/examples/platform/nxp/k32w/k32w1/BUILD.gn b/examples/platform/nxp/k32w/k32w1/BUILD.gn index 0a980406bce075..5cd2a8b31392c2 100644 --- a/examples/platform/nxp/k32w/k32w1/BUILD.gn +++ b/examples/platform/nxp/k32w/k32w1/BUILD.gn @@ -13,9 +13,11 @@ # limitations under the License. import("//build_overrides/chip.gni") -import("//build_overrides/k32w1_sdk.gni") +import("//build_overrides/nxp_sdk.gni") -import("${k32w1_sdk_build_root}/k32w1_sdk.gni") +import("${nxp_sdk_build_root}/nxp_sdk.gni") + +import("${nxp_sdk_build_root}/${nxp_sdk_name}/${nxp_sdk_name}.gni") config("chip_examples_project_config") { include_dirs = [ diff --git a/examples/platform/nxp/k32w/k32w1/app/args.gni b/examples/platform/nxp/k32w/k32w1/app/args.gni index c09510c14df229..2705c251fb807d 100644 --- a/examples/platform/nxp/k32w/k32w1/app/args.gni +++ b/examples/platform/nxp/k32w/k32w1/app/args.gni @@ -16,11 +16,6 @@ import("//build_overrides/chip.gni") import("${chip_root}/src/platform/nxp/k32w/k32w1/args.gni") -arm_float_abi = "hard" -arm_cpu = "cortex-m33" -arm_fpu = "fpv5-sp-d16" -arm_arch = "armv8-m.main+dsp+fp" - openthread_project_core_config_file = "OpenThreadConfig.h" chip_ble_project_config_include = "" diff --git a/examples/platform/nxp/k32w/k32w1/app/ldscripts/k32w1_app.ld b/examples/platform/nxp/k32w/k32w1/app/ldscripts/k32w1_app.ld index de9c882af9fed4..ac8f7bd65d0950 100644 --- a/examples/platform/nxp/k32w/k32w1/app/ldscripts/k32w1_app.ld +++ b/examples/platform/nxp/k32w/k32w1/app/ldscripts/k32w1_app.ld @@ -14,7 +14,7 @@ ** limitations under the License. */ -m_smu2_data_start = 0x489C0000; +m_smu2_data_start = 0x489C0080; m_smu2_data_end = 0x489C537B; m_smu2_data_size = m_smu2_data_end - m_smu2_data_start + 1; diff --git a/examples/platform/nxp/k32w/k32w1/app/support/BUILD.gn b/examples/platform/nxp/k32w/k32w1/app/support/BUILD.gn index dafa6de4d3d31d..dc688edc2c78ed 100644 --- a/examples/platform/nxp/k32w/k32w1/app/support/BUILD.gn +++ b/examples/platform/nxp/k32w/k32w1/app/support/BUILD.gn @@ -13,7 +13,7 @@ # limitations under the License. import("//build_overrides/chip.gni") -import("//build_overrides/k32w1_sdk.gni") +import("//build_overrides/nxp_sdk.gni") config("support_config") { include_dirs = [ "../../../../.." ] diff --git a/examples/platform/nxp/k32w/k32w1/app/support/FreeRtosHooks.c b/examples/platform/nxp/k32w/k32w1/app/support/FreeRtosHooks.c index 83549b1dc1f04a..a7c78a77440e03 100644 --- a/examples/platform/nxp/k32w/k32w1/app/support/FreeRtosHooks.c +++ b/examples/platform/nxp/k32w/k32w1/app/support/FreeRtosHooks.c @@ -51,10 +51,6 @@ #define APP_DBG_LOG(...) #endif -#if (configUSE_TICKLESS_IDLE != 0) -extern uint64_t PWR_TryEnterLowPower(uint64_t timeoutUs); -#endif - static inline void mutex_init(mbedtls_threading_mutex_t * p_mutex) { assert(p_mutex != NULL); @@ -123,7 +119,7 @@ void vPortSuppressTicksAndSleep(TickType_t xExpectedIdleTime) if (abortIdle == false) { /* Enter low power with a maximal timeout */ - actualIdleTimeUs = PWR_TryEnterLowPower(expectedIdleTimeUs); + actualIdleTimeUs = PWR_EnterLowPower(expectedIdleTimeUs); /* Re enable systicks and compensate systick timebase */ PWR_SysticksPostProcess(expectedIdleTimeUs, actualIdleTimeUs); diff --git a/examples/platform/nxp/k32w/k32w1/app/support/Memconfig.cpp b/examples/platform/nxp/k32w/k32w1/app/support/Memconfig.cpp index e5acf5ea3ceecb..e05281fdee4f4d 100644 --- a/examples/platform/nxp/k32w/k32w1/app/support/Memconfig.cpp +++ b/examples/platform/nxp/k32w/k32w1/app/support/Memconfig.cpp @@ -40,6 +40,8 @@ #include #endif // CHIP_CONFIG_MEMORY_DEBUG_DMALLOC +#include "fsl_component_mem_manager.h" + /* Assumes 8bit bytes! */ #define heapBITS_PER_BYTE ((size_t) 8) @@ -64,42 +66,6 @@ static size_t xBlockAllocatedBit = ((size_t) 1) << ((sizeof(size_t) * heapBITS_P extern "C" { -/* xPortMallocUsableSize relies on heap4 implementation. -It returns the size of an allocated block and it is -called by __wrap_realloc. -Thus it is validated in __wrap_realloc function that the allocated size -of the old_ptr is smaller than the allocated size of new_ptr */ -size_t xPortMallocUsableSize(void * pv) -{ - uint8_t * puc = (uint8_t *) pv; - BlockLink_t * pxLink; - void * voidp; - size_t sz = 0; - - if (pv != NULL) - { - vTaskSuspendAll(); - { - /* The memory being checked will have an BlockLink_t structure immediately - before it. */ - puc -= xHeapStructSize; - - /* This casting is to keep the compiler from issuing warnings. */ - voidp = (void *) puc; - pxLink = (BlockLink_t *) voidp; - - /* Check if the block is actually allocated. */ - configASSERT((pxLink->xBlockSize & xBlockAllocatedBit) != 0); - configASSERT(pxLink->pxNextFreeBlock == NULL); - - sz = (pxLink->xBlockSize & ~xBlockAllocatedBit) - xHeapStructSize; - } - (void) xTaskResumeAll(); - } - - return sz; -} - void * __wrap_malloc(size_t size) { return pvPortMalloc(size); @@ -135,34 +101,22 @@ void * __wrap_calloc(size_t num, size_t size) void * __wrap_realloc(void * ptr, size_t new_size) { - void * new_ptr = NULL; if (new_size) { - size_t old_ptr_size = xPortMallocUsableSize(ptr); - if (new_size <= old_ptr_size) - { - /* Return old pointer if the newly allocated size is smaller - or equal to the allocated size for old_ptr */ - return ptr; - } - - /* if old_ptr is NULL, then old_ptr_size is zero and new_ptr will be returned */ - new_ptr = pvPortMalloc(new_size); + /* MML will only realloc a new pointer if the size is greater than old pointer size.*/ + vTaskSuspendAll(); + new_ptr = MEM_BufferRealloc(ptr, new_size); + xTaskResumeAll(); if (!new_ptr) { ChipLogError(DeviceLayer, "__wrap_realloc: Could not allocate memory!"); return NULL; } - - memset(reinterpret_cast(new_ptr) + old_ptr_size, 0, (new_size - old_ptr_size)); - memcpy(new_ptr, ptr, old_ptr_size); } - vPortFree(ptr); - return new_ptr; } diff --git a/examples/platform/nxp/pw_rpc_server.gni b/examples/platform/nxp/pw_rpc_server.gni new file mode 100644 index 00000000000000..0ec2d3b121b2d5 --- /dev/null +++ b/examples/platform/nxp/pw_rpc_server.gni @@ -0,0 +1,62 @@ +# 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. + +import("//build_overrides/chip.gni") +import("//build_overrides/pigweed.gni") + +import("$dir_pw_build/target_types.gni") +import("${chip_root}/src/platform/device.gni") + +nxp_platform_dir = "${chip_root}/examples/platform/nxp" + +# Define a scope for pw RPC server dependencies. +# This .gni file should be imported by applications that want to use pw RPC. +# These variables shall be copied in the final executable target by adding +# forward_variables_from(pw_rpc_server, "*") in the beginning of the target scope. +pw_rpc_server = { + sources = [ + "${chip_root}/examples/common/pigweed/RpcService.cpp", + "${chip_root}/examples/common/pigweed/nxp/PigweedLoggerMutex.cpp", + "${nxp_platform_dir}/PigweedLogger.cpp", + "${nxp_platform_dir}/Rpc.cpp", + ] + + include_dirs = [ + "${chip_root}/examples/common", + "${chip_root}/examples/common/pigweed", + "${chip_root}/examples/common/pigweed/nxp", + "${nxp_platform_dir}", + ] + + defines = [ + "PW_RPC_ENABLED", + "PW_RPC_ATTRIBUTE_SERVICE=1", + "PW_RPC_BUTTON_SERVICE=1", + "PW_RPC_DEVICE_SERVICE=1", + "PW_RPC_LIGHTING_SERVICE=1", + ] + + deps = [ + "$dir_pw_hdlc:rpc_channel_output", + "$dir_pw_stream:sys_io_stream", + "$dir_pw_trace", + "${chip_root}/config/nxp/lib/pw_rpc:pw_rpc", + "${chip_root}/examples/common/pigweed:attributes_service.nanopb_rpc", + "${chip_root}/examples/common/pigweed:button_service.nanopb_rpc", + "${chip_root}/examples/common/pigweed:device_service.nanopb_rpc", + "${chip_root}/examples/common/pigweed:lighting_service.nanopb_rpc", + "${nxp_platform_dir}/pw_sys_io:pw_sys_io_nxp", + ] + deps += pw_build_LINK_DEPS +} diff --git a/src/app/tests/suites/commands/discovery/BUILD.gn b/examples/platform/nxp/pw_sys_io/BUILD.gn similarity index 51% rename from src/app/tests/suites/commands/discovery/BUILD.gn rename to examples/platform/nxp/pw_sys_io/BUILD.gn index 169e9a91609183..ed3d35246093f1 100644 --- a/src/app/tests/suites/commands/discovery/BUILD.gn +++ b/examples/platform/nxp/pw_sys_io/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2022 Project CHIP Authors +# 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. @@ -12,25 +12,31 @@ # See the License for the specific language governing permissions and # limitations under the License. -import("//build_overrides/build.gni") import("//build_overrides/chip.gni") +import("//build_overrides/nxp_sdk.gni") +import("//build_overrides/pigweed.gni") -static_library("discovery") { - output_name = "libDiscoveryCommands" +import("$dir_pw_build/target_types.gni") +import("${chip_root}/src/platform/device.gni") - include_dirs = [ "${chip_root}/zzz_generated/app-common" ] +config("default_config") { + include_dirs = [ + "public", + "${chip_root}/src/", + ] +} +pw_source_set("pw_sys_io_nxp") { sources = [ - "DiscoveryCommands.cpp", - "DiscoveryCommands.h", + "${chip_root}/src/lib/shell/streamer_nxp.cpp", + "sys_io_nxp.cc", ] - cflags = [ "-Wconversion" ] - - public_deps = [ - "${chip_root}/src/app", - "${chip_root}/src/app/common:simulated", - "${chip_root}/src/lib/address_resolve", - "${chip_root}/src/lib/support", + deps = [ + "$dir_pw_sys_io:default_putget_bytes", + "$dir_pw_sys_io:facade", + "${nxp_sdk_build_root}/${nxp_sdk_name}:nxp_sdk", ] + + public_configs = [ ":default_config" ] } diff --git a/src/app/tests/suites/pics/PICSBooleanReader.h b/examples/platform/nxp/pw_sys_io/public/pw_sys_io_nxp/init.h similarity index 63% rename from src/app/tests/suites/pics/PICSBooleanReader.h rename to examples/platform/nxp/pw_sys_io/public/pw_sys_io_nxp/init.h index 6f8e240c6678f1..47d18772638d5f 100644 --- a/src/app/tests/suites/pics/PICSBooleanReader.h +++ b/examples/platform/nxp/pw_sys_io/public/pw_sys_io_nxp/init.h @@ -1,6 +1,6 @@ -/** +/* * - * Copyright (c) 2021 Project CHIP Authors + * 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. @@ -15,17 +15,13 @@ * limitations under the License. */ -/** - * @file - * @brief Declaration of PICS Boolean Reader, a class that read and parse - * a file with PICS Code and their enabled/disabled state. - */ +#pragma once + +#include "pw_preprocessor/util.h" + +PW_EXTERN_C_START -#include -#include +// The actual implement of PreMainInit() in sys_io_BACKEND. +void pw_sys_io_Init(); -class PICSBooleanReader -{ -public: - static std::map Read(std::string filepath); -}; +PW_EXTERN_C_END diff --git a/examples/platform/nxp/pw_sys_io/sys_io_nxp.cc b/examples/platform/nxp/pw_sys_io/sys_io_nxp.cc new file mode 100644 index 00000000000000..8e729f0986bbb3 --- /dev/null +++ b/examples/platform/nxp/pw_sys_io/sys_io_nxp.cc @@ -0,0 +1,78 @@ +/* + * + * 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. + */ + +#include + +#include +#include +#include +#include + +#include + +int16_t console_getchar(char * chr) +{ + auto * streamer = chip::Shell::streamer_get(); + return static_cast(streamer->read_cb(nullptr, chr, 1)); +} + +int16_t console_putchar(const char * chr) +{ + auto * streamer = chip::Shell::streamer_get(); + return static_cast(streamer->write_cb(nullptr, chr, 1)); +} + +extern "C" void pw_sys_io_Init() +{ + auto * streamer = chip::Shell::streamer_get(); + streamer->init_cb(nullptr); +} + +namespace pw::sys_io { + +Status ReadByte(std::byte * dest) +{ + if (!dest) + return Status::InvalidArgument(); + + int16_t ret = console_getchar(reinterpret_cast(dest)); + return ret < 0 ? Status::FailedPrecondition() : OkStatus(); +} + +Status WriteByte(std::byte b) +{ + int16_t ret = console_putchar(reinterpret_cast(&b)); + return ret < 0 ? Status::FailedPrecondition() : OkStatus(); +} + +// Writes a string using pw::sys_io, and add newline characters at the end. +StatusWithSize WriteLine(const std::string_view & s) +{ + size_t chars_written = 0; + StatusWithSize result = WriteBytes(pw::as_bytes(pw::span(s))); + if (!result.ok()) + { + return result; + } + chars_written += result.size(); + result = WriteBytes(pw::as_bytes(pw::span("\r\n", 2))); + chars_written += result.size(); + + return StatusWithSize(result.status(), chars_written); +} + +} // namespace pw::sys_io diff --git a/examples/platform/silabs/SiWx917/BUILD.gn b/examples/platform/silabs/SiWx917/BUILD.gn index 99be69fbbc9b14..bbfeee1fa679e1 100644 --- a/examples/platform/silabs/SiWx917/BUILD.gn +++ b/examples/platform/silabs/SiWx917/BUILD.gn @@ -32,7 +32,7 @@ declare_args() { sl_wfx_config_scan = true # Argument to force enable WPA3 security on rs91x - rs91x_wpa3_transition = false + rs91x_wpa3_transition = true # use commissionable data for SiWx917 siwx917_commissionable_data = false diff --git a/examples/platform/silabs/efr32/BUILD.gn b/examples/platform/silabs/efr32/BUILD.gn index effbe038389f06..02f1317f55b643 100644 --- a/examples/platform/silabs/efr32/BUILD.gn +++ b/examples/platform/silabs/efr32/BUILD.gn @@ -32,7 +32,7 @@ declare_args() { sl_wfx_config_scan = true # Argument to force enable WPA3 security on rs91x - rs91x_wpa3_transition = false + rs91x_wpa3_transition = true #default WiFi SSID chip_default_wifi_ssid = "" diff --git a/examples/pump-app/cc13x2x7_26x2x7/BUILD.gn b/examples/pump-app/cc13x2x7_26x2x7/BUILD.gn index 4c670552dc2baf..02e87a04f067f0 100644 --- a/examples/pump-app/cc13x2x7_26x2x7/BUILD.gn +++ b/examples/pump-app/cc13x2x7_26x2x7/BUILD.gn @@ -54,7 +54,7 @@ ti_sysconfig("sysconfig") { ] } - public_configs = [ ":sdk_dmm_config" ] + public_configs = [ ":sdk_cc13x2x7_26x2x7_dmm_config" ] cflags = [ "-Wno-comment", diff --git a/examples/pump-app/cc13x2x7_26x2x7/main/AppTask.cpp b/examples/pump-app/cc13x2x7_26x2x7/main/AppTask.cpp index 31f0846c412008..8ac373b643bfce 100644 --- a/examples/pump-app/cc13x2x7_26x2x7/main/AppTask.cpp +++ b/examples/pump-app/cc13x2x7_26x2x7/main/AppTask.cpp @@ -459,15 +459,15 @@ void AppTask::DispatchEvent(AppEvent * aEvent) void AppTask::InitOnOffClusterState() { - EmberAfStatus status; + Protocols::InteractionModel::Status status; ChipLogProgress(NotSpecified, "Init On/Off clusterstate"); // Write false as pump always boots in stopped mode status = OnOff::Attributes::OnOff::Set(ONOFF_CLUSTER_ENDPOINT, false); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Init On/Off state %x", status); + ChipLogError(NotSpecified, "ERR: Init On/Off state %x", to_underlying(status)); } } @@ -482,7 +482,7 @@ void AppTask::UpdateClusterState(void) void AppTask::UpdateCluster(intptr_t context) { - EmberAfStatus status; + Protocols::InteractionModel::Status status; BitMask pumpStatus; ChipLogProgress(NotSpecified, "Update Cluster State"); @@ -501,126 +501,126 @@ void AppTask::UpdateCluster(intptr_t context) status = PumpConfigurationAndControl::Attributes::ControlMode::Set(PCC_CLUSTER_ENDPOINT, PumpConfigurationAndControl::ControlModeEnum::kConstantFlow); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Constant Flow error %x", status); + ChipLogError(NotSpecified, "ERR: Constant Flow error %x", to_underlying(status)); } status = PumpConfigurationAndControl::Attributes::ControlMode::Set( PCC_CLUSTER_ENDPOINT, PumpConfigurationAndControl::ControlModeEnum::kConstantPressure); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Constant Pressure error %x", status); + ChipLogError(NotSpecified, "ERR: Constant Pressure error %x", to_underlying(status)); } status = PumpConfigurationAndControl::Attributes::ControlMode::Set( PCC_CLUSTER_ENDPOINT, PumpConfigurationAndControl::ControlModeEnum::kConstantSpeed); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Constant Speed error %x", status); + ChipLogError(NotSpecified, "ERR: Constant Speed error %x", to_underlying(status)); } status = PumpConfigurationAndControl::Attributes::ControlMode::Set( PCC_CLUSTER_ENDPOINT, PumpConfigurationAndControl::ControlModeEnum::kConstantTemperature); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Constant Temperature error %x", status); + ChipLogError(NotSpecified, "ERR: Constant Temperature error %x", to_underlying(status)); } // Write the new values bool onOffState = !PumpMgr().IsStopped(); status = OnOff::Attributes::OnOff::Set(ONOFF_CLUSTER_ENDPOINT, onOffState); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating On/Off state %x", status); + ChipLogError(NotSpecified, "ERR: Updating On/Off state %x", to_underlying(status)); } int16_t maxPressure = PumpMgr().GetMaxPressure(); status = PumpConfigurationAndControl::Attributes::MaxPressure::Set(PCC_CLUSTER_ENDPOINT, maxPressure); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxPressure %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxPressure %x", to_underlying(status)); } uint16_t maxSpeed = PumpMgr().GetMaxSpeed(); status = PumpConfigurationAndControl::Attributes::MaxSpeed::Set(PCC_CLUSTER_ENDPOINT, maxSpeed); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxSpeed %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxSpeed %x", to_underlying(status)); } uint16_t maxFlow = PumpMgr().GetMaxFlow(); status = PumpConfigurationAndControl::Attributes::MaxFlow::Set(PCC_CLUSTER_ENDPOINT, maxFlow); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxFlow %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxFlow %x", to_underlying(status)); } int16_t minConstPress = PumpMgr().GetMinConstPressure(); status = PumpConfigurationAndControl::Attributes::MinConstPressure::Set(PCC_CLUSTER_ENDPOINT, minConstPress); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MinConstPressure %x", status); + ChipLogError(NotSpecified, "ERR: Updating MinConstPressure %x", to_underlying(status)); } int16_t maxConstPress = PumpMgr().GetMaxConstPressure(); status = PumpConfigurationAndControl::Attributes::MaxConstPressure::Set(PCC_CLUSTER_ENDPOINT, maxConstPress); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxConstPressure %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxConstPressure %x", to_underlying(status)); } int16_t minCompPress = PumpMgr().GetMinCompPressure(); status = PumpConfigurationAndControl::Attributes::MinCompPressure::Set(PCC_CLUSTER_ENDPOINT, minCompPress); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MinCompPressure %x", status); + ChipLogError(NotSpecified, "ERR: Updating MinCompPressure %x", to_underlying(status)); } int16_t maxCompPress = PumpMgr().GetMaxCompPressure(); status = PumpConfigurationAndControl::Attributes::MaxCompPressure::Set(PCC_CLUSTER_ENDPOINT, maxCompPress); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxCompPressure %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxCompPressure %x", to_underlying(status)); } uint16_t minConstSpeed = PumpMgr().GetMinConstSpeed(); status = PumpConfigurationAndControl::Attributes::MinConstSpeed::Set(PCC_CLUSTER_ENDPOINT, minConstSpeed); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MinConstSpeed %x", status); + ChipLogError(NotSpecified, "ERR: Updating MinConstSpeed %x", to_underlying(status)); } uint16_t maxConstSpeed = PumpMgr().GetMaxConstSpeed(); status = PumpConfigurationAndControl::Attributes::MaxConstSpeed::Set(PCC_CLUSTER_ENDPOINT, maxConstSpeed); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxConstSpeed %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxConstSpeed %x", to_underlying(status)); } uint16_t minConstFlow = PumpMgr().GetMinConstFlow(); status = PumpConfigurationAndControl::Attributes::MinConstFlow::Set(PCC_CLUSTER_ENDPOINT, minConstFlow); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MinConstFlow %x", status); + ChipLogError(NotSpecified, "ERR: Updating MinConstFlow %x", to_underlying(status)); } uint16_t maxConstFlow = PumpMgr().GetMaxConstFlow(); status = PumpConfigurationAndControl::Attributes::MaxConstFlow::Set(PCC_CLUSTER_ENDPOINT, maxConstFlow); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxConstFlow %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxConstFlow %x", to_underlying(status)); } int16_t minConstTemp = PumpMgr().GetMinConstTemp(); status = PumpConfigurationAndControl::Attributes::MinConstTemp::Set(PCC_CLUSTER_ENDPOINT, minConstTemp); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MinConstTemp %x", status); + ChipLogError(NotSpecified, "ERR: Updating MinConstTemp %x", to_underlying(status)); } int16_t maxConstTemp = PumpMgr().GetMaxConstTemp(); status = PumpConfigurationAndControl::Attributes::MaxConstTemp::Set(PCC_CLUSTER_ENDPOINT, maxConstTemp); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxConstTemp %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxConstTemp %x", to_underlying(status)); } } diff --git a/examples/pump-app/cc13x4_26x4/BUILD.gn b/examples/pump-app/cc13x4_26x4/BUILD.gn index 7cbf21cc41140e..8c68ba70066315 100644 --- a/examples/pump-app/cc13x4_26x4/BUILD.gn +++ b/examples/pump-app/cc13x4_26x4/BUILD.gn @@ -62,7 +62,7 @@ ti_sysconfig("sysconfig") { #"ti_build_config.opt", ] - public_configs = [ ":sdk_dmm_config" ] + public_configs = [ ":sdk_cc13x4_26x4_dmm_config" ] cflags = [ "-Wno-comment", diff --git a/examples/pump-app/cc13x4_26x4/main/AppTask.cpp b/examples/pump-app/cc13x4_26x4/main/AppTask.cpp index c98e99be1cb487..ea094e96767665 100644 --- a/examples/pump-app/cc13x4_26x4/main/AppTask.cpp +++ b/examples/pump-app/cc13x4_26x4/main/AppTask.cpp @@ -456,15 +456,15 @@ void AppTask::DispatchEvent(AppEvent * aEvent) void AppTask::InitOnOffClusterState() { - EmberAfStatus status; + Protocols::InteractionModel::Status status; ChipLogProgress(NotSpecified, "Init On/Off clusterstate"); // Write false as pump always boots in stopped mode status = OnOff::Attributes::OnOff::Set(ONOFF_CLUSTER_ENDPOINT, false); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Init On/Off state %x", status); + ChipLogError(NotSpecified, "ERR: Init On/Off state %x", to_underlying(status)); } } @@ -479,7 +479,7 @@ void AppTask::UpdateClusterState(void) void AppTask::UpdateCluster(intptr_t context) { - EmberAfStatus status; + Protocols::InteractionModel::Status status; BitMask pumpStatus; ChipLogProgress(NotSpecified, "Update Cluster State"); @@ -498,126 +498,126 @@ void AppTask::UpdateCluster(intptr_t context) status = PumpConfigurationAndControl::Attributes::ControlMode::Set(PCC_CLUSTER_ENDPOINT, PumpConfigurationAndControl::ControlModeEnum::kConstantFlow); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Constant Flow error %x", status); + ChipLogError(NotSpecified, "ERR: Constant Flow error %x", to_underlying(status)); } status = PumpConfigurationAndControl::Attributes::ControlMode::Set( PCC_CLUSTER_ENDPOINT, PumpConfigurationAndControl::ControlModeEnum::kConstantPressure); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Constant Pressure error %x", status); + ChipLogError(NotSpecified, "ERR: Constant Pressure error %x", to_underlying(status)); } status = PumpConfigurationAndControl::Attributes::ControlMode::Set( PCC_CLUSTER_ENDPOINT, PumpConfigurationAndControl::ControlModeEnum::kConstantSpeed); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Constant Speed error %x", status); + ChipLogError(NotSpecified, "ERR: Constant Speed error %x", to_underlying(status)); } status = PumpConfigurationAndControl::Attributes::ControlMode::Set( PCC_CLUSTER_ENDPOINT, PumpConfigurationAndControl::ControlModeEnum::kConstantTemperature); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Constant Temperature error %x", status); + ChipLogError(NotSpecified, "ERR: Constant Temperature error %x", to_underlying(status)); } // Write the new values bool onOffState = !PumpMgr().IsStopped(); status = OnOff::Attributes::OnOff::Set(ONOFF_CLUSTER_ENDPOINT, onOffState); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating On/Off state %x", status); + ChipLogError(NotSpecified, "ERR: Updating On/Off state %x", to_underlying(status)); } int16_t maxPressure = PumpMgr().GetMaxPressure(); status = PumpConfigurationAndControl::Attributes::MaxPressure::Set(PCC_CLUSTER_ENDPOINT, maxPressure); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxPressure %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxPressure %x", to_underlying(status)); } uint16_t maxSpeed = PumpMgr().GetMaxSpeed(); status = PumpConfigurationAndControl::Attributes::MaxSpeed::Set(PCC_CLUSTER_ENDPOINT, maxSpeed); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxSpeed %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxSpeed %x", to_underlying(status)); } uint16_t maxFlow = PumpMgr().GetMaxFlow(); status = PumpConfigurationAndControl::Attributes::MaxFlow::Set(PCC_CLUSTER_ENDPOINT, maxFlow); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxFlow %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxFlow %x", to_underlying(status)); } int16_t minConstPress = PumpMgr().GetMinConstPressure(); status = PumpConfigurationAndControl::Attributes::MinConstPressure::Set(PCC_CLUSTER_ENDPOINT, minConstPress); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MinConstPressure %x", status); + ChipLogError(NotSpecified, "ERR: Updating MinConstPressure %x", to_underlying(status)); } int16_t maxConstPress = PumpMgr().GetMaxConstPressure(); status = PumpConfigurationAndControl::Attributes::MaxConstPressure::Set(PCC_CLUSTER_ENDPOINT, maxConstPress); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxConstPressure %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxConstPressure %x", to_underlying(status)); } int16_t minCompPress = PumpMgr().GetMinCompPressure(); status = PumpConfigurationAndControl::Attributes::MinCompPressure::Set(PCC_CLUSTER_ENDPOINT, minCompPress); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MinCompPressure %x", status); + ChipLogError(NotSpecified, "ERR: Updating MinCompPressure %x", to_underlying(status)); } int16_t maxCompPress = PumpMgr().GetMaxCompPressure(); status = PumpConfigurationAndControl::Attributes::MaxCompPressure::Set(PCC_CLUSTER_ENDPOINT, maxCompPress); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxCompPressure %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxCompPressure %x", to_underlying(status)); } uint16_t minConstSpeed = PumpMgr().GetMinConstSpeed(); status = PumpConfigurationAndControl::Attributes::MinConstSpeed::Set(PCC_CLUSTER_ENDPOINT, minConstSpeed); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MinConstSpeed %x", status); + ChipLogError(NotSpecified, "ERR: Updating MinConstSpeed %x", to_underlying(status)); } uint16_t maxConstSpeed = PumpMgr().GetMaxConstSpeed(); status = PumpConfigurationAndControl::Attributes::MaxConstSpeed::Set(PCC_CLUSTER_ENDPOINT, maxConstSpeed); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxConstSpeed %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxConstSpeed %x", to_underlying(status)); } uint16_t minConstFlow = PumpMgr().GetMinConstFlow(); status = PumpConfigurationAndControl::Attributes::MinConstFlow::Set(PCC_CLUSTER_ENDPOINT, minConstFlow); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MinConstFlow %x", status); + ChipLogError(NotSpecified, "ERR: Updating MinConstFlow %x", to_underlying(status)); } uint16_t maxConstFlow = PumpMgr().GetMaxConstFlow(); status = PumpConfigurationAndControl::Attributes::MaxConstFlow::Set(PCC_CLUSTER_ENDPOINT, maxConstFlow); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxConstFlow %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxConstFlow %x", to_underlying(status)); } int16_t minConstTemp = PumpMgr().GetMinConstTemp(); status = PumpConfigurationAndControl::Attributes::MinConstTemp::Set(PCC_CLUSTER_ENDPOINT, minConstTemp); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MinConstTemp %x", status); + ChipLogError(NotSpecified, "ERR: Updating MinConstTemp %x", to_underlying(status)); } int16_t maxConstTemp = PumpMgr().GetMaxConstTemp(); status = PumpConfigurationAndControl::Attributes::MaxConstTemp::Set(PCC_CLUSTER_ENDPOINT, maxConstTemp); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxConstTemp %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxConstTemp %x", to_underlying(status)); } } diff --git a/examples/pump-app/nrfconnect/main/AppTask.cpp b/examples/pump-app/nrfconnect/main/AppTask.cpp index 1426977d5028ec..3a6eb9023ded0a 100644 --- a/examples/pump-app/nrfconnect/main/AppTask.cpp +++ b/examples/pump-app/nrfconnect/main/AppTask.cpp @@ -562,7 +562,7 @@ void AppTask::DispatchEvent(const AppEvent & event) void AppTask::UpdateClusterState() { - EmberAfStatus status; + Protocols::InteractionModel::Status status; ChipLogProgress(NotSpecified, "UpdateClusterState"); @@ -571,99 +571,99 @@ void AppTask::UpdateClusterState() bool onOffState = !PumpMgr().IsStopped(); status = OnOff::Attributes::OnOff::Set(kOnOffClusterEndpoint, onOffState); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating On/Off state %x", status); + ChipLogError(NotSpecified, "ERR: Updating On/Off state %x", to_underlying(status)); } int16_t maxPressure = PumpMgr().GetMaxPressure(); status = PumpConfigurationAndControl::Attributes::MaxPressure::Set(kPccClusterEndpoint, maxPressure); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxPressure %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxPressure %x", to_underlying(status)); } uint16_t maxSpeed = PumpMgr().GetMaxSpeed(); status = PumpConfigurationAndControl::Attributes::MaxSpeed::Set(kPccClusterEndpoint, maxSpeed); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxSpeed %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxSpeed %x", to_underlying(status)); } uint16_t maxFlow = PumpMgr().GetMaxFlow(); status = PumpConfigurationAndControl::Attributes::MaxFlow::Set(kPccClusterEndpoint, maxFlow); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxFlow %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxFlow %x", to_underlying(status)); } int16_t minConstPress = PumpMgr().GetMinConstPressure(); status = PumpConfigurationAndControl::Attributes::MinConstPressure::Set(kPccClusterEndpoint, minConstPress); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MinConstPressure %x", status); + ChipLogError(NotSpecified, "ERR: Updating MinConstPressure %x", to_underlying(status)); } int16_t maxConstPress = PumpMgr().GetMaxConstPressure(); status = PumpConfigurationAndControl::Attributes::MaxConstPressure::Set(kPccClusterEndpoint, maxConstPress); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxConstPressure %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxConstPressure %x", to_underlying(status)); } int16_t minCompPress = PumpMgr().GetMinCompPressure(); status = PumpConfigurationAndControl::Attributes::MinCompPressure::Set(kPccClusterEndpoint, minCompPress); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MinCompPressure %x", status); + ChipLogError(NotSpecified, "ERR: Updating MinCompPressure %x", to_underlying(status)); } int16_t maxCompPress = PumpMgr().GetMaxCompPressure(); status = PumpConfigurationAndControl::Attributes::MaxCompPressure::Set(kPccClusterEndpoint, maxCompPress); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxCompPressure %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxCompPressure %x", to_underlying(status)); } uint16_t minConstSpeed = PumpMgr().GetMinConstSpeed(); status = PumpConfigurationAndControl::Attributes::MinConstSpeed::Set(kPccClusterEndpoint, minConstSpeed); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MinConstSpeed %x", status); + ChipLogError(NotSpecified, "ERR: Updating MinConstSpeed %x", to_underlying(status)); } uint16_t maxConstSpeed = PumpMgr().GetMaxConstSpeed(); status = PumpConfigurationAndControl::Attributes::MaxConstSpeed::Set(kPccClusterEndpoint, maxConstSpeed); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxConstSpeed %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxConstSpeed %x", to_underlying(status)); } uint16_t minConstFlow = PumpMgr().GetMinConstFlow(); status = PumpConfigurationAndControl::Attributes::MinConstFlow::Set(kPccClusterEndpoint, minConstFlow); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MinConstFlow %x", status); + ChipLogError(NotSpecified, "ERR: Updating MinConstFlow %x", to_underlying(status)); } uint16_t maxConstFlow = PumpMgr().GetMaxConstFlow(); status = PumpConfigurationAndControl::Attributes::MaxConstFlow::Set(kPccClusterEndpoint, maxConstFlow); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxConstFlow %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxConstFlow %x", to_underlying(status)); } int16_t minConstTemp = PumpMgr().GetMinConstTemp(); status = PumpConfigurationAndControl::Attributes::MinConstTemp::Set(kPccClusterEndpoint, minConstTemp); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MinConstTemp %x", status); + ChipLogError(NotSpecified, "ERR: Updating MinConstTemp %x", to_underlying(status)); } int16_t maxConstTemp = PumpMgr().GetMaxConstTemp(); status = PumpConfigurationAndControl::Attributes::MaxConstTemp::Set(kPccClusterEndpoint, maxConstTemp); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating MaxConstTemp %x", status); + ChipLogError(NotSpecified, "ERR: Updating MaxConstTemp %x", to_underlying(status)); } } diff --git a/examples/pump-app/silabs/src/AppTask.cpp b/examples/pump-app/silabs/src/AppTask.cpp index 5b46641cd58dbc..365c53fc7a33ac 100644 --- a/examples/pump-app/silabs/src/AppTask.cpp +++ b/examples/pump-app/silabs/src/AppTask.cpp @@ -242,11 +242,11 @@ void AppTask::ActionCompleted(PumpManager::Action_t aAction, int32_t aActor) void AppTask::UpdateClusterState(intptr_t context) { // Set On/Off state - EmberAfStatus status; + Protocols::InteractionModel::Status status; bool onOffState = !PumpMgr().IsStopped(); status = chip::app::Clusters::OnOff::Attributes::OnOff::Set(PCC_CLUSTER_ENDPOINT, onOffState); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(NotSpecified, "ERR: Updating On/Off state %x", status); + ChipLogError(NotSpecified, "ERR: Updating On/Off state %x", to_underlying(status)); } } diff --git a/examples/pump-app/telink/src/AppTask.cpp b/examples/pump-app/telink/src/AppTask.cpp index 4b443464879146..368702d51ae11f 100644 --- a/examples/pump-app/telink/src/AppTask.cpp +++ b/examples/pump-app/telink/src/AppTask.cpp @@ -131,10 +131,10 @@ void AppTask::UpdateClusterState() // Write the new values bool onOffState = !PumpMgr().IsStopped(); - EmberAfStatus status = Clusters::OnOff::Attributes::OnOff::Set(kOnOffClusterEndpoint, onOffState); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Protocols::InteractionModel::Status status = Clusters::OnOff::Attributes::OnOff::Set(kOnOffClusterEndpoint, onOffState); + if (status != Protocols::InteractionModel::Status::Success) { - LOG_ERR("ERR: Updating On/Off state %x", status); + LOG_ERR("ERR: Updating On/Off state %x", to_underlying(status)); } int16_t maxPressure = PumpMgr().GetMaxPressure(); diff --git a/examples/pump-controller-app/cc13x2x7_26x2x7/BUILD.gn b/examples/pump-controller-app/cc13x2x7_26x2x7/BUILD.gn index fb118046b876c4..2d66a7f993158b 100644 --- a/examples/pump-controller-app/cc13x2x7_26x2x7/BUILD.gn +++ b/examples/pump-controller-app/cc13x2x7_26x2x7/BUILD.gn @@ -55,7 +55,7 @@ ti_sysconfig("sysconfig") { ] } - public_configs = [ ":sdk_dmm_config" ] + public_configs = [ ":sdk_cc13x2x7_26x2x7_dmm_config" ] cflags = [ "-Wno-comment", diff --git a/examples/pump-controller-app/cc13x4_26x4/BUILD.gn b/examples/pump-controller-app/cc13x4_26x4/BUILD.gn index c1b106f0feb1c2..289b10de001294 100644 --- a/examples/pump-controller-app/cc13x4_26x4/BUILD.gn +++ b/examples/pump-controller-app/cc13x4_26x4/BUILD.gn @@ -63,7 +63,7 @@ ti_sysconfig("sysconfig") { #"ti_build_config.opt", ] - public_configs = [ ":sdk_dmm_config" ] + public_configs = [ ":sdk_cc13x4_26x4_dmm_config" ] cflags = [ "-Wno-comment", diff --git a/examples/rvc-app/rvc-common/include/rvc-operational-state-delegate.h b/examples/rvc-app/rvc-common/include/rvc-operational-state-delegate.h index 3081a27ea3e625..6522793ac94dc9 100644 --- a/examples/rvc-app/rvc-common/include/rvc-operational-state-delegate.h +++ b/examples/rvc-app/rvc-common/include/rvc-operational-state-delegate.h @@ -20,7 +20,7 @@ #include #include -#include + #include namespace chip { diff --git a/examples/shell/cc13x2x7_26x2x7/BUILD.gn b/examples/shell/cc13x2x7_26x2x7/BUILD.gn index 5264bd079c02b0..80e342313aaca6 100644 --- a/examples/shell/cc13x2x7_26x2x7/BUILD.gn +++ b/examples/shell/cc13x2x7_26x2x7/BUILD.gn @@ -59,7 +59,7 @@ ti_sysconfig("sysconfig") { #"ti_build_config.opt", ] - public_configs = [ ":sdk_dmm_config" ] + public_configs = [ ":sdk_cc13x2x7_26x2x7_dmm_config" ] cflags = [ "-Wno-comment", diff --git a/examples/shell/cc13x4_26x4/BUILD.gn b/examples/shell/cc13x4_26x4/BUILD.gn index e6db696baa649c..2480f085783384 100644 --- a/examples/shell/cc13x4_26x4/BUILD.gn +++ b/examples/shell/cc13x4_26x4/BUILD.gn @@ -59,7 +59,7 @@ ti_sysconfig("sysconfig") { #"ti_build_config.opt", ] - public_configs = [ ":sdk_dmm_config" ] + public_configs = [ ":sdk_cc13x4_26x4_dmm_config" ] cflags = [ "-Wno-comment", diff --git a/examples/shell/shell_common/BUILD.gn b/examples/shell/shell_common/BUILD.gn index 28b26af3ae211f..cb098a64598a1b 100644 --- a/examples/shell/shell_common/BUILD.gn +++ b/examples/shell/shell_common/BUILD.gn @@ -72,6 +72,7 @@ static_library("shell_common") { "${chip_root}/examples/all-clusters-app/all-clusters-common/src/static-supported-temperature-levels.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementManager.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/src/ElectricalPowerMeasurementDelegate.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp", ] diff --git a/examples/thermostat/qpg/src/ThermostaticRadiatorValveManager.cpp b/examples/thermostat/qpg/src/ThermostaticRadiatorValveManager.cpp index f8f2c348cc2558..55173272977964 100644 --- a/examples/thermostat/qpg/src/ThermostaticRadiatorValveManager.cpp +++ b/examples/thermostat/qpg/src/ThermostaticRadiatorValveManager.cpp @@ -304,7 +304,7 @@ void ThermostaticRadiatorValveManager::UpdateLocalTemperature(int16_t aLocalTemp { SystemLayer().ScheduleLambda([aLocalTemperature] { ChipLogProgress(NotSpecified, "UpdateLocalTemperature with value (0.01 degC) %u", aLocalTemperature); - if (EMBER_ZCL_STATUS_SUCCESS != + if (Protocols::InteractionModel::Status::Success != Thermostat::Attributes::LocalTemperature::Set(QPG_THERMOSTATIC_ENDPOINT_ID, aLocalTemperature)) { ChipLogProgress(NotSpecified, "UpdateLocalTemperature failure"); diff --git a/examples/thermostat/qpg/src/ZclCallbacks.cpp b/examples/thermostat/qpg/src/ZclCallbacks.cpp index 4551a0d0bedb2f..c66901656442cc 100644 --- a/examples/thermostat/qpg/src/ZclCallbacks.cpp +++ b/examples/thermostat/qpg/src/ZclCallbacks.cpp @@ -56,10 +56,10 @@ void emberAfThermostatClusterInitCallback(EndpointId endpoint) { // Temp. code for testing purpose, need to be updated - const auto logOnFailure = [](EmberAfStatus status, const char * attributeName) { - if (status != EMBER_ZCL_STATUS_SUCCESS) + const auto logOnFailure = [](Protocols::InteractionModel::Status status, const char * attributeName) { + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(Zcl, "Failed to set DoorLock %s: %x", attributeName, status); + ChipLogError(Zcl, "Failed to set DoorLock %s: %x", attributeName, to_underlying(status)); } }; diff --git a/examples/tv-app/android/include/account-login/AccountLoginManager.cpp b/examples/tv-app/android/include/account-login/AccountLoginManager.cpp index 2151dd63920f74..b3160b2ec2fd8b 100644 --- a/examples/tv-app/android/include/account-login/AccountLoginManager.cpp +++ b/examples/tv-app/android/include/account-login/AccountLoginManager.cpp @@ -112,7 +112,8 @@ uint16_t AccountLoginManager::GetClusterRevision(chip::EndpointId endpoint) } uint16_t clusterRevision = 0; - bool success = (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == EMBER_ZCL_STATUS_SUCCESS); + bool success = + (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == chip::Protocols::InteractionModel::Status::Success); if (!success) { ChipLogError(Zcl, "AccountLoginManager::GetClusterRevision error reading cluster revision"); diff --git a/examples/tv-app/android/include/content-launcher/AppContentLauncherManager.cpp b/examples/tv-app/android/include/content-launcher/AppContentLauncherManager.cpp index 31745a93c42fce..86eabb83f99066 100644 --- a/examples/tv-app/android/include/content-launcher/AppContentLauncherManager.cpp +++ b/examples/tv-app/android/include/content-launcher/AppContentLauncherManager.cpp @@ -174,7 +174,8 @@ uint16_t AppContentLauncherManager::GetClusterRevision(chip::EndpointId endpoint } uint16_t clusterRevision = 0; - bool success = (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == EMBER_ZCL_STATUS_SUCCESS); + bool success = + (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == chip::Protocols::InteractionModel::Status::Success); if (!success) { ChipLogError(Zcl, "AppContentLauncherManager::GetClusterRevision error reading cluster revision"); diff --git a/examples/tv-app/android/include/media-playback/AppMediaPlaybackManager.cpp b/examples/tv-app/android/include/media-playback/AppMediaPlaybackManager.cpp index 39e364d60e4148..087f1742c355a0 100644 --- a/examples/tv-app/android/include/media-playback/AppMediaPlaybackManager.cpp +++ b/examples/tv-app/android/include/media-playback/AppMediaPlaybackManager.cpp @@ -292,7 +292,8 @@ uint16_t AppMediaPlaybackManager::GetClusterRevision(chip::EndpointId endpoint) } uint16_t clusterRevision = 0; - bool success = (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == EMBER_ZCL_STATUS_SUCCESS); + bool success = + (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == chip::Protocols::InteractionModel::Status::Success); if (!success) { ChipLogError(Zcl, "AppMediaPlaybackManager::GetClusterRevision error reading cluster revision"); diff --git a/examples/tv-app/android/include/target-navigator/TargetNavigatorManager.cpp b/examples/tv-app/android/include/target-navigator/TargetNavigatorManager.cpp index cb22e9fd9b8abf..23cf8058bab068 100644 --- a/examples/tv-app/android/include/target-navigator/TargetNavigatorManager.cpp +++ b/examples/tv-app/android/include/target-navigator/TargetNavigatorManager.cpp @@ -154,7 +154,8 @@ uint16_t TargetNavigatorManager::GetClusterRevision(chip::EndpointId endpoint) } uint16_t clusterRevision = 0; - bool success = (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == EMBER_ZCL_STATUS_SUCCESS); + bool success = + (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == chip::Protocols::InteractionModel::Status::Success); if (!success) { ChipLogError(Zcl, "TargetNavigatorManager::GetClusterRevision error reading cluster revision"); diff --git a/examples/tv-app/android/java/ChannelManager.cpp b/examples/tv-app/android/java/ChannelManager.cpp index 997f041b78982f..3c0efcab9f8cdc 100644 --- a/examples/tv-app/android/java/ChannelManager.cpp +++ b/examples/tv-app/android/java/ChannelManager.cpp @@ -761,7 +761,8 @@ uint16_t ChannelManager::GetClusterRevision(chip::EndpointId endpoint) } uint16_t clusterRevision = 0; - bool success = (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == EMBER_ZCL_STATUS_SUCCESS); + bool success = + (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == chip::Protocols::InteractionModel::Status::Success); if (!success) { ChipLogError(Zcl, "ChannelManager::GetClusterRevision error reading cluster revision"); diff --git a/examples/tv-app/android/java/ContentAppCommandDelegate.cpp b/examples/tv-app/android/java/ContentAppCommandDelegate.cpp index 53136c23e5a596..3963140d1b5e65 100644 --- a/examples/tv-app/android/java/ContentAppCommandDelegate.cpp +++ b/examples/tv-app/android/java/ContentAppCommandDelegate.cpp @@ -41,7 +41,7 @@ using LaunchResponseType = chip::app::Clusters::ContentLauncher::Command using PlaybackResponseType = chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::Type; using NavigateTargetResponseType = chip::app::Clusters::TargetNavigator::Commands::NavigateTargetResponse::Type; using GetSetupPINResponseType = chip::app::Clusters::AccountLogin::Commands::GetSetupPINResponse::Type; -using Status = Protocols::InteractionModel::Status; +using Status = chip::Protocols::InteractionModel::Status; const std::string FAILURE_KEY = "PlatformError"; const std::string FAILURE_STATUS_KEY = "Status"; @@ -60,7 +60,7 @@ void ContentAppCommandDelegate::InvokeCommand(CommandHandlerInterface::HandlerCo { handlerContext.SetCommandHandled(); handlerContext.mCommandHandler.AddStatus(handlerContext.mRequestPath, - Protocols::InteractionModel::Status::InvalidCommand); + chip::Protocols::InteractionModel::Status::InvalidCommand); return; } @@ -112,7 +112,7 @@ Status ContentAppCommandDelegate::InvokeCommand(EndpointId epId, ClusterId clust if (!mContentAppEndpointManager.HasValidObjectRef()) { - return Protocols::InteractionModel::Status::Failure; + return chip::Protocols::InteractionModel::Status::Failure; } jstring resp = @@ -133,7 +133,7 @@ Status ContentAppCommandDelegate::InvokeCommand(EndpointId epId, ClusterId clust if (!reader.parse(respStr.c_str(), value)) { env->DeleteLocalRef(resp); - return Protocols::InteractionModel::Status::Failure; + return chip::Protocols::InteractionModel::Status::Failure; } } env->DeleteLocalRef(resp); @@ -146,15 +146,15 @@ Status ContentAppCommandDelegate::InvokeCommand(EndpointId epId, ClusterId clust { return static_cast(value[FAILURE_STATUS_KEY].asUInt()); } - return Protocols::InteractionModel::Status::Failure; + return chip::Protocols::InteractionModel::Status::Failure; } - return Protocols::InteractionModel::Status::UnsupportedEndpoint; + return chip::Protocols::InteractionModel::Status::UnsupportedEndpoint; } else { commandHandled = false; - return Protocols::InteractionModel::Status::UnsupportedEndpoint; + return chip::Protocols::InteractionModel::Status::UnsupportedEndpoint; } } @@ -178,7 +178,7 @@ void ContentAppCommandDelegate::FormatResponseData(CommandHandlerInterface::Hand handlerContext.mRequestPath, static_cast(value[FAILURE_STATUS_KEY].asUInt())); return; } - handlerContext.mCommandHandler.AddStatus(handlerContext.mRequestPath, Protocols::InteractionModel::Status::Failure); + handlerContext.mCommandHandler.AddStatus(handlerContext.mRequestPath, chip::Protocols::InteractionModel::Status::Failure); return; } @@ -187,7 +187,7 @@ void ContentAppCommandDelegate::FormatResponseData(CommandHandlerInterface::Hand case app::Clusters::ContentLauncher::Id: { Status status; LaunchResponseType launchResponse = FormatContentLauncherResponse(value, status); - if (status != Protocols::InteractionModel::Status::Success) + if (status != chip::Protocols::InteractionModel::Status::Success) { handlerContext.mCommandHandler.AddStatus(handlerContext.mRequestPath, status); } @@ -201,7 +201,7 @@ void ContentAppCommandDelegate::FormatResponseData(CommandHandlerInterface::Hand case app::Clusters::TargetNavigator::Id: { Status status; NavigateTargetResponseType navigateTargetResponse = FormatNavigateTargetResponse(value, status); - if (status != Protocols::InteractionModel::Status::Success) + if (status != chip::Protocols::InteractionModel::Status::Success) { handlerContext.mCommandHandler.AddStatus(handlerContext.mRequestPath, status); } @@ -215,7 +215,7 @@ void ContentAppCommandDelegate::FormatResponseData(CommandHandlerInterface::Hand case app::Clusters::MediaPlayback::Id: { Status status; PlaybackResponseType playbackResponse = FormatMediaPlaybackResponse(value, status); - if (status != Protocols::InteractionModel::Status::Success) + if (status != chip::Protocols::InteractionModel::Status::Success) { handlerContext.mCommandHandler.AddStatus(handlerContext.mRequestPath, status); } @@ -234,7 +234,7 @@ void ContentAppCommandDelegate::FormatResponseData(CommandHandlerInterface::Hand } Status status; GetSetupPINResponseType getSetupPINresponse = FormatGetSetupPINResponse(value, status); - if (status != Protocols::InteractionModel::Status::Success) + if (status != chip::Protocols::InteractionModel::Status::Success) { handlerContext.mCommandHandler.AddStatus(handlerContext.mRequestPath, status); } @@ -251,13 +251,13 @@ void ContentAppCommandDelegate::FormatResponseData(CommandHandlerInterface::Hand LaunchResponseType ContentAppCommandDelegate::FormatContentLauncherResponse(Json::Value value, Status & status) { - status = Protocols::InteractionModel::Status::Success; + status = chip::Protocols::InteractionModel::Status::Success; LaunchResponseType launchResponse; std::string statusFieldId = std::to_string(to_underlying(app::Clusters::ContentLauncher::Commands::LauncherResponse::Fields::kStatus)); if (value[statusFieldId].empty()) { - status = Protocols::InteractionModel::Status::Failure; + status = chip::Protocols::InteractionModel::Status::Failure; return launchResponse; } else @@ -275,13 +275,13 @@ LaunchResponseType ContentAppCommandDelegate::FormatContentLauncherResponse(Json NavigateTargetResponseType ContentAppCommandDelegate::FormatNavigateTargetResponse(Json::Value value, Status & status) { - status = Protocols::InteractionModel::Status::Success; + status = chip::Protocols::InteractionModel::Status::Success; NavigateTargetResponseType navigateTargetResponse; std::string statusFieldId = std::to_string(to_underlying(app::Clusters::TargetNavigator::Commands::NavigateTargetResponse::Fields::kStatus)); if (value[statusFieldId].empty()) { - status = Protocols::InteractionModel::Status::Failure; + status = chip::Protocols::InteractionModel::Status::Failure; return navigateTargetResponse; } else @@ -299,13 +299,13 @@ NavigateTargetResponseType ContentAppCommandDelegate::FormatNavigateTargetRespon PlaybackResponseType ContentAppCommandDelegate::FormatMediaPlaybackResponse(Json::Value value, Status & status) { - status = Protocols::InteractionModel::Status::Success; + status = chip::Protocols::InteractionModel::Status::Success; PlaybackResponseType playbackResponse; std::string statusFieldId = std::to_string(to_underlying(app::Clusters::MediaPlayback::Commands::PlaybackResponse::Fields::kStatus)); if (value[statusFieldId].empty()) { - status = Protocols::InteractionModel::Status::Failure; + status = chip::Protocols::InteractionModel::Status::Failure; return playbackResponse; } else @@ -323,7 +323,7 @@ PlaybackResponseType ContentAppCommandDelegate::FormatMediaPlaybackResponse(Json GetSetupPINResponseType ContentAppCommandDelegate::FormatGetSetupPINResponse(Json::Value value, Status & status) { - status = Protocols::InteractionModel::Status::Success; + status = chip::Protocols::InteractionModel::Status::Success; GetSetupPINResponseType getSetupPINresponse; std::string setupPINFieldId = std::to_string(to_underlying(app::Clusters::AccountLogin::Commands::GetSetupPINResponse::Fields::kSetupPIN)); diff --git a/examples/tv-app/android/java/ContentAppCommandDelegate.h b/examples/tv-app/android/java/ContentAppCommandDelegate.h index a896e55b4ce035..750aff6d34853c 100644 --- a/examples/tv-app/android/java/ContentAppCommandDelegate.h +++ b/examples/tv-app/android/java/ContentAppCommandDelegate.h @@ -34,7 +34,7 @@ namespace chip { namespace AppPlatform { using CommandHandlerInterface = chip::app::CommandHandlerInterface; -using Status = Protocols::InteractionModel::Status; +using Status = chip::Protocols::InteractionModel::Status; using LaunchResponseType = chip::app::Clusters::ContentLauncher::Commands::LauncherResponse::Type; using PlaybackResponseType = chip::app::Clusters::MediaPlayback::Commands::PlaybackResponse::Type; using NavigateTargetResponseType = chip::app::Clusters::TargetNavigator::Commands::NavigateTargetResponse::Type; diff --git a/examples/tv-app/android/java/ContentLauncherManager.cpp b/examples/tv-app/android/java/ContentLauncherManager.cpp index 25e5659b4f6703..caa14b04f9e938 100644 --- a/examples/tv-app/android/java/ContentLauncherManager.cpp +++ b/examples/tv-app/android/java/ContentLauncherManager.cpp @@ -295,7 +295,8 @@ uint16_t ContentLauncherManager::GetClusterRevision(chip::EndpointId endpoint) } uint16_t clusterRevision = 0; - bool success = (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == EMBER_ZCL_STATUS_SUCCESS); + bool success = + (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == chip::Protocols::InteractionModel::Status::Success); if (!success) { ChipLogError(Zcl, "ContentLauncherManager::GetClusterRevision error reading cluster revision"); diff --git a/examples/tv-app/android/java/LevelManager.cpp b/examples/tv-app/android/java/LevelManager.cpp index f8e3dab6aa7773..b79f150c7ae20e 100644 --- a/examples/tv-app/android/java/LevelManager.cpp +++ b/examples/tv-app/android/java/LevelManager.cpp @@ -83,9 +83,9 @@ void LevelManager::PostLevelChanged(chip::EndpointId endpoint, uint8_t value) jboolean LevelManager::SetLevel(jint endpoint, jint value) { - EmberAfStatus status = app::Clusters::LevelControl::Attributes::CurrentLevel::Set(static_cast(endpoint), - static_cast(value)); - return status == EMBER_ZCL_STATUS_SUCCESS; + chip::Protocols::InteractionModel::Status status = app::Clusters::LevelControl::Attributes::CurrentLevel::Set( + static_cast(endpoint), static_cast(value)); + return status == chip::Protocols::InteractionModel::Status::Success; } CHIP_ERROR LevelManager::InitializeWithObjects(jobject managerObject) diff --git a/examples/tv-app/android/java/MediaPlaybackManager.cpp b/examples/tv-app/android/java/MediaPlaybackManager.cpp index 8da71d5a533193..62abeb12ec30eb 100644 --- a/examples/tv-app/android/java/MediaPlaybackManager.cpp +++ b/examples/tv-app/android/java/MediaPlaybackManager.cpp @@ -614,7 +614,8 @@ uint16_t MediaPlaybackManager::GetClusterRevision(chip::EndpointId endpoint) } uint16_t clusterRevision = 0; - bool success = (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == EMBER_ZCL_STATUS_SUCCESS); + bool success = + (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == chip::Protocols::InteractionModel::Status::Success); if (!success) { ChipLogError(Zcl, "MediaPlaybackManager::GetClusterRevision error reading cluster revision"); diff --git a/examples/tv-app/android/java/OnOffManager.cpp b/examples/tv-app/android/java/OnOffManager.cpp index c05c20700eabd0..9a330754aa4a16 100644 --- a/examples/tv-app/android/java/OnOffManager.cpp +++ b/examples/tv-app/android/java/OnOffManager.cpp @@ -84,8 +84,9 @@ void OnOffManager::PostOnOffChanged(chip::EndpointId endpoint, bool value) jboolean OnOffManager::SetOnOff(jint endpoint, bool value) { chip::DeviceLayer::StackLock stack; - EmberAfStatus status = app::Clusters::OnOff::Attributes::OnOff::Set(static_cast(endpoint), value); - return status == EMBER_ZCL_STATUS_SUCCESS; + chip::Protocols::InteractionModel::Status status = + app::Clusters::OnOff::Attributes::OnOff::Set(static_cast(endpoint), value); + return status == chip::Protocols::InteractionModel::Status::Success; } CHIP_ERROR OnOffManager::InitializeWithObjects(jobject managerObject) diff --git a/examples/tv-app/tv-common/clusters/account-login/AccountLoginManager.cpp b/examples/tv-app/tv-common/clusters/account-login/AccountLoginManager.cpp index 532986f7ba4eea..0f3e5b5036e081 100644 --- a/examples/tv-app/tv-common/clusters/account-login/AccountLoginManager.cpp +++ b/examples/tv-app/tv-common/clusters/account-login/AccountLoginManager.cpp @@ -74,7 +74,8 @@ uint16_t AccountLoginManager::GetClusterRevision(chip::EndpointId endpoint) } uint16_t clusterRevision = 0; - bool success = (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == EMBER_ZCL_STATUS_SUCCESS); + bool success = + (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == chip::Protocols::InteractionModel::Status::Success); if (!success) { ChipLogError(Zcl, "AccountLoginManager::GetClusterRevision error reading cluster revision"); diff --git a/examples/tv-app/tv-common/clusters/channel/ChannelManager.cpp b/examples/tv-app/tv-common/clusters/channel/ChannelManager.cpp index 82a278b827cd6a..75bb07b5438dd1 100644 --- a/examples/tv-app/tv-common/clusters/channel/ChannelManager.cpp +++ b/examples/tv-app/tv-common/clusters/channel/ChannelManager.cpp @@ -347,7 +347,8 @@ uint16_t ChannelManager::GetClusterRevision(chip::EndpointId endpoint) } uint16_t clusterRevision = 0; - bool success = (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == EMBER_ZCL_STATUS_SUCCESS); + bool success = + (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == chip::Protocols::InteractionModel::Status::Success); if (!success) { ChipLogError(Zcl, "ChannelManager::GetClusterRevision error reading cluster revision"); diff --git a/examples/tv-app/tv-common/clusters/content-launcher/ContentLauncherManager.cpp b/examples/tv-app/tv-common/clusters/content-launcher/ContentLauncherManager.cpp index 572209a44d11c3..b062c64b95efd6 100644 --- a/examples/tv-app/tv-common/clusters/content-launcher/ContentLauncherManager.cpp +++ b/examples/tv-app/tv-common/clusters/content-launcher/ContentLauncherManager.cpp @@ -214,7 +214,8 @@ uint16_t ContentLauncherManager::GetClusterRevision(chip::EndpointId endpoint) } uint16_t clusterRevision = 0; - bool success = (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == EMBER_ZCL_STATUS_SUCCESS); + bool success = + (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == chip::Protocols::InteractionModel::Status::Success); if (!success) { ChipLogError(Zcl, "ContentLauncherManager::GetClusterRevision error reading cluster revision"); diff --git a/examples/tv-app/tv-common/clusters/media-playback/MediaPlaybackManager.cpp b/examples/tv-app/tv-common/clusters/media-playback/MediaPlaybackManager.cpp index f97a2e98630e01..456aba87b61b3a 100644 --- a/examples/tv-app/tv-common/clusters/media-playback/MediaPlaybackManager.cpp +++ b/examples/tv-app/tv-common/clusters/media-playback/MediaPlaybackManager.cpp @@ -335,7 +335,8 @@ uint16_t MediaPlaybackManager::GetClusterRevision(chip::EndpointId endpoint) } uint16_t clusterRevision = 0; - bool success = (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == EMBER_ZCL_STATUS_SUCCESS); + bool success = + (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == chip::Protocols::InteractionModel::Status::Success); if (!success) { ChipLogError(Zcl, "MediaPlaybackManager::GetClusterRevision error reading cluster revision"); diff --git a/examples/tv-app/tv-common/clusters/target-navigator/TargetNavigatorManager.cpp b/examples/tv-app/tv-common/clusters/target-navigator/TargetNavigatorManager.cpp index 0d3a15578b861d..9b907339df02e4 100644 --- a/examples/tv-app/tv-common/clusters/target-navigator/TargetNavigatorManager.cpp +++ b/examples/tv-app/tv-common/clusters/target-navigator/TargetNavigatorManager.cpp @@ -76,7 +76,8 @@ uint16_t TargetNavigatorManager::GetClusterRevision(chip::EndpointId endpoint) } uint16_t clusterRevision = 0; - bool success = (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == EMBER_ZCL_STATUS_SUCCESS); + bool success = + (Attributes::ClusterRevision::Get(endpoint, &clusterRevision) == chip::Protocols::InteractionModel::Status::Success); if (!success) { ChipLogError(Zcl, "TargetNavigatorManager::GetClusterRevision error reading cluster revision"); diff --git a/examples/tv-app/tv-common/tv-app.matter b/examples/tv-app/tv-common/tv-app.matter index e4099412be31c5..6effacc92c0812 100644 --- a/examples/tv-app/tv-common/tv-app.matter +++ b/examples/tv-app/tv-common/tv-app.matter @@ -2024,7 +2024,7 @@ cluster UserLabel = 65 { } /** This cluster provides an interface for passing messages to be presented by a device. */ -cluster Messages = 151 { +provisional cluster Messages = 151 { revision 3; enum FutureMessagePreferenceEnum : enum8 { @@ -3053,7 +3053,7 @@ cluster AccountLogin = 1294 { } /** This cluster is used for managing the content control (including "parental control") settings on a media device such as a TV, or Set-top Box. */ -cluster ContentControl = 1295 { +provisional cluster ContentControl = 1295 { revision 1; // NOTE: Default/not specifically set bitmap Feature : bitmap32 { @@ -3136,7 +3136,7 @@ cluster ContentControl = 1295 { } /** This cluster provides an interface for sending targeted commands to an Observer of a Content App on a Video Player device such as a Streaming Media Player, Smart TV or Smart Screen. The cluster server for Content App Observer is implemented by an endpoint that communicates with a Content App, such as a Casting Video Client. The cluster client for Content App Observer is implemented by a Content App endpoint. A Content App is informed of the NodeId of an Observer when a binding is set on the Content App. The Content App can then send the ContentAppMessage to the Observer (server cluster), and the Observer responds with a ContentAppMessageResponse. */ -cluster ContentAppObserver = 1296 { +provisional cluster ContentAppObserver = 1296 { revision 1; // NOTE: Default/not specifically set enum StatusEnum : enum8 { diff --git a/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp b/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp index e4bb7647085b40..98f6b197a59e33 100644 --- a/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp +++ b/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp @@ -278,7 +278,7 @@ void CastingServer::ReadServerClustersForNode(NodeId nodeId) " groupId=%d local endpoint=%d remote endpoint=%d cluster=" ChipLogFormatMEI, binding.type, binding.fabricIndex, ChipLogValueX64(binding.nodeId), binding.groupId, binding.local, binding.remote, ChipLogValueMEI(binding.clusterId.ValueOr(0))); - if (binding.type == EMBER_UNICAST_BINDING && nodeId == binding.nodeId) + if (binding.type == MATTER_UNICAST_BINDING && nodeId == binding.nodeId) { if (!mActiveTargetVideoPlayerInfo.HasEndpoint(binding.remote)) { @@ -550,7 +550,7 @@ void CastingServer::DeviceEventCallback(const DeviceLayer::ChipDeviceEvent * eve " groupId=%d local endpoint=%d remote endpoint=%d cluster=" ChipLogFormatMEI, binding.type, binding.fabricIndex, ChipLogValueX64(binding.nodeId), binding.groupId, binding.local, binding.remote, ChipLogValueMEI(binding.clusterId.ValueOr(0))); - if (binding.type == EMBER_UNICAST_BINDING && event->BindingsChanged.fabricIndex == binding.fabricIndex) + if (binding.type == MATTER_UNICAST_BINDING && event->BindingsChanged.fabricIndex == binding.fabricIndex) { ChipLogProgress( NotSpecified, @@ -641,7 +641,7 @@ NodeId CastingServer::GetVideoPlayerNodeForFabricIndex(FabricIndex fabricIndex) " groupId=%d local endpoint=%d remote endpoint=%d cluster=" ChipLogFormatMEI, binding.type, binding.fabricIndex, ChipLogValueX64(binding.nodeId), binding.groupId, binding.local, binding.remote, ChipLogValueMEI(binding.clusterId.ValueOr(0))); - if (binding.type == EMBER_UNICAST_BINDING && fabricIndex == binding.fabricIndex) + if (binding.type == MATTER_UNICAST_BINDING && fabricIndex == binding.fabricIndex) { ChipLogProgress(NotSpecified, "GetVideoPlayerNodeForFabricIndex nodeId=0x" ChipLogFormatX64, ChipLogValueX64(binding.nodeId)); @@ -667,7 +667,7 @@ FabricIndex CastingServer::GetVideoPlayerFabricIndexForNode(NodeId nodeId) " groupId=%d local endpoint=%d remote endpoint=%d cluster=" ChipLogFormatMEI, binding.type, binding.fabricIndex, ChipLogValueX64(binding.nodeId), binding.groupId, binding.local, binding.remote, ChipLogValueMEI(binding.clusterId.ValueOr(0))); - if (binding.type == EMBER_UNICAST_BINDING && nodeId == binding.nodeId) + if (binding.type == MATTER_UNICAST_BINDING && nodeId == binding.nodeId) { ChipLogProgress(NotSpecified, "GetVideoPlayerFabricIndexForNode fabricIndex=%d nodeId=0x" ChipLogFormatX64, binding.fabricIndex, ChipLogValueX64(binding.nodeId)); diff --git a/examples/tv-casting-app/tv-casting-common/support/ChipDeviceEventHandler.cpp b/examples/tv-casting-app/tv-casting-common/support/ChipDeviceEventHandler.cpp index bced79be4bc102..20558982ea78ca 100644 --- a/examples/tv-casting-app/tv-casting-common/support/ChipDeviceEventHandler.cpp +++ b/examples/tv-casting-app/tv-casting-common/support/ChipDeviceEventHandler.cpp @@ -156,7 +156,7 @@ void ChipDeviceEventHandler::HandleBindingsChangedViaCluster(const chip::DeviceL " groupId=%d local endpoint=%d remote endpoint=%d cluster=" ChipLogFormatMEI, binding.type, binding.fabricIndex, ChipLogValueX64(binding.nodeId), binding.groupId, binding.local, binding.remote, ChipLogValueMEI(binding.clusterId.ValueOr(0))); - if (binding.type == EMBER_UNICAST_BINDING && event->BindingsChanged.fabricIndex == binding.fabricIndex) + if (binding.type == MATTER_UNICAST_BINDING && event->BindingsChanged.fabricIndex == binding.fabricIndex) { ChipLogProgress(AppServer, "ChipDeviceEventHandler::HandleBindingsChangedViaCluster Matched accessingFabricIndex with " diff --git a/examples/tv-casting-app/tv-casting-common/support/EndpointListLoader.cpp b/examples/tv-casting-app/tv-casting-common/support/EndpointListLoader.cpp index 478847d15a2eca..60d589c1fc640b 100644 --- a/examples/tv-casting-app/tv-casting-common/support/EndpointListLoader.cpp +++ b/examples/tv-casting-app/tv-casting-common/support/EndpointListLoader.cpp @@ -53,7 +53,7 @@ void EndpointListLoader::Initialize(chip::Messaging::ExchangeManager * exchangeM for (const auto & binding : chip::BindingTable::GetInstance()) { - if (binding.type == EMBER_UNICAST_BINDING && CastingPlayer::GetTargetCastingPlayer()->GetNodeId() == binding.nodeId) + if (binding.type == MATTER_UNICAST_BINDING && CastingPlayer::GetTargetCastingPlayer()->GetNodeId() == binding.nodeId) { // check to see if we discovered a new endpoint in the bindings chip::EndpointId endpointId = binding.remote; @@ -86,7 +86,7 @@ CHIP_ERROR EndpointListLoader::Load() " groupId=%d local endpoint=%d remote endpoint=%d cluster=" ChipLogFormatMEI, binding.type, binding.fabricIndex, ChipLogValueX64(binding.nodeId), binding.groupId, binding.local, binding.remote, ChipLogValueMEI(binding.clusterId.ValueOr(0))); - if (binding.type == EMBER_UNICAST_BINDING && CastingPlayer::GetTargetCastingPlayer()->GetNodeId() == binding.nodeId) + if (binding.type == MATTER_UNICAST_BINDING && CastingPlayer::GetTargetCastingPlayer()->GetNodeId() == binding.nodeId) { // if we discovered a new Endpoint from the bindings, read its EndpointAttributes chip::EndpointId endpointId = binding.remote; diff --git a/examples/tv-casting-app/tv-casting-common/tv-casting-app.matter b/examples/tv-casting-app/tv-casting-common/tv-casting-app.matter index 7eee24e57ce285..4bece078774075 100644 --- a/examples/tv-casting-app/tv-casting-common/tv-casting-app.matter +++ b/examples/tv-casting-app/tv-casting-common/tv-casting-app.matter @@ -1502,7 +1502,7 @@ cluster FixedLabel = 64 { } /** This cluster provides an interface for passing messages to be presented by a device. */ -cluster Messages = 151 { +provisional cluster Messages = 151 { revision 3; enum FutureMessagePreferenceEnum : enum8 { @@ -2515,7 +2515,7 @@ cluster AccountLogin = 1294 { } /** This cluster is used for managing the content control (including "parental control") settings on a media device such as a TV, or Set-top Box. */ -cluster ContentControl = 1295 { +provisional cluster ContentControl = 1295 { revision 1; // NOTE: Default/not specifically set bitmap Feature : bitmap32 { @@ -2598,7 +2598,7 @@ cluster ContentControl = 1295 { } /** This cluster provides an interface for sending targeted commands to an Observer of a Content App on a Video Player device such as a Streaming Media Player, Smart TV or Smart Screen. The cluster server for Content App Observer is implemented by an endpoint that communicates with a Content App, such as a Casting Video Client. The cluster client for Content App Observer is implemented by a Content App endpoint. A Content App is informed of the NodeId of an Observer when a binding is set on the Content App. The Content App can then send the ContentAppMessage to the Observer (server cluster), and the Observer responds with a ContentAppMessageResponse. */ -cluster ContentAppObserver = 1296 { +provisional cluster ContentAppObserver = 1296 { revision 1; // NOTE: Default/not specifically set enum StatusEnum : enum8 { diff --git a/examples/virtual-device-app/android/java/DoorLockManager.cpp b/examples/virtual-device-app/android/java/DoorLockManager.cpp index 5e85ffc817b4c9..b3e245ea75dac2 100644 --- a/examples/virtual-device-app/android/java/DoorLockManager.cpp +++ b/examples/virtual-device-app/android/java/DoorLockManager.cpp @@ -49,10 +49,11 @@ void emberAfDoorLockClusterInitCallback(EndpointId endpoint) ChipLogProgress(Zcl, "Device App::DoorLock::PostClusterInit"); DeviceAppJNIMgr().PostClusterInit(chip::app::Clusters::DoorLock::Id, endpoint); DoorLockServer::Instance().InitServer(endpoint); - EmberAfStatus status = DoorLock::Attributes::FeatureMap::Set(endpoint, 0); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Protocols::InteractionModel::Status status = DoorLock::Attributes::FeatureMap::Set(endpoint, 0); + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogProgress(Zcl, "Device App::DoorLock::emberAfDoorLockClusterInitCallback()::Updating feature map %x", status); + ChipLogProgress(Zcl, "Device App::DoorLock::emberAfDoorLockClusterInitCallback()::Updating feature map %x", + to_underlying(status)); } } @@ -104,9 +105,9 @@ DoorLockManager * GetDoorLockManager(EndpointId endpoint) jboolean DoorLockManager::SetLockType(jint endpoint, jint value) { - EmberAfStatus status = app::Clusters::DoorLock::Attributes::LockType::Set( + Protocols::InteractionModel::Status status = app::Clusters::DoorLock::Attributes::LockType::Set( static_cast(endpoint), static_cast(value)); - return status == EMBER_ZCL_STATUS_SUCCESS; + return status == Protocols::InteractionModel::Status::Success; } jboolean DoorLockManager::SetLockState(jint endpoint, jint value) @@ -127,16 +128,16 @@ jboolean DoorLockManager::SetAutoRelockTime(jint endpoint, jint value) jboolean DoorLockManager::SetOperatingMode(jint endpoint, jint value) { - EmberAfStatus status = app::Clusters::DoorLock::Attributes::OperatingMode::Set( + Protocols::InteractionModel::Status status = app::Clusters::DoorLock::Attributes::OperatingMode::Set( static_cast(endpoint), static_cast(value)); - return status == EMBER_ZCL_STATUS_SUCCESS; + return status == Protocols::InteractionModel::Status::Success; } jboolean DoorLockManager::SetSupportedOperatingModes(jint endpoint, jint value) { - EmberAfStatus status = app::Clusters::DoorLock::Attributes::SupportedOperatingModes::Set( + Protocols::InteractionModel::Status status = app::Clusters::DoorLock::Attributes::SupportedOperatingModes::Set( static_cast(endpoint), static_cast(value)); - return status == EMBER_ZCL_STATUS_SUCCESS; + return status == Protocols::InteractionModel::Status::Success; } jboolean DoorLockManager::SendLockAlarmEvent(jint endpoint) diff --git a/examples/virtual-device-app/android/java/OnOffManager.cpp b/examples/virtual-device-app/android/java/OnOffManager.cpp index 2dcede64a8bce5..c058e99a91c111 100644 --- a/examples/virtual-device-app/android/java/OnOffManager.cpp +++ b/examples/virtual-device-app/android/java/OnOffManager.cpp @@ -82,8 +82,9 @@ void OnOffManager::PostOnOffChanged(chip::EndpointId endpoint, bool value) jboolean OnOffManager::SetOnOff(jint endpoint, bool value) { - EmberAfStatus status = app::Clusters::OnOff::Attributes::OnOff::Set(static_cast(endpoint), value); - return status == EMBER_ZCL_STATUS_SUCCESS; + Protocols::InteractionModel::Status status = + app::Clusters::OnOff::Attributes::OnOff::Set(static_cast(endpoint), value); + return status == Protocols::InteractionModel::Status::Success; } CHIP_ERROR OnOffManager::InitializeWithObjects(jobject managerObject) diff --git a/examples/virtual-device-app/android/java/PowerSourceManager.cpp b/examples/virtual-device-app/android/java/PowerSourceManager.cpp index afbdcca23bacb7..e71a5bb1eec692 100644 --- a/examples/virtual-device-app/android/java/PowerSourceManager.cpp +++ b/examples/virtual-device-app/android/java/PowerSourceManager.cpp @@ -83,13 +83,13 @@ jboolean PowerSourceManager::SetBatPercentRemaining(jint endpoint, jint value) { using namespace chip::app::Clusters; using namespace chip::DeviceLayer; - EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; + Protocols::InteractionModel::Status status = Protocols::InteractionModel::Status::Success; status = PowerSource::Attributes::BatPercentRemaining::Set(static_cast(endpoint), static_cast(value * 2)); ChipLogDetail(Zcl, "Device App::PowerSource::SetBatPercentRemaining: endpoint:%d, percent:%d", endpoint, value); - return status == EMBER_ZCL_STATUS_SUCCESS; + return status == Protocols::InteractionModel::Status::Success; } CHIP_ERROR PowerSourceManager::InitializeWithObjects(jobject managerObject) diff --git a/examples/window-app/common/src/WindowApp.cpp b/examples/window-app/common/src/WindowApp.cpp index 11d49b7e34ed20..aa0e2654a5e4d3 100644 --- a/examples/window-app/common/src/WindowApp.cpp +++ b/examples/window-app/common/src/WindowApp.cpp @@ -455,7 +455,7 @@ void WindowApp::Cover::Finish() void WindowApp::Cover::LiftStepToward(OperationalState direction) { - EmberAfStatus status; + Protocols::InteractionModel::Status status; chip::Percent100ths percent100ths; NPercent100ths current; @@ -463,7 +463,7 @@ void WindowApp::Cover::LiftStepToward(OperationalState direction) status = Attributes::CurrentPositionLiftPercent100ths::Get(mEndpoint, current); chip::DeviceLayer::PlatformMgr().UnlockChipStack(); - if ((status == EMBER_ZCL_STATUS_SUCCESS) && !current.IsNull()) + if ((status == Protocols::InteractionModel::Status::Success) && !current.IsNull()) { percent100ths = ComputePercent100thsStep(direction, current.Value(), LIFT_DELTA); } @@ -519,7 +519,7 @@ void WindowApp::Cover::LiftUpdate(bool newTarget) void WindowApp::Cover::TiltStepToward(OperationalState direction) { - EmberAfStatus status; + Protocols::InteractionModel::Status status; chip::Percent100ths percent100ths; NPercent100ths current; @@ -527,7 +527,7 @@ void WindowApp::Cover::TiltStepToward(OperationalState direction) status = Attributes::CurrentPositionTiltPercent100ths::Get(mEndpoint, current); chip::DeviceLayer::PlatformMgr().UnlockChipStack(); - if ((status == EMBER_ZCL_STATUS_SUCCESS) && !current.IsNull()) + if ((status == Protocols::InteractionModel::Status::Success) && !current.IsNull()) { percent100ths = ComputePercent100thsStep(direction, current.Value(), TILT_DELTA); } @@ -595,7 +595,7 @@ void WindowApp::Cover::StepToward(OperationalState direction, bool isTilt) void WindowApp::Cover::UpdateTargetPosition(OperationalState direction, bool isTilt) { - EmberAfStatus status; + Protocols::InteractionModel::Status status; NPercent100ths current; chip::Percent100ths target; @@ -604,7 +604,7 @@ void WindowApp::Cover::UpdateTargetPosition(OperationalState direction, bool isT if (isTilt) { status = Attributes::CurrentPositionTiltPercent100ths::Get(mEndpoint, current); - if ((status == EMBER_ZCL_STATUS_SUCCESS) && !current.IsNull()) + if ((status == Protocols::InteractionModel::Status::Success) && !current.IsNull()) { target = ComputePercent100thsStep(direction, current.Value(), TILT_DELTA); @@ -614,7 +614,7 @@ void WindowApp::Cover::UpdateTargetPosition(OperationalState direction, bool isT else { status = Attributes::CurrentPositionLiftPercent100ths::Get(mEndpoint, current); - if ((status == EMBER_ZCL_STATUS_SUCCESS) && !current.IsNull()) + if ((status == Protocols::InteractionModel::Status::Success) && !current.IsNull()) { target = ComputePercent100thsStep(direction, current.Value(), LIFT_DELTA); diff --git a/examples/window-app/nrfconnect/main/WindowCovering.cpp b/examples/window-app/nrfconnect/main/WindowCovering.cpp index f2d078838a427b..4d200ffa3c919e 100644 --- a/examples/window-app/nrfconnect/main/WindowCovering.cpp +++ b/examples/window-app/nrfconnect/main/WindowCovering.cpp @@ -59,8 +59,10 @@ void WindowCovering::DriveCurrentLiftPosition(intptr_t) NPercent100ths target{}; NPercent100ths positionToSet{}; - VerifyOrReturn(Attributes::CurrentPositionLiftPercent100ths::Get(Endpoint(), current) == EMBER_ZCL_STATUS_SUCCESS); - VerifyOrReturn(Attributes::TargetPositionLiftPercent100ths::Get(Endpoint(), target) == EMBER_ZCL_STATUS_SUCCESS); + VerifyOrReturn(Attributes::CurrentPositionLiftPercent100ths::Get(Endpoint(), current) == + Protocols::InteractionModel::Status::Success); + VerifyOrReturn(Attributes::TargetPositionLiftPercent100ths::Get(Endpoint(), target) == + Protocols::InteractionModel::Status::Success); OperationalState state = ComputeOperationalState(target, current); UpdateOperationalStatus(MoveType::LIFT, state); @@ -85,7 +87,8 @@ void WindowCovering::DriveCurrentLiftPosition(intptr_t) // assume single move completed Instance().mInLiftMove = false; - VerifyOrReturn(Attributes::CurrentPositionLiftPercent100ths::Get(Endpoint(), current) == EMBER_ZCL_STATUS_SUCCESS); + VerifyOrReturn(Attributes::CurrentPositionLiftPercent100ths::Get(Endpoint(), current) == + Protocols::InteractionModel::Status::Success); if (!TargetCompleted(MoveType::LIFT, current, target)) { @@ -101,7 +104,7 @@ void WindowCovering::DriveCurrentLiftPosition(intptr_t) chip::Percent100ths WindowCovering::CalculateNextPosition(MoveType aMoveType) { - EmberAfStatus status{}; + Protocols::InteractionModel::Status status{}; chip::Percent100ths percent100ths{}; NPercent100ths current{}; OperationalState opState{}; @@ -117,7 +120,7 @@ chip::Percent100ths WindowCovering::CalculateNextPosition(MoveType aMoveType) opState = OperationalStateGet(Endpoint(), OperationalStatus::kTilt); } - if ((status == EMBER_ZCL_STATUS_SUCCESS) && !current.IsNull()) + if ((status == Protocols::InteractionModel::Status::Success) && !current.IsNull()) { static constexpr auto sPercentDelta{ WC_PERCENT100THS_MAX_CLOSED / 20 }; percent100ths = ComputePercent100thsStep(opState, current.Value(), sPercentDelta); @@ -168,8 +171,10 @@ void WindowCovering::DriveCurrentTiltPosition(intptr_t) NPercent100ths target{}; NPercent100ths positionToSet{}; - VerifyOrReturn(Attributes::CurrentPositionTiltPercent100ths::Get(Endpoint(), current) == EMBER_ZCL_STATUS_SUCCESS); - VerifyOrReturn(Attributes::TargetPositionTiltPercent100ths::Get(Endpoint(), target) == EMBER_ZCL_STATUS_SUCCESS); + VerifyOrReturn(Attributes::CurrentPositionTiltPercent100ths::Get(Endpoint(), current) == + Protocols::InteractionModel::Status::Success); + VerifyOrReturn(Attributes::TargetPositionTiltPercent100ths::Get(Endpoint(), target) == + Protocols::InteractionModel::Status::Success); OperationalState state = ComputeOperationalState(target, current); UpdateOperationalStatus(MoveType::TILT, state); @@ -194,7 +199,8 @@ void WindowCovering::DriveCurrentTiltPosition(intptr_t) // assume single move completed Instance().mInTiltMove = false; - VerifyOrReturn(Attributes::CurrentPositionTiltPercent100ths::Get(Endpoint(), current) == EMBER_ZCL_STATUS_SUCCESS); + VerifyOrReturn(Attributes::CurrentPositionTiltPercent100ths::Get(Endpoint(), current) == + Protocols::InteractionModel::Status::Success); if (!TargetCompleted(MoveType::TILT, current, target)) { @@ -256,7 +262,7 @@ void WindowCovering::UpdateOperationalStatus(MoveType aMoveType, OperationalStat void WindowCovering::SetTargetPosition(OperationalState aDirection, chip::Percent100ths aPosition) { - EmberAfStatus status{}; + Protocols::InteractionModel::Status status{}; if (Instance().mCurrentUIMoveType == MoveType::LIFT) { status = Attributes::TargetPositionLiftPercent100ths::Set(Endpoint(), aPosition); @@ -266,7 +272,7 @@ void WindowCovering::SetTargetPosition(OperationalState aDirection, chip::Percen status = Attributes::TargetPositionTiltPercent100ths::Set(Endpoint(), aPosition); } - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Protocols::InteractionModel::Status::Success) { LOG_ERR("Cannot set the target position. Error: %d", static_cast(status)); } @@ -274,13 +280,13 @@ void WindowCovering::SetTargetPosition(OperationalState aDirection, chip::Percen void WindowCovering::PositionLEDUpdate(MoveType aMoveType) { - EmberAfStatus status{}; + Protocols::InteractionModel::Status status{}; NPercent100ths currentPosition{}; if (aMoveType == MoveType::LIFT) { status = Attributes::CurrentPositionLiftPercent100ths::Get(Endpoint(), currentPosition); - if (EMBER_ZCL_STATUS_SUCCESS == status && !currentPosition.IsNull()) + if (Protocols::InteractionModel::Status::Success == status && !currentPosition.IsNull()) { Instance().SetBrightness(MoveType::LIFT, currentPosition.Value()); } @@ -288,7 +294,7 @@ void WindowCovering::PositionLEDUpdate(MoveType aMoveType) else if (aMoveType == MoveType::TILT) { status = Attributes::CurrentPositionTiltPercent100ths::Get(Endpoint(), currentPosition); - if (EMBER_ZCL_STATUS_SUCCESS == status && !currentPosition.IsNull()) + if (Protocols::InteractionModel::Status::Success == status && !currentPosition.IsNull()) { Instance().SetBrightness(MoveType::TILT, currentPosition.Value()); } @@ -343,4 +349,6 @@ void WindowCovering::DoPostAttributeChange(intptr_t aArg) VerifyOrReturn(data != nullptr); PostAttributeChange(data->mEndpoint, data->mAttributeId); + + chip::Platform::Delete(data); } diff --git a/examples/window-app/nrfconnect/main/ZclCallbacks.cpp b/examples/window-app/nrfconnect/main/ZclCallbacks.cpp index 63b9b10d32b852..12e95a7f566788 100644 --- a/examples/window-app/nrfconnect/main/ZclCallbacks.cpp +++ b/examples/window-app/nrfconnect/main/ZclCallbacks.cpp @@ -82,17 +82,17 @@ void MatterWindowCoveringClusterServerAttributeChangedCallback(const app::Concre void emberAfWindowCoveringClusterInitCallback(chip::EndpointId endpoint) { - const auto logOnFailure = [](EmberAfStatus status, const char * attributeName) { - if (status != EMBER_ZCL_STATUS_SUCCESS) + const auto logOnFailure = [](Protocols::InteractionModel::Status status, const char * attributeName) { + if (status != Protocols::InteractionModel::Status::Success) { - ChipLogError(Zcl, "Failed to set WindowCovering %s: %x", attributeName, status); + ChipLogError(Zcl, "Failed to set WindowCovering %s: %x", attributeName, to_underlying(status)); } }; app::DataModel::Nullable currentPercent100ths; app::DataModel::Nullable targetPercent100ths; app::DataModel::Nullable currentPercentage; - EmberAfStatus status; + Protocols::InteractionModel::Status status; status = Attributes::CurrentPositionLiftPercentage::Get(endpoint, currentPercentage); if (currentPercentage.IsNull()) diff --git a/examples/window-app/silabs/openthread.gni b/examples/window-app/silabs/openthread.gni index cdd7f8c0f1f42e..d3d50ab878b211 100644 --- a/examples/window-app/silabs/openthread.gni +++ b/examples/window-app/silabs/openthread.gni @@ -36,6 +36,6 @@ sl_ot_idle_interval_ms = 1000 # 1s Idle Intervals sl_ot_active_interval_ms = 500 # 500ms Active Intervals # ICD Matter Configuration flags -sl_idle_mode_interval_s = 600 # 10min Idle Mode Interval -sl_active_mode_interval_ms = 0 # 0s Active Mode Interval +sl_idle_mode_duration_s = 600 # 10min Idle Mode Duration +sl_active_mode_duration_ms = 0 # 0s Active Mode Duration sl_active_mode_threshold_ms = 0 # 1s Active Mode Threshold diff --git a/examples/window-app/silabs/src/WindowManager.cpp b/examples/window-app/silabs/src/WindowManager.cpp index 309fb393565990..58716b82af4a52 100644 --- a/examples/window-app/silabs/src/WindowManager.cpp +++ b/examples/window-app/silabs/src/WindowManager.cpp @@ -275,7 +275,7 @@ void WindowManager::Cover::Init(chip::EndpointId endpoint) void WindowManager::Cover::LiftStepToward(OperationalState direction) { - EmberAfStatus status; + Protocols::InteractionModel::Status status; chip::Percent100ths percent100ths; NPercent100ths current; @@ -283,7 +283,7 @@ void WindowManager::Cover::LiftStepToward(OperationalState direction) status = Attributes::CurrentPositionLiftPercent100ths::Get(mEndpoint, current); chip::DeviceLayer::PlatformMgr().UnlockChipStack(); - if ((status == EMBER_ZCL_STATUS_SUCCESS) && !current.IsNull()) + if ((status == Protocols::InteractionModel::Status::Success) && !current.IsNull()) { percent100ths = ComputePercent100thsStep(direction, current.Value(), LIFT_DELTA); } @@ -339,7 +339,7 @@ void WindowManager::Cover::LiftUpdate(bool newTarget) void WindowManager::Cover::TiltStepToward(OperationalState direction) { - EmberAfStatus status; + Protocols::InteractionModel::Status status; chip::Percent100ths percent100ths; NPercent100ths current; @@ -347,7 +347,7 @@ void WindowManager::Cover::TiltStepToward(OperationalState direction) status = Attributes::CurrentPositionTiltPercent100ths::Get(mEndpoint, current); chip::DeviceLayer::PlatformMgr().UnlockChipStack(); - if ((status == EMBER_ZCL_STATUS_SUCCESS) && !current.IsNull()) + if ((status == Protocols::InteractionModel::Status::Success) && !current.IsNull()) { percent100ths = ComputePercent100thsStep(direction, current.Value(), TILT_DELTA); } @@ -403,7 +403,7 @@ void WindowManager::Cover::TiltUpdate(bool newTarget) void WindowManager::Cover::UpdateTargetPosition(OperationalState direction, bool isTilt) { - EmberAfStatus status; + Protocols::InteractionModel::Status status; NPercent100ths current; chip::Percent100ths target; @@ -412,7 +412,7 @@ void WindowManager::Cover::UpdateTargetPosition(OperationalState direction, bool if (isTilt) { status = Attributes::CurrentPositionTiltPercent100ths::Get(mEndpoint, current); - if ((status == EMBER_ZCL_STATUS_SUCCESS) && !current.IsNull()) + if ((status == Protocols::InteractionModel::Status::Success) && !current.IsNull()) { target = ComputePercent100thsStep(direction, current.Value(), TILT_DELTA); (void) Attributes::TargetPositionTiltPercent100ths::Set(mEndpoint, target); @@ -421,7 +421,7 @@ void WindowManager::Cover::UpdateTargetPosition(OperationalState direction, bool else { status = Attributes::CurrentPositionLiftPercent100ths::Get(mEndpoint, current); - if ((status == EMBER_ZCL_STATUS_SUCCESS) && !current.IsNull()) + if ((status == Protocols::InteractionModel::Status::Success) && !current.IsNull()) { target = ComputePercent100thsStep(direction, current.Value(), LIFT_DELTA); (void) Attributes::TargetPositionLiftPercent100ths::Set(mEndpoint, target); diff --git a/examples/window-app/telink/src/WindowCovering.cpp b/examples/window-app/telink/src/WindowCovering.cpp index a8cae9d37e597b..5c1b8d10559c33 100644 --- a/examples/window-app/telink/src/WindowCovering.cpp +++ b/examples/window-app/telink/src/WindowCovering.cpp @@ -59,8 +59,10 @@ void WindowCovering::DriveCurrentLiftPosition(intptr_t) NPercent100ths target{}; NPercent100ths positionToSet{}; - VerifyOrReturn(Attributes::CurrentPositionLiftPercent100ths::Get(Endpoint(), current) == EMBER_ZCL_STATUS_SUCCESS); - VerifyOrReturn(Attributes::TargetPositionLiftPercent100ths::Get(Endpoint(), target) == EMBER_ZCL_STATUS_SUCCESS); + VerifyOrReturn(Attributes::CurrentPositionLiftPercent100ths::Get(Endpoint(), current) == + chip::Protocols::InteractionModel::Status::Success); + VerifyOrReturn(Attributes::TargetPositionLiftPercent100ths::Get(Endpoint(), target) == + chip::Protocols::InteractionModel::Status::Success); UpdateOperationalStatus(WindowCoveringType::Lift, ComputeOperationalState(target, current)); @@ -70,7 +72,8 @@ void WindowCovering::DriveCurrentLiftPosition(intptr_t) // assume single move completed Instance().mInLiftMove = false; - VerifyOrReturn(Attributes::CurrentPositionLiftPercent100ths::Get(Endpoint(), current) == EMBER_ZCL_STATUS_SUCCESS); + VerifyOrReturn(Attributes::CurrentPositionLiftPercent100ths::Get(Endpoint(), current) == + chip::Protocols::InteractionModel::Status::Success); if (!TargetCompleted(WindowCoveringType::Lift, current, target)) { @@ -86,7 +89,7 @@ void WindowCovering::DriveCurrentLiftPosition(intptr_t) chip::Percent100ths WindowCovering::CalculateSingleStep(WindowCoveringType aMoveType) { - EmberAfStatus status{}; + chip::Protocols::InteractionModel::Status status{}; chip::Percent100ths percent100ths{}; NPercent100ths current{}; OperationalState opState = OperationalState::Stall; @@ -102,7 +105,7 @@ chip::Percent100ths WindowCovering::CalculateSingleStep(WindowCoveringType aMove opState = OperationalStateGet(Endpoint(), OperationalStatus::kTilt); } - if ((status == EMBER_ZCL_STATUS_SUCCESS) && !current.IsNull()) + if ((status == chip::Protocols::InteractionModel::Status::Success) && !current.IsNull()) { percent100ths = ComputePercent100thsStep(opState, current.Value(), sPercentDelta); } @@ -152,8 +155,10 @@ void WindowCovering::DriveCurrentTiltPosition(intptr_t) NPercent100ths target{}; NPercent100ths positionToSet{}; - VerifyOrReturn(Attributes::CurrentPositionTiltPercent100ths::Get(Endpoint(), current) == EMBER_ZCL_STATUS_SUCCESS); - VerifyOrReturn(Attributes::TargetPositionTiltPercent100ths::Get(Endpoint(), target) == EMBER_ZCL_STATUS_SUCCESS); + VerifyOrReturn(Attributes::CurrentPositionTiltPercent100ths::Get(Endpoint(), current) == + chip::Protocols::InteractionModel::Status::Success); + VerifyOrReturn(Attributes::TargetPositionTiltPercent100ths::Get(Endpoint(), target) == + chip::Protocols::InteractionModel::Status::Success); UpdateOperationalStatus(WindowCoveringType::Lift, ComputeOperationalState(target, current)); @@ -163,7 +168,8 @@ void WindowCovering::DriveCurrentTiltPosition(intptr_t) // assume single move completed Instance().mInTiltMove = false; - VerifyOrReturn(Attributes::CurrentPositionTiltPercent100ths::Get(Endpoint(), current) == EMBER_ZCL_STATUS_SUCCESS); + VerifyOrReturn(Attributes::CurrentPositionTiltPercent100ths::Get(Endpoint(), current) == + chip::Protocols::InteractionModel::Status::Success); if (!TargetCompleted(WindowCoveringType::Tilt, current, target)) { @@ -225,7 +231,7 @@ void WindowCovering::UpdateOperationalStatus(WindowCoveringType aMoveType, Opera void WindowCovering::SetTargetPosition(OperationalState aDirection, chip::Percent100ths aPosition) { - EmberAfStatus status{}; + chip::Protocols::InteractionModel::Status status{}; if (Instance().mCurrentUIMoveType == WindowCoveringType::Lift) { status = Attributes::TargetPositionLiftPercent100ths::Set(Endpoint(), aPosition); @@ -235,7 +241,7 @@ void WindowCovering::SetTargetPosition(OperationalState aDirection, chip::Percen status = Attributes::TargetPositionTiltPercent100ths::Set(Endpoint(), aPosition); } - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != chip::Protocols::InteractionModel::Status::Success) { LOG_ERR("Cannot set the target position. Error: %d", static_cast(status)); } @@ -243,13 +249,13 @@ void WindowCovering::SetTargetPosition(OperationalState aDirection, chip::Percen void WindowCovering::PositionLEDUpdate(WindowCoveringType aMoveType) { - EmberAfStatus status{}; + chip::Protocols::InteractionModel::Status status{}; NPercent100ths currentPosition{}; if (aMoveType == WindowCoveringType::Lift) { status = Attributes::CurrentPositionLiftPercent100ths::Get(Endpoint(), currentPosition); - if (EMBER_ZCL_STATUS_SUCCESS == status && !currentPosition.IsNull()) + if (chip::Protocols::InteractionModel::Status::Success == status && !currentPosition.IsNull()) { Instance().SetBrightness(WindowCoveringType::Lift, currentPosition.Value()); } @@ -257,7 +263,7 @@ void WindowCovering::PositionLEDUpdate(WindowCoveringType aMoveType) else if (aMoveType == WindowCoveringType::Tilt) { status = Attributes::CurrentPositionTiltPercent100ths::Get(Endpoint(), currentPosition); - if (EMBER_ZCL_STATUS_SUCCESS == status && !currentPosition.IsNull()) + if (chip::Protocols::InteractionModel::Status::Success == status && !currentPosition.IsNull()) { Instance().SetBrightness(WindowCoveringType::Tilt, currentPosition.Value()); } diff --git a/iwyu.imp b/iwyu.imp new file mode 100644 index 00000000000000..b7572ff9f5a394 --- /dev/null +++ b/iwyu.imp @@ -0,0 +1,22 @@ +# General IWYU command example: +# +# iwyu_tool.py \ +# -p out/linux-x64-all-clusters-clang/compile_commands.json \ +# src/lib/core/ \ +# -- \ +# -Xiwyu --mapping_file=$(pwd)/iwyu.imp \ +# -Xiwyu --no_comments \ +# -Xiwyu --comment_style=none \ +# -Xiwyu --cxx17ns \ +# -Xiwyu no_fwd_decls \ +# | tee out/iwyu.out +# +# cd out/linux-x64-all-clusters-clang +# +# fix_includes.py <../iwyu.out +# +[ + { include: [ '"system/SystemBuildConfig.h"', private, '', public ] }, + { include: [ '"core/CHIPBuildConfig.h"', private, '', public ] }, + { include: [ '@"platform/.*/CHIPPlatformConfig.h"', private, '', public ] }, +] diff --git a/scripts/build/builders/host.py b/scripts/build/builders/host.py index e11d5c2d43779a..7b7a02d421f097 100644 --- a/scripts/build/builders/host.py +++ b/scripts/build/builders/host.py @@ -228,8 +228,8 @@ def OutputNames(self): yield 'dishwasher-app' yield 'dishwasher-app.map' elif self == HostApp.MICROWAVE_OVEN: - yield 'microwave-oven-app' - yield 'microwave-oven-app.map' + yield 'chip-microwave-oven-app' + yield 'chip-microwave-oven-app.map' elif self == HostApp.REFRIGERATOR: yield 'refrigerator-app' yield 'refrigerator-app.map' diff --git a/scripts/build/gn_gen_cirque.sh b/scripts/build/gn_gen_cirque.sh index d6f6bd86905a0e..a0713f571189ab 100755 --- a/scripts/build/gn_gen_cirque.sh +++ b/scripts/build/gn_gen_cirque.sh @@ -36,7 +36,7 @@ echo "Setup build environment" source "./scripts/activate.sh" echo "Build: GN configure" -gn --root="$CHIP_ROOT" gen --check --fail-on-unused-args out/debug --args='target_os="all"'"chip_build_tests=false chip_enable_wifi=false chip_im_force_fabric_quota_check=true enable_default_builds=false enable_host_gcc_build=true enable_standalone_chip_tool_build=true enable_linux_all_clusters_app_build=true enable_linux_lighting_app_build=true enable_linux_lit_icd_app_build=true" +gn --root="$CHIP_ROOT" gen --check --fail-on-unused-args out/debug --args='target_os="all"'"chip_build_tests=false chip_enable_wifi=false chip_im_force_fabric_quota_check=true enable_default_builds=false enable_host_gcc_build=true enable_standalone_chip_tool_build=true enable_linux_all_clusters_app_build=true enable_linux_lighting_app_build=true enable_microwave_oven_app_build=true enable_linux_lit_icd_app_build=true" echo "Build: Ninja build" time ninja -C out/debug all check diff --git a/scripts/examples/gn_build_test_example.sh b/scripts/examples/gn_build_test_example.sh index 766868016bbf08..7ca97892270e8b 100755 --- a/scripts/examples/gn_build_test_example.sh +++ b/scripts/examples/gn_build_test_example.sh @@ -38,9 +38,6 @@ function runZAP() { # Generates the generic files for the given zap configuration "$CHIP_ROOT"/scripts/tools/zap/generate.py "$ZAP_INPUT_FILE" -o "$ZAP_OUTPUT_DIR" - - # Generates the specific files for the given zap configuration - TARGET_APP=$APP_DIR "$CHIP_ROOT"/scripts/tools/zap/generate.py "$ZAP_INPUT_FILE" -t "$INPUT_DIR"/apps/"$APP_DIR"/templates/templates.json -o "$ZAP_OUTPUT_DIR" } function runGN() { diff --git a/scripts/examples/gn_silabs_example.sh b/scripts/examples/gn_silabs_example.sh index c69f9d495fa975..9f7314c14010ad 100755 --- a/scripts/examples/gn_silabs_example.sh +++ b/scripts/examples/gn_silabs_example.sh @@ -48,7 +48,7 @@ if [ "$#" == "0" ]; then $USAGE - Root Location of the app e.g: examples/lighting-app/efr32/ + Root Location of the app e.g: examples/lighting-app/silabs/ Desired location for the output files diff --git a/scripts/py_matter_yamltests/matter_yamltests/pseudo_clusters/clusters/accessory_server_bridge.py b/scripts/py_matter_yamltests/matter_yamltests/pseudo_clusters/clusters/accessory_server_bridge.py index d3e3403fef4954..a8991deb9b7870 100644 --- a/scripts/py_matter_yamltests/matter_yamltests/pseudo_clusters/clusters/accessory_server_bridge.py +++ b/scripts/py_matter_yamltests/matter_yamltests/pseudo_clusters/clusters/accessory_server_bridge.py @@ -17,6 +17,7 @@ import xmlrpc.client _DEFAULT_KEY = 'default' +_DEFAULT_WAIT_FOR_MESSAGE_TIMEOUT_SECONDS = 10 _IP = '127.0.0.1' _PORT = 9000 @@ -113,9 +114,11 @@ def factoryReset(request): def waitForMessage(request): register_key = _get_option(request, 'registerKey', _DEFAULT_KEY) message = _get_option(request, 'message') + timeout_in_seconds = _get_option( + request, 'timeoutInSeconds', _DEFAULT_WAIT_FOR_MESSAGE_TIMEOUT_SECONDS) with xmlrpc.client.ServerProxy(_make_url(), allow_none=True) as proxy: - proxy.waitForMessage(register_key, [message]) + proxy.waitForMessage(register_key, [message], timeout_in_seconds) def createOtaImage(request): otaImageFilePath = _get_option(request, 'otaImageFilePath') diff --git a/scripts/py_matter_yamltests/matter_yamltests/pseudo_clusters/clusters/delay_commands.py b/scripts/py_matter_yamltests/matter_yamltests/pseudo_clusters/clusters/delay_commands.py index fdb949da9b1449..7586be6de2239a 100644 --- a/scripts/py_matter_yamltests/matter_yamltests/pseudo_clusters/clusters/delay_commands.py +++ b/scripts/py_matter_yamltests/matter_yamltests/pseudo_clusters/clusters/delay_commands.py @@ -40,6 +40,7 @@ + diff --git a/scripts/py_matter_yamltests/matter_yamltests/websocket_runner.py b/scripts/py_matter_yamltests/matter_yamltests/websocket_runner.py index 34b1ba17e68734..9639016145b94d 100644 --- a/scripts/py_matter_yamltests/matter_yamltests/websocket_runner.py +++ b/scripts/py_matter_yamltests/matter_yamltests/websocket_runner.py @@ -13,6 +13,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +import logging +import re +import select import subprocess import time from dataclasses import dataclass @@ -24,6 +27,10 @@ _KEEP_ALIVE_TIMEOUT_IN_SECONDS = 120 _MAX_MESSAGE_SIZE_IN_BYTES = 10485760 # 10 MB +_CONNECT_MAX_RETRIES_DEFAULT = 4 +_WEBSOCKET_SERVER_MESSAGE = '== WebSocket Server Ready' +_WEBSOCKET_SERVER_MESSAGE_TIMEOUT = 60 # seconds +_WEBSOCKET_SERVER_TERMINATE_TIMEOUT = 10 # seconds @dataclass @@ -54,7 +61,7 @@ def is_connected(self) -> bool: return self._client.state == websockets.protocol.State.OPEN async def start(self): - self._server = await self._start_server(self._server_startup_command) + self._server = await self._start_server(self._server_startup_command, self._server_connection_url) self._client = await self._start_client(self._server_connection_url) async def stop(self): @@ -70,7 +77,7 @@ async def execute(self, request): return await instance.recv() return None - async def _start_client(self, url, max_retries=5, interval_between_retries=1): + async def _start_client(self, url, max_retries=_CONNECT_MAX_RETRIES_DEFAULT, interval_between_retries=1): if max_retries: start = time.time() try: @@ -93,15 +100,48 @@ async def _stop_client(self, instance): if instance: await instance.close() - async def _start_server(self, command): + async def _start_server(self, command, url): instance = None if command: - instance = subprocess.Popen(command, stdout=subprocess.DEVNULL) + start_time = time.time() + + command = ['stdbuf', '-o0', '-e0'] + command # disable buffering + instance = subprocess.Popen( + command, text=False, bufsize=0, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + # Loop to read the subprocess output with a timeout + lines = [] + while True: + if time.time() - start_time > _WEBSOCKET_SERVER_MESSAGE_TIMEOUT: + for line in lines: + print(line.decode('utf-8'), end='') + self._hooks.abort(url) + await self._stop_server(instance) + raise Exception( + f'Connecting to {url} failed. WebSocket startup has not been detected.') + + ready, _, _ = select.select([instance.stdout], [], [], 1) + if ready: + line = instance.stdout.readline() + if len(line): + lines.append(line) + if re.search(_WEBSOCKET_SERVER_MESSAGE, line.decode('utf-8')): + break # Exit the loop if the pattern is found + else: + continue + instance.stdout.close() + return instance async def _stop_server(self, instance): if instance: - instance.kill() + instance.terminate() # sends SIGTERM + try: + instance.wait(_WEBSOCKET_SERVER_TERMINATE_TIMEOUT) + except subprocess.TimeoutExpired: + logging.debug( + 'Subprocess did not terminate on SIGTERM, killing it now') + instance.kill() def _make_server_connection_url(self, address: str, port: int): return 'ws://' + address + ':' + str(port) diff --git a/scripts/tests/chiptest/__init__.py b/scripts/tests/chiptest/__init__.py index dba11f15d44c1e..984cb38080c897 100644 --- a/scripts/tests/chiptest/__init__.py +++ b/scripts/tests/chiptest/__init__.py @@ -160,6 +160,13 @@ def _GetInDevelopmentTests() -> Set[str]: } +def _GetChipToolUnsupportedTests() -> Set[str]: + """Tests that fail in chip-tool for some reason""" + return { + "TestDiagnosticLogsDownloadCommand", # chip-tool does not implement a bdx download command. + } + + def _GetDarwinFrameworkToolUnsupportedTests() -> Set[str]: """Tests that fail in darwin-framework-tool for some reason""" return { @@ -258,6 +265,7 @@ def _GetChipReplUnsupportedTests() -> Set[str]: "Test_TC_RVCCLEANM_3_3.yaml", # chip-repl does not support EqualityCommands pseudo-cluster "Test_TC_BINFO_2_1.yaml", # chip-repl does not support EqualityCommands pseudo-cluster "TestDiagnosticLogs.yaml", # chip-repl does not implement a BDXTransferServerDelegate + "TestDiagnosticLogsDownloadCommand.yaml", # chip-repl does not implement the bdx download command } @@ -299,6 +307,8 @@ def target_for_name(name: str): return TestTarget.BRIDGE if name.startswith("TestIcd") or name.startswith("Test_TC_ICDM_"): return TestTarget.LIT_ICD + if name.startswith("Test_TC_MWOCTRL_") or name.startswith("Test_TC_MWOM_"): + return TestTarget.MWO return TestTarget.ALL_CLUSTERS @@ -338,7 +348,7 @@ def tests_with_command(chip_tool: str, is_manual: bool): ) -def _AllFoundYamlTests(treat_repl_unsupported_as_in_development: bool, treat_dft_unsupported_as_in_development: bool, use_short_run_name: bool): +def _AllFoundYamlTests(treat_repl_unsupported_as_in_development: bool, treat_dft_unsupported_as_in_development: bool, treat_chip_tool_unsupported_as_in_development: bool, use_short_run_name: bool): """ use_short_run_name should be true if we want the run_name to be "Test_ABC" instead of "some/path/Test_ABC.yaml" """ @@ -348,7 +358,8 @@ def _AllFoundYamlTests(treat_repl_unsupported_as_in_development: bool, treat_dft extra_slow_tests = _GetExtraSlowTests() in_development_tests = _GetInDevelopmentTests() chip_repl_unsupported_tests = _GetChipReplUnsupportedTests() - treat_dft_unsupported_as_in_development_tests = _GetDarwinFrameworkToolUnsupportedTests() + dft_unsupported_as_in_development_tests = _GetDarwinFrameworkToolUnsupportedTests() + chip_tool_unsupported_as_in_development_tests = _GetChipToolUnsupportedTests() purposeful_failure_tests = _GetPurposefulFailureTests() for path in _AllYamlTests(): @@ -382,7 +393,10 @@ def _AllFoundYamlTests(treat_repl_unsupported_as_in_development: bool, treat_dft else: run_name = str(path) - if treat_dft_unsupported_as_in_development and run_name in treat_dft_unsupported_as_in_development_tests: + if treat_dft_unsupported_as_in_development and run_name in dft_unsupported_as_in_development_tests: + tags.add(TestTag.IN_DEVELOPMENT) + + if treat_chip_tool_unsupported_as_in_development and run_name in chip_tool_unsupported_as_in_development_tests: tags.add(TestTag.IN_DEVELOPMENT) yield TestDefinition( @@ -394,17 +408,17 @@ def _AllFoundYamlTests(treat_repl_unsupported_as_in_development: bool, treat_dft def AllReplYamlTests(): - for test in _AllFoundYamlTests(treat_repl_unsupported_as_in_development=True, treat_dft_unsupported_as_in_development=False, use_short_run_name=False): + for test in _AllFoundYamlTests(treat_repl_unsupported_as_in_development=True, treat_dft_unsupported_as_in_development=False, treat_chip_tool_unsupported_as_in_development=False, use_short_run_name=False): yield test def AllChipToolYamlTests(): - for test in _AllFoundYamlTests(treat_repl_unsupported_as_in_development=False, treat_dft_unsupported_as_in_development=False, use_short_run_name=True): + for test in _AllFoundYamlTests(treat_repl_unsupported_as_in_development=False, treat_dft_unsupported_as_in_development=False, treat_chip_tool_unsupported_as_in_development=True, use_short_run_name=True): yield test def AllDarwinFrameworkToolYamlTests(): - for test in _AllFoundYamlTests(treat_repl_unsupported_as_in_development=False, treat_dft_unsupported_as_in_development=True, use_short_run_name=True): + for test in _AllFoundYamlTests(treat_repl_unsupported_as_in_development=False, treat_dft_unsupported_as_in_development=True, treat_chip_tool_unsupported_as_in_development=False, use_short_run_name=True): yield test diff --git a/scripts/tests/chiptest/accessories.py b/scripts/tests/chiptest/accessories.py index 60e2136209ec19..99433d7ed88660 100644 --- a/scripts/tests/chiptest/accessories.py +++ b/scripts/tests/chiptest/accessories.py @@ -98,12 +98,12 @@ def factoryReset(self, name): return accessory.factoryReset() return False - def waitForMessage(self, name, message): + def waitForMessage(self, name, message, timeoutInSeconds=10): accessory = self.__accessories[name] if accessory: # The message param comes directly from the sys.argv[2:] of WaitForMessage.py and should contain a list of strings that # comprise the entire message to wait for - return accessory.waitForMessage(' '.join(message)) + return accessory.waitForMessage(' '.join(message), timeoutInSeconds) return False def createOtaImage(self, otaImageFilePath, rawImageFilePath, rawImageContent, vid='0xDEAD', pid='0xBEEF'): diff --git a/scripts/tests/chiptest/linux.py b/scripts/tests/chiptest/linux.py index 9668e566671b3d..1d679ee236a3fd 100644 --- a/scripts/tests/chiptest/linux.py +++ b/scripts/tests/chiptest/linux.py @@ -182,6 +182,7 @@ def PathsWithNetworkNamespaces(paths: ApplicationPaths) -> ApplicationPaths: ota_requestor_app='ip netns exec app'.split() + paths.ota_requestor_app, tv_app='ip netns exec app'.split() + paths.tv_app, lit_icd_app='ip netns exec app'.split() + paths.lit_icd_app, + microwave_oven_app='ip netns exec app'.split() + paths.microwave_oven_app, bridge_app='ip netns exec app'.split() + paths.bridge_app, chip_repl_yaml_tester_cmd='ip netns exec tool'.split() + paths.chip_repl_yaml_tester_cmd, chip_tool_with_python_cmd='ip netns exec tool'.split() + paths.chip_tool_with_python_cmd, diff --git a/scripts/tests/chiptest/test_definition.py b/scripts/tests/chiptest/test_definition.py index 19f0a7dcb74b0b..95f7a631928ba4 100644 --- a/scripts/tests/chiptest/test_definition.py +++ b/scripts/tests/chiptest/test_definition.py @@ -83,8 +83,8 @@ def factoryReset(self): def waitForAnyAdvertisement(self): self.__waitFor("mDNS service published:", self.process, self.outpipe) - def waitForMessage(self, message): - self.__waitFor(message, self.process, self.outpipe) + def waitForMessage(self, message, timeoutInSeconds=10): + self.__waitFor(message, self.process, self.outpipe, timeoutInSeconds) return True def kill(self): @@ -124,7 +124,7 @@ def __startServer(self, runner, command): self.kvsPathSet.add(value) return runner.RunSubprocess(app_cmd, name='APP ', wait=False) - def __waitFor(self, waitForString, server_process, outpipe): + def __waitFor(self, waitForString, server_process, outpipe, timeoutInSeconds=10): logging.debug('Waiting for %s' % waitForString) start_time = time.monotonic() @@ -139,7 +139,7 @@ def __waitFor(self, waitForString, server_process, outpipe): (waitForString, server_process.returncode)) logging.error(died_str) raise Exception(died_str) - if time.monotonic() - start_time > 10: + if time.monotonic() - start_time > timeoutInSeconds: raise Exception('Timeout while waiting for %s' % waitForString) time.sleep(0.1) ready, self.lastLogIndex = outpipe.CapturedLogContains( @@ -175,6 +175,7 @@ class TestTarget(Enum): OTA = auto() BRIDGE = auto() LIT_ICD = auto() + MWO = auto() @dataclass @@ -187,12 +188,13 @@ class ApplicationPaths: tv_app: typing.List[str] bridge_app: typing.List[str] lit_icd_app: typing.List[str] + microwave_oven_app: typing.List[str] chip_repl_yaml_tester_cmd: typing.List[str] chip_tool_with_python_cmd: typing.List[str] def items(self): return [self.chip_tool, self.all_clusters_app, self.lock_app, self.ota_provider_app, self.ota_requestor_app, - self.tv_app, self.bridge_app, self.lit_icd_app, self.chip_repl_yaml_tester_cmd, self.chip_tool_with_python_cmd] + self.tv_app, self.bridge_app, self.lit_icd_app, self.microwave_oven_app, self.chip_repl_yaml_tester_cmd, self.chip_tool_with_python_cmd] @dataclass @@ -301,6 +303,8 @@ def Run(self, runner, apps_register, paths: ApplicationPaths, pics_file: str, target_app = paths.bridge_app elif self.target == TestTarget.LIT_ICD: target_app = paths.lit_icd_app + elif self.target == TestTarget.MWO: + target_app = paths.microwave_oven_app else: raise Exception("Unknown test target - " "don't know which application to run") @@ -332,6 +336,13 @@ def Run(self, runner, apps_register, paths: ApplicationPaths, pics_file: str, # so it will be commissionable again. app.factoryReset() + # It may sometimes be useful to run the same app multiple times depending + # on the implementation. So this code creates a duplicate entry but with a different + # key. + app = App(runner, path) + apps_register.add(f'{key}#2', app) + app.factoryReset() + if dry_run: tool_storage_dir = None tool_storage_args = [] diff --git a/scripts/tests/run_test_suite.py b/scripts/tests/run_test_suite.py index d4d94b28bf858c..9dbe01d9dbcfa0 100755 --- a/scripts/tests/run_test_suite.py +++ b/scripts/tests/run_test_suite.py @@ -254,6 +254,9 @@ def cmd_list(context): @click.option( '--lit-icd-app', help='what lit-icd app to use') +@click.option( + '--microwave-oven-app', + help='what microwave oven app to use') @click.option( '--chip-repl-yaml-tester', help='what python script to use for running yaml tests using chip-repl as controller') @@ -285,7 +288,7 @@ def cmd_list(context): help='Number of tests that are expected to fail in each iteration. Overall test will pass if the number of failures matches this. Nonzero values require --keep-going') @click.pass_context def cmd_run(context, iterations, all_clusters_app, lock_app, ota_provider_app, ota_requestor_app, - tv_app, bridge_app, lit_icd_app, chip_repl_yaml_tester, chip_tool_with_python, pics_file, keep_going, test_timeout_seconds, expected_failures): + tv_app, bridge_app, lit_icd_app, microwave_oven_app, chip_repl_yaml_tester, chip_tool_with_python, pics_file, keep_going, test_timeout_seconds, expected_failures): if expected_failures != 0 and not keep_going: logging.exception(f"'--expected-failures {expected_failures}' used without '--keep-going'") sys.exit(2) @@ -315,6 +318,9 @@ def cmd_run(context, iterations, all_clusters_app, lock_app, ota_provider_app, o if lit_icd_app is None: lit_icd_app = paths_finder.get('lit-icd-app') + if microwave_oven_app is None: + microwave_oven_app = paths_finder.get('chip-microwave-oven-app') + if chip_repl_yaml_tester is None: chip_repl_yaml_tester = paths_finder.get('yamltest_with_chip_repl_tester.py') @@ -334,6 +340,7 @@ def cmd_run(context, iterations, all_clusters_app, lock_app, ota_provider_app, o tv_app=[tv_app], bridge_app=[bridge_app], lit_icd_app=[lit_icd_app], + microwave_oven_app=[microwave_oven_app], chip_repl_yaml_tester_cmd=['python3'] + [chip_repl_yaml_tester], chip_tool_with_python_cmd=['python3'] + [chip_tool_with_python], ) diff --git a/scripts/tools/nxp/factory_data_generator/custom.py b/scripts/tools/nxp/factory_data_generator/custom.py index 13b1a34fc98c12..e2f7584e2d7fa2 100644 --- a/scripts/tools/nxp/factory_data_generator/custom.py +++ b/scripts/tools/nxp/factory_data_generator/custom.py @@ -96,11 +96,14 @@ def encode(self): assert (self.private_key is not None) return self.private_key - def generate_private_key(self, password): - keys = load_der_private_key(self.val, password, backend=default_backend()) - self.private_key = keys.private_numbers().private_value.to_bytes( - 32, byteorder='big' - ) + def generate_private_key(self, password, use_sss_blob=False): + if use_sss_blob: + self.private_key = self.val + else: + keys = load_der_private_key(self.val, password, backend=default_backend()) + self.private_key = keys.private_numbers().private_value.to_bytes( + 32, byteorder='big' + ) class DacCert(FileArgument): diff --git a/scripts/tools/nxp/factory_data_generator/generate.py b/scripts/tools/nxp/factory_data_generator/generate.py index a203ac9dee749e..1fb7d91edeedaf 100755 --- a/scripts/tools/nxp/factory_data_generator/generate.py +++ b/scripts/tools/nxp/factory_data_generator/generate.py @@ -78,7 +78,7 @@ def __init__(self, args): self.spake2p = Spake2p() if self.args.spake2p_verifier is None: self.spake2p.generate(self.args) - self.args.dac_key.generate_private_key(self.args.dac_key_password) + self.args.dac_key.generate_private_key(self.args.dac_key_password, self.args.dac_key_use_sss_blob) def _validate_args(self): if self.args.dac_key_password is None: @@ -217,6 +217,8 @@ def main(): optional.add_argument("--dac_key_password", type=str, help="[path] Password to decode DAC Key if available") + optional.add_argument("--dac_key_use_sss_blob", action='store_true', + help="[bool] If present, DAC private key area is populated by an encrypted blob") optional.add_argument("--spake2p_verifier", type=Verifier, help="[base64 str] Already generated spake2p verifier") optional.add_argument("--aes128_key", diff --git a/scripts/tools/nxp/factory_data_generator/k32w1/example_convert_dac_private_key.jlink b/scripts/tools/nxp/factory_data_generator/k32w1/example_convert_dac_private_key.jlink new file mode 100644 index 00000000000000..d31c1370933ace --- /dev/null +++ b/scripts/tools/nxp/factory_data_generator/k32w1/example_convert_dac_private_key.jlink @@ -0,0 +1,16 @@ +reset +halt +// Factory data size is one internal flash sector (8K). +// Factory data address is retrieved from the map file. +erase 0xec000 0xee000 noreset +// Load factory data and conversion application, then +// wait for 10 seconds and load the "real" application. +loadfile factory_data.bin 0xec000 +loadfile chip-k32w1-light-example-before-conversion.srec +reset +go +Sleep 10000 +loadfile chip-k32w1-light-example-after-conversion.srec +reset +go +quit \ No newline at end of file diff --git a/scripts/tools/zap_regen_all.py b/scripts/tools/zap_regen_all.py index ef950eb96fe94f..0e0b2b6dda93ec 100755 --- a/scripts/tools/zap_regen_all.py +++ b/scripts/tools/zap_regen_all.py @@ -368,26 +368,6 @@ def getGlobalTemplatesTargets(): example_name = example_name[example_name.index('examples/') + 9:] example_name = example_name[:example_name.index('/')] - # Place holder has apps within each build - if example_name == "placeholder": - example_name = filepath.as_posix() - example_name = example_name[example_name.index( - 'apps/') + len('apps/'):] - example_name = example_name[:example_name.index('/')] - logging.info("Found example %s (via %s)" % - (example_name, str(filepath))) - - # The name zap-generated is to make includes clear by using - # a name like - output_dir = os.path.join( - 'zzz_generated', 'placeholder', example_name, 'zap-generated') - template = os.path.join( - 'examples', 'placeholder', 'linux', 'apps', example_name, 'templates', 'templates.json') - - targets.append(ZAPGenerateTarget.MatterIdlTarget(ZapInput.FromZap(filepath))) - targets.append(ZAPGenerateTarget(ZapInput.FromZap(filepath), output_dir=output_dir, template=template)) - continue - if example_name == "chef": if os.path.join("chef", "devices") not in str(filepath): continue @@ -400,17 +380,6 @@ def getGlobalTemplatesTargets(): logging.info("Found example %s (via %s)" % (example_name, str(filepath))) - generate_subdir = example_name - - # Special casing lighting app because separate folders - if example_name == "lighting-app" or example_name == "lock-app": - if 'nxp' in str(filepath): - generate_subdir = f"{example_name}/nxp" - - # The name zap-generated is to make includes clear by using - # a name like - output_dir = os.path.join( - 'zzz_generated', generate_subdir, 'zap-generated') targets.append(ZAPGenerateTarget.MatterIdlTarget(ZapInput.FromZap(filepath))) targets.append(ZAPGenerateTarget.MatterIdlTarget(ZapInput.FromPropertiesJson('src/app/zap-templates/zcl/zcl.json'), @@ -450,7 +419,6 @@ def getSpecificTemplatesTargets(): # Mapping of required template and output directory templates = { 'src/app/common/templates/templates.json': 'zzz_generated/app-common/app-common/zap-generated', - 'src/app/tests/suites/templates/templates.json': 'zzz_generated/app-common/app-common/zap-generated', 'examples/chip-tool/templates/templates.json': 'zzz_generated/chip-tool/zap-generated', 'examples/darwin-framework-tool/templates/templates.json': 'zzz_generated/darwin-framework-tool/zap-generated', 'src/controller/python/templates/templates.json': None, diff --git a/src/app/ReadHandler.h b/src/app/ReadHandler.h index d602273a8611a9..71070c357147df 100644 --- a/src/app/ReadHandler.h +++ b/src/app/ReadHandler.h @@ -275,7 +275,7 @@ class ReadHandler : public Messaging::ExchangeDelegate /** * Returns SUBSCRIPTION_MAX_INTERVAL_PUBLISHER_LIMIT - * For an ICD publisher, this SHALL be set to the idle mode interval. + * For an ICD publisher, this SHALL be set to the idle mode duration. * Otherwise, this SHALL be set to 60 minutes. */ uint16_t GetPublisherSelectedIntervalLimit(); diff --git a/src/app/app-platform/ContentApp.cpp b/src/app/app-platform/ContentApp.cpp index 571561454162ac..3bc16e9555ced5 100644 --- a/src/app/app-platform/ContentApp.cpp +++ b/src/app/app-platform/ContentApp.cpp @@ -29,35 +29,37 @@ #include #include #include +#include #if CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED using namespace chip; using namespace chip::AppPlatform; +using chip::Protocols::InteractionModel::Status; + namespace chip { namespace AppPlatform { #define ZCL_DESCRIPTOR_CLUSTER_REVISION (1u) #define ZCL_APPLICATION_BASIC_CLUSTER_REVISION (1u) -EmberAfStatus ContentApp::HandleReadAttribute(ClusterId clusterId, AttributeId attributeId, uint8_t * buffer, - uint16_t maxReadLength) +Status ContentApp::HandleReadAttribute(ClusterId clusterId, AttributeId attributeId, uint8_t * buffer, uint16_t maxReadLength) { ChipLogProgress(DeviceLayer, "Read Attribute for endpoint " ChipLogFormatMEI " cluster " ChipLogFormatMEI " attribute " ChipLogFormatMEI, ChipLogValueMEI(mEndpointId), ChipLogValueMEI(clusterId), ChipLogValueMEI(attributeId)); - return EMBER_ZCL_STATUS_FAILURE; + return Status::Failure; } -EmberAfStatus ContentApp::HandleWriteAttribute(ClusterId clusterId, AttributeId attributeId, uint8_t * buffer) +Status ContentApp::HandleWriteAttribute(ClusterId clusterId, AttributeId attributeId, uint8_t * buffer) { ChipLogProgress(DeviceLayer, "Read Attribute for endpoint " ChipLogFormatMEI " cluster " ChipLogFormatMEI " attribute " ChipLogFormatMEI, ChipLogValueMEI(mEndpointId), ChipLogValueMEI(clusterId), ChipLogValueMEI(attributeId)); - return EMBER_ZCL_STATUS_FAILURE; + return Status::Failure; } } // namespace AppPlatform diff --git a/src/app/app-platform/ContentApp.h b/src/app/app-platform/ContentApp.h index 6fed23cf7d64da..d3b7d1fb2b2187 100644 --- a/src/app/app-platform/ContentApp.h +++ b/src/app/app-platform/ContentApp.h @@ -33,6 +33,7 @@ #include #include #include +#include namespace chip { namespace AppPlatform { @@ -65,8 +66,9 @@ class DLL_EXPORT ContentApp virtual MediaPlaybackDelegate * GetMediaPlaybackDelegate() = 0; virtual TargetNavigatorDelegate * GetTargetNavigatorDelegate() = 0; - EmberAfStatus HandleReadAttribute(ClusterId clusterId, AttributeId attributeId, uint8_t * buffer, uint16_t maxReadLength); - EmberAfStatus HandleWriteAttribute(ClusterId clusterId, AttributeId attributeId, uint8_t * buffer); + Protocols::InteractionModel::Status HandleReadAttribute(ClusterId clusterId, AttributeId attributeId, uint8_t * buffer, + uint16_t maxReadLength); + Protocols::InteractionModel::Status HandleWriteAttribute(ClusterId clusterId, AttributeId attributeId, uint8_t * buffer); protected: EndpointId mEndpointId = 0; diff --git a/src/app/app-platform/ContentAppPlatform.cpp b/src/app/app-platform/ContentAppPlatform.cpp index bb4638c45d95ba..abcaa981843037 100644 --- a/src/app/app-platform/ContentAppPlatform.cpp +++ b/src/app/app-platform/ContentAppPlatform.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #if CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED @@ -41,19 +42,20 @@ using namespace chip::app::Clusters; using namespace chip::Access; using ApplicationStatusEnum = app::Clusters::ApplicationBasic::ApplicationStatusEnum; using GetSetupPINResponseType = app::Clusters::AccountLogin::Commands::GetSetupPINResponse::Type; +using chip::Protocols::InteractionModel::Status; // Device Version for dynamic endpoints: #define DEVICE_VERSION_DEFAULT 1 -EmberAfStatus emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, - uint16_t maxReadLength) +Status emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, + uint16_t maxReadLength) { uint16_t endpointIndex = emberAfGetDynamicIndexFromEndpoint(endpoint); ChipLogDetail(DeviceLayer, "emberAfExternalAttributeReadCallback endpoint %d ", endpointIndex); - EmberAfStatus ret = EMBER_ZCL_STATUS_FAILURE; + Status ret = Status::Failure; ContentApp * app = ContentAppPlatform::GetInstance().GetContentApp(endpoint); if (app != nullptr) @@ -68,14 +70,14 @@ EmberAfStatus emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterI return ret; } -EmberAfStatus emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer) +Status emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer) { uint16_t endpointIndex = emberAfGetDynamicIndexFromEndpoint(endpoint); ChipLogDetail(DeviceLayer, "emberAfExternalAttributeWriteCallback endpoint %d ", endpointIndex); - EmberAfStatus ret = EMBER_ZCL_STATUS_FAILURE; + Status ret = Status::Failure; ContentApp * app = ContentAppPlatform::GetInstance().GetContentApp(endpoint); if (app != nullptr) @@ -93,18 +95,18 @@ EmberAfStatus emberAfExternalAttributeWriteCallback(EndpointId endpoint, Cluster namespace chip { namespace AppPlatform { -EmberAfStatus __attribute__((weak)) AppPlatformExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, - uint8_t * buffer, uint16_t maxReadLength) +Status __attribute__((weak)) AppPlatformExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer, uint16_t maxReadLength) { - return (EMBER_ZCL_STATUS_FAILURE); + return (Status::Failure); } -EmberAfStatus __attribute__((weak)) +Status __attribute__((weak)) AppPlatformExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer) { - return (EMBER_ZCL_STATUS_FAILURE); + return (Status::Failure); } EndpointId ContentAppPlatform::AddContentApp(ContentApp * app, EmberAfEndpointType * ep, diff --git a/src/app/app-platform/ContentAppPlatform.h b/src/app/app-platform/ContentAppPlatform.h index 3dd0b138d2e9d1..16a47c26a3b991 100644 --- a/src/app/app-platform/ContentAppPlatform.h +++ b/src/app/app-platform/ContentAppPlatform.h @@ -27,6 +27,7 @@ #include #include #include +#include #include using chip::app::Clusters::ApplicationBasic::CatalogVendorApp; @@ -40,14 +41,15 @@ namespace AppPlatform { // The AppPlatform overrides emberAfExternalAttributeReadCallback to handle external attribute reads for ContentApps. // This callback can be used to handle external attribute reads for attributes belonging to static endpoints. -EmberAfStatus AppPlatformExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, - uint16_t maxReadLength); +Protocols::InteractionModel::Status AppPlatformExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer, uint16_t maxReadLength); // The AppPlatform overrides emberAfExternalAttributeWriteCallback to handle external attribute writes for ContentApps. // This callback can be used to handle external attribute writes for attributes belonging to static endpoints. -EmberAfStatus AppPlatformExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer); +Protocols::InteractionModel::Status AppPlatformExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer); inline constexpr EndpointId kTargetBindingClusterEndpointId = 0; inline constexpr EndpointId kLocalVideoPlayerEndpointId = 1; @@ -157,7 +159,7 @@ class DLL_EXPORT ContentAppPlatform // loads given app and calls HandleGetSetupPasscode. Sets passcode to 0 if it cannot be obtained. // return true if a matching app was found (and it granted this client access), even if a passcode was not obtained bool HasTargetContentApp(uint16_t vendorId, uint16_t productId, CharSpan rotatingId, - chip::Protocols::UserDirectedCommissioning::TargetAppInfo & info, uint32_t & passcode); + Protocols::UserDirectedCommissioning::TargetAppInfo & info, uint32_t & passcode); /** * @brief diff --git a/src/app/clusters/account-login-server/account-login-server.cpp b/src/app/clusters/account-login-server/account-login-server.cpp index aa939ae810bb10..684558eec0f0bc 100644 --- a/src/app/clusters/account-login-server/account-login-server.cpp +++ b/src/app/clusters/account-login-server/account-login-server.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #if CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED #include diff --git a/src/app/clusters/application-launcher-server/application-launcher-server.cpp b/src/app/clusters/application-launcher-server/application-launcher-server.cpp index aa72d8ad499620..18a30bb1190659 100644 --- a/src/app/clusters/application-launcher-server/application-launcher-server.cpp +++ b/src/app/clusters/application-launcher-server/application-launcher-server.cpp @@ -116,8 +116,8 @@ bool HasFeature(chip::EndpointId endpoint, Feature feature) bool hasFeature = false; uint32_t featureMap = 0; - EmberAfStatus status = Attributes::FeatureMap::Get(endpoint, &featureMap); - if (EMBER_ZCL_STATUS_SUCCESS == status) + Status status = Attributes::FeatureMap::Get(endpoint, &featureMap); + if (Status::Success == status) { hasFeature = (featureMap & chip::to_underlying(feature)); } diff --git a/src/app/clusters/audio-output-server/audio-output-server.cpp b/src/app/clusters/audio-output-server/audio-output-server.cpp index f47fc528456a78..297d1ea9d8d8b3 100644 --- a/src/app/clusters/audio-output-server/audio-output-server.cpp +++ b/src/app/clusters/audio-output-server/audio-output-server.cpp @@ -92,8 +92,8 @@ bool HasFeature(chip::EndpointId endpoint, Feature feature) bool hasFeature = false; uint32_t featureMap = 0; - EmberAfStatus status = Attributes::FeatureMap::Get(endpoint, &featureMap); - if (EMBER_ZCL_STATUS_SUCCESS == status) + Status status = Attributes::FeatureMap::Get(endpoint, &featureMap); + if (Status::Success == status) { hasFeature = (featureMap & chip::to_underlying(feature)); } diff --git a/src/app/clusters/barrier-control-server/barrier-control-server.cpp b/src/app/clusters/barrier-control-server/barrier-control-server.cpp index e4e72eeb2ae930..99bd0621ba793d 100644 --- a/src/app/clusters/barrier-control-server/barrier-control-server.cpp +++ b/src/app/clusters/barrier-control-server/barrier-control-server.cpp @@ -102,29 +102,29 @@ static void cancelEndpointTimerCallback(EndpointId endpoint) uint8_t emAfPluginBarrierControlServerGetBarrierPosition(EndpointId endpoint) { uint8_t position; - EmberAfStatus status = Attributes::BarrierPosition::Get(endpoint, &position); - assert(status == EMBER_ZCL_STATUS_SUCCESS); + Status status = Attributes::BarrierPosition::Get(endpoint, &position); + assert(status == Status::Success); return position; } void emAfPluginBarrierControlServerSetBarrierPosition(EndpointId endpoint, uint8_t position) { - EmberAfStatus status = Attributes::BarrierPosition::Set(endpoint, position); - assert(status == EMBER_ZCL_STATUS_SUCCESS); + Status status = Attributes::BarrierPosition::Set(endpoint, position); + assert(status == Status::Success); } bool emAfPluginBarrierControlServerIsPartialBarrierSupported(EndpointId endpoint) { uint8_t bitmap; - EmberAfStatus status = Attributes::BarrierCapabilities::Get(endpoint, &bitmap); - assert(status == EMBER_ZCL_STATUS_SUCCESS); + Status status = Attributes::BarrierCapabilities::Get(endpoint, &bitmap); + assert(status == Status::Success); return (bitmap & to_underlying(BarrierControlCapabilities::kPartialBarrier)) != 0; } static uint16_t getOpenOrClosePeriod(EndpointId endpoint, bool open) { - uint16_t period = 0; - EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; + uint16_t period = 0; + Status status = Status::Success; #if defined(ZCL_USING_BARRIER_CONTROL_CLUSTER_BARRIER_OPEN_PERIOD_ATTRIBUTE) if (open) { @@ -137,21 +137,21 @@ static uint16_t getOpenOrClosePeriod(EndpointId endpoint, bool open) status = Attributes::BarrierClosePeriod::Get(endpoint, &period); } #endif - assert(status == EMBER_ZCL_STATUS_SUCCESS); + assert(status == Status::Success); return period; } static void setMovingState(EndpointId endpoint, uint8_t newState) { - EmberAfStatus status = Attributes::BarrierMovingState::Set(endpoint, newState); - assert(status == EMBER_ZCL_STATUS_SUCCESS); + Status status = Attributes::BarrierMovingState::Set(endpoint, newState); + assert(status == Status::Success); } uint16_t emAfPluginBarrierControlServerGetSafetyStatus(EndpointId endpoint) { uint16_t safetyStatus; - EmberAfStatus status = Attributes::BarrierSafetyStatus::Get(endpoint, &safetyStatus); - assert(status == EMBER_ZCL_STATUS_SUCCESS); + Status status = Attributes::BarrierSafetyStatus::Get(endpoint, &safetyStatus); + assert(status == Status::Success); return safetyStatus; } @@ -163,8 +163,8 @@ static bool isRemoteLockoutOn(EndpointId endpoint) void emAfPluginBarrierControlServerIncrementEvents(EndpointId endpoint, bool open, bool command) { - EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; - uint16_t events = 0; + Status status = Status::Success; + uint16_t events = 0; #if defined(ZCL_USING_BARRIER_CONTROL_CLUSTER_BARRIER_OPEN_EVENTS_ATTRIBUTE) if (open && !command) @@ -190,7 +190,7 @@ void emAfPluginBarrierControlServerIncrementEvents(EndpointId endpoint, bool ope status = Attributes::BarrierCommandCloseEvents::Get(endpoint, &events); } #endif - assert(status == EMBER_ZCL_STATUS_SUCCESS); + assert(status == Status::Success); // Section 7.1.2.1.5-8 says that this events counter SHALL NOT roll over. // The maximum 16-bit unsigned integer in Zigbee is 0xFFFE, so we have this @@ -225,7 +225,7 @@ void emAfPluginBarrierControlServerIncrementEvents(EndpointId endpoint, bool ope status = Attributes::BarrierCommandCloseEvents::Set(endpoint, events); } #endif - assert(status == EMBER_ZCL_STATUS_SUCCESS); + assert(status == Status::Success); } // ----------------------------------------------------------------------------- diff --git a/src/app/clusters/basic-information/basic-information.cpp b/src/app/clusters/basic-information/basic-information.cpp index f241bb2cf5a008..641dc59a853dd6 100644 --- a/src/app/clusters/basic-information/basic-information.cpp +++ b/src/app/clusters/basic-information/basic-information.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -41,6 +42,7 @@ using namespace chip::app::Clusters; using namespace chip::app::Clusters::BasicInformation; using namespace chip::app::Clusters::BasicInformation::Attributes; using namespace chip::DeviceLayer; +using chip::Protocols::InteractionModel::Status; namespace { @@ -463,9 +465,9 @@ namespace Clusters { namespace BasicInformation { bool IsLocalConfigDisabled() { - bool disabled = false; - EmberAfStatus status = LocalConfigDisabled::Get(0, &disabled); - return status == EMBER_ZCL_STATUS_SUCCESS && disabled; + bool disabled = false; + Status status = LocalConfigDisabled::Get(0, &disabled); + return status == Status::Success && disabled; } } // namespace BasicInformation } // namespace Clusters diff --git a/src/app/clusters/bindings/BindingManager.cpp b/src/app/clusters/bindings/BindingManager.cpp index 7243fdcfb3b744..b765146ed55153 100644 --- a/src/app/clusters/bindings/BindingManager.cpp +++ b/src/app/clusters/bindings/BindingManager.cpp @@ -88,7 +88,7 @@ CHIP_ERROR BindingManager::Init(const BindingManagerInitParams & params) { for (const EmberBindingTableEntry & entry : BindingTable::GetInstance()) { - if (entry.type == EMBER_UNICAST_BINDING) + if (entry.type == MATTER_UNICAST_BINDING) { // The CASE connection can also fail if the unicast peer is offline. // There is recovery mechanism to retry connection on-demand so ignore error. @@ -187,14 +187,14 @@ CHIP_ERROR BindingManager::NotifyBoundClusterChanged(EndpointId endpoint, Cluste { if (iter->local == endpoint && (!iter->clusterId.HasValue() || iter->clusterId.Value() == cluster)) { - if (iter->type == EMBER_UNICAST_BINDING) + if (iter->type == MATTER_UNICAST_BINDING) { error = mPendingNotificationMap.AddPendingNotification(iter.GetIndex(), bindingContext); SuccessOrExit(error); error = EstablishConnection(ScopedNodeId(iter->nodeId, iter->fabricIndex)); SuccessOrExit(error); } - else if (iter->type == EMBER_MULTICAST_BINDING) + else if (iter->type == MATTER_MULTICAST_BINDING) { mBoundDeviceChangedHandler(*iter, nullptr, bindingContext->GetContext()); } diff --git a/src/app/clusters/bindings/PendingNotificationMap.cpp b/src/app/clusters/bindings/PendingNotificationMap.cpp index 3499bddc090046..a7299b2d1f4663 100644 --- a/src/app/clusters/bindings/PendingNotificationMap.cpp +++ b/src/app/clusters/bindings/PendingNotificationMap.cpp @@ -30,17 +30,17 @@ CHIP_ERROR PendingNotificationMap::FindLRUConnectPeer(ScopedNodeId & nodeId) // to the start of the list than the last entry of any other peer. // First, set up a way to easily track which entries correspond to the same peer. - uint8_t bindingWithSamePeer[EMBER_BINDING_TABLE_SIZE]; + uint8_t bindingWithSamePeer[MATTER_BINDING_TABLE_SIZE]; for (auto iter = BindingTable::GetInstance().begin(); iter != BindingTable::GetInstance().end(); ++iter) { - if (iter->type != EMBER_UNICAST_BINDING) + if (iter->type != MATTER_UNICAST_BINDING) { continue; } for (auto checkIter = BindingTable::GetInstance().begin(); checkIter != BindingTable::GetInstance().end(); ++checkIter) { - if (checkIter->type == EMBER_UNICAST_BINDING && checkIter->fabricIndex == iter->fabricIndex && + if (checkIter->type == MATTER_UNICAST_BINDING && checkIter->fabricIndex == iter->fabricIndex && checkIter->nodeId == iter->nodeId) { bindingWithSamePeer[iter.GetIndex()] = checkIter.GetIndex(); @@ -49,7 +49,7 @@ CHIP_ERROR PendingNotificationMap::FindLRUConnectPeer(ScopedNodeId & nodeId) } } - uint16_t lastAppear[EMBER_BINDING_TABLE_SIZE]; + uint16_t lastAppear[MATTER_BINDING_TABLE_SIZE]; for (uint16_t & value : lastAppear) { value = UINT16_MAX; @@ -62,7 +62,7 @@ CHIP_ERROR PendingNotificationMap::FindLRUConnectPeer(ScopedNodeId & nodeId) } uint8_t lruBindingEntryIndex; uint16_t minLastAppearValue = UINT16_MAX; - for (uint8_t i = 0; i < EMBER_BINDING_TABLE_SIZE; i++) + for (uint8_t i = 0; i < MATTER_BINDING_TABLE_SIZE; i++) { if (lastAppear[i] < minLastAppearValue) { @@ -82,7 +82,7 @@ CHIP_ERROR PendingNotificationMap::FindLRUConnectPeer(ScopedNodeId & nodeId) CHIP_ERROR PendingNotificationMap::AddPendingNotification(uint8_t bindingEntryId, PendingNotificationContext * context) { RemoveEntry(bindingEntryId); - if (mNumEntries == EMBER_BINDING_TABLE_SIZE) + if (mNumEntries == MATTER_BINDING_TABLE_SIZE) { // We know that the RemoveEntry above did not do anything so we don't need to try restoring it. return CHIP_ERROR_NO_MEMORY; diff --git a/src/app/clusters/bindings/PendingNotificationMap.h b/src/app/clusters/bindings/PendingNotificationMap.h index d0697b0dac32ff..c06a0a426d434c 100644 --- a/src/app/clusters/bindings/PendingNotificationMap.h +++ b/src/app/clusters/bindings/PendingNotificationMap.h @@ -68,7 +68,7 @@ struct PendingNotificationEntry class PendingNotificationMap { public: - static constexpr uint8_t kMaxPendingNotifications = EMBER_BINDING_TABLE_SIZE; + static constexpr uint8_t kMaxPendingNotifications = MATTER_BINDING_TABLE_SIZE; friend class Iterator; diff --git a/src/app/clusters/bindings/bindings.cpp b/src/app/clusters/bindings/bindings.cpp index 22c4fba0be6920..7e0f3ce306da32 100644 --- a/src/app/clusters/bindings/bindings.cpp +++ b/src/app/clusters/bindings/bindings.cpp @@ -114,7 +114,7 @@ CHIP_ERROR CheckValidBindingList(const EndpointId localEndpoint, const Decodable oldListSize++; } } - ReturnErrorCodeIf(BindingTable::GetInstance().Size() - oldListSize + listSize > EMBER_BINDING_TABLE_SIZE, + ReturnErrorCodeIf(BindingTable::GetInstance().Size() - oldListSize + listSize > MATTER_BINDING_TABLE_SIZE, CHIP_IM_GLOBAL_STATUS(ResourceExhausted)); return CHIP_NO_ERROR; } @@ -153,7 +153,7 @@ CHIP_ERROR BindingTableAccess::ReadBindingTable(EndpointId endpoint, AttributeVa return encoder.EncodeList([&](const auto & subEncoder) { for (const EmberBindingTableEntry & entry : BindingTable::GetInstance()) { - if (entry.local == endpoint && entry.type == EMBER_UNICAST_BINDING) + if (entry.local == endpoint && entry.type == MATTER_UNICAST_BINDING) { Binding::Structs::TargetStruct::Type value = { .node = MakeOptional(entry.nodeId), @@ -164,7 +164,7 @@ CHIP_ERROR BindingTableAccess::ReadBindingTable(EndpointId endpoint, AttributeVa }; ReturnErrorOnFailure(subEncoder.Encode(value)); } - else if (entry.local == endpoint && entry.type == EMBER_MULTICAST_BINDING) + else if (entry.local == endpoint && entry.type == MATTER_MULTICAST_BINDING) { Binding::Structs::TargetStruct::Type value = { .node = NullOptional, @@ -214,7 +214,7 @@ CHIP_ERROR BindingTableAccess::WriteBindingTable(const ConcreteDataAttributePath { if (bindingTableIter->local == path.mEndpointId && bindingTableIter->fabricIndex == mAccessingFabricIndex) { - if (bindingTableIter->type == EMBER_UNICAST_BINDING) + if (bindingTableIter->type == MATTER_UNICAST_BINDING) { BindingManager::GetInstance().UnicastBindingRemoved(bindingTableIter.GetIndex()); } @@ -284,7 +284,7 @@ CHIP_ERROR AddBindingEntry(const EmberBindingTableEntry & entry) return err; } - if (entry.type == EMBER_UNICAST_BINDING) + if (entry.type == MATTER_UNICAST_BINDING) { err = BindingManager::GetInstance().UnicastBindingCreated(entry.fabricIndex, entry.nodeId); if (err != CHIP_NO_ERROR) diff --git a/src/app/clusters/boolean-state-configuration-server/boolean-state-configuration-server.cpp b/src/app/clusters/boolean-state-configuration-server/boolean-state-configuration-server.cpp index 8fa2f36d3a3aab..b302f468aa38e4 100644 --- a/src/app/clusters/boolean-state-configuration-server/boolean-state-configuration-server.cpp +++ b/src/app/clusters/boolean-state-configuration-server/boolean-state-configuration-server.cpp @@ -102,7 +102,7 @@ CHIP_ERROR BooleanStateConfigAttrAccess::ReadCurrentSensitivityLevel(const Concr if (err == CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND) { uint8_t supportedSensLevel; - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == SupportedSensitivityLevels::Get(aPath.mEndpointId, &supportedSensLevel), + VerifyOrReturnError(Status::Success == SupportedSensitivityLevels::Get(aPath.mEndpointId, &supportedSensLevel), CHIP_IM_GLOBAL_STATUS(Failure)); VerifyOrReturnError(supportedSensLevel >= kMinSupportedSensitivityLevels, CHIP_IM_GLOBAL_STATUS(Failure)); VerifyOrReturnError(supportedSensLevel <= kMaxSupportedSensitivityLevels, CHIP_IM_GLOBAL_STATUS(Failure)); @@ -168,13 +168,13 @@ static bool emitAlarmsStateChangedEvent(EndpointId ep) BooleanStateConfiguration::Events::AlarmsStateChanged::Type event; BitMask active; - VerifyOrReturnValue(EMBER_ZCL_STATUS_SUCCESS == AlarmsActive::Get(ep, &active), false); + VerifyOrReturnValue(Status::Success == AlarmsActive::Get(ep, &active), false); event.alarmsActive = active; if (HasFeature(ep, BooleanStateConfiguration::Feature::kAlarmSuppress)) { BitMask suppressed; - VerifyOrReturnValue(EMBER_ZCL_STATUS_SUCCESS == AlarmsSuppressed::Get(ep, &suppressed), false); + VerifyOrReturnValue(Status::Success == AlarmsSuppressed::Get(ep, &suppressed), false); event.alarmsSuppressed.SetValue(suppressed); } @@ -214,7 +214,7 @@ static CHIP_ERROR emitSensorFaultEvent(EndpointId ep, BitMask= kMinSupportedSensitivityLevels, CHIP_IM_GLOBAL_STATUS(ConstraintError)); VerifyOrReturnError(supportedSensLevel <= kMaxSupportedSensitivityLevels, CHIP_IM_GLOBAL_STATUS(ConstraintError)); @@ -254,11 +254,10 @@ CHIP_ERROR SetAlarmsActive(EndpointId ep, BitMask alarmsEnabled; - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsEnabled::Get(ep, &alarmsEnabled), - CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)); + VerifyOrReturnError(Status::Success == AlarmsEnabled::Get(ep, &alarmsEnabled), CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)); VerifyOrReturnError(alarmsEnabled.HasAll(alarms), CHIP_IM_GLOBAL_STATUS(Failure)); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsActive::Set(ep, alarms), CHIP_IM_GLOBAL_STATUS(Failure)); + VerifyOrReturnError(Status::Success == AlarmsActive::Set(ep, alarms), CHIP_IM_GLOBAL_STATUS(Failure)); emitAlarmsStateChangedEvent(ep); return CHIP_NO_ERROR; @@ -271,12 +270,11 @@ CHIP_ERROR SetAllEnabledAlarmsActive(EndpointId ep) CHIP_IM_GLOBAL_STATUS(Failure)); BitMask alarmsEnabled; - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsEnabled::Get(ep, &alarmsEnabled), - CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)); + VerifyOrReturnError(Status::Success == AlarmsEnabled::Get(ep, &alarmsEnabled), CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)); if (alarmsEnabled.HasAny()) { - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsActive::Set(ep, alarmsEnabled), CHIP_IM_GLOBAL_STATUS(Failure)); + VerifyOrReturnError(Status::Success == AlarmsActive::Set(ep, alarmsEnabled), CHIP_IM_GLOBAL_STATUS(Failure)); emitAlarmsStateChangedEvent(ep); } @@ -288,23 +286,21 @@ CHIP_ERROR ClearAllAlarms(EndpointId ep) BitMask alarmsActive, alarmsSuppressed; bool emitEvent = false; - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsActive::Get(ep, &alarmsActive), - CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsSuppressed::Get(ep, &alarmsSuppressed), + VerifyOrReturnError(Status::Success == AlarmsActive::Get(ep, &alarmsActive), CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)); + VerifyOrReturnError(Status::Success == AlarmsSuppressed::Get(ep, &alarmsSuppressed), CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)); if (alarmsActive.HasAny()) { alarmsActive.ClearAll(); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsActive::Set(ep, alarmsActive), - CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)); + VerifyOrReturnError(Status::Success == AlarmsActive::Set(ep, alarmsActive), CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)); emitEvent = true; } if (alarmsSuppressed.HasAny()) { alarmsSuppressed.ClearAll(); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsSuppressed::Set(ep, alarmsSuppressed), + VerifyOrReturnError(Status::Success == AlarmsSuppressed::Set(ep, alarmsSuppressed), CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)); emitEvent = true; } @@ -329,10 +325,10 @@ CHIP_ERROR SuppressAlarms(EndpointId ep, BitMask alarmsActive, alarmsSuppressed, alarmsSupported; - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsSupported::Get(ep, &alarmsSupported), attribute_error); + VerifyOrReturnError(Status::Success == AlarmsSupported::Get(ep, &alarmsSupported), attribute_error); VerifyOrReturnError(alarmsSupported.HasAll(alarm), CHIP_IM_GLOBAL_STATUS(ConstraintError)); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsActive::Get(ep, &alarmsActive), attribute_error); + VerifyOrReturnError(Status::Success == AlarmsActive::Get(ep, &alarmsActive), attribute_error); VerifyOrReturnError(alarmsActive.HasAll(alarm), CHIP_IM_GLOBAL_STATUS(InvalidInState)); Delegate * delegate = GetDelegate(ep); @@ -341,9 +337,9 @@ CHIP_ERROR SuppressAlarms(EndpointId ep, BitMaskHandleSuppressAlarm(alarm); } - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsSuppressed::Get(ep, &alarmsSuppressed), attribute_error); + VerifyOrReturnError(Status::Success == AlarmsSuppressed::Get(ep, &alarmsSuppressed), attribute_error); alarmsSuppressed.Set(alarm); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsSuppressed::Set(ep, alarmsSuppressed), attribute_error); + VerifyOrReturnError(Status::Success == AlarmsSuppressed::Set(ep, alarmsSuppressed), attribute_error); emitAlarmsStateChangedEvent(ep); @@ -409,29 +405,29 @@ bool emberAfBooleanStateConfigurationClusterEnableDisableAlarmCallback( uint8_t rawAlarm = static_cast(~alarms.Raw() & 0x03); // 0x03 is the current max bitmap alarmsToDisable = BitMask(rawAlarm); - VerifyOrExit(EMBER_ZCL_STATUS_SUCCESS == AlarmsSupported::Get(ep, &alarmsSupported), status.Emplace(Status::Failure)); + VerifyOrExit(Status::Success == AlarmsSupported::Get(ep, &alarmsSupported), status.Emplace(Status::Failure)); VerifyOrExit(alarmsSupported.HasAll(alarms), status.Emplace(Status::ConstraintError)); - VerifyOrExit(EMBER_ZCL_STATUS_SUCCESS == AlarmsEnabled::Set(ep, alarms), status.Emplace(Status::Failure)); + VerifyOrExit(Status::Success == AlarmsEnabled::Set(ep, alarms), status.Emplace(Status::Failure)); if (!isDelegateNull(delegate)) { delegate->HandleEnableDisableAlarms(alarms); } - VerifyOrExit(EMBER_ZCL_STATUS_SUCCESS == AlarmsActive::Get(ep, &alarmsActive), status.Emplace(Status::Failure)); + VerifyOrExit(Status::Success == AlarmsActive::Get(ep, &alarmsActive), status.Emplace(Status::Failure)); if (alarmsActive.HasAny(alarmsToDisable)) { alarmsActive.Clear(alarmsToDisable); - VerifyOrExit(EMBER_ZCL_STATUS_SUCCESS == AlarmsActive::Set(ep, alarmsActive), status.Emplace(Status::Failure)); + VerifyOrExit(Status::Success == AlarmsActive::Set(ep, alarmsActive), status.Emplace(Status::Failure)); emit = true; } - VerifyOrExit(EMBER_ZCL_STATUS_SUCCESS == AlarmsSuppressed::Get(ep, &alarmsSuppressed), status.Emplace(Status::Failure)); + VerifyOrExit(Status::Success == AlarmsSuppressed::Get(ep, &alarmsSuppressed), status.Emplace(Status::Failure)); if (alarmsSuppressed.HasAny(alarmsToDisable)) { alarmsSuppressed.Clear(alarmsToDisable); - VerifyOrExit(EMBER_ZCL_STATUS_SUCCESS == AlarmsSuppressed::Set(ep, alarmsSuppressed), status.Emplace(Status::Failure)); + VerifyOrExit(Status::Success == AlarmsSuppressed::Set(ep, alarmsSuppressed), status.Emplace(Status::Failure)); emit = true; } diff --git a/src/app/clusters/boolean-state-configuration-server/boolean-state-configuration-server.h b/src/app/clusters/boolean-state-configuration-server/boolean-state-configuration-server.h index 21813208c77249..547096053d04ea 100644 --- a/src/app/clusters/boolean-state-configuration-server/boolean-state-configuration-server.h +++ b/src/app/clusters/boolean-state-configuration-server/boolean-state-configuration-server.h @@ -27,6 +27,7 @@ #include #include #include +#include namespace chip { namespace app { @@ -46,7 +47,7 @@ CHIP_ERROR EmitSensorFault(EndpointId ep, chip::BitMask #include #include -#include + #include #include #include @@ -33,13 +33,15 @@ using namespace chip::app; using namespace chip::app::Clusters; using namespace chip::app::Clusters::BridgedDeviceBasicInformation; +using chip::Protocols::InteractionModel::Status; + namespace { void ReachableChanged(EndpointId endpointId) { MATTER_TRACE_INSTANT("ReachableChanged", "BridgeBasicInfo"); bool reachable = false; - if (EMBER_ZCL_STATUS_SUCCESS != Attributes::Reachable::Get(endpointId, &reachable)) + if (Status::Success != Attributes::Reachable::Get(endpointId, &reachable)) { ChipLogError(Zcl, "ReachabledChanged: Failed to get Reachable value"); } diff --git a/src/app/clusters/color-control-server/color-control-server.cpp b/src/app/clusters/color-control-server/color-control-server.cpp index 941f9d5a5f5842..3e883cf5165e3a 100644 --- a/src/app/clusters/color-control-server/color-control-server.cpp +++ b/src/app/clusters/color-control-server/color-control-server.cpp @@ -109,14 +109,14 @@ class DefaultColorControlSceneHandler : public scenes::DefaultSceneHandlerImpl if (ColorControlServer::Instance().HasFeature(endpoint, ColorControlServer::Feature::kXy)) { uint16_t xValue; - if (EMBER_ZCL_STATUS_SUCCESS != Attributes::CurrentX::Get(endpoint, &xValue)) + if (Status::Success != Attributes::CurrentX::Get(endpoint, &xValue)) { xValue = 0x616B; // Default X value according to spec } AddAttributeValuePair(pairs, Attributes::CurrentX::Id, xValue, attributeCount); uint16_t yValue; - if (EMBER_ZCL_STATUS_SUCCESS != Attributes::CurrentY::Get(endpoint, &yValue)) + if (Status::Success != Attributes::CurrentY::Get(endpoint, &yValue)) { yValue = 0x607D; // Default Y value according to spec } @@ -133,7 +133,7 @@ class DefaultColorControlSceneHandler : public scenes::DefaultSceneHandlerImpl if (ColorControlServer::Instance().HasFeature(endpoint, ColorControlServer::Feature::kHueAndSaturation)) { uint8_t saturationValue; - if (EMBER_ZCL_STATUS_SUCCESS != Attributes::CurrentSaturation::Get(endpoint, &saturationValue)) + if (Status::Success != Attributes::CurrentSaturation::Get(endpoint, &saturationValue)) { saturationValue = 0x00; } @@ -143,21 +143,21 @@ class DefaultColorControlSceneHandler : public scenes::DefaultSceneHandlerImpl if (ColorControlServer::Instance().HasFeature(endpoint, ColorControlServer::Feature::kColorLoop)) { uint8_t loopActiveValue; - if (EMBER_ZCL_STATUS_SUCCESS != Attributes::ColorLoopActive::Get(endpoint, &loopActiveValue)) + if (Status::Success != Attributes::ColorLoopActive::Get(endpoint, &loopActiveValue)) { loopActiveValue = 0x00; } AddAttributeValuePair(pairs, Attributes::ColorLoopActive::Id, loopActiveValue, attributeCount); uint8_t loopDirectionValue; - if (EMBER_ZCL_STATUS_SUCCESS != Attributes::ColorLoopDirection::Get(endpoint, &loopDirectionValue)) + if (Status::Success != Attributes::ColorLoopDirection::Get(endpoint, &loopDirectionValue)) { loopDirectionValue = 0x00; } AddAttributeValuePair(pairs, Attributes::ColorLoopDirection::Id, loopDirectionValue, attributeCount); uint16_t loopTimeValue; - if (EMBER_ZCL_STATUS_SUCCESS != Attributes::ColorLoopTime::Get(endpoint, &loopTimeValue)) + if (Status::Success != Attributes::ColorLoopTime::Get(endpoint, &loopTimeValue)) { loopTimeValue = 0x0019; // Default loop time value according to spec } @@ -167,7 +167,7 @@ class DefaultColorControlSceneHandler : public scenes::DefaultSceneHandlerImpl if (ColorControlServer::Instance().HasFeature(endpoint, ColorControlServer::Feature::kColorTemperature)) { uint16_t temperatureValue; - if (EMBER_ZCL_STATUS_SUCCESS != Attributes::ColorTemperatureMireds::Get(endpoint, &temperatureValue)) + if (Status::Success != Attributes::ColorTemperatureMireds::Get(endpoint, &temperatureValue)) { temperatureValue = 0x00FA; // Default temperature value according to spec } @@ -175,7 +175,7 @@ class DefaultColorControlSceneHandler : public scenes::DefaultSceneHandlerImpl } uint8_t modeValue; - if (EMBER_ZCL_STATUS_SUCCESS != Attributes::EnhancedColorMode::Get(endpoint, &modeValue)) + if (Status::Success != Attributes::EnhancedColorMode::Get(endpoint, &modeValue)) { modeValue = ColorControl::EnhancedColorMode::kCurrentXAndCurrentY; // Default mode value according to spec } @@ -446,7 +446,7 @@ bool ColorControlServer::HasFeature(chip::EndpointId endpoint, Feature feature) { bool success; uint32_t featureMap; - success = (Attributes::FeatureMap::Get(endpoint, &featureMap) == EMBER_ZCL_STATUS_SUCCESS); + success = (Attributes::FeatureMap::Get(endpoint, &featureMap) == Status::Success); return success ? ((featureMap & to_underlying(feature)) != 0) : false; } @@ -2509,11 +2509,11 @@ Status ColorControlServer::moveToColorTemp(EndpointId aEndpoint, uint16_t colorT uint16_t ColorControlServer::getTemperatureCoupleToLevelMin(EndpointId endpoint) { uint16_t colorTemperatureCoupleToLevelMin; - EmberAfStatus status; + Status status; status = Attributes::CoupleColorTempToLevelMinMireds::Get(endpoint, &colorTemperatureCoupleToLevelMin); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { // Not less than the physical min. Attributes::ColorTempPhysicalMinMireds::Get(endpoint, &colorTemperatureCoupleToLevelMin); @@ -2552,14 +2552,14 @@ void ColorControlServer::startUpColorTempCommand(EndpointId endpoint) // Initialize startUpColorTempMireds to "maintain previous value" value null app::DataModel::Nullable startUpColorTemp; - EmberAfStatus status = Attributes::StartUpColorTemperatureMireds::Get(endpoint, startUpColorTemp); + Status status = Attributes::StartUpColorTemperatureMireds::Get(endpoint, startUpColorTemp); - if (status == EMBER_ZCL_STATUS_SUCCESS && !startUpColorTemp.IsNull()) + if (status == Status::Success && !startUpColorTemp.IsNull()) { uint16_t updatedColorTemp = MAX_TEMPERATURE_VALUE; status = Attributes::ColorTemperatureMireds::Get(endpoint, &updatedColorTemp); - if (status == EMBER_ZCL_STATUS_SUCCESS) + if (status == Status::Success) { uint16_t tempPhysicalMin = MIN_TEMPERATURE_VALUE; Attributes::ColorTempPhysicalMinMireds::Get(endpoint, &tempPhysicalMin); @@ -2576,7 +2576,7 @@ void ColorControlServer::startUpColorTempCommand(EndpointId endpoint) updatedColorTemp = startUpColorTemp.Value(); status = Attributes::ColorTemperatureMireds::Set(endpoint, updatedColorTemp); - if (status == EMBER_ZCL_STATUS_SUCCESS) + if (status == Status::Success) { // Set ColorMode attributes to reflect ColorTemperature. uint8_t updateColorMode = ColorControl::EnhancedColorMode::kColorTemperature; @@ -2607,7 +2607,7 @@ void ColorControlServer::updateTempCommand(EndpointId endpoint) // Check whether our color temperature has actually changed. If not, do // nothing, and wait for it to change. uint16_t currentColorTemp; - if (Attributes::ColorTemperatureMireds::Get(endpoint, ¤tColorTemp) != EMBER_ZCL_STATUS_SUCCESS) + if (Attributes::ColorTemperatureMireds::Get(endpoint, ¤tColorTemp) != Status::Success) { // Why can't we read our attribute? return; @@ -2906,9 +2906,9 @@ void ColorControlServer::levelControlColorTempChangeCommand(EndpointId endpoint) if (colorMode == ColorControl::EnhancedColorMode::kColorTemperature) { app::DataModel::Nullable currentLevel; - EmberAfStatus status = LevelControl::Attributes::CurrentLevel::Get(endpoint, currentLevel); + Status status = LevelControl::Attributes::CurrentLevel::Get(endpoint, currentLevel); - if (status != EMBER_ZCL_STATUS_SUCCESS || currentLevel.IsNull()) + if (status != Status::Success || currentLevel.IsNull()) { currentLevel.SetNonNull((uint8_t) 0x7F); } diff --git a/src/app/clusters/device-energy-management-server/device-energy-management-server.h b/src/app/clusters/device-energy-management-server/device-energy-management-server.h index 3620379d4ed8e2..7aeb06da661cd1 100644 --- a/src/app/clusters/device-energy-management-server/device-energy-management-server.h +++ b/src/app/clusters/device-energy-management-server/device-energy-management-server.h @@ -27,6 +27,7 @@ #include #include #include +#include namespace chip { namespace app { @@ -35,8 +36,6 @@ namespace DeviceEnergyManagement { using namespace chip::app::Clusters::DeviceEnergyManagement::Attributes; -using chip::Protocols::InteractionModel::Status; - class Delegate { public: @@ -52,7 +51,8 @@ class Delegate * @param duration The duration that the ESA SHALL maintain the requested power for. * @return Success if the adjustment is accepted; otherwise the command SHALL be rejected with appropriate error. */ - virtual Status PowerAdjustRequest(const int64_t power, const uint32_t duration, AdjustmentCauseEnum cause) = 0; + virtual Protocols::InteractionModel::Status PowerAdjustRequest(const int64_t power, const uint32_t duration, + AdjustmentCauseEnum cause) = 0; /** * @brief Delegate SHALL make the ESA end the active power adjustment session & return to normal (or idle) power levels. @@ -60,7 +60,7 @@ class Delegate * * @return It should report SUCCESS if successful and FAILURE otherwise. */ - virtual Status CancelPowerAdjustRequest() = 0; + virtual Protocols::InteractionModel::Status CancelPowerAdjustRequest() = 0; /** * @brief Delegate for the ESA SHALL update its Forecast attribute with the RequestedStartTime including a new ForecastId. @@ -76,7 +76,8 @@ class Delegate * @return Success if the StartTime in the Forecast is updated, otherwise the command SHALL be rejected with appropriate * IM_Status. */ - virtual Status StartTimeAdjustRequest(const uint32_t requestedStartTime, AdjustmentCauseEnum cause) = 0; + virtual Protocols::InteractionModel::Status StartTimeAdjustRequest(const uint32_t requestedStartTime, + AdjustmentCauseEnum cause) = 0; /** * @brief Delegate handler for PauseRequest command @@ -91,7 +92,7 @@ class Delegate * @param duration Duration that the ESA SHALL be paused for. * @return Success if the ESA is paused, otherwise returns other IM_Status. */ - virtual Status PauseRequest(const uint32_t duration, AdjustmentCauseEnum cause) = 0; + virtual Protocols::InteractionModel::Status PauseRequest(const uint32_t duration, AdjustmentCauseEnum cause) = 0; /** * @brief Delegate handler for ResumeRequest command @@ -102,7 +103,7 @@ class Delegate * * @return Success if the ESA is resumed, otherwise returns other IM_Status. */ - virtual Status ResumeRequest() = 0; + virtual Protocols::InteractionModel::Status ResumeRequest() = 0; /** * @brief Delegate handler for ModifyForecastRequest @@ -118,9 +119,10 @@ class Delegate * @return Success if the entire list of SlotAdjustmentStruct are accepted, otherwise the command * SHALL be rejected returning other IM_Status. */ - virtual Status ModifyForecastRequest(const uint32_t forecastId, - const DataModel::DecodableList & slotAdjustments, - AdjustmentCauseEnum cause) = 0; + virtual Protocols::InteractionModel::Status + ModifyForecastRequest(const uint32_t forecastId, + const DataModel::DecodableList & slotAdjustments, + AdjustmentCauseEnum cause) = 0; /** * @brief Delegate handler for RequestConstraintBasedForecast @@ -133,8 +135,9 @@ class Delegate * @param constraints Sequence of turn up/down power requests that the ESA is being asked to constrain its operation within. * @return Success if successful, otherwise the command SHALL be rejected returning other IM_Status. */ - virtual Status RequestConstraintBasedForecast(const DataModel::DecodableList & constraints, - AdjustmentCauseEnum cause) = 0; + virtual Protocols::InteractionModel::Status + RequestConstraintBasedForecast(const DataModel::DecodableList & constraints, + AdjustmentCauseEnum cause) = 0; /** * @brief Delegate handler for CancelRequest @@ -153,7 +156,7 @@ class Delegate * * @return Success if successful, otherwise the command SHALL be rejected returning other IM_Status. */ - virtual Status CancelRequest() = 0; + virtual Protocols::InteractionModel::Status CancelRequest() = 0; // ------------------------------------------------------------------ // Get attribute methods @@ -210,7 +213,7 @@ class Instance : public AttributeAccessInterface, public CommandHandlerInterface void InvokeCommand(HandlerContext & handlerContext) override; CHIP_ERROR EnumerateAcceptedCommands(const ConcreteClusterPath & cluster, CommandIdCallback callback, void * context) override; - Status CheckOptOutAllowsRequest(AdjustmentCauseEnum adjustmentCause); + Protocols::InteractionModel::Status CheckOptOutAllowsRequest(AdjustmentCauseEnum adjustmentCause); void HandlePowerAdjustRequest(HandlerContext & ctx, const Commands::PowerAdjustRequest::DecodableType & commandData); void HandleCancelPowerAdjustRequest(HandlerContext & ctx, const Commands::CancelPowerAdjustRequest::DecodableType & commandData); diff --git a/src/app/clusters/dishwasher-alarm-server/dishwasher-alarm-server.cpp b/src/app/clusters/dishwasher-alarm-server/dishwasher-alarm-server.cpp index aaed13bbded7e4..40321f8c53297c 100644 --- a/src/app/clusters/dishwasher-alarm-server/dishwasher-alarm-server.cpp +++ b/src/app/clusters/dishwasher-alarm-server/dishwasher-alarm-server.cpp @@ -23,7 +23,6 @@ #include #include #include -#include #include using namespace chip; @@ -77,67 +76,67 @@ DishwasherAlarmServer & DishwasherAlarmServer::Instance() return instance; } -EmberAfStatus DishwasherAlarmServer::GetMaskValue(EndpointId endpoint, BitMask * mask) +Status DishwasherAlarmServer::GetMaskValue(EndpointId endpoint, BitMask * mask) { - EmberAfStatus status = Attributes::Mask::Get(endpoint, mask); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = Attributes::Mask::Get(endpoint, mask); + if (status != Status::Success) { - ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: reading mask, err:0x%x", status); + ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: reading mask, err:0x%x", to_underlying(status)); return status; } return status; } -EmberAfStatus DishwasherAlarmServer::GetLatchValue(EndpointId endpoint, BitMask * latch) +Status DishwasherAlarmServer::GetLatchValue(EndpointId endpoint, BitMask * latch) { if (!HasResetFeature(endpoint)) { ChipLogProgress(Zcl, "Dishwasher Alarm feature: Unsupport Latch attribute"); - return EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE; + return Status::UnsupportedAttribute; } - EmberAfStatus status = Attributes::Latch::Get(endpoint, latch); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = Attributes::Latch::Get(endpoint, latch); + if (status != Status::Success) { - ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: reading latch, err:0x%x", status); + ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: reading latch, err:0x%x", to_underlying(status)); return status; } return status; } -EmberAfStatus DishwasherAlarmServer::GetStateValue(EndpointId endpoint, BitMask * state) +Status DishwasherAlarmServer::GetStateValue(EndpointId endpoint, BitMask * state) { - EmberAfStatus status = Attributes::State::Get(endpoint, state); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = Attributes::State::Get(endpoint, state); + if (status != Status::Success) { - ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: get state, err:0x%x", status); + ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: get state, err:0x%x", to_underlying(status)); return status; } return status; } -EmberAfStatus DishwasherAlarmServer::GetSupportedValue(EndpointId endpoint, BitMask * supported) +Status DishwasherAlarmServer::GetSupportedValue(EndpointId endpoint, BitMask * supported) { - EmberAfStatus status = Attributes::Supported::Get(endpoint, supported); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = Attributes::Supported::Get(endpoint, supported); + if (status != Status::Success) { - ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: reading supported, err:0x%x", status); + ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: reading supported, err:0x%x", to_underlying(status)); } return status; } -EmberAfStatus DishwasherAlarmServer::SetSupportedValue(EndpointId endpoint, const BitMask supported) +Status DishwasherAlarmServer::SetSupportedValue(EndpointId endpoint, const BitMask supported) { - EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; + Status status = Status::Success; ; - if ((status = Attributes::Supported::Set(endpoint, supported)) != EMBER_ZCL_STATUS_SUCCESS) + if ((status = Attributes::Supported::Set(endpoint, supported)) != Status::Success) { - ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: writing supported, err:0x%x", status); + ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: writing supported, err:0x%x", to_underlying(status)); return status; } // Whenever there is change in Supported attribute, Latch should change accordingly (if possible). BitMask latch; - if (GetLatchValue(endpoint, &latch) == EMBER_ZCL_STATUS_SUCCESS && !supported.HasAll(latch)) + if (GetLatchValue(endpoint, &latch) == Status::Success && !supported.HasAll(latch)) { latch = latch & supported; status = SetLatchValue(endpoint, latch); @@ -145,7 +144,7 @@ EmberAfStatus DishwasherAlarmServer::SetSupportedValue(EndpointId endpoint, cons // Whenever there is change in Supported attribute, Mask, State should change accordingly. BitMask mask; - if ((status = GetMaskValue(endpoint, &mask)) != EMBER_ZCL_STATUS_SUCCESS) + if ((status = GetMaskValue(endpoint, &mask)) != Status::Success) { return status; } @@ -158,26 +157,26 @@ EmberAfStatus DishwasherAlarmServer::SetSupportedValue(EndpointId endpoint, cons return status; } -EmberAfStatus DishwasherAlarmServer::SetMaskValue(EndpointId endpoint, const BitMask mask) +Status DishwasherAlarmServer::SetMaskValue(EndpointId endpoint, const BitMask mask) { BitMask supported; - if (GetSupportedValue(endpoint, &supported) || !supported.HasAll(mask)) + if (Status::Success != GetSupportedValue(endpoint, &supported) || !supported.HasAll(mask)) { ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: Mask is not supported"); - return EMBER_ZCL_STATUS_FAILURE; + return Status::Failure; } - EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; - if ((status = Attributes::Mask::Set(endpoint, mask)) != EMBER_ZCL_STATUS_SUCCESS) + Status status = Status::Success; + if ((status = Attributes::Mask::Set(endpoint, mask)) != Status::Success) { - ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: writing mask, err:0x%x", status); + ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: writing mask, err:0x%x", to_underlying(status)); return status; } // Whenever there is change in Mask, State should change accordingly. BitMask state; status = GetStateValue(endpoint, &state); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { return status; } @@ -190,61 +189,61 @@ EmberAfStatus DishwasherAlarmServer::SetMaskValue(EndpointId endpoint, const Bit return status; } -EmberAfStatus DishwasherAlarmServer::SetLatchValue(EndpointId endpoint, const BitMask latch) +Status DishwasherAlarmServer::SetLatchValue(EndpointId endpoint, const BitMask latch) { if (!HasResetFeature(endpoint)) { ChipLogProgress(Zcl, "Dishwasher Alarm feature: Unsupport Latch attribute"); - return EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE; + return Status::UnsupportedAttribute; } BitMask supported; - if (GetSupportedValue(endpoint, &supported) || !supported.HasAll(latch)) + if (Status::Success != GetSupportedValue(endpoint, &supported) || !supported.HasAll(latch)) { ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: Latch is not supported"); - return EMBER_ZCL_STATUS_FAILURE; + return Status::Failure; } - EmberAfStatus status = Attributes::Latch::Set(endpoint, latch); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = Attributes::Latch::Set(endpoint, latch); + if (status != Status::Success) { - ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: writing latch, err:0x%x", status); + ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: writing latch, err:0x%x", to_underlying(status)); return status; } return status; } -EmberAfStatus DishwasherAlarmServer::SetStateValue(EndpointId endpoint, const BitMask newState, bool ignoreLatchState) +Status DishwasherAlarmServer::SetStateValue(EndpointId endpoint, const BitMask newState, bool ignoreLatchState) { BitMask supported; BitMask finalNewState; finalNewState.Set(newState); - if (GetSupportedValue(endpoint, &supported) || !supported.HasAll(finalNewState)) + if (Status::Success != GetSupportedValue(endpoint, &supported) || !supported.HasAll(finalNewState)) { ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: Alarm is not supported"); - return EMBER_ZCL_STATUS_FAILURE; + return Status::Failure; } BitMask mask; - if (GetMaskValue(endpoint, &mask) || !mask.HasAll(finalNewState)) + if (Status::Success != GetMaskValue(endpoint, &mask) || !mask.HasAll(finalNewState)) { ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: Alarm is suppressed"); - return EMBER_ZCL_STATUS_FAILURE; + return Status::Failure; } - EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; + Status status = Status::Success; BitMask currentState; status = Attributes::State::Get(endpoint, ¤tState); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: reading state, err:0x%x", status); + ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: reading state, err:0x%x", to_underlying(status)); return status; } BitMask latch; - if (!ignoreLatchState && (GetLatchValue(endpoint, &latch) == EMBER_ZCL_STATUS_SUCCESS)) + if (!ignoreLatchState && (GetLatchValue(endpoint, &latch) == Status::Success)) { // Restore bits that have their Latch bit set. auto bitsToKeep = latch & currentState; @@ -253,9 +252,9 @@ EmberAfStatus DishwasherAlarmServer::SetStateValue(EndpointId endpoint, const Bi // Store the new value of the State attribute. status = Attributes::State::Set(endpoint, finalNewState); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: writing state, err:0x%x", status); + ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: writing state, err:0x%x", to_underlying(status)); return status; } @@ -269,19 +268,19 @@ EmberAfStatus DishwasherAlarmServer::SetStateValue(EndpointId endpoint, const Bi return status; } -EmberAfStatus DishwasherAlarmServer::ResetLatchedAlarms(EndpointId endpoint, const BitMask alarms) +Status DishwasherAlarmServer::ResetLatchedAlarms(EndpointId endpoint, const BitMask alarms) { BitMask supported; - if (GetSupportedValue(endpoint, &supported) || !supported.HasAll(alarms)) + if (Status::Success != GetSupportedValue(endpoint, &supported) || !supported.HasAll(alarms)) { ChipLogProgress(Zcl, "Dishwasher Alarm: ERR: Alarm is not supported"); - return EMBER_ZCL_STATUS_FAILURE; + return Status::Failure; } BitMask state; - if (GetStateValue(endpoint, &state) != EMBER_ZCL_STATUS_SUCCESS) + if (GetStateValue(endpoint, &state) != Status::Success) { - return EMBER_ZCL_STATUS_FAILURE; + return Status::Failure; } state.Clear(alarms); @@ -291,7 +290,7 @@ EmberAfStatus DishwasherAlarmServer::ResetLatchedAlarms(EndpointId endpoint, con bool DishwasherAlarmServer::HasResetFeature(EndpointId endpoint) { uint32_t featureMap = 0; - if (Attributes::FeatureMap::Get(endpoint, &featureMap) != EMBER_ZCL_STATUS_SUCCESS) + if (Attributes::FeatureMap::Get(endpoint, &featureMap) != Status::Success) { return false; } @@ -320,7 +319,7 @@ static Status ModifyEnabledHandler(const app::ConcreteCommandPath & commandPath, EndpointId endpoint = commandPath.mEndpointId; BitMask supported; - if (DishwasherAlarmServer::Instance().GetSupportedValue(endpoint, &supported) != EMBER_ZCL_STATUS_SUCCESS) + if (DishwasherAlarmServer::Instance().GetSupportedValue(endpoint, &supported) != Status::Success) { return Status::Failure; } @@ -341,7 +340,7 @@ static Status ModifyEnabledHandler(const app::ConcreteCommandPath & commandPath, return Status::Failure; } // The cluster will do this update if delegate.ModifyEnabledAlarmsCallback() returns true. - if (DishwasherAlarmServer::Instance().SetMaskValue(endpoint, mask) != EMBER_ZCL_STATUS_SUCCESS) + if (DishwasherAlarmServer::Instance().SetMaskValue(endpoint, mask) != Status::Success) { return Status::Failure; } @@ -355,7 +354,7 @@ static Status ResetHandler(const app::ConcreteCommandPath & commandPath, const B if (!DishwasherAlarmServer::Instance().HasResetFeature(endpoint)) { ChipLogProgress(Zcl, "Dishwasher Alarm feature: Unsupport Reset Command"); - return app::ToInteractionModelStatus(EMBER_ZCL_STATUS_UNSUPPORTED_COMMAND); + return Status::UnsupportedCommand; } // A server that is unable to reset alarms SHALL respond with a status code of FAILURE @@ -367,7 +366,7 @@ static Status ResetHandler(const app::ConcreteCommandPath & commandPath, const B } // The cluster will do this update if delegate.ResetAlarmsCallback() returns true. - if (DishwasherAlarmServer::Instance().ResetLatchedAlarms(endpoint, alarms) != EMBER_ZCL_STATUS_SUCCESS) + if (DishwasherAlarmServer::Instance().ResetLatchedAlarms(endpoint, alarms) != Status::Success) { ChipLogProgress(Zcl, "reset alarms fail"); return Status::Failure; diff --git a/src/app/clusters/dishwasher-alarm-server/dishwasher-alarm-server.h b/src/app/clusters/dishwasher-alarm-server/dishwasher-alarm-server.h index d03662f29333fd..5aff983ca6e84f 100644 --- a/src/app/clusters/dishwasher-alarm-server/dishwasher-alarm-server.h +++ b/src/app/clusters/dishwasher-alarm-server/dishwasher-alarm-server.h @@ -24,6 +24,7 @@ #include #include #include +#include namespace chip { namespace app { @@ -35,16 +36,16 @@ class DishwasherAlarmServer public: static DishwasherAlarmServer & Instance(); - EmberAfStatus GetMaskValue(EndpointId endpoint, BitMask * mask); - EmberAfStatus GetStateValue(EndpointId endpoint, BitMask * state); - EmberAfStatus GetLatchValue(EndpointId endpoint, BitMask * latch); - EmberAfStatus GetSupportedValue(EndpointId endpoint, BitMask * suppported); + Protocols::InteractionModel::Status GetMaskValue(EndpointId endpoint, BitMask * mask); + Protocols::InteractionModel::Status GetStateValue(EndpointId endpoint, BitMask * state); + Protocols::InteractionModel::Status GetLatchValue(EndpointId endpoint, BitMask * latch); + Protocols::InteractionModel::Status GetSupportedValue(EndpointId endpoint, BitMask * suppported); // Whenever there is change on Mask we should change State accordingly. - EmberAfStatus SetMaskValue(EndpointId endpoint, const BitMask mask); - EmberAfStatus SetLatchValue(EndpointId endpoint, const BitMask latch); + Protocols::InteractionModel::Status SetMaskValue(EndpointId endpoint, const BitMask mask); + Protocols::InteractionModel::Status SetLatchValue(EndpointId endpoint, const BitMask latch); // A change in supported value will result in a corresponding change in mask and state. - EmberAfStatus SetSupportedValue(EndpointId endpoint, const BitMask supported); + Protocols::InteractionModel::Status SetSupportedValue(EndpointId endpoint, const BitMask supported); /** * @brief Set the value of the State attribute @@ -60,7 +61,8 @@ class DishwasherAlarmServer * honoring the Mask and Supported attributes. * The default value for the ignoreLatchState parameter is false. */ - EmberAfStatus SetStateValue(EndpointId endpoint, const BitMask newState, bool ignoreLatchState = false); + Protocols::InteractionModel::Status SetStateValue(EndpointId endpoint, const BitMask newState, + bool ignoreLatchState = false); /** * @brief Reset the value of latched alarms in the State attribute. @@ -69,7 +71,7 @@ class DishwasherAlarmServer * @param[in] alarms Each bit set to a 1 in this parameter corresponds to a bit in the * State attribute will SHALL be reset to false. */ - EmberAfStatus ResetLatchedAlarms(EndpointId endpoint, const BitMask alarms); + Protocols::InteractionModel::Status ResetLatchedAlarms(EndpointId endpoint, const BitMask alarms); // check whether the Alarm featureMap has enabled Reset feature. bool HasResetFeature(EndpointId endpoint); diff --git a/src/app/clusters/door-lock-server/door-lock-server.cpp b/src/app/clusters/door-lock-server/door-lock-server.cpp index fe7bfa76b5e8ef..c049e34ba0cec2 100644 --- a/src/app/clusters/door-lock-server/door-lock-server.cpp +++ b/src/app/clusters/door-lock-server/door-lock-server.cpp @@ -29,7 +29,6 @@ #include #include #include -#include #include #include @@ -42,6 +41,7 @@ using namespace chip::app; using namespace chip::app::DataModel; using namespace chip::app::Clusters::DoorLock; using namespace chip::app::Clusters::DoorLock::Attributes; +using chip::Protocols::InteractionModel::ClusterStatusCode; using chip::Protocols::InteractionModel::Status; static constexpr uint8_t DOOR_LOCK_SCHEDULE_MAX_HOUR = 23; @@ -121,9 +121,9 @@ void DoorLockServer::InitServer(chip::EndpointId endpointId) ChipLogProgress(Zcl, "Door Lock cluster initialized at endpoint #%u", endpointId); auto status = Attributes::LockState::SetNull(endpointId); - if (EMBER_ZCL_STATUS_SUCCESS != status) + if (Status::Success != status) { - ChipLogError(Zcl, "[InitDoorLockServer] Unable to set the Lock State attribute to null [status=%d]", status); + ChipLogError(Zcl, "[InitDoorLockServer] Unable to set the Lock State attribute to null [status=%d]", to_underlying(status)); } SetActuatorEnabled(endpointId, true); @@ -261,7 +261,7 @@ bool DoorLockServer::HandleWrongCodeEntry(chip::EndpointId endpointId) uint8_t wrongCodeEntryLimit = 0xFF; auto status = Attributes::WrongCodeEntryLimit::Get(endpointId, &wrongCodeEntryLimit); - if (EMBER_ZCL_STATUS_SUCCESS == status) + if (Status::Success == status) { if (++endpointContext->wrongCodeEntryAttempts >= wrongCodeEntryLimit) { @@ -270,7 +270,7 @@ bool DoorLockServer::HandleWrongCodeEntry(chip::EndpointId endpointId) engageLockout(endpointId); } } - else if (EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE != status) + else if (Status::UnsupportedAttribute != status) { ChipLogError(Zcl, "Failed to read Wrong Code Entry Limit attribute, status=0x%x", to_underlying(status)); return false; @@ -301,11 +301,11 @@ bool DoorLockServer::engageLockout(chip::EndpointId endpointId) } auto status = Attributes::UserCodeTemporaryDisableTime::Get(endpointId, &lockoutTimeout); - if (EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE == status) + if (Status::UnsupportedAttribute == status) { return false; } - if (EMBER_ZCL_STATUS_SUCCESS != status) + if (Status::Success != status) { ChipLogError(Zcl, "Unable to read the UserCodeTemporaryDisableTime attribute [status=%d]", to_underlying(status)); return false; @@ -402,7 +402,7 @@ void DoorLockServer::setUserCommandHandler(chip::app::CommandHandler * commandOb if (!SupportsUSR(commandPath.mEndpointId)) { ChipLogProgress(Zcl, "[SetUser] User management is not supported [endpointId=%d]", commandPath.mEndpointId); - sendClusterResponse(commandObj, commandPath, EMBER_ZCL_STATUS_UNSUPPORTED_COMMAND); + sendClusterResponse(commandObj, commandPath, ClusterStatusCode(Status::UnsupportedCommand)); return; } @@ -411,7 +411,7 @@ void DoorLockServer::setUserCommandHandler(chip::app::CommandHandler * commandOb { ChipLogError(Zcl, "[SetUser] Unable to get the fabric IDX [endpointId=%d,userIndex=%d]", commandPath.mEndpointId, userIndex); - sendClusterResponse(commandObj, commandPath, EMBER_ZCL_STATUS_FAILURE); + sendClusterResponse(commandObj, commandPath, ClusterStatusCode(Status::Failure)); return; } @@ -420,7 +420,7 @@ void DoorLockServer::setUserCommandHandler(chip::app::CommandHandler * commandOb { ChipLogError(Zcl, "[SetUser] Unable to get the source node index [endpointId=%d,userIndex=%d]", commandPath.mEndpointId, userIndex); - sendClusterResponse(commandObj, commandPath, EMBER_ZCL_STATUS_FAILURE); + sendClusterResponse(commandObj, commandPath, ClusterStatusCode(Status::Failure)); return; } @@ -434,7 +434,7 @@ void DoorLockServer::setUserCommandHandler(chip::app::CommandHandler * commandOb if (!userIndexValid(commandPath.mEndpointId, userIndex)) { ChipLogProgress(Zcl, "[SetUser] User index out of bounds [endpointId=%d,userIndex=%d]", commandPath.mEndpointId, userIndex); - sendClusterResponse(commandObj, commandPath, EMBER_ZCL_STATUS_INVALID_COMMAND); + sendClusterResponse(commandObj, commandPath, ClusterStatusCode(Status::InvalidCommand)); return; } @@ -444,7 +444,7 @@ void DoorLockServer::setUserCommandHandler(chip::app::CommandHandler * commandOb ChipLogProgress(Zcl, "[SetUser] Unable to set user: userName too long [endpointId=%d,userIndex=%d,userNameSize=%u]", commandPath.mEndpointId, userIndex, static_cast(userName.Value().size())); - sendClusterResponse(commandObj, commandPath, EMBER_ZCL_STATUS_INVALID_COMMAND); + sendClusterResponse(commandObj, commandPath, ClusterStatusCode(Status::InvalidCommand)); return; } @@ -454,7 +454,7 @@ void DoorLockServer::setUserCommandHandler(chip::app::CommandHandler * commandOb "[SetUser] Unable to set the user: user status is out of range [endpointId=%d,userIndex=%d,userStatus=%u]", commandPath.mEndpointId, userIndex, to_underlying(userStatus.Value())); - sendClusterResponse(commandObj, commandPath, EMBER_ZCL_STATUS_INVALID_COMMAND); + sendClusterResponse(commandObj, commandPath, ClusterStatusCode(Status::InvalidCommand)); return; } @@ -463,11 +463,11 @@ void DoorLockServer::setUserCommandHandler(chip::app::CommandHandler * commandOb ChipLogProgress(Zcl, "[SetUser] Unable to set the user: user type is unknown [endpointId=%d,userIndex=%d,userType=%u]", commandPath.mEndpointId, userIndex, to_underlying(userType.Value())); - sendClusterResponse(commandObj, commandPath, EMBER_ZCL_STATUS_INVALID_COMMAND); + sendClusterResponse(commandObj, commandPath, ClusterStatusCode(Status::InvalidCommand)); return; } - EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; + ClusterStatusCode status(Status::Success); switch (operationType) { case DataOperationTypeEnum::kAdd: @@ -475,14 +475,14 @@ void DoorLockServer::setUserCommandHandler(chip::app::CommandHandler * commandOb userType, credentialRule); break; case DataOperationTypeEnum::kModify: - status = modifyUser(commandPath.mEndpointId, fabricIdx, sourceNodeId, userIndex, userName, userUniqueId, userStatus, - userType, credentialRule); + status = ClusterStatusCode(modifyUser(commandPath.mEndpointId, fabricIdx, sourceNodeId, userIndex, userName, userUniqueId, + userStatus, userType, credentialRule)); break; case DataOperationTypeEnum::kClear: default: // appclusters, 5.2.4.34: SetUser command allow only kAdd/kModify, we should respond with INVALID_COMMAND if we got kClear // or anything else - status = EMBER_ZCL_STATUS_INVALID_COMMAND; + status = ClusterStatusCode(Status::InvalidCommand); ChipLogProgress(Zcl, "[SetUser] Invalid operation type [endpointId=%d,operationType=%u]", commandPath.mEndpointId, to_underlying(operationType)); break; @@ -1874,25 +1874,25 @@ bool DoorLockServer::findUserIndexByCredential(chip::EndpointId endpointId, Cred return false; } -EmberAfStatus DoorLockServer::createUser(chip::EndpointId endpointId, chip::FabricIndex creatorFabricIdx, chip::NodeId sourceNodeId, - uint16_t userIndex, const Nullable & userName, - const Nullable & userUniqueId, const Nullable & userStatus, - const Nullable & userType, - const Nullable & credentialRule, - const Nullable & credential) +ClusterStatusCode DoorLockServer::createUser(chip::EndpointId endpointId, chip::FabricIndex creatorFabricIdx, + chip::NodeId sourceNodeId, uint16_t userIndex, + const Nullable & userName, const Nullable & userUniqueId, + const Nullable & userStatus, const Nullable & userType, + const Nullable & credentialRule, + const Nullable & credential) { EmberAfPluginDoorLockUserInfo user; if (!emberAfPluginDoorLockGetUser(endpointId, userIndex, user)) { ChipLogError(Zcl, "[createUser] Unable to get the user from app [endpointId=%d,userIndex=%d]", endpointId, userIndex); - return EMBER_ZCL_STATUS_FAILURE; + return ClusterStatusCode(Status::Failure); } // appclusters, 5.2.4.34: to modify user its status should be set to Available. If it is we should return OCCUPIED. if (UserStatusEnum::kAvailable != user.userStatus) { ChipLogProgress(Zcl, "[createUser] Unable to overwrite existing user [endpointId=%d,userIndex=%d]", endpointId, userIndex); - return static_cast(DlStatus::kOccupied); + return ClusterStatusCode::ClusterSpecificFailure(DlStatus::kOccupied); } const auto & newUserName = !userName.IsNull() ? userName.Value() : ""_span; @@ -1918,7 +1918,7 @@ EmberAfStatus DoorLockServer::createUser(chip::EndpointId endpointId, chip::Fabr endpointId, creatorFabricIdx, userIndex, static_cast(newUserName.size()), newUserName.data(), newUserUniqueId, to_underlying(newUserStatus), to_underlying(newUserType), to_underlying(newCredentialRule), static_cast(newTotalCredentials)); - return EMBER_ZCL_STATUS_FAILURE; + return ClusterStatusCode(Status::Failure); } ChipLogProgress(Zcl, @@ -1932,28 +1932,27 @@ EmberAfStatus DoorLockServer::createUser(chip::EndpointId endpointId, chip::Fabr sendRemoteLockUserChange(endpointId, LockDataTypeEnum::kUserIndex, DataOperationTypeEnum::kAdd, sourceNodeId, creatorFabricIdx, userIndex, userIndex); - return EMBER_ZCL_STATUS_SUCCESS; + return ClusterStatusCode(Status::Success); } -EmberAfStatus DoorLockServer::modifyUser(chip::EndpointId endpointId, chip::FabricIndex modifierFabricIndex, - chip::NodeId sourceNodeId, uint16_t userIndex, const Nullable & userName, - const Nullable & userUniqueId, const Nullable & userStatus, - const Nullable & userType, - const Nullable & credentialRule) +Status DoorLockServer::modifyUser(chip::EndpointId endpointId, chip::FabricIndex modifierFabricIndex, chip::NodeId sourceNodeId, + uint16_t userIndex, const Nullable & userName, + const Nullable & userUniqueId, const Nullable & userStatus, + const Nullable & userType, const Nullable & credentialRule) { // We should get the user by that index first EmberAfPluginDoorLockUserInfo user; if (!emberAfPluginDoorLockGetUser(endpointId, userIndex, user)) { ChipLogError(Zcl, "[modifyUser] Unable to get the user from app [endpointId=%d,userIndex=%d]", endpointId, userIndex); - return EMBER_ZCL_STATUS_FAILURE; + return Status::Failure; } // appclusters, 5.2.4.34: to modify user its status should NOT be set to Available. If it is we should return INVALID_COMMAND. if (UserStatusEnum::kAvailable == user.userStatus) { ChipLogProgress(Zcl, "[modifyUser] Unable to modify non-existing user [endpointId=%d,userIndex=%d]", endpointId, userIndex); - return EMBER_ZCL_STATUS_INVALID_COMMAND; + return Status::InvalidCommand; } // appclusters, 5.2.4.34: UserName SHALL be null if modifying a user record that was not created by the accessing fabric @@ -1963,7 +1962,7 @@ EmberAfStatus DoorLockServer::modifyUser(chip::EndpointId endpointId, chip::Fabr "[modifyUser] Unable to modify name of user created by different fabric " "[endpointId=%d,userIndex=%d,creatorIdx=%d,modifierIdx=%d]", endpointId, userIndex, user.createdBy, modifierFabricIndex); - return EMBER_ZCL_STATUS_INVALID_COMMAND; + return Status::InvalidCommand; } // appclusters, 5.2.4.34: UserUniqueID SHALL be null if modifying the user record that was not created by the accessing fabric. @@ -1973,7 +1972,7 @@ EmberAfStatus DoorLockServer::modifyUser(chip::EndpointId endpointId, chip::Fabr "[modifyUser] Unable to modify UUID of user created by different fabric " "[endpointId=%d,userIndex=%d,creatorIdx=%d,modifierIdx=%d]", endpointId, userIndex, user.createdBy, modifierFabricIndex); - return EMBER_ZCL_STATUS_INVALID_COMMAND; + return Status::InvalidCommand; } const auto & newUserName = !userName.IsNull() ? userName.Value() : user.userName; @@ -1992,7 +1991,7 @@ EmberAfStatus DoorLockServer::modifyUser(chip::EndpointId endpointId, chip::Fabr ",userType=%u,credentialRule=%u]", endpointId, modifierFabricIndex, userIndex, static_cast(newUserName.size()), newUserName.data(), newUserUniqueId, to_underlying(newUserStatus), to_underlying(newUserType), to_underlying(newCredentialRule)); - return EMBER_ZCL_STATUS_FAILURE; + return Status::Failure; } ChipLogProgress(Zcl, @@ -2005,7 +2004,7 @@ EmberAfStatus DoorLockServer::modifyUser(chip::EndpointId endpointId, chip::Fabr sendRemoteLockUserChange(endpointId, LockDataTypeEnum::kUserIndex, DataOperationTypeEnum::kModify, sourceNodeId, modifierFabricIndex, userIndex, userIndex); - return EMBER_ZCL_STATUS_SUCCESS; + return Status::Success; } Status DoorLockServer::clearUser(chip::EndpointId endpointId, chip::FabricIndex modifierFabricId, chip::NodeId sourceNodeId, @@ -2130,15 +2129,17 @@ DlStatus DoorLockServer::createNewCredentialAndUser(chip::EndpointId endpointId, return DlStatus::kOccupied; } - auto status = + ClusterStatusCode status = createUser(endpointId, creatorFabricIdx, sourceNodeId, availableUserIndex, Nullable(), Nullable(), userStatus, userType, Nullable(), Nullable(credential)); - if (EMBER_ZCL_STATUS_SUCCESS != status) + if (!status.IsSuccess()) { ChipLogProgress(Zcl, "[SetCredential] Unable to create new user for credential: internal error " "[endpointId=%d,credentialIndex=%d,userIndex=%d,status=%d]", - endpointId, credential.credentialIndex, availableUserIndex, status); + endpointId, credential.credentialIndex, availableUserIndex, + status.HasClusterSpecificCode() ? status.GetClusterSpecificCode().Value() + : (to_underlying(status.GetStatus()))); return DlStatus::kFailure; } @@ -3407,18 +3408,17 @@ bool DoorLockServer::RemoteOperationEnabled(chip::EndpointId endpointId) const } void DoorLockServer::sendClusterResponse(chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath, - EmberAfStatus status) + ClusterStatusCode status) { VerifyOrDie(nullptr != commandObj); - auto statusAsInteger = to_underlying(status); - if (statusAsInteger == to_underlying(DlStatus::kOccupied) || statusAsInteger == to_underlying(DlStatus::kDuplicate)) + if (status.HasClusterSpecificCode()) { - VerifyOrDie(commandObj->AddClusterSpecificFailure(commandPath, static_cast(status)) == CHIP_NO_ERROR); + VerifyOrDie(commandObj->AddClusterSpecificFailure(commandPath, status.GetClusterSpecificCode().Value()) == CHIP_NO_ERROR); } else { - commandObj->AddStatus(commandPath, ToInteractionModelStatus(status)); + commandObj->AddStatus(commandPath, status.GetStatus()); } } @@ -3515,7 +3515,7 @@ bool DoorLockServer::HandleRemoteLockOperation(chip::app::CommandHandler * comma { auto status = Attributes::RequirePINforRemoteOperation::Get(endpoint, &requirePin); VerifyOrExit( - EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE == status || EMBER_ZCL_STATUS_SUCCESS == status, + Status::UnsupportedAttribute == status || Status::Success == status, ChipLogError(Zcl, "Failed to read Require PIN For Remote Operation attribute, status=0x%x", to_underlying(status))); } // If the PIN is required but not provided we should exit @@ -3628,10 +3628,10 @@ void DoorLockServer::SendEvent(chip::EndpointId endpointId, T & event) template bool DoorLockServer::GetAttribute(chip::EndpointId endpointId, chip::AttributeId attributeId, - EmberAfStatus (*getFn)(chip::EndpointId endpointId, T * value), T & value) const + Status (*getFn)(chip::EndpointId endpointId, T * value), T & value) const { - EmberAfStatus status = getFn(endpointId, &value); - bool success = (EMBER_ZCL_STATUS_SUCCESS == status); + Status status = getFn(endpointId, &value); + bool success = (Status::Success == status); if (!success) { @@ -3643,10 +3643,10 @@ bool DoorLockServer::GetAttribute(chip::EndpointId endpointId, chip::AttributeId template bool DoorLockServer::SetAttribute(chip::EndpointId endpointId, chip::AttributeId attributeId, - EmberAfStatus (*setFn)(chip::EndpointId endpointId, T value), T value) + Status (*setFn)(chip::EndpointId endpointId, T value), T value) { - EmberAfStatus status = setFn(endpointId, value); - bool success = (EMBER_ZCL_STATUS_SUCCESS == status); + Status status = setFn(endpointId, value); + bool success = (Status::Success == status); if (!success) { @@ -3952,13 +3952,13 @@ void DoorLockServer::setAliroReaderConfigCommandHandler(CommandHandler * command return; } - EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; + Status status = Status::Success; if (!emberAfPluginDoorLockSetAliroReaderConfig(endpointID, signingKey, verificationKey, groupIdentifier, groupResolvingKey)) { ChipLogProgress(Zcl, "[SetAliroReaderConfig] Unable to set aliro reader config [endpointId=%d]", endpointID); - status = EMBER_ZCL_STATUS_FAILURE; + status = Status::Failure; } - sendClusterResponse(commandObj, commandPath, status); + sendClusterResponse(commandObj, commandPath, ClusterStatusCode(status)); } void DoorLockServer::clearAliroReaderConfigCommandHandler(CommandHandler * commandObj, const ConcreteCommandPath & commandPath) @@ -3974,13 +3974,13 @@ void DoorLockServer::clearAliroReaderConfigCommandHandler(CommandHandler * comma return; } - EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; + Status status = Status::Success; if (!emberAfPluginDoorLockClearAliroReaderConfig(endpointID)) { ChipLogProgress(Zcl, "[SetAliroReaderConfig] Unable to set aliro reader config [endpointId=%d]", endpointID); - status = EMBER_ZCL_STATUS_FAILURE; + status = Status::Failure; } - sendClusterResponse(commandObj, commandPath, status); + sendClusterResponse(commandObj, commandPath, ClusterStatusCode(status)); } // ============================================================================= @@ -4126,7 +4126,7 @@ void DoorLockServer::DoorLockOnAutoRelockCallback(System::Layer *, void * callba auto endpointId = static_cast(reinterpret_cast(callbackContext)); Nullable lockState; - if (Attributes::LockState::Get(endpointId, lockState) != EMBER_ZCL_STATUS_SUCCESS || lockState.IsNull() || + if (Attributes::LockState::Get(endpointId, lockState) != Status::Success || lockState.IsNull() || lockState.Value() != DlLockState::kLocked) { ChipLogProgress(Zcl, "Door Auto relock timer expired. %s", "Locking..."); diff --git a/src/app/clusters/door-lock-server/door-lock-server.h b/src/app/clusters/door-lock-server/door-lock-server.h index 9b1a7f6fd27791..f50a666ca67721 100644 --- a/src/app/clusters/door-lock-server/door-lock-server.h +++ b/src/app/clusters/door-lock-server/door-lock-server.h @@ -307,15 +307,17 @@ class DoorLockServer : public chip::app::AttributeAccessInterface bool findUserIndexByCredential(chip::EndpointId endpointId, CredentialTypeEnum credentialType, chip::ByteSpan credentialData, uint16_t & userIndex, uint16_t & credentialIndex, EmberAfPluginDoorLockUserInfo & userInfo); - EmberAfStatus createUser(chip::EndpointId endpointId, chip::FabricIndex creatorFabricIdx, chip::NodeId sourceNodeId, - uint16_t userIndex, const Nullable & userName, const Nullable & userUniqueId, - const Nullable & userStatus, const Nullable & userType, - const Nullable & credentialRule, - const Nullable & credential = Nullable()); - EmberAfStatus modifyUser(chip::EndpointId endpointId, chip::FabricIndex modifierFabricIndex, chip::NodeId sourceNodeId, - uint16_t userIndex, const Nullable & userName, const Nullable & userUniqueId, - const Nullable & userStatus, const Nullable & userType, - const Nullable & credentialRule); + chip::Protocols::InteractionModel::ClusterStatusCode + createUser(chip::EndpointId endpointId, chip::FabricIndex creatorFabricIdx, chip::NodeId sourceNodeId, uint16_t userIndex, + const Nullable & userName, const Nullable & userUniqueId, + const Nullable & userStatus, const Nullable & userType, + const Nullable & credentialRule, + const Nullable & credential = Nullable()); + chip::Protocols::InteractionModel::Status + modifyUser(chip::EndpointId endpointId, chip::FabricIndex modifierFabricIndex, chip::NodeId sourceNodeId, uint16_t userIndex, + const Nullable & userName, const Nullable & userUniqueId, + const Nullable & userStatus, const Nullable & userType, + const Nullable & credentialRule); chip::Protocols::InteractionModel::Status clearUser(chip::EndpointId endpointId, chip::FabricIndex modifierFabricId, chip::NodeId sourceNodeId, uint16_t userIndex, bool sendUserChangeEvent); chip::Protocols::InteractionModel::Status clearUser(chip::EndpointId endpointId, chip::FabricIndex modifierFabricId, @@ -477,7 +479,7 @@ class DoorLockServer : public chip::app::AttributeAccessInterface bool engageLockout(chip::EndpointId endpointId); static void sendClusterResponse(chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath, - EmberAfStatus status); + chip::Protocols::InteractionModel::ClusterStatusCode status); /** * @brief Common handler for LockDoor, UnlockDoor, UnlockWithTimeout commands @@ -544,7 +546,7 @@ class DoorLockServer : public chip::app::AttributeAccessInterface */ template bool GetAttribute(chip::EndpointId endpointId, chip::AttributeId attributeId, - EmberAfStatus (*getFn)(chip::EndpointId endpointId, T * value), T & value) const; + chip::Protocols::InteractionModel::Status (*getFn)(chip::EndpointId endpointId, T * value), T & value) const; /** * @brief Set generic attribute value @@ -559,7 +561,7 @@ class DoorLockServer : public chip::app::AttributeAccessInterface */ template bool SetAttribute(chip::EndpointId endpointId, chip::AttributeId attributeId, - EmberAfStatus (*setFn)(chip::EndpointId endpointId, T value), T value); + chip::Protocols::InteractionModel::Status (*setFn)(chip::EndpointId endpointId, T value), T value); // AttributeAccessInterface's Read API CHIP_ERROR Read(const chip::app::ConcreteReadAttributePath & aPath, chip::app::AttributeValueEncoder & aEncoder) override; diff --git a/src/app/clusters/electrical-energy-measurement-server/electrical-energy-measurement-server.cpp b/src/app/clusters/electrical-energy-measurement-server/electrical-energy-measurement-server.cpp index a26e1a33844bef..7e9bc3d72c7d27 100644 --- a/src/app/clusters/electrical-energy-measurement-server/electrical-energy-measurement-server.cpp +++ b/src/app/clusters/electrical-energy-measurement-server/electrical-energy-measurement-server.cpp @@ -150,7 +150,7 @@ MeasurementData * MeasurementDataForEndpoint(EndpointId endpointId) return nullptr; } - if (index >= MATTER_DM_ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT) + if (index >= ArraySize(gMeasurements)) { ChipLogError(NotSpecified, "Internal error: invalid/unexpected energy measurement index."); return nullptr; diff --git a/src/app/clusters/electrical-power-measurement-server/electrical-power-measurement-server.cpp b/src/app/clusters/electrical-power-measurement-server/electrical-power-measurement-server.cpp index 1b248310a686ef..5f124a3128df05 100644 --- a/src/app/clusters/electrical-power-measurement-server/electrical-power-measurement-server.cpp +++ b/src/app/clusters/electrical-power-measurement-server/electrical-power-measurement-server.cpp @@ -75,9 +75,17 @@ CHIP_ERROR Instance::Read(const ConcreteReadAttributePath & aPath, AttributeValu ReturnErrorOnFailure(aEncoder.Encode(mDelegate.GetNumberOfMeasurementTypes())); break; case Accuracy::Id: - return ReadAccuracy(aEncoder); + ReturnErrorOnFailure( + aEncoder.EncodeList([this](const auto & encoder) -> CHIP_ERROR { return this->EncodeAccuracy(encoder); })); + break; case Ranges::Id: - return ReadRanges(aEncoder); + if (!SupportsOptAttr(OptionalAttributes::kOptionalAttributeRanges)) + { + return CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute); + } + ReturnErrorOnFailure( + aEncoder.EncodeList([this](const auto & encoder) -> CHIP_ERROR { return this->EncodeRanges(encoder); })); + break; case Voltage::Id: if (!SupportsOptAttr(OptionalAttributes::kOptionalAttributeVoltage)) { @@ -176,9 +184,19 @@ CHIP_ERROR Instance::Read(const ConcreteReadAttributePath & aPath, AttributeValu ReturnErrorOnFailure(aEncoder.Encode(mDelegate.GetFrequency())); break; case HarmonicCurrents::Id: - return ReadHarmonicCurrents(aEncoder); + VerifyOrReturnError( + HasFeature(ElectricalPowerMeasurement::Feature::kHarmonics), CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE, + ChipLogError(Zcl, "Electrical Power Measurement: can not get HarmonicCurrents, feature is not supported")); + ReturnErrorOnFailure( + aEncoder.EncodeList([this](const auto & encoder) -> CHIP_ERROR { return this->EncodeHarmonicCurrents(encoder); })); + break; case HarmonicPhases::Id: - return ReadHarmonicPhases(aEncoder); + VerifyOrReturnError( + HasFeature(ElectricalPowerMeasurement::Feature::kPowerQuality), CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE, + ChipLogError(Zcl, "Electrical Power Measurement: can not get HarmonicPhases, feature is not supported")); + ReturnErrorOnFailure( + aEncoder.EncodeList([this](const auto & encoder) -> CHIP_ERROR { return this->EncodeHarmonicPhases(encoder); })); + break; case PowerFactor::Id: if (!SupportsOptAttr(OptionalAttributes::kOptionalAttributePowerFactor)) { @@ -203,112 +221,121 @@ CHIP_ERROR Instance::Read(const ConcreteReadAttributePath & aPath, AttributeValu return CHIP_NO_ERROR; } -CHIP_ERROR Instance::ReadAccuracy(AttributeValueEncoder & aEncoder) +CHIP_ERROR Instance::EncodeAccuracy(const AttributeValueEncoder::ListEncodeHelper & encoder) { - CHIP_ERROR err = CHIP_NO_ERROR; - auto accuracies = mDelegate.IterateAccuracy(); - VerifyOrReturnError(accuracies != nullptr, CHIP_IM_GLOBAL_STATUS(ResourceExhausted)); - if (accuracies->Count() == 0) - { - err = aEncoder.EncodeEmptyList(); - } - else + CHIP_ERROR err = CHIP_NO_ERROR; + + ReturnErrorOnFailure(mDelegate.StartAccuracyRead()); + for (uint8_t i = 0; true; i++) { - err = aEncoder.EncodeList([&accuracies](const auto & encoder) -> CHIP_ERROR { - Structs::MeasurementAccuracyStruct::Type accuracy; - while (accuracies->Next(accuracy)) - { - encoder.Encode(accuracy); - } - - return CHIP_NO_ERROR; - }); + Structs::MeasurementAccuracyStruct::Type accuracy; + + err = mDelegate.GetAccuracyByIndex(i, accuracy); + if (err == CHIP_ERROR_PROVIDER_LIST_EXHAUSTED) + { + // Convert end of list to CHIP_NO_ERROR + err = CHIP_NO_ERROR; + goto exit; + } + + // Check if another error occurred before trying to encode + SuccessOrExit(err); + + err = encoder.Encode(accuracy); + SuccessOrExit(err); } - accuracies->Release(); + +exit: + // Tell the delegate the read is complete + mDelegate.EndAccuracyRead(); return err; } -CHIP_ERROR Instance::ReadRanges(AttributeValueEncoder & aEncoder) +CHIP_ERROR Instance::EncodeRanges(const AttributeValueEncoder::ListEncodeHelper & encoder) { - if (!SupportsOptAttr(OptionalAttributes::kOptionalAttributeRanges)) - { - return CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute); - } CHIP_ERROR err = CHIP_NO_ERROR; - auto ranges = mDelegate.IterateRanges(); - VerifyOrReturnError(ranges != nullptr, CHIP_IM_GLOBAL_STATUS(ResourceExhausted)); - if (ranges->Count() == 0) - { - err = aEncoder.EncodeEmptyList(); - } - else + + ReturnErrorOnFailure(mDelegate.StartRangesRead()); + for (uint8_t i = 0; true; i++) { - err = aEncoder.EncodeList([&ranges](const auto & encoder) -> CHIP_ERROR { - Structs::MeasurementRangeStruct::Type range; - while (ranges->Next(range)) - { - encoder.Encode(range); - } - - return CHIP_NO_ERROR; - }); + Structs::MeasurementRangeStruct::Type range; + + err = mDelegate.GetRangeByIndex(i, range); + if (err == CHIP_ERROR_PROVIDER_LIST_EXHAUSTED) + { + // Convert end of list to CHIP_NO_ERROR + err = CHIP_NO_ERROR; + goto exit; + } + + // Check if another error occurred before trying to encode + SuccessOrExit(err); + + err = encoder.Encode(range); + SuccessOrExit(err); } - ranges->Release(); + +exit: + // Tell the delegate the read is complete + err = mDelegate.EndRangesRead(); return err; } -CHIP_ERROR Instance::ReadHarmonicCurrents(AttributeValueEncoder & aEncoder) +CHIP_ERROR Instance::EncodeHarmonicCurrents(const AttributeValueEncoder::ListEncodeHelper & encoder) { - VerifyOrReturnError(HasFeature(ElectricalPowerMeasurement::Feature::kHarmonics), CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE, - ChipLogError(Zcl, "Electrical Power Measurement: can not get HarmonicCurrents, feature is not supported")); - CHIP_ERROR err = CHIP_NO_ERROR; - auto currents = mDelegate.IterateHarmonicCurrents(); - VerifyOrReturnError(currents != nullptr, CHIP_IM_GLOBAL_STATUS(ResourceExhausted)); - if (currents->Count() == 0) - { - err = aEncoder.EncodeEmptyList(); - } - else + + ReturnErrorOnFailure(mDelegate.StartHarmonicCurrentsRead()); + for (uint8_t i = 0; true; i++) { - err = aEncoder.EncodeList([¤ts](const auto & encoder) -> CHIP_ERROR { - Structs::HarmonicMeasurementStruct::Type current; - while (currents->Next(current)) - { - encoder.Encode(current); - } - - return CHIP_NO_ERROR; - }); + Structs::HarmonicMeasurementStruct::Type current; + + err = mDelegate.GetHarmonicCurrentsByIndex(i, current); + if (err == CHIP_ERROR_PROVIDER_LIST_EXHAUSTED) + { + // Convert end of list to CHIP_NO_ERROR + err = CHIP_NO_ERROR; + goto exit; + } + // Check if another error occurred before trying to encode + SuccessOrExit(err); + + err = encoder.Encode(current); + SuccessOrExit(err); } - currents->Release(); + +exit: + // Tell the delegate the read is complete + err = mDelegate.EndHarmonicCurrentsRead(); return err; } -CHIP_ERROR Instance::ReadHarmonicPhases(AttributeValueEncoder & aEncoder) +CHIP_ERROR Instance::EncodeHarmonicPhases(const AttributeValueEncoder::ListEncodeHelper & encoder) { - VerifyOrReturnError(HasFeature(ElectricalPowerMeasurement::Feature::kPowerQuality), CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE, - ChipLogError(Zcl, "Electrical Power Measurement: can not get HarmonicPhases, feature is not supported")); CHIP_ERROR err = CHIP_NO_ERROR; - auto phases = mDelegate.IterateHarmonicPhases(); - VerifyOrReturnError(phases != nullptr, CHIP_IM_GLOBAL_STATUS(ResourceExhausted)); - if (phases->Count() == 0) - { - err = aEncoder.EncodeEmptyList(); - } - else + + ReturnErrorOnFailure(mDelegate.StartHarmonicPhasesRead()); + for (uint8_t i = 0; true; i++) { - err = aEncoder.EncodeList([&phases](const auto & encoder) -> CHIP_ERROR { - Structs::HarmonicMeasurementStruct::Type phase; - while (phases->Next(phase)) - { - encoder.Encode(phase); - } - - return CHIP_NO_ERROR; - }); + Structs::HarmonicMeasurementStruct::Type phase; + + err = mDelegate.GetHarmonicPhasesByIndex(i, phase); + if (err == CHIP_ERROR_PROVIDER_LIST_EXHAUSTED) + { + // Convert end of list to CHIP_NO_ERROR + err = CHIP_NO_ERROR; + goto exit; + } + // Check if another error occurred before trying to encode + SuccessOrExit(err); + + err = encoder.Encode(phase); + SuccessOrExit(err); } - phases->Release(); + +exit: + // Tell the delegate the read is complete + err = mDelegate.EndHarmonicPhasesRead(); return err; } diff --git a/src/app/clusters/electrical-power-measurement-server/electrical-power-measurement-server.h b/src/app/clusters/electrical-power-measurement-server/electrical-power-measurement-server.h index dff7b44b1d13a4..28af3fa0abb343 100644 --- a/src/app/clusters/electrical-power-measurement-server/electrical-power-measurement-server.h +++ b/src/app/clusters/electrical-power-measurement-server/electrical-power-measurement-server.h @@ -22,6 +22,7 @@ #include #include #include +#include namespace chip { namespace app { @@ -31,8 +32,6 @@ namespace ElectricalPowerMeasurement { using namespace chip::app::Clusters::ElectricalPowerMeasurement::Attributes; using namespace chip::app::Clusters::ElectricalPowerMeasurement::Structs; -using chip::Protocols::InteractionModel::Status; - class Delegate { public: @@ -40,29 +39,46 @@ class Delegate void SetEndpointId(EndpointId aEndpoint) { mEndpointId = aEndpoint; } - using AccuracyIterator = CommonIterator; - using RangeIterator = CommonIterator; using HarmonicMeasurementIterator = CommonIterator; - virtual PowerModeEnum GetPowerMode() = 0; - virtual uint8_t GetNumberOfMeasurementTypes() = 0; - virtual AccuracyIterator * IterateAccuracy() = 0; - virtual RangeIterator * IterateRanges() = 0; - virtual DataModel::Nullable GetVoltage() = 0; - virtual DataModel::Nullable GetActiveCurrent() = 0; - virtual DataModel::Nullable GetReactiveCurrent() = 0; - virtual DataModel::Nullable GetApparentCurrent() = 0; - virtual DataModel::Nullable GetActivePower() = 0; - virtual DataModel::Nullable GetReactivePower() = 0; - virtual DataModel::Nullable GetApparentPower() = 0; - virtual DataModel::Nullable GetRMSVoltage() = 0; - virtual DataModel::Nullable GetRMSCurrent() = 0; - virtual DataModel::Nullable GetRMSPower() = 0; - virtual DataModel::Nullable GetFrequency() = 0; - virtual HarmonicMeasurementIterator * IterateHarmonicCurrents() = 0; - virtual HarmonicMeasurementIterator * IterateHarmonicPhases() = 0; - virtual DataModel::Nullable GetPowerFactor() = 0; - virtual DataModel::Nullable GetNeutralCurrent() = 0; + virtual PowerModeEnum GetPowerMode() = 0; + virtual uint8_t GetNumberOfMeasurementTypes() = 0; + + /* These functions are called by the ReadAttribute handler to iterate through lists + * The cluster server will call StartRead to allow the delegate to create a temporary + * lock on the data. + * The delegate is expected to not change these values once StartRead has been called + * until the EndRead() has been called (e.g. releasing a lock on the data) + */ + virtual CHIP_ERROR StartAccuracyRead() = 0; + virtual CHIP_ERROR GetAccuracyByIndex(uint8_t, Structs::MeasurementAccuracyStruct::Type &) = 0; + virtual CHIP_ERROR EndAccuracyRead() = 0; + + virtual CHIP_ERROR StartRangesRead() = 0; + virtual CHIP_ERROR GetRangeByIndex(uint8_t, Structs::MeasurementRangeStruct::Type &) = 0; + virtual CHIP_ERROR EndRangesRead() = 0; + + virtual CHIP_ERROR StartHarmonicCurrentsRead() = 0; + virtual CHIP_ERROR GetHarmonicCurrentsByIndex(uint8_t, Structs::HarmonicMeasurementStruct::Type &) = 0; + virtual CHIP_ERROR EndHarmonicCurrentsRead() = 0; + + virtual CHIP_ERROR StartHarmonicPhasesRead() = 0; + virtual CHIP_ERROR GetHarmonicPhasesByIndex(uint8_t, Structs::HarmonicMeasurementStruct::Type &) = 0; + virtual CHIP_ERROR EndHarmonicPhasesRead() = 0; + + virtual DataModel::Nullable GetVoltage() = 0; + virtual DataModel::Nullable GetActiveCurrent() = 0; + virtual DataModel::Nullable GetReactiveCurrent() = 0; + virtual DataModel::Nullable GetApparentCurrent() = 0; + virtual DataModel::Nullable GetActivePower() = 0; + virtual DataModel::Nullable GetReactivePower() = 0; + virtual DataModel::Nullable GetApparentPower() = 0; + virtual DataModel::Nullable GetRMSVoltage() = 0; + virtual DataModel::Nullable GetRMSCurrent() = 0; + virtual DataModel::Nullable GetRMSPower() = 0; + virtual DataModel::Nullable GetFrequency() = 0; + virtual DataModel::Nullable GetPowerFactor() = 0; + virtual DataModel::Nullable GetNeutralCurrent() = 0; protected: EndpointId mEndpointId = 0; @@ -112,10 +128,10 @@ class Instance : public AttributeAccessInterface // AttributeAccessInterface CHIP_ERROR Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) override; - CHIP_ERROR ReadAccuracy(AttributeValueEncoder & aEncoder); - CHIP_ERROR ReadRanges(AttributeValueEncoder & aEncoder); - CHIP_ERROR ReadHarmonicCurrents(AttributeValueEncoder & aEncoder); - CHIP_ERROR ReadHarmonicPhases(AttributeValueEncoder & aEncoder); + CHIP_ERROR EncodeAccuracy(const AttributeValueEncoder::ListEncodeHelper & aEncoder); + CHIP_ERROR EncodeRanges(const AttributeValueEncoder::ListEncodeHelper & aEncoder); + CHIP_ERROR EncodeHarmonicCurrents(const AttributeValueEncoder::ListEncodeHelper & aEncoder); + CHIP_ERROR EncodeHarmonicPhases(const AttributeValueEncoder::ListEncodeHelper & aEncoder); }; } // namespace ElectricalPowerMeasurement diff --git a/src/app/clusters/energy-evse-server/energy-evse-server.h b/src/app/clusters/energy-evse-server/energy-evse-server.h index dfead37517d4e8..2ff46f339ff6ad 100644 --- a/src/app/clusters/energy-evse-server/energy-evse-server.h +++ b/src/app/clusters/energy-evse-server/energy-evse-server.h @@ -27,6 +27,7 @@ #include #include #include +#include namespace chip { namespace app { @@ -38,7 +39,6 @@ constexpr int64_t kMinimumChargeCurrent = 0; constexpr int64_t kMaximumChargeCurrent = 80000; constexpr uint32_t kMaxRandomizationDelayWindow = 86400; -using chip::Protocols::InteractionModel::Status; /** @brief * Defines methods for implementing application-specific logic for the EVSE Management Cluster. */ @@ -55,30 +55,31 @@ class Delegate * It should report Status::Success if successful and may * return other Status codes if it fails */ - virtual Status Disable() = 0; + virtual Protocols::InteractionModel::Status Disable() = 0; /** * @brief Delegate should implement a handler to enable EVSE Charging. * It should report Status::Success if successful and may * return other Status codes if it fails */ - virtual Status EnableCharging(const DataModel::Nullable & enableChargeTime, const int64_t & minimumChargeCurrent, - const int64_t & maximumChargeCurrent) = 0; + virtual Protocols::InteractionModel::Status EnableCharging(const DataModel::Nullable & enableChargeTime, + const int64_t & minimumChargeCurrent, + const int64_t & maximumChargeCurrent) = 0; /** * @brief Delegate should implement a handler to enable EVSE Discharging. * It should report Status::Success if successful and may * return other Status codes if it fails */ - virtual Status EnableDischarging(const DataModel::Nullable & enableDischargeTime, - const int64_t & maximumDischargeCurrent) = 0; + virtual Protocols::InteractionModel::Status EnableDischarging(const DataModel::Nullable & enableDischargeTime, + const int64_t & maximumDischargeCurrent) = 0; /** * @brief Delegate should implement a handler to enable EVSE Diagnostics. * It should report Status::Success if successful and may * return other Status codes if it fails */ - virtual Status StartDiagnostics() = 0; + virtual Protocols::InteractionModel::Status StartDiagnostics() = 0; // ------------------------------------------------------------------ // Get attribute methods diff --git a/src/app/clusters/fan-control-server/fan-control-server.cpp b/src/app/clusters/fan-control-server/fan-control-server.cpp index 4ed216b9cad088..b297acdd1e80cf 100644 --- a/src/app/clusters/fan-control-server/fan-control-server.cpp +++ b/src/app/clusters/fan-control-server/fan-control-server.cpp @@ -32,9 +32,9 @@ #include #include #include -#include #include #include +#include using namespace chip; using namespace chip::app; @@ -42,6 +42,8 @@ using namespace chip::app::Clusters; using namespace chip::app::Clusters::FanControl; using namespace chip::app::Clusters::FanControl::Attributes; +using Protocols::InteractionModel::Status; + namespace { constexpr size_t kFanControlDelegateTableSize = @@ -86,11 +88,11 @@ namespace { // Indicates if the write operation is from the cluster server itself bool gWriteFromClusterLogic = false; -EmberAfStatus SetFanModeToOff(EndpointId endpointId) +Status SetFanModeToOff(EndpointId endpointId) { FanModeEnum currentFanMode; - EmberAfStatus status = FanMode::Get(endpointId, ¤tFanMode); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == status, status); + Status status = FanMode::Get(endpointId, ¤tFanMode); + VerifyOrReturnError(Status::Success == status, status); if (currentFanMode != FanModeEnum::kOff) { @@ -104,7 +106,7 @@ bool HasFeature(EndpointId endpoint, Feature feature) { bool success; uint32_t featureMap; - success = (Attributes::FeatureMap::Get(endpoint, &featureMap) == EMBER_ZCL_STATUS_SUCCESS); + success = (Attributes::FeatureMap::Get(endpoint, &featureMap) == Status::Success); return success ? ((featureMap & to_underlying(feature)) != 0) : false; } @@ -164,8 +166,8 @@ MatterFanControlClusterServerPreAttributeChangedCallback(const ConcreteAttribute else if (*value == to_underlying(FanModeEnum::kSmart)) { FanModeSequenceEnum fanModeSequence; - EmberAfStatus status = FanModeSequence::Get(attributePath.mEndpointId, &fanModeSequence); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == status, Status::Failure); + Status status = FanModeSequence::Get(attributePath.mEndpointId, &fanModeSequence); + VerifyOrReturnError(Status::Success == status, Status::Failure); if (SupportsAuto(attributePath.mEndpointId) && ((fanModeSequence == FanModeSequenceEnum::kOffLowHighAuto) || @@ -205,8 +207,8 @@ MatterFanControlClusterServerPreAttributeChangedCallback(const ConcreteAttribute else { uint8_t speedMax; - EmberAfStatus status = SpeedMax::Get(attributePath.mEndpointId, &speedMax); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == status, Status::ConstraintError); + Status status = SpeedMax::Get(attributePath.mEndpointId, &speedMax); + VerifyOrReturnError(Status::Success == status, Status::ConstraintError); if (*value <= speedMax) { @@ -248,8 +250,8 @@ MatterFanControlClusterServerPreAttributeChangedCallback(const ConcreteAttribute if (SupportsRocking(attributePath.mEndpointId)) { BitMask rockSupport; - EmberAfStatus status = RockSupport::Get(attributePath.mEndpointId, &rockSupport); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == status, Status::ConstraintError); + Status status = RockSupport::Get(attributePath.mEndpointId, &rockSupport); + VerifyOrReturnError(Status::Success == status, Status::ConstraintError); auto rawRockSupport = rockSupport.Raw(); if ((*value & rawRockSupport) == *value) { @@ -270,8 +272,8 @@ MatterFanControlClusterServerPreAttributeChangedCallback(const ConcreteAttribute if (SupportsWind(attributePath.mEndpointId)) { BitMask windSupport; - EmberAfStatus status = WindSupport::Get(attributePath.mEndpointId, &windSupport); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == status, Status::ConstraintError); + Status status = WindSupport::Get(attributePath.mEndpointId, &windSupport); + VerifyOrReturnError(Status::Success == status, Status::ConstraintError); auto rawWindSupport = windSupport.Raw(); if ((*value & rawWindSupport) == *value) { @@ -313,30 +315,30 @@ void MatterFanControlClusterServerAttributeChangedCallback(const app::ConcreteAt { case FanMode::Id: { FanModeEnum mode; - EmberAfStatus status = FanMode::Get(attributePath.mEndpointId, &mode); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status); + Status status = FanMode::Get(attributePath.mEndpointId, &mode); + VerifyOrReturn(Status::Success == status); // Setting the FanMode value to Off SHALL set the values of PercentSetting, PercentCurrent, // SpeedSetting, SpeedCurrent attributes to 0 (zero). if (mode == FanModeEnum::kOff) { status = PercentSetting::Set(attributePath.mEndpointId, 0); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to write PercentSetting with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to write PercentSetting with error: 0x%02x", to_underlying(status))); status = PercentCurrent::Set(attributePath.mEndpointId, 0); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to write PercentCurrent with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to write PercentCurrent with error: 0x%02x", to_underlying(status))); if (SupportsMultiSpeed(attributePath.mEndpointId)) { status = SpeedSetting::Set(attributePath.mEndpointId, 0); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to write SpeedSetting with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to write SpeedSetting with error: 0x%02x", to_underlying(status))); status = SpeedCurrent::Set(attributePath.mEndpointId, 0); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to write SpeedCurrent with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to write SpeedCurrent with error: 0x%02x", to_underlying(status))); } } @@ -346,30 +348,30 @@ void MatterFanControlClusterServerAttributeChangedCallback(const app::ConcreteAt { gWriteFromClusterLogic = true; status = PercentSetting::SetNull(attributePath.mEndpointId); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to write PercentSetting with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to write PercentSetting with error: 0x%02x", to_underlying(status))); if (SupportsMultiSpeed(attributePath.mEndpointId)) { gWriteFromClusterLogic = true; status = SpeedSetting::SetNull(attributePath.mEndpointId); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to write SpeedSetting with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to write SpeedSetting with error: 0x%02x", to_underlying(status))); } } break; } case PercentSetting::Id: { DataModel::Nullable percentSetting; - EmberAfStatus status = PercentSetting::Get(attributePath.mEndpointId, percentSetting); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status && !percentSetting.IsNull()); + Status status = PercentSetting::Get(attributePath.mEndpointId, percentSetting); + VerifyOrReturn(Status::Success == status && !percentSetting.IsNull()); // If PercentSetting is set to 0, the server SHALL set the FanMode attribute value to Off. if (percentSetting.Value() == 0) { status = SetFanModeToOff(attributePath.mEndpointId); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to set FanMode to off with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to set FanMode to off with error: 0x%02x", to_underlying(status))); } if (SupportsMultiSpeed(attributePath.mEndpointId)) @@ -378,13 +380,13 @@ void MatterFanControlClusterServerAttributeChangedCallback(const app::ConcreteAt // speed = ceil( SpeedMax * (percent * 0.01) ) uint8_t speedMax; status = SpeedMax::Get(attributePath.mEndpointId, &speedMax); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to get SpeedMax with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to get SpeedMax with error: 0x%02x", to_underlying(status))); DataModel::Nullable currentSpeedSetting; status = SpeedSetting::Get(attributePath.mEndpointId, currentSpeedSetting); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to get SpeedSetting with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to get SpeedSetting with error: 0x%02x", to_underlying(status))); uint16_t percent = percentSetting.Value(); // Plus 99 then integer divide by 100 instead of multiplying 0.01 to avoid floating point precision error @@ -393,8 +395,8 @@ void MatterFanControlClusterServerAttributeChangedCallback(const app::ConcreteAt if (currentSpeedSetting.IsNull() || speedSetting != currentSpeedSetting.Value()) { status = SpeedSetting::Set(attributePath.mEndpointId, speedSetting); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to set SpeedSetting with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to set SpeedSetting with error: 0x%02x", to_underlying(status))); } } break; @@ -403,28 +405,28 @@ void MatterFanControlClusterServerAttributeChangedCallback(const app::ConcreteAt if (SupportsMultiSpeed(attributePath.mEndpointId)) { DataModel::Nullable speedSetting; - EmberAfStatus status = SpeedSetting::Get(attributePath.mEndpointId, speedSetting); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status && !speedSetting.IsNull()); + Status status = SpeedSetting::Get(attributePath.mEndpointId, speedSetting); + VerifyOrReturn(Status::Success == status && !speedSetting.IsNull()); // If SpeedSetting is set to 0, the server SHALL set the FanMode attribute value to Off. if (speedSetting.Value() == 0) { status = SetFanModeToOff(attributePath.mEndpointId); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to set FanMode to off with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to set FanMode to off with error: 0x%02x", to_underlying(status))); } // Adjust PercentSetting from a speed value change for SpeedSetting // percent = floor( speed/SpeedMax * 100 ) uint8_t speedMax; status = SpeedMax::Get(attributePath.mEndpointId, &speedMax); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to get SpeedMax with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to get SpeedMax with error: 0x%02x", to_underlying(status))); DataModel::Nullable currentPercentSetting; status = PercentSetting::Get(attributePath.mEndpointId, currentPercentSetting); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to get PercentSetting with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to get PercentSetting with error: 0x%02x", to_underlying(status))); float speed = speedSetting.Value(); Percent percentSetting = static_cast(speed / speedMax * 100); @@ -432,8 +434,8 @@ void MatterFanControlClusterServerAttributeChangedCallback(const app::ConcreteAt if (currentPercentSetting.IsNull() || percentSetting != currentPercentSetting.Value()) { status = PercentSetting::Set(attributePath.mEndpointId, percentSetting); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to set PercentSetting with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to set PercentSetting with error: 0x%02x", to_underlying(status))); } } break; diff --git a/src/app/clusters/groups-server/groups-server.cpp b/src/app/clusters/groups-server/groups-server.cpp index d591c3f3d6e331..65bfbc1c3e5952 100644 --- a/src/app/clusters/groups-server/groups-server.cpp +++ b/src/app/clusters/groups-server/groups-server.cpp @@ -102,40 +102,40 @@ static Status GroupAdd(FabricIndex fabricIndex, EndpointId endpointId, GroupId g return Status::ResourceExhausted; } -static EmberAfStatus GroupRemove(FabricIndex fabricIndex, EndpointId endpointId, GroupId groupId) +static Status GroupRemove(FabricIndex fabricIndex, EndpointId endpointId, GroupId groupId) { - VerifyOrReturnError(IsValidGroupId(groupId), EMBER_ZCL_STATUS_CONSTRAINT_ERROR); - VerifyOrReturnError(GroupExists(fabricIndex, endpointId, groupId), EMBER_ZCL_STATUS_NOT_FOUND); + VerifyOrReturnError(IsValidGroupId(groupId), Status::ConstraintError); + VerifyOrReturnError(GroupExists(fabricIndex, endpointId, groupId), Status::NotFound); GroupDataProvider * provider = GetGroupDataProvider(); - VerifyOrReturnError(nullptr != provider, EMBER_ZCL_STATUS_NOT_FOUND); + VerifyOrReturnError(nullptr != provider, Status::NotFound); CHIP_ERROR err = provider->RemoveEndpoint(fabricIndex, groupId, endpointId); if (CHIP_NO_ERROR == err) { MatterReportingAttributeChangeCallback(kRootEndpointId, GroupKeyManagement::Id, GroupKeyManagement::Attributes::GroupTable::Id); - return EMBER_ZCL_STATUS_SUCCESS; + return Status::Success; } ChipLogDetail(Zcl, "ERR: Failed to remove mapping (end:%d, group:0x%x), err:%" CHIP_ERROR_FORMAT, endpointId, groupId, err.Format()); - return EMBER_ZCL_STATUS_NOT_FOUND; + return Status::NotFound; } void emberAfGroupsClusterServerInitCallback(EndpointId endpointId) { // According to spec, highest bit (Group Names) MUST match feature bit 0 (Group Names) - EmberAfStatus status = Attributes::NameSupport::Set(endpointId, NameSupportBitmap::kGroupNames); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = Attributes::NameSupport::Set(endpointId, NameSupportBitmap::kGroupNames); + if (status != Status::Success) { - ChipLogDetail(Zcl, "ERR: writing NameSupport %x", status); + ChipLogDetail(Zcl, "ERR: writing NameSupport %x", to_underlying(status)); } status = Attributes::FeatureMap::Set(endpointId, static_cast(Feature::kGroupNames)); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogDetail(Zcl, "ERR: writing group feature map %x", status); + ChipLogDetail(Zcl, "ERR: writing group feature map %x", to_underlying(status)); } } @@ -161,21 +161,21 @@ bool emberAfGroupsClusterViewGroupCallback(app::CommandHandler * commandObj, con GroupDataProvider * provider = GetGroupDataProvider(); GroupDataProvider::GroupInfo info; Groups::Commands::ViewGroupResponse::Type response; - CHIP_ERROR err = CHIP_NO_ERROR; - EmberAfStatus status = EMBER_ZCL_STATUS_NOT_FOUND; + CHIP_ERROR err = CHIP_NO_ERROR; + Status status = Status::NotFound; - VerifyOrExit(IsValidGroupId(groupId), status = EMBER_ZCL_STATUS_CONSTRAINT_ERROR); - VerifyOrExit(nullptr != provider, status = EMBER_ZCL_STATUS_FAILURE); - VerifyOrExit(provider->HasEndpoint(fabricIndex, groupId, commandPath.mEndpointId), status = EMBER_ZCL_STATUS_NOT_FOUND); + VerifyOrExit(IsValidGroupId(groupId), status = Status::ConstraintError); + VerifyOrExit(nullptr != provider, status = Status::Failure); + VerifyOrExit(provider->HasEndpoint(fabricIndex, groupId, commandPath.mEndpointId), status = Status::NotFound); err = provider->GetGroupInfo(fabricIndex, groupId, info); - VerifyOrExit(CHIP_NO_ERROR == err, status = EMBER_ZCL_STATUS_NOT_FOUND); + VerifyOrExit(CHIP_NO_ERROR == err, status = Status::NotFound); response.groupName = CharSpan(info.name, strnlen(info.name, GroupDataProvider::GroupInfo::kGroupNameMax)); - status = EMBER_ZCL_STATUS_SUCCESS; + status = Status::Success; exit: response.groupID = groupId; - response.status = status; + response.status = to_underlying(status); commandObj->AddResponse(commandPath, response); return true; } @@ -297,7 +297,7 @@ bool emberAfGroupsClusterRemoveGroupCallback(app::CommandHandler * commandObj, c ScenesManagement::ScenesServer::Instance().GroupWillBeRemoved(fabricIndex, commandPath.mEndpointId, commandData.groupID); #endif response.groupID = commandData.groupID; - response.status = GroupRemove(fabricIndex, commandPath.mEndpointId, commandData.groupID); + response.status = to_underlying(GroupRemove(fabricIndex, commandPath.mEndpointId, commandData.groupID)); commandObj->AddResponse(commandPath, response); return true; diff --git a/src/app/clusters/icd-management-server/icd-management-server.cpp b/src/app/clusters/icd-management-server/icd-management-server.cpp index 90953e3b814dd2..cac9e2dce3146e 100644 --- a/src/app/clusters/icd-management-server/icd-management-server.cpp +++ b/src/app/clusters/icd-management-server/icd-management-server.cpp @@ -36,6 +36,8 @@ using namespace chip::app::Clusters::IcdManagement; using namespace Protocols; using namespace chip::Access; +using chip::Protocols::InteractionModel::Status; + namespace { /** diff --git a/src/app/clusters/icd-management-server/icd-management-server.h b/src/app/clusters/icd-management-server/icd-management-server.h index 308d50859d2d4b..0763f4863d1f0b 100644 --- a/src/app/clusters/icd-management-server/icd-management-server.h +++ b/src/app/clusters/icd-management-server/icd-management-server.h @@ -29,8 +29,6 @@ #include #include -using chip::Protocols::InteractionModel::Status; - class ICDManagementServer { public: @@ -46,14 +44,16 @@ class ICDManagementServer * ICDConfigurationData If function fails, icdCounter will be unchanged * @return Status */ - Status RegisterClient(chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath, - const chip::app::Clusters::IcdManagement::Commands::RegisterClient::DecodableType & commandData, - uint32_t & icdCounter); + chip::Protocols::InteractionModel::Status + RegisterClient(chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath, + const chip::app::Clusters::IcdManagement::Commands::RegisterClient::DecodableType & commandData, + uint32_t & icdCounter); - Status UnregisterClient(chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath, - const chip::app::Clusters::IcdManagement::Commands::UnregisterClient::DecodableType & commandData); + chip::Protocols::InteractionModel::Status + UnregisterClient(chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath, + const chip::app::Clusters::IcdManagement::Commands::UnregisterClient::DecodableType & commandData); - Status StayActiveRequest(chip::FabricIndex fabricIndex); + chip::Protocols::InteractionModel::Status StayActiveRequest(chip::FabricIndex fabricIndex); private: /** diff --git a/src/app/clusters/identify-server/identify-server.cpp b/src/app/clusters/identify-server/identify-server.cpp index 55a0e15ee59c2f..257adf934a5328 100644 --- a/src/app/clusters/identify-server/identify-server.cpp +++ b/src/app/clusters/identify-server/identify-server.cpp @@ -27,7 +27,6 @@ #include #include -#include #include #include #include @@ -105,7 +104,7 @@ static void onIdentifyClusterTick(chip::System::Layer * systemLayer, void * appS { EndpointId endpoint = identify->mEndpoint; - if (EMBER_ZCL_STATUS_SUCCESS == Attributes::IdentifyTime::Get(endpoint, &identifyTime) && 0 != identifyTime) + if (Status::Success == Attributes::IdentifyTime::Get(endpoint, &identifyTime) && 0 != identifyTime) { identifyTime = static_cast(identifyTime == 0 ? 0 : identifyTime - 1); // This tick writes the new attribute, which will trigger the Attribute @@ -146,7 +145,7 @@ void MatterIdentifyClusterServerAttributeChangedCallback(const app::ConcreteAttr return; } - if (EMBER_ZCL_STATUS_SUCCESS == Attributes::IdentifyTime::Get(endpoint, &identifyTime)) + if (Status::Success == Attributes::IdentifyTime::Get(endpoint, &identifyTime)) { /* effect identifier changed during identify */ if (identify->mTargetEffectIdentifier != identify->mCurrentEffectIdentifier) @@ -201,8 +200,7 @@ bool emberAfIdentifyClusterIdentifyCallback(CommandHandler * commandObj, const C auto & identifyTime = commandData.identifyTime; // cmd Identify - commandObj->AddStatus(commandPath, - ToInteractionModelStatus(Attributes::IdentifyTime::Set(commandPath.mEndpointId, identifyTime))); + commandObj->AddStatus(commandPath, Attributes::IdentifyTime::Set(commandPath.mEndpointId, identifyTime)); return true; } @@ -231,8 +229,8 @@ bool emberAfIdentifyClusterTriggerEffectCallback(CommandHandler * commandObj, co identify->mEffectVariant = effectVariant; /* only call the callback if no identify is in progress */ - if (nullptr != identify->mOnEffectIdentifier && - EMBER_ZCL_STATUS_SUCCESS == Attributes::IdentifyTime::Get(endpoint, &identifyTime) && 0 == identifyTime) + if (nullptr != identify->mOnEffectIdentifier && Status::Success == Attributes::IdentifyTime::Get(endpoint, &identifyTime) && + 0 == identifyTime) { identify->mCurrentEffectIdentifier = identify->mTargetEffectIdentifier; identify->mOnEffectIdentifier(identify); diff --git a/src/app/clusters/laundry-dryer-controls-server/laundry-dryer-controls-server.cpp b/src/app/clusters/laundry-dryer-controls-server/laundry-dryer-controls-server.cpp index b672f953a16d56..7a3d47f823c409 100644 --- a/src/app/clusters/laundry-dryer-controls-server/laundry-dryer-controls-server.cpp +++ b/src/app/clusters/laundry-dryer-controls-server/laundry-dryer-controls-server.cpp @@ -32,7 +32,6 @@ #include #include #include -#include #include using namespace chip; @@ -83,12 +82,12 @@ LaundryDryerControlsServer & LaundryDryerControlsServer::Instance() return sInstance; } -EmberAfStatus LaundryDryerControlsServer::SetSelectedDrynessLevel(EndpointId endpointId, DrynessLevelEnum newSelectedDrynessLevel) +Status LaundryDryerControlsServer::SetSelectedDrynessLevel(EndpointId endpointId, DrynessLevelEnum newSelectedDrynessLevel) { DataModel::Nullable selectedDrynessLevel; - EmberAfStatus res = SelectedDrynessLevel::Get(endpointId, selectedDrynessLevel); + Status res = SelectedDrynessLevel::Get(endpointId, selectedDrynessLevel); - if ((res == EMBER_ZCL_STATUS_SUCCESS) && (selectedDrynessLevel != newSelectedDrynessLevel)) + if ((res == Status::Success) && (selectedDrynessLevel != newSelectedDrynessLevel)) { res = SelectedDrynessLevel::Set(endpointId, newSelectedDrynessLevel); } @@ -96,8 +95,8 @@ EmberAfStatus LaundryDryerControlsServer::SetSelectedDrynessLevel(EndpointId end return res; } -EmberAfStatus LaundryDryerControlsServer::GetSelectedDrynessLevel(EndpointId endpointId, - DataModel::Nullable & selectedDrynessLevel) +Status LaundryDryerControlsServer::GetSelectedDrynessLevel(EndpointId endpointId, + DataModel::Nullable & selectedDrynessLevel) { return SelectedDrynessLevel::Get(endpointId, selectedDrynessLevel); } diff --git a/src/app/clusters/laundry-dryer-controls-server/laundry-dryer-controls-server.h b/src/app/clusters/laundry-dryer-controls-server/laundry-dryer-controls-server.h index 454c029e21fc52..5a7123c0ee78e0 100644 --- a/src/app/clusters/laundry-dryer-controls-server/laundry-dryer-controls-server.h +++ b/src/app/clusters/laundry-dryer-controls-server/laundry-dryer-controls-server.h @@ -21,6 +21,7 @@ #include #include #include +#include namespace chip { namespace app { @@ -46,8 +47,9 @@ class LaundryDryerControlsServer : public AttributeAccessInterface /** * API to set/get the SelectedDrynessLevel attribute */ - EmberAfStatus SetSelectedDrynessLevel(EndpointId endpointId, DrynessLevelEnum newSelectedDrynessLevel); - EmberAfStatus GetSelectedDrynessLevel(EndpointId endpointId, DataModel::Nullable & selectedDrynessLevel); + Protocols::InteractionModel::Status SetSelectedDrynessLevel(EndpointId endpointId, DrynessLevelEnum newSelectedDrynessLevel); + Protocols::InteractionModel::Status GetSelectedDrynessLevel(EndpointId endpointId, + DataModel::Nullable & selectedDrynessLevel); private: CHIP_ERROR Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) override; diff --git a/src/app/clusters/laundry-washer-controls-server/laundry-washer-controls-server.cpp b/src/app/clusters/laundry-washer-controls-server/laundry-washer-controls-server.cpp index 7800f075d159b7..4e58236e9b2cad 100644 --- a/src/app/clusters/laundry-washer-controls-server/laundry-washer-controls-server.cpp +++ b/src/app/clusters/laundry-washer-controls-server/laundry-washer-controls-server.cpp @@ -31,7 +31,6 @@ #include #include #include -#include #include using namespace chip; @@ -82,11 +81,11 @@ LaundryWasherControlsServer & LaundryWasherControlsServer::Instance() return sInstance; } -EmberAfStatus LaundryWasherControlsServer::SetSpinSpeedCurrent(EndpointId endpointId, DataModel::Nullable spinSpeedCurrent) +Status LaundryWasherControlsServer::SetSpinSpeedCurrent(EndpointId endpointId, DataModel::Nullable spinSpeedCurrent) { DataModel::Nullable spinSpeedCurrentNow; - EmberAfStatus res = SpinSpeedCurrent::Get(endpointId, spinSpeedCurrentNow); - if ((res == EMBER_ZCL_STATUS_SUCCESS) && (spinSpeedCurrentNow != spinSpeedCurrent)) + Status res = SpinSpeedCurrent::Get(endpointId, spinSpeedCurrentNow); + if ((res == Status::Success) && (spinSpeedCurrentNow != spinSpeedCurrent)) { res = SpinSpeedCurrent::Set(endpointId, spinSpeedCurrent); } @@ -94,18 +93,17 @@ EmberAfStatus LaundryWasherControlsServer::SetSpinSpeedCurrent(EndpointId endpoi return res; } -EmberAfStatus LaundryWasherControlsServer::GetSpinSpeedCurrent(EndpointId endpointId, - DataModel::Nullable & spinSpeedCurrent) +Status LaundryWasherControlsServer::GetSpinSpeedCurrent(EndpointId endpointId, DataModel::Nullable & spinSpeedCurrent) { return SpinSpeedCurrent::Get(endpointId, spinSpeedCurrent); } -EmberAfStatus LaundryWasherControlsServer::SetNumberOfRinses(EndpointId endpointId, NumberOfRinsesEnum newNumberOfRinses) +Status LaundryWasherControlsServer::SetNumberOfRinses(EndpointId endpointId, NumberOfRinsesEnum newNumberOfRinses) { NumberOfRinsesEnum numberOfRinses; - EmberAfStatus res = NumberOfRinses::Get(endpointId, &numberOfRinses); + Status res = NumberOfRinses::Get(endpointId, &numberOfRinses); - if ((res == EMBER_ZCL_STATUS_SUCCESS) && (numberOfRinses != newNumberOfRinses)) + if ((res == Status::Success) && (numberOfRinses != newNumberOfRinses)) { res = NumberOfRinses::Set(endpointId, newNumberOfRinses); } @@ -113,7 +111,7 @@ EmberAfStatus LaundryWasherControlsServer::SetNumberOfRinses(EndpointId endpoint return res; } -EmberAfStatus LaundryWasherControlsServer::GetNumberOfRinses(EndpointId endpointId, NumberOfRinsesEnum & numberOfRinses) +Status LaundryWasherControlsServer::GetNumberOfRinses(EndpointId endpointId, NumberOfRinsesEnum & numberOfRinses) { return NumberOfRinses::Get(endpointId, &numberOfRinses); } diff --git a/src/app/clusters/laundry-washer-controls-server/laundry-washer-controls-server.h b/src/app/clusters/laundry-washer-controls-server/laundry-washer-controls-server.h index f01069135b3e7c..c19b6f88518bf8 100644 --- a/src/app/clusters/laundry-washer-controls-server/laundry-washer-controls-server.h +++ b/src/app/clusters/laundry-washer-controls-server/laundry-washer-controls-server.h @@ -22,6 +22,8 @@ #include #include +#include + namespace chip { namespace app { namespace Clusters { @@ -48,14 +50,14 @@ class LaundryWasherControlsServer : public AttributeAccessInterface /** * API to set/get the SpinSpeedCurrent attribute */ - EmberAfStatus SetSpinSpeedCurrent(EndpointId endpointId, DataModel::Nullable spinSpeedCurrent); - EmberAfStatus GetSpinSpeedCurrent(EndpointId endpointId, DataModel::Nullable & spinSpeedCurrent); + Protocols::InteractionModel::Status SetSpinSpeedCurrent(EndpointId endpointId, DataModel::Nullable spinSpeedCurrent); + Protocols::InteractionModel::Status GetSpinSpeedCurrent(EndpointId endpointId, DataModel::Nullable & spinSpeedCurrent); /** * API to set/get the NumberOfRinses attribute */ - EmberAfStatus SetNumberOfRinses(EndpointId endpointId, NumberOfRinsesEnum newNumberOfRinses); - EmberAfStatus GetNumberOfRinses(EndpointId endpointId, NumberOfRinsesEnum & numberOfRinses); + Protocols::InteractionModel::Status SetNumberOfRinses(EndpointId endpointId, NumberOfRinsesEnum newNumberOfRinses); + Protocols::InteractionModel::Status GetNumberOfRinses(EndpointId endpointId, NumberOfRinsesEnum & numberOfRinses); private: CHIP_ERROR Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) override; diff --git a/src/app/clusters/level-control/level-control.cpp b/src/app/clusters/level-control/level-control.cpp index 5f08cfd6fc1383..b04d32fe69c448 100644 --- a/src/app/clusters/level-control/level-control.cpp +++ b/src/app/clusters/level-control/level-control.cpp @@ -25,7 +25,6 @@ #include #include #include -#include #include #include @@ -162,12 +161,12 @@ class DefaultLevelControlSceneHandler : public scenes::DefaultSceneHandlerImpl using AttributeValuePair = ScenesManagement::Structs::AttributeValuePair::Type; app::DataModel::Nullable level; - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == Attributes::CurrentLevel::Get(endpoint, level), CHIP_ERROR_READ_FAILED); + VerifyOrReturnError(Status::Success == Attributes::CurrentLevel::Get(endpoint, level), CHIP_ERROR_READ_FAILED); AttributeValuePair pairs[kLevelMaxScenableAttributes]; uint8_t maxLevel; - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == Attributes::MaxLevel::Get(endpoint, &maxLevel), CHIP_ERROR_READ_FAILED); + VerifyOrReturnError(Status::Success == Attributes::MaxLevel::Get(endpoint, &maxLevel), CHIP_ERROR_READ_FAILED); pairs[0].attributeID = Attributes::CurrentLevel::Id; if (!level.IsNull()) @@ -182,8 +181,7 @@ class DefaultLevelControlSceneHandler : public scenes::DefaultSceneHandlerImpl if (LevelControlHasFeature(endpoint, LevelControl::Feature::kFrequency)) { uint16_t frequency; - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == Attributes::CurrentFrequency::Get(endpoint, &frequency), - CHIP_ERROR_READ_FAILED); + VerifyOrReturnError(Status::Success == Attributes::CurrentFrequency::Get(endpoint, &frequency), CHIP_ERROR_READ_FAILED); pairs[attributeCount].attributeID = Attributes::CurrentFrequency::Id; pairs[attributeCount].attributeValue = frequency; attributeCount++; @@ -338,10 +336,10 @@ static EmberAfLevelControlState * getState(EndpointId endpoint) static void reallyUpdateCoupledColorTemp(EndpointId endpoint) { LevelControl::Attributes::Options::TypeInfo::Type options; - EmberAfStatus status = Attributes::Options::Get(endpoint, &options); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = Attributes::Options::Get(endpoint, &options); + if (status != Status::Success) { - ChipLogProgress(Zcl, "Unable to read Options attribute: 0x%X", status); + ChipLogProgress(Zcl, "Unable to read Options attribute: 0x%X", to_underlying(status)); return; } @@ -358,7 +356,7 @@ static void reallyUpdateCoupledColorTemp(EndpointId endpoint) void emberAfLevelControlClusterServerTickCallback(EndpointId endpoint) { EmberAfLevelControlState * state = getState(endpoint); - EmberAfStatus status; + Status status; app::DataModel::Nullable currentLevel; const auto callbackStartTimestamp = System::SystemClock().GetMonotonicTimestamp(); @@ -372,9 +370,9 @@ void emberAfLevelControlClusterServerTickCallback(EndpointId endpoint) // Read the attribute; print error message and return if it can't be read status = LevelControl::Attributes::CurrentLevel::Get(endpoint, currentLevel); - if (status != EMBER_ZCL_STATUS_SUCCESS || currentLevel.IsNull()) + if (status != Status::Success || currentLevel.IsNull()) { - ChipLogProgress(Zcl, "ERR: reading current level %x", status); + ChipLogProgress(Zcl, "ERR: reading current level %x", to_underlying(status)); state->callbackSchedule.runTime = System::Clock::Milliseconds32(0); writeRemainingTime(endpoint, 0); return; @@ -405,9 +403,9 @@ void emberAfLevelControlClusterServerTickCallback(EndpointId endpoint) ChipLogDetail(Zcl, "(diff %c1)", state->increasing ? '+' : '-'); status = Attributes::CurrentLevel::Set(endpoint, currentLevel); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogProgress(Zcl, "ERR: writing current level %x", status); + ChipLogProgress(Zcl, "ERR: writing current level %x", to_underlying(status)); state->callbackSchedule.runTime = System::Clock::Milliseconds32(0); writeRemainingTime(endpoint, 0); return; @@ -428,9 +426,9 @@ void emberAfLevelControlClusterServerTickCallback(EndpointId endpoint) { uint8_t storedLevel8u = (uint8_t) state->storedLevel; status = Attributes::CurrentLevel::Set(endpoint, storedLevel8u); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogProgress(Zcl, "ERR: writing current level %x", status); + ChipLogProgress(Zcl, "ERR: writing current level %x", to_underlying(status)); } else { @@ -470,10 +468,10 @@ static void writeRemainingTime(EndpointId endpoint, uint16_t remainingTimeMs) // This is done to ensure that the attribute, in tenths of a second, only // goes to zero when the remaining time in milliseconds is actually zero. uint16_t remainingTimeDs = static_cast((remainingTimeMs + 99) / 100); - EmberAfStatus status = LevelControl::Attributes::RemainingTime::Set(endpoint, remainingTimeDs); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = LevelControl::Attributes::RemainingTime::Set(endpoint, remainingTimeDs); + if (status != Status::Success) { - ChipLogProgress(Zcl, "ERR: writing remaining time %x", status); + ChipLogProgress(Zcl, "ERR: writing remaining time %x", to_underlying(status)); } } #endif // IGNORE_LEVEL_CONTROL_CLUSTER_LEVEL_CONTROL_REMAINING_TIME @@ -516,19 +514,19 @@ static bool shouldExecuteIfOff(EndpointId endpoint, CommandId commandId, chip::O } LevelControl::Attributes::Options::TypeInfo::Type options; - EmberAfStatus status = Attributes::Options::Get(endpoint, &options); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = Attributes::Options::Get(endpoint, &options); + if (status != Status::Success) { - ChipLogProgress(Zcl, "Unable to read Options attribute: 0x%X", status); + ChipLogProgress(Zcl, "Unable to read Options attribute: 0x%X", to_underlying(status)); // If we can't read the attribute, then we should just assume that it has its // default value. } bool on; status = OnOff::Attributes::OnOff::Get(endpoint, &on); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogProgress(Zcl, "Unable to read OnOff attribute: 0x%X", status); + ChipLogProgress(Zcl, "Unable to read OnOff attribute: 0x%X", to_underlying(status)); return true; } // The device is on - hence ExecuteIfOff does not matter @@ -804,11 +802,11 @@ static Status moveToLevelHandler(EndpointId endpoint, CommandId commandId, uint8 // Cancel any currently active command before fiddling with the state. cancelEndpointTimerCallback(endpoint); - EmberAfStatus status = Attributes::CurrentLevel::Get(endpoint, currentLevel); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = Attributes::CurrentLevel::Get(endpoint, currentLevel); + if (status != Status::Success) { - ChipLogProgress(Zcl, "ERR: reading current level %x", status); - return app::ToInteractionModelStatus(status); + ChipLogProgress(Zcl, "ERR: reading current level %x", to_underlying(status)); + return status; } if (currentLevel.IsNull()) @@ -870,10 +868,10 @@ static Status moveToLevelHandler(EndpointId endpoint, CommandId commandId, uint8 { uint16_t onOffTransitionTime = 0; status = Attributes::OnOffTransitionTime::Get(endpoint, &onOffTransitionTime); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogProgress(Zcl, "ERR: reading on/off transition time %x", status); - return app::ToInteractionModelStatus(status); + ChipLogProgress(Zcl, "ERR: reading on/off transition time %x", to_underlying(status)); + return status; } // Transition time comes in (or is stored, in the case of On/Off Transition @@ -963,7 +961,7 @@ static void moveHandler(app::CommandHandler * commandObj, const app::ConcreteCom // Cancel any currently active command before fiddling with the state. cancelEndpointTimerCallback(endpoint); - status = app::ToInteractionModelStatus(Attributes::CurrentLevel::Get(endpoint, currentLevel)); + status = Attributes::CurrentLevel::Get(endpoint, currentLevel); if (status != Status::Success) { ChipLogProgress(Zcl, "ERR: reading current level %x", to_underlying(status)); @@ -1022,7 +1020,7 @@ static void moveHandler(app::CommandHandler * commandObj, const app::ConcreteCom if (rate.IsNull()) { app::DataModel::Nullable defaultMoveRate; - status = app::ToInteractionModelStatus(Attributes::DefaultMoveRate::Get(endpoint, defaultMoveRate)); + status = Attributes::DefaultMoveRate::Get(endpoint, defaultMoveRate); if (status != Status::Success || defaultMoveRate.IsNull()) { ChipLogProgress(Zcl, "ERR: reading default move rate %x", to_underlying(status)); @@ -1093,7 +1091,7 @@ static void stepHandler(app::CommandHandler * commandObj, const app::ConcreteCom // Cancel any currently active command before fiddling with the state. cancelEndpointTimerCallback(endpoint); - status = app::ToInteractionModelStatus(Attributes::CurrentLevel::Get(endpoint, currentLevel)); + status = Attributes::CurrentLevel::Get(endpoint, currentLevel); if (status != Status::Success) { ChipLogProgress(Zcl, "ERR: reading current level %x", to_underlying(status)); @@ -1244,7 +1242,7 @@ void emberAfOnOffClusterLevelControlEffectCallback(EndpointId endpoint, bool new app::DataModel::Nullable transitionTime; uint16_t currentOnOffTransitionTime; - EmberAfStatus status; + Status status; bool useOnLevel = false; EmberAfLevelControlState * state = getState(endpoint); @@ -1258,9 +1256,9 @@ void emberAfOnOffClusterLevelControlEffectCallback(EndpointId endpoint, bool new // "Temporarily store CurrentLevel." status = Attributes::CurrentLevel::Get(endpoint, temporaryCurrentLevelCache); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogProgress(Zcl, "ERR: reading current level %x", status); + ChipLogProgress(Zcl, "ERR: reading current level %x", to_underlying(status)); return; } @@ -1274,9 +1272,9 @@ void emberAfOnOffClusterLevelControlEffectCallback(EndpointId endpoint, bool new if (emberAfContainsAttribute(endpoint, LevelControl::Id, Attributes::OnLevel::Id)) { status = Attributes::OnLevel::Get(endpoint, resolvedLevel); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogProgress(Zcl, "ERR: reading on level %x", status); + ChipLogProgress(Zcl, "ERR: reading on level %x", to_underlying(status)); return; } @@ -1303,9 +1301,9 @@ void emberAfOnOffClusterLevelControlEffectCallback(EndpointId endpoint, bool new if (emberAfContainsAttribute(endpoint, LevelControl::Id, Attributes::OnOffTransitionTime::Id)) { status = Attributes::OnOffTransitionTime::Get(endpoint, ¤tOnOffTransitionTime); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogProgress(Zcl, "ERR: reading current level %x", status); + ChipLogProgress(Zcl, "ERR: reading current level %x", to_underlying(status)); return; } transitionTime.SetNonNull(currentOnOffTransitionTime); @@ -1323,9 +1321,9 @@ void emberAfOnOffClusterLevelControlEffectCallback(EndpointId endpoint, bool new // If newValue is OnOff::Commands::On::Id... // "Set CurrentLevel to minimum level allowed for the device." status = Attributes::CurrentLevel::Set(endpoint, minimumLevelAllowedForTheDevice); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogProgress(Zcl, "ERR: reading current level %x", status); + ChipLogProgress(Zcl, "ERR: reading current level %x", to_underlying(status)); return; } @@ -1387,8 +1385,8 @@ void emberAfLevelControlClusterServerInitCallback(EndpointId endpoint) } app::DataModel::Nullable currentLevel; - EmberAfStatus status = Attributes::CurrentLevel::Get(endpoint, currentLevel); - if (status == EMBER_ZCL_STATUS_SUCCESS) + Status status = Attributes::CurrentLevel::Get(endpoint, currentLevel); + if (status == Status::Success) { #ifndef IGNORE_LEVEL_CONTROL_CLUSTER_START_UP_CURRENT_LEVEL // StartUp behavior relies StartUpCurrentLevel attributes being Non Volatile. @@ -1409,7 +1407,7 @@ void emberAfLevelControlClusterServerInitCallback(EndpointId endpoint) app::DataModel::Nullable startUpCurrentLevel; status = Attributes::StartUpCurrentLevel::Get(endpoint, startUpCurrentLevel); - if (status == EMBER_ZCL_STATUS_SUCCESS) + if (status == Status::Success) { if (!startUpCurrentLevel.IsNull()) { @@ -1481,7 +1479,7 @@ bool LevelControlHasFeature(EndpointId endpoint, Feature feature) { bool success; uint32_t featureMap; - success = (Attributes::FeatureMap::Get(endpoint, &featureMap) == EMBER_ZCL_STATUS_SUCCESS); + success = (Attributes::FeatureMap::Get(endpoint, &featureMap) == Status::Success); return success ? ((featureMap & to_underlying(feature)) != 0) : false; } diff --git a/src/app/clusters/localization-configuration-server/localization-configuration-server.cpp b/src/app/clusters/localization-configuration-server/localization-configuration-server.cpp index 144665b1c03b19..88283325c7c380 100644 --- a/src/app/clusters/localization-configuration-server/localization-configuration-server.cpp +++ b/src/app/clusters/localization-configuration-server/localization-configuration-server.cpp @@ -30,6 +30,7 @@ #include #include #include +#include using namespace chip; using namespace chip::app; @@ -37,6 +38,8 @@ using namespace chip::app::Clusters; using namespace chip::app::Clusters::LocalizationConfiguration; using namespace chip::app::Clusters::LocalizationConfiguration::Attributes; +using chip::Protocols::InteractionModel::Status; + namespace { class LocalizationConfigurationAttrAccess : public AttributeAccessInterface @@ -163,9 +166,10 @@ void emberAfLocalizationConfigurationClusterServerInitCallback(EndpointId endpoi { char outBuf[Attributes::ActiveLocale::TypeInfo::MaxLength()]; MutableCharSpan activeLocale(outBuf); - EmberAfStatus status = ActiveLocale::Get(endpoint, activeLocale); + Status status = ActiveLocale::Get(endpoint, activeLocale); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, ChipLogError(Zcl, "Failed to read ActiveLocale with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to read ActiveLocale with error: 0x%02x", to_underlying(status))); DeviceLayer::DeviceInfoProvider * provider = DeviceLayer::GetDeviceInfoProvider(); @@ -208,8 +212,8 @@ void emberAfLocalizationConfigurationClusterServerInitCallback(EndpointId endpoi { // If initial value is not one of the allowed values, write the valid value it. status = ActiveLocale::Set(endpoint, validLocale); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to write active locale with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to write active locale with error: 0x%02x", to_underlying(status))); } } } diff --git a/src/app/clusters/media-input-server/media-input-server.cpp b/src/app/clusters/media-input-server/media-input-server.cpp index 02b114c648b2fd..3fe13985b1ff06 100644 --- a/src/app/clusters/media-input-server/media-input-server.cpp +++ b/src/app/clusters/media-input-server/media-input-server.cpp @@ -92,8 +92,8 @@ bool HasFeature(chip::EndpointId endpoint, Feature feature) bool hasFeature = false; uint32_t featureMap = 0; - EmberAfStatus status = Attributes::FeatureMap::Get(endpoint, &featureMap); - if (EMBER_ZCL_STATUS_SUCCESS == status) + Status status = Attributes::FeatureMap::Get(endpoint, &featureMap); + if (Status::Success == status) { hasFeature = (featureMap & chip::to_underlying(feature)); } diff --git a/src/app/clusters/microwave-oven-control-server/microwave-oven-control-server.cpp b/src/app/clusters/microwave-oven-control-server/microwave-oven-control-server.cpp index 9d57d762bd36c4..ddaed23187481d 100644 --- a/src/app/clusters/microwave-oven-control-server/microwave-oven-control-server.cpp +++ b/src/app/clusters/microwave-oven-control-server/microwave-oven-control-server.cpp @@ -22,7 +22,6 @@ #include #include #include -#include using namespace chip; using namespace chip::app; @@ -229,7 +228,7 @@ void Instance::InvokeCommand(HandlerContext & handlerContext) void Instance::HandleSetCookingParameters(HandlerContext & ctx, const Commands::SetCookingParameters::DecodableType & req) { ChipLogDetail(Zcl, "Microwave Oven Control: HandleSetCookingParameters"); - Status status; + Status status = Status::Success; uint8_t opState; uint8_t modeValue; uint8_t reqCookMode; diff --git a/src/app/clusters/microwave-oven-control-server/microwave-oven-control-server.h b/src/app/clusters/microwave-oven-control-server/microwave-oven-control-server.h index d82b353f7f3eb1..ef77717bc15480 100644 --- a/src/app/clusters/microwave-oven-control-server/microwave-oven-control-server.h +++ b/src/app/clusters/microwave-oven-control-server/microwave-oven-control-server.h @@ -23,7 +23,7 @@ #include #include #include -#include + #include namespace chip { diff --git a/src/app/clusters/mode-base-server/mode-base-server.cpp b/src/app/clusters/mode-base-server/mode-base-server.cpp index 6c5feb1d69c88e..76bd195376e9b0 100644 --- a/src/app/clusters/mode-base-server/mode-base-server.cpp +++ b/src/app/clusters/mode-base-server/mode-base-server.cpp @@ -135,7 +135,7 @@ CHIP_ERROR Instance::Init() DataModel::Nullable onMode = GetOnMode(); bool onOffValueForStartUp = false; if (!emberAfIsKnownVolatileAttribute(mEndpointId, OnOff::Id, OnOff::Attributes::StartUpOnOff::Id) && - OnOffServer::Instance().getOnOffValueForStartUp(mEndpointId, onOffValueForStartUp) == EMBER_ZCL_STATUS_SUCCESS) + OnOffServer::Instance().getOnOffValueForStartUp(mEndpointId, onOffValueForStartUp) == Status::Success) { if (onOffValueForStartUp && !onMode.IsNull()) { diff --git a/src/app/clusters/mode-select-server/mode-select-server.cpp b/src/app/clusters/mode-select-server/mode-select-server.cpp index 57cd6d71312012..f8d99474b24c9c 100644 --- a/src/app/clusters/mode-select-server/mode-select-server.cpp +++ b/src/app/clusters/mode-select-server/mode-select-server.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -137,8 +136,8 @@ void emberAfModeSelectClusterServerInitCallback(EndpointId endpointId) // attribute are listed below. DataModel::Nullable startUpMode; - EmberAfStatus status = Attributes::StartUpMode::Get(endpointId, startUpMode); - if (status == EMBER_ZCL_STATUS_SUCCESS && !startUpMode.IsNull()) + Status status = Attributes::StartUpMode::Get(endpointId, startUpMode); + if (status == Status::Success && !startUpMode.IsNull()) { #ifdef MATTER_DM_PLUGIN_ON_OFF // OnMode with Power Up @@ -151,9 +150,9 @@ void emberAfModeSelectClusterServerInitCallback(EndpointId endpointId) { Attributes::OnMode::TypeInfo::Type onMode; bool onOffValueForStartUp = false; - if (Attributes::OnMode::Get(endpointId, onMode) == EMBER_ZCL_STATUS_SUCCESS && + if (Attributes::OnMode::Get(endpointId, onMode) == Status::Success && !emberAfIsKnownVolatileAttribute(endpointId, OnOff::Id, OnOff::Attributes::StartUpOnOff::Id) && - OnOffServer::Instance().getOnOffValueForStartUp(endpointId, onOffValueForStartUp) == EMBER_ZCL_STATUS_SUCCESS) + OnOffServer::Instance().getOnOffValueForStartUp(endpointId, onOffValueForStartUp) == Status::Success) { if (onOffValueForStartUp && !onMode.IsNull()) { @@ -183,12 +182,12 @@ void emberAfModeSelectClusterServerInitCallback(EndpointId endpointId) uint8_t currentMode = 0; status = Attributes::CurrentMode::Get(endpointId, ¤tMode); - if ((status == EMBER_ZCL_STATUS_SUCCESS) && (startUpMode.Value() != currentMode)) + if ((status == Status::Success) && (startUpMode.Value() != currentMode)) { status = Attributes::CurrentMode::Set(endpointId, startUpMode.Value()); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogError(Zcl, "ModeSelect: Error initializing CurrentMode, EmberAfStatus code 0x%02x", status); + ChipLogError(Zcl, "ModeSelect: Error initializing CurrentMode, Status code 0x%02x", to_underlying(status)); } else { diff --git a/src/app/clusters/mode-select-server/supported-modes-manager.h b/src/app/clusters/mode-select-server/supported-modes-manager.h index 4a6ccd20c5f60a..3c36f188cb4a0e 100644 --- a/src/app/clusters/mode-select-server/supported-modes-manager.h +++ b/src/app/clusters/mode-select-server/supported-modes-manager.h @@ -19,7 +19,7 @@ #pragma once #include -#include + #include namespace chip { @@ -74,7 +74,7 @@ class SupportedModesManager * @param mode The mode for which to search the ModeOptionStruct. * @param dataPtr The pointer to receive the ModeOptionStruct, if one is found. * @return Status::Success if successfully found the option. Otherwise, returns appropriate status code (found in - * ) + * ) */ virtual Protocols::InteractionModel::Status getModeOptionByMode(EndpointId endpointId, uint8_t mode, const ModeOptionStructType ** dataPtr) const = 0; diff --git a/src/app/clusters/on-off-server/on-off-server.cpp b/src/app/clusters/on-off-server/on-off-server.cpp index 8d0f849d923b3f..ac1c4a0c3bf3c6 100644 --- a/src/app/clusters/on-off-server/on-off-server.cpp +++ b/src/app/clusters/on-off-server/on-off-server.cpp @@ -22,8 +22,8 @@ #include #include #include -#include #include +#include #include #ifdef MATTER_DM_PLUGIN_SCENES_MANAGEMENT @@ -152,10 +152,10 @@ class DefaultOnOffSceneHandler : public scenes::DefaultSceneHandlerImpl bool currentValue; // read current on/off value - EmberAfStatus status = Attributes::OnOff::Get(endpoint, ¤tValue); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = Attributes::OnOff::Get(endpoint, ¤tValue); + if (status != Status::Success) { - ChipLogError(Zcl, "ERR: reading on/off %x", status); + ChipLogError(Zcl, "ERR: reading on/off %x", to_underlying(status)); return CHIP_ERROR_READ_FAILED; } @@ -312,18 +312,18 @@ bool OnOffServer::HasFeature(chip::EndpointId endpoint, Feature feature) { bool success; uint32_t featureMap; - success = (Attributes::FeatureMap::Get(endpoint, &featureMap) == EMBER_ZCL_STATUS_SUCCESS); + success = (Attributes::FeatureMap::Get(endpoint, &featureMap) == Status::Success); return success ? ((featureMap & to_underlying(feature)) != 0) : false; } -EmberAfStatus OnOffServer::getOnOffValue(chip::EndpointId endpoint, bool * currentOnOffValue) +Status OnOffServer::getOnOffValue(chip::EndpointId endpoint, bool * currentOnOffValue) { // read current on/off value - EmberAfStatus status = Attributes::OnOff::Get(endpoint, currentOnOffValue); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = Attributes::OnOff::Get(endpoint, currentOnOffValue); + if (status != Status::Success) { - ChipLogProgress(Zcl, "ERR: reading on/off %x", status); + ChipLogProgress(Zcl, "ERR: reading on/off %x", to_underlying(status)); } ChipLogProgress(Zcl, "On/Off ep%d value: %d", endpoint, *currentOnOffValue); @@ -340,17 +340,17 @@ EmberAfStatus OnOffServer::getOnOffValue(chip::EndpointId endpoint, bool * curre * @param command Ver.: always * @param initiatedByLevelChange Ver.: always */ -EmberAfStatus OnOffServer::setOnOffValue(chip::EndpointId endpoint, chip::CommandId command, bool initiatedByLevelChange) +Status OnOffServer::setOnOffValue(chip::EndpointId endpoint, chip::CommandId command, bool initiatedByLevelChange) { MATTER_TRACE_SCOPE("setOnOffValue", "OnOff"); - EmberAfStatus status; + Status status; bool currentValue, newValue; // read current on/off value status = Attributes::OnOff::Get(endpoint, ¤tValue); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogProgress(Zcl, "ERR: reading on/off %x", status); + ChipLogProgress(Zcl, "ERR: reading on/off %x", to_underlying(status)); return status; } @@ -358,7 +358,7 @@ EmberAfStatus OnOffServer::setOnOffValue(chip::EndpointId endpoint, chip::Comman if ((!currentValue && command == Commands::Off::Id) || (currentValue && command == Commands::On::Id)) { ChipLogProgress(Zcl, "Endpoint %x On/off already set to new value", endpoint); - return EMBER_ZCL_STATUS_SUCCESS; + return Status::Success; } // we either got a toggle, or an on when off, or an off when on, @@ -397,9 +397,9 @@ EmberAfStatus OnOffServer::setOnOffValue(chip::EndpointId endpoint, chip::Comman // write the new on/off value status = Attributes::OnOff::Set(endpoint, newValue); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogProgress(Zcl, "ERR: writing on/off %x", status); + ChipLogProgress(Zcl, "ERR: writing on/off %x", to_underlying(status)); return status; } @@ -417,7 +417,7 @@ EmberAfStatus OnOffServer::setOnOffValue(chip::EndpointId endpoint, chip::Comman emberAfContainsAttribute(endpoint, ModeSelect::Id, ModeSelect::Attributes::OnMode::Id)) { ModeSelect::Attributes::OnMode::TypeInfo::Type onMode; - if (ModeSelect::Attributes::OnMode::Get(endpoint, onMode) == EMBER_ZCL_STATUS_SUCCESS && !onMode.IsNull()) + if (ModeSelect::Attributes::OnMode::Get(endpoint, onMode) == Status::Success && !onMode.IsNull()) { ChipLogProgress(Zcl, "Changing Current Mode to %x", onMode.Value()); status = ModeSelect::Attributes::CurrentMode::Set(endpoint, onMode.Value()); @@ -443,9 +443,9 @@ EmberAfStatus OnOffServer::setOnOffValue(chip::EndpointId endpoint, chip::Comman { // write the new on/off value status = Attributes::OnOff::Set(endpoint, newValue); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogProgress(Zcl, "ERR: writing on/off %x", status); + ChipLogProgress(Zcl, "ERR: writing on/off %x", to_underlying(status)); return status; } @@ -467,7 +467,7 @@ EmberAfStatus OnOffServer::setOnOffValue(chip::EndpointId endpoint, chip::Comman // The returned status is based solely on the On/Off cluster. Errors in the // Level Control and/or Scenes cluster are ignored. - return EMBER_ZCL_STATUS_SUCCESS; + return Status::Success; } void OnOffServer::initOnOffServer(chip::EndpointId endpoint) @@ -495,8 +495,8 @@ void OnOffServer::initOnOffServer(chip::EndpointId endpoint) // null Set the OnOff attribute to its previous value. bool onOffValueForStartUp = false; - EmberAfStatus status = getOnOffValueForStartUp(endpoint, onOffValueForStartUp); - if (status == EMBER_ZCL_STATUS_SUCCESS) + Status status = getOnOffValueForStartUp(endpoint, onOffValueForStartUp); + if (status == Status::Success) { status = setOnOffValue(endpoint, onOffValueForStartUp, true); } @@ -513,7 +513,7 @@ void OnOffServer::initOnOffServer(chip::EndpointId endpoint) emberAfContainsAttribute(endpoint, ModeSelect::Id, ModeSelect::Attributes::OnMode::Id)) { ModeSelect::Attributes::OnMode::TypeInfo::Type onMode; - if (ModeSelect::Attributes::OnMode::Get(endpoint, onMode) == EMBER_ZCL_STATUS_SUCCESS && !onMode.IsNull()) + if (ModeSelect::Attributes::OnMode::Get(endpoint, onMode) == Status::Success && !onMode.IsNull()) { ChipLogProgress(Zcl, "Changing Current Mode to %x", onMode.Value()); status = ModeSelect::Attributes::CurrentMode::Set(endpoint, onMode.Value()); @@ -533,16 +533,16 @@ void OnOffServer::initOnOffServer(chip::EndpointId endpoint) * @param endpoint Ver.: always * @param onOffValueForStartUp Ver.: always */ -EmberAfStatus OnOffServer::getOnOffValueForStartUp(chip::EndpointId endpoint, bool & onOffValueForStartUp) +Status OnOffServer::getOnOffValueForStartUp(chip::EndpointId endpoint, bool & onOffValueForStartUp) { app::DataModel::Nullable startUpOnOff; - EmberAfStatus status = Attributes::StartUpOnOff::Get(endpoint, startUpOnOff); - if (status == EMBER_ZCL_STATUS_SUCCESS) + Status status = Attributes::StartUpOnOff::Get(endpoint, startUpOnOff); + if (status == Status::Success) { // Initialise updated value to 0 bool updatedOnOff = false; status = Attributes::OnOff::Get(endpoint, &updatedOnOff); - if (status == EMBER_ZCL_STATUS_SUCCESS) + if (status == Status::Success) { if (!startUpOnOff.IsNull()) { @@ -571,27 +571,27 @@ EmberAfStatus OnOffServer::getOnOffValueForStartUp(chip::EndpointId endpoint, bo bool OnOffServer::offCommand(app::CommandHandler * commandObj, const app::ConcreteCommandPath & commandPath) { MATTER_TRACE_SCOPE("OffCommand", "OnOff"); - EmberAfStatus status = setOnOffValue(commandPath.mEndpointId, Commands::Off::Id, false); + Status status = setOnOffValue(commandPath.mEndpointId, Commands::Off::Id, false); - commandObj->AddStatus(commandPath, app::ToInteractionModelStatus(status)); + commandObj->AddStatus(commandPath, status); return true; } bool OnOffServer::onCommand(app::CommandHandler * commandObj, const app::ConcreteCommandPath & commandPath) { MATTER_TRACE_SCOPE("OnCommand", "OnOff"); - EmberAfStatus status = setOnOffValue(commandPath.mEndpointId, Commands::On::Id, false); + Status status = setOnOffValue(commandPath.mEndpointId, Commands::On::Id, false); - commandObj->AddStatus(commandPath, app::ToInteractionModelStatus(status)); + commandObj->AddStatus(commandPath, status); return true; } bool OnOffServer::toggleCommand(app::CommandHandler * commandObj, const app::ConcreteCommandPath & commandPath) { MATTER_TRACE_SCOPE("ToggleCommand", "OnOff"); - EmberAfStatus status = setOnOffValue(commandPath.mEndpointId, Commands::Toggle::Id, false); + Status status = setOnOffValue(commandPath.mEndpointId, Commands::Toggle::Id, false); - commandObj->AddStatus(commandPath, app::ToInteractionModelStatus(status)); + commandObj->AddStatus(commandPath, status); return true; } @@ -643,7 +643,7 @@ bool OnOffServer::offWithEffectCommand(app::CommandHandler * commandObj, const a } } - status = app::ToInteractionModelStatus(setOnOffValue(endpoint, Commands::Off::Id, false)); + status = setOnOffValue(endpoint, Commands::Off::Id, false); } else { diff --git a/src/app/clusters/on-off-server/on-off-server.h b/src/app/clusters/on-off-server/on-off-server.h index 26e62fb2ea1a73..2cb5b62958a6c7 100644 --- a/src/app/clusters/on-off-server/on-off-server.h +++ b/src/app/clusters/on-off-server/on-off-server.h @@ -24,6 +24,7 @@ #include #include #include +#include /********************************************************** * Defines and Macros @@ -61,9 +62,10 @@ class OnOffServer bool OnWithTimedOffCommand(chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath, const chip::app::Clusters::OnOff::Commands::OnWithTimedOff::DecodableType & commandData); void updateOnOffTimeCommand(chip::EndpointId endpoint); - EmberAfStatus getOnOffValue(chip::EndpointId endpoint, bool * currentOnOffValue); - EmberAfStatus setOnOffValue(chip::EndpointId endpoint, chip::CommandId command, bool initiatedByLevelChange); - EmberAfStatus getOnOffValueForStartUp(chip::EndpointId endpoint, bool & onOffValueForStartUp); + chip::Protocols::InteractionModel::Status getOnOffValue(chip::EndpointId endpoint, bool * currentOnOffValue); + chip::Protocols::InteractionModel::Status setOnOffValue(chip::EndpointId endpoint, chip::CommandId command, + bool initiatedByLevelChange); + chip::Protocols::InteractionModel::Status getOnOffValueForStartUp(chip::EndpointId endpoint, bool & onOffValueForStartUp); bool HasFeature(chip::EndpointId endpoint, Feature feature); inline bool SupportsLightingApplications(chip::EndpointId endpointId) { return HasFeature(endpointId, Feature::kLighting); } diff --git a/src/app/clusters/operational-state-server/operational-state-cluster-objects.h b/src/app/clusters/operational-state-server/operational-state-cluster-objects.h index 58fd8401e8adcc..7a2ffa96d04a89 100644 --- a/src/app/clusters/operational-state-server/operational-state-cluster-objects.h +++ b/src/app/clusters/operational-state-server/operational-state-cluster-objects.h @@ -19,7 +19,7 @@ #pragma once #include -#include + #include namespace chip { diff --git a/src/app/clusters/ota-provider/ota-provider.cpp b/src/app/clusters/ota-provider/ota-provider.cpp index 46f55905157a95..3da02b62cec9a8 100644 --- a/src/app/clusters/ota-provider/ota-provider.cpp +++ b/src/app/clusters/ota-provider/ota-provider.cpp @@ -22,7 +22,6 @@ #include #include #include -#include #include #include diff --git a/src/app/clusters/ota-requestor/DefaultOTARequestor.cpp b/src/app/clusters/ota-requestor/DefaultOTARequestor.cpp index 213d9d64b8b5a4..edd0b5729c2708 100644 --- a/src/app/clusters/ota-requestor/DefaultOTARequestor.cpp +++ b/src/app/clusters/ota-requestor/DefaultOTARequestor.cpp @@ -410,14 +410,13 @@ void DefaultOTARequestor::CancelImageUpdate() CHIP_ERROR DefaultOTARequestor::GetUpdateStateProgressAttribute(EndpointId endpointId, app::DataModel::Nullable & progress) { - VerifyOrReturnError(OtaRequestorServerGetUpdateStateProgress(endpointId, progress) == EMBER_ZCL_STATUS_SUCCESS, - CHIP_ERROR_BAD_REQUEST); + VerifyOrReturnError(OtaRequestorServerGetUpdateStateProgress(endpointId, progress) == Status::Success, CHIP_ERROR_BAD_REQUEST); return CHIP_NO_ERROR; } CHIP_ERROR DefaultOTARequestor::GetUpdateStateAttribute(EndpointId endpointId, OTAUpdateStateEnum & state) { - VerifyOrReturnError(OtaRequestorServerGetUpdateState(endpointId, state) == EMBER_ZCL_STATUS_SUCCESS, CHIP_ERROR_BAD_REQUEST); + VerifyOrReturnError(OtaRequestorServerGetUpdateState(endpointId, state) == Status::Success, CHIP_ERROR_BAD_REQUEST); return CHIP_NO_ERROR; } diff --git a/src/app/clusters/ota-requestor/DefaultOTARequestor.h b/src/app/clusters/ota-requestor/DefaultOTARequestor.h index e0e45c2709af2e..025dc66975d8b3 100644 --- a/src/app/clusters/ota-requestor/DefaultOTARequestor.h +++ b/src/app/clusters/ota-requestor/DefaultOTARequestor.h @@ -136,7 +136,7 @@ class DefaultOTARequestor : public OTARequestorInterface, public BDXDownloader:: chip::Messaging::SendFlags sendFlags; if (!event.msgTypeData.HasMessageType(chip::bdx::MessageType::BlockAckEOF) && - !event.msgTypeData.HasMessageType(chip::Protocols::SecureChannel::MsgType::StatusReport)) + !event.msgTypeData.HasMessageType(Protocols::SecureChannel::MsgType::StatusReport)) { sendFlags.Set(chip::Messaging::SendMessageFlags::kExpectResponse); } @@ -162,7 +162,7 @@ class DefaultOTARequestor : public OTARequestorInterface, public BDXDownloader:: mDownloader->OnMessageReceived(payloadHeader, std::move(payload)); // For a receiver using BDX Protocol, all received messages will require a response except for a StatusReport - if (!payloadHeader.HasMessageType(chip::Protocols::SecureChannel::MsgType::StatusReport)) + if (!payloadHeader.HasMessageType(Protocols::SecureChannel::MsgType::StatusReport)) { ec->WillSendMessage(); } diff --git a/src/app/clusters/ota-requestor/OTARequestorInterface.h b/src/app/clusters/ota-requestor/OTARequestorInterface.h index d81b67424f0b60..f03ccab4c75d2d 100644 --- a/src/app/clusters/ota-requestor/OTARequestorInterface.h +++ b/src/app/clusters/ota-requestor/OTARequestorInterface.h @@ -21,7 +21,7 @@ */ #include -#include + #include #pragma once diff --git a/src/app/clusters/ota-requestor/ota-requestor-server.cpp b/src/app/clusters/ota-requestor/ota-requestor-server.cpp index b5611b7d57c70f..8f5d1326aaf70a 100644 --- a/src/app/clusters/ota-requestor/ota-requestor-server.cpp +++ b/src/app/clusters/ota-requestor/ota-requestor-server.cpp @@ -26,6 +26,7 @@ #include #include #include +#include using namespace chip; using namespace chip::app; @@ -147,54 +148,54 @@ CHIP_ERROR OtaSoftwareUpdateRequestorAttrAccess::WriteDefaultOtaProviders(const // ----------------------------------------------------------------------------- // Global functions -EmberAfStatus OtaRequestorServerSetUpdateState(OTAUpdateStateEnum value) +Status OtaRequestorServerSetUpdateState(OTAUpdateStateEnum value) { - EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; + Status status = Status::Success; // Find all endpoints that have OtaSoftwareUpdateRequestor implemented for (auto endpoint : EnabledEndpointsWithServerCluster(OtaSoftwareUpdateRequestor::Id)) { OTAUpdateStateEnum currentValue; status = Attributes::UpdateState::Get(endpoint, ¤tValue); - VerifyOrDie(EMBER_ZCL_STATUS_SUCCESS == status); + VerifyOrDie(Status::Success == status); if (currentValue != value) { status = Attributes::UpdateState::Set(endpoint, value); - VerifyOrDie(EMBER_ZCL_STATUS_SUCCESS == status); + VerifyOrDie(Status::Success == status); } } return status; } -EmberAfStatus OtaRequestorServerGetUpdateState(chip::EndpointId endpointId, OTAUpdateStateEnum & value) +Status OtaRequestorServerGetUpdateState(chip::EndpointId endpointId, OTAUpdateStateEnum & value) { return Attributes::UpdateState::Get(endpointId, &value); } -EmberAfStatus OtaRequestorServerSetUpdateStateProgress(app::DataModel::Nullable value) +Status OtaRequestorServerSetUpdateStateProgress(app::DataModel::Nullable value) { - EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; + Status status = Status::Success; // Find all endpoints that have OtaSoftwareUpdateRequestor implemented for (auto endpoint : EnabledEndpointsWithServerCluster(OtaSoftwareUpdateRequestor::Id)) { app::DataModel::Nullable currentValue; status = Attributes::UpdateStateProgress::Get(endpoint, currentValue); - VerifyOrDie(EMBER_ZCL_STATUS_SUCCESS == status); + VerifyOrDie(Status::Success == status); if (currentValue != value) { status = Attributes::UpdateStateProgress::Set(endpoint, value); - VerifyOrDie(EMBER_ZCL_STATUS_SUCCESS == status); + VerifyOrDie(Status::Success == status); } } return status; } -EmberAfStatus OtaRequestorServerGetUpdateStateProgress(chip::EndpointId endpointId, DataModel::Nullable & value) +Status OtaRequestorServerGetUpdateStateProgress(chip::EndpointId endpointId, DataModel::Nullable & value) { return Attributes::UpdateStateProgress::Get(endpointId, value); } diff --git a/src/app/clusters/ota-requestor/ota-requestor-server.h b/src/app/clusters/ota-requestor/ota-requestor-server.h index 323cb7b49c241e..b8874aa00109f5 100644 --- a/src/app/clusters/ota-requestor/ota-requestor-server.h +++ b/src/app/clusters/ota-requestor/ota-requestor-server.h @@ -19,13 +19,16 @@ #pragma once #include +#include -EmberAfStatus OtaRequestorServerSetUpdateState(chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum value); -EmberAfStatus OtaRequestorServerGetUpdateState(chip::EndpointId endpointId, - chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum & value); -EmberAfStatus OtaRequestorServerSetUpdateStateProgress(chip::app::DataModel::Nullable value); -EmberAfStatus OtaRequestorServerGetUpdateStateProgress(chip::EndpointId endpointId, - chip::app::DataModel::Nullable & value); +chip::Protocols::InteractionModel::Status +OtaRequestorServerSetUpdateState(chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum value); +chip::Protocols::InteractionModel::Status +OtaRequestorServerGetUpdateState(chip::EndpointId endpointId, + chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum & value); +chip::Protocols::InteractionModel::Status OtaRequestorServerSetUpdateStateProgress(chip::app::DataModel::Nullable value); +chip::Protocols::InteractionModel::Status OtaRequestorServerGetUpdateStateProgress(chip::EndpointId endpointId, + chip::app::DataModel::Nullable & value); void OtaRequestorServerOnStateTransition(chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum previousState, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum newState, diff --git a/src/app/clusters/pump-configuration-and-control-server/pump-configuration-and-control-server.cpp b/src/app/clusters/pump-configuration-and-control-server/pump-configuration-and-control-server.cpp index 76f2a3d01830ed..c3eebe257c6b17 100644 --- a/src/app/clusters/pump-configuration-and-control-server/pump-configuration-and-control-server.cpp +++ b/src/app/clusters/pump-configuration-and-control-server/pump-configuration-and-control-server.cpp @@ -32,6 +32,8 @@ using namespace chip::app; using namespace chip::app::Clusters; using namespace chip::app::Clusters::PumpConfigurationAndControl; +using chip::Protocols::InteractionModel::Status; + namespace chip { namespace app { namespace Clusters { @@ -232,7 +234,7 @@ bool HasFeature(EndpointId endpoint, Feature feature) { bool hasFeature; uint32_t featureMap; - hasFeature = (Attributes::FeatureMap::Get(endpoint, &featureMap) == EMBER_ZCL_STATUS_SUCCESS); + hasFeature = (Attributes::FeatureMap::Get(endpoint, &featureMap) == Status::Success); return hasFeature ? ((featureMap & to_underlying(feature)) != 0) : false; } diff --git a/src/app/clusters/refrigerator-alarm-server/refrigerator-alarm-server.cpp b/src/app/clusters/refrigerator-alarm-server/refrigerator-alarm-server.cpp index aefc65ecd8a05a..620e113177c1c7 100644 --- a/src/app/clusters/refrigerator-alarm-server/refrigerator-alarm-server.cpp +++ b/src/app/clusters/refrigerator-alarm-server/refrigerator-alarm-server.cpp @@ -23,7 +23,6 @@ #include #include #include -#include using namespace chip; using namespace chip::app; @@ -41,12 +40,12 @@ RefrigeratorAlarmServer & RefrigeratorAlarmServer::Instance() return instance; } -EmberAfStatus RefrigeratorAlarmServer::GetMaskValue(EndpointId endpoint, BitMask * mask) +Status RefrigeratorAlarmServer::GetMaskValue(EndpointId endpoint, BitMask * mask) { - EmberAfStatus status = Attributes::Mask::Get(endpoint, mask); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = Attributes::Mask::Get(endpoint, mask); + if (status != Status::Success) { - ChipLogProgress(Zcl, "Refrigerator Alarm: ERR: reading mask, err:0x%x", status); + ChipLogProgress(Zcl, "Refrigerator Alarm: ERR: reading mask, err:0x%x", to_underlying(status)); } else { @@ -56,12 +55,12 @@ EmberAfStatus RefrigeratorAlarmServer::GetMaskValue(EndpointId endpoint, BitMask return status; } -EmberAfStatus RefrigeratorAlarmServer::GetStateValue(EndpointId endpoint, BitMask * state) +Status RefrigeratorAlarmServer::GetStateValue(EndpointId endpoint, BitMask * state) { - EmberAfStatus status = Attributes::State::Get(endpoint, state); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = Attributes::State::Get(endpoint, state); + if (status != Status::Success) { - ChipLogProgress(Zcl, "Refrigerator Alarm: ERR: reading state, err:0x%x", status); + ChipLogProgress(Zcl, "Refrigerator Alarm: ERR: reading state, err:0x%x", to_underlying(status)); } else { @@ -71,12 +70,12 @@ EmberAfStatus RefrigeratorAlarmServer::GetStateValue(EndpointId endpoint, BitMas return status; } -EmberAfStatus RefrigeratorAlarmServer::GetSupportedValue(EndpointId endpoint, BitMask * supported) +Status RefrigeratorAlarmServer::GetSupportedValue(EndpointId endpoint, BitMask * supported) { - EmberAfStatus status = Attributes::Supported::Get(endpoint, supported); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = Attributes::Supported::Get(endpoint, supported); + if (status != Status::Success) { - ChipLogProgress(Zcl, "Refrigerator Alarm: ERR: reading supported, err:0x%x", status); + ChipLogProgress(Zcl, "Refrigerator Alarm: ERR: reading supported, err:0x%x", to_underlying(status)); } else { @@ -86,13 +85,13 @@ EmberAfStatus RefrigeratorAlarmServer::GetSupportedValue(EndpointId endpoint, Bi return status; } -EmberAfStatus RefrigeratorAlarmServer::SetMaskValue(EndpointId endpoint, const BitMask mask) +Status RefrigeratorAlarmServer::SetMaskValue(EndpointId endpoint, const BitMask mask) { - EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; - status = Attributes::Mask::Set(endpoint, mask); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = Status::Success; + status = Attributes::Mask::Set(endpoint, mask); + if (status != Status::Success) { - ChipLogProgress(Zcl, "Refrigerator Alarm: ERR: writing mask, err:0x%x", status); + ChipLogProgress(Zcl, "Refrigerator Alarm: ERR: writing mask, err:0x%x", to_underlying(status)); return status; } @@ -101,7 +100,7 @@ EmberAfStatus RefrigeratorAlarmServer::SetMaskValue(EndpointId endpoint, const B // Whenever there is change in Mask, State should change accordingly. BitMask state; status = GetStateValue(endpoint, &state); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { return status; } @@ -114,22 +113,22 @@ EmberAfStatus RefrigeratorAlarmServer::SetMaskValue(EndpointId endpoint, const B return status; } -EmberAfStatus RefrigeratorAlarmServer::SetStateValue(EndpointId endpoint, BitMask newState) +Status RefrigeratorAlarmServer::SetStateValue(EndpointId endpoint, BitMask newState) { - EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; + Status status = Status::Success; BitMask currentState; status = Attributes::State::Get(endpoint, ¤tState); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogProgress(Zcl, "Refrigerator Alarm: ERR: reading state, err:0x%x", status); + ChipLogProgress(Zcl, "Refrigerator Alarm: ERR: reading state, err:0x%x", to_underlying(status)); return status; } status = Attributes::State::Set(endpoint, newState); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { - ChipLogProgress(Zcl, "Refrigerator Alarm: ERR: writing state, err:0x%x", status); + ChipLogProgress(Zcl, "Refrigerator Alarm: ERR: writing state, err:0x%x", to_underlying(status)); return status; } @@ -144,7 +143,7 @@ EmberAfStatus RefrigeratorAlarmServer::SetStateValue(EndpointId endpoint, BitMas BitMask mask; status = GetMaskValue(endpoint, &mask); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { return status; } @@ -153,13 +152,13 @@ EmberAfStatus RefrigeratorAlarmServer::SetStateValue(EndpointId endpoint, BitMas return status; } -EmberAfStatus RefrigeratorAlarmServer::SetSupportedValue(EndpointId endpoint, const BitMask supported) +Status RefrigeratorAlarmServer::SetSupportedValue(EndpointId endpoint, const BitMask supported) { - EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; - status = Attributes::Supported::Set(endpoint, supported); - if (status != EMBER_ZCL_STATUS_SUCCESS) + Status status = Status::Success; + status = Attributes::Supported::Set(endpoint, supported); + if (status != Status::Success) { - ChipLogProgress(Zcl, "Refrigerator Alarm: ERR: writing supported, err:0x%x", status); + ChipLogProgress(Zcl, "Refrigerator Alarm: ERR: writing supported, err:0x%x", to_underlying(status)); return status; } @@ -168,7 +167,7 @@ EmberAfStatus RefrigeratorAlarmServer::SetSupportedValue(EndpointId endpoint, co // Whenever there is change in Supported attribute, Mask, State should change accordingly. BitMask mask; status = GetMaskValue(endpoint, &mask); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { return status; } diff --git a/src/app/clusters/refrigerator-alarm-server/refrigerator-alarm-server.h b/src/app/clusters/refrigerator-alarm-server/refrigerator-alarm-server.h index 1ed6023a9dbeab..65df99d82bb2c0 100644 --- a/src/app/clusters/refrigerator-alarm-server/refrigerator-alarm-server.h +++ b/src/app/clusters/refrigerator-alarm-server/refrigerator-alarm-server.h @@ -23,28 +23,31 @@ #include #include #include +#include class RefrigeratorAlarmServer { public: static RefrigeratorAlarmServer & Instance(); - EmberAfStatus GetMaskValue(chip::EndpointId endpoint, chip::BitMask * mask); - EmberAfStatus GetStateValue(chip::EndpointId endpoint, chip::BitMask * state); - EmberAfStatus GetSupportedValue(chip::EndpointId endpoint, - chip::BitMask * suppported); + chip::Protocols::InteractionModel::Status GetMaskValue(chip::EndpointId endpoint, + chip::BitMask * mask); + chip::Protocols::InteractionModel::Status + GetStateValue(chip::EndpointId endpoint, chip::BitMask * state); + chip::Protocols::InteractionModel::Status + GetSupportedValue(chip::EndpointId endpoint, chip::BitMask * suppported); // A change in mask value will result in a corresponding change in state. - EmberAfStatus SetMaskValue(chip::EndpointId endpoint, - const chip::BitMask mask); + chip::Protocols::InteractionModel::Status + SetMaskValue(chip::EndpointId endpoint, const chip::BitMask mask); // When State changes we are generating Notify event. - EmberAfStatus SetStateValue(chip::EndpointId endpoint, - chip::BitMask newState); + chip::Protocols::InteractionModel::Status + SetStateValue(chip::EndpointId endpoint, chip::BitMask newState); // A change in supported value will result in a corresponding change in mask and state. - EmberAfStatus SetSupportedValue(chip::EndpointId endpoint, - const chip::BitMask supported); + chip::Protocols::InteractionModel::Status + SetSupportedValue(chip::EndpointId endpoint, const chip::BitMask supported); private: static RefrigeratorAlarmServer instance; diff --git a/src/app/clusters/resource-monitoring-server/replacement-product-list-manager.h b/src/app/clusters/resource-monitoring-server/replacement-product-list-manager.h index bd63dabca180c9..cdf64cc2c3dce2 100644 --- a/src/app/clusters/resource-monitoring-server/replacement-product-list-manager.h +++ b/src/app/clusters/resource-monitoring-server/replacement-product-list-manager.h @@ -20,7 +20,7 @@ #include #include -#include + #include namespace chip { diff --git a/src/app/clusters/resource-monitoring-server/resource-monitoring-server.h b/src/app/clusters/resource-monitoring-server/resource-monitoring-server.h index da17d36f0d2c3d..8cdc74f34c1b0d 100644 --- a/src/app/clusters/resource-monitoring-server/resource-monitoring-server.h +++ b/src/app/clusters/resource-monitoring-server/resource-monitoring-server.h @@ -91,10 +91,10 @@ class Instance : public CommandHandlerInterface, public AttributeAccessInterface bool HasFeature(ResourceMonitoring::Feature aFeature) const; // Attribute setters - chip::Protocols::InteractionModel::Status UpdateCondition(uint8_t aNewCondition); - chip::Protocols::InteractionModel::Status UpdateChangeIndication(ChangeIndicationEnum aNewChangeIndication); - chip::Protocols::InteractionModel::Status UpdateInPlaceIndicator(bool aNewInPlaceIndicator); - chip::Protocols::InteractionModel::Status UpdateLastChangedTime(DataModel::Nullable aNewLastChangedTime); + Protocols::InteractionModel::Status UpdateCondition(uint8_t aNewCondition); + Protocols::InteractionModel::Status UpdateChangeIndication(ChangeIndicationEnum aNewChangeIndication); + Protocols::InteractionModel::Status UpdateInPlaceIndicator(bool aNewInPlaceIndicator); + Protocols::InteractionModel::Status UpdateLastChangedTime(DataModel::Nullable aNewLastChangedTime); void SetReplacementProductListManagerInstance(ReplacementProductListManager * instance); @@ -196,7 +196,7 @@ class Delegate * @return Status::Success If the command was handled successfully. * @return All Other PreResetCondition() or PostResetCondition() failed, these are application specific. */ - virtual chip::Protocols::InteractionModel::Status OnResetCondition(); + virtual Protocols::InteractionModel::Status OnResetCondition(); /** * This method may be overwritten by the SDK User, if the SDK User wants to do something before the reset. @@ -206,7 +206,7 @@ class Delegate * @return Status::Success All good, the reset may proceed. * @return All Other The reset should not proceed. The reset command will fail. */ - virtual chip::Protocols::InteractionModel::Status PreResetCondition(); + virtual Protocols::InteractionModel::Status PreResetCondition(); /** * This method may be overwritten by the SDK User, if the SDK User wants to do something after the reset. @@ -217,7 +217,7 @@ class Delegate * @return All Other Something went wrong. The attributes will already be updated. But the reset command will report * the failure. */ - virtual chip::Protocols::InteractionModel::Status PostResetCondition(); + virtual Protocols::InteractionModel::Status PostResetCondition(); }; } // namespace ResourceMonitoring diff --git a/src/app/clusters/scenes-server/scenes-server.cpp b/src/app/clusters/scenes-server/scenes-server.cpp index c595ee6486779f..fc0c656d17fffd 100644 --- a/src/app/clusters/scenes-server/scenes-server.cpp +++ b/src/app/clusters/scenes-server/scenes-server.cpp @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include @@ -42,6 +41,7 @@ using GroupDataProvider = chip::Credentials::GroupDataProvider; using SceneTable = chip::scenes::SceneTable; using AuthMode = chip::Access::AuthMode; using ScenesServer = chip::app::Clusters::ScenesManagement::ScenesServer; +using chip::Protocols::InteractionModel::Status; namespace chip { namespace app { @@ -75,23 +75,23 @@ CHIP_ERROR AddResponseOnError(CommandHandlerInterface::HandlerContext & ctx, Res return err; } -/// @brief Generate and add a response to a command handler context depending on an EmberAfStatus +/// @brief Generate and add a response to a command handler context depending on an InteractionModel::Status /// @tparam ResponseType Type of response, depends on the command /// @param ctx Command Handler context where to add reponse /// @param resp Response to add in ctx /// @param status Status to verify -/// @return EmberAfStatus -> CHIP_ERROR +/// @return InteractionModel::Status -> CHIP_ERROR template -CHIP_ERROR AddResponseOnError(CommandHandlerInterface::HandlerContext & ctx, ResponseType & resp, EmberAfStatus status) +CHIP_ERROR AddResponseOnError(CommandHandlerInterface::HandlerContext & ctx, ResponseType & resp, Status status) { - return AddResponseOnError(ctx, resp, StatusIB(ToInteractionModelStatus(status)).ToChipError()); + return AddResponseOnError(ctx, resp, StatusIB(status).ToChipError()); } template CHIP_ERROR UpdateLastConfiguredBy(HandlerContext & ctx, ResponseType resp) { Access::SubjectDescriptor descriptor = ctx.mCommandHandler.GetSubjectDescriptor(); - EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; + Status status = Status::Success; if (AuthMode::kCase == descriptor.authMode) { @@ -103,7 +103,7 @@ CHIP_ERROR UpdateLastConfiguredBy(HandlerContext & ctx, ResponseType resp) } // LastConfiguredBy is optional, so we don't want to fail the command if it fails to update - VerifyOrReturnValue(!(EMBER_ZCL_STATUS_SUCCESS == status || EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE == status), CHIP_NO_ERROR); + VerifyOrReturnValue(!(Status::Success == status || Status::UnsupportedAttribute == status), CHIP_NO_ERROR); return AddResponseOnError(ctx, resp, status); } @@ -536,8 +536,7 @@ CHIP_ERROR StoreSceneParse(const FabricIndex & fabricIdx, const EndpointId & end ScenesServer::Instance().MakeSceneInvalid(endpointID, fabricIdx); uint16_t endpointTableSize = 0; - ReturnErrorOnFailure( - StatusIB(ToInteractionModelStatus(Attributes::SceneTableSize::Get(endpointID, &endpointTableSize))).ToChipError()); + ReturnErrorOnFailure(StatusIB(Attributes::SceneTableSize::Get(endpointID, &endpointTableSize)).ToChipError()); // Get Scene Table Instance SceneTable * sceneTable = scenes::GetSceneTableImpl(endpointID, endpointTableSize); @@ -567,8 +566,7 @@ CHIP_ERROR StoreSceneParse(const FabricIndex & fabricIdx, const EndpointId & end else { uint32_t featureMap = 0; - ReturnErrorOnFailure( - StatusIB(ToInteractionModelStatus(Attributes::FeatureMap::Get(endpointID, &featureMap))).ToChipError()); + ReturnErrorOnFailure(StatusIB(Attributes::FeatureMap::Get(endpointID, &featureMap)).ToChipError()); // Check if we still support scenes name in case an OTA changed that, if we don't, set name to empty if (!(featureMap & to_underlying(Feature::kSceneNames))) { @@ -597,8 +595,7 @@ CHIP_ERROR RecallSceneParse(const FabricIndex & fabricIdx, const EndpointId & en ScenesServer::Instance().MakeSceneInvalidForAllFabrics(endpointID); uint16_t endpointTableSize = 0; - ReturnErrorOnFailure( - StatusIB(ToInteractionModelStatus(Attributes::SceneTableSize::Get(endpointID, &endpointTableSize))).ToChipError()); + ReturnErrorOnFailure(StatusIB(Attributes::SceneTableSize::Get(endpointID, &endpointTableSize)).ToChipError()); // Get Scene Table Instance SceneTable * sceneTable = scenes::GetSceneTableImpl(endpointID, endpointTableSize); @@ -1112,10 +1109,10 @@ using namespace chip::app::Clusters::ScenesManagement; void emberAfScenesManagementClusterServerInitCallback(EndpointId endpoint) { - EmberAfStatus status = Attributes::LastConfiguredBy::SetNull(endpoint); - if (EMBER_ZCL_STATUS_SUCCESS != status) + Status status = Attributes::LastConfiguredBy::SetNull(endpoint); + if (Status::Success != status) { - ChipLogDetail(Zcl, "ERR: setting LastConfiguredBy on Endpoint %hu Status: %x", endpoint, status); + ChipLogDetail(Zcl, "ERR: setting LastConfiguredBy on Endpoint %hu Status: %x", endpoint, to_underlying(status)); } // Initialize the FabricSceneInfo by getting the number of scenes and the remaining capacity for storing fabric scene data @@ -1129,7 +1126,7 @@ void emberAfScenesManagementClusterServerInitCallback(EndpointId endpoint) void MatterScenesManagementClusterServerShutdownCallback(EndpointId endpoint) { uint16_t endpointTableSize = 0; - ReturnOnFailure(Attributes::SceneTableSize::Get(endpoint, &endpointTableSize)); + VerifyOrReturn(Status::Success == Attributes::SceneTableSize::Get(endpoint, &endpointTableSize)); // Get Scene Table Instance SceneTable * sceneTable = scenes::GetSceneTableImpl(endpoint, endpointTableSize); diff --git a/src/app/clusters/smoke-co-alarm-server/smoke-co-alarm-server.cpp b/src/app/clusters/smoke-co-alarm-server/smoke-co-alarm-server.cpp index 2d5ae5fe2a2480..5b3da157d515e2 100644 --- a/src/app/clusters/smoke-co-alarm-server/smoke-co-alarm-server.cpp +++ b/src/app/clusters/smoke-co-alarm-server/smoke-co-alarm-server.cpp @@ -467,11 +467,11 @@ void SmokeCoAlarmServer::SendEvent(EndpointId endpointId, T & event) template bool SmokeCoAlarmServer::GetAttribute(EndpointId endpointId, AttributeId attributeId, - EmberAfStatus (*getFn)(EndpointId endpointId, T * value), T & value) const + Status (*getFn)(EndpointId endpointId, T * value), T & value) const { - EmberAfStatus status = getFn(endpointId, &value); - bool success = (EMBER_ZCL_STATUS_SUCCESS == status); - bool unsupportedStatus = (EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE == status); + Status status = getFn(endpointId, &value); + bool success = (Status::Success == status); + bool unsupportedStatus = (Status::UnsupportedAttribute == status); if (unsupportedStatus) { @@ -487,10 +487,10 @@ bool SmokeCoAlarmServer::GetAttribute(EndpointId endpointId, AttributeId attribu template bool SmokeCoAlarmServer::SetAttribute(EndpointId endpointId, AttributeId attributeId, - EmberAfStatus (*setFn)(EndpointId endpointId, T value), T value) + Status (*setFn)(EndpointId endpointId, T value), T value) { - EmberAfStatus status = setFn(endpointId, value); - bool success = (EMBER_ZCL_STATUS_SUCCESS == status); + Status status = setFn(endpointId, value); + bool success = (Status::Success == status); if (!success) { diff --git a/src/app/clusters/smoke-co-alarm-server/smoke-co-alarm-server.h b/src/app/clusters/smoke-co-alarm-server/smoke-co-alarm-server.h index 37bd1f6bd11a83..42efc49ee8e092 100644 --- a/src/app/clusters/smoke-co-alarm-server/smoke-co-alarm-server.h +++ b/src/app/clusters/smoke-co-alarm-server/smoke-co-alarm-server.h @@ -26,6 +26,7 @@ #include #include #include +#include /** * @brief Smoke CO Alarm Server Plugin class @@ -139,7 +140,7 @@ class SmokeCoAlarmServer */ template bool GetAttribute(chip::EndpointId endpointId, chip::AttributeId attributeId, - EmberAfStatus (*getFn)(chip::EndpointId endpointId, T * value), T & value) const; + chip::Protocols::InteractionModel::Status (*getFn)(chip::EndpointId endpointId, T * value), T & value) const; /** * @brief Set generic attribute value @@ -154,7 +155,7 @@ class SmokeCoAlarmServer */ template bool SetAttribute(chip::EndpointId endpointId, chip::AttributeId attributeId, - EmberAfStatus (*setFn)(chip::EndpointId endpointId, T value), T value); + chip::Protocols::InteractionModel::Status (*setFn)(chip::EndpointId endpointId, T value), T value); friend bool emberAfSmokeCoAlarmClusterSelfTestRequestCallback( chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath, diff --git a/src/app/clusters/temperature-control-server/supported-temperature-levels-manager.h b/src/app/clusters/temperature-control-server/supported-temperature-levels-manager.h index 754be5701dd33c..5ff3db169261be 100644 --- a/src/app/clusters/temperature-control-server/supported-temperature-levels-manager.h +++ b/src/app/clusters/temperature-control-server/supported-temperature-levels-manager.h @@ -19,7 +19,7 @@ #pragma once #include -#include + #include namespace chip { diff --git a/src/app/clusters/temperature-control-server/temperature-control-server.cpp b/src/app/clusters/temperature-control-server/temperature-control-server.cpp index 8c72347818333e..9194c168fb236a 100644 --- a/src/app/clusters/temperature-control-server/temperature-control-server.cpp +++ b/src/app/clusters/temperature-control-server/temperature-control-server.cpp @@ -21,7 +21,6 @@ #include #include #include -#include using namespace chip; using namespace chip::app; @@ -100,7 +99,7 @@ bool TemperatureControlHasFeature(EndpointId endpoint, TemperatureControl::Featu { bool success; uint32_t featureMap; - success = (Attributes::FeatureMap::Get(endpoint, &featureMap) == EMBER_ZCL_STATUS_SUCCESS); + success = (Attributes::FeatureMap::Get(endpoint, &featureMap) == Status::Success); return success ? ((featureMap & to_underlying(feature)) != 0) : false; } @@ -117,7 +116,6 @@ bool emberAfTemperatureControlClusterSetTemperatureCallback(app::CommandHandler auto & targetTemperatureLevel = commandData.targetTemperatureLevel; EndpointId endpoint = commandPath.mEndpointId; Status status = Status::Success; - EmberAfStatus emberAfStatus = EMBER_ZCL_STATUS_SUCCESS; if (TemperatureControlHasFeature(endpoint, Feature::kTemperatureNumber) && TemperatureControlHasFeature(endpoint, Feature::kTemperatureLevel)) @@ -131,17 +129,15 @@ bool emberAfTemperatureControlClusterSetTemperatureCallback(app::CommandHandler { int16_t minTemperature = 0; int16_t maxTemperature = 0; - emberAfStatus = MinTemperature::Get(endpoint, &minTemperature); - if (emberAfStatus != EMBER_ZCL_STATUS_SUCCESS) + status = MinTemperature::Get(endpoint, &minTemperature); + if (status != Status::Success) { - status = app::ToInteractionModelStatus(emberAfStatus); goto exit; } - emberAfStatus = MaxTemperature::Get(endpoint, &maxTemperature); - if (emberAfStatus != EMBER_ZCL_STATUS_SUCCESS) + status = MaxTemperature::Get(endpoint, &maxTemperature); + if (status != Status::Success) { - status = app::ToInteractionModelStatus(emberAfStatus); goto exit; } @@ -152,11 +148,10 @@ bool emberAfTemperatureControlClusterSetTemperatureCallback(app::CommandHandler } if (TemperatureControlHasFeature(endpoint, TemperatureControl::Feature::kTemperatureStep)) { - int16_t step = 0; - emberAfStatus = Step::Get(endpoint, &step); - if (emberAfStatus != EMBER_ZCL_STATUS_SUCCESS) + int16_t step = 0; + status = Step::Get(endpoint, &step); + if (status != Status::Success) { - status = app::ToInteractionModelStatus(emberAfStatus); goto exit; } @@ -166,8 +161,8 @@ bool emberAfTemperatureControlClusterSetTemperatureCallback(app::CommandHandler goto exit; } } - emberAfStatus = TemperatureSetpoint::Set(endpoint, targetTemperature.Value()); - if (emberAfStatus != EMBER_ZCL_STATUS_SUCCESS) + status = TemperatureSetpoint::Set(endpoint, targetTemperature.Value()); + if (status != Status::Success) { /** * If the server is unable to execute the command at the time the command is received @@ -200,8 +195,8 @@ bool emberAfTemperatureControlClusterSetTemperatureCallback(app::CommandHandler if (targetTemperatureLevel.Value() < size) { - emberAfStatus = SelectedTemperatureLevel::Set(endpoint, targetTemperatureLevel.Value()); - if (emberAfStatus != EMBER_ZCL_STATUS_SUCCESS) + status = SelectedTemperatureLevel::Set(endpoint, targetTemperatureLevel.Value()); + if (status != Status::Success) { /** * If the server is unable to execute the command at the time the command is received diff --git a/src/app/clusters/thermostat-server/thermostat-server.cpp b/src/app/clusters/thermostat-server/thermostat-server.cpp index f5a5157a7e44e9..c0e43593316816 100644 --- a/src/app/clusters/thermostat-server/thermostat-server.cpp +++ b/src/app/clusters/thermostat-server/thermostat-server.cpp @@ -26,7 +26,6 @@ #include #include #include -#include #include using namespace chip; @@ -83,7 +82,7 @@ CHIP_ERROR ThermostatAttrAccess::Read(const ConcreteReadAttributePath & aPath, A VerifyOrDie(aPath.mClusterId == Thermostat::Id); uint32_t ourFeatureMap; - bool localTemperatureNotExposedSupported = (FeatureMap::Get(aPath.mEndpointId, &ourFeatureMap) == EMBER_ZCL_STATUS_SUCCESS) && + bool localTemperatureNotExposedSupported = (FeatureMap::Get(aPath.mEndpointId, &ourFeatureMap) == imcode::Success) && ((ourFeatureMap & to_underlying(Feature::kLocalTemperatureNotExposed)) != 0); switch (aPath.mAttributeId) @@ -98,10 +97,10 @@ CHIP_ERROR ThermostatAttrAccess::Read(const ConcreteReadAttributePath & aPath, A if (localTemperatureNotExposedSupported) { BitMask valueRemoteSensing; - EmberAfStatus status = RemoteSensing::Get(aPath.mEndpointId, &valueRemoteSensing); - if (status != EMBER_ZCL_STATUS_SUCCESS) + imcode status = RemoteSensing::Get(aPath.mEndpointId, &valueRemoteSensing); + if (status != imcode::Success) { - StatusIB statusIB(ToInteractionModelStatus(status)); + StatusIB statusIB(status); return statusIB.ToChipError(); } valueRemoteSensing.Clear(RemoteSensingBitmap::kLocalTemperature); @@ -140,7 +139,7 @@ CHIP_ERROR ThermostatAttrAccess::Write(const ConcreteDataAttributePath & aPath, VerifyOrDie(aPath.mClusterId == Thermostat::Id); uint32_t ourFeatureMap; - bool localTemperatureNotExposedSupported = (FeatureMap::Get(aPath.mEndpointId, &ourFeatureMap) == EMBER_ZCL_STATUS_SUCCESS) && + bool localTemperatureNotExposedSupported = (FeatureMap::Get(aPath.mEndpointId, &ourFeatureMap) == imcode::Success) && ((ourFeatureMap & to_underlying(Feature::kLocalTemperatureNotExposed)) != 0); switch (aPath.mAttributeId) @@ -154,9 +153,8 @@ CHIP_ERROR ThermostatAttrAccess::Write(const ConcreteDataAttributePath & aPath, { return CHIP_IM_GLOBAL_STATUS(ConstraintError); } - - EmberAfStatus status = RemoteSensing::Set(aPath.mEndpointId, valueRemoteSensing); - StatusIB statusIB(ToInteractionModelStatus(status)); + imcode status = RemoteSensing::Set(aPath.mEndpointId, valueRemoteSensing); + StatusIB statusIB(status); return statusIB.ToChipError(); } break; @@ -227,7 +225,7 @@ MatterThermostatClusterServerPreAttributeChangedCallback(const app::ConcreteAttr bool CoolSupported = false; bool OccupancySupported = false; - if (FeatureMap::Get(endpoint, &OurFeatureMap) != EMBER_ZCL_STATUS_SUCCESS) + if (FeatureMap::Get(endpoint, &OurFeatureMap) != imcode::Success) OurFeatureMap = FEATURE_MAP_DEFAULT; if (OurFeatureMap & 1 << 5) // Bit 5 is Auto Mode supported @@ -244,60 +242,60 @@ MatterThermostatClusterServerPreAttributeChangedCallback(const app::ConcreteAttr if (AutoSupported) { - if (MinSetpointDeadBand::Get(endpoint, &DeadBand) != EMBER_ZCL_STATUS_SUCCESS) + if (MinSetpointDeadBand::Get(endpoint, &DeadBand) != imcode::Success) { DeadBand = kDefaultDeadBand; } DeadBandTemp = static_cast(DeadBand * 10); } - if (AbsMinCoolSetpointLimit::Get(endpoint, &AbsMinCoolSetpointLimit) != EMBER_ZCL_STATUS_SUCCESS) + if (AbsMinCoolSetpointLimit::Get(endpoint, &AbsMinCoolSetpointLimit) != imcode::Success) AbsMinCoolSetpointLimit = kDefaultAbsMinCoolSetpointLimit; - if (AbsMaxCoolSetpointLimit::Get(endpoint, &AbsMaxCoolSetpointLimit) != EMBER_ZCL_STATUS_SUCCESS) + if (AbsMaxCoolSetpointLimit::Get(endpoint, &AbsMaxCoolSetpointLimit) != imcode::Success) AbsMaxCoolSetpointLimit = kDefaultAbsMaxCoolSetpointLimit; - if (MinCoolSetpointLimit::Get(endpoint, &MinCoolSetpointLimit) != EMBER_ZCL_STATUS_SUCCESS) + if (MinCoolSetpointLimit::Get(endpoint, &MinCoolSetpointLimit) != imcode::Success) MinCoolSetpointLimit = AbsMinCoolSetpointLimit; - if (MaxCoolSetpointLimit::Get(endpoint, &MaxCoolSetpointLimit) != EMBER_ZCL_STATUS_SUCCESS) + if (MaxCoolSetpointLimit::Get(endpoint, &MaxCoolSetpointLimit) != imcode::Success) MaxCoolSetpointLimit = AbsMaxCoolSetpointLimit; - if (AbsMinHeatSetpointLimit::Get(endpoint, &AbsMinHeatSetpointLimit) != EMBER_ZCL_STATUS_SUCCESS) + if (AbsMinHeatSetpointLimit::Get(endpoint, &AbsMinHeatSetpointLimit) != imcode::Success) AbsMinHeatSetpointLimit = kDefaultAbsMinHeatSetpointLimit; - if (AbsMaxHeatSetpointLimit::Get(endpoint, &AbsMaxHeatSetpointLimit) != EMBER_ZCL_STATUS_SUCCESS) + if (AbsMaxHeatSetpointLimit::Get(endpoint, &AbsMaxHeatSetpointLimit) != imcode::Success) AbsMaxHeatSetpointLimit = kDefaultAbsMaxHeatSetpointLimit; - if (MinHeatSetpointLimit::Get(endpoint, &MinHeatSetpointLimit) != EMBER_ZCL_STATUS_SUCCESS) + if (MinHeatSetpointLimit::Get(endpoint, &MinHeatSetpointLimit) != imcode::Success) MinHeatSetpointLimit = AbsMinHeatSetpointLimit; - if (MaxHeatSetpointLimit::Get(endpoint, &MaxHeatSetpointLimit) != EMBER_ZCL_STATUS_SUCCESS) + if (MaxHeatSetpointLimit::Get(endpoint, &MaxHeatSetpointLimit) != imcode::Success) MaxHeatSetpointLimit = AbsMaxHeatSetpointLimit; if (CoolSupported) - if (OccupiedCoolingSetpoint::Get(endpoint, &OccupiedCoolingSetpoint) != EMBER_ZCL_STATUS_SUCCESS) + if (OccupiedCoolingSetpoint::Get(endpoint, &OccupiedCoolingSetpoint) != imcode::Success) { ChipLogError(Zcl, "Error: Can not read Occupied Cooling Setpoint"); return imcode::Failure; } if (HeatSupported) - if (OccupiedHeatingSetpoint::Get(endpoint, &OccupiedHeatingSetpoint) != EMBER_ZCL_STATUS_SUCCESS) + if (OccupiedHeatingSetpoint::Get(endpoint, &OccupiedHeatingSetpoint) != imcode::Success) { ChipLogError(Zcl, "Error: Can not read Occupied Heating Setpoint"); return imcode::Failure; } if (CoolSupported && OccupancySupported) - if (UnoccupiedCoolingSetpoint::Get(endpoint, &UnoccupiedCoolingSetpoint) != EMBER_ZCL_STATUS_SUCCESS) + if (UnoccupiedCoolingSetpoint::Get(endpoint, &UnoccupiedCoolingSetpoint) != imcode::Success) { ChipLogError(Zcl, "Error: Can not read Unoccupied Cooling Setpoint"); return imcode::Failure; } if (HeatSupported && OccupancySupported) - if (UnoccupiedHeatingSetpoint::Get(endpoint, &UnoccupiedHeatingSetpoint) != EMBER_ZCL_STATUS_SUCCESS) + if (UnoccupiedHeatingSetpoint::Get(endpoint, &UnoccupiedHeatingSetpoint) != imcode::Success) { ChipLogError(Zcl, "Error: Can not read Unoccupied Heating Setpoint"); return imcode::Failure; @@ -435,8 +433,8 @@ MatterThermostatClusterServerPreAttributeChangedCallback(const app::ConcreteAttr case SystemMode::Id: { ControlSequenceOfOperationEnum ControlSequenceOfOperation; - EmberAfStatus status = ControlSequenceOfOperation::Get(endpoint, &ControlSequenceOfOperation); - if (status != EMBER_ZCL_STATUS_SUCCESS) + imcode status = ControlSequenceOfOperation::Get(endpoint, &ControlSequenceOfOperation); + if (status != imcode::Success) { return imcode::InvalidValue; } @@ -567,7 +565,7 @@ int16_t EnforceHeatingSetpointLimits(int16_t HeatingSetpoint, EndpointId endpoin // Note that the limits are initialized above per the spec limits // if they are not present Get() will not update the value so the defaults are used - EmberAfStatus status; + imcode status; // https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/3724 // behavior is not specified when Abs * values are not present and user values are present @@ -577,24 +575,24 @@ int16_t EnforceHeatingSetpointLimits(int16_t HeatingSetpoint, EndpointId endpoin // if a attribute is not present then it's default shall be used. status = AbsMinHeatSetpointLimit::Get(endpoint, &AbsMinHeatSetpointLimit); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != imcode::Success) { ChipLogError(Zcl, "Warning: AbsMinHeatSetpointLimit missing using default"); } status = AbsMaxHeatSetpointLimit::Get(endpoint, &AbsMaxHeatSetpointLimit); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != imcode::Success) { ChipLogError(Zcl, "Warning: AbsMaxHeatSetpointLimit missing using default"); } status = MinHeatSetpointLimit::Get(endpoint, &MinHeatSetpointLimit); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != imcode::Success) { MinHeatSetpointLimit = AbsMinHeatSetpointLimit; } status = MaxHeatSetpointLimit::Get(endpoint, &MaxHeatSetpointLimit); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != imcode::Success) { MaxHeatSetpointLimit = AbsMaxHeatSetpointLimit; } @@ -638,7 +636,7 @@ int16_t EnforceCoolingSetpointLimits(int16_t CoolingSetpoint, EndpointId endpoin // Note that the limits are initialized above per the spec limits // if they are not present Get() will not update the value so the defaults are used - EmberAfStatus status; + imcode status; // https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/3724 // behavior is not specified when Abs * values are not present and user values are present @@ -648,25 +646,25 @@ int16_t EnforceCoolingSetpointLimits(int16_t CoolingSetpoint, EndpointId endpoin // if a attribute is not present then it's default shall be used. status = AbsMinCoolSetpointLimit::Get(endpoint, &AbsMinCoolSetpointLimit); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != imcode::Success) { ChipLogError(Zcl, "Warning: AbsMinCoolSetpointLimit missing using default"); } status = AbsMaxCoolSetpointLimit::Get(endpoint, &AbsMaxCoolSetpointLimit); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != imcode::Success) { ChipLogError(Zcl, "Warning: AbsMaxCoolSetpointLimit missing using default"); } status = MinCoolSetpointLimit::Get(endpoint, &MinCoolSetpointLimit); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != imcode::Success) { MinCoolSetpointLimit = AbsMinCoolSetpointLimit; } status = MaxCoolSetpointLimit::Get(endpoint, &MaxCoolSetpointLimit); - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != imcode::Success) { MaxCoolSetpointLimit = AbsMaxCoolSetpointLimit; } @@ -703,17 +701,17 @@ bool emberAfThermostatClusterSetpointRaiseLowerCallback(app::CommandHandler * co EndpointId aEndpointId = commandPath.mEndpointId; int16_t HeatingSetpoint = kDefaultHeatingSetpoint, CoolingSetpoint = kDefaultCoolingSetpoint; // Set to defaults to be safe - EmberAfStatus status = EMBER_ZCL_STATUS_FAILURE; - EmberAfStatus WriteCoolingSetpointStatus = EMBER_ZCL_STATUS_FAILURE; - EmberAfStatus WriteHeatingSetpointStatus = EMBER_ZCL_STATUS_FAILURE; - int16_t DeadBandTemp = 0; - int8_t DeadBand = 0; + imcode status = imcode::Failure; + imcode WriteCoolingSetpointStatus = imcode::Failure; + imcode WriteHeatingSetpointStatus = imcode::Failure; + int16_t DeadBandTemp = 0; + int8_t DeadBand = 0; uint32_t OurFeatureMap; bool AutoSupported = false; bool HeatSupported = false; bool CoolSupported = false; - if (FeatureMap::Get(aEndpointId, &OurFeatureMap) != EMBER_ZCL_STATUS_SUCCESS) + if (FeatureMap::Get(aEndpointId, &OurFeatureMap) != imcode::Success) OurFeatureMap = FEATURE_MAP_DEFAULT; if (OurFeatureMap & 1 << 5) // Bit 5 is Auto Mode supported @@ -727,7 +725,7 @@ bool emberAfThermostatClusterSetpointRaiseLowerCallback(app::CommandHandler * co if (AutoSupported) { - if (MinSetpointDeadBand::Get(aEndpointId, &DeadBand) != EMBER_ZCL_STATUS_SUCCESS) + if (MinSetpointDeadBand::Get(aEndpointId, &DeadBand) != imcode::Success) DeadBand = kDefaultDeadBand; DeadBandTemp = static_cast(DeadBand * 10); } @@ -738,13 +736,13 @@ bool emberAfThermostatClusterSetpointRaiseLowerCallback(app::CommandHandler * co if (HeatSupported && CoolSupported) { int16_t DesiredCoolingSetpoint, CoolLimit, DesiredHeatingSetpoint, HeatLimit; - if (OccupiedCoolingSetpoint::Get(aEndpointId, &CoolingSetpoint) == EMBER_ZCL_STATUS_SUCCESS) + if (OccupiedCoolingSetpoint::Get(aEndpointId, &CoolingSetpoint) == imcode::Success) { DesiredCoolingSetpoint = static_cast(CoolingSetpoint + amount * 10); CoolLimit = static_cast(DesiredCoolingSetpoint - EnforceCoolingSetpointLimits(DesiredCoolingSetpoint, aEndpointId)); { - if (OccupiedHeatingSetpoint::Get(aEndpointId, &HeatingSetpoint) == EMBER_ZCL_STATUS_SUCCESS) + if (OccupiedHeatingSetpoint::Get(aEndpointId, &HeatingSetpoint) == imcode::Success) { DesiredHeatingSetpoint = static_cast(HeatingSetpoint + amount * 10); HeatLimit = static_cast(DesiredHeatingSetpoint - @@ -766,12 +764,12 @@ bool emberAfThermostatClusterSetpointRaiseLowerCallback(app::CommandHandler * co } } WriteCoolingSetpointStatus = OccupiedCoolingSetpoint::Set(aEndpointId, DesiredCoolingSetpoint); - if (WriteCoolingSetpointStatus != EMBER_ZCL_STATUS_SUCCESS) + if (WriteCoolingSetpointStatus != imcode::Success) { ChipLogError(Zcl, "Error: SetOccupiedCoolingSetpoint failed!"); } WriteHeatingSetpointStatus = OccupiedHeatingSetpoint::Set(aEndpointId, DesiredHeatingSetpoint); - if (WriteHeatingSetpointStatus != EMBER_ZCL_STATUS_SUCCESS) + if (WriteHeatingSetpointStatus != imcode::Success) { ChipLogError(Zcl, "Error: SetOccupiedHeatingSetpoint failed!"); } @@ -783,12 +781,12 @@ bool emberAfThermostatClusterSetpointRaiseLowerCallback(app::CommandHandler * co if (CoolSupported && !HeatSupported) { - if (OccupiedCoolingSetpoint::Get(aEndpointId, &CoolingSetpoint) == EMBER_ZCL_STATUS_SUCCESS) + if (OccupiedCoolingSetpoint::Get(aEndpointId, &CoolingSetpoint) == imcode::Success) { CoolingSetpoint = static_cast(CoolingSetpoint + amount * 10); CoolingSetpoint = EnforceCoolingSetpointLimits(CoolingSetpoint, aEndpointId); WriteCoolingSetpointStatus = OccupiedCoolingSetpoint::Set(aEndpointId, CoolingSetpoint); - if (WriteCoolingSetpointStatus != EMBER_ZCL_STATUS_SUCCESS) + if (WriteCoolingSetpointStatus != imcode::Success) { ChipLogError(Zcl, "Error: SetOccupiedCoolingSetpoint failed!"); } @@ -797,34 +795,34 @@ bool emberAfThermostatClusterSetpointRaiseLowerCallback(app::CommandHandler * co if (HeatSupported && !CoolSupported) { - if (OccupiedHeatingSetpoint::Get(aEndpointId, &HeatingSetpoint) == EMBER_ZCL_STATUS_SUCCESS) + if (OccupiedHeatingSetpoint::Get(aEndpointId, &HeatingSetpoint) == imcode::Success) { HeatingSetpoint = static_cast(HeatingSetpoint + amount * 10); HeatingSetpoint = EnforceHeatingSetpointLimits(HeatingSetpoint, aEndpointId); WriteHeatingSetpointStatus = OccupiedHeatingSetpoint::Set(aEndpointId, HeatingSetpoint); - if (WriteHeatingSetpointStatus != EMBER_ZCL_STATUS_SUCCESS) + if (WriteHeatingSetpointStatus != imcode::Success) { ChipLogError(Zcl, "Error: SetOccupiedHeatingSetpoint failed!"); } } } - if ((!HeatSupported || WriteHeatingSetpointStatus == EMBER_ZCL_STATUS_SUCCESS) && - (!CoolSupported || WriteCoolingSetpointStatus == EMBER_ZCL_STATUS_SUCCESS)) - status = EMBER_ZCL_STATUS_SUCCESS; + if ((!HeatSupported || WriteHeatingSetpointStatus == imcode::Success) && + (!CoolSupported || WriteCoolingSetpointStatus == imcode::Success)) + status = imcode::Success; break; case SetpointRaiseLowerModeEnum::kCool: if (CoolSupported) { - if (OccupiedCoolingSetpoint::Get(aEndpointId, &CoolingSetpoint) == EMBER_ZCL_STATUS_SUCCESS) + if (OccupiedCoolingSetpoint::Get(aEndpointId, &CoolingSetpoint) == imcode::Success) { CoolingSetpoint = static_cast(CoolingSetpoint + amount * 10); CoolingSetpoint = EnforceCoolingSetpointLimits(CoolingSetpoint, aEndpointId); if (AutoSupported) { // Need to check if we can move the cooling setpoint while maintaining the dead band - if (OccupiedHeatingSetpoint::Get(aEndpointId, &HeatingSetpoint) == EMBER_ZCL_STATUS_SUCCESS) + if (OccupiedHeatingSetpoint::Get(aEndpointId, &HeatingSetpoint) == imcode::Success) { if (CoolingSetpoint - HeatingSetpoint < DeadBandTemp) { @@ -835,10 +833,10 @@ bool emberAfThermostatClusterSetpointRaiseLowerCallback(app::CommandHandler * co { // Desired cooling setpoint is enforcable // Set the new cooling and heating setpoints - if (OccupiedHeatingSetpoint::Set(aEndpointId, HeatingSetpoint) == EMBER_ZCL_STATUS_SUCCESS) + if (OccupiedHeatingSetpoint::Set(aEndpointId, HeatingSetpoint) == imcode::Success) { - if (OccupiedCoolingSetpoint::Set(aEndpointId, CoolingSetpoint) == EMBER_ZCL_STATUS_SUCCESS) - status = EMBER_ZCL_STATUS_SUCCESS; + if (OccupiedCoolingSetpoint::Set(aEndpointId, CoolingSetpoint) == imcode::Success) + status = imcode::Success; } else ChipLogError(Zcl, "Error: SetOccupiedHeatingSetpoint failed!"); @@ -846,7 +844,7 @@ bool emberAfThermostatClusterSetpointRaiseLowerCallback(app::CommandHandler * co else { ChipLogError(Zcl, "Error: Could Not adjust heating setpoint to maintain dead band!"); - status = EMBER_ZCL_STATUS_INVALID_COMMAND; + status = imcode::InvalidCommand; } } else @@ -864,20 +862,20 @@ bool emberAfThermostatClusterSetpointRaiseLowerCallback(app::CommandHandler * co ChipLogError(Zcl, "Error: GetOccupiedCoolingSetpoint failed!"); } else - status = EMBER_ZCL_STATUS_INVALID_COMMAND; + status = imcode::InvalidCommand; break; case SetpointRaiseLowerModeEnum::kHeat: if (HeatSupported) { - if (OccupiedHeatingSetpoint::Get(aEndpointId, &HeatingSetpoint) == EMBER_ZCL_STATUS_SUCCESS) + if (OccupiedHeatingSetpoint::Get(aEndpointId, &HeatingSetpoint) == imcode::Success) { HeatingSetpoint = static_cast(HeatingSetpoint + amount * 10); HeatingSetpoint = EnforceHeatingSetpointLimits(HeatingSetpoint, aEndpointId); if (AutoSupported) { // Need to check if we can move the cooling setpoint while maintaining the dead band - if (OccupiedCoolingSetpoint::Get(aEndpointId, &CoolingSetpoint) == EMBER_ZCL_STATUS_SUCCESS) + if (OccupiedCoolingSetpoint::Get(aEndpointId, &CoolingSetpoint) == imcode::Success) { if (CoolingSetpoint - HeatingSetpoint < DeadBandTemp) { @@ -888,10 +886,10 @@ bool emberAfThermostatClusterSetpointRaiseLowerCallback(app::CommandHandler * co { // Desired cooling setpoint is enforcable // Set the new cooling and heating setpoints - if (OccupiedCoolingSetpoint::Set(aEndpointId, CoolingSetpoint) == EMBER_ZCL_STATUS_SUCCESS) + if (OccupiedCoolingSetpoint::Set(aEndpointId, CoolingSetpoint) == imcode::Success) { - if (OccupiedHeatingSetpoint::Set(aEndpointId, HeatingSetpoint) == EMBER_ZCL_STATUS_SUCCESS) - status = EMBER_ZCL_STATUS_SUCCESS; + if (OccupiedHeatingSetpoint::Set(aEndpointId, HeatingSetpoint) == imcode::Success) + status = imcode::Success; } else ChipLogError(Zcl, "Error: SetOccupiedCoolingSetpoint failed!"); @@ -899,7 +897,7 @@ bool emberAfThermostatClusterSetpointRaiseLowerCallback(app::CommandHandler * co else { ChipLogError(Zcl, "Error: Could Not adjust cooling setpoint to maintain dead band!"); - status = EMBER_ZCL_STATUS_INVALID_COMMAND; + status = imcode::InvalidCommand; } } else @@ -917,15 +915,15 @@ bool emberAfThermostatClusterSetpointRaiseLowerCallback(app::CommandHandler * co ChipLogError(Zcl, "Error: GetOccupiedHeatingSetpoint failed!"); } else - status = EMBER_ZCL_STATUS_INVALID_COMMAND; + status = imcode::InvalidCommand; break; default: - status = EMBER_ZCL_STATUS_INVALID_COMMAND; + status = imcode::InvalidCommand; break; } - commandObj->AddStatus(commandPath, app::ToInteractionModelStatus(status)); + commandObj->AddStatus(commandPath, status); return true; } diff --git a/src/app/clusters/time-format-localization-server/time-format-localization-server.cpp b/src/app/clusters/time-format-localization-server/time-format-localization-server.cpp index 8539566e75dece..08e90207760603 100644 --- a/src/app/clusters/time-format-localization-server/time-format-localization-server.cpp +++ b/src/app/clusters/time-format-localization-server/time-format-localization-server.cpp @@ -39,6 +39,8 @@ using namespace chip::app::Clusters::TimeFormatLocalization; using namespace chip::app::Clusters::TimeFormatLocalization::Attributes; using namespace chip::DeviceLayer; +using chip::Protocols::InteractionModel::Status; + namespace { class TimeFormatLocalizationAttrAccess : public AttributeAccessInterface @@ -202,18 +204,18 @@ void emberAfTimeFormatLocalizationClusterServerInitCallback(EndpointId endpoint) { CalendarTypeEnum calendarType; CalendarTypeEnum validType; - EmberAfStatus status = ActiveCalendarType::Get(endpoint, &calendarType); + Status status = ActiveCalendarType::Get(endpoint, &calendarType); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to read calendar type with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to read calendar type with error: 0x%02x", to_underlying(status))); // We could have an invalid calendar type value if an OTA update removed support for the value we were using. // If initial value is not one of the allowed values, pick one valid value and write it. if (!IsSupportedCalendarType(calendarType, validType)) { status = ActiveCalendarType::Set(endpoint, validType); - VerifyOrReturn(EMBER_ZCL_STATUS_SUCCESS == status, - ChipLogError(Zcl, "Failed to write calendar type with error: 0x%02x", status)); + VerifyOrReturn(Status::Success == status, + ChipLogError(Zcl, "Failed to write calendar type with error: 0x%02x", to_underlying(status))); } } diff --git a/src/app/clusters/time-synchronization-server/time-synchronization-delegate.h b/src/app/clusters/time-synchronization-server/time-synchronization-delegate.h index 6ef37f2403927d..7d5bad65ff0d2e 100644 --- a/src/app/clusters/time-synchronization-server/time-synchronization-delegate.h +++ b/src/app/clusters/time-synchronization-server/time-synchronization-delegate.h @@ -23,6 +23,7 @@ #include #include #include +#include namespace chip { namespace app { @@ -43,7 +44,7 @@ class Delegate inline bool HasFeature(Feature feature) { uint32_t map; - bool success = (Attributes::FeatureMap::Get(mEndpoint, &map) == EMBER_ZCL_STATUS_SUCCESS); + bool success = (Attributes::FeatureMap::Get(mEndpoint, &map) == Protocols::InteractionModel::Status::Success); return success ? (map & to_underlying(feature)) : false; } diff --git a/src/app/clusters/time-synchronization-server/time-synchronization-server.cpp b/src/app/clusters/time-synchronization-server/time-synchronization-server.cpp index 8e919ef5bb7976..cc6c3f509c8937 100644 --- a/src/app/clusters/time-synchronization-server/time-synchronization-server.cpp +++ b/src/app/clusters/time-synchronization-server/time-synchronization-server.cpp @@ -380,9 +380,9 @@ void TimeSynchronizationServer::OnTimeSyncCompletionFn(TimeSourceEnum timeSource } return; } - mGranularity = granularity; - EmberAfStatus status = TimeSource::Set(kRootEndpointId, timeSource); - if (!(status == EMBER_ZCL_STATUS_SUCCESS || status == EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE)) + mGranularity = granularity; + Status status = TimeSource::Set(kRootEndpointId, timeSource); + if (!(status == Status::Success || status == Status::UnsupportedAttribute)) { ChipLogError(Zcl, "Writing TimeSource failed."); } @@ -394,8 +394,8 @@ void TimeSynchronizationServer::OnFallbackNTPCompletionFn(bool timeSyncSuccessfu { mGranularity = GranularityEnum::kMillisecondsGranularity; // Non-matter SNTP because we know it's external and there's only one source - EmberAfStatus status = TimeSource::Set(kRootEndpointId, TimeSourceEnum::kNonMatterSNTP); - if (!(status == EMBER_ZCL_STATUS_SUCCESS || status == EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE)) + Status status = TimeSource::Set(kRootEndpointId, TimeSourceEnum::kNonMatterSNTP); + if (!(status == Status::Success || status == Status::UnsupportedAttribute)) { ChipLogError(Zcl, "Writing TimeSource failed."); } @@ -777,9 +777,9 @@ CHIP_ERROR TimeSynchronizationServer::SetUTCTime(EndpointId ep, uint64_t utcTime return err; } GetDelegate()->UTCTimeAvailabilityChanged(utcTime); - mGranularity = granularity; - EmberAfStatus status = TimeSource::Set(ep, source); - if (!(status == EMBER_ZCL_STATUS_SUCCESS || status == EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE)) + mGranularity = granularity; + Status status = TimeSource::Set(ep, source); + if (!(status == Status::Success || status == Status::UnsupportedAttribute)) { ChipLogError(Zcl, "Writing TimeSource failed."); return CHIP_IM_GLOBAL_STATUS(Failure); @@ -1264,7 +1264,7 @@ bool emberAfTimeSynchronizationClusterSetDefaultNTPCallback( return true; } bool dnsResolve; - if (EMBER_ZCL_STATUS_SUCCESS != SupportsDNSResolve::Get(commandPath.mEndpointId, &dnsResolve)) + if (Status::Success != SupportsDNSResolve::Get(commandPath.mEndpointId, &dnsResolve)) { commandObj->AddStatus(commandPath, Status::Failure); return true; diff --git a/src/app/clusters/valve-configuration-and-control-server/valve-configuration-and-control-server.cpp b/src/app/clusters/valve-configuration-and-control-server/valve-configuration-and-control-server.cpp index 62d5e1b2c77da8..120cd2b3dd8416 100644 --- a/src/app/clusters/valve-configuration-and-control-server/valve-configuration-and-control-server.cpp +++ b/src/app/clusters/valve-configuration-and-control-server/valve-configuration-and-control-server.cpp @@ -280,19 +280,18 @@ CHIP_ERROR CloseValve(EndpointId ep) DataModel::Nullable rDuration; CHIP_ERROR attribute_error = CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == TargetState::Set(ep, ValveConfigurationAndControl::ValveStateEnum::kClosed), + VerifyOrReturnError(Status::Success == TargetState::Set(ep, ValveConfigurationAndControl::ValveStateEnum::kClosed), attribute_error); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == - CurrentState::Set(ep, ValveConfigurationAndControl::ValveStateEnum::kTransitioning), + VerifyOrReturnError(Status::Success == CurrentState::Set(ep, ValveConfigurationAndControl::ValveStateEnum::kTransitioning), attribute_error); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == OpenDuration::SetNull(ep), attribute_error); + VerifyOrReturnError(Status::Success == OpenDuration::SetNull(ep), attribute_error); if (HasFeature(ep, ValveConfigurationAndControl::Feature::kLevel)) { - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == TargetLevel::Set(ep, 0), attribute_error); + VerifyOrReturnError(Status::Success == TargetLevel::Set(ep, 0), attribute_error); } if (HasFeature(ep, ValveConfigurationAndControl::Feature::kTimeSync)) { - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AutoCloseTime::SetNull(ep), attribute_error); + VerifyOrReturnError(Status::Success == AutoCloseTime::SetNull(ep), attribute_error); } SetRemainingDurationNull(ep); RemainingDurationTable * item = GetRemainingDurationItem(ep); @@ -329,11 +328,11 @@ CHIP_ERROR SetValveLevel(EndpointId ep, DataModel::Nullable level, Data uint64_t time = openDuration.Value() * chip::kMicrosecondsPerSecond; autoCloseTime.SetNonNull(chipEpochTime + time); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AutoCloseTime::Set(ep, autoCloseTime), attribute_error); + VerifyOrReturnError(Status::Success == AutoCloseTime::Set(ep, autoCloseTime), attribute_error); } else { - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AutoCloseTime::SetNull(ep), attribute_error); + VerifyOrReturnError(Status::Success == AutoCloseTime::SetNull(ep), attribute_error); } #else return CHIP_ERROR_NOT_IMPLEMENTED; @@ -343,19 +342,18 @@ CHIP_ERROR SetValveLevel(EndpointId ep, DataModel::Nullable level, Data // level can only be null if LVL feature is not supported if (HasFeature(ep, ValveConfigurationAndControl::Feature::kLevel) && !level.IsNull()) { - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == TargetLevel::Set(ep, level), attribute_error); + VerifyOrReturnError(Status::Success == TargetLevel::Set(ep, level), attribute_error); } - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == OpenDuration::Set(ep, openDuration), attribute_error); + VerifyOrReturnError(Status::Success == OpenDuration::Set(ep, openDuration), attribute_error); SetRemainingDuration(ep, openDuration); // Trigger report for remainingduration MatterReportingAttributeChangeCallback(ep, ValveConfigurationAndControl::Id, RemainingDuration::Id); // set targetstate to open - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == TargetState::Set(ep, ValveConfigurationAndControl::ValveStateEnum::kOpen), + VerifyOrReturnError(Status::Success == TargetState::Set(ep, ValveConfigurationAndControl::ValveStateEnum::kOpen), attribute_error); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == - CurrentState::Set(ep, ValveConfigurationAndControl::ValveStateEnum::kTransitioning), + VerifyOrReturnError(Status::Success == CurrentState::Set(ep, ValveConfigurationAndControl::ValveStateEnum::kTransitioning), attribute_error); // start movement towards target @@ -365,7 +363,7 @@ CHIP_ERROR SetValveLevel(EndpointId ep, DataModel::Nullable level, Data DataModel::Nullable cLevel = delegate->HandleOpenValve(level); if (HasFeature(ep, ValveConfigurationAndControl::Feature::kLevel)) { - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == CurrentLevel::Set(ep, cLevel), attribute_error); + VerifyOrReturnError(Status::Success == CurrentLevel::Set(ep, cLevel), attribute_error); } } // start countdown @@ -378,8 +376,7 @@ CHIP_ERROR UpdateCurrentLevel(EndpointId ep, Percent currentLevel) { if (HasFeature(ep, ValveConfigurationAndControl::Feature::kLevel)) { - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == CurrentLevel::Set(ep, currentLevel), - CHIP_IM_GLOBAL_STATUS(ConstraintError)); + VerifyOrReturnError(Status::Success == CurrentLevel::Set(ep, currentLevel), CHIP_IM_GLOBAL_STATUS(ConstraintError)); return CHIP_NO_ERROR; } return CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute); @@ -387,7 +384,7 @@ CHIP_ERROR UpdateCurrentLevel(EndpointId ep, Percent currentLevel) CHIP_ERROR UpdateCurrentState(EndpointId ep, ValveConfigurationAndControl::ValveStateEnum currentState) { - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == CurrentState::Set(ep, currentState), CHIP_IM_GLOBAL_STATUS(ConstraintError)); + VerifyOrReturnError(Status::Success == CurrentState::Set(ep, currentState), CHIP_IM_GLOBAL_STATUS(ConstraintError)); emitValveStateChangedEvent(ep, currentState); return CHIP_NO_ERROR; } @@ -406,7 +403,7 @@ void UpdateAutoCloseTime(uint64_t time) if (!d.IsNull() && d.Value() != 0) { uint64_t closingTime = d.Value() * chip::kMicrosecondsPerSecond + time; - if (EMBER_ZCL_STATUS_SUCCESS != AutoCloseTime::Set(t.endpoint, closingTime)) + if (Status::Success != AutoCloseTime::Set(t.endpoint, closingTime)) { ChipLogError(Zcl, "Unable to update AutoCloseTime"); } @@ -431,7 +428,7 @@ bool emberAfValveConfigurationAndControlClusterOpenCallback( Optional status = Optional::Missing(); // if fault is registered return FailureDueToFault - if (EMBER_ZCL_STATUS_SUCCESS == ValveFault::Get(ep, &fault) && fault.HasAny()) + if (Status::Success == ValveFault::Get(ep, &fault) && fault.HasAny()) { commandObj->AddClusterSpecificFailure(commandPath, to_underlying(ValveConfigurationAndControl::StatusCodeEnum::kFailureDueToFault)); @@ -450,7 +447,7 @@ bool emberAfValveConfigurationAndControlClusterOpenCallback( } else { - VerifyOrExit(EMBER_ZCL_STATUS_SUCCESS == DefaultOpenDuration::Get(ep, duration), status.Emplace(Status::Failure)); + VerifyOrExit(Status::Success == DefaultOpenDuration::Get(ep, duration), status.Emplace(Status::Failure)); } if (HasFeature(ep, ValveConfigurationAndControl::Feature::kLevel)) @@ -460,7 +457,7 @@ bool emberAfValveConfigurationAndControlClusterOpenCallback( { level.SetNonNull(targetLevel.Value()); } - else if (EMBER_ZCL_STATUS_SUCCESS == DefaultOpenLevel::Get(ep, &defOpenLevel)) + else if (Status::Success == DefaultOpenLevel::Get(ep, &defOpenLevel)) { level.SetNonNull(defOpenLevel); } @@ -497,7 +494,7 @@ bool emberAfValveConfigurationAndControlClusterCloseCallback( BitMask fault(0); // if fault is registered return FailureDueToFault - if (EMBER_ZCL_STATUS_SUCCESS == ValveFault::Get(ep, &fault) && fault.HasAny()) + if (Status::Success == ValveFault::Get(ep, &fault) && fault.HasAny()) { commandObj->AddClusterSpecificFailure(commandPath, to_underlying(ValveConfigurationAndControl::StatusCodeEnum::kFailureDueToFault)); diff --git a/src/app/clusters/valve-configuration-and-control-server/valve-configuration-and-control-server.h b/src/app/clusters/valve-configuration-and-control-server/valve-configuration-and-control-server.h index 5e94c000aeab27..74c8a623c02c61 100644 --- a/src/app/clusters/valve-configuration-and-control-server/valve-configuration-and-control-server.h +++ b/src/app/clusters/valve-configuration-and-control-server/valve-configuration-and-control-server.h @@ -30,6 +30,7 @@ #include #include #include +#include namespace chip { namespace app { @@ -49,7 +50,7 @@ void UpdateAutoCloseTime(uint64_t time); inline bool HasFeature(EndpointId ep, Feature feature) { uint32_t map; - bool success = (Attributes::FeatureMap::Get(ep, &map) == EMBER_ZCL_STATUS_SUCCESS); + bool success = (Attributes::FeatureMap::Get(ep, &map) == Protocols::InteractionModel::Status::Success); return success ? (map & to_underlying(feature)) : false; } diff --git a/src/app/clusters/wifi-network-diagnostics-server/wifi-network-diagnostics-server.cpp b/src/app/clusters/wifi-network-diagnostics-server/wifi-network-diagnostics-server.cpp index bd02f36d731cf2..f116def50c089a 100644 --- a/src/app/clusters/wifi-network-diagnostics-server/wifi-network-diagnostics-server.cpp +++ b/src/app/clusters/wifi-network-diagnostics-server/wifi-network-diagnostics-server.cpp @@ -163,6 +163,7 @@ CHIP_ERROR WiFiDiagosticsAttrAccess::ReadWiFiRssi(AttributeValueEncoder & aEncod { rssi.SetNonNull(value); ChipLogProgress(Zcl, "The current RSSI of the Node’s Wi-Fi radio in dB: %d", value); + MATTER_TRACE_METRIC("wifi_rssi", value); } else { diff --git a/src/app/clusters/window-covering-server/window-covering-server.cpp b/src/app/clusters/window-covering-server/window-covering-server.cpp index 79956d0c448894..ba7d74c56583a5 100644 --- a/src/app/clusters/window-covering-server/window-covering-server.cpp +++ b/src/app/clusters/window-covering-server/window-covering-server.cpp @@ -26,7 +26,6 @@ #include #include #include -#include #include #include @@ -119,8 +118,8 @@ bool HasFeature(chip::EndpointId endpoint, Feature feature) bool hasFeature = false; uint32_t featureMap = 0; - EmberAfStatus status = Attributes::FeatureMap::Get(endpoint, &featureMap); - if (EMBER_ZCL_STATUS_SUCCESS == status) + Status status = Attributes::FeatureMap::Get(endpoint, &featureMap); + if (Status::Success == status) { hasFeature = (featureMap & chip::to_underlying(feature)); } diff --git a/src/app/common/BUILD.gn b/src/app/common/BUILD.gn index f2eb7b479f42a2..193d4c362e537e 100644 --- a/src/app/common/BUILD.gn +++ b/src/app/common/BUILD.gn @@ -44,11 +44,3 @@ source_set("enums") { public_configs = [ ":includes" ] } - -source_set("simulated") { - sources = [ "${chip_root}/zzz_generated/app-common/app-common/zap-generated/tests/simulated-cluster-objects.h" ] - - public_deps = [ ":enums" ] - - public_configs = [ ":includes" ] -} diff --git a/src/app/icd/server/ICDManager.cpp b/src/app/icd/server/ICDManager.cpp index 05948feb3406a1..2388f7b9b63265 100644 --- a/src/app/icd/server/ICDManager.cpp +++ b/src/app/icd/server/ICDManager.cpp @@ -37,6 +37,8 @@ using namespace chip::app::Clusters; using namespace chip::app::Clusters::IcdManagement; using namespace System::Clock; +using chip::Protocols::InteractionModel::Status; + static_assert(UINT8_MAX >= CHIP_CONFIG_MAX_EXCHANGE_CONTEXTS, "ICDManager::mOpenExchangeContextCount cannot hold count for the max exchange count"); @@ -105,7 +107,7 @@ bool ICDManager::SupportsFeature(Feature feature) // Can't use attribute accessors/Attributes::FeatureMap::Get in unit tests #if !CONFIG_BUILD_FOR_HOST_UNIT_TEST uint32_t featureMap = 0; - bool success = (Attributes::FeatureMap::Get(kRootEndpointId, &featureMap) == EMBER_ZCL_STATUS_SUCCESS); + bool success = (Attributes::FeatureMap::Get(kRootEndpointId, &featureMap) == Status::Success); return success ? ((featureMap & to_underlying(feature)) != 0) : false; #else return ((mFeatureMap & to_underlying(feature)) != 0); diff --git a/src/app/reporting/SynchronizedReportSchedulerImpl.cpp b/src/app/reporting/SynchronizedReportSchedulerImpl.cpp index 1620d9d70e6bbc..a807469b34f910 100644 --- a/src/app/reporting/SynchronizedReportSchedulerImpl.cpp +++ b/src/app/reporting/SynchronizedReportSchedulerImpl.cpp @@ -51,7 +51,7 @@ void SynchronizedReportSchedulerImpl::OnTransitionToIdle() VerifyOrReturn(now >= mNextReportTimestamp); if (((mNextReportTimestamp - now) < Seconds16(targetIdleInterval)) && (now > mNextMinTimestamp)) { - // If the next report is due in less than the idle mode interval and we are past the min interval, we can just send it now + // If the next report is due in less than the idle mode duration and we are past the min interval, we can just send it now CancelReport(); TimerFired(); } diff --git a/src/app/server/Dnssd.cpp b/src/app/server/Dnssd.cpp index dfb1fc4d6062a4..1ec2fa0b8ffdb4 100644 --- a/src/app/server/Dnssd.cpp +++ b/src/app/server/Dnssd.cpp @@ -147,11 +147,21 @@ void DnssdServer::AddICDKeyToAdvertisement(AdvertisingParams & advParams) VerifyOrDieWithMsg(mICDManager != nullptr, Discovery, "Invalid pointer to the ICDManager which is required for the LIT operating mode"); + Dnssd::ICDModeAdvertise ICDModeToAdvertise = Dnssd::ICDModeAdvertise::kNone; // Only advertise the ICD key if the device can operate as a LIT if (mICDManager->SupportsFeature(Clusters::IcdManagement::Feature::kLongIdleTimeSupport)) { - advParams.SetICDOperatingAsLIT(Optional(mICDManager->GetICDMode() == ICDConfigurationData::ICDMode::LIT)); + if (mICDManager->GetICDMode() == ICDConfigurationData::ICDMode::LIT) + { + ICDModeToAdvertise = Dnssd::ICDModeAdvertise::kLIT; + } + else + { + ICDModeToAdvertise = Dnssd::ICDModeAdvertise::kSIT; + } } + + advParams.SetICDModeToAdvertise(ICDModeToAdvertise); } #endif @@ -181,7 +191,6 @@ CHIP_ERROR DnssdServer::AdvertiseOperational() .SetPort(GetSecuredPort()) .SetInterfaceId(GetInterfaceId()) .SetLocalMRPConfig(GetLocalMRPConfig()) - .SetTcpSupported(Optional(INET_CONFIG_ENABLE_TCP_ENDPOINT)) .EnableIpV4(true); #if CHIP_CONFIG_ENABLE_ICD_SERVER @@ -255,7 +264,7 @@ CHIP_ERROR DnssdServer::Advertise(bool commissionableNode, chip::Dnssd::Commissi advertiseParameters.SetDeviceName(chip::Optional::Value(deviceName)); } - advertiseParameters.SetLocalMRPConfig(GetLocalMRPConfig()).SetTcpSupported(Optional(INET_CONFIG_ENABLE_TCP_ENDPOINT)); + advertiseParameters.SetLocalMRPConfig(GetLocalMRPConfig()); #if CHIP_CONFIG_ENABLE_ICD_SERVER AddICDKeyToAdvertisement(advertiseParameters); diff --git a/src/app/server/Server.h b/src/app/server/Server.h index 5e51254e76753e..302471b8bebb89 100644 --- a/src/app/server/Server.h +++ b/src/app/server/Server.h @@ -609,7 +609,7 @@ class Server FabricTable mFabrics; secure_channel::MessageCounterManager mMessageCounterManager; #if CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT - chip::Protocols::UserDirectedCommissioning::UserDirectedCommissioningClient * gUDCClient = nullptr; + Protocols::UserDirectedCommissioning::UserDirectedCommissioningClient * gUDCClient = nullptr; // mUdcTransportMgr is for insecure communication (ex. user directed commissioning) // specifically, the commissioner declaration message (sent by commissioner to commissionee) UdcTransportMgr * mUdcTransportMgr = nullptr; diff --git a/src/app/tests/TestBindingTable.cpp b/src/app/tests/TestBindingTable.cpp index 2bd5ed865502c0..fa314d1c1fd1dc 100644 --- a/src/app/tests/TestBindingTable.cpp +++ b/src/app/tests/TestBindingTable.cpp @@ -42,17 +42,17 @@ void TestAdd(nlTestSuite * aSuite, void * aContext) chip::TestPersistentStorageDelegate testStorage; table.SetPersistentStorage(&testStorage); EmberBindingTableEntry unusedEntry; - unusedEntry.type = EMBER_UNUSED_BINDING; + unusedEntry.type = MATTER_UNUSED_BINDING; NL_TEST_ASSERT(aSuite, table.Add(unusedEntry) == CHIP_ERROR_INVALID_ARGUMENT); - for (uint8_t i = 0; i < EMBER_BINDING_TABLE_SIZE; i++) + for (uint8_t i = 0; i < MATTER_BINDING_TABLE_SIZE; i++) { NL_TEST_ASSERT(aSuite, table.Add(EmberBindingTableEntry::ForNode(0, i, 0, 0, NullOptional)) == CHIP_NO_ERROR); } NL_TEST_ASSERT(aSuite, table.Add(EmberBindingTableEntry::ForNode(0, 0, 0, 0, NullOptional)) == CHIP_ERROR_NO_MEMORY); - NL_TEST_ASSERT(aSuite, table.Size() == EMBER_BINDING_TABLE_SIZE); + NL_TEST_ASSERT(aSuite, table.Size() == MATTER_BINDING_TABLE_SIZE); auto iter = table.begin(); - for (uint8_t i = 0; i < EMBER_BINDING_TABLE_SIZE; i++) + for (uint8_t i = 0; i < MATTER_BINDING_TABLE_SIZE; i++) { NL_TEST_ASSERT(aSuite, iter != table.end()); NL_TEST_ASSERT(aSuite, iter->nodeId == i); @@ -73,14 +73,14 @@ void TestRemoveThenAdd(nlTestSuite * aSuite, void * aContext) NL_TEST_ASSERT(aSuite, iter == table.end()); NL_TEST_ASSERT(aSuite, table.Size() == 0); NL_TEST_ASSERT(aSuite, table.begin() == table.end()); - for (uint8_t i = 0; i < EMBER_BINDING_TABLE_SIZE; i++) + for (uint8_t i = 0; i < MATTER_BINDING_TABLE_SIZE; i++) { NL_TEST_ASSERT(aSuite, table.Add(EmberBindingTableEntry::ForNode(0, i, 0, 0, NullOptional)) == CHIP_NO_ERROR); } iter = table.begin(); ++iter; NL_TEST_ASSERT(aSuite, table.RemoveAt(iter) == CHIP_NO_ERROR); - NL_TEST_ASSERT(aSuite, table.Size() == EMBER_BINDING_TABLE_SIZE - 1); + NL_TEST_ASSERT(aSuite, table.Size() == MATTER_BINDING_TABLE_SIZE - 1); NL_TEST_ASSERT(aSuite, iter->nodeId == 2); NL_TEST_ASSERT(aSuite, iter.GetIndex() == 2); auto iterCheck = table.begin(); @@ -88,9 +88,9 @@ void TestRemoveThenAdd(nlTestSuite * aSuite, void * aContext) NL_TEST_ASSERT(aSuite, iter == iterCheck); NL_TEST_ASSERT(aSuite, table.Add(EmberBindingTableEntry::ForNode(0, 1, 0, 0, NullOptional)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(aSuite, table.Size() == EMBER_BINDING_TABLE_SIZE); + NL_TEST_ASSERT(aSuite, table.Size() == MATTER_BINDING_TABLE_SIZE); iter = table.begin(); - for (uint8_t i = 0; i < EMBER_BINDING_TABLE_SIZE - 1; i++) + for (uint8_t i = 0; i < MATTER_BINDING_TABLE_SIZE - 1; i++) { ++iter; } @@ -100,11 +100,11 @@ void TestRemoveThenAdd(nlTestSuite * aSuite, void * aContext) NL_TEST_ASSERT(aSuite, iter == table.end()); iter = table.begin(); NL_TEST_ASSERT(aSuite, table.RemoveAt(iter) == CHIP_NO_ERROR); - NL_TEST_ASSERT(aSuite, table.Size() == EMBER_BINDING_TABLE_SIZE - 1); + NL_TEST_ASSERT(aSuite, table.Size() == MATTER_BINDING_TABLE_SIZE - 1); NL_TEST_ASSERT(aSuite, iter == table.begin()); NL_TEST_ASSERT(aSuite, iter.GetIndex() == 2); NL_TEST_ASSERT(aSuite, iter->nodeId == 2); - NL_TEST_ASSERT(aSuite, table.GetAt(0).type == EMBER_UNUSED_BINDING); + NL_TEST_ASSERT(aSuite, table.GetAt(0).type == MATTER_UNUSED_BINDING); } void VerifyTableSame(nlTestSuite * aSuite, BindingTable & table, const std::vector & expected) diff --git a/src/app/tests/TestPendingNotificationMap.cpp b/src/app/tests/TestPendingNotificationMap.cpp index b635f3a654cc9b..31aa133977d1be 100644 --- a/src/app/tests/TestPendingNotificationMap.cpp +++ b/src/app/tests/TestPendingNotificationMap.cpp @@ -44,7 +44,7 @@ void ClearBindingTable(BindingTable & table) void CreateDefaultFullBindingTable(BindingTable & table) { - for (uint8_t i = 0; i < EMBER_BINDING_TABLE_SIZE; i++) + for (uint8_t i = 0; i < MATTER_BINDING_TABLE_SIZE; i++) { table.Add(EmberBindingTableEntry::ForNode(i / 10, i % 5, 0, 0, MakeOptional(i))); } @@ -63,15 +63,15 @@ void TestAddRemove(nlTestSuite * aSuite, void * aContext) PendingNotificationMap pendingMap; ClearBindingTable(BindingTable::GetInstance()); CreateDefaultFullBindingTable(BindingTable::GetInstance()); - for (uint8_t i = 0; i < EMBER_BINDING_TABLE_SIZE; i++) + for (uint8_t i = 0; i < MATTER_BINDING_TABLE_SIZE; i++) { NL_TEST_ASSERT(aSuite, pendingMap.AddPendingNotification(i, nullptr) == CHIP_NO_ERROR); } // Confirm adding in one more element fails - NL_TEST_ASSERT(aSuite, pendingMap.AddPendingNotification(EMBER_BINDING_TABLE_SIZE, nullptr) == CHIP_ERROR_NO_MEMORY); + NL_TEST_ASSERT(aSuite, pendingMap.AddPendingNotification(MATTER_BINDING_TABLE_SIZE, nullptr) == CHIP_ERROR_NO_MEMORY); auto iter = pendingMap.begin(); - for (uint8_t i = 0; i < EMBER_BINDING_TABLE_SIZE; i++) + for (uint8_t i = 0; i < MATTER_BINDING_TABLE_SIZE; i++) { PendingNotificationEntry entry = *iter; NL_TEST_ASSERT(aSuite, entry.mBindingEntryId == i); diff --git a/src/app/tests/suites/TestDiagnosticLogs.yaml b/src/app/tests/suites/TestDiagnosticLogs.yaml index cf31a96b8ddf58..57ab8cb0fa04f8 100644 --- a/src/app/tests/suites/TestDiagnosticLogs.yaml +++ b/src/app/tests/suites/TestDiagnosticLogs.yaml @@ -18,6 +18,7 @@ config: nodeId: 0x12344321 cluster: "Diagnostic Logs" endpoint: 0 + timeout: 120 end_user_support_log_file_path: "/tmp/end_user_support_log.txt" end_user_support_log_file_content: "End User Support Log Content" end_user_support_log_file_content_long: @@ -31,6 +32,113 @@ config: bdx_transfer_file_path: "/tmp/end_user_support_bdx_output.txt" bdx_transfer_file_name: "end_user_support_bdx_output.txt" + bdx_transfer_file_path_1: "/tmp/bdx_log_output_1.txt" + bdx_transfer_file_name_1: "bdx_log_output_1.txt" + bdx_transfer_file_path_2: "/tmp/bdx_log_output_2.txt" + bdx_transfer_file_name_2: "bdx_log_output_2.txt" + + long_log_file_content: + "This is a long log content... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ......................................................." + tests: # # Set up the test by adding some destination log files for the target accessory: @@ -658,3 +766,180 @@ tests: values: - name: "filePath" value: bdx_transfer_file_path + + # + # Validate that multiple BDX transfers can run in parallels. + # + - label: "Delete possible leftover from previous run" + cluster: "SystemCommands" + command: "DeleteFile" + arguments: + values: + - name: "filePath" + value: bdx_transfer_file_path_1 + + - label: "Delete possible leftover from previous run" + cluster: "SystemCommands" + command: "DeleteFile" + arguments: + values: + - name: "filePath" + value: bdx_transfer_file_path_2 + + - label: "Update End User Support logs with a long log" + cluster: "SystemCommands" + command: "CreateFile" + arguments: + values: + - name: "filePath" + value: end_user_support_log_file_path + - name: "fileContent" + value: long_log_file_content + + - label: "Update Network Diagnostic logs with a long log" + cluster: "SystemCommands" + command: "CreateFile" + arguments: + values: + - name: "filePath" + value: network_diagnostics_log_file_path + - name: "fileContent" + value: long_log_file_content + + - label: "Start a second accessory" + cluster: "SystemCommands" + command: "Start" + arguments: + values: + - name: "discriminator" + value: 50 + - name: "port" + value: 5601 + - name: "kvs" + value: "/tmp/chip_kvs_second" + - name: "endUserSupportLogPath" + value: end_user_support_log_file_path + - name: "networkDiagnosticsLogPath" + value: network_diagnostics_log_file_path + - name: "registerKey" + value: "default#2" + + - label: "Commission second accessory from beta" + identity: "beta" + cluster: "CommissionerCommands" + command: "PairWithCode" + arguments: + values: + - name: "nodeId" + value: nodeId + - name: "payload" + value: "MT:-24J0IX4122-.548G00" + + - label: "Wait for the second commissioned device to be retrieved for beta" + identity: "beta" + cluster: "DelayCommands" + command: "WaitForCommissionee" + arguments: + values: + - name: "nodeId" + value: nodeId + + - label: "BDX: Request End User Support from the first accessory" + command: "RetrieveLogsRequest" + identity: "alpha" + arguments: + values: + - name: "Intent" + value: 1 # NetworkDiagnostics + - name: "RequestedProtocol" + value: 1 # BDX + - name: "TransferFileDesignator" + value: bdx_transfer_file_name_1 + response: + values: + - name: "Status" + value: 0 # Success + - name: "LogContent" + value: "" + + - label: "BDX: Request End User Support from the second accessory" + command: "RetrieveLogsRequest" + identity: "beta" + arguments: + values: + - name: "Intent" + value: 1 # NetworkDiagnostics + - name: "RequestedProtocol" + value: 1 # BDX + - name: "TransferFileDesignator" + value: bdx_transfer_file_name_2 + response: + values: + - name: "Status" + value: 0 # Success + - name: "LogContent" + value: "" + + - label: + "BDX: Wait for 'Diagnostic logs transfer: Success' message from the + first accessory" + cluster: "DelayCommands" + command: "WaitForMessage" + arguments: + values: + - name: "registerKey" + value: "default" + - name: "message" + value: "Diagnostic logs transfer: Success" + + - label: + "BDX: Wait for 'Diagnostic logs transfer: Success' message from the + second accessory" + cluster: "DelayCommands" + command: "WaitForMessage" + arguments: + values: + - name: "registerKey" + value: "default#2" + - name: "message" + value: "Diagnostic logs transfer: Success" + + - label: + "Compare the content the original log and the file that has been + created as the result of the BDX transfer" + cluster: "SystemCommands" + command: "CompareFiles" + arguments: + values: + - name: "file1" + value: end_user_support_log_file_path + - name: "file2" + value: bdx_transfer_file_path_1 + + - label: + "Compare the content the original log and the file that has been + created as the result of the BDX transfer" + cluster: "SystemCommands" + command: "CompareFiles" + arguments: + values: + - name: "file1" + value: network_diagnostics_log_file_path + - name: "file2" + value: bdx_transfer_file_path_2 + + - label: "Delete the result of the previous run" + cluster: "SystemCommands" + command: "DeleteFile" + arguments: + values: + - name: "filePath" + value: bdx_transfer_file_path_1 + + - label: "Delete the result of the previous run" + cluster: "SystemCommands" + command: "DeleteFile" + arguments: + values: + - name: "filePath" + value: bdx_transfer_file_path_2 diff --git a/src/app/tests/suites/TestDiagnosticLogsDownloadCommand.yaml b/src/app/tests/suites/TestDiagnosticLogsDownloadCommand.yaml new file mode 100644 index 00000000000000..a67acdd837b54f --- /dev/null +++ b/src/app/tests/suites/TestDiagnosticLogsDownloadCommand.yaml @@ -0,0 +1,598 @@ +# 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. + +name: Diagnostic Logs Tests for Darwin + +config: + nodeId: 0x12344321 + cluster: "Bdx" + timeout: 180 + end_user_support_log_file_path: "/tmp/end_user_support_log.txt" + end_user_support_log_file_content: "End User Support Log Content" + network_diagnostics_log_file_path: "/tmp/network_diagnostics_log.txt" + + bdx_transfer_file_path_1: "/tmp/bdx_log_output_1.txt" + bdx_transfer_file_name_1: "bdx_log_output_1.txt" + bdx_transfer_file_path_2: "/tmp/bdx_log_output_2.txt" + bdx_transfer_file_name_2: "bdx_log_output_2.txt" + + long_log_file_content: + "Network Diagnostic Log Content is more than 1024 bytes + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ....................................................... + ......................................................." + +tests: + # + # Set up the test by adding some destination log files for the target server: + # 1. End User Support + # 2. Network Diagnostics + # 3. Crash + # + # The first thing to do is to delete them if they exist. There could be some + # left over from a previous test run. + # + + - label: "Delete EndUserSupport logs" + cluster: "SystemCommands" + command: "DeleteFile" + arguments: + values: + - name: "filePath" + value: end_user_support_log_file_path + + - label: "Delete NetworkDiag logs" + cluster: "SystemCommands" + command: "DeleteFile" + arguments: + values: + - name: "filePath" + value: network_diagnostics_log_file_path + + - label: "Stop the server" + cluster: "SystemCommands" + command: "Stop" + + - label: "Create End User Support logs" + cluster: "SystemCommands" + command: "CreateFile" + arguments: + values: + - name: "filePath" + value: end_user_support_log_file_path + - name: "fileContent" + value: end_user_support_log_file_content + + - label: "Create NetworkDiag logs" + cluster: "SystemCommands" + command: "CreateFile" + arguments: + values: + - name: "filePath" + value: network_diagnostics_log_file_path + - name: "fileContent" + value: long_log_file_content + + - label: "Start the server with the destination logs files" + cluster: "SystemCommands" + command: "Start" + arguments: + values: + - name: "endUserSupportLogPath" + value: end_user_support_log_file_path + - name: "networkDiagnosticsLogPath" + value: network_diagnostics_log_file_path + + - label: "Wait for the commissioned device to be retrieved" + cluster: "DelayCommands" + command: "WaitForCommissionee" + arguments: + values: + - name: "nodeId" + value: nodeId + + - label: "Read End User Support log intent" + command: "Download" + arguments: + values: + - name: "LogType" + value: 0 # EndUserSupport + - name: "Timeout" + value: 0 + response: + values: + - name: "logContent" + value: end_user_support_log_file_content + constraints: + minLength: 28 + maxLength: 28 + + - label: "Read Network Diagnostic log intent" + command: "Download" + arguments: + values: + - name: "LogType" + value: 1 # Network Diagnostic + - name: "Timeout" + value: 0 + response: + values: + - name: "logContent" + value: long_log_file_content + constraints: + minLength: 9238 + maxLength: 9238 + + - label: "Read Crash log intent" + command: "Download" + arguments: + values: + - name: "LogType" + value: 2 # Crash + - name: "Timeout" + value: 0 + response: + values: + - name: "logContent" + value: "" + + - label: + "Read Network Diagnostic log intent with a very short timeout and a + very long log" + command: "Download" + arguments: + values: + - name: "LogType" + value: 1 # Network Diagnostic + - name: "Timeout" + value: 1 + response: + values: + - name: "error" + value: "FAILURE" + + - label: + "Read End User Support log intent after a failure to make sure that + everything still works" + command: "Download" + arguments: + values: + - name: "LogType" + value: 0 # EndUserSupport + - name: "Timeout" + value: 0 + response: + values: + - name: "logContent" + value: end_user_support_log_file_content + constraints: + minLength: 28 + maxLength: 28 + + # + # Validate that we handle Busy properly + # + - label: + "BDX: Wait for 'Diagnostic logs transfer: Success' message from the + previous steps" + cluster: "DelayCommands" + command: "WaitForMessage" + arguments: + values: + - name: "registerKey" + value: "default" + - name: "message" + value: "Diagnostic logs transfer: Success" + + - label: "Delete possible leftover from previous run" + cluster: "SystemCommands" + command: "DeleteFile" + arguments: + values: + - name: "filePath" + value: bdx_transfer_file_path_1 + + - label: "Update End User Support logs with a long log" + cluster: "SystemCommands" + command: "CreateFile" + arguments: + values: + - name: "filePath" + value: end_user_support_log_file_path + - name: "fileContent" + value: long_log_file_content + + - label: "BDX: Request End User Support from the server" + command: "Download" + arguments: + values: + - name: "LogType" + value: 0 # EndUserSupport + - name: "Timeout" + value: 0 + - name: "async" + value: true + - name: "filepath" + value: bdx_transfer_file_path_1 + + - label: + "BDX: Request End User Support from the server again while it is busy" + command: "Download" + arguments: + values: + - name: "LogType" + value: 0 # EndUserSupport + - name: "Timeout" + value: 0 + - name: "filepath" + value: bdx_transfer_file_path_2 + response: + values: + - name: "logContent" + value: null + - name: "error" + value: "FAILURE" + + - label: "BDX: Wait for 'Diagnostic logs transfer: Success' message" + cluster: "DelayCommands" + command: "WaitForMessage" + arguments: + values: + - name: "registerKey" + value: "default" + - name: "message" + value: "Diagnostic logs transfer: Success" + - name: "timeoutInSeconds" + value: 60 + + - label: "Delete the result of the previous run" + cluster: "SystemCommands" + command: "DeleteFile" + arguments: + values: + - name: "filePath" + value: bdx_transfer_file_path_1 + + # + # Validate that multiple BDX transfers can run in parallel. + # + - label: "Delete possible leftover from previous run" + cluster: "SystemCommands" + command: "DeleteFile" + arguments: + values: + - name: "filePath" + value: bdx_transfer_file_path_1 + + - label: "Delete possible leftover from previous run" + cluster: "SystemCommands" + command: "DeleteFile" + arguments: + values: + - name: "filePath" + value: bdx_transfer_file_path_2 + + - label: "Update End User Support logs with a long log" + cluster: "SystemCommands" + command: "CreateFile" + arguments: + values: + - name: "filePath" + value: end_user_support_log_file_path + - name: "fileContent" + value: long_log_file_content + + - label: "Update Network Diagnostic logs with a long log" + cluster: "SystemCommands" + command: "CreateFile" + arguments: + values: + - name: "filePath" + value: network_diagnostics_log_file_path + - name: "fileContent" + value: long_log_file_content + + - label: "Start a second server" + cluster: "SystemCommands" + command: "Start" + arguments: + values: + - name: "discriminator" + value: 50 + - name: "port" + value: 5601 + - name: "kvs" + value: "/tmp/chip_kvs_second" + - name: "endUserSupportLogPath" + value: end_user_support_log_file_path + - name: "networkDiagnosticsLogPath" + value: network_diagnostics_log_file_path + - name: "registerKey" + value: "default#2" + + - label: "Commission second server from beta" + identity: "beta" + cluster: "CommissionerCommands" + command: "PairWithCode" + arguments: + values: + - name: "nodeId" + value: nodeId + - name: "payload" + value: "MT:-24J0IX4122-.548G00" + + - label: "Wait for the second commissioned device to be retrieved for beta" + identity: "beta" + cluster: "DelayCommands" + command: "WaitForCommissionee" + arguments: + values: + - name: "nodeId" + value: nodeId + + - label: "BDX: Request End User Support from the first server" + command: "Download" + arguments: + values: + - name: "LogType" + value: 1 # Network Diagnostic + - name: "Timeout" + value: 0 + - name: "async" + value: true + - name: "filepath" + value: bdx_transfer_file_path_1 + + - label: "BDX: Request End User Support from the second server" + identity: "beta" + command: "Download" + arguments: + values: + - name: "LogType" + value: 1 # Network Diagnostic + - name: "Timeout" + value: 0 + - name: "async" + value: true + - name: "filepath" + value: bdx_transfer_file_path_2 + + - label: + "BDX: Wait for 'Diagnostic logs transfer: Success' message from the + first server" + cluster: "DelayCommands" + command: "WaitForMessage" + arguments: + values: + - name: "registerKey" + value: "default" + - name: "message" + value: "Diagnostic logs transfer: Success" + - name: "timeoutInSeconds" + value: 60 + + - label: + "BDX: Wait for 'Diagnostic logs transfer: Success' message from the + second server" + cluster: "DelayCommands" + command: "WaitForMessage" + arguments: + values: + - name: "registerKey" + value: "default#2" + - name: "message" + value: "Diagnostic logs transfer: Success" + - name: "timeoutInSeconds" + value: 60 + + - label: + "Compare the content the original log and the file that has been + created as the result of the BDX transfer" + cluster: "SystemCommands" + command: "CompareFiles" + arguments: + values: + - name: "file1" + value: end_user_support_log_file_path + - name: "file2" + value: bdx_transfer_file_path_1 + + - label: + "Compare the content the original log and the file that has been + created as the result of the BDX transfer" + cluster: "SystemCommands" + command: "CompareFiles" + arguments: + values: + - name: "file1" + value: network_diagnostics_log_file_path + - name: "file2" + value: bdx_transfer_file_path_2 + + - label: "Delete the result of the previous run" + cluster: "SystemCommands" + command: "DeleteFile" + arguments: + values: + - name: "filePath" + value: bdx_transfer_file_path_1 + + - label: "Delete the result of the previous run" + cluster: "SystemCommands" + command: "DeleteFile" + arguments: + values: + - name: "filePath" + value: bdx_transfer_file_path_2 diff --git a/src/app/tests/suites/certification/PICS.yaml b/src/app/tests/suites/certification/PICS.yaml index fd89dcc035909d..e27d927cca37dc 100644 --- a/src/app/tests/suites/certification/PICS.yaml +++ b/src/app/tests/suites/certification/PICS.yaml @@ -1905,6 +1905,30 @@ PICS: "Does the device implement sending the ChangeToModeResponse command?" id: DISHM.S.C01.Tx + # + # Microwave Oven Mode Cluster + # + - label: + "Does the device implement the Microwave Oven Mode cluster as a server" + id: MWOM.S + + # + # Microwave Oven Control Cluster + # + - label: + "Does the device implement the Microwave Oven Control cluster as a + server" + id: MWOCTRL.S + + # + # server / features + # + - label: "Does the device support the power as a number feature" + id: MWOCTRL.S.F00 + + - label: "Does the device support the power number limits feature" + id: MWOCTRL.S.F02 + # Descriptor Cluster TestPlan - label: "Does the device implement the Descriptor cluster as a server?" id: DESC.S @@ -3604,6 +3628,9 @@ PICS: - label: "Indicates that node is configured for test event triggers." id: DGGEN.S.C00.Rsp + - label: "Indicates cluster supports Payload Test Request." + id: DGGEN.S.C03.Rsp + # # server / Events # @@ -3625,6 +3652,13 @@ PICS: - label: "Indicates the reason that caused the device to reboot start-up." id: DGGEN.S.E03 + # + # server / features + # + - label: + "Support specific commands needed for extended Data Model features." + id: DGGEN.S.F00 + # # client / attributes # diff --git a/src/app/tests/suites/certification/Test_TC_DGGEN_1_1.yaml b/src/app/tests/suites/certification/Test_TC_DGGEN_1_1.yaml index fc10b3d02eeaba..6641fcf879939c 100644 --- a/src/app/tests/suites/certification/Test_TC_DGGEN_1_1.yaml +++ b/src/app/tests/suites/certification/Test_TC_DGGEN_1_1.yaml @@ -40,9 +40,20 @@ tests: type: int16u - label: "Step 3: TH reads from the DUT the FeatureMap attribute." + PICS: "!DGGEN.S.F00" command: "readAttribute" attribute: "FeatureMap" response: + value: 0 + constraints: + type: bitmap32 + + - label: "Step 3: TH reads from the DUT the FeatureMap attribute." + PICS: DGGEN.S.F00 + command: "readAttribute" + attribute: "FeatureMap" + response: + value: 1 constraints: type: bitmap32 diff --git a/src/app/tests/suites/certification/Test_TC_DGGEN_2_3.yaml b/src/app/tests/suites/certification/Test_TC_DGGEN_2_3.yaml index 9690cafcf66c73..ba5ba54b9c22d7 100644 --- a/src/app/tests/suites/certification/Test_TC_DGGEN_2_3.yaml +++ b/src/app/tests/suites/certification/Test_TC_DGGEN_2_3.yaml @@ -78,7 +78,21 @@ tests: - label: "Step 4: Invoke the TestEventTrigger command with EnableKey field set - to PIXIT.DGGEN.ENABLEKEY and EventTrigger field set to 0." + to all zeros and EventTrigger field set to 0." + PICS: DGGEN.S.C00.Rsp + command: "TestEventTrigger" + arguments: + values: + - name: "EnableKey" + value: "hex:00000000000000000000000000000000" + - name: "EventTrigger" + value: 0 + response: + error: CONSTRAINT_ERROR + + - label: + "Step 5: Invoke the TestEventTrigger command with EnableKey field set + to 8-bytes to zeros and EventTrigger field set to 0." PICS: DGGEN.S.C00.Rsp command: "TestEventTrigger" arguments: @@ -89,3 +103,55 @@ tests: value: 0 response: error: CONSTRAINT_ERROR + + - label: + "Step 6: Invoke the PayloadTestRequest command with EnableKey field + set to PIXIT.DGGEN.ENABLEKEY, Value field set to 0x1 and Count set to + 1." + runIf: IsExpectedValue + PICS: DGGEN.S.C03.Rsp + command: "PayloadTestRequest" + arguments: + values: + - name: "EnableKey" + value: PIXIT.DGGEN.ENABLEKEY + - name: "Value" + value: 0x1 + - name: "Count" + value: 1 + response: + - values: + - name: "Payload" + value: "hex:01" + + - label: + "Step 7: Invoke the PayloadTestRequest command with EnableKey field + set to all zeros, Value field set to 0x1 and Count set to 1." + PICS: DGGEN.S.C03.Rsp + command: "PayloadTestRequest" + arguments: + values: + - name: "EnableKey" + value: "hex:00000000000000000000000000000000" + - name: "Value" + value: 0x1 + - name: "Count" + value: 1 + response: + error: CONSTRAINT_ERROR + + - label: + "Step 8: Invoke the PayloadTestRequest command with EnableKey field + set to 8-bytes to zeros, Value field set to 0x1 and Count set to 1." + PICS: DGGEN.S.C03.Rsp + command: "PayloadTestRequest" + arguments: + values: + - name: "EnableKey" + value: "hex:00000000000000000000000000000000" + - name: "Value" + value: 0x1 + - name: "Count" + value: 1 + response: + error: CONSTRAINT_ERROR diff --git a/src/app/tests/suites/certification/Test_TC_MWOCTRL_1_1.yaml b/src/app/tests/suites/certification/Test_TC_MWOCTRL_1_1.yaml new file mode 100644 index 00000000000000..d06db8ae77d741 --- /dev/null +++ b/src/app/tests/suites/certification/Test_TC_MWOCTRL_1_1.yaml @@ -0,0 +1,170 @@ +# 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. + +name: 263.1.1. [TC-MWOCTRL-1.1] Global attributes with DUT as Server + +PICS: + - MWOCTRL.S + +config: + nodeId: 0x12344321 + cluster: "Microwave Oven Control" + endpoint: 1 + +tests: + - label: "Step 1: Wait for the commissioned device to be retrieved" + cluster: "DelayCommands" + command: "WaitForCommissionee" + arguments: + values: + - name: "nodeId" + value: nodeId + + - label: "Step 2: Read the global attribute: ClusterRevision" + command: "readAttribute" + attribute: "ClusterRevision" + response: + value: 1 + constraints: + type: int16u + + - label: "Step 3a: Check for no features selected." + command: "readAttribute" + attribute: "FeatureMap" + PICS: "!MWOCTRL.S.F00 && !MWOCTRL.S.F01 && !MWOCTRL.S.F02" + response: + value: 0 + constraints: + type: bitmap32 + + - label: "Step 3b: Check for PWRNUM feature support" + command: "readAttribute" + attribute: "FeatureMap" + PICS: MWOCTRL.S.F00 + response: + saveAs: powerNumSupported + constraints: + type: bitmap32 + hasMasksSet: [0x1] + hasMasksClear: [0x2] + + - label: "Step 3c: Check for WATTS feature support" + command: "readAttribute" + attribute: "FeatureMap" + PICS: MWOCTRL.S.F01 + response: + saveAs: wattsSupported + constraints: + type: bitmap32 + hasMasksClear: [0x1, 0x4] + hasMasksSet: [0x2] + + - label: "Step 3d: Check for PWRLMTS feature support" + command: "readAttribute" + attribute: "FeatureMap" + PICS: MWOCTRL.S.F02 + response: + saveAs: wattsSupported + constraints: + type: bitmap32 + hasMasksSet: [0x1, 0x4] + hasMasksClear: [0x2] + + - label: "Step 4a: Read the global attribute: AttributeList" + PICS: PICS_EVENT_LIST_ENABLED + command: "readAttribute" + attribute: "AttributeList" + response: + constraints: + type: list + contains: [0, 1, 65528, 65529, 65530, 65531, 65532, 65533] + + - label: "Step 4b: Read the global attribute: AttributeList" + PICS: "!PICS_EVENT_LIST_ENABLED" + command: "readAttribute" + attribute: "AttributeList" + response: + constraints: + type: list + contains: [0, 1, 65528, 65529, 65531, 65532, 65533] + + - label: "Step 4c: Check for mandatory attribute support for PWRNUM feature" + PICS: MWOCTRL.S.F00 + command: "readAttribute" + attribute: "AttributeList" + response: + constraints: + type: list + contains: [2] + + - label: "Step 4d: Check for optional attribute support for PWRNUM feature" + PICS: MWOCTRL.S.F02 + command: "readAttribute" + attribute: "AttributeList" + response: + constraints: + type: list + contains: [3, 4, 5] + + - label: "Step 4e: Check for mandatory attribute support for WATTS feaure" + PICS: MWOCTRL.S.F01 + command: "readAttribute" + attribute: "AttributeList" + response: + constraints: + type: list + contains: [6, 7] + + - label: "Step 4f: Check for optional WattRating attribute support" + PICS: MWOCTRL.S.A0008 + command: "readAttribute" + attribute: "AttributeList" + response: + constraints: + type: list + contains: [8] + + - label: "Step 5: TH reads EventList attribute from DUT" + PICS: PICS_EVENT_LIST_ENABLED + command: "readAttribute" + attribute: "EventList" + response: + value: [] + constraints: + type: list + + - label: "Step 6a: Check for mandatory commands." + command: "readAttribute" + attribute: "AcceptedCommandList" + response: + constraints: + type: list + contains: [0] + + - label: "Step 6b: Check for optional command AddMoreTime." + PICS: MWOCTRL.S.C01.Rsp + command: "readAttribute" + attribute: "AcceptedCommandList" + response: + constraints: + type: list + contains: [1] + + - label: "Step 7: TH reads from the DUT the GeneratedCommandList attribute." + command: "readAttribute" + attribute: "GeneratedCommandList" + response: + constraints: + type: list + contains: [] diff --git a/src/app/tests/suites/certification/Test_TC_MWOCTRL_2_1.yaml b/src/app/tests/suites/certification/Test_TC_MWOCTRL_2_1.yaml new file mode 100644 index 00000000000000..cd3f26b7e59bb5 --- /dev/null +++ b/src/app/tests/suites/certification/Test_TC_MWOCTRL_2_1.yaml @@ -0,0 +1,74 @@ +# 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. + +name: 263.1.1. [TC-MWOCTRL-2.1] Primary functionality with DUT as Server + +PICS: + - MWOCTRL.S + +config: + nodeId: 0x12344321 + cluster: "Microwave Oven Control" + endpoint: 1 + +tests: + - label: "Step 1: Wait for the commissioned device to be retrieved" + cluster: "DelayCommands" + command: "WaitForCommissionee" + arguments: + values: + - name: "nodeId" + value: nodeId + + - label: "Step 2: Read the MaxCookTime attribute" + command: "readAttribute" + attribute: "MaxCookTime" + response: + saveAs: MaxCookTimeValue + constraints: + type: elapsed_s + minValue: 1 + maxValue: 86400 + + - label: "Step 3: Read the CookTime attribute" + command: "readAttribute" + attribute: "CookTime" + response: + constraints: + type: elapsed_s + minValue: 1 + maxValue: MaxCookTimeValue + + - label: "Step 4: Send the SetCookingParameters command" + command: "SetCookingParameters" + arguments: + values: + - name: CookTime + value: 60 + + - label: "Step 5: Read the CookTime attribute" + command: "readAttribute" + attribute: "CookTime" + response: + value: 60 + constraints: + type: elapsed_s + + - label: "Step 6: Read the WattRating attribute" + PICS: MWOCTRL.S.A0008 + command: "readAttribute" + attribute: "WattRating" + response: + constraints: + type: int16u diff --git a/src/app/tests/suites/certification/Test_TC_MWOCTRL_2_5.yaml b/src/app/tests/suites/certification/Test_TC_MWOCTRL_2_5.yaml new file mode 100644 index 00000000000000..d69e23f0f86e73 --- /dev/null +++ b/src/app/tests/suites/certification/Test_TC_MWOCTRL_2_5.yaml @@ -0,0 +1,55 @@ +# 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. + +name: 263.1.1. [TC-MWOCTRL-2.5] Add more time command with DUT as Server + +PICS: + - MWOCTRL.S + - MWOCTRL.S.C01.Rsp + +config: + nodeId: 0x12344321 + cluster: "Microwave Oven Control" + endpoint: 1 + +tests: + - label: "Step 1: Wait for the commissioned device to be retrieved" + cluster: "DelayCommands" + command: "WaitForCommissionee" + arguments: + values: + - name: "nodeId" + value: nodeId + + - label: "Step 2: Send the SetCookingParameters command" + command: "SetCookingParameters" + arguments: + values: + - name: CookTime + value: 60 + + - label: "Step 3: Send the AddMoreTime command" + command: "AddMoreTime" + arguments: + values: + - name: TimeToAdd + value: 30 + + - label: "Step 4: Read the CookTime attribute" + command: "readAttribute" + attribute: "CookTime" + response: + value: 90 + constraints: + type: elapsed_s diff --git a/src/app/tests/suites/certification/Test_TC_MWOM_1_1.yaml b/src/app/tests/suites/certification/Test_TC_MWOM_1_1.yaml new file mode 100644 index 00000000000000..a35aa47a01870f --- /dev/null +++ b/src/app/tests/suites/certification/Test_TC_MWOM_1_1.yaml @@ -0,0 +1,94 @@ +# 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. + +name: 263.1.1. [TC-MWOM-1.1] Global attributes with DUT as Server + +PICS: + - MWOM.S + +config: + nodeId: 0x12344321 + cluster: "Microwave Oven Mode" + endpoint: 1 + +tests: + - label: "Step 1: Wait for the commissioned device to be retrieved" + cluster: "DelayCommands" + command: "WaitForCommissionee" + arguments: + values: + - name: "nodeId" + value: nodeId + + - label: "Step 2: Read the global attribute: ClusterRevision" + command: "readAttribute" + attribute: "ClusterRevision" + response: + value: 1 + constraints: + type: int16u + + - label: "Step 3: Read the global attribute: FeatureMap" + command: "readAttribute" + attribute: "FeatureMap" + PICS: "!MWOM.S.F00" + response: + value: 0 + constraints: + type: bitmap32 + + - label: "Step 4a: Read the global attribute: AttributeList" + PICS: PICS_EVENT_LIST_ENABLED + command: "readAttribute" + attribute: "AttributeList" + response: + constraints: + type: list + contains: [0, 1, 65528, 65529, 65530, 65531, 65532, 65533] + excludes: [2, 3] + + - label: "Step 4b: Read the global attribute: AttributeList" + PICS: "!PICS_EVENT_LIST_ENABLED" + command: "readAttribute" + attribute: "AttributeList" + response: + constraints: + type: list + contains: [0, 1, 65528, 65529, 65531, 65532, 65533] + excludes: [2, 3] + + - label: "Step 5: TH reads EventList attribute from DUT" + PICS: PICS_EVENT_LIST_ENABLED + command: "readAttribute" + attribute: "EventList" + response: + value: [] + constraints: + type: list + + - label: "Step 6: TH reads from the DUT the AcceptedCommandList attribute." + command: "readAttribute" + attribute: "AcceptedCommandList" + response: + constraints: + type: list + excludes: [0] + + - label: "Step 7: TH reads from the DUT the GeneratedCommandList attribute." + command: "readAttribute" + attribute: "GeneratedCommandList" + response: + constraints: + type: list + excludes: [1] diff --git a/src/app/tests/suites/certification/ci-pics-values b/src/app/tests/suites/certification/ci-pics-values index eb286966f7c8c0..a52fdef247537f 100644 --- a/src/app/tests/suites/certification/ci-pics-values +++ b/src/app/tests/suites/certification/ci-pics-values @@ -343,6 +343,15 @@ DISHM.S.M.CAN_MANUALLY_CONTROLLED=0 PIXIT.DISHM.MODE_CHANGE_FAIL=1 PIXIT.DISHM.MODE_CHANGE_OK=1 +# MICROWAVE OVEN CONTROL CLUSTER +MWOCTRL.S=1 +MWOCTRL.S.F00=1 +# MWOCTRL.S.F01=1 +MWOCTRL.S.F02=1 + +# MICROWAVE OVEN MODE CLUSTER +MWOM.S=1 + # MEDIA CLUSTER # App Launcher APPLAUNCHER.S=1 @@ -922,10 +931,12 @@ DGGEN.S.A0006=1 DGGEN.S.A0007=1 DGGEN.S.A0008=1 DGGEN.S.C00.Rsp=1 +DGGEN.S.C03.Rsp=1 DGGEN.S.E00=1 DGGEN.S.E01=1 DGGEN.S.E02=1 DGGEN.S.E03=1 +DGGEN.S.F00=1 DGGEN.C=1 DGGEN.C.A0000=1 diff --git a/src/app/tests/suites/commands/delay/DelayCommands.cpp b/src/app/tests/suites/commands/delay/DelayCommands.cpp deleted file mode 100644 index abf66ea9fa1192..00000000000000 --- a/src/app/tests/suites/commands/delay/DelayCommands.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2022 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 "DelayCommands.h" - -namespace { -const char basePath[] = "./src/app/tests/suites/commands/delay/scripts/"; -const char * getScriptsFolder() -{ - return basePath; -} -} // namespace - -constexpr char kDefaultKey[] = "default"; - -CHIP_ERROR DelayCommands::WaitForMs(const char * identity, - const chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type & value) -{ - const auto duration = chip::System::Clock::Milliseconds32(value.ms); - return chip::DeviceLayer::SystemLayer().StartTimer(duration, OnWaitForMsFn, this); -} - -void DelayCommands::OnWaitForMsFn(chip::System::Layer * systemLayer, void * context) -{ - auto * command = static_cast(context); - command->OnWaitForMs(); -} - -CHIP_ERROR DelayCommands::WaitForMessage(const char * identity, - const chip::app::Clusters::DelayCommands::Commands::WaitForMessage::Type & value) -{ - VerifyOrReturnError(!value.message.empty(), CHIP_ERROR_INVALID_ARGUMENT); - - const char * scriptDir = getScriptsFolder(); - constexpr const char * scriptName = "WaitForMessage.py"; - const char * registerKeyValue = value.registerKey.HasValue() ? value.registerKey.Value().data() : kDefaultKey; - const size_t registerKeyLen = value.registerKey.HasValue() ? value.registerKey.Value().size() : strlen(kDefaultKey); - - char command[128]; - VerifyOrReturnError(snprintf(command, sizeof(command), "%s%s %.*s %.*s", scriptDir, scriptName, - static_cast(registerKeyLen), registerKeyValue, static_cast(value.message.size()), - value.message.data()) >= 0, - CHIP_ERROR_INTERNAL); - return RunInternal(command); -} - -CHIP_ERROR DelayCommands::RunInternal(const char * command) -{ - VerifyOrReturnError(system(command) == 0, CHIP_ERROR_INTERNAL); - return ContinueOnChipMainThread(CHIP_NO_ERROR); -} - -CHIP_ERROR DelayCommands::BusyWaitFor(chip::System::Clock::Milliseconds32 durationInMs) -{ - auto & clock = chip::System::SystemClock(); - auto start = clock.GetMonotonicTimestamp(); - while (clock.GetMonotonicTimestamp() - start < durationInMs) - { - // nothing to do. - }; - return CHIP_NO_ERROR; -} diff --git a/src/app/tests/suites/commands/delay/DelayCommands.h b/src/app/tests/suites/commands/delay/DelayCommands.h deleted file mode 100644 index c9e8681860d7f4..00000000000000 --- a/src/app/tests/suites/commands/delay/DelayCommands.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2022 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 - -#include - -class DelayCommands -{ -public: - DelayCommands(){}; - virtual ~DelayCommands(){}; - - virtual CHIP_ERROR ContinueOnChipMainThread(CHIP_ERROR err) = 0; - virtual void OnWaitForMs() = 0; - - virtual CHIP_ERROR WaitForCommissionee(const char * identity, - const chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type & value) - { - return CHIP_ERROR_NOT_IMPLEMENTED; - }; - virtual CHIP_ERROR WaitForCommissioning(const char * identity, - const chip::app::Clusters::DelayCommands::Commands::WaitForCommissioning::Type & value) - { - return CHIP_ERROR_NOT_IMPLEMENTED; - }; - CHIP_ERROR WaitForMs(const char * identity, const chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type & value); - // Wait for any message specified by value.message for the application specified by value.registerKey - // If the message is never seen, a timeout would occur - CHIP_ERROR WaitForMessage(const char * identity, - const chip::app::Clusters::DelayCommands::Commands::WaitForMessage::Type & value); - - // Busy-wait for a given duration in milliseconds - CHIP_ERROR BusyWaitFor(chip::System::Clock::Milliseconds32 durationInMs); - -private: - static void OnWaitForMsFn(chip::System::Layer * systemLayer, void * context); - CHIP_ERROR RunInternal(const char * command); -}; diff --git a/src/app/tests/suites/commands/delay/scripts/WaitForMessage.py b/src/app/tests/suites/commands/delay/scripts/WaitForMessage.py deleted file mode 100755 index 345d6b37cf1bc9..00000000000000 --- a/src/app/tests/suites/commands/delay/scripts/WaitForMessage.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env -S python3 -B - -# Copyright (c) 2022 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. - -import sys -import xmlrpc.client - -IP = '127.0.0.1' -PORT = 9000 - -if sys.platform == 'linux': - IP = '10.10.10.5' - - -def main(): - with xmlrpc.client.ServerProxy('http://' + IP + ':' + str(PORT) + '/', allow_none=True) as proxy: - proxy.waitForMessage(sys.argv[1], sys.argv[2:]) - - -if __name__ == "__main__": - main() diff --git a/src/app/tests/suites/commands/discovery/DiscoveryCommands.cpp b/src/app/tests/suites/commands/discovery/DiscoveryCommands.cpp deleted file mode 100644 index 2313480351d803..00000000000000 --- a/src/app/tests/suites/commands/discovery/DiscoveryCommands.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (c) 2022 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 "DiscoveryCommands.h" - -#include -#include - -CHIP_ERROR -DiscoveryCommands::FindCommissionable(const char * identity, - const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type & value) -{ - ReturnErrorOnFailure(SetupDiscoveryCommands()); - - chip::Dnssd::DiscoveryFilter filter(chip::Dnssd::DiscoveryFilterType::kNone, (uint64_t) 0); - return mDNSResolver.DiscoverCommissionableNodes(filter); -} - -CHIP_ERROR DiscoveryCommands::FindCommissionableByShortDiscriminator( - const char * identity, - const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByShortDiscriminator::Type & value) -{ - ReturnErrorOnFailure(SetupDiscoveryCommands()); - - chip::Dnssd::DiscoveryFilter filter(chip::Dnssd::DiscoveryFilterType::kShortDiscriminator, value.value); - return mDNSResolver.DiscoverCommissionableNodes(filter); -} - -CHIP_ERROR DiscoveryCommands::FindCommissionableByLongDiscriminator( - const char * identity, - const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByLongDiscriminator::Type & value) -{ - ReturnErrorOnFailure(SetupDiscoveryCommands()); - - chip::Dnssd::DiscoveryFilter filter(chip::Dnssd::DiscoveryFilterType::kLongDiscriminator, value.value); - return mDNSResolver.DiscoverCommissionableNodes(filter); -} - -CHIP_ERROR DiscoveryCommands::FindCommissionableByCommissioningMode( - const char * identity, - const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByCommissioningMode::Type & value) -{ - ReturnErrorOnFailure(SetupDiscoveryCommands()); - - chip::Dnssd::DiscoveryFilter filter(chip::Dnssd::DiscoveryFilterType::kCommissioningMode); - return mDNSResolver.DiscoverCommissionableNodes(filter); -} - -CHIP_ERROR DiscoveryCommands::FindCommissionableByVendorId( - const char * identity, const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByVendorId::Type & value) -{ - ReturnErrorOnFailure(SetupDiscoveryCommands()); - - chip::Dnssd::DiscoveryFilter filter(chip::Dnssd::DiscoveryFilterType::kVendorId, value.value); - return mDNSResolver.DiscoverCommissionableNodes(filter); -} - -CHIP_ERROR DiscoveryCommands::FindCommissionableByDeviceType( - const char * identity, const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByDeviceType::Type & value) -{ - ReturnErrorOnFailure(SetupDiscoveryCommands()); - - chip::Dnssd::DiscoveryFilter filter(chip::Dnssd::DiscoveryFilterType::kDeviceType, value.value); - return mDNSResolver.DiscoverCommissionableNodes(filter); -} - -CHIP_ERROR -DiscoveryCommands::FindCommissioner(const char * identity, - const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissioner::Type & value) -{ - ReturnErrorOnFailure(SetupDiscoveryCommands()); - - chip::Dnssd::DiscoveryFilter filter(chip::Dnssd::DiscoveryFilterType::kCommissioner, 1); - return mDNSResolver.DiscoverCommissioners(filter); -} - -CHIP_ERROR -DiscoveryCommands::FindCommissionerByVendorId( - const char * identity, const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionerByVendorId::Type & value) -{ - ReturnErrorOnFailure(SetupDiscoveryCommands()); - - chip::Dnssd::DiscoveryFilter filter(chip::Dnssd::DiscoveryFilterType::kVendorId, value.value); - return mDNSResolver.DiscoverCommissioners(filter); -} - -CHIP_ERROR DiscoveryCommands::FindCommissionerByDeviceType( - const char * identity, const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionerByDeviceType::Type & value) -{ - ReturnErrorOnFailure(SetupDiscoveryCommands()); - - chip::Dnssd::DiscoveryFilter filter(chip::Dnssd::DiscoveryFilterType::kDeviceType, value.value); - return mDNSResolver.DiscoverCommissioners(filter); -} - -CHIP_ERROR DiscoveryCommands::SetupDiscoveryCommands() -{ - ReturnErrorOnFailure(TearDownDiscoveryCommands()); - - if (!mReady) - { - ReturnErrorOnFailure(mDNSResolver.Init(chip::DeviceLayer::UDPEndPointManager())); - mReady = true; - } - mDNSResolver.SetCommissioningDelegate(this); - return CHIP_NO_ERROR; -} - -CHIP_ERROR DiscoveryCommands::TearDownDiscoveryCommands() -{ - mDNSResolver.StopDiscovery(); - mDNSResolver.SetCommissioningDelegate(nullptr); - return CHIP_NO_ERROR; -} - -void DiscoveryCommands::OnNodeDiscovered(const chip::Dnssd::DiscoveredNodeData & nodeData) -{ - // TODO: If multiple results are found for the same filter, then the test result depends - // on which result comes first. At the moment, the code assume that there is only - // a single match on the network, but if that's not enough, there may be a need - // to implement some sort of list that is built for a given duration before returning - ReturnOnFailure(TearDownDiscoveryCommands()); - - nodeData.LogDetail(); - - chip::DiscoveryCommandResponse data; - data.hostName = chip::CharSpan(nodeData.resolutionData.hostName, strlen(nodeData.resolutionData.hostName)); - data.instanceName = chip::CharSpan(nodeData.commissionData.instanceName, strlen(nodeData.commissionData.instanceName)); - data.longDiscriminator = nodeData.commissionData.longDiscriminator; - data.shortDiscriminator = ((nodeData.commissionData.longDiscriminator >> 8) & 0x0F); - data.vendorId = nodeData.commissionData.vendorId; - data.productId = nodeData.commissionData.productId; - data.commissioningMode = nodeData.commissionData.commissioningMode; - data.deviceType = nodeData.commissionData.deviceType; - data.deviceName = chip::CharSpan(nodeData.commissionData.deviceName, strlen(nodeData.commissionData.deviceName)); - data.rotatingId = chip::ByteSpan(nodeData.commissionData.rotatingId, nodeData.commissionData.rotatingIdLen); - data.rotatingIdLen = nodeData.commissionData.rotatingIdLen; - data.pairingHint = nodeData.commissionData.pairingHint; - data.pairingInstruction = - chip::CharSpan(nodeData.commissionData.pairingInstruction, strlen(nodeData.commissionData.pairingInstruction)); - data.supportsTcp = nodeData.resolutionData.supportsTcp; - data.port = nodeData.resolutionData.port; - - if (!chip::CanCastTo(nodeData.resolutionData.numIPs)) - { - ChipLogError(chipTool, "Too many ips."); - return; - } - data.numIPs = static_cast(nodeData.resolutionData.numIPs); - - if (nodeData.resolutionData.mrpRetryIntervalIdle.HasValue()) - { - data.mrpRetryIntervalIdle.SetValue(nodeData.resolutionData.mrpRetryIntervalIdle.Value().count()); - } - - if (nodeData.resolutionData.mrpRetryIntervalActive.HasValue()) - { - data.mrpRetryIntervalActive.SetValue(nodeData.resolutionData.mrpRetryIntervalActive.Value().count()); - } - - if (nodeData.resolutionData.mrpRetryActiveThreshold.HasValue()) - { - data.mrpRetryActiveThreshold.SetValue(nodeData.resolutionData.mrpRetryActiveThreshold.Value().count()); - } - - if (nodeData.resolutionData.isICDOperatingAsLIT.HasValue()) - { - data.isICDOperatingAsLIT.SetValue(nodeData.resolutionData.isICDOperatingAsLIT.Value()); - } - - chip::app::StatusIB status; - status.mStatus = chip::Protocols::InteractionModel::Status::Success; - - constexpr uint32_t kMaxDataLen = 4096; - uint8_t * buffer = static_cast(chip::Platform::MemoryCalloc(sizeof(uint8_t), kMaxDataLen)); - if (buffer == nullptr) - { - ChipLogError(chipTool, "Can not dispatch mdns data: %s", chip::ErrorStr(CHIP_ERROR_NO_MEMORY)); - return; - } - - chip::TLV::TLVWriter writer; - writer.Init(buffer, kMaxDataLen); - CHIP_ERROR err = data.Encode(writer, chip::TLV::AnonymousTag()); - if (CHIP_NO_ERROR != err) - { - ChipLogError(chipTool, "Can not encode mdns data: %s", chip::ErrorStr(err)); - return; - } - - uint32_t dataLen = writer.GetLengthWritten(); - writer.Finalize(); - - chip::TLV::TLVReader reader; - reader.Init(buffer, dataLen); - reader.Next(); - - OnResponse(status, &reader); - - chip::Platform::MemoryFree(buffer); -} diff --git a/src/app/tests/suites/commands/discovery/DiscoveryCommands.h b/src/app/tests/suites/commands/discovery/DiscoveryCommands.h deleted file mode 100644 index 8425ef4ff1be81..00000000000000 --- a/src/app/tests/suites/commands/discovery/DiscoveryCommands.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2022 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 - -#include - -class DiscoveryCommands : public chip::Dnssd::CommissioningResolveDelegate -{ -public: - DiscoveryCommands(){}; - ~DiscoveryCommands() override{}; - - virtual void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) = 0; - virtual CHIP_ERROR ContinueOnChipMainThread(CHIP_ERROR err) = 0; - - CHIP_ERROR FindCommissionable(const char * identity, - const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type & value); - CHIP_ERROR FindCommissionableByShortDiscriminator( - const char * identity, - const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByShortDiscriminator::Type & value); - CHIP_ERROR FindCommissionableByLongDiscriminator( - const char * identity, - const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByLongDiscriminator::Type & value); - CHIP_ERROR FindCommissionableByCommissioningMode( - const char * identity, - const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByCommissioningMode::Type & value); - CHIP_ERROR FindCommissionableByVendorId( - const char * identity, const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByVendorId::Type & value); - CHIP_ERROR FindCommissionableByDeviceType( - const char * identity, - const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByDeviceType::Type & value); - - CHIP_ERROR FindCommissioner(const char * identity, - const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissioner::Type & value); - CHIP_ERROR - FindCommissionerByVendorId(const char * identity, - const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionerByVendorId::Type & value); - CHIP_ERROR FindCommissionerByDeviceType( - const char * identity, const chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionerByDeviceType::Type & value); - - CHIP_ERROR SetupDiscoveryCommands(); - CHIP_ERROR TearDownDiscoveryCommands(); - - /////////// CommissioningDelegate Interface ///////// - void OnNodeDiscovered(const chip::Dnssd::DiscoveredNodeData & nodeData) override; - -private: - bool mReady = false; - chip::Dnssd::ResolverProxy mDNSResolver; -}; diff --git a/src/app/tests/suites/commands/log/LogCommands.cpp b/src/app/tests/suites/commands/log/LogCommands.cpp deleted file mode 100644 index 690eeea432d881..00000000000000 --- a/src/app/tests/suites/commands/log/LogCommands.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2022 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 "LogCommands.h" -#include - -CHIP_ERROR LogCommands::Log(const char * identity, const chip::app::Clusters::LogCommands::Commands::Log::Type & value) -{ - ChipLogDetail(chipTool, "%.*s", static_cast(value.message.size()), value.message.data()); - return ContinueOnChipMainThread(CHIP_NO_ERROR); -} - -CHIP_ERROR LogCommands::UserPrompt(const char * identity, - const chip::app::Clusters::LogCommands::Commands::UserPrompt::Type & value) -{ - ChipLogDetail(chipTool, "USER_PROMPT: %.*s", static_cast(value.message.size()), value.message.data()); - - if (value.expectedValue.HasValue()) - { - std::string line; - std::getline(std::cin, line); - if (line != std::string(value.expectedValue.Value().data(), value.expectedValue.Value().size())) - { - return ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT); - } - } - - return ContinueOnChipMainThread(CHIP_NO_ERROR); -} diff --git a/src/app/tests/suites/commands/log/LogCommands.h b/src/app/tests/suites/commands/log/LogCommands.h deleted file mode 100644 index 43585dff8acf2e..00000000000000 --- a/src/app/tests/suites/commands/log/LogCommands.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2022 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 LogCommands -{ -public: - LogCommands(){}; - virtual ~LogCommands(){}; - - virtual CHIP_ERROR ContinueOnChipMainThread(CHIP_ERROR err) = 0; - - CHIP_ERROR Log(const char * identity, const chip::app::Clusters::LogCommands::Commands::Log::Type & value); - CHIP_ERROR UserPrompt(const char * identity, const chip::app::Clusters::LogCommands::Commands::UserPrompt::Type & value); -}; diff --git a/src/app/tests/suites/commands/system/SystemCommands.cpp b/src/app/tests/suites/commands/system/SystemCommands.cpp deleted file mode 100644 index c4e8559ffdf0a1..00000000000000 --- a/src/app/tests/suites/commands/system/SystemCommands.cpp +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (c) 2022 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 "SystemCommands.h" - -#include - -namespace { -const char basePath[] = "./src/app/tests/suites/commands/system/scripts/"; -const char * getScriptsFolder() -{ - return basePath; -} -} // namespace - -constexpr size_t kCommandMaxLen = 256; -constexpr size_t kArgumentMaxLen = 128; -constexpr char kDefaultKey[] = "default"; - -CHIP_ERROR SystemCommands::Start(const char * identity, const chip::app::Clusters::SystemCommands::Commands::Start::Type & value) -{ - const char * scriptDir = getScriptsFolder(); - constexpr const char * scriptName = "Start.py"; - - char command[kCommandMaxLen]; - chip::StringBuilderBase builder(command, sizeof(command)); - builder.Add(scriptDir); - builder.Add(scriptName); - builder.Add(" "); - - if (value.registerKey.HasValue()) - { - VerifyOrReturnError(value.registerKey.Value().size() < 128, CHIP_ERROR_INVALID_ARGUMENT); - char registerKey[128]; - chip::Platform::CopyString(registerKey, value.registerKey.Value()); - builder.Add(registerKey); - } - else - { - builder.Add(kDefaultKey); - } - - // Add any applicable optional command line options - if (value.discriminator.HasValue()) - { - builder.Add(" --discriminator "); - builder.Add(value.discriminator.Value()); - } - - if (value.port.HasValue()) - { - builder.Add(" --secured-device-port "); - builder.Add(value.port.Value()); - } - - if (value.kvs.HasValue()) - { - AddSystemCommandArgument(builder, "--KVS", value.kvs.Value()); - } - - if (value.minCommissioningTimeout.HasValue()) - { - builder.Add(" --min_commissioning_timeout "); - builder.Add(value.minCommissioningTimeout.Value()); - } - - // OTA provider specific arguments - if (value.filepath.HasValue()) - { - AddSystemCommandArgument(builder, "--filepath", value.filepath.Value()); - } - - // OTA requstor specific arguments - if (value.otaDownloadPath.HasValue()) - { - AddSystemCommandArgument(builder, "--otaDownloadPath", value.otaDownloadPath.Value()); - } - - VerifyOrReturnError(builder.Fit(), CHIP_ERROR_BUFFER_TOO_SMALL); - - return RunInternal(command); -} - -CHIP_ERROR SystemCommands::Stop(const char * identity, const chip::app::Clusters::SystemCommands::Commands::Stop::Type & value) -{ - constexpr const char * scriptName = "Stop.py"; - return RunInternal(scriptName, value.registerKey); -} - -CHIP_ERROR SystemCommands::Reboot(const char * identity, const chip::app::Clusters::SystemCommands::Commands::Reboot::Type & value) -{ - constexpr const char * scriptName = "Reboot.py"; - return RunInternal(scriptName, value.registerKey); -} - -CHIP_ERROR SystemCommands::FactoryReset(const char * identity, - const chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type & value) -{ - constexpr const char * scriptName = "FactoryReset.py"; - return RunInternal(scriptName, value.registerKey); -} - -CHIP_ERROR SystemCommands::CreateOtaImage(const char * identity, - const chip::app::Clusters::SystemCommands::Commands::CreateOtaImage::Type & value) -{ - VerifyOrReturnError(!value.rawImageContent.empty(), CHIP_ERROR_INVALID_ARGUMENT); - VerifyOrReturnError(!value.rawImageFilePath.empty(), CHIP_ERROR_INVALID_ARGUMENT); - VerifyOrReturnError(!value.otaImageFilePath.empty(), CHIP_ERROR_INVALID_ARGUMENT); - - const char * scriptDir = getScriptsFolder(); - constexpr const char * scriptName = "CreateOtaImage.py"; - - char command[128]; - VerifyOrReturnError(snprintf(command, sizeof(command), "%s%s %.*s %.*s %.*s", scriptDir, scriptName, - static_cast(value.otaImageFilePath.size()), value.otaImageFilePath.data(), - static_cast(value.rawImageFilePath.size()), value.rawImageFilePath.data(), - static_cast(value.rawImageContent.size()), value.rawImageContent.data()) >= 0, - CHIP_ERROR_INTERNAL); - return RunInternal(command); -} - -CHIP_ERROR SystemCommands::CompareFiles(const char * identity, - const chip::app::Clusters::SystemCommands::Commands::CompareFiles::Type & value) -{ - VerifyOrReturnError(!value.file1.empty(), CHIP_ERROR_INVALID_ARGUMENT); - VerifyOrReturnError(!value.file2.empty(), CHIP_ERROR_INVALID_ARGUMENT); - - const char * scriptDir = getScriptsFolder(); - constexpr const char * scriptName = "CompareFiles.py"; - - char command[128]; - VerifyOrReturnError(snprintf(command, sizeof(command), "%s%s %.*s %.*s", scriptDir, scriptName, - static_cast(value.file1.size()), value.file1.data(), static_cast(value.file2.size()), - value.file2.data()) >= 0, - CHIP_ERROR_INTERNAL); - return RunInternal(command); -} - -CHIP_ERROR SystemCommands::RunInternal(const char * scriptName, const chip::Optional registerKey) -{ - const char * scriptDir = getScriptsFolder(); - const char * registerKeyValue = registerKey.HasValue() ? registerKey.Value().data() : kDefaultKey; - const size_t registerKeyLen = registerKey.HasValue() ? registerKey.Value().size() : strlen(kDefaultKey); - - char command[kCommandMaxLen]; - VerifyOrReturnError(snprintf(command, sizeof(command), "%s%s %.*s", scriptDir, scriptName, static_cast(registerKeyLen), - registerKeyValue) >= 0, - CHIP_ERROR_INTERNAL); - return RunInternal(command); -} - -CHIP_ERROR SystemCommands::RunInternal(const char * command) -{ - VerifyOrReturnError(system(command) == 0, CHIP_ERROR_INTERNAL); - return ContinueOnChipMainThread(CHIP_NO_ERROR); -} - -CHIP_ERROR SystemCommands::AddSystemCommandArgument(chip::StringBuilderBase & builder, const char * argName, - const chip::CharSpan & argValue) -{ - VerifyOrReturnError(argValue.size() < kArgumentMaxLen, CHIP_ERROR_INVALID_ARGUMENT); - - builder.Add(" "); - builder.Add(argName); - builder.Add(" "); - - char arg[kArgumentMaxLen]; - chip::Platform::CopyString(arg, argValue); - builder.Add(arg); - - return CHIP_NO_ERROR; -} diff --git a/src/app/tests/suites/commands/system/SystemCommands.h b/src/app/tests/suites/commands/system/SystemCommands.h deleted file mode 100644 index 7e14fc89c5bcfe..00000000000000 --- a/src/app/tests/suites/commands/system/SystemCommands.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2022 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 SystemCommands -{ -public: - SystemCommands(){}; - virtual ~SystemCommands(){}; - - virtual CHIP_ERROR ContinueOnChipMainThread(CHIP_ERROR err) = 0; - - CHIP_ERROR Start(const char * identity, const chip::app::Clusters::SystemCommands::Commands::Start::Type & value); - CHIP_ERROR Stop(const char * identity, const chip::app::Clusters::SystemCommands::Commands::Stop::Type & value); - CHIP_ERROR Reboot(const char * identity, const chip::app::Clusters::SystemCommands::Commands::Reboot::Type & value); - CHIP_ERROR FactoryReset(const char * identity, const chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type & value); - CHIP_ERROR CreateOtaImage(const char * identity, - const chip::app::Clusters::SystemCommands::Commands::CreateOtaImage::Type & value); - CHIP_ERROR CompareFiles(const char * identity, const chip::app::Clusters::SystemCommands::Commands::CompareFiles::Type & value); - -private: - CHIP_ERROR RunInternal(const char * scriptName, const chip::Optional registerKey); - CHIP_ERROR RunInternal(const char * command); - CHIP_ERROR AddSystemCommandArgument(chip::StringBuilderBase & builder, const char * argName, const chip::CharSpan & argValue); -}; diff --git a/src/app/tests/suites/commands/system/scripts/CompareFiles.py b/src/app/tests/suites/commands/system/scripts/CompareFiles.py deleted file mode 100755 index fcb1c1506a2e4d..00000000000000 --- a/src/app/tests/suites/commands/system/scripts/CompareFiles.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env -S python3 -B - -# Copyright (c) 2022 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. - -import sys -import xmlrpc.client - -IP = '127.0.0.1' -PORT = 9000 - -if sys.platform == 'linux': - IP = '10.10.10.5' - -# Passing in sys.argv[2:] gets rid of the script name and key to the apps register. The remaining -# values in the list are key-value pairs, e.g. [option1, value1, option2, value2, ...] -with xmlrpc.client.ServerProxy('http://' + IP + ':' + str(PORT) + '/', allow_none=True) as proxy: - file1 = sys.argv[1] - file2 = sys.argv[2] - proxy.compareFiles(file1, file2) diff --git a/src/app/tests/suites/commands/system/scripts/CreateOtaImage.py b/src/app/tests/suites/commands/system/scripts/CreateOtaImage.py deleted file mode 100755 index c0a343c8adf4f7..00000000000000 --- a/src/app/tests/suites/commands/system/scripts/CreateOtaImage.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env -S python3 -B - -# Copyright (c) 2022 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. - -import sys -import xmlrpc.client - -IP = '127.0.0.1' -PORT = 9000 - -if sys.platform == 'linux': - IP = '10.10.10.5' - -# Passing in sys.argv[2:] gets rid of the script name and key to the apps register. The remaining -# values in the list are key-value pairs, e.g. [option1, value1, option2, value2, ...] -with xmlrpc.client.ServerProxy('http://' + IP + ':' + str(PORT) + '/', allow_none=True) as proxy: - otaImageFilePath = sys.argv[1] - rawImageFilePath = sys.argv[2] - rawImageContent = ' '.join(sys.argv[3:]) - - proxy.createOtaImage(otaImageFilePath, rawImageFilePath, rawImageContent) diff --git a/src/app/tests/suites/commands/system/scripts/FactoryReset.py b/src/app/tests/suites/commands/system/scripts/FactoryReset.py deleted file mode 100755 index c78651a229f758..00000000000000 --- a/src/app/tests/suites/commands/system/scripts/FactoryReset.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env -S python3 -B - -# Copyright (c) 2022 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. - -import sys -import xmlrpc.client - -IP = '127.0.0.1' -PORT = 9000 - -if sys.platform == 'linux': - IP = '10.10.10.5' - -# sys.argv[1] contains the key to the apps register -with xmlrpc.client.ServerProxy('http://' + IP + ':' + str(PORT) + '/', allow_none=True) as proxy: - proxy.factoryReset(sys.argv[1]) diff --git a/src/app/tests/suites/commands/system/scripts/Reboot.py b/src/app/tests/suites/commands/system/scripts/Reboot.py deleted file mode 100755 index 8d6b430041bfea..00000000000000 --- a/src/app/tests/suites/commands/system/scripts/Reboot.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env -S python3 -B - -# Copyright (c) 2022 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. - -import sys -import xmlrpc.client - -IP = '127.0.0.1' -PORT = 9000 - -if sys.platform == 'linux': - IP = '10.10.10.5' - -# sys.argv[1] contains the key to the apps register -with xmlrpc.client.ServerProxy('http://' + IP + ':' + str(PORT) + '/', allow_none=True) as proxy: - proxy.reboot(sys.argv[1]) diff --git a/src/app/tests/suites/commands/system/scripts/Start.py b/src/app/tests/suites/commands/system/scripts/Start.py deleted file mode 100755 index 1a3c70013ce942..00000000000000 --- a/src/app/tests/suites/commands/system/scripts/Start.py +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env -S python3 -B - -# Copyright (c) 2022 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. - -import sys -import xmlrpc.client - -IP = '127.0.0.1' -PORT = 9000 - -if sys.platform == 'linux': - IP = '10.10.10.5' - -# Passing in sys.argv[2:] gets rid of the script name and key to the apps register. The remaining -# values in the list are key-value pairs, e.g. [option1, value1, option2, value2, ...] -with xmlrpc.client.ServerProxy('http://' + IP + ':' + str(PORT) + '/', allow_none=True) as proxy: - proxy.start(sys.argv[1], sys.argv[2:]) diff --git a/src/app/tests/suites/include/ConstraintsChecker.h b/src/app/tests/suites/include/ConstraintsChecker.h deleted file mode 100644 index 0811ca85923f83..00000000000000 --- a/src/app/tests/suites/include/ConstraintsChecker.h +++ /dev/null @@ -1,678 +0,0 @@ -/* - * Copyright (c) 2022 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 ConstraintsChecker -{ -public: - ConstraintsChecker(){}; - virtual ~ConstraintsChecker(){}; - -protected: - virtual void Exit(std::string message, CHIP_ERROR err = CHIP_ERROR_INTERNAL) = 0; - - bool CheckConstraintType(const char * itemName, const char * current, const char * expected) - { - if (strcmp(current, expected) != 0) - { - Exit(std::string(itemName) + " type (" + std::string(current) + ") is different than the expected type (" + - std::string(expected) + ")."); - return false; - } - - return true; - } - - bool CheckConstraintFormat(const char * itemName, const char * current, const char * expected) - { - ChipLogError(chipTool, "Warning: %s format checking is not implemented yet. Expected format: '%s'", - StringOrNullMarker(itemName), StringOrNullMarker(expected)); - return true; - } - - bool CheckConstraintMinLength(const char * itemName, uint64_t current, uint64_t expected) - { - if (current < expected) - { - Exit(std::string(itemName) + " length < minLength: " + std::to_string(current) + " < " + std::to_string(expected)); - return false; - } - - return true; - } - - bool CheckConstraintMaxLength(const char * itemName, uint64_t current, uint64_t expected) - { - if (current > expected) - { - Exit(std::string(itemName) + " length > maxLength: " + std::to_string(current) + " > " + std::to_string(expected)); - return false; - } - - return true; - } - - template - bool CheckConstraintMinLength(const char * itemName, const chip::Span & current, uint64_t expected) - { - return CheckConstraintMinLength(itemName, current.size(), expected); - } - - template - bool CheckConstraintMinLength(const char * itemName, const chip::app::DataModel::Nullable> & current, - uint64_t expected) - { - if (current.IsNull()) - { - return true; - } - - return CheckConstraintMinLength(itemName, current.Value(), expected); - } - - template - bool CheckConstraintMaxLength(const char * itemName, const chip::Span & current, uint64_t expected) - { - return CheckConstraintMaxLength(itemName, current.size(), expected); - } - - template - bool CheckConstraintMaxLength(const char * itemName, const chip::app::DataModel::Nullable> & current, - uint64_t expected) - { - if (current.IsNull()) - { - return true; - } - - return CheckConstraintMaxLength(itemName, current.Value(), expected); - } - - template - bool CheckConstraintMinLength(const char * itemName, const chip::app::DataModel::DecodableList & current, uint64_t expected) - { - size_t size; - CHIP_ERROR err = current.ComputeSize(&size); - if (err != CHIP_NO_ERROR) - { - Exit(std::string(itemName) + " length cannot be extracted: " + err.AsString()); - return false; - } - return CheckConstraintMinLength(itemName, size, expected); - } - - template - bool CheckConstraintMaxLength(const char * itemName, const chip::app::DataModel::DecodableList & current, uint64_t expected) - { - size_t size; - CHIP_ERROR err = current.ComputeSize(&size); - if (err != CHIP_NO_ERROR) - { - Exit(std::string(itemName) + " length cannot be extracted: " + err.AsString()); - return false; - } - return CheckConstraintMaxLength(itemName, size, expected); - } - - bool CheckConstraintStartsWith(const char * itemName, const chip::CharSpan current, const char * expected) - { - std::string value(current.data(), current.size()); - if (value.rfind(expected, 0) != 0) - { - Exit(std::string(itemName) + " (\"" + value + "\") does not starts with: \"" + std::string(expected) + "\""); - return false; - } - - return true; - } - - bool CheckConstraintEndsWith(const char * itemName, const chip::CharSpan current, const char * expected) - { - std::string value(current.data(), current.size()); - if (value.find(expected, value.size() - strlen(expected)) == std::string::npos) - { - Exit(std::string(itemName) + " (\"" + value + "\") does not ends with: \"" + std::string(expected) + "\""); - return false; - } - - return true; - } - - bool CheckConstraintIsUpperCase(const char * itemName, const chip::CharSpan current, bool expectUpperCase) - { - std::string value(current.data(), current.size()); - return CheckConstraintIsUpperCase(itemName, value.c_str(), expectUpperCase); - } - - bool CheckConstraintIsUpperCase(const char * itemName, const char * current, bool expectUpperCase) - { - bool isUpperCase = true; - for (size_t i = 0; i < strlen(current); i++) - { - if (islower(current[i])) - { - isUpperCase = false; - break; - } - } - - if (expectUpperCase && !isUpperCase) - { - Exit(std::string(itemName) + " (\"" + std::string(current) + "\") is not an upppercase string"); - return false; - } - - if (!expectUpperCase && isUpperCase) - { - Exit(std::string(itemName) + " (\"" + std::string(current) + "\") is an upppercase string"); - return false; - } - - return true; - } - - bool CheckConstraintIsLowerCase(const char * itemName, const chip::CharSpan current, bool expectLowerCase) - { - std::string value(current.data(), current.size()); - return CheckConstraintIsLowerCase(itemName, value.c_str(), expectLowerCase); - } - - bool CheckConstraintIsLowerCase(const char * itemName, const char * current, bool expectLowerCase) - { - bool isLowerCase = true; - for (size_t i = 0; i < strlen(current); i++) - { - if (isupper(current[i])) - { - isLowerCase = false; - break; - } - } - - if (expectLowerCase && !isLowerCase) - { - Exit(std::string(itemName) + " (\"" + std::string(current) + "\") is not a lowercase string"); - return false; - } - - if (!expectLowerCase && isLowerCase) - { - Exit(std::string(itemName) + " (\"" + std::string(current) + "\") is a lowercase string"); - return false; - } - - return true; - } - - bool CheckConstraintIsHexString(const char * itemName, const chip::CharSpan current, bool expectHexString) - { - std::string value(current.data(), current.size()); - return CheckConstraintIsHexString(itemName, value.c_str(), expectHexString); - } - - bool CheckConstraintIsHexString(const char * itemName, const char * current, bool expectHexString) - { - bool isHexString = true; - for (size_t i = 0; i < strlen(current); i++) - { - if (!isxdigit(current[i])) - { - isHexString = false; - break; - } - } - - if (expectHexString && !isHexString) - { - Exit(std::string(itemName) + " (\"" + std::string(current) + "\") is not a hexadecimal string"); - return false; - } - - if (!expectHexString && isHexString) - { - Exit(std::string(itemName) + " (\"" + std::string(current) + "\") is a hexadecimal string"); - return false; - } - - return true; - } - - template ::value && !std::is_pointer::value, int> = 0> - bool CheckConstraintMinValue(const char * itemName, T current, U expected) - { - if (current < expected) - { - Exit(std::string(itemName) + " value < minValue: " + std::to_string(current) + " < " + std::to_string(expected)); - return false; - } - - return true; - } - - template ::value && !std::is_enum::value && !std::is_pointer::value, int> = 0> - bool CheckConstraintMinValue(const char * itemName, T current, U expected) - { - return CheckConstraintMinValue(itemName, chip::to_underlying(current), expected); - } - - template ::value && std::is_enum::value, int> = 0> - bool CheckConstraintMinValue(const char * itemName, T current, U expected) - { - return CheckConstraintMinValue(itemName, chip::to_underlying(current), chip::to_underlying(expected)); - } - - template ::value && std::is_enum::value, int> = 0> - bool CheckConstraintMinValue(const char * itemName, T current, U expected) - { - return CheckConstraintMinValue(itemName, current, chip::to_underlying(expected)); - } - - template ::value, int> = 0> - bool CheckConstraintMinValue(const char * itemName, chip::BitFlags current, U expected) - { - if (current.Raw() < expected) - { - Exit(std::string(itemName) + " value < minValue: " + std::to_string(current.Raw()) + " < " + std::to_string(expected)); - return false; - } - - return true; - } - - template ::value, int> = 0> - bool CheckConstraintMinValue(const char * itemName, chip::BitMask current, U expected) - { - if (current.Raw() < expected) - { - Exit(std::string(itemName) + " value < minValue: " + std::to_string(current.Raw()) + " < " + std::to_string(expected)); - return false; - } - - return true; - } - - template ::value, int> = 0> - bool CheckConstraintMinValue(const char * itemName, const chip::app::DataModel::Nullable & current, U expected) - { - if (current.IsNull()) - { - return true; - } - return CheckConstraintMinValue(itemName, current.Value(), static_cast(expected)); - } - - template - bool CheckConstraintMinValue(const char * itemName, const chip::app::DataModel::Nullable & current, - const chip::app::DataModel::Nullable & expected) - { - if (expected.IsNull()) - { - return true; - } - return CheckConstraintMinValue(itemName, current, expected.Value()); - } - - template - bool CheckConstraintMinValue(const char * itemName, const T & current, const chip::Optional & expected) - { - if (!expected.HasValue()) - { - Exit(std::string(itemName) + ": expected min value does not have a value"); - return false; - } - return CheckConstraintMinValue(itemName, current, expected.Value()); - } - - template ::value && !std::is_pointer::value, int> = 0> - bool CheckConstraintMaxValue(const char * itemName, T current, U expected) - { - if (current > expected) - { - Exit(std::string(itemName) + " value > maxValue: " + std::to_string(current) + " > " + std::to_string(expected)); - return false; - } - - return true; - } - - template ::value && !std::is_enum::value && !std::is_pointer::value, int> = 0> - bool CheckConstraintMaxValue(const char * itemName, T current, U expected) - { - return CheckConstraintMaxValue(itemName, chip::to_underlying(current), expected); - } - - template ::value && std::is_enum::value, int> = 0> - bool CheckConstraintMaxValue(const char * itemName, T current, U expected) - { - return CheckConstraintMaxValue(itemName, chip::to_underlying(current), chip::to_underlying(expected)); - } - - template ::value && std::is_enum::value, int> = 0> - bool CheckConstraintMaxValue(const char * itemName, T current, U expected) - { - return CheckConstraintMaxValue(itemName, current, chip::to_underlying(expected)); - } - - template ::value, int> = 0> - bool CheckConstraintMaxValue(const char * itemName, chip::BitFlags current, U expected) - { - if (current.Raw() > expected) - { - Exit(std::string(itemName) + " value > maxValue: " + std::to_string(current.Raw()) + " > " + std::to_string(expected)); - return false; - } - - return true; - } - - template ::value, int> = 0> - bool CheckConstraintMaxValue(const char * itemName, chip::BitMask current, U expected) - { - if (current.Raw() > expected) - { - Exit(std::string(itemName) + " value > maxValue: " + std::to_string(current.Raw()) + " > " + std::to_string(expected)); - return false; - } - - return true; - } - - template ::value, int> = 0> - bool CheckConstraintMaxValue(const char * itemName, const chip::app::DataModel::Nullable & current, U expected) - { - if (current.IsNull()) - { - return true; - } - return CheckConstraintMaxValue(itemName, current.Value(), static_cast(expected)); - } - - template - bool CheckConstraintMaxValue(const char * itemName, const chip::app::DataModel::Nullable & current, - const chip::app::DataModel::Nullable & expected) - { - if (expected.IsNull()) - { - return true; - } - return CheckConstraintMaxValue(itemName, current, expected.Value()); - } - - template - bool CheckConstraintMaxValue(const char * itemName, const T & current, const chip::Optional & expected) - { - if (!expected.HasValue()) - { - Exit(std::string(itemName) + ": expected max value does not have a value"); - return false; - } - return CheckConstraintMaxValue(itemName, current, expected.Value()); - } - - template - bool CheckConstraintNotValue(const char * itemName, const chip::app::DataModel::Nullable & current, - const chip::app::DataModel::Nullable & expected) - { - if (expected.IsNull() && current.IsNull()) - { - Exit(std::string(itemName) + " got null for both values, but expected not equal"); - return false; - } - - if (expected.IsNull() != current.IsNull()) - { - return true; - } - - return CheckConstraintNotValue(itemName, current.Value(), expected.Value()); - } - - template ::value, int> = 0> - bool CheckConstraintNotValue(const char * itemName, T current, U expected) - { - if (current == expected) - { - Exit(std::string(itemName) + " got unexpected value: " + std::to_string(current)); - return false; - } - - return true; - } - - template ::value, int> = 0> - bool CheckConstraintNotValue(const char * itemName, T current, U expected) - { - return CheckConstraintNotValue(itemName, chip::to_underlying(current), expected); - } - - template ::value, int> = 0> - bool CheckConstraintNotValue(const char * itemName, T current, T expected) - { - return CheckConstraintNotValue(itemName, chip::to_underlying(current), chip::to_underlying(expected)); - } - - template - bool CheckConstraintNotValue(const char * itemName, chip::BitFlags current, chip::BitFlags expected) - { - if (current == expected) - { - Exit(std::string(itemName) + " got unexpected value: " + std::to_string(current.Raw())); - return false; - } - - return true; - } - - template - bool CheckConstraintNotValue(const char * itemName, chip::BitMask current, chip::BitMask expected) - { - if (current == expected) - { - Exit(std::string(itemName) + " got unexpected value: " + std::to_string(current.Raw())); - return false; - } - - return true; - } - - template - bool CheckConstraintNotValue(const char * itemName, chip::BitFlags current, U expected) - { - if (current.Raw() == expected) - { - - Exit(std::string(itemName) + " got unexpected value: " + std::to_string(current.Raw())); - return false; - } - - return true; - } - - template - bool CheckConstraintNotValue(const char * itemName, chip::BitMask current, U expected) - { - if (current.Raw() == expected) - { - - Exit(std::string(itemName) + " got unexpected value: " + std::to_string(current.Raw())); - return false; - } - - return true; - } - - template - bool CheckConstraintNotValue(const char * itemName, const chip::app::DataModel::Nullable & current, U expected) - { - if (current.IsNull()) - { - return true; - } - return CheckConstraintNotValue(itemName, current.Value(), expected); - } - - bool CheckConstraintNotValue(const char * itemName, const chip::CharSpan current, const chip::CharSpan expected) - { - if (current.data_equal(expected)) - { - Exit(std::string(itemName) + " got unexpected value: " + std::string(current.data(), current.size())); - return false; - } - - return true; - } - - bool CheckConstraintNotValue(const char * itemName, const chip::ByteSpan current, const chip::ByteSpan expected) - { - if (current.data_equal(expected)) - { - Exit(std::string(itemName) + " got unexpected value of size: " + std::to_string(current.size())); - return false; - } - - return true; - } - - template - bool CheckConstraintNotValue(const char * itemName, const T & current, const chip::Optional & expected) - { - if (!expected.HasValue()) - { - Exit(std::string(itemName) + ": expected disallowed value does not have a value"); - return false; - } - return CheckConstraintNotValue(itemName, current, expected.Value()); - } - - template - bool CheckConstraintHasValue(const char * itemName, const chip::Optional & current, bool expected) - { - if (current.HasValue() == expected) - { - return true; - } - - if (current.HasValue()) - { - Exit(std::string(itemName) + " not expected to have a value but does"); - } - else - { - Exit(std::string(itemName) + " expected to have a value but doesn't"); - } - return false; - } - - template - bool CheckConstraintContains(const char * itemName, const chip::app::DataModel::DecodableList & current, const U & expected) - { - auto iterValue = current.begin(); - while (iterValue.Next()) - { - auto currentValue = iterValue.GetValue(); - if (currentValue == expected) - { - return true; - } - } - - Exit(std::string(itemName) + " expect the value " + std::to_string(expected) + " but the list does not contains it."); - return false; - } - - template - bool CheckConstraintExcludes(const char * itemName, const chip::app::DataModel::DecodableList & current, const U & expected) - { - auto iterValue = current.begin(); - while (iterValue.Next()) - { - auto currentValue = iterValue.GetValue(); - if (currentValue == expected) - { - Exit(std::string(itemName) + " does not expect the value " + std::to_string(expected) + - " but the list contains it."); - return false; - } - } - - CHIP_ERROR err = iterValue.GetStatus(); - if (CHIP_NO_ERROR != err) - { - Exit(std::string(chip::ErrorStr(err))); - return false; - } - - return true; - } - - template - bool CheckConstraintHasMasksSet(const char * itemName, const T & current, const U & expected) - { - if (current & expected) - { - return true; - } - - Exit(std::string(itemName) + " expects the field with value " + std::to_string(expected) + " to be set but it is not."); - return false; - } - - template - bool CheckConstraintHasMasksSet(const char * itemName, const chip::BitMask & current, const U & expected) - { - if (current.Has(static_cast(expected))) - { - return true; - } - - Exit(std::string(itemName) + " expects the field with value " + std::to_string(expected) + " to be set but it is not."); - return false; - } - - template - bool CheckConstraintHasMasksClear(const char * itemName, const T & current, const U & expected) - { - if ((current & expected) == 0) - { - return true; - } - - Exit(std::string(itemName) + " expects the field with value " + std::to_string(expected) + " to not be set but it is."); - return false; - } - - template - bool CheckConstraintHasMasksClear(const char * itemName, const chip::BitMask & current, const U & expected) - { - if (!current.Has(static_cast(expected))) - { - return true; - } - - Exit(std::string(itemName) + " expects the field with value " + std::to_string(expected) + " to not be set but it is."); - return false; - } -}; diff --git a/src/app/tests/suites/include/PICSChecker.h b/src/app/tests/suites/include/PICSChecker.h deleted file mode 100644 index 0423e583ebd522..00000000000000 --- a/src/app/tests/suites/include/PICSChecker.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * Copyright (c) 2022 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 -#include -#include - -class PICSChecker -{ -public: - bool ShouldSkip(const char * expression) - { - // If there is no PICS configuration file, considers that nothing should be skipped. - if (!PICS.HasValue()) - { - return false; - } - - std::map pics(PICS.Value()); - bool shouldSkip = !PICSBooleanExpressionParser::Eval(expression, pics); - if (shouldSkip) - { - ChipLogProgress(chipTool, " **** Skipping: %s == false\n", StringOrNullMarker(expression)); - } - return shouldSkip; - } - - chip::Optional> PICS; -}; diff --git a/src/app/tests/suites/include/TestRunner.h b/src/app/tests/suites/include/TestRunner.h deleted file mode 100644 index 719f758c01e641..00000000000000 --- a/src/app/tests/suites/include/TestRunner.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2022 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 -#include - -class TestRunner -{ -public: - TestRunner(const char * name, uint16_t testCount) : mTestName(name), mTestCount(testCount), mTestIndex(0) {} - virtual ~TestRunner(){}; - - void LogStart() { ChipLogProgress(chipTool, " ***** Test Start : %s\n", StringOrNullMarker(mTestName)); } - - void LogStep(uint32_t stepNumber, const char * stepName) - { - ChipLogProgress(chipTool, " ***** Test Step %u : %s\n", stepNumber, StringOrNullMarker(stepName)); - } - - void LogEnd(std::string message, CHIP_ERROR err) - { - if (CHIP_NO_ERROR == err) - { - ChipLogProgress(chipTool, " **** Test Complete: %s\n", message.c_str()); - } - else - { - ChipLogError(chipTool, " ***** Test Failure: %s\n", message.c_str()); - } - } - - virtual CHIP_ERROR DoTestStep(uint16_t testIndex) = 0; - virtual void Exit(std::string message, CHIP_ERROR err = CHIP_ERROR_INTERNAL) = 0; - - void NextTest() - { - if (mTestSubStepIndex != mTestSubStepCount) - { - Exit(mTestName, CHIP_ERROR_INVALID_ARGUMENT); - return; - } - mTestSubStepIndex = 0; - mTestSubStepCount = 0; - - if (0 == mTestIndex) - { - LogStart(); - } - - if (mTestCount == mTestIndex) - { - Exit(mTestName, CHIP_NO_ERROR); - return; - } - - if (mDelayInMs.HasValue()) - { - chip::test_utils::SleepMillis(mDelayInMs.Value()); - } - - // Ensure we increment mTestIndex before we start running the relevant - // command. That way if we lose the timeslice after we send the message - // but before our function call returns, we won't end up with an - // incorrect mTestIndex value observed when we get the response. - auto err = DoTestStep(mTestIndex++); - if (CHIP_NO_ERROR != err) - { - Exit(chip::ErrorStr(err)); - } - } - -protected: - const char * mTestName; - const uint16_t mTestCount; - std::atomic_uint16_t mTestIndex; - chip::Optional mDelayInMs; - - uint16_t mTestSubStepIndex = 0; - uint16_t mTestSubStepCount = 0; -}; diff --git a/src/app/tests/suites/include/ValueChecker.h b/src/app/tests/suites/include/ValueChecker.h deleted file mode 100644 index 3fa032a4db638a..00000000000000 --- a/src/app/tests/suites/include/ValueChecker.h +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (c) 2022 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 ValueChecker -{ -public: - ValueChecker(){}; - virtual ~ValueChecker(){}; - -protected: - virtual void Exit(std::string message, CHIP_ERROR err = CHIP_ERROR_INTERNAL) = 0; - - bool CheckDecodeValue(CHIP_ERROR error) - { - if (CHIP_NO_ERROR != error) - { - Exit(std::string("Can not decode data: ") + chip::ErrorStr(error)); - return false; - } - - return true; - } - - bool CheckValueAsString(const char * itemName, chip::ByteSpan current, chip::ByteSpan expected) - { - if (!current.data_equal(expected)) - { - Exit(std::string(itemName) + " value mismatch, expecting " + - std::string(chip::Uint8::to_const_char(expected.data()), expected.size())); - return false; - } - - return true; - } - - bool CheckValueAsString(const char * itemName, chip::CharSpan current, chip::CharSpan expected) - { - if (!current.data_equal(expected)) - { - Exit(std::string(itemName) + " value mismatch, expected '" + std::string(expected.data(), expected.size()) + - "' but got '" + std::string(current.data(), current.size()) + "'"); - return false; - } - - return true; - } - - // Allow a different expected type from the actual value type, because if T - // is short the literal we are using is not short-typed. - template ::value && !std::is_enum::value, int> = 0> - bool CheckValue(const char * itemName, T current, U expected) - { - if (current != expected) - { - Exit(std::string(itemName) + " value mismatch: expected " + std::to_string(expected) + " but got " + - std::to_string(current)); - return false; - } - - return true; - } - - template ::value && std::is_enum::value, int> = 0> - bool CheckValue(const char * itemName, T current, U expected) - { - return CheckValue(itemName, current, chip::to_underlying(expected)); - } - - template ::value, int> = 0> - bool CheckValue(const char * itemName, T current, U expected) - { - return CheckValue(itemName, chip::to_underlying(current), expected); - } - - template - bool CheckValue(const char * itemName, chip::BitFlags current, U expected) - { - return CheckValue(itemName, current.Raw(), expected); - } - - template - bool CheckValue(const char * itemName, chip::BitMask current, U expected) - { - return CheckValue(itemName, current.Raw(), expected); - } - - // Allow an expected value that is a nullable wrapped around the actual - // value (e.g. a SaveAs from reading a different attribute that has a value - // space that includes null). In that case we check that: - // 1) The nullable is not in fact null. - // - // 2) The value in the nullable matches our test value. - template - bool CheckValue(const char * itemName, T current, const chip::app::DataModel::Nullable & expected) - { - auto nullableName = std::string(itemName); - nullableName += " expected value"; - return CheckValueNonNull(nullableName.c_str(), expected) && CheckValue(itemName, current, expected.Value()); - } - - template - bool CheckValue(const char * itemName, chip::BitFlags current, chip::BitFlags expected) - { - return CheckValue(itemName, current.Raw(), expected.Raw()); - } - - template - bool CheckValue(const char * itemName, chip::BitMask current, chip::BitMask expected) - { - return CheckValue(itemName, current.Raw(), expected.Raw()); - } - - template - bool CheckValuePresent(const char * itemName, const chip::Optional & value) - { - if (value.HasValue()) - { - return true; - } - - Exit(std::string(itemName) + " expected to have value but doesn't"); - return false; - } - - template - bool CheckValueNull(const char * itemName, const chip::app::DataModel::Nullable & value) - { - if (value.IsNull()) - { - return true; - } - - Exit(std::string(itemName) + " expected to be null but isn't"); - return false; - } - - template - bool CheckValueNonNull(const char * itemName, const chip::app::DataModel::Nullable & value) - { - if (!value.IsNull()) - { - return true; - } - - Exit(std::string(itemName) + " expected to not be null but is"); - return false; - } - - /** - * Check that the next list item, which is at index "index", exists and - * decodes properly. - */ - template - bool CheckNextListItemDecodes(const char * listName, typename std::remove_reference_t::Iterator & iter, size_t index) - { - bool hasValue = iter.Next(); - if (iter.GetStatus() != CHIP_NO_ERROR) - { - Exit(std::string(listName) + " value mismatch: error '" + iter.GetStatus().AsString() + "'decoding item at index " + - std::to_string(index)); - return false; - } - - if (hasValue) - { - return true; - } - - Exit(std::string(listName) + " value mismatch: should have value at index " + std::to_string(index) + - " but doesn't (actual value too short)"); - return false; - } - - /** - * Check that there are no more list items now that we have seen - * "expectedCount" of them. - */ - template - bool CheckNoMoreListItems(const char * listName, typename std::remove_reference_t::Iterator & iter, - size_t expectedCount) - { - bool hasValue = iter.Next(); - if (iter.GetStatus() != CHIP_NO_ERROR) - { - Exit(std::string(listName) + " value mismatch: error '" + iter.GetStatus().AsString() + - "'decoding item after we have seen " + std::to_string(expectedCount) + " items"); - return false; - } - - if (!hasValue) - { - return true; - } - - Exit(std::string(listName) + " value mismatch: expected only " + std::to_string(expectedCount) + - " items, but have more than that (actual value too long)"); - return false; - } -}; diff --git a/src/app/tests/suites/pics/PICSBooleanExpressionParser.cpp b/src/app/tests/suites/pics/PICSBooleanExpressionParser.cpp deleted file mode 100644 index 7aac171f20b128..00000000000000 --- a/src/app/tests/suites/pics/PICSBooleanExpressionParser.cpp +++ /dev/null @@ -1,165 +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 "PICSBooleanExpressionParser.h" -#include "PICSNormalizer.h" - -#include - -bool PICSBooleanExpressionParser::Eval(std::string expression, std::map & PICS) -{ - std::vector tokens; - uint8_t index = 0; - - Tokenize(expression, tokens); - return EvaluateExpression(tokens, PICS, index); -} - -void PICSBooleanExpressionParser::Tokenize(std::string & expression, std::vector & tokens) -{ - if (expression.empty()) - { - return; - } - - std::string s; - - for (char c : expression) - { - switch (c) - { - case ' ': - case '\n': - case '\t': - if (s.empty()) - { - continue; - } - break; - - case '(': - case ')': - case '!': - if (!s.empty() > 0) - { - tokens.push_back(s); - s.clear(); - } - - tokens.push_back(std::string(1, c)); - break; - - case '&': - case '|': - if (!s.empty() && s.back() == c) - { - s.pop_back(); - if (s.size()) - { - tokens.push_back(s); - s.clear(); - } - - tokens.push_back(std::string(1, c) + std::string(1, c)); - break; - } - - s.push_back(c); - break; - - default: - s.push_back(c); - break; - } - } - - if (s.size()) - { - tokens.push_back(s); - } -} - -bool PICSBooleanExpressionParser::EvaluateExpression(std::vector & tokens, std::map & PICS, - uint8_t & index) -{ - bool leftExpr = EvaluateSubExpression(tokens, PICS, index); - if (index >= tokens.size()) - { - return leftExpr; - } - - if (tokens[index] == ")") - { - return leftExpr; - } - - std::string token = tokens[index]; - if (token == "&&") - { - index++; - bool rightExpr = EvaluateExpression(tokens, PICS, index); - return leftExpr && rightExpr; - } - if (token == "||") - { - index++; - bool rightExpr = EvaluateExpression(tokens, PICS, index); - return leftExpr || rightExpr; - } - - ChipLogError(chipTool, "Unknown token: '%s'", token.c_str()); - chipDie(); -} - -bool PICSBooleanExpressionParser::EvaluateSubExpression(std::vector & tokens, std::map & PICS, - uint8_t & index) -{ - std::string token = tokens[index]; - if (token == "(") - { - index++; - bool expr = EvaluateExpression(tokens, PICS, index); - if (tokens[index] != ")") - { - ChipLogError(chipTool, "Missing ')'"); - chipDie(); - } - - index++; - return expr; - } - if (token == "!") - { - index++; - bool expr = EvaluateSubExpression(tokens, PICS, index); - return !expr; - } - - token = PICSNormalizer::Normalize(token); - - index++; - - if (PICS.find(token) == PICS.end()) - { - // By default, let's consider that if a PICS item is not defined, it is |false|. - // It allows to create a file that only contains enabled features. - return false; - } - - return PICS[token]; -} diff --git a/src/app/tests/suites/pics/PICSBooleanExpressionParser.h b/src/app/tests/suites/pics/PICSBooleanExpressionParser.h deleted file mode 100644 index 162f55df1f1582..00000000000000 --- a/src/app/tests/suites/pics/PICSBooleanExpressionParser.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * - * 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. - */ - -/** - * @file - * @brief Declaration of PICS Boolean Expression parser, a class that - * implements PICS condition parsing for YAML tests. - */ - -#include -#include -#include -#include - -class PICSBooleanExpressionParser -{ -public: - /** - * @brief - * This function returns a boolean which is the result of evaluating the - * boolean logic expressed into the PICS expression. - * - * @param [in] expression An expression containing PICS code such as - * "!DT_CTRL_CONCATENATED_QR_CODE_1 && DT_CTRL_CONCATENATED_QR_CODE_2" - * @param [in] PICS A map of enabled/disabled PICS code - * - * @returns A boolean as the result of evaluating the expression. - */ - static bool Eval(std::string expression, std::map & PICS); - -private: - static void Tokenize(std::string & expression, std::vector & tokens); - static bool EvaluateExpression(std::vector & tokens, std::map & PICS, uint8_t & index); - static bool EvaluateSubExpression(std::vector & tokens, std::map & PICS, uint8_t & index); -}; diff --git a/src/app/tests/suites/pics/PICSBooleanReader.cpp b/src/app/tests/suites/pics/PICSBooleanReader.cpp deleted file mode 100644 index 9e84763fbb8288..00000000000000 --- a/src/app/tests/suites/pics/PICSBooleanReader.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/** - * - * 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 "PICSBooleanReader.h" -#include "PICSNormalizer.h" - -#include - -#include -#include - -std::map PICSBooleanReader::Read(std::string filepath) -{ - std::ifstream f(filepath); - VerifyOrDieWithMsg(f.is_open(), chipTool, "Error reading: %s", filepath.c_str()); - - std::map PICS; - std::string line; - std::string key; - std::string value; - uint16_t lineNumber = 0; - while (std::getline(f, line)) - { - if (line.empty()) - { - continue; - } - - std::stringstream ss(line); - - std::getline(ss, key, '='); - VerifyOrDieWithMsg(!key.empty(), chipTool, "Missing PICS key at line %u", lineNumber + 1); - key = PICSNormalizer::Normalize(key); - - std::getline(ss, value); - if (value == "0") - { - PICS[key] = false; - } - else if (value == "1") - { - PICS[key] = true; - } - else - { - ChipLogError(chipTool, "%s: PICS value should be either '0' or '1', got '%s'", key.c_str(), value.c_str()); - chipDie(); - } - - lineNumber++; - } - - return PICS; -} diff --git a/src/app/tests/suites/pics/PICSNormalizer.cpp b/src/app/tests/suites/pics/PICSNormalizer.cpp deleted file mode 100644 index 0fe5eb5ca2db23..00000000000000 --- a/src/app/tests/suites/pics/PICSNormalizer.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) 2022 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 "PICSNormalizer.h" - -#include -#include - -std::string PICSNormalizer::Normalize(std::string code) -{ - // Convert to all-lowercase so people who mess up cases don't have things - // break on them in subtle ways. - std::transform(code.begin(), code.end(), code.begin(), [](unsigned char c) { return std::tolower(c); }); - - // TODO strip off "(Additional Context)" bits from the end of the code. - return code; -} diff --git a/src/app/tests/suites/templates/simulated-cluster-objects.zapt b/src/app/tests/suites/templates/simulated-cluster-objects.zapt deleted file mode 100644 index 9c4dadca6385cd..00000000000000 --- a/src/app/tests/suites/templates/simulated-cluster-objects.zapt +++ /dev/null @@ -1,132 +0,0 @@ -{{>header}} - -#include -#include - -#pragma once - -namespace chip { - -{{#chip_tests_only_clusters includeAllClusters=true}} -{{#chip_tests_only_cluster_commands}} - -struct {{name}}Command -{ - {{#chip_tests_only_cluster_command_parameters}} - {{zapTypeToEncodableClusterObjectType type ns=cluster}} {{name}}; - {{/chip_tests_only_cluster_command_parameters}} - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - {{#chip_tests_only_cluster_command_parameters}} - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag({{index}}), {{name}})); - {{/chip_tests_only_cluster_command_parameters}} - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - {{#chip_tests_only_cluster_command_parameters}} - case {{index}}: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, {{name}})); - break; - {{/chip_tests_only_cluster_command_parameters}} - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; -{{/chip_tests_only_cluster_commands}} -{{#chip_tests_only_cluster_responses}} - -struct {{#if responseName}}{{responseName}}{{else}}{{name}}Response{{/if}} -{ - {{#chip_tests_only_cluster_response_parameters}} - {{zapTypeToEncodableClusterObjectType type}} {{name}}; - {{/chip_tests_only_cluster_response_parameters}} - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - {{#chip_tests_only_cluster_response_parameters}} - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag({{index}}), {{name}})); - {{/chip_tests_only_cluster_response_parameters}} - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - {{#chip_tests_only_cluster_response_parameters}} - case {{index}}: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, {{name}})); - break; - {{/chip_tests_only_cluster_response_parameters}} - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; -{{/chip_tests_only_cluster_responses}} -{{/chip_tests_only_clusters}} - -namespace app { -namespace Clusters { -{{#chip_tests_only_clusters}} - -namespace {{name}} { -namespace Commands { -{{#chip_tests_only_cluster_commands}} -namespace {{name}} { -using Type = struct {{name}}Command; -} -{{/chip_tests_only_cluster_commands}} -{{#chip_tests_only_cluster_responses}} -namespace {{#if responseName}}{{responseName}}{{else}}{{name}}Response{{/if}} { -using DecodableType = struct {{#if responseName}}{{responseName}}{{else}}{{name}}Response{{/if}}; -} -{{/chip_tests_only_cluster_responses}} -} // namespace Commands -} // namespace {{name}} - -{{/chip_tests_only_clusters}} -} // namespace Clusters -} // namespace app - -} // namespace chip diff --git a/src/app/tests/suites/templates/templates.json b/src/app/tests/suites/templates/templates.json deleted file mode 100644 index 2a174671c2763b..00000000000000 --- a/src/app/tests/suites/templates/templates.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "CHIP Tests templates", - "version": "chip-v1", - "helpers": [ - "common/StringHelper.js", - "templates/app/helper.js", - "templates/chip/helper.js", - "common/ClusterTestGeneration.js" - ], - "resources": { - "pics-metafile": "../../../tests/suites/certification/PICS.yaml", - "certification-metadir": "../../../tests/suites/certification", - "test-metadir": "../../../tests/suites" - }, - "override": "../../../zap-templates/common/override.js", - "partials": [ - { - "name": "header", - "path": "../../../zap-templates/partials/header.zapt" - } - ], - "templates": [ - { - "path": "simulated-cluster-objects.zapt", - "name": "Simulated Cluster Objects Commands header", - "output": "tests/simulated-cluster-objects.h" - } - ] -} diff --git a/src/app/util/af-enums.h b/src/app/util/af-enums.h deleted file mode 100644 index 411f042032a758..00000000000000 --- a/src/app/util/af-enums.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * - * 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. - */ - -/** - * Contains standard enum values (non-generated) - */ -#pragma once - -#include -#include - -typedef chip::Protocols::InteractionModel::Status EmberAfStatus; - -#define EMBER_ZCL_STATUS_SUCCESS chip::Protocols::InteractionModel::Status::Success -#define EMBER_ZCL_STATUS_FAILURE chip::Protocols::InteractionModel::Status::Failure -#define EMBER_ZCL_STATUS_INVALID_SUBSCRIPTION chip::Protocols::InteractionModel::Status::InvalidSubscription -#define EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS chip::Protocols::InteractionModel::Status::UnsupportedAccess -#define EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT chip::Protocols::InteractionModel::Status::UnsupportedEndpoint -#define EMBER_ZCL_STATUS_MALFORMED_COMMAND chip::Protocols::InteractionModel::Status::InvalidAction -#define EMBER_ZCL_STATUS_UNSUPPORTED_COMMAND chip::Protocols::InteractionModel::Status::UnsupportedCommand -#define EMBER_ZCL_STATUS_DEPRECATED82 chip::Protocols::InteractionModel::Status::Deprecated82 -#define EMBER_ZCL_STATUS_DEPRECATED83 chip::Protocols::InteractionModel::Status::Deprecated83 -#define EMBER_ZCL_STATUS_DEPRECATED84 chip::Protocols::InteractionModel::Status::Deprecated84 -#define EMBER_ZCL_STATUS_INVALID_COMMAND chip::Protocols::InteractionModel::Status::InvalidCommand -#define EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE chip::Protocols::InteractionModel::Status::UnsupportedAttribute -#define EMBER_ZCL_STATUS_CONSTRAINT_ERROR chip::Protocols::InteractionModel::Status::ConstraintError -#define EMBER_ZCL_STATUS_UNSUPPORTED_WRITE chip::Protocols::InteractionModel::Status::UnsupportedWrite -#define EMBER_ZCL_STATUS_RESOURCE_EXHAUSTED chip::Protocols::InteractionModel::Status::ResourceExhausted -#define EMBER_ZCL_STATUS_NOT_FOUND chip::Protocols::InteractionModel::Status::NotFound -#define EMBER_ZCL_STATUS_UNREPORTABLE_ATTRIBUTE chip::Protocols::InteractionModel::Status::UnreportableAttribute -#define EMBER_ZCL_STATUS_INVALID_DATA_TYPE chip::Protocols::InteractionModel::Status::InvalidDataType -#define EMBER_ZCL_STATUS_DEPRECATED8E chip::Protocols::InteractionModel::Status::Deprecated8e -#define EMBER_ZCL_STATUS_UNSUPPORTED_READ chip::Protocols::InteractionModel::Status::UnsupportedRead -#define EMBER_ZCL_STATUS_DEPRECATED90 chip::Protocols::InteractionModel::Status::Deprecated90 -#define EMBER_ZCL_STATUS_DEPRECATED91 chip::Protocols::InteractionModel::Status::Deprecated91 -#define EMBER_ZCL_STATUS_DATA_VERSION_MISMATCH chip::Protocols::InteractionModel::Status::DataVersionMismatch -#define EMBER_ZCL_STATUS_DEPRECATED93 chip::Protocols::InteractionModel::Status::Deprecated93 -#define EMBER_ZCL_STATUS_TIMEOUT chip::Protocols::InteractionModel::Status::Timeout -#define EMBER_ZCL_STATUS_RESERVED95 chip::Protocols::InteractionModel::Status::Reserved95 -#define EMBER_ZCL_STATUS_RESERVED96 chip::Protocols::InteractionModel::Status::Reserved96 -#define EMBER_ZCL_STATUS_RESERVED97 chip::Protocols::InteractionModel::Status::Reserved97 -#define EMBER_ZCL_STATUS_RESERVED98 chip::Protocols::InteractionModel::Status::Reserved98 -#define EMBER_ZCL_STATUS_RESERVED99 chip::Protocols::InteractionModel::Status::Reserved99 -#define EMBER_ZCL_STATUS_RESERVED9A chip::Protocols::InteractionModel::Status::Reserved9a -#define EMBER_ZCL_STATUS_BUSY chip::Protocols::InteractionModel::Status::Busy -#define EMBER_ZCL_STATUS_DEPRECATEDC0 chip::Protocols::InteractionModel::Status::Deprecatedc0 -#define EMBER_ZCL_STATUS_DEPRECATEDC1 chip::Protocols::InteractionModel::Status::Deprecatedc1 -#define EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER chip::Protocols::InteractionModel::Status::UnsupportedCluster -#define EMBER_ZCL_STATUS_DEPRECATEDC4 chip::Protocols::InteractionModel::Status::Deprecatedc4 -#define EMBER_ZCL_STATUS_NO_UPSTREAM_SUBSCRIPTION chip::Protocols::InteractionModel::Status::NoUpstreamSubscription -#define EMBER_ZCL_STATUS_NEEDS_TIMED_INTERACTION chip::Protocols::InteractionModel::Status::NeedsTimedInteraction -#define EMBER_ZCL_STATUS_UNSUPPORTED_EVENT chip::Protocols::InteractionModel::Status::UnsupportedEvent -#define EMBER_ZCL_STATUS_PATHS_EXHAUSTED chip::Protocols::InteractionModel::Status::PathsExhausted -#define EMBER_ZCL_STATUS_TIMED_REQUEST_MISMATCH chip::Protocols::InteractionModel::Status::TimedRequestMismatch -#define EMBER_ZCL_STATUS_FAILSAFE_REQUIRED chip::Protocols::InteractionModel::Status::FailsafeRequired -#define EMBER_ZCL_STATUS_INVALID_IN_STATE chip::Protocols::InteractionModel::Status::InvalidInState -#define EMBER_ZCL_STATUS_NO_COMMAND_RESPONSE chip::Protocols::InteractionModel::Status::NoCommandResponse -#define EMBER_ZCL_STATUS_WRITE_IGNORED chip::Protocols::InteractionModel::Status::WriteIgnored // NOT SPEC COMPLIANT FOR TEST ONLY diff --git a/src/app/util/af-types.h b/src/app/util/af-types.h index e394a2098e4005..0c343185f70576 100644 --- a/src/app/util/af-types.h +++ b/src/app/util/af-types.h @@ -27,7 +27,6 @@ #include // For NULL. #include // For various uint*_t types -#include #include #include // For various types. @@ -41,6 +40,7 @@ #include #include +#include /** * @brief Type for the cluster mask @@ -290,9 +290,8 @@ typedef void (*EmberAfClusterAttributeChangedCallback)(const chip::app::Concrete * * This function is called before an attribute changes. */ -typedef EmberAfStatus (*EmberAfClusterPreAttributeChangedCallback)(const chip::app::ConcreteAttributePath & attributePath, - EmberAfAttributeType attributeType, uint16_t size, - uint8_t * value); +typedef chip::Protocols::InteractionModel::Status (*EmberAfClusterPreAttributeChangedCallback)( + const chip::app::ConcreteAttributePath & attributePath, EmberAfAttributeType attributeType, uint16_t size, uint8_t * value); #define MAX_INT32U_VALUE (0xFFFFFFFFUL) #define MAX_INT16U_VALUE (0xFFFF) diff --git a/src/app/util/af.h b/src/app/util/af.h index d18d69956b9746..f7f772a4f2f4d2 100644 --- a/src/app/util/af.h +++ b/src/app/util/af.h @@ -29,6 +29,7 @@ #include #include #include +#include /** @name Attribute Storage */ // @{ @@ -95,8 +96,9 @@ bool emberAfContainsClient(chip::EndpointId endpoint, chip::ClusterId clusterId) * data type (as Accessors.h/cpp have this correct by default). * TODO: this not checking seems off - what if this is run without Accessors.h ? */ -EmberAfStatus emberAfWriteAttribute(chip::EndpointId endpoint, chip::ClusterId cluster, chip::AttributeId attributeID, - uint8_t * dataPtr, EmberAfAttributeType dataType); +chip::Protocols::InteractionModel::Status emberAfWriteAttribute(chip::EndpointId endpoint, chip::ClusterId cluster, + chip::AttributeId attributeID, uint8_t * dataPtr, + EmberAfAttributeType dataType); /** * @brief Read the attribute value, performing all the checks. @@ -107,8 +109,9 @@ EmberAfStatus emberAfWriteAttribute(chip::EndpointId endpoint, chip::ClusterId c * dataPtr may be NULL, signifying that we don't need the value, just the status * (i.e. whether the attribute can be read). */ -EmberAfStatus emberAfReadAttribute(chip::EndpointId endpoint, chip::ClusterId cluster, chip::AttributeId attributeID, - uint8_t * dataPtr, uint16_t readLength); +chip::Protocols::InteractionModel::Status emberAfReadAttribute(chip::EndpointId endpoint, chip::ClusterId cluster, + chip::AttributeId attributeID, uint8_t * dataPtr, + uint16_t readLength); /** * @brief macro that returns size of attribute in bytes. diff --git a/src/app/util/attribute-storage.cpp b/src/app/util/attribute-storage.cpp index 43f86843f187c2..bd785c5b9682b1 100644 --- a/src/app/util/attribute-storage.cpp +++ b/src/app/util/attribute-storage.cpp @@ -27,6 +27,9 @@ #include #include #include +#include + +using chip::Protocols::InteractionModel::Status; // Attribute storage depends on knowing the current layout/setup of attributes // and corresponding callbacks. Specifically: @@ -372,20 +375,20 @@ void emAfClusterAttributeChangedCallback(const app::ConcreteAttributePath & attr } // This function is used to call the per-cluster pre-attribute changed callback -EmberAfStatus emAfClusterPreAttributeChangedCallback(const app::ConcreteAttributePath & attributePath, - EmberAfAttributeType attributeType, uint16_t size, uint8_t * value) +Status emAfClusterPreAttributeChangedCallback(const app::ConcreteAttributePath & attributePath, EmberAfAttributeType attributeType, + uint16_t size, uint8_t * value) { const EmberAfCluster * cluster = emberAfFindServerCluster(attributePath.mEndpointId, attributePath.mClusterId); if (cluster == nullptr) { if (!emberAfEndpointIsEnabled(attributePath.mEndpointId)) { - return EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT; + return Status::UnsupportedEndpoint; } - return EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER; + return Status::UnsupportedCluster; } - EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS; + Status status = Status::Success; // Casting and calling a function pointer on the same line results in ignoring the return // of the call on gcc-arm-none-eabi-9-2019-q4-major EmberAfClusterPreAttributeChangedCallback f = (EmberAfClusterPreAttributeChangedCallback) (emberAfFindClusterFunction( @@ -487,8 +490,8 @@ static uint8_t * singletonAttributeLocation(const EmberAfAttributeMetadata * am) // If src == NULL, then this method will set memory to zeroes // See documentation for emAfReadOrWriteAttribute for the semantics of // readLength when reading and writing. -static EmberAfStatus typeSensitiveMemCopy(ClusterId clusterId, uint8_t * dest, uint8_t * src, const EmberAfAttributeMetadata * am, - bool write, uint16_t readLength) +static Status typeSensitiveMemCopy(ClusterId clusterId, uint8_t * dest, uint8_t * src, const EmberAfAttributeMetadata * am, + bool write, uint16_t readLength) { EmberAfAttributeType attributeType = am->attributeType; // readLength == 0 for a read indicates that we should just trust that the @@ -500,7 +503,7 @@ static EmberAfStatus typeSensitiveMemCopy(ClusterId clusterId, uint8_t * dest, u { if (bufferSize < 1) { - return EMBER_ZCL_STATUS_RESOURCE_EXHAUSTED; + return Status::ResourceExhausted; } emberAfCopyString(dest, src, bufferSize - 1); } @@ -508,7 +511,7 @@ static EmberAfStatus typeSensitiveMemCopy(ClusterId clusterId, uint8_t * dest, u { if (bufferSize < 2) { - return EMBER_ZCL_STATUS_RESOURCE_EXHAUSTED; + return Status::ResourceExhausted; } emberAfCopyLongString(dest, src, bufferSize - 2); } @@ -516,7 +519,7 @@ static EmberAfStatus typeSensitiveMemCopy(ClusterId clusterId, uint8_t * dest, u { if (bufferSize < 2) { - return EMBER_ZCL_STATUS_RESOURCE_EXHAUSTED; + return Status::ResourceExhausted; } // Just copy the length. @@ -526,7 +529,7 @@ static EmberAfStatus typeSensitiveMemCopy(ClusterId clusterId, uint8_t * dest, u { if (!ignoreReadLength && readLength < am->size) { - return EMBER_ZCL_STATUS_RESOURCE_EXHAUSTED; + return Status::ResourceExhausted; } if (src == nullptr) { @@ -537,7 +540,7 @@ static EmberAfStatus typeSensitiveMemCopy(ClusterId clusterId, uint8_t * dest, u memmove(dest, src, am->size); } } - return EMBER_ZCL_STATUS_SUCCESS; + return Status::Success; } /** @@ -581,8 +584,8 @@ bool emAfMatchAttribute(const EmberAfCluster * cluster, const EmberAfAttributeMe // type. For strings, the function will copy as many bytes as will fit in the // attribute. This means the resulting string may be truncated. The length // byte(s) in the resulting string will reflect any truncated. -EmberAfStatus emAfReadOrWriteAttribute(const EmberAfAttributeSearchRecord * attRecord, const EmberAfAttributeMetadata ** metadata, - uint8_t * buffer, uint16_t readLength, bool write) +Status emAfReadOrWriteAttribute(const EmberAfAttributeSearchRecord * attRecord, const EmberAfAttributeMetadata ** metadata, + uint8_t * buffer, uint16_t readLength, bool write) { assertChipStackLockedByCurrentThread(); @@ -630,14 +633,14 @@ EmberAfStatus emAfReadOrWriteAttribute(const EmberAfAttributeSearchRecord * attR if (!emberAfAttributeWriteAccessCallback(attRecord->endpoint, attRecord->clusterId, am->attributeId)) { - return EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS; + return Status::UnsupportedAccess; } } else { if (buffer == nullptr) { - return EMBER_ZCL_STATUS_SUCCESS; + return Status::Success; } src = attributeLocation; @@ -645,7 +648,7 @@ EmberAfStatus emAfReadOrWriteAttribute(const EmberAfAttributeSearchRecord * attR if (!emberAfAttributeReadAccessCallback(attRecord->endpoint, attRecord->clusterId, am->attributeId)) { - return EMBER_ZCL_STATUS_UNSUPPORTED_ACCESS; + return Status::UnsupportedAccess; } } @@ -664,7 +667,7 @@ EmberAfStatus emAfReadOrWriteAttribute(const EmberAfAttributeSearchRecord * attR return typeSensitiveMemCopy(attRecord->clusterId, dst, src, am, write, readLength); } - return EMBER_ZCL_STATUS_FAILURE; + return Status::Failure; } } else @@ -678,7 +681,7 @@ EmberAfStatus emAfReadOrWriteAttribute(const EmberAfAttributeSearchRecord * attR } // Attribute is not in the cluster. - return EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE; + return Status::UnsupportedAttribute; } // Not the cluster we are looking for @@ -686,7 +689,7 @@ EmberAfStatus emAfReadOrWriteAttribute(const EmberAfAttributeSearchRecord * attR } // Cluster is not in the endpoint. - return EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER; + return Status::UnsupportedCluster; } // Not the endpoint we are looking for @@ -696,7 +699,7 @@ EmberAfStatus emAfReadOrWriteAttribute(const EmberAfAttributeSearchRecord * attR attributeOffsetIndex = static_cast(attributeOffsetIndex + emAfEndpoints[ep].endpointType->endpointSize); } } - return EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT; // Sorry, endpoint was not found. + return Status::UnsupportedEndpoint; // Sorry, endpoint was not found. } const EmberAfEndpointType * emberAfFindEndpointType(chip::EndpointId endpointId) @@ -1174,7 +1177,7 @@ void emAfLoadAttributeDefaults(EndpointId endpoint, Optional clusterI for (ep = 0; ep < epCount; ep++) { EmberAfDefinedEndpoint * de; - if (endpoint != EMBER_BROADCAST_ENDPOINT) + if (endpoint != chip::kInvalidEndpointId) { ep = emberAfIndexFromEndpoint(endpoint); if (ep == kEmberInvalidEndpointIndex) @@ -1295,7 +1298,7 @@ void emAfLoadAttributeDefaults(EndpointId endpoint, Optional clusterI } } } - if (endpoint != EMBER_BROADCAST_ENDPOINT) + if (endpoint != chip::kInvalidEndpointId) { break; } diff --git a/src/app/util/attribute-storage.h b/src/app/util/attribute-storage.h index abc04021fb0a9a..7a1ab307dc1202 100644 --- a/src/app/util/attribute-storage.h +++ b/src/app/util/attribute-storage.h @@ -28,6 +28,8 @@ #include #include +#include + // If we have fixed number of endpoints, then max is the same. #ifdef FIXED_ENDPOINT_COUNT #define MAX_ENDPOINT_COUNT (FIXED_ENDPOINT_COUNT + CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT) @@ -69,8 +71,9 @@ void emAfCallInits(void); // Initial configuration void emberAfEndpointConfigure(void); -EmberAfStatus emAfReadOrWriteAttribute(const EmberAfAttributeSearchRecord * attRecord, const EmberAfAttributeMetadata ** metadata, - uint8_t * buffer, uint16_t readLength, bool write); +chip::Protocols::InteractionModel::Status emAfReadOrWriteAttribute(const EmberAfAttributeSearchRecord * attRecord, + const EmberAfAttributeMetadata ** metadata, uint8_t * buffer, + uint16_t readLength, bool write); // Check if a cluster is implemented or not. If yes, the cluster is returned. // @@ -118,7 +121,11 @@ const EmberAfCluster * emberAfFindClusterIncludingDisabledEndpoints(chip::Endpoi // cast it. EmberAfGenericClusterFunction emberAfFindClusterFunction(const EmberAfCluster * cluster, EmberAfClusterMask functionMask); -// Loads attribute defaults and any non-volatile attributes stored +/** + * @brief Loads attribute defaults and any non-volatile attributes stored + * + * @param endpoint EnpointId. Use chip::kInvalidEndpointId to initialize all endpoints + */ void emberAfInitializeAttributes(chip::EndpointId endpoint); // After the RAM value has changed, code should call this function. If this @@ -130,8 +137,9 @@ void emAfSaveAttributeToStorageIfNeeded(uint8_t * data, chip::EndpointId endpoin void emAfClusterAttributeChangedCallback(const chip::app::ConcreteAttributePath & attributePath); // Calls the attribute changed callback for a specific cluster. -EmberAfStatus emAfClusterPreAttributeChangedCallback(const chip::app::ConcreteAttributePath & attributePath, - EmberAfAttributeType attributeType, uint16_t size, uint8_t * value); +chip::Protocols::InteractionModel::Status +emAfClusterPreAttributeChangedCallback(const chip::app::ConcreteAttributePath & attributePath, EmberAfAttributeType attributeType, + uint16_t size, uint8_t * value); // Note the difference in for server filtering. // This method will return the cluster count for BOTH client and server diff --git a/src/app/util/attribute-table.cpp b/src/app/util/attribute-table.cpp index 4c36d759c3a5ed..d16942646ba929 100644 --- a/src/app/util/attribute-table.cpp +++ b/src/app/util/attribute-table.cpp @@ -22,7 +22,6 @@ // for pulling in defines dealing with EITHER server or client #include "app/util/common.h" #include -#include #include #include #include @@ -30,16 +29,18 @@ #include #include +using chip::Protocols::InteractionModel::Status; + using namespace chip; -EmberAfStatus emAfWriteAttributeExternal(EndpointId endpoint, ClusterId cluster, AttributeId attributeID, uint8_t * dataPtr, - EmberAfAttributeType dataType) +Status emAfWriteAttributeExternal(EndpointId endpoint, ClusterId cluster, AttributeId attributeID, uint8_t * dataPtr, + EmberAfAttributeType dataType) { return emAfWriteAttribute(endpoint, cluster, attributeID, dataPtr, dataType, false /* override read-only */); } -EmberAfStatus emberAfWriteAttribute(EndpointId endpoint, ClusterId cluster, AttributeId attributeID, uint8_t * dataPtr, - EmberAfAttributeType dataType) +Status emberAfWriteAttribute(EndpointId endpoint, ClusterId cluster, AttributeId attributeID, uint8_t * dataPtr, + EmberAfAttributeType dataType) { return emAfWriteAttribute(endpoint, cluster, attributeID, dataPtr, dataType, true /* override read-only */); } @@ -103,18 +104,18 @@ static bool IsNullValue(const uint8_t * data, uint16_t dataLen, bool isAttribute return false; } -EmberAfStatus emAfWriteAttribute(EndpointId endpoint, ClusterId cluster, AttributeId attributeID, uint8_t * data, - EmberAfAttributeType dataType, bool overrideReadOnlyAndDataType) +Status emAfWriteAttribute(EndpointId endpoint, ClusterId cluster, AttributeId attributeID, uint8_t * data, + EmberAfAttributeType dataType, bool overrideReadOnlyAndDataType) { const EmberAfAttributeMetadata * metadata = nullptr; EmberAfAttributeSearchRecord record; - record.endpoint = endpoint; - record.clusterId = cluster; - record.attributeId = attributeID; - EmberAfStatus status = emAfReadOrWriteAttribute(&record, &metadata, - nullptr, // buffer - 0, // buffer size - false); // write? + record.endpoint = endpoint; + record.clusterId = cluster; + record.attributeId = attributeID; + Status status = emAfReadOrWriteAttribute(&record, &metadata, + nullptr, // buffer + 0, // buffer size + false); // write? // if we dont support that attribute if (metadata == nullptr) @@ -130,18 +131,18 @@ EmberAfStatus emAfWriteAttribute(EndpointId endpoint, ClusterId cluster, Attribu if (dataType != metadata->attributeType) { ChipLogProgress(Zcl, "%p invalid data type", "WRITE ERR: "); - return EMBER_ZCL_STATUS_INVALID_DATA_TYPE; + return Status::InvalidDataType; } if (metadata->IsReadOnly()) { ChipLogProgress(Zcl, "%p attr not writable", "WRITE ERR: "); - return EMBER_ZCL_STATUS_UNSUPPORTED_WRITE; + return Status::UnsupportedWrite; } } // if the value the attribute is being set to is out of range - // return EMBER_ZCL_STATUS_CONSTRAINT_ERROR + // return Status::ConstraintError if ((metadata->mask & ATTRIBUTE_MASK_MIN_MAX) != 0U) { EmberAfDefaultAttributeValue minv = metadata->defaultValue.ptrToMinMaxValue->minValue; @@ -178,7 +179,7 @@ EmberAfStatus emAfWriteAttribute(EndpointId endpoint, ClusterId cluster, Attribu // null value is always in-range for a nullable attribute. (!metadata->IsNullable() || !IsNullValue(data, dataLen, isAttributeSigned))) { - return EMBER_ZCL_STATUS_CONSTRAINT_ERROR; + return Status::ConstraintError; } } @@ -190,7 +191,7 @@ EmberAfStatus emAfWriteAttribute(EndpointId endpoint, ClusterId cluster, Attribu MatterPreAttributeChangeCallback(attributePath, dataType, emberAfAttributeSize(metadata), data); if (imStatus != Protocols::InteractionModel::Status::Success) { - return app::ToEmberAfStatus(imStatus); + return imStatus; } // Pre-write attribute callback specific @@ -198,12 +199,12 @@ EmberAfStatus emAfWriteAttribute(EndpointId endpoint, ClusterId cluster, Attribu status = emAfClusterPreAttributeChangedCallback(attributePath, dataType, emberAfAttributeSize(metadata), data); // Ignore the following write operation and return success - if (status == EMBER_ZCL_STATUS_WRITE_IGNORED) + if (status == Status::WriteIgnored) { - return EMBER_ZCL_STATUS_SUCCESS; + return Status::Success; } - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { return status; } @@ -215,7 +216,7 @@ EmberAfStatus emAfWriteAttribute(EndpointId endpoint, ClusterId cluster, Attribu 0, // buffer size - unused true); // write? - if (status != EMBER_ZCL_STATUS_SUCCESS) + if (status != Status::Success) { return status; } @@ -234,15 +235,14 @@ EmberAfStatus emAfWriteAttribute(EndpointId endpoint, ClusterId cluster, Attribu // to the cluster that the attribute lives in. emAfClusterAttributeChangedCallback(attributePath); - return EMBER_ZCL_STATUS_SUCCESS; + return Status::Success; } -EmberAfStatus emberAfReadAttribute(EndpointId endpoint, ClusterId cluster, AttributeId attributeID, uint8_t * dataPtr, - uint16_t readLength) +Status emberAfReadAttribute(EndpointId endpoint, ClusterId cluster, AttributeId attributeID, uint8_t * dataPtr, uint16_t readLength) { const EmberAfAttributeMetadata * metadata = nullptr; EmberAfAttributeSearchRecord record; - EmberAfStatus status; + Status status; record.endpoint = endpoint; record.clusterId = cluster; record.attributeId = attributeID; @@ -250,7 +250,7 @@ EmberAfStatus emberAfReadAttribute(EndpointId endpoint, ClusterId cluster, Attri false); // write? // failed, print debug info - if (status == EMBER_ZCL_STATUS_RESOURCE_EXHAUSTED) + if (status == Status::ResourceExhausted) { ChipLogProgress(Zcl, "READ: attribute size too large for caller"); } diff --git a/src/app/util/attribute-table.h b/src/app/util/attribute-table.h index 1f08d80dbd1353..7b86298209326f 100644 --- a/src/app/util/attribute-table.h +++ b/src/app/util/attribute-table.h @@ -19,14 +19,17 @@ #include +#include + /** * Write an attribute for a request arriving from external sources. * * This will check attribute writeability and that * the provided data type matches the expected data type. */ -EmberAfStatus emAfWriteAttributeExternal(chip::EndpointId endpoint, chip::ClusterId cluster, chip::AttributeId attributeID, - uint8_t * dataPtr, EmberAfAttributeType dataType); +chip::Protocols::InteractionModel::Status emAfWriteAttributeExternal(chip::EndpointId endpoint, chip::ClusterId cluster, + chip::AttributeId attributeID, uint8_t * dataPtr, + EmberAfAttributeType dataType); /** * @brief write an attribute, performing all the checks. @@ -48,15 +51,16 @@ EmberAfStatus emAfWriteAttributeExternal(chip::EndpointId endpoint, chip::Cluste * testing or setting the initial value of the attribute on the device. * * this returns: - * - EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT: if endpoint isn't supported by the device. - * - EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER: if cluster isn't supported on the endpoint. - * - EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE: if attribute isn't supported in the cluster. - * - EMBER_ZCL_STATUS_INVALID_DATA_TYPE: if the data type passed in doesnt match the type + * - Status::UnsupportedEndpoint: if endpoint isn't supported by the device. + * - Status::UnsupportedCluster: if cluster isn't supported on the endpoint. + * - Status::UnsupportedAttribute: if attribute isn't supported in the cluster. + * - Status::InvalidDataType: if the data type passed in doesnt match the type * stored in the attribute table - * - EMBER_ZCL_STATUS_UNSUPPORTED_WRITE: if the attribute isnt writable - * - EMBER_ZCL_STATUS_CONSTRAINT_ERROR: if the value is set out of the allowable range for + * - Status::UnsupportedWrite: if the attribute isnt writable + * - Status::ConstraintError: if the value is set out of the allowable range for * the attribute - * - EMBER_ZCL_STATUS_SUCCESS: if the attribute was found and successfully written + * - Status::Success: if the attribute was found and successfully written */ -EmberAfStatus emAfWriteAttribute(chip::EndpointId endpoint, chip::ClusterId cluster, chip::AttributeId attributeID, uint8_t * data, - EmberAfAttributeType dataType, bool overrideReadOnlyAndDataType); +chip::Protocols::InteractionModel::Status emAfWriteAttribute(chip::EndpointId endpoint, chip::ClusterId cluster, + chip::AttributeId attributeID, uint8_t * data, + EmberAfAttributeType dataType, bool overrideReadOnlyAndDataType); diff --git a/src/app/util/binding-table.cpp b/src/app/util/binding-table.cpp index 87655bdf956c38..b08d41d7f074b4 100644 --- a/src/app/util/binding-table.cpp +++ b/src/app/util/binding-table.cpp @@ -33,12 +33,12 @@ BindingTable::BindingTable() CHIP_ERROR BindingTable::Add(const EmberBindingTableEntry & entry) { - if (entry.type == EMBER_UNUSED_BINDING) + if (entry.type == MATTER_UNUSED_BINDING) { return CHIP_ERROR_INVALID_ARGUMENT; } uint8_t newIndex = GetNextAvaiableIndex(); - if (newIndex >= EMBER_BINDING_TABLE_SIZE) + if (newIndex >= MATTER_BINDING_TABLE_SIZE) { return CHIP_ERROR_NO_MEMORY; } @@ -62,7 +62,7 @@ CHIP_ERROR BindingTable::Add(const EmberBindingTableEntry & entry) if (error != CHIP_NO_ERROR) { // Roll back - mBindingTable[newIndex].type = EMBER_UNUSED_BINDING; + mBindingTable[newIndex].type = MATTER_UNUSED_BINDING; return error; } @@ -101,7 +101,7 @@ CHIP_ERROR BindingTable::SaveEntryToStorage(uint8_t index, uint8_t nextIndex) { ReturnErrorOnFailure(writer.Put(TLV::ContextTag(kTagCluster), entry.clusterId.Value())); } - if (entry.type == EMBER_UNICAST_BINDING) + if (entry.type == MATTER_UNICAST_BINDING) { ReturnErrorOnFailure(writer.Put(TLV::ContextTag(kTagRemoteEndpoint), entry.remote)); ReturnErrorOnFailure(writer.Put(TLV::ContextTag(kTagNodeId), entry.nodeId)); @@ -211,14 +211,14 @@ CHIP_ERROR BindingTable::LoadEntryFromStorage(uint8_t index, uint8_t & nextIndex } if (reader.GetTag() == TLV::ContextTag(kTagRemoteEndpoint)) { - entry.type = EMBER_UNICAST_BINDING; + entry.type = MATTER_UNICAST_BINDING; ReturnErrorOnFailure(reader.Get(entry.remote)); ReturnErrorOnFailure(reader.Next(TLV::ContextTag(kTagNodeId))); ReturnErrorOnFailure(reader.Get(entry.nodeId)); } else { - entry.type = EMBER_MULTICAST_BINDING; + entry.type = MATTER_MULTICAST_BINDING; ReturnErrorCodeIf(reader.GetTag() != TLV::ContextTag(kTagGroupId), CHIP_ERROR_INVALID_TLV_TAG); ReturnErrorOnFailure(reader.Get(entry.groupId)); } @@ -265,7 +265,7 @@ CHIP_ERROR BindingTable::RemoveAt(Iterator & iter) { ChipLogError(AppServer, "Failed to remove binding table entry %u from storage", iter.mIndex); } - mBindingTable[iter.mIndex].type = EMBER_UNUSED_BINDING; + mBindingTable[iter.mIndex].type = MATTER_UNUSED_BINDING; mNextIndex[iter.mIndex] = kNextNullIndex; mSize--; } @@ -292,14 +292,14 @@ BindingTable::Iterator BindingTable::end() uint8_t BindingTable::GetNextAvaiableIndex() { - for (uint8_t i = 0; i < EMBER_BINDING_TABLE_SIZE; i++) + for (uint8_t i = 0; i < MATTER_BINDING_TABLE_SIZE; i++) { - if (mBindingTable[i].type == EMBER_UNUSED_BINDING) + if (mBindingTable[i].type == MATTER_UNUSED_BINDING) { return i; } } - return EMBER_BINDING_TABLE_SIZE; + return MATTER_BINDING_TABLE_SIZE; } BindingTable::Iterator BindingTable::Iterator::operator++() diff --git a/src/app/util/binding-table.h b/src/app/util/binding-table.h index 9e39313091cd35..4b8cc733410a9d 100644 --- a/src/app/util/binding-table.h +++ b/src/app/util/binding-table.h @@ -110,8 +110,8 @@ class BindingTable CHIP_ERROR LoadEntryFromStorage(uint8_t index, uint8_t & nextIndex); - EmberBindingTableEntry mBindingTable[EMBER_BINDING_TABLE_SIZE]; - uint8_t mNextIndex[EMBER_BINDING_TABLE_SIZE]; + EmberBindingTableEntry mBindingTable[MATTER_BINDING_TABLE_SIZE]; + uint8_t mNextIndex[MATTER_BINDING_TABLE_SIZE]; uint8_t mHead = kNextNullIndex; uint8_t mTail = kNextNullIndex; diff --git a/src/app/util/config.h b/src/app/util/config.h index 288935eee4beae..658626e384c464 100644 --- a/src/app/util/config.h +++ b/src/app/util/config.h @@ -29,6 +29,6 @@ // User options for plugin Binding Table Library // TODO: Make this a CHIP_CONFIG value. -#ifndef EMBER_BINDING_TABLE_SIZE -#define EMBER_BINDING_TABLE_SIZE 10 -#endif // EMBER_BINDING_TABLE_SIZE +#ifndef MATTER_BINDING_TABLE_SIZE +#define MATTER_BINDING_TABLE_SIZE 10 +#endif // MATTER_BINDING_TABLE_SIZE diff --git a/src/app/util/ember-compatibility-functions.cpp b/src/app/util/ember-compatibility-functions.cpp index 76daa77ea13fa7..d35be58bffdd80 100644 --- a/src/app/util/ember-compatibility-functions.cpp +++ b/src/app/util/ember-compatibility-functions.cpp @@ -36,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -53,6 +52,8 @@ #include +using chip::Protocols::InteractionModel::Status; + using namespace chip; using namespace chip::app; using namespace chip::Access; @@ -619,13 +620,13 @@ CHIP_ERROR ReadSingleClusterData(const SubjectDescriptor & aSubjectDescriptor, b ReturnErrorOnFailure(err); EmberAfAttributeSearchRecord record; - record.endpoint = aPath.mEndpointId; - record.clusterId = aPath.mClusterId; - record.attributeId = aPath.mAttributeId; - EmberAfStatus emberStatus = emAfReadOrWriteAttribute(&record, &attributeMetadata, attributeData, sizeof(attributeData), - /* write = */ false); + record.endpoint = aPath.mEndpointId; + record.clusterId = aPath.mClusterId; + record.attributeId = aPath.mAttributeId; + Status status = emAfReadOrWriteAttribute(&record, &attributeMetadata, attributeData, sizeof(attributeData), + /* write = */ false); - if (emberStatus == EMBER_ZCL_STATUS_SUCCESS) + if (status == Status::Success) { EmberAfAttributeType attributeType = attributeMetadata->attributeType; bool isNullable = attributeMetadata->IsNullable(); @@ -822,17 +823,16 @@ CHIP_ERROR ReadSingleClusterData(const SubjectDescriptor & aSubjectDescriptor, b } default: ChipLogError(DataManagement, "Attribute type 0x%x not handled", static_cast(attributeType)); - emberStatus = EMBER_ZCL_STATUS_UNSUPPORTED_READ; + status = Status::UnsupportedRead; } } - Protocols::InteractionModel::Status imStatus = ToInteractionModelStatus(emberStatus); - if (imStatus == Protocols::InteractionModel::Status::Success) + if (status == Protocols::InteractionModel::Status::Success) { return SendSuccessStatus(attributeReport, attributeDataIBBuilder); } - return SendFailureStatus(aPath, aAttributeReports, imStatus, &backup); + return SendFailureStatus(aPath, aAttributeReports, status, &backup); } namespace { @@ -1051,8 +1051,8 @@ CHIP_ERROR WriteSingleClusterData(const SubjectDescriptor & aSubjectDescriptor, return apWriteHandler->AddStatus(aPath, Protocols::InteractionModel::Status::InvalidValue); } - auto status = ToInteractionModelStatus(emAfWriteAttributeExternal(aPath.mEndpointId, aPath.mClusterId, aPath.mAttributeId, - attributeData, attributeMetadata->attributeType)); + auto status = emAfWriteAttributeExternal(aPath.mEndpointId, aPath.mClusterId, aPath.mAttributeId, attributeData, + attributeMetadata->attributeType); return apWriteHandler->AddStatus(aPath, status); } diff --git a/src/app/util/error-mapping.h b/src/app/util/error-mapping.h deleted file mode 100644 index de47b27f859d59..00000000000000 --- a/src/app/util/error-mapping.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * - * Copyright (c) 2020 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 - -namespace chip { -namespace app { - -inline EmberAfStatus ToEmberAfStatus(Protocols::InteractionModel::Status code) -{ - return static_cast(code); -} - -inline Protocols::InteractionModel::Status ToInteractionModelStatus(EmberAfStatus code) -{ - return static_cast(code); -} - -} // namespace app -} // namespace chip diff --git a/src/app/util/generic-callback-stubs.cpp b/src/app/util/generic-callback-stubs.cpp index 11e705c7382b1c..723c9f2a60df5b 100644 --- a/src/app/util/generic-callback-stubs.cpp +++ b/src/app/util/generic-callback-stubs.cpp @@ -19,6 +19,7 @@ #include #include #include +#include using namespace chip; @@ -34,18 +35,18 @@ bool __attribute__((weak)) emberAfAttributeWriteAccessCallback(EndpointId endpoi return true; } -EmberAfStatus __attribute__((weak)) +chip::Protocols::InteractionModel::Status __attribute__((weak)) emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId, const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, uint16_t maxReadLength) { - return EMBER_ZCL_STATUS_FAILURE; + return chip::Protocols::InteractionModel::Status::Failure; } -EmberAfStatus __attribute__((weak)) +chip::Protocols::InteractionModel::Status __attribute__((weak)) emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId, const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer) { - return EMBER_ZCL_STATUS_FAILURE; + return chip::Protocols::InteractionModel::Status::Failure; } chip::Protocols::InteractionModel::Status __attribute__((weak)) diff --git a/src/app/util/generic-callbacks.h b/src/app/util/generic-callbacks.h index 4f0fc6661af92c..85e7f147a1dec8 100644 --- a/src/app/util/generic-callbacks.h +++ b/src/app/util/generic-callbacks.h @@ -76,15 +76,15 @@ bool emberAfAttributeWriteAccessCallback(chip::EndpointId endpoint, chip::Cluste * emberAfMainTickCallback. If the application was successfully able to * read the attribute and write it into the passed buffer, it should return a - * value of EMBER_ZCL_STATUS_SUCCESS. Ensure that the size of the externally + * value of InteractionModel::Status::Success. Ensure that the size of the externally * managed attribute value is smaller than what the buffer can hold. In the case * of a buffer overflow throw an appropriate error such as - * EMBER_ZCL_STATUS_RESOURCE_EXHAUSTED. Any other return value indicates the + * InteractionModel::Status::ResourceExhausted. Any other return value indicates the * application was not able to read the attribute. */ -EmberAfStatus emberAfExternalAttributeReadCallback(chip::EndpointId endpoint, chip::ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, - uint16_t maxReadLength); +chip::Protocols::InteractionModel::Status emberAfExternalAttributeReadCallback(chip::EndpointId endpoint, chip::ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer, uint16_t maxReadLength); /** @brief External Attribute Write * @@ -122,19 +122,21 @@ EmberAfStatus emberAfExternalAttributeReadCallback(chip::EndpointId endpoint, ch * Framework and updated occasionally by the application code from within the * emberAfMainTickCallback. If the application was successfully able to - * write the attribute, it returns a value of EMBER_ZCL_STATUS_SUCCESS. Any + * write the attribute, it returns a value of InteractionModel::Status::Success. Any * other return value indicates the application was not able to write the * attribute. */ -EmberAfStatus emberAfExternalAttributeWriteCallback(chip::EndpointId endpoint, chip::ClusterId clusterId, - const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer); +chip::Protocols::InteractionModel::Status emberAfExternalAttributeWriteCallback(chip::EndpointId endpoint, + chip::ClusterId clusterId, + const EmberAfAttributeMetadata * attributeMetadata, + uint8_t * buffer); /** @brief Pre Attribute Change * * This function is called by the application framework before it changes an * attribute value. The value passed into this callback is the value to which * the attribute is to be set by the framework. The application should return - * chip::Protocols::InteractionModel::Status::Success to permit the change or + * Protocols::InteractionModel::Status::Success to permit the change or * any other code to reject it. */ chip::Protocols::InteractionModel::Status MatterPreAttributeChangeCallback(const chip::app::ConcreteAttributePath & attributePath, diff --git a/src/app/util/im-client-callbacks.h b/src/app/util/im-client-callbacks.h index 489224a2685730..3c4bdd6839a328 100644 --- a/src/app/util/im-client-callbacks.h +++ b/src/app/util/im-client-callbacks.h @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include diff --git a/src/app/util/mock/include/zap-generated/gen_config.h b/src/app/util/mock/include/zap-generated/gen_config.h index 8488bc9c8700ca..17f2de013f9597 100644 --- a/src/app/util/mock/include/zap-generated/gen_config.h +++ b/src/app/util/mock/include/zap-generated/gen_config.h @@ -17,5 +17,5 @@ #pragma once -#define EMBER_BINDING_TABLE_SIZE 20 +#define MATTER_BINDING_TABLE_SIZE 20 #define SCENES_MANAGEMENT_TABLE_SIZE 24 diff --git a/src/app/util/types_stub.h b/src/app/util/types_stub.h index e6ebd93f06f384..ac26684f850cd7 100644 --- a/src/app/util/types_stub.h +++ b/src/app/util/types_stub.h @@ -36,13 +36,13 @@ enum #endif { /** A binding that is currently not in use. */ - EMBER_UNUSED_BINDING = 0, + MATTER_UNUSED_BINDING = 0, /** A unicast binding whose 64-bit identifier is the destination EUI64. */ - EMBER_UNICAST_BINDING = 1, + MATTER_UNICAST_BINDING = 1, /** A multicast binding whose 64-bit identifier is the group address. This * binding can be used to send messages to the group and to receive * messages sent to the group. */ - EMBER_MULTICAST_BINDING = 3, + MATTER_MULTICAST_BINDING = 3, }; /** @@ -77,7 +77,7 @@ struct EmberBindingTableEntry chip::EndpointId remoteEndpoint, chip::Optional cluster) { EmberBindingTableEntry entry = { - .type = EMBER_UNICAST_BINDING, + .type = MATTER_UNICAST_BINDING, .fabricIndex = fabric, .local = localEndpoint, .clusterId = cluster, @@ -91,7 +91,7 @@ struct EmberBindingTableEntry chip::Optional cluster) { EmberBindingTableEntry entry = { - .type = EMBER_MULTICAST_BINDING, + .type = MATTER_MULTICAST_BINDING, .fabricIndex = fabric, .local = localEndpoint, .clusterId = cluster, @@ -102,7 +102,7 @@ struct EmberBindingTableEntry } /** The type of binding. */ - EmberBindingType type = EMBER_UNUSED_BINDING; + EmberBindingType type = MATTER_UNUSED_BINDING; chip::FabricIndex fabricIndex; /** The endpoint on the local node. */ @@ -135,12 +135,12 @@ struct EmberBindingTableEntry return false; } - if (type == EMBER_MULTICAST_BINDING && groupId != other.groupId) + if (type == MATTER_MULTICAST_BINDING && groupId != other.groupId) { return false; } - if (type == EMBER_UNICAST_BINDING && (nodeId != other.nodeId || remote != other.remote)) + if (type == MATTER_UNICAST_BINDING && (nodeId != other.nodeId || remote != other.remote)) { return false; } @@ -172,65 +172,6 @@ typedef struct */ #define UNUSED_VAR(x) (void) (x) -/** - * @brief The broadcast endpoint, as defined in the ZigBee spec. - */ -#define EMBER_BROADCAST_ENDPOINT (chip::kInvalidEndpointId) - -/** - * @brief Useful to reference a single bit of a byte. - */ -#define EMBER_BIT(nr) (1UL << (nr)) // Unsigned avoids compiler warnings re EMBER_BIT(15) - -/** - * @brief Returns the low byte of the 16-bit value \c n as an \c uint8_t. - */ -#define EMBER_LOW_BYTE(n) ((uint8_t) ((n) &0xFF)) - -/** - * @brief Returns the high byte of the 16-bit value \c n as an \c uint8_t. - */ -#define EMBER_HIGH_BYTE(n) ((uint8_t) (EMBER_LOW_BYTE((n) >> 8))) -/** - * @brief Returns the low byte of the 32-bit value \c n as an \c uint8_t. - */ -#define EMBER_BYTE_0(n) ((uint8_t) ((n) &0xFF)) - -/** - * @brief Returns the second byte of the 32-bit value \c n as an \c uint8_t. - */ -#define EMBER_BYTE_1(n) EMBER_BYTE_0((n) >> 8) - -/** - * @brief Returns the third byte of the 32-bit value \c n as an \c uint8_t. - */ -#define EMBER_BYTE_2(n) EMBER_BYTE_0((n) >> 16) - -/** - * @brief Returns the high byte of the 32-bit value \c n as an \c uint8_t. - */ -#define EMBER_BYTE_3(n) EMBER_BYTE_0((n) >> 24) - -/** - * @brief Returns the fifth byte of the 64-bit value \c n as an \c uint8_t. - */ -#define EMBER_BYTE_4(n) EMBER_BYTE_0((n) >> 32) - -/** - * @brief Returns the sixth byte of the 64-bit value \c n as an \c uint8_t. - */ -#define EMBER_BYTE_5(n) EMBER_BYTE_0((n) >> 40) - -/** - * @brief Returns the seventh byte of the 64-bit value \c n as an \c uint8_t. - */ -#define EMBER_BYTE_6(n) EMBER_BYTE_0((n) >> 48) - -/** - * @brief Returns the high byte of the 64-bit value \c n as an \c uint8_t. - */ -#define EMBER_BYTE_7(n) EMBER_BYTE_0((n) >> 56) - /** * @brief Returns the value of the bitmask \c bits within * the register or byte \c reg. diff --git a/src/app/util/util.cpp b/src/app/util/util.cpp index c22cb74b497e4a..e327673fc3cbf4 100644 --- a/src/app/util/util.cpp +++ b/src/app/util/util.cpp @@ -24,6 +24,8 @@ #include #include #include +#include +#include // TODO: figure out a clear path for compile-time codegen #include @@ -34,6 +36,8 @@ using namespace chip; +using chip::Protocols::InteractionModel::Status; + //------------------------------------------------------------------------------ // Forward Declarations @@ -56,8 +60,8 @@ bool emberAfIsDeviceIdentifying(EndpointId endpoint) { #ifdef ZCL_USING_IDENTIFY_CLUSTER_SERVER uint16_t identifyTime; - EmberAfStatus status = app::Clusters::Identify::Attributes::IdentifyTime::Get(endpoint, &identifyTime); - return (status == EMBER_ZCL_STATUS_SUCCESS && 0 < identifyTime); + Status status = app::Clusters::Identify::Attributes::IdentifyTime::Get(endpoint, &identifyTime); + return (status == Status::Success && 0 < identifyTime); #else return false; #endif @@ -104,7 +108,7 @@ EmberAfDifferenceType emberAfGetDifference(uint8_t * pData, EmberAfDifferenceTyp // **************************************** void emberAfInit() { - emberAfInitializeAttributes(EMBER_BROADCAST_ENDPOINT); + emberAfInitializeAttributes(kInvalidEndpointId); MATTER_PLUGINS_INIT @@ -229,8 +233,7 @@ void emberAfCopyLongString(uint8_t * dest, const uint8_t * src, size_t size) length = static_cast(size); } memmove(dest + 2, src + 2, length); - dest[0] = EMBER_LOW_BYTE(length); - dest[1] = EMBER_HIGH_BYTE(length); + Encoding::LittleEndian::Put16(dest, length); } } diff --git a/src/app/zap-templates/zcl/data-model/chip/content-app-observer-cluster.xml b/src/app/zap-templates/zcl/data-model/chip/content-app-observer-cluster.xml index c4fb56ecef7077..6e241c7b5c3cd0 100644 --- a/src/app/zap-templates/zcl/data-model/chip/content-app-observer-cluster.xml +++ b/src/app/zap-templates/zcl/data-model/chip/content-app-observer-cluster.xml @@ -16,7 +16,7 @@ limitations under the License. --> - + Media Content App Observer 0x0510 diff --git a/src/app/zap-templates/zcl/data-model/chip/content-control-cluster.xml b/src/app/zap-templates/zcl/data-model/chip/content-control-cluster.xml index 1c1ba4502eda7a..d8077e9e9276cc 100644 --- a/src/app/zap-templates/zcl/data-model/chip/content-control-cluster.xml +++ b/src/app/zap-templates/zcl/data-model/chip/content-control-cluster.xml @@ -16,7 +16,7 @@ limitations under the License. --> - + Media Content Control 0x050F diff --git a/src/app/zap-templates/zcl/data-model/chip/energy-preference-cluster.xml b/src/app/zap-templates/zcl/data-model/chip/energy-preference-cluster.xml index f7a45dfd016b05..ceff9846978e63 100644 --- a/src/app/zap-templates/zcl/data-model/chip/energy-preference-cluster.xml +++ b/src/app/zap-templates/zcl/data-model/chip/energy-preference-cluster.xml @@ -13,7 +13,7 @@ limitations under the License. --> - + Energy Preference Energy Management 0x009B diff --git a/src/app/zap-templates/zcl/data-model/chip/laundry-dryer-controls-cluster.xml b/src/app/zap-templates/zcl/data-model/chip/laundry-dryer-controls-cluster.xml index 9514659cda3cf5..be3443519e5a98 100644 --- a/src/app/zap-templates/zcl/data-model/chip/laundry-dryer-controls-cluster.xml +++ b/src/app/zap-templates/zcl/data-model/chip/laundry-dryer-controls-cluster.xml @@ -26,7 +26,7 @@ limitations under the License. - + Appliances Laundry Dryer Controls 0x004A @@ -41,4 +41,4 @@ limitations under the License. SupportedDrynessLevels SelectedDrynessLevel - + diff --git a/src/app/zap-templates/zcl/data-model/chip/matter-devices.xml b/src/app/zap-templates/zcl/data-model/chip/matter-devices.xml index 1b3a51f90afb44..259a59dae3ead5 100644 --- a/src/app/zap-templates/zcl/data-model/chip/matter-devices.xml +++ b/src/app/zap-templates/zcl/data-model/chip/matter-devices.xml @@ -2402,13 +2402,10 @@ limitations under the License. 0x0103 0x050C - - + - - diff --git a/src/app/zap-templates/zcl/data-model/chip/messages-cluster.xml b/src/app/zap-templates/zcl/data-model/chip/messages-cluster.xml index 28b3eb975594a0..2da346cd49a6f7 100644 --- a/src/app/zap-templates/zcl/data-model/chip/messages-cluster.xml +++ b/src/app/zap-templates/zcl/data-model/chip/messages-cluster.xml @@ -69,7 +69,7 @@ limitations under the License. - + Messages General This cluster provides an interface for passing messages to be presented by a device. diff --git a/src/app/zap-templates/zcl/data-model/chip/power-topology-cluster.xml b/src/app/zap-templates/zcl/data-model/chip/power-topology-cluster.xml index fb27062b26cfbe..9eef1e03c6c023 100644 --- a/src/app/zap-templates/zcl/data-model/chip/power-topology-cluster.xml +++ b/src/app/zap-templates/zcl/data-model/chip/power-topology-cluster.xml @@ -23,7 +23,7 @@ limitations under the License. - + Measurement & Sensing Power Topology 0x009C diff --git a/src/controller/CHIPCluster.h b/src/controller/CHIPCluster.h index f442190c0fc200..c425b344c68962 100644 --- a/src/controller/CHIPCluster.h +++ b/src/controller/CHIPCluster.h @@ -29,7 +29,6 @@ #include "app/ConcreteCommandPath.h" #include #include -#include #include #include #include diff --git a/src/controller/CHIPDeviceController.cpp b/src/controller/CHIPDeviceController.cpp index 99cd69a5284bc7..7cc2c86432f5f9 100644 --- a/src/controller/CHIPDeviceController.cpp +++ b/src/controller/CHIPDeviceController.cpp @@ -42,7 +42,6 @@ #include #include -#include #include #include #include diff --git a/src/controller/CHIPDeviceControllerFactory.cpp b/src/controller/CHIPDeviceControllerFactory.cpp index 8268b07b7f3dcc..ebc728ca206875 100644 --- a/src/controller/CHIPDeviceControllerFactory.cpp +++ b/src/controller/CHIPDeviceControllerFactory.cpp @@ -226,7 +226,7 @@ CHIP_ERROR DeviceControllerFactory::InitSystemState(FactoryInitParams params) ReturnErrorOnFailure(stateParams.exchangeMgr->Init(stateParams.sessionMgr)); ReturnErrorOnFailure(stateParams.messageCounterManager->Init(stateParams.exchangeMgr)); ReturnErrorOnFailure(stateParams.unsolicitedStatusHandler->Init(stateParams.exchangeMgr)); - ReturnErrorOnFailure(stateParams.bdxTransferServer->ListenForSendInit(stateParams.systemLayer, stateParams.exchangeMgr)); + ReturnErrorOnFailure(stateParams.bdxTransferServer->Init(stateParams.systemLayer, stateParams.exchangeMgr)); InitDataModelHandler(); diff --git a/src/controller/data_model/controller-clusters.matter b/src/controller/data_model/controller-clusters.matter index 5b5890b4ccbb78..b9ce299a283f57 100644 --- a/src/controller/data_model/controller-clusters.matter +++ b/src/controller/data_model/controller-clusters.matter @@ -2923,7 +2923,7 @@ provisional cluster OvenMode = 73 { /** This cluster supports remotely monitoring and controling the different typs of functionality available to a drying device, such as a laundry dryer. */ -cluster LaundryDryerControls = 74 { +provisional cluster LaundryDryerControls = 74 { revision 1; enum DrynessLevelEnum : enum8 { @@ -4496,7 +4496,7 @@ provisional cluster DemandResponseLoadControl = 150 { } /** This cluster provides an interface for passing messages to be presented by a device. */ -cluster Messages = 151 { +provisional cluster Messages = 151 { revision 3; enum FutureMessagePreferenceEnum : enum8 { @@ -4977,7 +4977,7 @@ provisional cluster EnergyEvse = 153 { } /** This cluster provides an interface to specify preferences for how devices should consume energy. */ -cluster EnergyPreference = 155 { +provisional cluster EnergyPreference = 155 { revision 1; // NOTE: Default/not specifically set enum EnergyPriorityEnum : enum8 { @@ -5011,7 +5011,7 @@ cluster EnergyPreference = 155 { } /** The Power Topology Cluster provides a mechanism for expressing how power is flowing between endpoints. */ -cluster PowerTopology = 156 { +provisional cluster PowerTopology = 156 { revision 1; bitmap Feature : bitmap32 { @@ -8571,7 +8571,7 @@ cluster AccountLogin = 1294 { } /** This cluster is used for managing the content control (including "parental control") settings on a media device such as a TV, or Set-top Box. */ -cluster ContentControl = 1295 { +provisional cluster ContentControl = 1295 { revision 1; // NOTE: Default/not specifically set bitmap Feature : bitmap32 { @@ -8654,7 +8654,7 @@ cluster ContentControl = 1295 { } /** This cluster provides an interface for sending targeted commands to an Observer of a Content App on a Video Player device such as a Streaming Media Player, Smart TV or Smart Screen. The cluster server for Content App Observer is implemented by an endpoint that communicates with a Content App, such as a Casting Video Client. The cluster client for Content App Observer is implemented by a Content App endpoint. A Content App is informed of the NodeId of an Observer when a binding is set on the Content App. The Content App can then send the ContentAppMessage to the Observer (server cluster), and the Observer responds with a ContentAppMessageResponse. */ -cluster ContentAppObserver = 1296 { +provisional cluster ContentAppObserver = 1296 { revision 1; // NOTE: Default/not specifically set enum StatusEnum : enum8 { diff --git a/src/controller/data_model/controller-clusters.zap b/src/controller/data_model/controller-clusters.zap index 36a8c98287db7f..42753ed88f84b4 100644 --- a/src/controller/data_model/controller-clusters.zap +++ b/src/controller/data_model/controller-clusters.zap @@ -5751,4 +5751,4 @@ "networkId": 0 } ] -} \ No newline at end of file +} diff --git a/src/controller/java/AndroidCallbacks.cpp b/src/controller/java/AndroidCallbacks.cpp index 88bbf9844c9407..9e3e3e966c20d3 100644 --- a/src/controller/java/AndroidCallbacks.cpp +++ b/src/controller/java/AndroidCallbacks.cpp @@ -55,22 +55,6 @@ CHIP_ERROR CreateChipAttributePath(JNIEnv * env, const app::ConcreteDataAttribut return CHIP_NO_ERROR; } -CHIP_ERROR ReportCallback::CreateChipEventPath(JNIEnv * env, const app::ConcreteEventPath & aPath, jobject & outObj) -{ - jclass eventPathCls = nullptr; - ReturnErrorOnFailure( - JniReferences::GetInstance().GetLocalClassRef(env, "chip/devicecontroller/model/ChipEventPath", eventPathCls)); - - jmethodID eventPathCtor = - env->GetStaticMethodID(eventPathCls, "newInstance", "(IJJ)Lchip/devicecontroller/model/ChipEventPath;"); - VerifyOrReturnError(eventPathCtor != nullptr, CHIP_JNI_ERROR_METHOD_NOT_FOUND); - - outObj = env->CallStaticObjectMethod(eventPathCls, eventPathCtor, static_cast(aPath.mEndpointId), - static_cast(aPath.mClusterId), static_cast(aPath.mEventId)); - VerifyOrReturnError(outObj != nullptr, CHIP_JNI_ERROR_NULL_OBJECT); - return CHIP_NO_ERROR; -} - GetConnectedDeviceCallback::GetConnectedDeviceCallback(jobject wrapperCallback, jobject javaCallback) : mOnSuccess(OnDeviceConnectedFn, this), mOnFailure(OnDeviceConnectionFailureFn, this) { @@ -270,6 +254,30 @@ CHIP_ERROR ConvertReportTlvToJson(const uint32_t id, TLV::TLVReader & data, std: return TlvToJson(readerForJson, json); } +static CHIP_ERROR CreateStatus(JNIEnv * env, const app::StatusIB & aStatus, jobject & outObj) +{ + jclass statusCls = nullptr; + ReturnErrorOnFailure(JniReferences::GetInstance().GetLocalClassRef(env, "chip/devicecontroller/model/Status", statusCls)); + jmethodID statusCtor = nullptr; + if (aStatus.mClusterStatus.HasValue()) + { + statusCtor = env->GetStaticMethodID(statusCls, "newInstance", "(II)Lchip/devicecontroller/model/Status;"); + VerifyOrReturnError(!env->ExceptionCheck(), CHIP_JNI_ERROR_EXCEPTION_THROWN); + VerifyOrReturnError(statusCtor != nullptr, CHIP_JNI_ERROR_METHOD_NOT_FOUND); + outObj = env->CallStaticObjectMethod(statusCls, statusCtor, static_cast(aStatus.mStatus), + static_cast(aStatus.mClusterStatus.Value())); + } + else + { + statusCtor = env->GetStaticMethodID(statusCls, "newInstance", "(I)Lchip/devicecontroller/model/Status;"); + VerifyOrReturnError(!env->ExceptionCheck(), CHIP_JNI_ERROR_EXCEPTION_THROWN); + VerifyOrReturnError(statusCtor != nullptr, CHIP_JNI_ERROR_METHOD_NOT_FOUND); + outObj = env->CallStaticObjectMethod(statusCls, statusCtor, static_cast(aStatus.mStatus)); + } + VerifyOrReturnError(outObj != nullptr, CHIP_JNI_ERROR_METHOD_NOT_FOUND); + return CHIP_NO_ERROR; +} + void ReportCallback::OnAttributeData(const app::ConcreteDataAttributePath & aPath, TLV::TLVReader * apData, const app::StatusIB & aStatus) { @@ -277,14 +285,28 @@ void ReportCallback::OnAttributeData(const app::ConcreteDataAttributePath & aPat JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); VerifyOrReturn(env != nullptr, ChipLogError(Controller, "Could not get JNIEnv for current thread")); JniLocalReferenceScope scope(env); - - jobject attributePathObj = nullptr; - err = CreateChipAttributePath(env, aPath, attributePathObj); - VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Controller, "Unable to create Java ChipAttributePath: %s", ErrorStr(err))); - VerifyOrReturn(!aPath.IsListItemOperation(), ChipLogError(Controller, "Expect non-list item operation"); aPath.LogPath()); - VerifyOrReturn(aStatus.IsSuccess(), ChipLogError(Controller, "Receive bad status %s", ErrorStr(aStatus.ToChipError())); - aPath.LogPath()); + + jobject nodeState = mNodeStateObj.ObjectRef(); + if (aStatus.IsFailure()) + { + ChipLogError(Controller, "Receive bad status %s", ErrorStr(aStatus.ToChipError())); + jobject statusObj = nullptr; + err = CreateStatus(env, aStatus, statusObj); + VerifyOrReturn(err == CHIP_NO_ERROR, + ChipLogError(Controller, "Fail to create status with error %" CHIP_ERROR_FORMAT, err.Format())); + // Add Attribute Status to NodeState + jmethodID addAttributeStatusMethod = nullptr; + err = JniReferences::GetInstance().FindMethod(env, nodeState, "addAttributeStatus", + "(IJJLchip/devicecontroller/model/Status;)V", &addAttributeStatusMethod); + VerifyOrReturn( + err == CHIP_NO_ERROR, + ChipLogError(Controller, "Could not find addAttributeStatus method with error %" CHIP_ERROR_FORMAT, err.Format())); + env->CallVoidMethod(nodeState, addAttributeStatusMethod, static_cast(aPath.mEndpointId), + static_cast(aPath.mClusterId), static_cast(aPath.mAttributeId), statusObj); + VerifyOrReturn(!env->ExceptionCheck(), env->ExceptionDescribe()); + return; + } VerifyOrReturn(apData != nullptr, ChipLogError(Controller, "Receive empty apData"); aPath.LogPath()); TLV::TLVReader readerForJavaTLV; @@ -345,7 +367,6 @@ void ReportCallback::OnAttributeData(const app::ConcreteDataAttributePath & aPat VerifyOrReturn(attributeStateObj != nullptr, ChipLogError(Controller, "Could not create AttributeState object"); aPath.LogPath()); - jobject nodeState = mNodeStateObj.ObjectRef(); // Add AttributeState to NodeState jmethodID addAttributeMethod; err = JniReferences::GetInstance().FindMethod(env, nodeState, "addAttribute", @@ -401,10 +422,28 @@ void ReportCallback::OnEventData(const app::EventHeader & aEventHeader, TLV::TLV CHIP_ERROR err = CHIP_NO_ERROR; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); VerifyOrReturn(env != nullptr, ChipLogError(Controller, "Could not get JNIEnv for current thread")); - jobject eventPathObj = nullptr; - err = CreateChipEventPath(env, aEventHeader.mPath, eventPathObj); - VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Controller, "Unable to create Java ChipEventPath: %s", ErrorStr(err))); + jobject nodeState = mNodeStateObj.ObjectRef(); + if (apStatus != nullptr && apStatus->IsFailure()) + { + ChipLogError(Controller, "Receive bad status %s", ErrorStr(apStatus->ToChipError())); + jobject statusObj = nullptr; + err = CreateStatus(env, *apStatus, statusObj); + VerifyOrReturn(err == CHIP_NO_ERROR, + ChipLogError(Controller, "Fail to create status with error %" CHIP_ERROR_FORMAT, err.Format())); + // Add Event Status to NodeState + jmethodID addEventStatusMethod; + err = JniReferences::GetInstance().FindMethod(env, nodeState, "addEventStatus", + "(IJJLchip/devicecontroller/model/Status;)V", &addEventStatusMethod); + VerifyOrReturn( + err == CHIP_NO_ERROR, + ChipLogError(Controller, "Could not find addEventStatus method with error %" CHIP_ERROR_FORMAT, err.Format())); + env->CallVoidMethod(nodeState, addEventStatusMethod, static_cast(aEventHeader.mPath.mEndpointId), + static_cast(aEventHeader.mPath.mClusterId), static_cast(aEventHeader.mPath.mEventId), + statusObj); + VerifyOrReturn(!env->ExceptionCheck(), env->ExceptionDescribe()); + return; + } VerifyOrReturn(apData != nullptr, ChipLogError(Controller, "Receive empty apData"); aEventHeader.LogPath()); TLV::TLVReader readerForJavaTLV; @@ -484,7 +523,7 @@ void ReportCallback::OnEventData(const app::EventHeader & aEventHeader, TLV::TLV // Add EventState to NodeState jmethodID addEventMethod; - jobject nodeState = mNodeStateObj.ObjectRef(); + err = JniReferences::GetInstance().FindMethod(env, nodeState, "addEvent", "(IJJLchip/devicecontroller/model/EventState;)V", &addEventMethod); VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Controller, "Could not find addEvent method with error %s", ErrorStr(err)); diff --git a/src/controller/java/BUILD.gn b/src/controller/java/BUILD.gn index 0f68fcebb6ed6e..0e5beda7115ae6 100644 --- a/src/controller/java/BUILD.gn +++ b/src/controller/java/BUILD.gn @@ -482,6 +482,7 @@ android_library("java") { "src/chip/devicecontroller/model/EventState.java", "src/chip/devicecontroller/model/InvokeElement.java", "src/chip/devicecontroller/model/NodeState.java", + "src/chip/devicecontroller/model/Status.java", ] if (matter_enable_tlv_decoder_api) { diff --git a/src/controller/java/CHIPDeviceController-JNI.cpp b/src/controller/java/CHIPDeviceController-JNI.cpp index 26870b5752caab..85c37b87ae6691 100644 --- a/src/controller/java/CHIPDeviceController-JNI.cpp +++ b/src/controller/java/CHIPDeviceController-JNI.cpp @@ -34,7 +34,6 @@ #include #include #include -#include #include #include #include diff --git a/src/controller/java/src/chip/devicecontroller/model/ClusterState.java b/src/controller/java/src/chip/devicecontroller/model/ClusterState.java index 4c575f1a41df66..6ebe40e99fe0a2 100644 --- a/src/controller/java/src/chip/devicecontroller/model/ClusterState.java +++ b/src/controller/java/src/chip/devicecontroller/model/ClusterState.java @@ -32,12 +32,19 @@ public final class ClusterState { private static final String TAG = "ClusterState"; private Map attributes; private Map> events; + private Map attributeStatuses; + private Map> eventStatuses; private Optional dataVersion; - public ClusterState( - Map attributes, Map> events) { + protected ClusterState( + Map attributes, + Map> events, + Map attributeStatuses, + Map> eventStatuses) { this.attributes = attributes; this.events = events; + this.attributeStatuses = attributeStatuses; + this.eventStatuses = eventStatuses; this.dataVersion = Optional.empty(); } @@ -45,10 +52,18 @@ public Map getAttributeStates() { return attributes; } + public Map getAttributeStatuses() { + return attributeStatuses; + } + public Map> getEventStates() { return events; } + public Map> getEventStatuses() { + return eventStatuses; + } + public void setDataVersion(long version) { dataVersion = Optional.of(version); } @@ -130,6 +145,25 @@ public String toString() { builder.append("\n"); }); }); + attributeStatuses.forEach( + (attributeId, status) -> { + builder.append("Attribute Status "); + builder.append(attributeId); + builder.append(": "); + builder.append(status.toString()); + builder.append("\n"); + }); + eventStatuses.forEach( + (eventId, status) -> { + status.forEach( + (eventState) -> { + builder.append("Event Status"); + builder.append(eventId); + builder.append(": "); + builder.append(status.toString()); + builder.append("\n"); + }); + }); return builder.toString(); } } diff --git a/src/controller/java/src/chip/devicecontroller/model/NodeState.java b/src/controller/java/src/chip/devicecontroller/model/NodeState.java index decd9782f5369a..f77097b5452f62 100644 --- a/src/controller/java/src/chip/devicecontroller/model/NodeState.java +++ b/src/controller/java/src/chip/devicecontroller/model/NodeState.java @@ -55,10 +55,15 @@ private void addAttribute( ClusterState clusterState = endpointState.getClusterState(clusterId); if (clusterState == null) { - clusterState = new ClusterState(new HashMap<>(), new HashMap<>()); + clusterState = + new ClusterState(new HashMap<>(), new HashMap<>(), new HashMap<>(), new HashMap<>()); endpointState.getClusterStates().put(clusterId, clusterState); } + if (clusterState.getAttributeStatuses().containsKey(attributeId)) { + clusterState.getAttributeStatuses().remove(attributeId); + } + // This will overwrite previous attributes. clusterState.getAttributeStates().put(attributeId, attributeStateToAdd); } @@ -72,16 +77,70 @@ private void addEvent(int endpointId, long clusterId, long eventId, EventState e ClusterState clusterState = endpointState.getClusterState(clusterId); if (clusterState == null) { - clusterState = new ClusterState(new HashMap<>(), new HashMap<>()); + clusterState = + new ClusterState(new HashMap<>(), new HashMap<>(), new HashMap<>(), new HashMap<>()); endpointState.getClusterStates().put(clusterId, clusterState); } if (!clusterState.getEventStates().containsKey(eventId)) { clusterState.getEventStates().put(eventId, new ArrayList()); } + + if (clusterState.getEventStatuses().containsKey(eventId)) { + clusterState.getEventStatuses().remove(eventId); + } + clusterState.getEventStates().get(eventId).add(eventStateToAdd); } + // Called from native code only, which ignores access modifiers. + private void addAttributeStatus( + int endpointId, long clusterId, long attributeId, Status statusToAdd) { + EndpointState endpointState = getEndpointState(endpointId); + if (endpointState == null) { + endpointState = new EndpointState(new HashMap<>()); + getEndpointStates().put(endpointId, endpointState); + } + + ClusterState clusterState = endpointState.getClusterState(clusterId); + if (clusterState == null) { + clusterState = + new ClusterState(new HashMap<>(), new HashMap<>(), new HashMap<>(), new HashMap<>()); + endpointState.getClusterStates().put(clusterId, clusterState); + } + + if (clusterState.getAttributeStates().containsKey(attributeId)) { + clusterState.getAttributeStates().remove(attributeId); + } + + clusterState.getAttributeStatuses().put(attributeId, statusToAdd); + } + + private void addEventStatus(int endpointId, long clusterId, long eventId, Status statusToAdd) { + EndpointState endpointState = getEndpointState(endpointId); + if (endpointState == null) { + endpointState = new EndpointState(new HashMap<>()); + getEndpointStates().put(endpointId, endpointState); + } + + ClusterState clusterState = endpointState.getClusterState(clusterId); + if (clusterState == null) { + clusterState = + new ClusterState(new HashMap<>(), new HashMap<>(), new HashMap<>(), new HashMap<>()); + endpointState.getClusterStates().put(clusterId, clusterState); + } + + if (!clusterState.getEventStatuses().containsKey(eventId)) { + clusterState.getEventStatuses().put(eventId, new ArrayList()); + } + + if (clusterState.getEventStates().containsKey(eventId)) { + clusterState.getEventStates().remove(eventId); + } + + clusterState.getEventStatuses().get(eventId).add(statusToAdd); + } + @Override public String toString() { StringBuilder builder = new StringBuilder(); diff --git a/src/controller/java/src/chip/devicecontroller/model/Status.java b/src/controller/java/src/chip/devicecontroller/model/Status.java new file mode 100644 index 00000000000000..7391f9a312f3f7 --- /dev/null +++ b/src/controller/java/src/chip/devicecontroller/model/Status.java @@ -0,0 +1,57 @@ +/* + * 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. + * + */ + +package chip.devicecontroller.model; + +import java.util.Locale; +import java.util.Optional; + +public final class Status { + private Integer status; + private Optional clusterStatus; + + private Status(int status, Optional clusterStatus) { + this.status = status; + this.clusterStatus = clusterStatus; + } + + // Getters + public Integer getStatus() { + return status; + } + + public Optional getClusterStatus() { + return clusterStatus; + } + + public String toString() { + return String.format( + Locale.ENGLISH, + "status %s, clusterStatus %s", + String.valueOf(status), + clusterStatus.isPresent() ? String.valueOf(clusterStatus.get()) : "None"); + } + + public static Status newInstance(int status, int clusterStatus) { + return new Status(status, Optional.of(clusterStatus)); + } + + public static Status newInstance(int status) { + return new Status(status, Optional.empty()); + } +} diff --git a/src/controller/python/chip/logging/__init__.py b/src/controller/python/chip/logging/__init__.py index 980c33ac92482d..6916c8b272f769 100644 --- a/src/controller/python/chip/logging/__init__.py +++ b/src/controller/python/chip/logging/__init__.py @@ -32,7 +32,7 @@ def _RedirectToPythonLogging(category, module, message): module = module.decode('utf-8') message = message.decode('utf-8') - logger = logging.getLogger('chip.%s' % module) + logger = logging.getLogger('chip.native.%s' % module) if category == ERROR_CATEGORY_ERROR: logger.error("%s", message) diff --git a/src/controller/python/chip/logging/library_handle.py b/src/controller/python/chip/logging/library_handle.py index ae34f502fd1093..f74a810b4641da 100644 --- a/src/controller/python/chip/logging/library_handle.py +++ b/src/controller/python/chip/logging/library_handle.py @@ -27,7 +27,9 @@ def _GetLoggingLibraryHandle() -> ctypes.CDLL: native methods. """ - handle = chip.native.GetLibraryHandle() + # Getting a handle without requiring init, as logging methods + # do not require chip stack startup + handle = chip.native.GetLibraryHandle(chip.native.HandleFlags(0)) # Uses one of the type decorators as an indicator for everything being # initialized. diff --git a/src/credentials/FabricTable.h b/src/credentials/FabricTable.h index 688a6d6a612bc7..c61b6176fecb1e 100644 --- a/src/credentials/FabricTable.h +++ b/src/credentials/FabricTable.h @@ -116,15 +116,15 @@ class DLL_EXPORT FabricInfo private: struct InitParams { - NodeId nodeId = kUndefinedNodeId; - FabricId fabricId = kUndefinedFabricId; - FabricIndex fabricIndex = kUndefinedFabricIndex; - CompressedFabricId compressedFabricId = kUndefinedCompressedFabricId; - Crypto::P256PublicKey rootPublicKey; - VendorId vendorId = VendorId::NotSpecified; /**< Vendor ID for commissioner of fabric */ + CompressedFabricId compressedFabricId = kUndefinedCompressedFabricId; + NodeId nodeId = kUndefinedNodeId; + FabricIndex fabricIndex = kUndefinedFabricIndex; Crypto::P256Keypair * operationalKeypair = nullptr; - bool hasExternallyOwnedKeypair = false; - bool advertiseIdentity = false; + FabricId fabricId = kUndefinedFabricId; + Crypto::P256PublicKey rootPublicKey; + VendorId vendorId = VendorId::NotSpecified; /**< Vendor ID for commissioner of fabric */ + bool hasExternallyOwnedKeypair = false; + bool advertiseIdentity = false; CHIP_ERROR AreValid() const { diff --git a/src/darwin/Framework/CHIP/MTRBaseDevice.mm b/src/darwin/Framework/CHIP/MTRBaseDevice.mm index 41de3b4646f870..0d41d925d49507 100644 --- a/src/darwin/Framework/CHIP/MTRBaseDevice.mm +++ b/src/darwin/Framework/CHIP/MTRBaseDevice.mm @@ -46,7 +46,6 @@ #include #include #include -#include #include #include #include diff --git a/src/darwin/Framework/CHIP/MTRDevice.h b/src/darwin/Framework/CHIP/MTRDevice.h index 9d3b0768ff4061..96526a2ecacf67 100644 --- a/src/darwin/Framework/CHIP/MTRDevice.h +++ b/src/darwin/Framework/CHIP/MTRDevice.h @@ -338,8 +338,9 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) * If the timeout is set to 0, the request will not expire and completion will not be called until * the log is fully retrieved or an error occurs. * @param queue The queue on which completion will be called. - * @param completion The completion that will be called to return the URL of the requested log if successful. Otherwise - * returns an error. + * @param completion The completion handler that is called after attempting to retrieve the requested log. + * - In case of success, the completion handler is called with a non-nil URL and a nil error. + * - If there is an error, a non-nil error is used and the url can be non-nil too if some logs have already been downloaded. */ - (void)downloadLogOfType:(MTRDiagnosticLogType)type timeout:(NSTimeInterval)timeout diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.mm b/src/darwin/Framework/CHIP/MTRDeviceController.mm index f0c6e89a3af30c..64d70ce647cdb7 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController.mm @@ -1313,12 +1313,17 @@ - (void)downloadLogFromNodeWithID:(NSNumber *)nodeID queue:(dispatch_queue_t)queue completion:(void (^)(NSURL * _Nullable url, NSError * _Nullable error))completion { - [_factory downloadLogFromNodeWithID:nodeID - controller:self - type:type - timeout:timeout - queue:queue - completion:completion]; + [self asyncDispatchToMatterQueue:^() { + [self->_factory downloadLogFromNodeWithID:nodeID + controller:self + type:type + timeout:timeout + queue:queue + completion:completion]; + } + errorHandler:^(NSError * error) { + completion(nil, error); + }]; } - (NSArray *)accessGrantsForClusterPath:(MTRClusterPath *)clusterPath diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerFactory.mm b/src/darwin/Framework/CHIP/MTRDeviceControllerFactory.mm index 457abeaed55a5f..0430558e8a4b32 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerFactory.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerFactory.mm @@ -1220,24 +1220,20 @@ - (void)downloadLogFromNodeWithID:(NSNumber *)nodeID queue:(dispatch_queue_t)queue completion:(void (^)(NSURL * _Nullable url, NSError * _Nullable error))completion { - dispatch_sync(_chipWorkQueue, ^{ - if (![self isRunning]) { - return; - } + assertChipStackLockedByCurrentThread(); - if (_diagnosticLogsDownloader == nil) { - _diagnosticLogsDownloader = [[MTRDiagnosticLogsDownloader alloc] init]; - auto systemState = _controllerFactory->GetSystemState(); - systemState->BDXTransferServer()->SetDelegate([_diagnosticLogsDownloader getBridge]); - } + if (_diagnosticLogsDownloader == nil) { + _diagnosticLogsDownloader = [[MTRDiagnosticLogsDownloader alloc] init]; + auto systemState = _controllerFactory->GetSystemState(); + systemState->BDXTransferServer()->SetDelegate([_diagnosticLogsDownloader getBridge]); + } - [_diagnosticLogsDownloader downloadLogFromNodeWithID:nodeID - controller:controller - type:type - timeout:timeout - queue:queue - completion:completion]; - }); + [_diagnosticLogsDownloader downloadLogFromNodeWithID:nodeID + controller:controller + type:type + timeout:timeout + queue:queue + completion:completion]; } - (void)operationalInstanceAdded:(chip::PeerId &)operationalID diff --git a/src/darwin/Framework/CHIP/MTRDiagnosticLogsDownloader.mm b/src/darwin/Framework/CHIP/MTRDiagnosticLogsDownloader.mm index 4814b37d7a82f4..46226d69357058 100644 --- a/src/darwin/Framework/CHIP/MTRDiagnosticLogsDownloader.mm +++ b/src/darwin/Framework/CHIP/MTRDiagnosticLogsDownloader.mm @@ -59,7 +59,7 @@ - (instancetype)initWithType:(MTRDiagnosticLogType)type - (void)writeToFile:(NSData *)data error:(out NSError **)error; -- (BOOL)compare:(NSString *)fileDesignator +- (BOOL)matches:(NSString *)fileDesignator fabricIndex:(NSNumber *)fabricIndex nodeID:(NSNumber *)nodeID; @@ -139,8 +139,7 @@ - (void)handleBDXTransferSessionEndForFileDesignator:(NSString *)fileDesignator private: static void OnTransferTimeout(chip::System::Layer * layer, void * context); - MTRDiagnosticLogsDownloader * mDelegate; - AbortHandler mAbortHandler; + MTRDiagnosticLogsDownloader * __weak mDelegate; }; @implementation Download @@ -162,7 +161,7 @@ - (instancetype)initWithType:(MTRDiagnosticLogType)type Download * strongSelf = weakSelf; if (strongSelf) { // If a fileHandle exists, it means that the BDX session has been initiated and a file has - // been created to host the data of the session. So even if there is an error it may be some + // been created to host the data of the session. So even if there is an error there may be some // data in the logs that the caller may find useful. For this reason, fileURL is passed in even // when there is an error but fileHandle is not nil. completion(strongSelf->_fileHandle ? fileURL : nil, bdxError); @@ -192,15 +191,12 @@ - (void)checkInteractionModelResponse:(MTRDiagnosticLogsClusterRetrieveLogsRespo VerifyOrReturn(![status isEqual:@(MTRDiagnosticLogsStatusBusy)], [self failure:[MTRError errorForCHIPErrorCode:CHIP_ERROR_BUSY]]); VerifyOrReturn(![status isEqual:@(MTRDiagnosticLogsStatusDenied)], [self failure:[MTRError errorForCHIPErrorCode:CHIP_ERROR_ACCESS_DENIED]]); - // If there is not logs for the given type, forward it to the caller with a nil url and stop here. - VerifyOrReturn(![status isEqual:@(MTRDiagnosticLogsStatusNoLogs)], [self success]); - - // If the whole log content fits into the response LogContent field, forward it to the caller + // If the whole log content fits into the response LogContent field or if there is no log, forward it to the caller // and stop here. - if ([status isEqual:@(MTRDiagnosticLogsStatusExhausted)]) { + if ([status isEqual:@(MTRDiagnosticLogsStatusExhausted)] || [status isEqual:@(MTRDiagnosticLogsStatusNoLogs)]) { NSError * writeError = nil; [self writeToFile:response.logContent error:&writeError]; - VerifyOrReturn(nil == writeError, [self failure:[MTRError errorForCHIPErrorCode:CHIP_ERROR_INTERNAL]]); + VerifyOrReturn(nil == writeError, [self failure:writeError]); [self success]; return; @@ -238,7 +234,7 @@ - (void)deleteFile [[NSFileManager defaultManager] removeItemAtPath:[_fileURL path] error:&error]; if (nil != error) { // There is an error but there is really not much we can do at that point besides logging it. - MTR_LOG_ERROR("Error: %@", error); + MTR_LOG_ERROR("Error trying to delete the log file: %@. Error: %@", _fileURL, error); } } @@ -249,11 +245,11 @@ - (void)writeToFile:(NSData *)data error:(out NSError **)error [_fileHandle writeData:data error:error]; } -- (BOOL)compare:(NSString *)fileDesignator +- (BOOL)matches:(NSString *)fileDesignator fabricIndex:(NSNumber *)fabricIndex nodeID:(NSNumber *)nodeID { - return [_fileDesignator isEqualToString:fileDesignator] && _fabricIndex == fabricIndex && _nodeID == nodeID; + return [_fileDesignator isEqualToString:fileDesignator] && [_fabricIndex isEqualToNumber:fabricIndex] && [_nodeID isEqualToNumber:nodeID]; } - (void)failure:(NSError * _Nullable)error @@ -329,7 +325,7 @@ - (void)dealloc - (Download * _Nullable)get:(NSString *)fileDesignator fabricIndex:(NSNumber *)fabricIndex nodeID:(NSNumber *)nodeID { for (Download * download in _downloads) { - if ([download compare:fileDesignator fabricIndex:fabricIndex nodeID:nodeID]) { + if ([download matches:fileDesignator fabricIndex:fabricIndex nodeID:nodeID]) { return download; } } @@ -344,6 +340,8 @@ - (Download * _Nullable)add:(MTRDiagnosticLogType)type completion:(void (^)(NSURL * _Nullable url, NSError * _Nullable error))completion done:(void (^)(Download * finishedDownload))done { + assertChipStackLockedByCurrentThread(); + auto download = [[Download alloc] initWithType:type fabricIndex:fabricIndex nodeID:nodeID queue:queue completion:completion done:done]; VerifyOrReturnValue(nil != download, nil); @@ -353,6 +351,8 @@ - (Download * _Nullable)add:(MTRDiagnosticLogType)type - (void)remove:(Download *)download { + assertChipStackLockedByCurrentThread(); + [_downloads removeObject:download]; } @end @@ -525,9 +525,7 @@ - (void)handleBDXTransferSessionEndForFileDesignator:(NSString *)fileDesignator } }; - // Ideally we would like to handle aborts a bit differently since this only works - // because our BDX stack supports one transfer at a time. - mAbortHandler = ^(NSError * error) { + auto abortHandler = ^(NSError * error) { assertChipStackLockedByCurrentThread(); auto err = [MTRError errorToCHIPErrorCode:error]; transfer->Reject(err); @@ -537,7 +535,7 @@ - (void)handleBDXTransferSessionEndForFileDesignator:(NSString *)fileDesignator fabricIndex:fabricIndex nodeID:nodeId completion:completionHandler - abortHandler:mAbortHandler]; + abortHandler:abortHandler]; return CHIP_NO_ERROR; } @@ -588,8 +586,6 @@ - (void)handleBDXTransferSessionEndForFileDesignator:(NSString *)fileDesignator } }; - mAbortHandler = nil; - [mDelegate handleBDXTransferSessionDataForFileDesignator:fileDesignator fabricIndex:fabricIndex nodeID:nodeId diff --git a/src/darwin/Framework/CHIP/MTRError.mm b/src/darwin/Framework/CHIP/MTRError.mm index 9f7c0938b41c61..c2c02f6a74b207 100644 --- a/src/darwin/Framework/CHIP/MTRError.mm +++ b/src/darwin/Framework/CHIP/MTRError.mm @@ -21,8 +21,6 @@ #import "MTRError_Internal.h" #import -#import -#import #import #import diff --git a/src/darwin/Framework/CHIP/ServerEndpoint/MTRIMDispatch.mm b/src/darwin/Framework/CHIP/ServerEndpoint/MTRIMDispatch.mm index a1f1f47a7dc26e..ce847748cdfdc7 100644 --- a/src/darwin/Framework/CHIP/ServerEndpoint/MTRIMDispatch.mm +++ b/src/darwin/Framework/CHIP/ServerEndpoint/MTRIMDispatch.mm @@ -19,7 +19,7 @@ #include #include #include -#include + #include #include #include @@ -39,14 +39,14 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId) // clusters dont use it. } -EmberAfStatus emAfWriteAttributeExternal(EndpointId endpoint, ClusterId cluster, AttributeId attributeID, uint8_t * dataPtr, +Protocols::InteractionModel::Status emAfWriteAttributeExternal(EndpointId endpoint, ClusterId cluster, AttributeId attributeID, uint8_t * dataPtr, EmberAfAttributeType dataType) { assertChipStackLockedByCurrentThread(); // All of our attributes are handled via AttributeAccessInterface, so this // should be unreached. - return EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE; + return Protocols::InteractionModel::Status::UnsupportedAttribute; } namespace chip { diff --git a/src/darwin/Framework/CHIP/ServerEndpoint/MTRServerAttribute.mm b/src/darwin/Framework/CHIP/ServerEndpoint/MTRServerAttribute.mm index b2f840839f7c46..638b6f5ea48e28 100644 --- a/src/darwin/Framework/CHIP/ServerEndpoint/MTRServerAttribute.mm +++ b/src/darwin/Framework/CHIP/ServerEndpoint/MTRServerAttribute.mm @@ -34,10 +34,8 @@ MTR_DIRECT_MEMBERS @implementation MTRServerAttribute { - // _lock always protects access to _deviceController, _value, and - // _parentCluster. _serializedValue is protected when we are modifying it - // directly while we have no _deviceController. Once we have one, - // _serializedValue is only modified on the Matter thread. + // _lock always protects access to _deviceController, _value, + // _serializedValue, and _parentCluster. os_unfair_lock _lock; MTRDeviceController * __weak _deviceController; NSDictionary * _value; @@ -137,7 +135,7 @@ - (BOOL)setValueInternal:(NSDictionary *)value logIfNotAssociate _value = [value copy]; - MTR_LOG_DEFAULT("Attribute value updated: %@", self); // Logs new as part of our description. + MTR_LOG_DEFAULT("Attribute value updated: %@", [self _descriptionWhileLocked]); // Logs new value as part of our description. MTRDeviceController * deviceController = _deviceController; if (deviceController == nil) { @@ -150,6 +148,7 @@ - (BOOL)setValueInternal:(NSDictionary *)value logIfNotAssociate _serializedValue = serializedValue; } else { [deviceController asyncDispatchToMatterQueue:^{ + std::lock_guard lock(self->_lock); auto changed = ![self->_serializedValue isEqual:serializedValue]; self->_serializedValue = serializedValue; if (changed) { @@ -185,7 +184,7 @@ - (BOOL)associateWithController:(nullable MTRDeviceController *)controller _deviceController = controller; - MTR_LOG_DEFAULT("Associated %@ with controller", self); + MTR_LOG_DEFAULT("Associated %@ with controller", [self _descriptionWhileLocked]); return YES; } @@ -216,7 +215,7 @@ - (void)updateParentCluster:(const app::ConcreteClusterPath &)cluster _parentCluster = cluster; } -- (const chip::app::ConcreteClusterPath &)parentCluster +- (const app::ConcreteClusterPath &)parentCluster { std::lock_guard lock(_lock); return _parentCluster; @@ -224,6 +223,13 @@ - (void)updateParentCluster:(const app::ConcreteClusterPath &)cluster - (NSString *)description { + std::lock_guard lock(_lock); + return [self _descriptionWhileLocked]; +} + +- (NSString *)_descriptionWhileLocked +{ + os_unfair_lock_assert_owner(&_lock); return [NSString stringWithFormat:@"", static_cast(_parentCluster.mEndpointId), ChipLogValueMEI(_parentCluster.mClusterId), ChipLogValueMEI(_attributeID.unsignedLongLongValue), _value]; } diff --git a/src/darwin/Framework/CHIP/templates/availability.yaml b/src/darwin/Framework/CHIP/templates/availability.yaml index 24b9efcec73ff2..91191285701e33 100644 --- a/src/darwin/Framework/CHIP/templates/availability.yaml +++ b/src/darwin/Framework/CHIP/templates/availability.yaml @@ -8608,6 +8608,10 @@ # for now just start doing that for new additions to it. - TestDifferentVendorMeiRequest - TestDifferentVendorMeiResponse + GeneralDiagnostics: + # Targeting Spring 2024 Matter release + - PayloadTestRequest + - PayloadTestResponse structs: Thermostat: # Targeting Spring 2024 Matter release @@ -8651,6 +8655,9 @@ - PresetTypeFeaturesBitmap - ScheduleTypeFeaturesBitmap - TemperatureSetpointHoldPolicyBitmap + GeneralDiagnostics: + # Targeting Spring 2024 Matter release + - Feature bitmap values: DoorLock: Feature: diff --git a/src/darwin/Framework/CHIPTests/MTRBackwardsCompatTests.m b/src/darwin/Framework/CHIPTests/MTRBackwardsCompatTests.m index aada405c97a424..840c29f0c2a805 100644 --- a/src/darwin/Framework/CHIPTests/MTRBackwardsCompatTests.m +++ b/src/darwin/Framework/CHIPTests/MTRBackwardsCompatTests.m @@ -28,6 +28,8 @@ // system dependencies #import +// Fixture: chip-all-clusters-app --KVS "$(mktemp -t chip-test-kvs)" --interface-id -1 + static const uint16_t kPairingTimeoutInSeconds = 10; static const uint16_t kCASESetupTimeoutInSeconds = 30; static const uint16_t kTimeoutInSeconds = 3; @@ -71,7 +73,7 @@ - (void)onPairingComplete:(NSError *)error XCTAssertEqual(error.code, 0); NSError * commissionError = nil; - [sController commissionDevice:kDeviceId commissioningParams:[[MTRCommissioningParameters alloc] init] error:&commissionError]; + XCTAssertTrue([sController commissionDevice:kDeviceId commissioningParams:[[MTRCommissioningParameters alloc] init] error:&commissionError]); XCTAssertNil(commissionError); // Keep waiting for onCommissioningComplete @@ -89,45 +91,13 @@ - (void)onCommissioningComplete:(NSError *)error @interface MTRBackwardsCompatTests : XCTestCase @end -static BOOL sStackInitRan = NO; -static BOOL sNeedsStackShutdown = YES; - @implementation MTRBackwardsCompatTests -+ (void)tearDown ++ (void)setUp { - // Global teardown, runs once - if (sNeedsStackShutdown) { - // We don't need to worry about ResetCommissionee. If we get here, - // we're running only one of our test methods (using - // -only-testing:MatterTests/MTROTAProviderTests/testMethodName), since - // we did not run test999_TearDown. - [self shutdownStack]; - } -} - -- (void)setUp -{ - // Per-test setup, runs before each test. [super setUp]; - [self setContinueAfterFailure:NO]; - if (sStackInitRan == NO) { - [self initStack]; - } -} - -- (void)tearDown -{ - // Per-test teardown, runs after each test. - [super tearDown]; -} - -- (void)initStack -{ - sStackInitRan = YES; - - XCTestExpectation * expectation = [self expectationWithDescription:@"Pairing Complete"]; + XCTestExpectation * expectation = [[XCTestExpectation alloc] initWithDescription:@"Pairing Complete"]; __auto_type * factory = [MTRControllerFactory sharedInstance]; XCTAssertNotNil(factory); @@ -135,18 +105,13 @@ - (void)initStack __auto_type * storage = [[MTRTestStorage alloc] init]; __auto_type * factoryParams = [[MTRControllerFactoryParams alloc] initWithStorage:storage]; factoryParams.port = @(kLocalPort); + XCTAssertTrue([factory startup:factoryParams]); - BOOL ok = [factory startup:factoryParams]; - XCTAssertTrue(ok); - - __auto_type * testKeys = [[MTRTestKeys alloc] init]; - XCTAssertNotNil(testKeys); - - sTestKeys = testKeys; + XCTAssertNotNil(sTestKeys = [[MTRTestKeys alloc] init]); // Needs to match what startControllerOnExistingFabric calls elsewhere in // this file do. - __auto_type * params = [[MTRDeviceControllerStartupParams alloc] initWithSigningKeypair:testKeys fabricId:1 ipk:testKeys.ipk]; + __auto_type * params = [[MTRDeviceControllerStartupParams alloc] initWithSigningKeypair:sTestKeys fabricId:1 ipk:sTestKeys.ipk]; params.vendorId = @(kTestVendorId); MTRDeviceController * controller = [factory startControllerOnNewFabric:params]; @@ -164,12 +129,12 @@ - (void)initStack XCTAssertNotNil(payload); XCTAssertNil(error); - [controller setupCommissioningSessionWithPayload:payload newNodeID:@(kDeviceId) error:&error]; + XCTAssertTrue([controller setupCommissioningSessionWithPayload:payload newNodeID:@(kDeviceId) error:&error]); XCTAssertNil(error); - [self waitForExpectationsWithTimeout:kPairingTimeoutInSeconds handler:nil]; + XCTAssertEqual([XCTWaiter waitForExpectations:@[ expectation ] timeout:kPairingTimeoutInSeconds], XCTWaiterResultCompleted); - __block XCTestExpectation * connectionExpectation = [self expectationWithDescription:@"CASE established"]; + __block XCTestExpectation * connectionExpectation = [[XCTestExpectation alloc] initWithDescription:@"CASE established"]; [controller getBaseDevice:kDeviceId queue:dispatch_get_main_queue() completionHandler:^(MTRBaseDevice * _Nullable device, NSError * _Nullable error) { @@ -178,27 +143,24 @@ - (void)initStack sConnectedDevice = device; connectionExpectation = nil; }]; - [self waitForExpectationsWithTimeout:kCASESetupTimeoutInSeconds handler:nil]; + XCTAssertEqual([XCTWaiter waitForExpectations:@[ connectionExpectation ] timeout:kCASESetupTimeoutInSeconds], XCTWaiterResultCompleted); } -+ (void)shutdownStack ++ (void)tearDown { - sNeedsStackShutdown = NO; - - MTRDeviceController * controller = sController; - XCTAssertNotNil(controller); - - [controller shutdown]; - XCTAssertFalse([controller isRunning]); + ResetCommissionee(GetConnectedDevice(), dispatch_get_main_queue(), nil, kTimeoutInSeconds); + [sController shutdown]; + XCTAssertFalse([sController isRunning]); [[MTRControllerFactory sharedInstance] shutdown]; + + [super tearDown]; } -- (void)test000_SetUp +- (void)setUp { - // Nothing to do here; our setUp method handled this already. This test - // just exists to make the setup not look like it's happening inside other - // tests. + [super setUp]; + [self setContinueAfterFailure:NO]; } #define CHECK_RETURN_TYPE(sig, type) \ @@ -1210,10 +1172,4 @@ - (void)test048_MTRModeSelectClusterSemanticTagStruct CHECK_PROPERTY(obj, value, setValue, NSNumber *); } -- (void)test999_TearDown -{ - ResetCommissionee(GetConnectedDevice(), dispatch_get_main_queue(), self, kTimeoutInSeconds); - [[self class] shutdownStack]; -} - @end diff --git a/src/darwin/Framework/CHIPTests/MTRCommissionableBrowserTests.m b/src/darwin/Framework/CHIPTests/MTRCommissionableBrowserTests.m index 2acd1c2d379d83..047ce4f8588816 100644 --- a/src/darwin/Framework/CHIPTests/MTRCommissionableBrowserTests.m +++ b/src/darwin/Framework/CHIPTests/MTRCommissionableBrowserTests.m @@ -23,6 +23,11 @@ #import "MTRTestKeys.h" #import "MTRTestStorage.h" +// Fixture 1: chip-all-clusters-app --KVS "$(mktemp -t chip-test-kvs)" --interface-id -1 +// Fixture 2: chip-all-clusters-app --KVS "$(mktemp -t chip-test-kvs)" --interface-id -1 \ + --dac_provider credentials/development/commissioner_dut/struct_cd_origin_pid_vid_correct/test_case_vector.json \ + --product-id 32768 --discriminator 3839 + static const uint16_t kLocalPort = 5541; static const uint16_t kTestVendorId = 0xFFF1u; static const uint16_t kTestProductId1 = 0x8000u; @@ -113,39 +118,11 @@ - (void)controller:(MTRDeviceController *)controller didRemoveCommissionableDevi @interface MTRCommissionableBrowserTests : XCTestCase @end -static BOOL sStackInitRan = NO; -static BOOL sNeedsStackShutdown = YES; - @implementation MTRCommissionableBrowserTests -+ (void)tearDown -{ - // Global teardown, runs once - if (sNeedsStackShutdown) { - [self shutdownStack]; - } -} - -- (void)setUp ++ (void)setUp { - // Per-test setup, runs before each test. [super setUp]; - [self setContinueAfterFailure:NO]; - - if (sStackInitRan == NO) { - [self initStack]; - } -} - -- (void)tearDown -{ - // Per-test teardown, runs after each test. - [super tearDown]; -} - -- (void)initStack -{ - sStackInitRan = YES; __auto_type * factory = [MTRDeviceControllerFactory sharedInstance]; XCTAssertNotNil(factory); @@ -169,17 +146,22 @@ - (void)initStack sController = controller; } -+ (void)shutdownStack ++ (void)tearDown { - sNeedsStackShutdown = NO; - MTRDeviceController * controller = sController; XCTAssertNotNil(controller); - [controller shutdown]; XCTAssertFalse([controller isRunning]); [[MTRDeviceControllerFactory sharedInstance] stopControllerFactory]; + + [super tearDown]; +} + +- (void)setUp +{ + [super setUp]; + [self setContinueAfterFailure:NO]; } - (void)test001_StartBrowseAndStopBrowse @@ -248,9 +230,4 @@ - (void)test005_StartBrowseGetCommissionableOverMdns XCTAssertTrue([sController stopBrowseForCommissionables]); } -- (void)test999_TearDown -{ - [[self class] shutdownStack]; -} - @end diff --git a/src/darwin/Framework/CHIPTests/MTRDeviceTests.m b/src/darwin/Framework/CHIPTests/MTRDeviceTests.m index 9f14cdf9d3c9c9..66bca12cc47bfd 100644 --- a/src/darwin/Framework/CHIPTests/MTRDeviceTests.m +++ b/src/darwin/Framework/CHIPTests/MTRDeviceTests.m @@ -36,6 +36,8 @@ // system dependencies #import +// Fixture: chip-all-clusters-app --KVS "$(mktemp -t chip-test-kvs)" --interface-id -1 + static const uint16_t kPairingTimeoutInSeconds = 10; static const uint16_t kTimeoutInSeconds = 3; static const uint64_t kDeviceId = 0x12344321; @@ -125,46 +127,11 @@ - (void)controller:(MTRDeviceController *)controller commissioningComplete:(NSEr @interface MTRDeviceTests : XCTestCase @end -static BOOL sStackInitRan = NO; -static BOOL sNeedsStackShutdown = YES; - @implementation MTRDeviceTests -+ (void)tearDown -{ - // Global teardown, runs once - if (sNeedsStackShutdown) { - // We don't need to worry about ResetCommissionee. If we get here, - // we're running only one of our test methods (using - // -only-testing:MatterTests/MTROTAProviderTests/testMethodName), since - // we did not run test999_TearDown. - [self shutdownStack]; - } -} - -- (void)setUp -{ - // Per-test setup, runs before each test. - [super setUp]; - [self setContinueAfterFailure:NO]; - - if (sStackInitRan == NO) { - [self initStack]; - [self waitForCommissionee]; - } -} - -- (void)tearDown ++ (void)setUp { - // Per-test teardown, runs after each test. - [super tearDown]; -} - -- (void)initStack -{ - sStackInitRan = YES; - - XCTestExpectation * expectation = [self expectationWithDescription:@"Pairing Complete"]; + XCTestExpectation * pairingExpectation = [[XCTestExpectation alloc] initWithDescription:@"Pairing Complete"]; __auto_type * factory = [MTRDeviceControllerFactory sharedInstance]; XCTAssertNotNil(factory); @@ -192,7 +159,7 @@ - (void)initStack sController = controller; MTRDeviceTestDeviceControllerDelegate * deviceControllerDelegate = - [[MTRDeviceTestDeviceControllerDelegate alloc] initWithExpectation:expectation]; + [[MTRDeviceTestDeviceControllerDelegate alloc] initWithExpectation:pairingExpectation]; dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.device_controller_delegate", DISPATCH_QUEUE_SERIAL); [controller setDeviceControllerDelegate:deviceControllerDelegate queue:callbackQueue]; @@ -202,38 +169,33 @@ - (void)initStack XCTAssertNotNil(payload); XCTAssertNil(error); - [controller setupCommissioningSessionWithPayload:payload newNodeID:@(kDeviceId) error:&error]; + XCTAssertTrue([controller setupCommissioningSessionWithPayload:payload newNodeID:@(kDeviceId) error:&error]); XCTAssertNil(error); + XCTAssertEqual([XCTWaiter waitForExpectations:@[ pairingExpectation ] timeout:kPairingTimeoutInSeconds], XCTWaiterResultCompleted); - [self waitForExpectationsWithTimeout:kPairingTimeoutInSeconds handler:nil]; + XCTestExpectation * expectation = [[XCTestExpectation alloc] initWithDescription:@"Wait for the commissioned device to be retrieved"]; + WaitForCommissionee(expectation); + XCTAssertEqual([XCTWaiter waitForExpectations:@[ expectation ] timeout:kTimeoutInSeconds], XCTWaiterResultCompleted); } -+ (void)shutdownStack ++ (void)tearDown { - sNeedsStackShutdown = NO; + ResetCommissionee(GetConnectedDevice(), dispatch_get_main_queue(), nil, kTimeoutInSeconds); MTRDeviceController * controller = sController; XCTAssertNotNil(controller); - [controller shutdown]; XCTAssertFalse([controller isRunning]); [[MTRDeviceControllerFactory sharedInstance] stopControllerFactory]; -} - -- (void)waitForCommissionee -{ - XCTestExpectation * expectation = [self expectationWithDescription:@"Wait for the commissioned device to be retrieved"]; - WaitForCommissionee(expectation); - [self waitForExpectationsWithTimeout:kTimeoutInSeconds handler:nil]; + [super tearDown]; } -- (void)test000_SetUp +- (void)setUp { - // Nothing to do here; our setUp method handled this already. This test - // just exists to make the setup not look like it's happening inside other - // tests. + [super setUp]; + [self setContinueAfterFailure:NO]; } - (void)test001_ReadAttribute @@ -2864,12 +2826,6 @@ - (void)test030_DeviceAndClusterProperties XCTAssertEqualObjects(cluster.endpointID, @(0)); } -- (void)test999_TearDown -{ - ResetCommissionee(GetConnectedDevice(), dispatch_get_main_queue(), self, kTimeoutInSeconds); - [[self class] shutdownStack]; -} - @end @interface MTRDeviceEncoderTests : XCTestCase diff --git a/src/darwin/Framework/CHIPTests/MTRPairingTests.m b/src/darwin/Framework/CHIPTests/MTRPairingTests.m index 94ce4e93131169..6757dea7ceb541 100644 --- a/src/darwin/Framework/CHIPTests/MTRPairingTests.m +++ b/src/darwin/Framework/CHIPTests/MTRPairingTests.m @@ -26,6 +26,10 @@ // system dependencies #import +// Fixture: chip-all-clusters-app --KVS "$(mktemp -t chip-test-kvs)" --interface-id -1 \ + --dac_provider credentials/development/commissioner_dut/struct_cd_origin_pid_vid_correct/test_case_vector.json \ + --product-id 32768 --discriminator 3839 + static const uint16_t kPairingTimeoutInSeconds = 10; static const uint16_t kTimeoutInSeconds = 3; static uint64_t sDeviceId = 0x12344321; @@ -118,106 +122,32 @@ - (void)controller:(MTRDeviceController *)controller commissioningComplete:(NSEr @end -// attestationDelegate and failSafeExtension can both be nil -static void DoPairingTest(XCTestCase * testcase, id attestationDelegate, NSNumber * failSafeExtension) -{ - // Don't reuse node ids, because that will confuse us. - ++sDeviceId; - XCTestExpectation * expectation = [testcase expectationWithDescription:@"Commissioning Complete"]; - __auto_type * controller = sController; - - __auto_type * controllerDelegate = [[MTRPairingTestControllerDelegate alloc] initWithExpectation:expectation - attestationDelegate:attestationDelegate - failSafeExtension:failSafeExtension]; - dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.pairing", DISPATCH_QUEUE_SERIAL); - - [controller setDeviceControllerDelegate:controllerDelegate queue:callbackQueue]; - - NSError * error; - __auto_type * payload = [MTRSetupPayload setupPayloadWithOnboardingPayload:kOnboardingPayload error:&error]; - XCTAssertNotNil(payload); - XCTAssertNil(error); - - [controller setupCommissioningSessionWithPayload:payload newNodeID:@(sDeviceId) error:&error]; - XCTAssertNil(error); - - [testcase waitForExpectations:@[ expectation ] timeout:kPairingTimeoutInSeconds]; - - ResetCommissionee([MTRBaseDevice deviceWithNodeID:@(sDeviceId) controller:controller], dispatch_get_main_queue(), testcase, - kTimeoutInSeconds); -} - @interface MTRPairingTests : XCTestCase @end -static BOOL sStackInitRan = NO; -static BOOL sNeedsStackShutdown = YES; - @implementation MTRPairingTests -+ (void)tearDown -{ - // Global teardown, runs once - if (sNeedsStackShutdown) { - // We don't need to worry about ResetCommissionee. If we get here, - // we're running only one of our test methods (using - // -only-testing:MatterTests/MTROTAProviderTests/testMethodName), since - // we did not run test999_TearDown. - [self shutdownStack]; - } -} - -- (void)setUp -{ - // Per-test setup, runs before each test. - [super setUp]; - [self setContinueAfterFailure:NO]; - - if (sStackInitRan == NO) { - [self initStack]; - } -} - -- (void)tearDown -{ - // Per-test teardown, runs after each test. - [super tearDown]; -} - -- (void)initStack ++ (void)setUp { - sStackInitRan = YES; - __auto_type * factory = [MTRDeviceControllerFactory sharedInstance]; XCTAssertNotNil(factory); __auto_type * storage = [[MTRTestStorage alloc] init]; __auto_type * factoryParams = [[MTRDeviceControllerFactoryParams alloc] initWithStorage:storage]; factoryParams.port = @(kLocalPort); + XCTAssertTrue([factory startControllerFactory:factoryParams error:nil]); - BOOL ok = [factory startControllerFactory:factoryParams error:nil]; - XCTAssertTrue(ok); - - __auto_type * testKeys = [[MTRTestKeys alloc] init]; - XCTAssertNotNil(testKeys); - - sTestKeys = testKeys; + XCTAssertNotNil(sTestKeys = [[MTRTestKeys alloc] init]); // Needs to match what startControllerOnExistingFabric calls elsewhere in // this file do. - __auto_type * params = [[MTRDeviceControllerStartupParams alloc] initWithIPK:testKeys.ipk fabricID:@(1) nocSigner:testKeys]; + __auto_type * params = [[MTRDeviceControllerStartupParams alloc] initWithIPK:sTestKeys.ipk fabricID:@(1) nocSigner:sTestKeys]; params.vendorID = @(kTestVendorId); - - MTRDeviceController * controller = [factory createControllerOnNewFabric:params error:nil]; - XCTAssertNotNil(controller); - - sController = controller; + XCTAssertNotNil(sController = [factory createControllerOnNewFabric:params error:nil]); } -+ (void)shutdownStack ++ (void)tearDown { - sNeedsStackShutdown = NO; - MTRDeviceController * controller = sController; XCTAssertNotNil(controller); @@ -227,23 +157,51 @@ + (void)shutdownStack [[MTRDeviceControllerFactory sharedInstance] stopControllerFactory]; } -- (void)test000_SetUp +- (void)setUp { - // Nothing to do here; our setUp method handled this already. This test - // just exists to make the setup not look like it's happening inside other - // tests. + [super setUp]; + [self setContinueAfterFailure:NO]; +} + +// attestationDelegate and failSafeExtension can both be nil +- (void)doPairingTestWithAttestationDelegate:(id)attestationDelegate failSafeExtension:(NSNumber *)failSafeExtension +{ + // Don't reuse node ids, because that will confuse us. + ++sDeviceId; + XCTestExpectation * expectation = [self expectationWithDescription:@"Commissioning Complete"]; + + __auto_type * controllerDelegate = [[MTRPairingTestControllerDelegate alloc] initWithExpectation:expectation + attestationDelegate:attestationDelegate + failSafeExtension:failSafeExtension]; + dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.pairing", DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL); + + [sController setDeviceControllerDelegate:controllerDelegate queue:callbackQueue]; + + NSError * error; + __auto_type * payload = [MTRSetupPayload setupPayloadWithOnboardingPayload:kOnboardingPayload error:&error]; + XCTAssertNotNil(payload); + XCTAssertNil(error); + + XCTAssertTrue([sController setupCommissioningSessionWithPayload:payload newNodeID:@(sDeviceId) error:&error]); + XCTAssertNil(error); + + [self waitForExpectations:@[ expectation ] timeout:kPairingTimeoutInSeconds]; + + ResetCommissionee([MTRBaseDevice deviceWithNodeID:@(sDeviceId) controller:sController], dispatch_get_main_queue(), self, + kTimeoutInSeconds); } - (void)test001_PairWithoutAttestationDelegate { - DoPairingTest(self, nil, nil); + [self doPairingTestWithAttestationDelegate:nil failSafeExtension:nil]; } - (void)test002_PairWithAttestationDelegateNoFailsafeExtension { XCTestExpectation * expectation = [self expectationWithDescription:@"Attestation delegate called"]; - DoPairingTest(self, [[NoOpAttestationDelegate alloc] initWithExpectation:expectation], nil); + [self doPairingTestWithAttestationDelegate:[[NoOpAttestationDelegate alloc] initWithExpectation:expectation] + failSafeExtension:nil]; [self waitForExpectations:@[ expectation ] timeout:kTimeoutInSeconds]; } @@ -255,7 +213,8 @@ - (void)test003_PairWithAttestationDelegateFailsafeExtensionShort // Extend by a time that is going to be smaller than the 60s default we // already have set via CHIP_DEVICE_CONFIG_FAILSAFE_EXPIRY_LENGTH_SEC on the // server side, minus whatever time that has likely passed. - DoPairingTest(self, [[NoOpAttestationDelegate alloc] initWithExpectation:expectation], @(30)); + [self doPairingTestWithAttestationDelegate:[[NoOpAttestationDelegate alloc] initWithExpectation:expectation] + failSafeExtension:@(30)]; [self waitForExpectations:@[ expectation ] timeout:kTimeoutInSeconds]; } @@ -267,14 +226,10 @@ - (void)test004_PairWithAttestationDelegateFailsafeExtensionLong // Extend by a time that is going to be larger than the 60s default we // already have set via CHIP_DEVICE_CONFIG_FAILSAFE_EXPIRY_LENGTH_SEC on the // server side. - DoPairingTest(self, [[NoOpAttestationDelegate alloc] initWithExpectation:expectation], @(90)); + [self doPairingTestWithAttestationDelegate:[[NoOpAttestationDelegate alloc] initWithExpectation:expectation] + failSafeExtension:@(90)]; [self waitForExpectations:@[ expectation ] timeout:kTimeoutInSeconds]; } -- (void)test999_TearDown -{ - [[self class] shutdownStack]; -} - @end diff --git a/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m b/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m index eadfabae9cac57..604ed600fb02d6 100644 --- a/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m +++ b/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m @@ -204,10 +204,6 @@ @implementation MTRPerControllerStorageTests { dispatch_queue_t _storageQueue; } -+ (void)tearDown -{ -} - - (void)setUp { // Per-test setup, runs before each test. diff --git a/src/darwin/Framework/CHIPTests/MTRSwiftDeviceTests.swift b/src/darwin/Framework/CHIPTests/MTRSwiftDeviceTests.swift index 4a35a431347045..1276868a14c5fa 100644 --- a/src/darwin/Framework/CHIPTests/MTRSwiftDeviceTests.swift +++ b/src/darwin/Framework/CHIPTests/MTRSwiftDeviceTests.swift @@ -3,6 +3,8 @@ import XCTest // This should eventually grow into a Swift copy of MTRDeviceTests +// Fixture: chip-all-clusters-app --KVS "$(mktemp -t chip-test-kvs)" --interface-id -1 + struct DeviceConstants { static let testVendorID = 0xFFF1 static let onboardingPayload = "MT:-24J0AFN00KA0648G00" @@ -93,41 +95,10 @@ class MTRSwiftDeviceTestDelegate : NSObject, MTRDeviceDelegate { } class MTRSwiftDeviceTests : XCTestCase { - static var sStackInitRan : Bool = false - static var sNeedsStackShutdown : Bool = true - - static override func tearDown() { - // Global teardown, runs once - if (sNeedsStackShutdown) { - // We don't need to worry about ResetCommissionee. If we get here, - // we're running only one of our test methods (using - // -only-testing:MatterTests/MTRSwiftDeviceTests/testMethodName), since - // we did not run test999_TearDown. - shutdownStack() - } - } - - override func setUp() + static override func setUp() { - // Per-test setup, runs before each test. super.setUp() - self.continueAfterFailure = false - - if (!MTRSwiftDeviceTests.sStackInitRan) { - initStack() - } - } - - override func tearDown() - { - // Per-test teardown, runs after each test. - super.tearDown() - } - - func initStack() - { - MTRSwiftDeviceTests.sStackInitRan = true - + let factory = MTRDeviceControllerFactory.sharedInstance() let storage = MTRTestStorage() @@ -141,7 +112,6 @@ class MTRSwiftDeviceTests : XCTestCase { XCTAssertTrue(factory.isRunning) let testKeys = MTRTestKeys() - sTestKeys = testKeys // Needs to match what startControllerOnExistingFabric calls elsewhere in @@ -160,8 +130,8 @@ class MTRSwiftDeviceTests : XCTestCase { sController = controller - let expectation = expectation(description : "Commissioning Complete") - + let expectation = XCTestExpectation(description : "Commissioning Complete") + let controllerDelegate = MTRSwiftDeviceTestControllerDelegate(withExpectation: expectation) let serialQueue = DispatchQueue(label: "com.chip.device_controller_delegate") @@ -180,30 +150,29 @@ class MTRSwiftDeviceTests : XCTestCase { } catch { XCTFail("Could not start setting up PASE session: \(error)") return } - - wait(for: [expectation], timeout: DeviceConstants.pairingTimeoutInSeconds) + + XCTAssertEqual(XCTWaiter.wait(for: [expectation], timeout: DeviceConstants.pairingTimeoutInSeconds), XCTWaiter.Result.completed) } - static func shutdownStack() - { - sNeedsStackShutdown = false - + static override func tearDown() { + ResetCommissionee(sConnectedDevice, DispatchQueue.main, nil, UInt16(DeviceConstants.timeoutInSeconds)) + let controller = sController XCTAssertNotNil(controller) - controller!.shutdown() XCTAssertFalse(controller!.isRunning) MTRDeviceControllerFactory.sharedInstance().stop() + + super.tearDown() } - - func test000_SetUp() + + override func setUp() { - // Nothing to do here; our setUp method handled this already. This test - // just exists to make the setup not look like it's happening inside other - // tests. + super.setUp() + self.continueAfterFailure = false } - + func test017_TestMTRDeviceBasics() { let device = MTRDevice(nodeID: DeviceConstants.deviceID as NSNumber, controller:sController!) @@ -545,10 +514,4 @@ class MTRSwiftDeviceTests : XCTestCase { XCTAssertEqual(cluster.device, device) XCTAssertEqual(cluster.__endpointID, 0 as NSNumber) } - - func test999_TearDown() - { - ResetCommissionee(sConnectedDevice, DispatchQueue.main, self, UInt16(DeviceConstants.timeoutInSeconds)) - type(of: self).shutdownStack() - } } diff --git a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestResetCommissioneeHelper.m b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestResetCommissioneeHelper.m index 25ec161420bcfe..841a1ce656fa0b 100644 --- a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestResetCommissioneeHelper.m +++ b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestResetCommissioneeHelper.m @@ -16,11 +16,11 @@ #import "MTRTestResetCommissioneeHelper.h" -void ResetCommissionee(MTRBaseDevice * device, dispatch_queue_t queue, XCTestCase * testcase, uint16_t commandTimeout) +void ResetCommissionee(MTRBaseDevice * device, dispatch_queue_t queue, XCTestCase * testcaseUnused, uint16_t commandTimeout) { // Put the device back in the state we found it: open commissioning window, no fabrics commissioned. // Get our current fabric index, for later deletion. - XCTestExpectation * readFabricIndexExpectation = [testcase expectationWithDescription:@"Fabric index read"]; + XCTestExpectation * readFabricIndexExpectation = [[XCTestExpectation alloc] initWithDescription:@"Fabric index read"]; __block NSNumber * fabricIndex; __auto_type * opCredsCluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:queue]; @@ -32,11 +32,10 @@ void ResetCommissionee(MTRBaseDevice * device, dispatch_queue_t queue, XCTestCas [readFabricIndexExpectation fulfill]; }]; - [testcase waitForExpectations:@[ readFabricIndexExpectation ] timeout:commandTimeout]; + XCTAssertEqual([XCTWaiter waitForExpectations:@[ readFabricIndexExpectation ] timeout:commandTimeout], XCTWaiterResultCompleted); // Open a commissioning window. - XCTestExpectation * openCommissioningWindowExpectation = [testcase expectationWithDescription:@"Commissioning window opened"]; - + XCTestExpectation * openCommissioningWindowExpectation = [[XCTestExpectation alloc] initWithDescription:@"Commissioning window opened"]; __auto_type * adminCommissioningCluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:queue]; @@ -49,10 +48,10 @@ void ResetCommissionee(MTRBaseDevice * device, dispatch_queue_t queue, XCTestCas [openCommissioningWindowExpectation fulfill]; }]; - [testcase waitForExpectations:@[ openCommissioningWindowExpectation ] timeout:commandTimeout]; + XCTAssertEqual([XCTWaiter waitForExpectations:@[ openCommissioningWindowExpectation ] timeout:commandTimeout], XCTWaiterResultCompleted); // Remove our fabric from the device. - XCTestExpectation * removeFabricExpectation = [testcase expectationWithDescription:@"Fabric removed"]; + XCTestExpectation * removeFabricExpectation = [[XCTestExpectation alloc] initWithDescription:@"Fabric removed"]; __auto_type * removeParams = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init]; removeParams.fabricIndex = fabricIndex; @@ -66,5 +65,5 @@ void ResetCommissionee(MTRBaseDevice * device, dispatch_queue_t queue, XCTestCas [removeFabricExpectation fulfill]; }]; - [testcase waitForExpectations:@[ removeFabricExpectation ] timeout:commandTimeout]; + XCTAssertEqual([XCTWaiter waitForExpectations:@[ removeFabricExpectation ] timeout:commandTimeout], XCTWaiterResultCompleted); } diff --git a/src/darwin/Framework/Matter.xcodeproj/project.pbxproj b/src/darwin/Framework/Matter.xcodeproj/project.pbxproj index 2abac8376ed097..22c071844795d5 100644 --- a/src/darwin/Framework/Matter.xcodeproj/project.pbxproj +++ b/src/darwin/Framework/Matter.xcodeproj/project.pbxproj @@ -22,7 +22,6 @@ 037C3DB72991BD5000B7EEE2 /* ModelCommandBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 037C3D882991BD4F00B7EEE2 /* ModelCommandBridge.h */; }; 037C3DB82991BD5000B7EEE2 /* ClusterCommandBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 037C3D892991BD4F00B7EEE2 /* ClusterCommandBridge.h */; }; 037C3DB92991BD5000B7EEE2 /* ReportCommandBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 037C3D8A2991BD4F00B7EEE2 /* ReportCommandBridge.h */; }; - 037C3DBA2991BD5000B7EEE2 /* TestCommandBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 037C3D8C2991BD4F00B7EEE2 /* TestCommandBridge.h */; }; 037C3DBB2991BD5000B7EEE2 /* Commands.h in Headers */ = {isa = PBXBuildFile; fileRef = 037C3D8E2991BD4F00B7EEE2 /* Commands.h */; }; 037C3DBC2991BD5000B7EEE2 /* OTASoftwareUpdateInteractive.mm in Sources */ = {isa = PBXBuildFile; fileRef = 037C3D8F2991BD4F00B7EEE2 /* OTASoftwareUpdateInteractive.mm */; }; 037C3DBD2991BD5000B7EEE2 /* OTAProviderDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 037C3D902991BD4F00B7EEE2 /* OTAProviderDelegate.h */; }; @@ -68,9 +67,6 @@ 039546A02991DFC5006D42A8 /* json_tool.h in Headers */ = {isa = PBXBuildFile; fileRef = 0395469B2991DFC4006D42A8 /* json_tool.h */; }; 039546A12991DFC5006D42A8 /* json_value.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0395469C2991DFC4006D42A8 /* json_value.cpp */; }; 039546A62991E151006D42A8 /* InteractionModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 039546A52991E132006D42A8 /* InteractionModel.cpp */; }; - 039546BC2991E1CB006D42A8 /* LogCommands.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 039546AF2991E193006D42A8 /* LogCommands.cpp */; }; - 039546BD2991E1CB006D42A8 /* SystemCommands.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 039546B32991E194006D42A8 /* SystemCommands.cpp */; }; - 039546BE2991E1CB006D42A8 /* DelayCommands.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 039546AC2991E185006D42A8 /* DelayCommands.cpp */; }; 039547012992D461006D42A8 /* generic-callback-stubs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5143041F2914CED9004DC7FE /* generic-callback-stubs.cpp */; }; 0395470F2992DB37006D42A8 /* complete.c in Sources */ = {isa = PBXBuildFile; fileRef = 0395470C2992DB37006D42A8 /* complete.c */; }; 03F430A7299410C000166449 /* ExamplePersistentStorage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 03F430A6299410C000166449 /* ExamplePersistentStorage.cpp */; }; @@ -400,7 +396,6 @@ 037C3D882991BD4F00B7EEE2 /* ModelCommandBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModelCommandBridge.h; sourceTree = ""; }; 037C3D892991BD4F00B7EEE2 /* ClusterCommandBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClusterCommandBridge.h; sourceTree = ""; }; 037C3D8A2991BD4F00B7EEE2 /* ReportCommandBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReportCommandBridge.h; sourceTree = ""; }; - 037C3D8C2991BD4F00B7EEE2 /* TestCommandBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestCommandBridge.h; sourceTree = ""; }; 037C3D8E2991BD4F00B7EEE2 /* Commands.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Commands.h; sourceTree = ""; }; 037C3D8F2991BD4F00B7EEE2 /* OTASoftwareUpdateInteractive.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OTASoftwareUpdateInteractive.mm; sourceTree = ""; }; 037C3D902991BD4F00B7EEE2 /* OTAProviderDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTAProviderDelegate.h; sourceTree = ""; }; @@ -445,15 +440,6 @@ 0395469C2991DFC4006D42A8 /* json_value.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = json_value.cpp; sourceTree = ""; }; 0395469D2991DFC4006D42A8 /* json_valueiterator.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = json_valueiterator.inl; sourceTree = ""; }; 039546A52991E132006D42A8 /* InteractionModel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = InteractionModel.cpp; sourceTree = ""; }; - 039546AC2991E185006D42A8 /* DelayCommands.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = DelayCommands.cpp; sourceTree = ""; }; - 039546AF2991E193006D42A8 /* LogCommands.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = LogCommands.cpp; sourceTree = ""; }; - 039546B32991E194006D42A8 /* SystemCommands.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = SystemCommands.cpp; sourceTree = ""; }; - 039546B62991E194006D42A8 /* FactoryReset.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = FactoryReset.py; sourceTree = ""; }; - 039546B72991E194006D42A8 /* Stop.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = Stop.py; sourceTree = ""; }; - 039546B82991E194006D42A8 /* Start.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = Start.py; sourceTree = ""; }; - 039546B92991E194006D42A8 /* CreateOtaImage.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = CreateOtaImage.py; sourceTree = ""; }; - 039546BA2991E194006D42A8 /* CompareFiles.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = CompareFiles.py; sourceTree = ""; }; - 039546BB2991E194006D42A8 /* Reboot.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = Reboot.py; sourceTree = ""; }; 0395470B2992DB37006D42A8 /* editline.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = editline.c; path = repo/src/editline.c; sourceTree = ""; }; 0395470C2992DB37006D42A8 /* complete.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = complete.c; path = repo/src/complete.c; sourceTree = ""; }; 03F430A6299410C000166449 /* ExamplePersistentStorage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExamplePersistentStorage.cpp; sourceTree = ""; }; @@ -868,14 +854,6 @@ path = clusters; sourceTree = ""; }; - 037C3D8B2991BD4F00B7EEE2 /* tests */ = { - isa = PBXGroup; - children = ( - 037C3D8C2991BD4F00B7EEE2 /* TestCommandBridge.h */, - ); - path = tests; - sourceTree = ""; - }; 037C3D8D2991BD4F00B7EEE2 /* provider */ = { isa = PBXGroup; children = ( @@ -980,47 +958,6 @@ path = ../../src/app/tests/suites/commands/interaction_model; sourceTree = ""; }; - 039546A72991E185006D42A8 /* delay */ = { - isa = PBXGroup; - children = ( - 039546AC2991E185006D42A8 /* DelayCommands.cpp */, - ); - name = delay; - path = ../../src/app/tests/suites/commands/delay; - sourceTree = ""; - }; - 039546AD2991E193006D42A8 /* log */ = { - isa = PBXGroup; - children = ( - 039546AF2991E193006D42A8 /* LogCommands.cpp */, - ); - name = log; - path = ../../src/app/tests/suites/commands/log; - sourceTree = ""; - }; - 039546B12991E194006D42A8 /* system */ = { - isa = PBXGroup; - children = ( - 039546B32991E194006D42A8 /* SystemCommands.cpp */, - 039546B52991E194006D42A8 /* scripts */, - ); - name = system; - path = ../../src/app/tests/suites/commands/system; - sourceTree = ""; - }; - 039546B52991E194006D42A8 /* scripts */ = { - isa = PBXGroup; - children = ( - 039546B62991E194006D42A8 /* FactoryReset.py */, - 039546B72991E194006D42A8 /* Stop.py */, - 039546B82991E194006D42A8 /* Start.py */, - 039546B92991E194006D42A8 /* CreateOtaImage.py */, - 039546BA2991E194006D42A8 /* CompareFiles.py */, - 039546BB2991E194006D42A8 /* Reboot.py */, - ); - path = scripts; - sourceTree = ""; - }; 039547092992DB02006D42A8 /* editline */ = { isa = PBXGroup; children = ( @@ -1527,7 +1464,6 @@ 037C3DB72991BD5000B7EEE2 /* ModelCommandBridge.h in Headers */, 037C3DC52991BD5100B7EEE2 /* StorageManagementCommand.h in Headers */, 037C3DCC2991BD5100B7EEE2 /* MTRError_Utils.h in Headers */, - 037C3DBA2991BD5000B7EEE2 /* TestCommandBridge.h in Headers */, 037C3DAD2991BD4F00B7EEE2 /* PairingCommandBridge.h in Headers */, 037C3DBB2991BD5000B7EEE2 /* Commands.h in Headers */, 03FB93DF2A46200A0048CB35 /* Commands.h in Headers */, diff --git a/src/lib/core/CHIPConfig.h b/src/lib/core/CHIPConfig.h index 75393390f3e14f..09131aed21cebd 100644 --- a/src/lib/core/CHIPConfig.h +++ b/src/lib/core/CHIPConfig.h @@ -1744,6 +1744,17 @@ extern const char CHIP_NON_PRODUCTION_MARKER[]; #define CHIP_CONFIG_ENABLE_BDX_LOG_TRANSFER 0 #endif +/** + * @def CHIP_CONFIG_MAX_BDX_LOG_TRANSFERS + * + * @brief + * Maximum number of simultaneously active bdx log transfers. + * + */ +#ifndef CHIP_CONFIG_MAX_BDX_LOG_TRANSFERS +#define CHIP_CONFIG_MAX_BDX_LOG_TRANSFERS 5 +#endif // CHIP_CONFIG_MAX_BDX_LOG_TRANSFERS + /** * @} */ diff --git a/src/lib/core/CHIPError.cpp b/src/lib/core/CHIPError.cpp index 64f10daa48b2c5..68a44d8c39a7ea 100644 --- a/src/lib/core/CHIPError.cpp +++ b/src/lib/core/CHIPError.cpp @@ -15,13 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/** - * @file - * This file contains functions for working with CHIP errors. - */ - -#include +#include #include #include diff --git a/src/lib/core/CHIPError.h b/src/lib/core/CHIPError.h index 4e4808e88b3d39..38b76bca539c2a 100644 --- a/src/lib/core/CHIPError.h +++ b/src/lib/core/CHIPError.h @@ -33,7 +33,6 @@ #include #include -#include #include namespace chip { diff --git a/src/lib/core/CHIPKeyIds.cpp b/src/lib/core/CHIPKeyIds.cpp index 5c560aec893e79..06417dc61b5a9d 100644 --- a/src/lib/core/CHIPKeyIds.cpp +++ b/src/lib/core/CHIPKeyIds.cpp @@ -15,15 +15,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include -/** - * @file - * This file implements CHIP key types helper functions. - * - */ -#include "CHIPKeyIds.h" - -#include #include namespace chip { diff --git a/src/lib/core/CHIPKeyIds.h b/src/lib/core/CHIPKeyIds.h index 3abbe90d674005..1aaf5cf519656c 100644 --- a/src/lib/core/CHIPKeyIds.h +++ b/src/lib/core/CHIPKeyIds.h @@ -22,10 +22,8 @@ * key flags, key ID fields, and helper API functions. * */ - #pragma once -#include #include namespace chip { diff --git a/src/lib/core/ErrorStr.cpp b/src/lib/core/ErrorStr.cpp index f661cc85ed63aa..5551ff60d413cd 100644 --- a/src/lib/core/ErrorStr.cpp +++ b/src/lib/core/ErrorStr.cpp @@ -15,24 +15,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/** - * @file - * This file implements functions to translate error codes used - * throughout the CHIP package into human-readable strings. - * - */ +#include #ifndef __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS #endif +#include +#include +#include + #include #include -#include -#include - namespace chip { /** diff --git a/src/lib/core/ErrorStr.h b/src/lib/core/ErrorStr.h index 70cca22c44a026..de3a0ad0afe93a 100644 --- a/src/lib/core/ErrorStr.h +++ b/src/lib/core/ErrorStr.h @@ -28,7 +28,6 @@ #include #include -#include namespace chip { diff --git a/src/lib/core/OTAImageHeader.cpp b/src/lib/core/OTAImageHeader.cpp index 674c08afb31429..68942d919a5ad4 100644 --- a/src/lib/core/OTAImageHeader.cpp +++ b/src/lib/core/OTAImageHeader.cpp @@ -14,12 +14,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include -#include "OTAImageHeader.h" - -#include +#include +#include +#include +#include +#include #include #include +#include +#include + +#include namespace chip { diff --git a/src/lib/core/OTAImageHeader.h b/src/lib/core/OTAImageHeader.h index f9fa8868530fd8..36a3375ee9313e 100644 --- a/src/lib/core/OTAImageHeader.h +++ b/src/lib/core/OTAImageHeader.h @@ -17,6 +17,7 @@ #pragma once +#include #include #include #include diff --git a/src/lib/core/TLVCircularBuffer.cpp b/src/lib/core/TLVCircularBuffer.cpp index c88892fe22bfd5..76a392f90f1644 100644 --- a/src/lib/core/TLVCircularBuffer.cpp +++ b/src/lib/core/TLVCircularBuffer.cpp @@ -26,16 +26,17 @@ * to continually add top-level TLV elements by evicting * pre-existing elements. */ +#include #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS #endif -#include - -#include -#include -#include +#include +#include +#include +#include +#include #include #include diff --git a/src/lib/core/TLVCircularBuffer.h b/src/lib/core/TLVCircularBuffer.h index 80897b3267913e..4d1507a4df973f 100644 --- a/src/lib/core/TLVCircularBuffer.h +++ b/src/lib/core/TLVCircularBuffer.h @@ -30,12 +30,12 @@ #pragma once #include -#include -#include -#include - +#include +#include +#include #include +#include #include namespace chip { diff --git a/src/lib/core/TLVDebug.cpp b/src/lib/core/TLVDebug.cpp index 74e6d5ce5377f1..4d922f6285ebd1 100644 --- a/src/lib/core/TLVDebug.cpp +++ b/src/lib/core/TLVDebug.cpp @@ -15,27 +15,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/** - * @file - * This file implements interfaces for debugging and logging - * CHIP TLV. - * - */ +#include #ifndef __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS #endif -#include #include -#include -#include -#include +#include +#include +#include +#include #include #include -#include namespace chip { diff --git a/src/lib/core/TLVDebug.h b/src/lib/core/TLVDebug.h index 5c18236880c01d..6a83b6b0ad09f1 100644 --- a/src/lib/core/TLVDebug.h +++ b/src/lib/core/TLVDebug.h @@ -15,24 +15,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/** - * @file - * This file defines types and interfaces for debugging and - * logging CHIP TLV. - * - */ - #pragma once #include -#include #include -#include +#include +#include +#include namespace chip { - namespace TLV { /** diff --git a/src/lib/core/TLVReader.cpp b/src/lib/core/TLVReader.cpp index 9ef55edfe3a91f..abef9af1636ca5 100644 --- a/src/lib/core/TLVReader.cpp +++ b/src/lib/core/TLVReader.cpp @@ -15,24 +15,32 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include -/** - * @file - * This file implements a parser for the CHIP TLV (Tag-Length-Value) encoding format. - * - */ +#include +#include -#include - -#include +#include #include +#include #include -#include +#include +#include +#include +#include +#include +#include +#include #include #include #include #include +#include +#include + +#if CHIP_CONFIG_TLV_VALIDATE_CHAR_STRING_ON_READ #include +#endif namespace chip { namespace TLV { diff --git a/src/lib/core/TLVReader.h b/src/lib/core/TLVReader.h index 744402a8b059cd..bfb6b47f14d3f4 100644 --- a/src/lib/core/TLVReader.h +++ b/src/lib/core/TLVReader.h @@ -24,14 +24,25 @@ * shares many properties with the commonly used JSON serialization format while being considerably * more compact over the wire. */ - #pragma once +#include +#include +#include +#include + +#include #include #include - -#include "TLVCommon.h" -#include "TLVWriter.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include /** * @namespace chip::TLV diff --git a/src/lib/core/TLVTags.cpp b/src/lib/core/TLVTags.cpp index bc44d52af12490..7a7701a965080e 100644 --- a/src/lib/core/TLVTags.cpp +++ b/src/lib/core/TLVTags.cpp @@ -15,7 +15,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "TLVTags.h" +#include + +#include + +#include +#include namespace chip { namespace TLV { diff --git a/src/lib/core/TLVTags.h b/src/lib/core/TLVTags.h index b82be9179466af..950afab2f78f54 100644 --- a/src/lib/core/TLVTags.h +++ b/src/lib/core/TLVTags.h @@ -15,18 +15,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/** - * @file - * This file contains definitions for working with CHIP TLV tags. - * - */ - #pragma once -#include #include #include + +#include #include namespace chip { diff --git a/src/lib/core/TLVUpdater.cpp b/src/lib/core/TLVUpdater.cpp index 7df01cbad7b4a6..f960cfede7220d 100644 --- a/src/lib/core/TLVUpdater.cpp +++ b/src/lib/core/TLVUpdater.cpp @@ -15,18 +15,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/** - * @file - * This file implements an updating encoder for the CHIP TLV - * (Tag-Length-Value) encoding format. - * - */ - -#include -#include -#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include namespace chip { namespace TLV { diff --git a/src/lib/core/TLVUpdater.h b/src/lib/core/TLVUpdater.h index f07d2bf24c92cb..1dfebbefcbb8a1 100644 --- a/src/lib/core/TLVUpdater.h +++ b/src/lib/core/TLVUpdater.h @@ -15,22 +15,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/** - * @file - * This file contains definitions for working with data encoded in CHIP TLV format. - * - * CHIP TLV (Tag-Length-Value) is a generalized encoding method for simple structured data. It - * shares many properties with the commonly used JSON serialization format while being considerably - * more compact over the wire. - */ - #pragma once -#include "TLVCommon.h" +#include -#include "TLVReader.h" -#include "TLVWriter.h" +#include +#include +#include +#include +#include +#include +#include /** * @namespace chip::TLV diff --git a/src/lib/core/TLVUtilities.cpp b/src/lib/core/TLVUtilities.cpp index 6faf40b02be0ac..a0fcae8d78111b 100644 --- a/src/lib/core/TLVUtilities.cpp +++ b/src/lib/core/TLVUtilities.cpp @@ -23,8 +23,12 @@ * */ -#include #include + +#include +#include +#include +#include #include namespace chip { diff --git a/src/lib/core/TLVUtilities.h b/src/lib/core/TLVUtilities.h index 8813b9f8b558d2..9c4c406542d093 100644 --- a/src/lib/core/TLVUtilities.h +++ b/src/lib/core/TLVUtilities.h @@ -15,21 +15,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#pragma once -/** - * @file - * This file specifies types and utility interfaces for managing and - * working with CHIP TLV. - * - */ +#include -#pragma once +#include +#include #include -#include - -#include -#include namespace chip { diff --git a/src/lib/core/TLVWriter.cpp b/src/lib/core/TLVWriter.cpp index 825b8c7b671406..2e946d0403267a 100644 --- a/src/lib/core/TLVWriter.cpp +++ b/src/lib/core/TLVWriter.cpp @@ -15,29 +15,34 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/** - * @file - * This file implements an encoder for the CHIP TLV (Tag-Length-Value) encoding format. - * - */ +#include #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS #endif -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include +#include +#include +#include #include - -#include -#include -#include +#include // Doxygen is confused by the __attribute__ annotation #ifndef DOXYGEN diff --git a/src/lib/core/TLVWriter.h b/src/lib/core/TLVWriter.h index 39e23a8e3e5ab3..3c8600e303b552 100644 --- a/src/lib/core/TLVWriter.h +++ b/src/lib/core/TLVWriter.h @@ -27,12 +27,24 @@ #pragma once -#include - -#include "TLVCommon.h" +#include +#include +#include +#include -#include "TLVBackingStore.h" -#include "TLVReader.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /** * @namespace chip::TLV diff --git a/src/lib/dnssd/Advertiser.h b/src/lib/dnssd/Advertiser.h index 0a98a90fa89a7e..ddd8df259b1364 100644 --- a/src/lib/dnssd/Advertiser.h +++ b/src/lib/dnssd/Advertiser.h @@ -48,6 +48,13 @@ enum class CommissioningMode kEnabledEnhanced // Enhanced Commissioning Mode, CM=2 in DNS-SD key/value pairs }; +enum class ICDModeAdvertise : uint8_t +{ + kNone, // The device does not support the LIT feature-set. No ICD= key is advertised in DNS-SD. + kSIT, // The ICD supports the LIT feature-set, but is currently operating as a SIT. ICD=0 in DNS-SD key/value pairs. + kLIT, // The ICD is currently operating as a LIT. ICD=1 in DNS-SD key/value pairs. +}; + template class BaseAdvertisingParams { @@ -94,6 +101,8 @@ class BaseAdvertisingParams return *reinterpret_cast(this); } const Optional & GetLocalMRPConfig() const { return mLocalMRPConfig; } + + // NOTE: The SetTcpSupported API is deprecated and not compliant with 1.3. T flag should not be set. Derived & SetTcpSupported(Optional tcpSupported) { mTcpSupported = tcpSupported; @@ -101,12 +110,12 @@ class BaseAdvertisingParams } Optional GetTcpSupported() const { return mTcpSupported; } - Derived & SetICDOperatingAsLIT(Optional operatesAsLIT) + Derived & SetICDModeToAdvertise(ICDModeAdvertise operatingMode) { - mICDOperatesAsLIT = operatesAsLIT; + mICDModeAdvertise = operatingMode; return *reinterpret_cast(this); } - Optional GetICDOperatingAsLIT() const { return mICDOperatesAsLIT; } + ICDModeAdvertise GetICDModeToAdvertise() const { return mICDModeAdvertise; } private: uint16_t mPort = CHIP_PORT; @@ -116,7 +125,7 @@ class BaseAdvertisingParams size_t mMacLength = 0; Optional mLocalMRPConfig; Optional mTcpSupported; - Optional mICDOperatesAsLIT; + ICDModeAdvertise mICDModeAdvertise = ICDModeAdvertise::kNone; }; /// Defines parameters required for advertising a CHIP node diff --git a/src/lib/dnssd/Advertiser_ImplMinimalMdns.cpp b/src/lib/dnssd/Advertiser_ImplMinimalMdns.cpp index b3b1f8ea8876a6..4c80723738bcaa 100644 --- a/src/lib/dnssd/Advertiser_ImplMinimalMdns.cpp +++ b/src/lib/dnssd/Advertiser_ImplMinimalMdns.cpp @@ -232,13 +232,9 @@ class AdvertiserMinMdns : public ServiceAdvertiser, { auto mrp = optionalMrp.Value(); -#if CHIP_CONFIG_ENABLE_ICD_SERVER - // An ICD operating as a LIT should not advertise its slow polling interval. - // When the ICD doesn't support the LIT feature, it doesn't set nor advertise the GetICDOperatingAsLIT entry. - // Therefore when GetICDOperatingAsLIT has no value or a value of 0, we advertise the slow polling interval - // otherwise we don't include the SII key in the advertisement. - if (!params.GetICDOperatingAsLIT().ValueOr(false)) -#endif + // An ICD operating as a LIT shall not advertise its slow polling interval. + // Don't include the SII key in the advertisement when operating as so. + if (params.GetICDModeToAdvertise() != ICDModeAdvertise::kLIT) { if (mrp.mIdleRetransTimeout > kMaxRetryInterval) { @@ -290,11 +286,11 @@ class AdvertiserMinMdns : public ServiceAdvertiser, CHIP_ERROR_INVALID_STRING_LENGTH); txtFields[numTxtFields++] = storage.tcpSupportedBuf; } - if (params.GetICDOperatingAsLIT().HasValue()) + if (params.GetICDModeToAdvertise() != ICDModeAdvertise::kNone) { size_t writtenCharactersNumber = static_cast(snprintf(storage.operatingICDAsLITBuf, sizeof(storage.operatingICDAsLITBuf), "ICD=%d", - params.GetICDOperatingAsLIT().Value())); + (params.GetICDModeToAdvertise() == ICDModeAdvertise::kLIT))); VerifyOrReturnError((writtenCharactersNumber > 0) && (writtenCharactersNumber < sizeof(storage.operatingICDAsLITBuf)), CHIP_ERROR_INVALID_STRING_LENGTH); txtFields[numTxtFields++] = storage.operatingICDAsLITBuf; diff --git a/src/lib/dnssd/Discovery_ImplPlatform.cpp b/src/lib/dnssd/Discovery_ImplPlatform.cpp index 8b1bbbfb7b82e5..abbc4647ff3805 100644 --- a/src/lib/dnssd/Discovery_ImplPlatform.cpp +++ b/src/lib/dnssd/Discovery_ImplPlatform.cpp @@ -213,19 +213,20 @@ CHIP_ERROR CopyTxtRecord(TxtFieldKey key, char * buffer, size_t bufferLen, const case TxtFieldKey::kSessionIdleInterval: #if CHIP_CONFIG_ENABLE_ICD_SERVER // A ICD operating as a LIT should not advertise its slow polling interval - if (params.GetICDOperatingAsLIT().HasValue() && params.GetICDOperatingAsLIT().Value()) - { - // Returning UNINITIALIZED ensures that the SII string isn't added by the AddTxtRecord - // without erroring out the action. - return CHIP_ERROR_UNINITIALIZED; - } + // Returning UNINITIALIZED ensures that the SII string isn't added by the AddTxtRecord + // without erroring out the action. + VerifyOrReturnError(params.GetICDModeToAdvertise() != ICDModeAdvertise::kLIT, CHIP_ERROR_UNINITIALIZED); FALLTHROUGH; #endif case TxtFieldKey::kSessionActiveInterval: case TxtFieldKey::kSessionActiveThreshold: return CopyTextRecordValue(buffer, bufferLen, params.GetLocalMRPConfig(), key); case TxtFieldKey::kLongIdleTimeICD: - return CopyTextRecordValue(buffer, bufferLen, params.GetICDOperatingAsLIT()); + // The ICD key is only added to the advertissment when the device supports the ICD LIT feature-set. + // Return UNINITIALIZED when the operating mode is kNone to ensure that the ICD string isn't added + // by the AddTxtRecord without erroring out the action. + VerifyOrReturnError(params.GetICDModeToAdvertise() != ICDModeAdvertise::kNone, CHIP_ERROR_UNINITIALIZED); + return CopyTextRecordValue(buffer, bufferLen, (params.GetICDModeToAdvertise() == ICDModeAdvertise::kLIT)); default: return CHIP_ERROR_INVALID_ARGUMENT; } diff --git a/src/lib/dnssd/TxtFields.h b/src/lib/dnssd/TxtFields.h index c3b8a0d668682c..5546493624119d 100644 --- a/src/lib/dnssd/TxtFields.h +++ b/src/lib/dnssd/TxtFields.h @@ -79,28 +79,28 @@ enum class TxtFieldKey : uint8_t namespace Internal { struct TxtFieldInfo { - TxtFieldKey key; size_t valMaxSize; - char keyStr[4]; + TxtFieldKey key; TxtKeyUse use; + char keyStr[4]; }; constexpr const TxtFieldInfo txtFieldInfo[static_cast(TxtFieldKey::kCount)] = { - { TxtFieldKey::kUnknown, 0, "", TxtKeyUse::kNone }, - { TxtFieldKey::kLongDiscriminator, kKeyLongDiscriminatorMaxLength, "D", TxtKeyUse::kCommission }, - { TxtFieldKey::kVendorProduct, kKeyVendorProductMaxLength, "VP", TxtKeyUse::kCommission }, - { TxtFieldKey::kCommissioningMode, kKeyCommissioningModeMaxLength, "CM", TxtKeyUse::kCommission }, - { TxtFieldKey::kDeviceType, kKeyDeviceTypeMaxLength, "DT", TxtKeyUse::kCommission }, - { TxtFieldKey::kDeviceName, kKeyDeviceNameMaxLength, "DN", TxtKeyUse::kCommission }, - { TxtFieldKey::kRotatingDeviceId, kKeyRotatingDeviceIdMaxLength, "RI", TxtKeyUse::kCommission }, - { TxtFieldKey::kPairingInstruction, kKeyPairingInstructionMaxLength, "PI", TxtKeyUse::kCommission }, - { TxtFieldKey::kPairingHint, kKeyPairingHintMaxLength, "PH", TxtKeyUse::kCommission }, - { TxtFieldKey::kCommissionerPasscode, kKeyCommissionerPasscodeMaxLength, "CP", TxtKeyUse::kCommission }, - { TxtFieldKey::kSessionIdleInterval, kKeySessionIdleIntervalMaxLength, "SII", TxtKeyUse::kCommon }, - { TxtFieldKey::kSessionActiveInterval, kKeySessionActiveIntervalMaxLength, "SAI", TxtKeyUse::kCommon }, - { TxtFieldKey::kSessionActiveThreshold, kKeySessionActiveThresholdMaxLength, "SAT", TxtKeyUse::kCommon }, - { TxtFieldKey::kTcpSupported, kKeyTcpSupportedMaxLength, "T", TxtKeyUse::kCommon }, - { TxtFieldKey::kLongIdleTimeICD, kKeyLongIdleTimeICDMaxLength, "ICD", TxtKeyUse::kCommon }, + { 0, TxtFieldKey::kUnknown, TxtKeyUse::kNone, "" }, + { kKeyLongDiscriminatorMaxLength, TxtFieldKey::kLongDiscriminator, TxtKeyUse::kCommission, "D" }, + { kKeyVendorProductMaxLength, TxtFieldKey::kVendorProduct, TxtKeyUse::kCommission, "VP" }, + { kKeyCommissioningModeMaxLength, TxtFieldKey::kCommissioningMode, TxtKeyUse::kCommission, "CM" }, + { kKeyDeviceTypeMaxLength, TxtFieldKey::kDeviceType, TxtKeyUse::kCommission, "DT" }, + { kKeyDeviceNameMaxLength, TxtFieldKey::kDeviceName, TxtKeyUse::kCommission, "DN" }, + { kKeyRotatingDeviceIdMaxLength, TxtFieldKey::kRotatingDeviceId, TxtKeyUse::kCommission, "RI" }, + { kKeyPairingInstructionMaxLength, TxtFieldKey::kPairingInstruction, TxtKeyUse::kCommission, "PI" }, + { kKeyPairingHintMaxLength, TxtFieldKey::kPairingHint, TxtKeyUse::kCommission, "PH" }, + { kKeyCommissionerPasscodeMaxLength, TxtFieldKey::kCommissionerPasscode, TxtKeyUse::kCommission, "CP" }, + { kKeySessionIdleIntervalMaxLength, TxtFieldKey::kSessionIdleInterval, TxtKeyUse::kCommon, "SII" }, + { kKeySessionActiveIntervalMaxLength, TxtFieldKey::kSessionActiveInterval, TxtKeyUse::kCommon, "SAI" }, + { kKeySessionActiveThresholdMaxLength, TxtFieldKey::kSessionActiveThreshold, TxtKeyUse::kCommon, "SAT" }, + { kKeyTcpSupportedMaxLength, TxtFieldKey::kTcpSupported, TxtKeyUse::kCommon, "T" }, + { kKeyLongIdleTimeICDMaxLength, TxtFieldKey::kLongIdleTimeICD, TxtKeyUse::kCommon, "ICD" }, }; #ifdef CHIP_CONFIG_TEST diff --git a/src/lib/dnssd/Types.h b/src/lib/dnssd/Types.h index 5d78c7631223cf..06a7352d60d919 100644 --- a/src/lib/dnssd/Types.h +++ b/src/lib/dnssd/Types.h @@ -207,18 +207,18 @@ inline constexpr size_t kMaxPairingInstructionLen = 128; /// Data that is specific to commisionable/commissioning node discovery struct CommissionNodeData { - char instanceName[Commission::kInstanceNameMaxLength + 1] = {}; + size_t rotatingIdLen = 0; + uint32_t deviceType = 0; uint16_t longDiscriminator = 0; uint16_t vendorId = 0; uint16_t productId = 0; + uint16_t pairingHint = 0; uint8_t commissioningMode = 0; - uint32_t deviceType = 0; - char deviceName[kMaxDeviceNameLen + 1] = {}; + uint8_t commissionerPasscode = 0; uint8_t rotatingId[kMaxRotatingIdLen] = {}; - size_t rotatingIdLen = 0; - uint16_t pairingHint = 0; + char instanceName[Commission::kInstanceNameMaxLength + 1] = {}; + char deviceName[kMaxDeviceNameLen + 1] = {}; char pairingInstruction[kMaxPairingInstructionLen + 1] = {}; - uint8_t commissionerPasscode = 0; CommissionNodeData() {} diff --git a/src/lib/dnssd/minimal_mdns/tests/TestAdvertiser.cpp b/src/lib/dnssd/minimal_mdns/tests/TestAdvertiser.cpp index 8f3e39c026eb6d..547d4eecf3bc54 100644 --- a/src/lib/dnssd/minimal_mdns/tests/TestAdvertiser.cpp +++ b/src/lib/dnssd/minimal_mdns/tests/TestAdvertiser.cpp @@ -80,7 +80,6 @@ OperationalAdvertisingParameters operationalParams1 = .SetMac(ByteSpan(kMac)) .SetPort(CHIP_PORT) .EnableIpV4(true) - .SetTcpSupported(chip::Optional(false)) .SetLocalMRPConfig(chip::Optional::Value( 32_ms32, 30_ms32)); // Match SII, SAI. SAT not provided so it uses default 4000ms OperationalAdvertisingParameters operationalParams2 = @@ -93,7 +92,7 @@ OperationalAdvertisingParameters operationalParams5 = OperationalAdvertisingParameters().SetPeerId(kPeerId5).SetMac(ByteSpan(kMac)).SetPort(CHIP_PORT).EnableIpV4(true); OperationalAdvertisingParameters operationalParams6 = OperationalAdvertisingParameters().SetPeerId(kPeerId6).SetMac(ByteSpan(kMac)).SetPort(CHIP_PORT).EnableIpV4(true); -const QNamePart txtOperational1Parts[] = { "SII=32", "SAI=30", "SAT=4000", "T=0" }; +const QNamePart txtOperational1Parts[] = { "SII=32", "SAI=30", "SAT=4000" }; PtrResourceRecord ptrOperationalService = PtrResourceRecord(kDnsSdQueryName, kMatterOperationalQueryName); PtrResourceRecord ptrOperational1 = PtrResourceRecord(kMatterOperationalQueryName, kInstanceName1); SrvResourceRecord srvOperational1 = SrvResourceRecord(kInstanceName1, kHostnameName, CHIP_PORT); @@ -181,14 +180,12 @@ CommissionAdvertisingParameters commissionableNodeParamsLargeEnhanced = .SetPairingInstruction(chip::Optional("Pair me")) .SetProductId(chip::Optional(897)) .SetRotatingDeviceId(chip::Optional("id_that_spins")) - .SetTcpSupported(chip::Optional(true)) - .SetICDOperatingAsLIT(chip::Optional(false)) + .SetICDModeToAdvertise(ICDModeAdvertise::kSIT) // 3600005 is more than the max so should be adjusted down .SetLocalMRPConfig(Optional::Value(3600000_ms32, 3600005_ms32, 65535_ms16)); QNamePart txtCommissionableNodeParamsLargeEnhancedParts[] = { "D=22", "VP=555+897", "CM=2", "DT=70000", "DN=testy-test", "RI=id_that_spins", "PI=Pair me", "PH=3", - "SAI=3600000", "SII=3600000", "SAT=65535", "T=1", - "ICD=0" }; + "SAI=3600000", "SII=3600000", "SAT=65535", "ICD=0" }; FullQName txtCommissionableNodeParamsLargeEnhancedName = FullQName(txtCommissionableNodeParamsLargeEnhancedParts); TxtResourceRecord txtCommissionableNodeParamsLargeEnhanced = TxtResourceRecord(instanceName, txtCommissionableNodeParamsLargeEnhancedName); @@ -207,13 +204,12 @@ CommissionAdvertisingParameters commissionableNodeParamsEnhancedAsICDLIT = .SetPairingHint(chip::Optional(3)) .SetPairingInstruction(chip::Optional("Pair me")) .SetProductId(chip::Optional(897)) - .SetTcpSupported(chip::Optional(true)) - .SetICDOperatingAsLIT(chip::Optional(true)) + .SetICDModeToAdvertise(ICDModeAdvertise::kLIT) .SetLocalMRPConfig(Optional::Value(3600000_ms32, 3600000_ms32, 65535_ms16)); // With ICD Operation as LIT, SII key will not be added to the advertisement QNamePart txtCommissionableNodeParamsEnhancedAsICDLITParts[] = { "D=22", "VP=555+897", "CM=2", "DT=70000", "DN=testy-test", "PI=Pair me", "PH=3", "SAI=3600000", - "SAT=65535", "T=1", "ICD=1" }; + "SAT=65535", "ICD=1" }; FullQName txtCommissionableNodeParamsEnhancedAsICDLITName = FullQName(txtCommissionableNodeParamsEnhancedAsICDLITParts); TxtResourceRecord txtCommissionableNodeParamsEnhancedAsICDLIT = TxtResourceRecord(instanceName, txtCommissionableNodeParamsEnhancedAsICDLITName); diff --git a/src/lib/dnssd/platform/tests/TestPlatform.cpp b/src/lib/dnssd/platform/tests/TestPlatform.cpp index 93141ca403dc6a..91a79f1efdc64a 100644 --- a/src/lib/dnssd/platform/tests/TestPlatform.cpp +++ b/src/lib/dnssd/platform/tests/TestPlatform.cpp @@ -53,8 +53,7 @@ OperationalAdvertisingParameters operationalParams2 = .SetPort(CHIP_PORT) .EnableIpV4(true) .SetLocalMRPConfig(Optional::Value(32_ms32, 30_ms32, 10_ms16)) // SII and SAI to match below - .SetTcpSupported(Optional(true)) - .SetICDOperatingAsLIT(Optional(false)); + .SetICDModeToAdvertise(ICDModeAdvertise::kSIT); test::ExpectedCall operationalCall2 = test::ExpectedCall() .SetProtocol(DnssdServiceProtocol::kDnssdProtocolTcp) .SetServiceName("_matter") @@ -64,7 +63,6 @@ test::ExpectedCall operationalCall2 = test::ExpectedCall() .AddTxt("SII", "32") .AddTxt("SAI", "30") .AddTxt("SAT", "10") - .AddTxt("T", "1") .AddTxt("ICD", "0"); CommissionAdvertisingParameters commissionableNodeParamsSmall = @@ -97,8 +95,7 @@ CommissionAdvertisingParameters commissionableNodeParamsLargeBasic = .SetPairingInstruction(Optional("Pair me")) .SetProductId(Optional(897)) .SetRotatingDeviceId(Optional("id_that_spins")) - .SetTcpSupported(Optional(true)) - .SetICDOperatingAsLIT(Optional(false)) + .SetICDModeToAdvertise(ICDModeAdvertise::kSIT) // 3600005 is over the max, so this should be adjusted by the platform .SetLocalMRPConfig(Optional::Value(3600000_ms32, 3600005_ms32, 65535_ms16)); @@ -114,7 +111,6 @@ test::ExpectedCall commissionableLargeBasic = test::ExpectedCall() .AddTxt("RI", "id_that_spins") .AddTxt("PI", "Pair me") .AddTxt("PH", "3") - .AddTxt("T", "1") .AddTxt("ICD", "0") .AddTxt("SII", "3600000") .AddTxt("SAI", "3600000") diff --git a/src/lib/shell/streamer_nxp.cpp b/src/lib/shell/streamer_nxp.cpp index b499b40c0f72e8..aed4796902942a 100644 --- a/src/lib/shell/streamer_nxp.cpp +++ b/src/lib/shell/streamer_nxp.cpp @@ -25,7 +25,6 @@ /* Includes */ /* -------------------------------------------------------------------------- */ -#include #include #include @@ -65,6 +64,25 @@ #endif #endif +// pw RPC uses UART DMA by default +#ifdef PW_RPC_ENABLED +#define CONSUMER_TASK_HANDLE RpcTaskHandle +#ifndef STREAMER_UART_USE_DMA +#define STREAMER_UART_USE_DMA 1 +#endif +#else +#define CONSUMER_TASK_HANDLE AppMatterCliTaskHandle +#ifndef STREAMER_UART_USE_DMA +#define STREAMER_UART_USE_DMA 0 +#endif +#endif // PW_RPC_ENABLED + +#if STREAMER_UART_USE_DMA +typedef serial_port_uart_dma_config_t streamer_serial_port_uart_config_t; +#else +typedef serial_port_uart_config_t streamer_serial_port_uart_config_t; +#endif + /* -------------------------------------------------------------------------- */ /* Private prototypes */ /* -------------------------------------------------------------------------- */ @@ -82,23 +100,33 @@ static SERIAL_MANAGER_READ_HANDLE_DEFINE(streamerSerialReadHandle); static volatile int txCount = 0; static bool readDone = true; -static serial_port_uart_config_t uartConfig = { .clockRate = BOARD_APP_UART_CLK_FREQ, - .baudRate = BOARD_DEBUG_UART_BAUDRATE, - .parityMode = kSerialManager_UartParityDisabled, - .stopBitCount = kSerialManager_UartOneStopBit, - .enableRx = 1, - .enableTx = 1, - .enableRxRTS = 0, - .enableTxCTS = 0, - .instance = BOARD_APP_UART_INSTANCE }; +static streamer_serial_port_uart_config_t uartConfig = { .clockRate = BOARD_APP_UART_CLK_FREQ, + .baudRate = BOARD_DEBUG_UART_BAUDRATE, + .parityMode = kSerialManager_UartParityDisabled, + .stopBitCount = kSerialManager_UartOneStopBit, + .enableRx = 1, + .enableTx = 1, + .enableRxRTS = 0, + .enableTxCTS = 0, + .instance = BOARD_APP_UART_INSTANCE, +#if STREAMER_UART_USE_DMA + .dma_instance = 0, + .rx_channel = 1, + .tx_channel = 0 +#endif +}; static uint8_t s_ringBuffer[STREAMER_UART_SERIAL_MANAGER_RING_BUFFER_SIZE]; static const serial_manager_config_t s_serialManagerConfig = { .ringBuffer = &s_ringBuffer[0], .ringBufferSize = STREAMER_UART_SERIAL_MANAGER_RING_BUFFER_SIZE, - .type = BOARD_DEBUG_UART_TYPE, - .blockType = kSerialManager_NonBlocking, - .portConfig = (serial_port_uart_config_t *) &uartConfig, +#if STREAMER_UART_USE_DMA + .type = kSerialPort_UartDma, +#else + .type = BOARD_DEBUG_UART_TYPE, +#endif + .blockType = kSerialManager_NonBlocking, + .portConfig = (serial_port_uart_config_t *) &uartConfig, }; /* -------------------------------------------------------------------------- */ @@ -107,7 +135,6 @@ static const serial_manager_config_t s_serialManagerConfig = { namespace chip { namespace Shell { -namespace { int streamer_nxp_init(streamer_t * streamer) { @@ -119,7 +146,12 @@ int streamer_nxp_init(streamer_t * streamer) BOARD_CLIAttachClk(); #endif - uartConfig.clockRate = BOARD_APP_UART_CLK_FREQ; +#if STREAMER_UART_USE_DMA + dma_channel_mux_configure_t dma_channel_mux; + dma_channel_mux.dma_dmamux_configure.dma_tx_channel_mux = kDmaRequestLPUART1Tx; + dma_channel_mux.dma_dmamux_configure.dma_rx_channel_mux = kDmaRequestLPUART1Rx; + uartConfig.dma_channel_mux_configure = &dma_channel_mux; +#endif /* * Make sure to disable interrupts while initializating the serial manager interface @@ -192,8 +224,8 @@ ssize_t streamer_nxp_write(streamer_t * streamer, const char * buffer, size_t le intMask = DisableGlobalIRQ(); txCount++; - status = - SerialManager_WriteNonBlocking((serial_write_handle_t) streamerSerialWriteHandle, (uint8_t *) buffer, (uint32_t) length); + status = SerialManager_WriteNonBlocking((serial_write_handle_t) streamerSerialWriteHandle, + (uint8_t *) (const_cast(buffer)), (uint32_t) length); EnableGlobalIRQ(intMask); if (status == kStatus_SerialManager_Success) { @@ -214,7 +246,6 @@ static streamer_t streamer_nxp = { .read_cb = streamer_nxp_read, .write_cb = streamer_nxp_write, }; -} // namespace streamer_t * streamer_get(void) { @@ -227,13 +258,14 @@ streamer_t * streamer_get(void) /* -------------------------------------------------------------------------- */ /* Private functions */ /* -------------------------------------------------------------------------- */ -extern TaskHandle_t AppMatterCliTaskHandle; +extern TaskHandle_t CONSUMER_TASK_HANDLE; + static void Uart_RxCallBack(void * pData, serial_manager_callback_message_t * message, serial_manager_status_t status) { - if (AppMatterCliTaskHandle != NULL) + if (CONSUMER_TASK_HANDLE != NULL) { /* notify the main loop that a RX buffer is available */ - xTaskNotifyGive(AppMatterCliTaskHandle); + xTaskNotifyGive(CONSUMER_TASK_HANDLE); } } diff --git a/src/lwip/BUILD.gn b/src/lwip/BUILD.gn index 755b3049174f7c..c51383a944dc80 100644 --- a/src/lwip/BUILD.gn +++ b/src/lwip/BUILD.gn @@ -30,12 +30,12 @@ if (lwip_platform == "") { assert(lwip_platform == "external" || lwip_platform == "standalone" || lwip_platform == "cc13xx_26xx" || lwip_platform == "cc32xx" || lwip_platform == "nxp" || lwip_platform == "silabs" || - lwip_platform == "k32w0" || lwip_platform == "k32w1" || - lwip_platform == "qpg" || lwip_platform == "mbed" || - lwip_platform == "psoc6" || lwip_platform == "cyw30739" || - lwip_platform == "bl602" || lwip_platform == "mw320" || - lwip_platform == "bl702" || lwip_platform == "bl702l" || - lwip_platform == "mt793x" || lwip_platform == "asr", + lwip_platform == "k32w0" || lwip_platform == "qpg" || + lwip_platform == "mbed" || lwip_platform == "psoc6" || + lwip_platform == "cyw30739" || lwip_platform == "bl602" || + lwip_platform == "mw320" || lwip_platform == "bl702" || + lwip_platform == "bl702l" || lwip_platform == "mt793x" || + lwip_platform == "asr", "Unsupported lwIP platform: ${lwip_platform}") if (lwip_platform != "external") { @@ -56,8 +56,6 @@ if (lwip_platform == "cc13xx_26xx") { import("${qpg_sdk_build_root}/qpg_sdk.gni") } else if (lwip_platform == "k32w0") { import("//build_overrides/k32w0_sdk.gni") -} else if (lwip_platform == "k32w1") { - import("//build_overrides/k32w1_sdk.gni") } else if (lwip_platform == "psoc6") { import("//build_overrides/psoc6.gni") } else if (lwip_platform == "cyw30739") { @@ -235,8 +233,6 @@ if (current_os == "zephyr" || current_os == "mbed") { public_deps += [ "${chip_root}/src/lib/support" ] } else if (lwip_platform == "k32w0") { public_deps += [ "${k32w0_sdk_build_root}:k32w0_sdk" ] - } else if (lwip_platform == "k32w1") { - public_deps += [ "${k32w1_sdk_build_root}:k32w1_sdk" ] } else if (lwip_platform == "cyw30739") { public_deps += [ "${cyw30739_sdk_build_root}:cyw30739_sdk" ] } else if (lwip_platform == "bl702") { diff --git a/src/platform/BUILD.gn b/src/platform/BUILD.gn index c6b1aae23ee40f..3c1f56da771786 100644 --- a/src/platform/BUILD.gn +++ b/src/platform/BUILD.gn @@ -214,9 +214,6 @@ if (chip_device_platform != "none" && chip_device_platform != "external") { } else if (chip_device_platform == "k32w0") { device_layer_target_define = "K32W" defines += [ "CHIP_DEVICE_LAYER_TARGET=nxp/k32w/k32w0" ] - } else if (chip_device_platform == "k32w1") { - device_layer_target_define = "K32W" - defines += [ "CHIP_DEVICE_LAYER_TARGET=nxp/k32w/k32w1" ] } else if (chip_device_platform == "nxp") { import("//build_overrides/nxp_sdk.gni") import("${nxp_sdk_build_root}/nxp_sdk.gni") @@ -537,8 +534,6 @@ if (chip_device_platform != "none") { _platform_target = "ESP32" } else if (chip_device_platform == "k32w0") { _platform_target = "nxp/k32w/k32w0" - } else if (chip_device_platform == "k32w1") { - _platform_target = "nxp/k32w/k32w1" } else if (chip_device_platform == "linux") { _platform_target = "Linux" } else if (chip_device_platform == "nrfconnect") { @@ -546,7 +541,7 @@ if (chip_device_platform != "none") { } else if (chip_device_platform == "qpg") { _platform_target = "qpg" } else if (chip_device_platform == "nxp") { - _platform_target = "nxp" + _platform_target = "nxp/${nxp_platform}:nxp_platform" } else if (chip_device_platform == "nxp_zephyr") { _platform_target = "nxp/zephyr:nxp_zephyr" } else if (chip_device_platform == "telink") { diff --git a/src/platform/Linux/BLEManagerImpl.cpp b/src/platform/Linux/BLEManagerImpl.cpp index a98a52de9721e1..83cd939dc05f0d 100644 --- a/src/platform/Linux/BLEManagerImpl.cpp +++ b/src/platform/Linux/BLEManagerImpl.cpp @@ -790,22 +790,25 @@ void BLEManagerImpl::NotifyBLEPeripheralAdvStopComplete(bool aIsSuccess, void * void BLEManagerImpl::OnDeviceScanned(BluezDevice1 & device, const chip::Ble::ChipBLEDeviceIdentificationInfo & info) { - ChipLogProgress(Ble, "New device scanned: %s", bluez_device1_get_address(&device)); + const char * address = bluez_device1_get_address(&device); + ChipLogProgress(Ble, "New device scanned: %s", address); if (mBLEScanConfig.mBleScanState == BleScanState::kScanForDiscriminator) { - if (!mBLEScanConfig.mDiscriminator.MatchesLongDiscriminator(info.GetDeviceDiscriminator())) - { - return; - } + auto isMatch = mBLEScanConfig.mDiscriminator.MatchesLongDiscriminator(info.GetDeviceDiscriminator()); + VerifyOrReturn( + isMatch, + ChipLogError(Ble, "Skip connection: Device discriminator does not match: %u != %u", info.GetDeviceDiscriminator(), + mBLEScanConfig.mDiscriminator.IsShortDiscriminator() ? mBLEScanConfig.mDiscriminator.GetShortValue() + : mBLEScanConfig.mDiscriminator.GetLongValue())); ChipLogProgress(Ble, "Device discriminator match. Attempting to connect."); } else if (mBLEScanConfig.mBleScanState == BleScanState::kScanForAddress) { - if (strcmp(bluez_device1_get_address(&device), mBLEScanConfig.mAddress.c_str()) != 0) - { - return; - } + auto isMatch = strcmp(address, mBLEScanConfig.mAddress.c_str()) == 0; + VerifyOrReturn(isMatch, + ChipLogError(Ble, "Skip connection: Device address does not match: %s != %s", address, + mBLEScanConfig.mAddress.c_str())); ChipLogProgress(Ble, "Device address match. Attempting to connect."); } else @@ -826,7 +829,10 @@ void BLEManagerImpl::OnDeviceScanned(BluezDevice1 & device, const chip::Ble::Chi DeviceLayer::SystemLayer().StartTimer(kConnectTimeout, HandleConnectTimeout, &mEndpoint); chip::DeviceLayer::PlatformMgr().UnlockChipStack(); - mEndpoint.ConnectDevice(device); + CHIP_ERROR err = mEndpoint.ConnectDevice(device); + VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Ble, "Device connection failed: %" CHIP_ERROR_FORMAT, err.Format())); + + ChipLogProgress(Ble, "New device connected: %s", address); } void BLEManagerImpl::OnScanComplete() diff --git a/src/platform/Linux/bluez/BluezEndpoint.cpp b/src/platform/Linux/bluez/BluezEndpoint.cpp index 51a418bfee384b..3baca7d127f20a 100644 --- a/src/platform/Linux/bluez/BluezEndpoint.cpp +++ b/src/platform/Linux/bluez/BluezEndpoint.cpp @@ -50,6 +50,7 @@ #include #include #include +#include #include #include @@ -694,8 +695,6 @@ void BluezEndpoint::Shutdown() g_object_unref(self->mpObjMgr); if (self->mpAdapter != nullptr) g_object_unref(self->mpAdapter); - if (self->mpDevice != nullptr) - g_object_unref(self->mpDevice); if (self->mpRoot != nullptr) g_object_unref(self->mpRoot); if (self->mpService != nullptr) @@ -720,61 +719,42 @@ void BluezEndpoint::Shutdown() // ConnectDevice callbacks -void BluezEndpoint::ConnectDeviceDone(GObject * aObject, GAsyncResult * aResult, gpointer apParams) +CHIP_ERROR BluezEndpoint::ConnectDeviceImpl(BluezDevice1 & aDevice) { - BluezDevice1 * device = BLUEZ_DEVICE1(aObject); - ConnectParams * params = static_cast(apParams); - GAutoPtr error; - - if (!bluez_device1_call_connect_finish(device, aResult, &MakeUniquePointerReceiver(error).Get())) + // Due to radio interferences or Wi-Fi coexistence, sometimes the BLE connection may not be + // established (e.g. Connection Indication Packet is missed by BLE peripheral). In such case, + // BlueZ returns "Software caused connection abort error", and we should make a connection retry. + // It's important to make sure that the connection is correctly ceased, by calling `Disconnect()` + // D-Bus method, or else `Connect()` returns immediately without any effect. + for (uint16_t i = 0; i < kMaxConnectRetries; i++) { - ChipLogError(DeviceLayer, "FAIL: ConnectDevice : %s (%d)", error->message, error->code); - - // Due to radio interferences or Wi-Fi coexistence, sometimes the BLE connection may not be - // established (e.g. Connection Indication Packet is missed by BLE peripheral). In such case, - // BlueZ returns "Software caused connection abort error", and we should make a connection retry. - // It's important to make sure that the connection is correctly ceased, by calling `Disconnect()` - // D-Bus method, or else `Connect()` returns immediately without any effect. - if (g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_DBUS_ERROR) && params->mNumRetries++ < kMaxConnectRetries) + GAutoPtr error; + if (bluez_device1_call_connect_sync(&aDevice, mConnectCancellable.get(), &MakeUniquePointerReceiver(error).Get())) { - // Clear the error before usage in subsequent call. - g_clear_error(&MakeUniquePointerReceiver(error).Get()); + ChipLogDetail(DeviceLayer, "ConnectDevice complete"); + return CHIP_NO_ERROR; + } - bluez_device1_call_disconnect_sync(device, nullptr, &MakeUniquePointerReceiver(error).Get()); - bluez_device1_call_connect(device, params->mEndpoint.mConnectCancellable.get(), ConnectDeviceDone, params); - return; + ChipLogError(DeviceLayer, "FAIL: ConnectDevice: %s (%d)", error->message, error->code); + if (!g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_DBUS_ERROR)) + { + break; } - BLEManagerImpl::HandleConnectFailed(CHIP_ERROR_INTERNAL); - } - else - { - ChipLogDetail(DeviceLayer, "ConnectDevice complete"); + ChipLogProgress(DeviceLayer, "ConnectDevice retry: %u out of %u", i + 1, kMaxConnectRetries); + bluez_device1_call_disconnect_sync(&aDevice, nullptr, nullptr); } - chip::Platform::Delete(params); -} - -CHIP_ERROR BluezEndpoint::ConnectDeviceImpl(ConnectParams * apParams) -{ - bluez_device1_call_connect(apParams->mpDevice, apParams->mEndpoint.mConnectCancellable.get(), ConnectDeviceDone, apParams); - return CHIP_NO_ERROR; + BLEManagerImpl::HandleConnectFailed(CHIP_ERROR_INTERNAL); + return CHIP_ERROR_INTERNAL; } CHIP_ERROR BluezEndpoint::ConnectDevice(BluezDevice1 & aDevice) { - auto params = chip::Platform::New(*this, &aDevice); - VerifyOrReturnError(params != nullptr, CHIP_ERROR_NO_MEMORY); - + auto params = std::make_pair(this, &aDevice); mConnectCancellable.reset(g_cancellable_new()); - if (PlatformMgrImpl().GLibMatterContextInvokeSync(ConnectDeviceImpl, params) != CHIP_NO_ERROR) - { - ChipLogError(Ble, "Failed to schedule ConnectDeviceImpl() on CHIPoBluez thread"); - chip::Platform::Delete(params); - return CHIP_ERROR_INCORRECT_STATE; - } - - return CHIP_NO_ERROR; + return PlatformMgrImpl().GLibMatterContextInvokeSync( + +[](typeof(params) * aParams) { return aParams->first->ConnectDeviceImpl(*aParams->second); }, ¶ms); } void BluezEndpoint::CancelConnect() diff --git a/src/platform/Linux/bluez/BluezEndpoint.h b/src/platform/Linux/bluez/BluezEndpoint.h index 772b503efd300a..115731d665d4ba 100644 --- a/src/platform/Linux/bluez/BluezEndpoint.h +++ b/src/platform/Linux/bluez/BluezEndpoint.h @@ -83,16 +83,6 @@ class BluezEndpoint void CancelConnect(); private: - struct ConnectParams - { - ConnectParams(const BluezEndpoint & aEndpoint, BluezDevice1 * apDevice) : mEndpoint(aEndpoint), mpDevice(apDevice) {} - ~ConnectParams() = default; - - const BluezEndpoint & mEndpoint; - BluezDevice1 * mpDevice; - uint16_t mNumRetries = 0; - }; - CHIP_ERROR StartupEndpointBindings(); void SetupAdapter(); @@ -122,8 +112,7 @@ class BluezEndpoint void RegisterGattApplicationDone(GObject * aObject, GAsyncResult * aResult); CHIP_ERROR RegisterGattApplicationImpl(); - static void ConnectDeviceDone(GObject * aObject, GAsyncResult * aResult, gpointer apParams); - static CHIP_ERROR ConnectDeviceImpl(ConnectParams * apParams); + CHIP_ERROR ConnectDeviceImpl(BluezDevice1 & aDevice); bool mIsCentral = false; bool mIsInitialized = false; @@ -139,7 +128,6 @@ class BluezEndpoint // Objects (interfaces) subscribed to by this service GDBusObjectManager * mpObjMgr = nullptr; BluezAdapter1 * mpAdapter = nullptr; - BluezDevice1 * mpDevice = nullptr; // Objects (interfaces) published by this service GDBusObjectManagerServer * mpRoot = nullptr; diff --git a/src/platform/Tizen/BLEManagerImpl.cpp b/src/platform/Tizen/BLEManagerImpl.cpp index a759b4ecb72e75..0a1a9468d00b06 100644 --- a/src/platform/Tizen/BLEManagerImpl.cpp +++ b/src/platform/Tizen/BLEManagerImpl.cpp @@ -542,10 +542,7 @@ void BLEManagerImpl::OnChipDeviceScanned(void * device, const Ble::ChipBLEDevice /* Initiate Connect */ auto params = std::make_pair(this, deviceInfo->remote_address); PlatformMgrImpl().GLibMatterContextInvokeSync( - +[](typeof(params) * aParams) { - return reinterpret_cast(aParams->first)->ConnectChipThing(aParams->second); - }, - ¶ms); + +[](typeof(params) * aParams) { return aParams->first->ConnectChipThing(aParams->second); }, ¶ms); } void BLEManagerImpl::OnScanComplete() diff --git a/src/platform/device.gni b/src/platform/device.gni index aa81c50e4a5fcc..933b730186ec85 100644 --- a/src/platform/device.gni +++ b/src/platform/device.gni @@ -16,7 +16,7 @@ import("//build_overrides/chip.gni") import("${chip_root}/src/ble/ble.gni") declare_args() { - # Device platform layer: cc13x2_26x2, cc13x4_26x4, cc32xx, darwin, efr32, esp32, external, freertos, linux, nrfconnect, k32w0, k32w1, qpg, tizen, cyw30739, bl602, mw320, zephyr, beken, openiotsdk, none. + # Device platform layer: cc13x2_26x2, cc13x4_26x4, cc32xx, darwin, efr32, esp32, external, freertos, linux, nrfconnect, k32w0, nxp, qpg, tizen, cyw30739, bl602, mw320, zephyr, beken, openiotsdk, none. chip_device_platform = "auto" chip_platform_target = "" @@ -51,9 +51,8 @@ declare_args() { chip_device_platform == "linux" || chip_device_platform == "qpg" || chip_device_platform == "cc13x2_26x2" || chip_device_platform == "cc13x4_26x4" || - chip_device_platform == "k32w0" || chip_device_platform == "k32w1" || - chip_device_platform == "tizen" || chip_device_platform == "stm32" || - chip_device_platform == "webos" + chip_device_platform == "k32w0" || chip_device_platform == "tizen" || + chip_device_platform == "stm32" || chip_device_platform == "webos" } declare_args() { @@ -152,8 +151,6 @@ if (chip_device_platform == "cc13x2_26x2") { _chip_device_layer = "qpg" } else if (chip_device_platform == "k32w0") { _chip_device_layer = "nxp/k32w/k32w0" -} else if (chip_device_platform == "k32w1") { - _chip_device_layer = "nxp/k32w/k32w1" } else if (chip_device_platform == "nxp") { import("//build_overrides/nxp_sdk.gni") import("${nxp_sdk_build_root}/nxp_sdk.gni") @@ -255,7 +252,7 @@ assert( chip_device_platform == "external" || chip_device_platform == "linux" || chip_device_platform == "tizen" || chip_device_platform == "nrfconnect" || chip_device_platform == "nxp" || - chip_device_platform == "k32w0" || chip_device_platform == "k32w1" || + chip_device_platform == "k32w0" || chip_device_platform == "nxp_zephyr" || chip_device_platform == "qpg" || chip_device_platform == "telink" || chip_device_platform == "mbed" || chip_device_platform == "psoc6" || chip_device_platform == "android" || diff --git a/src/platform/nxp/k32w/common/BLEManagerCommon.cpp b/src/platform/nxp/k32w/common/BLEManagerCommon.cpp index d6aa5f2e939251..40f9bc5c7d7abf 100644 --- a/src/platform/nxp/k32w/common/BLEManagerCommon.cpp +++ b/src/platform/nxp/k32w/common/BLEManagerCommon.cpp @@ -949,7 +949,7 @@ void BLEManagerCommon::HandleConnectionCloseEvent(blekw_msg_t * msg) mDeviceConnected = false; ChipDeviceEvent event; - event.Type = DeviceEventType::kCHIPoBLEConnectionError; + event.Type = DeviceEventType::kCHIPoBLEConnectionClosed; event.CHIPoBLEConnectionError.ConId = deviceId; event.CHIPoBLEConnectionError.Reason = BLE_ERROR_REMOTE_DEVICE_DISCONNECTED; diff --git a/src/platform/nxp/k32w/common/BLEManagerCommon.h b/src/platform/nxp/k32w/common/BLEManagerCommon.h index 32ccdd762cdea4..628d9b5324aa46 100644 --- a/src/platform/nxp/k32w/common/BLEManagerCommon.h +++ b/src/platform/nxp/k32w/common/BLEManagerCommon.h @@ -233,6 +233,7 @@ class BLEManagerCommon : public BLEManager, protected BleLayer, private BlePlatf public: virtual CHIP_ERROR InitHostController(BLECallbackDelegate::GapGenericCallback cb_fp) = 0; virtual BLEManagerCommon * GetImplInstance() = 0; + virtual CHIP_ERROR ResetController() { return CHIP_NO_ERROR; } void DoBleProcessing(void); BLECallbackDelegate callbackDelegate; diff --git a/src/platform/nxp/k32w/common/OTAImageProcessorImpl.cpp b/src/platform/nxp/k32w/common/OTAImageProcessorImpl.cpp index 946c0c37f83d87..591d082ea992f7 100644 --- a/src/platform/nxp/k32w/common/OTAImageProcessorImpl.cpp +++ b/src/platform/nxp/k32w/common/OTAImageProcessorImpl.cpp @@ -308,7 +308,7 @@ CHIP_ERROR OTAImageProcessorImpl::ConfirmCurrentImage() CHIP_ERROR OTAImageProcessorImpl::SetBlock(ByteSpan & block) { - if (block.empty()) + if (!IsSpanUsable(block)) { return CHIP_NO_ERROR; } diff --git a/src/platform/nxp/k32w/common/OTATlvProcessor.h b/src/platform/nxp/k32w/common/OTATlvProcessor.h index 13a2df115d90d9..65d1d68830f2b8 100644 --- a/src/platform/nxp/k32w/common/OTATlvProcessor.h +++ b/src/platform/nxp/k32w/common/OTATlvProcessor.h @@ -43,10 +43,10 @@ namespace chip { #define CHIP_OTA_PROCESSOR_START_IMAGE CHIP_ERROR_TLV_PROCESSOR(0x0E) // Descriptor constants -inline constexpr size_t kVersionStringSize = 64; -inline constexpr size_t kBuildDateSize = 64; +constexpr size_t kVersionStringSize = 64; +constexpr size_t kBuildDateSize = 64; -inline constexpr uint16_t requestedOtaMaxBlockSize = 1024; +constexpr uint16_t requestedOtaMaxBlockSize = 1024; /** * Used alongside RegisterDescriptorCallback to register diff --git a/src/platform/nxp/k32w/k32w0/CHIPDevicePlatformConfig.h b/src/platform/nxp/k32w/k32w0/CHIPDevicePlatformConfig.h index 0c849ccc4989aa..a584e0c79afbbb 100644 --- a/src/platform/nxp/k32w/k32w0/CHIPDevicePlatformConfig.h +++ b/src/platform/nxp/k32w/k32w0/CHIPDevicePlatformConfig.h @@ -47,6 +47,8 @@ #define CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID_LENGTH 32 #endif +#define CHIP_ADDRESS_RESOLVE_IMPL_INCLUDE_HEADER + // ========== Platform-specific Configuration ========= // These are configuration options that are unique to the K32W platform. diff --git a/src/platform/nxp/k32w/k32w1/BLEManagerImpl.cpp b/src/platform/nxp/k32w/k32w1/BLEManagerImpl.cpp index 95a69b717c4af0..88d5c00400193c 100644 --- a/src/platform/nxp/k32w/k32w1/BLEManagerImpl.cpp +++ b/src/platform/nxp/k32w/k32w1/BLEManagerImpl.cpp @@ -30,6 +30,8 @@ OSA_EVENT_HANDLE_DEFINE(gHost_TaskEvent); #include +extern "C" bleResult_t Hci_Reset(void); + namespace chip { namespace DeviceLayer { namespace Internal { @@ -45,6 +47,8 @@ CHIP_ERROR BLEManagerImpl::InitHostController(BLECallbackDelegate::GapGenericCal { CHIP_ERROR err = CHIP_NO_ERROR; + VerifyOrExit(PLATFORM_InitTimerManager() >= 0, err = CHIP_ERROR_INCORRECT_STATE); + PLATFORM_InitBle(); (void) RNG_Init(); @@ -73,6 +77,21 @@ CHIP_ERROR BLEManagerImpl::InitHostController(BLECallbackDelegate::GapGenericCal return err; } +CHIP_ERROR BLEManagerImpl::ResetController() +{ + bleResult_t res = Hci_Reset(); + if (res != gBleSuccess_c) + { + ChipLogProgress(DeviceLayer, "Failed to reset controller %d", res); + return CHIP_ERROR_INTERNAL; + } + + /* Wait for function to complete */ + PLATFORM_Delay(HCI_RESET_WAIT_TIME_US); + + return CHIP_NO_ERROR; +} + void BLEManagerImpl::Host_Task(osaTaskParam_t argument) { Host_TaskHandler((void *) NULL); diff --git a/src/platform/nxp/k32w/k32w1/BLEManagerImpl.h b/src/platform/nxp/k32w/k32w1/BLEManagerImpl.h index bef927c8275350..59bda33db0051f 100644 --- a/src/platform/nxp/k32w/k32w1/BLEManagerImpl.h +++ b/src/platform/nxp/k32w/k32w1/BLEManagerImpl.h @@ -23,6 +23,7 @@ #include "RNG_Interface.h" #include "fwk_messaging.h" #include "fwk_os_abs.h" +#include "fwk_platform.h" #include "fwk_platform_ble.h" #include "hci_transport.h" @@ -36,6 +37,10 @@ #define HOST_TASK_PRIORITY (4U) #define HOST_TASK_STACK_SIZE (gHost_TaskStackSize_c / sizeof(StackType_t)) +#ifndef HCI_RESET_WAIT_TIME_US +#define HCI_RESET_WAIT_TIME_US 30000 +#endif + namespace chip { namespace DeviceLayer { namespace Internal { @@ -51,6 +56,7 @@ class BLEManagerImpl final : public BLEManagerCommon CHIP_ERROR InitHostController(BLECallbackDelegate::GapGenericCallback cb_fp) override; BLEManagerCommon * GetImplInstance() override; + CHIP_ERROR ResetController() override; private: static BLEManagerImpl sInstance; diff --git a/src/platform/nxp/k32w/k32w1/BUILD.gn b/src/platform/nxp/k32w/k32w1/BUILD.gn index 8ad11928178bb7..bb3e74dc034527 100644 --- a/src/platform/nxp/k32w/k32w1/BUILD.gn +++ b/src/platform/nxp/k32w/k32w1/BUILD.gn @@ -13,12 +13,13 @@ # limitations under the License. import("//build_overrides/chip.gni") -import("//build_overrides/k32w1_sdk.gni") +import("//build_overrides/nxp_sdk.gni") import("${chip_root}/src/crypto/crypto.gni") import("${chip_root}/src/platform/device.gni") -import("${k32w1_sdk_build_root}/k32w1_sdk.gni") +import("${nxp_sdk_build_root}/${nxp_sdk_name}/${nxp_sdk_name}.gni") -assert(chip_device_platform == "k32w1") +assert(chip_device_platform == "nxp") +assert(nxp_platform == "k32w/k32w1") if (chip_enable_openthread) { import("//build_overrides/openthread.gni") @@ -28,7 +29,7 @@ if (chip_crypto == "platform") { import("//build_overrides/mbedtls.gni") } -static_library("k32w1") { +static_library("nxp_platform") { sources = [ "../../../SingletonConfigurationManager.cpp", "../common/BLEManagerCommon.cpp", @@ -58,7 +59,15 @@ static_library("k32w1") { "ram_storage.h", ] - public = [ "${chip_root}/src/platform/nxp/k32w/k32w1/BLEManagerImpl.h" ] + public = [ + "${chip_root}/src/credentials/DeviceAttestationCredsProvider.h", + "${chip_root}/src/credentials/examples/DeviceAttestationCredsExample.h", + "${chip_root}/src/credentials/examples/ExampleDACs.h", + "${chip_root}/src/credentials/examples/ExamplePAI.h", + "${chip_root}/src/platform/nxp/k32w/k32w1/BLEManagerImpl.h", + "${chip_root}/src/platform/nxp/k32w/k32w1/BLEManagerImpl.h", + "${chip_root}/src/platform/nxp/k32w/k32w1/SMU2Manager.h", + ] public_deps = [ "${chip_root}/src/platform:platform_base" ] @@ -87,10 +96,25 @@ static_library("k32w1") { "K32W1PersistentStorageOpKeystore.h", ] + if (chip_with_factory_data == 1) { + sources += [ + "../common/FactoryDataProvider.cpp", + "FactoryDataProviderImpl.cpp", + ] + public += [ + "${chip_root}/src/credentials/CHIPCert.h", + "${chip_root}/src/credentials/CertificationDeclaration.h", + ] + + if (chip_convert_dac_private_key == 1) { + defines = [ "CHIP_DEVICE_CONFIG_SECURE_DAC_PRIVATE_KEY=1" ] + } + } + public_deps += [ "${mbedtls_root}:mbedtls" ] } - deps = [ "${chip_root}/src/platform/logging:headers" ] + deps = [] if (chip_enable_openthread) { sources += [ @@ -107,7 +131,17 @@ static_library("k32w1") { ] deps += [ "${chip_root}/src/lib/dnssd:platform_header" ] } + + if (use_smu2_dynamic) { + sources += [ + "SMU2Manager.cpp", + "SMU2Manager.h", + ] + } } - public_deps += [ "${chip_root}/src/crypto" ] + public_deps += [ + "${chip_root}/src/crypto", + "${chip_root}/src/platform/logging:headers", + ] } diff --git a/src/platform/nxp/k32w/k32w1/CHIPCryptoPalK32W1.cpp b/src/platform/nxp/k32w/k32w1/CHIPCryptoPalK32W1.cpp index f10198b9b955c3..5eab6bb0c8c706 100644 --- a/src/platform/nxp/k32w/k32w1/CHIPCryptoPalK32W1.cpp +++ b/src/platform/nxp/k32w/k32w1/CHIPCryptoPalK32W1.cpp @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include @@ -55,8 +54,10 @@ #include -#include "SecLib_ecp256.h" #include "sss_crypto.h" +extern "C" { +#include "SecLib.h" +} namespace chip { namespace Crypto { @@ -82,10 +83,10 @@ typedef struct bool mInitialized; bool mDRBGSeeded; mbedtls_ctr_drbg_context mDRBGCtxt; - mbedtls_entropy_context mEntropy; -} EntropyContext; + entropy_source fn_source; +} DRBGContext; -static EntropyContext gsEntropyContext; +static DRBGContext gsDrbgContext; static void _log_mbedTLS_error(int error_code) { @@ -141,19 +142,32 @@ CHIP_ERROR AES_CCM_encrypt(const uint8_t * plaintext, size_t plaintext_length, c { VerifyOrExit(aad != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT); } - - // Size of key is expressed in bits, hence the multiplication by 8. - result = mbedtls_ccm_setkey(&context, MBEDTLS_CIPHER_ID_AES, key.As(), - sizeof(Symmetric128BitsKeyByteArray) * 8); - VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL); - - // Encrypt - result = mbedtls_ccm_encrypt_and_tag(&context, plaintext_length, Uint8::to_const_uchar(nonce), nonce_length, - Uint8::to_const_uchar(aad), aad_length, Uint8::to_const_uchar(plaintext), - Uint8::to_uchar(ciphertext), Uint8::to_uchar(tag), tag_length); - _log_mbedTLS_error(result); - VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL); - +#if defined(USE_HW_AES) + if (!aad_length) + { +#endif + // Size of key is expressed in bits, hence the multiplication by 8. + result = mbedtls_ccm_setkey(&context, MBEDTLS_CIPHER_ID_AES, key.As(), + sizeof(Symmetric128BitsKeyByteArray) * 8); + VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL); + + // Encrypt + result = mbedtls_ccm_encrypt_and_tag(&context, plaintext_length, Uint8::to_const_uchar(nonce), nonce_length, + Uint8::to_const_uchar(aad), aad_length, Uint8::to_const_uchar(plaintext), + Uint8::to_uchar(ciphertext), Uint8::to_uchar(tag), tag_length); + _log_mbedTLS_error(result); + VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL); +#if defined(USE_HW_AES) + } + else + { + // Encrypt + result = AES_128_CCM(Uint8::to_const_uchar(plaintext), plaintext_length, Uint8::to_const_uchar(aad), aad_length, + Uint8::to_const_uchar(nonce), nonce_length, key.As(), ciphertext, tag, + tag_length, gSecLib_CCM_Encrypt_c); + VerifyOrExit(result == kStatus_Success, error = CHIP_ERROR_INTERNAL); + } +#endif exit: mbedtls_ccm_free(&context); return error; @@ -179,19 +193,32 @@ CHIP_ERROR AES_CCM_decrypt(const uint8_t * ciphertext, size_t ciphertext_len, co { VerifyOrExit(aad != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT); } - - // Size of key is expressed in bits, hence the multiplication by 8. - result = mbedtls_ccm_setkey(&context, MBEDTLS_CIPHER_ID_AES, key.As(), - sizeof(Symmetric128BitsKeyByteArray) * 8); - VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL); - - // Decrypt - result = mbedtls_ccm_auth_decrypt(&context, ciphertext_len, Uint8::to_const_uchar(nonce), nonce_length, - Uint8::to_const_uchar(aad), aad_len, Uint8::to_const_uchar(ciphertext), - Uint8::to_uchar(plaintext), Uint8::to_const_uchar(tag), tag_length); - _log_mbedTLS_error(result); - VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL); - +#if defined(USE_HW_AES) + if (!aad_len) + { +#endif + // Size of key is expressed in bits, hence the multiplication by 8. + result = mbedtls_ccm_setkey(&context, MBEDTLS_CIPHER_ID_AES, key.As(), + sizeof(Symmetric128BitsKeyByteArray) * 8); + VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL); + + // Decrypt + result = mbedtls_ccm_auth_decrypt(&context, ciphertext_len, Uint8::to_const_uchar(nonce), nonce_length, + Uint8::to_const_uchar(aad), aad_len, Uint8::to_const_uchar(ciphertext), + Uint8::to_uchar(plaintext), Uint8::to_const_uchar(tag), tag_length); + _log_mbedTLS_error(result); + VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL); +#if defined(USE_HW_AES) + } + else + { + // Decrypt + result = AES_128_CCM(Uint8::to_const_uchar(ciphertext), ciphertext_len, Uint8::to_const_uchar(aad), aad_len, + Uint8::to_const_uchar(nonce), nonce_length, key.As(), plaintext, + (uint8_t *) tag, tag_length, gSecLib_CCM_Decrypt_c); + VerifyOrExit(result == kStatus_Success, error = CHIP_ERROR_INTERNAL); + } +#endif exit: mbedtls_ccm_free(&context); return error; @@ -203,6 +230,9 @@ CHIP_ERROR Hash_SHA256(const uint8_t * data, const size_t data_length, uint8_t * VerifyOrReturnError(data != nullptr, CHIP_ERROR_INVALID_ARGUMENT); VerifyOrReturnError(out_buffer != nullptr, CHIP_ERROR_INVALID_ARGUMENT); +#if defined(USE_HW_SHA256) + SHA256_Hash(Uint8::to_const_uchar(data), data_length, Uint8::to_uchar(out_buffer)); +#else #if (MBEDTLS_VERSION_NUMBER >= 0x03000000) const int result = mbedtls_sha256(Uint8::to_const_uchar(data), data_length, Uint8::to_uchar(out_buffer), 0); #else @@ -210,6 +240,7 @@ CHIP_ERROR Hash_SHA256(const uint8_t * data, const size_t data_length, uint8_t * #endif VerifyOrReturnError(result == 0, CHIP_ERROR_INTERNAL); +#endif return CHIP_NO_ERROR; } @@ -230,6 +261,36 @@ CHIP_ERROR Hash_SHA1(const uint8_t * data, const size_t data_length, uint8_t * o return CHIP_NO_ERROR; } +#if defined(USE_HW_SHA256) +/* + * These structures are used to save the intermediate + * non-hashed data on heap (in a linked list) + * and compute the hash on demand. + * This solution bypases the sha256 context save/restore + * S200 limitation. + * */ +typedef struct sha256_node +{ + uint8_t * data; + uint16_t size; + sha256_node * next; +} sha256_node; + +typedef struct S200_context +{ + void * sss_context; + sha256_node * head; + sha256_node * tail; +} S200_context; + +static_assert(kMAX_Hash_SHA256_Context_Size >= sizeof(S200_context), + "kMAX_Hash_SHA256_Context_Size is too small for the size of underlying mbedtls_sha256_context"); + +static inline S200_context * to_inner_hash_sha256_context(HashSHA256OpaqueContext * context) +{ + return SafePointerCast(context); +} +#else static_assert(kMAX_Hash_SHA256_Context_Size >= sizeof(mbedtls_sha256_context), "kMAX_Hash_SHA256_Context_Size is too small for the size of underlying mbedtls_sha256_context"); @@ -237,52 +298,120 @@ static inline mbedtls_sha256_context * to_inner_hash_sha256_context(HashSHA256Op { return SafePointerCast(context); } +#endif Hash_SHA256_stream::Hash_SHA256_stream(void) { +#if defined(USE_HW_SHA256) + S200_context * context = to_inner_hash_sha256_context(&mContext); + + context->sss_context = nullptr; + context->head = nullptr; + context->tail = nullptr; +#else mbedtls_sha256_context * context = to_inner_hash_sha256_context(&mContext); mbedtls_sha256_init(context); +#endif } Hash_SHA256_stream::~Hash_SHA256_stream(void) { +#if defined(USE_HW_SHA256) + S200_context * context = to_inner_hash_sha256_context(&mContext); + + context->sss_context = nullptr; + context->head = nullptr; + context->tail = nullptr; +#else mbedtls_sha256_context * context = to_inner_hash_sha256_context(&mContext); mbedtls_sha256_free(context); +#endif Clear(); } CHIP_ERROR Hash_SHA256_stream::Begin(void) { +#if defined(USE_HW_SHA256) + S200_context * context = to_inner_hash_sha256_context(&mContext); + context->sss_context = SHA256_AllocCtx(); + + SHA256_Init(context->sss_context); +#else mbedtls_sha256_context * const context = to_inner_hash_sha256_context(&mContext); #if (MBEDTLS_VERSION_NUMBER >= 0x03000000) - const int result = mbedtls_sha256_starts(context, 0); + const int result = mbedtls_sha256_starts(context, 0); #else const int result = mbedtls_sha256_starts_ret(context, 0); #endif VerifyOrReturnError(result == 0, CHIP_ERROR_INTERNAL); +#endif return CHIP_NO_ERROR; } CHIP_ERROR Hash_SHA256_stream::AddData(const ByteSpan data) { +#if defined(USE_HW_SHA256) + S200_context * context = to_inner_hash_sha256_context(&mContext); + sha256_node * node = nullptr; + + VerifyOrReturnError(context->sss_context != nullptr, CHIP_ERROR_INVALID_ARGUMENT); + + SHA256_HashUpdate(context->sss_context, Uint8::to_const_uchar(data.data()), data.size()); + + node = (sha256_node *) malloc(sizeof(sha256_node)); + node->size = data.size(); + node->data = (uint8_t *) malloc(data.size()); + node->next = nullptr; + memcpy(node->data, Uint8::to_const_uchar(data.data()), node->size); + + if (context->head == nullptr) + { + context->head = node; + context->tail = node; + } + else + { + context->tail->next = node; + } +#else mbedtls_sha256_context * const context = to_inner_hash_sha256_context(&mContext); #if (MBEDTLS_VERSION_NUMBER >= 0x03000000) - const int result = mbedtls_sha256_update(context, Uint8::to_const_uchar(data.data()), data.size()); + const int result = mbedtls_sha256_update(context, Uint8::to_const_uchar(data.data()), data.size()); #else const int result = mbedtls_sha256_update_ret(context, Uint8::to_const_uchar(data.data()), data.size()); #endif VerifyOrReturnError(result == 0, CHIP_ERROR_INTERNAL); +#endif return CHIP_NO_ERROR; } CHIP_ERROR Hash_SHA256_stream::GetDigest(MutableByteSpan & out_buffer) { + CHIP_ERROR result = CHIP_NO_ERROR; + +#if defined(USE_HW_SHA256) + S200_context * context = to_inner_hash_sha256_context(&mContext); + sha256_node * node = context->head; + void * ctx = SHA256_AllocCtx(); + + SHA256_Init(ctx); + + while (node) + { + SHA256_HashUpdate(ctx, node->data, node->size); + node = node->next; + } + + SHA256_HashFinish(ctx, Uint8::to_uchar(out_buffer.data())); + + SHA256_FreeCtx(ctx); +#else mbedtls_sha256_context * context = to_inner_hash_sha256_context(&mContext); // Back-up context as we are about to finalize the hash to extract digest. @@ -291,28 +420,46 @@ CHIP_ERROR Hash_SHA256_stream::GetDigest(MutableByteSpan & out_buffer) mbedtls_sha256_clone(&previous_ctx, context); // Pad + compute digest, then finalize context. It is restored next line to continue. - CHIP_ERROR result = Finish(out_buffer); + result = Finish(out_buffer); // Restore context prior to finalization. mbedtls_sha256_clone(context, &previous_ctx); mbedtls_sha256_free(&previous_ctx); +#endif return result; } CHIP_ERROR Hash_SHA256_stream::Finish(MutableByteSpan & out_buffer) { +#if defined(USE_HW_SHA256) + S200_context * context = to_inner_hash_sha256_context(&mContext); + + sha256_node * node = nullptr; + + SHA256_HashFinish(context->sss_context, Uint8::to_uchar(out_buffer.data())); + SHA256_FreeCtx(context->sss_context); + + while (context->head) + { + node = context->head; + context->head = context->head->next; + free(node->data); + free(node); + } +#else VerifyOrReturnError(out_buffer.size() >= kSHA256_Hash_Length, CHIP_ERROR_BUFFER_TOO_SMALL); mbedtls_sha256_context * const context = to_inner_hash_sha256_context(&mContext); #if (MBEDTLS_VERSION_NUMBER >= 0x03000000) - const int result = mbedtls_sha256_finish(context, Uint8::to_uchar(out_buffer.data())); + const int result = mbedtls_sha256_finish(context, Uint8::to_uchar(out_buffer.data())); #else const int result = mbedtls_sha256_finish_ret(context, Uint8::to_uchar(out_buffer.data())); #endif VerifyOrReturnError(result == 0, CHIP_ERROR_INTERNAL); - out_buffer = out_buffer.SubSpan(0, kSHA256_Hash_Length); + out_buffer = out_buffer.SubSpan(0, kSHA256_Hash_Length); +#endif return CHIP_NO_ERROR; } @@ -360,6 +507,10 @@ CHIP_ERROR HMAC_sha::HMAC_SHA256(const uint8_t * key, size_t key_length, const u VerifyOrReturnError(out_length >= kSHA256_Hash_Length, CHIP_ERROR_INVALID_ARGUMENT); VerifyOrReturnError(out_buffer != nullptr, CHIP_ERROR_INVALID_ARGUMENT); +#if defined(USE_HW_SHA256) + ::HMAC_SHA256(Uint8::to_const_uchar(key), (uint32_t) key_length, Uint8::to_const_uchar(message), (uint32_t) message_length, + out_buffer); +#else const mbedtls_md_info_t * const md = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256); VerifyOrReturnError(md != nullptr, CHIP_ERROR_INTERNAL); @@ -368,6 +519,7 @@ CHIP_ERROR HMAC_sha::HMAC_SHA256(const uint8_t * key, size_t key_length, const u _log_mbedTLS_error(result); VerifyOrReturnError(result == 0, CHIP_ERROR_INTERNAL); +#endif return CHIP_NO_ERROR; } @@ -423,50 +575,47 @@ CHIP_ERROR PBKDF2_sha256::pbkdf2_sha256(const uint8_t * password, size_t plen, c return error; } -static EntropyContext * get_entropy_context() +static int strong_entropy_func(void * data, uint8_t * output, size_t len) { - if (!gsEntropyContext.mInitialized) - { - mbedtls_entropy_init(&gsEntropyContext.mEntropy); - mbedtls_ctr_drbg_init(&gsEntropyContext.mDRBGCtxt); + int result = -1; + size_t olen; - gsEntropyContext.mInitialized = true; + if (gsDrbgContext.fn_source) + { + result = gsDrbgContext.fn_source(data, output, len, &olen); } - - return &gsEntropyContext; + return result; } static mbedtls_ctr_drbg_context * get_drbg_context() { - EntropyContext * const context = get_entropy_context(); + if (!gsDrbgContext.mInitialized) + { + mbedtls_ctr_drbg_init(&gsDrbgContext.mDRBGCtxt); - mbedtls_ctr_drbg_context * const drbgCtxt = &context->mDRBGCtxt; + gsDrbgContext.mInitialized = true; + } - if (!context->mDRBGSeeded) + if (!gsDrbgContext.mDRBGSeeded) { - const int status = mbedtls_ctr_drbg_seed(drbgCtxt, mbedtls_entropy_func, &context->mEntropy, nullptr, 0); + const int status = mbedtls_ctr_drbg_seed(&gsDrbgContext.mDRBGCtxt, strong_entropy_func, nullptr, nullptr, 0); if (status != 0) { _log_mbedTLS_error(status); return nullptr; } - context->mDRBGSeeded = true; + gsDrbgContext.mDRBGSeeded = true; } - return drbgCtxt; + return &gsDrbgContext.mDRBGCtxt; } CHIP_ERROR add_entropy_source(entropy_source fn_source, void * p_source, size_t threshold) { VerifyOrReturnError(fn_source != nullptr, CHIP_ERROR_INVALID_ARGUMENT); + gsDrbgContext.fn_source = fn_source; - EntropyContext * const entropy_ctxt = get_entropy_context(); - VerifyOrReturnError(entropy_ctxt != nullptr, CHIP_ERROR_INTERNAL); - - const int result = - mbedtls_entropy_add_source(&entropy_ctxt->mEntropy, fn_source, p_source, threshold, MBEDTLS_ENTROPY_SOURCE_STRONG); - VerifyOrReturnError(result == 0, CHIP_ERROR_INTERNAL); return CHIP_NO_ERROR; } @@ -774,6 +923,7 @@ CHIP_ERROR P256Keypair::Deserialize(P256SerializedKeypair & input) exit: return error; } + void P256Keypair::Clear() { if (mInitialized) diff --git a/src/platform/nxp/k32w/k32w1/CHIPDevicePlatformConfig.h b/src/platform/nxp/k32w/k32w1/CHIPDevicePlatformConfig.h index 60a1498cff9444..52dec0809f618d 100644 --- a/src/platform/nxp/k32w/k32w1/CHIPDevicePlatformConfig.h +++ b/src/platform/nxp/k32w/k32w1/CHIPDevicePlatformConfig.h @@ -44,6 +44,18 @@ #define CHIP_DEVICE_CONFIG_ENABLE_CHIP_TIME_SERVICE_TIME_SYNC 0 // #define CHIP_DEVICE_CONFIG_PERSISTED_STORAGE_GLOBAL_EIDC_KEY 2 +/** + * @def CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID_LENGTH + * + * Set unique id to maximum length if not defined to ensure the actual unique + * id is retrieved instead of the default one (if factory data read fails). + */ +#ifndef CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID_LENGTH +#define CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID_LENGTH 32 +#endif + +#define CHIP_ADDRESS_RESOLVE_IMPL_INCLUDE_HEADER + // ========== Platform-specific Configuration ========= // These are configuration options that are unique to the K32W platform. @@ -114,4 +126,16 @@ #define CHIP_DEVICE_CONFIG_ENABLE_THREAD_DNS_CLIENT 1 #endif +#if CHIP_DEVICE_CONFIG_ENABLE_SED + +#ifndef CHIP_DEVICE_CONFIG_ICD_SLOW_POLL_INTERVAL +#define CHIP_DEVICE_CONFIG_ICD_SLOW_POLL_INTERVAL chip::System::Clock::Milliseconds32(NXP_OT_IDLE_INTERVAL) +#endif // CHIP_DEVICE_CONFIG_ICD_SLOW_POLL_INTERVAL + +#ifndef CHIP_DEVICE_CONFIG_ICD_FAST_POLL_INTERVAL +#define CHIP_DEVICE_CONFIG_ICD_FAST_POLL_INTERVAL chip::System::Clock::Milliseconds32(NXP_OT_ACTIVE_INTERVAL) +#endif // CHIP_DEVICE_CONFIG_ICD_FAST_POLL_INTERVAL + +#endif + #define CHIP_DEVICE_CONFIG_ENABLE_TEST_SETUP_PARAMS 1 diff --git a/src/platform/nxp/k32w/k32w1/CHIPPlatformConfig.h b/src/platform/nxp/k32w/k32w1/CHIPPlatformConfig.h index b8ae07689e14bb..cacc28dd4a60d6 100644 --- a/src/platform/nxp/k32w/k32w1/CHIPPlatformConfig.h +++ b/src/platform/nxp/k32w/k32w1/CHIPPlatformConfig.h @@ -76,3 +76,27 @@ #ifndef WDM_PUBLISHER_MAX_NOTIFIES_IN_FLIGHT #define WDM_PUBLISHER_MAX_NOTIFIES_IN_FLIGHT 2 #endif // WDM_PUBLISHER_MAX_NOTIFIES_IN_FLIGHT + +#if NXP_ICD_ENABLED + +#ifndef CHIP_CONFIG_ICD_IDLE_MODE_DURATION_SEC +#define CHIP_CONFIG_ICD_IDLE_MODE_DURATION_SEC NXP_IDLE_MODE_INTERVAL +#endif // CHIP_CONFIG_ICD_IDLE_MODE_DURATION_SEC + +#ifndef CHIP_CONFIG_ICD_ACTIVE_MODE_DURATION_MS +#define CHIP_CONFIG_ICD_ACTIVE_MODE_DURATION_MS NXP_ACTIVE_MODE_INTERVAL +#endif // CHIP_CONFIG_ICD_ACTIVE_MODE_DURATION_MS + +#ifndef CHIP_CONFIG_ICD_ACTIVE_MODE_THRESHOLD_MS +#define CHIP_CONFIG_ICD_ACTIVE_MODE_THRESHOLD_MS NXP_ACTIVE_MODE_THRESHOLD +#endif // CHIP_CONFIG_ICD_ACTIVE_MODE_THRESHOLD_MS + +#ifndef CHIP_CONFIG_ICD_CLIENTS_SUPPORTED_PER_FABRIC +#define CHIP_CONFIG_ICD_CLIENTS_SUPPORTED_PER_FABRIC NXP_ICD_SUPPORTED_CLIENTS_PER_FABRIC +#endif // CHIP_CONFIG_ICD_CLIENTS_SUPPORTED_PER_FABRIC + +#ifndef CHIP_CONFIG_SYNCHRONOUS_REPORTS_ENABLED +#define CHIP_CONFIG_SYNCHRONOUS_REPORTS_ENABLED 1 +#endif + +#endif diff --git a/src/platform/nxp/k32w/k32w1/ConfigurationManagerImpl.cpp b/src/platform/nxp/k32w/k32w1/ConfigurationManagerImpl.cpp index 43aa7fa591b8f0..68a1a4196ed39c 100644 --- a/src/platform/nxp/k32w/k32w1/ConfigurationManagerImpl.cpp +++ b/src/platform/nxp/k32w/k32w1/ConfigurationManagerImpl.cpp @@ -30,6 +30,9 @@ #include #include #include +#if defined(USE_SMU2_DYNAMIC) +#include +#endif // #include #include "fsl_cmc.h" @@ -270,7 +273,10 @@ void ConfigurationManagerImpl::DoFactoryReset(intptr_t arg) ThreadStackMgr().ErasePersistentInfo(); -#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD +#if defined(USE_SMU2_DYNAMIC) + SMU2::Deactivate(); +#endif +#endif // Restart the system. ChipLogProgress(DeviceLayer, "System restarting"); diff --git a/src/platform/nxp/k32w/k32w1/DiagnosticDataProviderImpl.cpp b/src/platform/nxp/k32w/k32w1/DiagnosticDataProviderImpl.cpp index 2b7dd8856c617b..212d0b5ea39fa6 100644 --- a/src/platform/nxp/k32w/k32w1/DiagnosticDataProviderImpl.cpp +++ b/src/platform/nxp/k32w/k32w1/DiagnosticDataProviderImpl.cpp @@ -31,12 +31,11 @@ #include #endif -extern "C" void xPortResetHeapMinimumEverFreeHeapSize(void); - #include - #include +#include "fsl_component_mem_manager.h" + using namespace ::chip::app::Clusters::GeneralDiagnostics; namespace chip { @@ -50,31 +49,31 @@ DiagnosticDataProviderImpl & DiagnosticDataProviderImpl::GetDefaultInstance() CHIP_ERROR DiagnosticDataProviderImpl::GetCurrentHeapFree(uint64_t & currentHeapFree) { - size_t freeHeapSize; + auto freeHeapSize = static_cast(MEM_GetFreeHeapSize()); + currentHeapFree = static_cast(freeHeapSize); - freeHeapSize = xPortGetFreeHeapSize(); - currentHeapFree = static_cast(freeHeapSize); return CHIP_NO_ERROR; } CHIP_ERROR DiagnosticDataProviderImpl::GetCurrentHeapUsed(uint64_t & currentHeapUsed) { - size_t freeHeapSize; - size_t usedHeapSize; + auto freeHeapSize = static_cast(MEM_GetFreeHeapSize()); + currentHeapUsed = static_cast(MinimalHeapSize_c - freeHeapSize); - freeHeapSize = xPortGetFreeHeapSize(); - usedHeapSize = MinimalHeapSize_c - freeHeapSize; - - currentHeapUsed = static_cast(usedHeapSize); return CHIP_NO_ERROR; } CHIP_ERROR DiagnosticDataProviderImpl::GetCurrentHeapHighWatermark(uint64_t & currentHeapHighWatermark) { - size_t highWatermarkHeapSize; + currentHeapHighWatermark = static_cast(MinimalHeapSize_c - MEM_GetFreeHeapSizeLowWaterMark()); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR DiagnosticDataProviderImpl::ResetWatermarks() +{ + MEM_ResetFreeHeapSizeLowWaterMark(); - highWatermarkHeapSize = MinimalHeapSize_c - xPortGetMinimumEverFreeHeapSize(); - currentHeapHighWatermark = static_cast(highWatermarkHeapSize); return CHIP_NO_ERROR; } diff --git a/src/platform/nxp/k32w/k32w1/DiagnosticDataProviderImpl.h b/src/platform/nxp/k32w/k32w1/DiagnosticDataProviderImpl.h index 78cca26b3683ee..33ccbe53efebaa 100644 --- a/src/platform/nxp/k32w/k32w1/DiagnosticDataProviderImpl.h +++ b/src/platform/nxp/k32w/k32w1/DiagnosticDataProviderImpl.h @@ -43,6 +43,7 @@ class DiagnosticDataProviderImpl : public DiagnosticDataProvider CHIP_ERROR GetCurrentHeapFree(uint64_t & currentHeapFree) override; CHIP_ERROR GetCurrentHeapUsed(uint64_t & currentHeapUsed) override; CHIP_ERROR GetCurrentHeapHighWatermark(uint64_t & currentHeapHighWatermark) override; + CHIP_ERROR ResetWatermarks() override; CHIP_ERROR GetThreadMetrics(ThreadMetrics ** threadMetricsOut) override; void ReleaseThreadMetrics(ThreadMetrics * threadMetrics) override; diff --git a/src/platform/nxp/k32w/k32w1/FactoryDataProviderImpl.cpp b/src/platform/nxp/k32w/k32w1/FactoryDataProviderImpl.cpp new file mode 100644 index 00000000000000..10ae6d0dd4ab05 --- /dev/null +++ b/src/platform/nxp/k32w/k32w1/FactoryDataProviderImpl.cpp @@ -0,0 +1,304 @@ +/* + * + * 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. + */ + +#include + +#if CHIP_DEVICE_CONFIG_SECURE_DAC_PRIVATE_KEY +#include "fsl_adapter_flash.h" +#endif + +namespace chip { +namespace DeviceLayer { + +// SSS adds 24 bytes of metadata when creating the blob +static constexpr size_t kSssBlobMetadataLength = 24; +static constexpr size_t kPrivateKeyBlobLength = Crypto::kP256_PrivateKey_Length + kSssBlobMetadataLength; + +FactoryDataProviderImpl::~FactoryDataProviderImpl() +{ + SSS_KEY_OBJ_FREE(&mContext); +} + +CHIP_ERROR FactoryDataProviderImpl::Init() +{ + CHIP_ERROR error = CHIP_NO_ERROR; + uint32_t sum = 0; + +#if CHIP_DEVICE_CONFIG_ENABLE_SSS_API_TEST + SSS_RunApiTest(); +#endif + + if (sum > kFactoryDataSize) + { + ChipLogError(DeviceLayer, "Max size of factory data: %lu is bigger than reserved factory data size: %lu", sum, + kFactoryDataSize); + } + + error = Validate(); + if (error != CHIP_NO_ERROR) + { + ChipLogError(DeviceLayer, "Factory data init failed with: %s", ErrorStr(error)); + } + + ReturnErrorOnFailure(SSS_InitContext()); +#if CHIP_DEVICE_CONFIG_SECURE_DAC_PRIVATE_KEY + ReturnErrorOnFailure(SSS_ConvertDacKey()); + ReturnErrorOnFailure(Validate()); +#endif + ReturnErrorOnFailure(SSS_ImportPrivateKeyBlob()); + + return error; +} + +CHIP_ERROR FactoryDataProviderImpl::SignWithDacKey(const ByteSpan & messageToSign, MutableByteSpan & outSignBuffer) +{ + Crypto::P256ECDSASignature signature; + + VerifyOrReturnError(IsSpanUsable(outSignBuffer), CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrReturnError(IsSpanUsable(messageToSign), CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrReturnError(outSignBuffer.size() >= signature.Capacity(), CHIP_ERROR_BUFFER_TOO_SMALL); + VerifyOrReturnError(messageToSign.data() != nullptr, CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrReturnError(messageToSign.size() > 0, CHIP_ERROR_INVALID_ARGUMENT); + + uint8_t digest[Crypto::kSHA256_Hash_Length]; + memset(&digest[0], 0, sizeof(digest)); + + ReturnErrorOnFailure(Crypto::Hash_SHA256(messageToSign.data(), messageToSign.size(), digest)); + ReturnErrorOnFailure(SSS_Sign(digest, signature)); + + return CopySpanToMutableSpan(ByteSpan{ signature.ConstBytes(), signature.Length() }, outSignBuffer); +} + +CHIP_ERROR FactoryDataProviderImpl::SSS_InitContext() +{ + auto res = sss_sscp_key_object_init(&mContext, &g_keyStore); + VerifyOrReturnError(res == kStatus_SSS_Success, CHIP_ERROR_INTERNAL); + res = sss_sscp_key_object_allocate_handle(&mContext, 0x0u, kSSS_KeyPart_Private, kSSS_CipherType_EC_NIST_P, + Crypto::kP256_PrivateKey_Length, SSS_KEYPROP_OPERATION_ASYM); + VerifyOrReturnError(res == kStatus_SSS_Success, CHIP_ERROR_INTERNAL); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR FactoryDataProviderImpl::SSS_ImportPrivateKeyBlob() +{ + uint8_t blob[kPrivateKeyBlobLength] = { 0 }; + uint16_t blobSize = 0; + ReturnErrorOnFailure(SearchForId(FactoryDataId::kDacPrivateKeyId, blob, kPrivateKeyBlobLength, blobSize)); + + auto res = sss_sscp_key_store_import_key(&g_keyStore, &mContext, blob, kPrivateKeyBlobLength, kPrivateKeyBlobLength * 8, + kSSS_blobType_ELKE_blob); + VerifyOrReturnError(res == kStatus_SSS_Success, CHIP_ERROR_INTERNAL); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR FactoryDataProviderImpl::SSS_Sign(uint8_t * digest, Crypto::P256ECDSASignature & signature) +{ + CHIP_ERROR error = CHIP_NO_ERROR; + size_t signatureSize = Crypto::kP256_ECDSA_Signature_Length_Raw; + sss_status_t res = kStatus_SSS_Fail; + sss_sscp_asymmetric_t asyc; + + res = sss_sscp_asymmetric_context_init(&asyc, &g_sssSession, &mContext, kAlgorithm_SSS_ECDSA_SHA256, kMode_SSS_Sign); + VerifyOrExit(res == kStatus_SSS_Success, error = CHIP_ERROR_INTERNAL); + res = sss_sscp_asymmetric_sign_digest(&asyc, digest, Crypto::kP256_PrivateKey_Length, signature.Bytes(), &signatureSize); + VerifyOrExit(res == kStatus_SSS_Success, error = CHIP_ERROR_INTERNAL); + signature.SetLength(signatureSize); + +exit: + sss_sscp_asymmetric_context_free(&asyc); + return error; +} + +#if CHIP_DEVICE_CONFIG_SECURE_DAC_PRIVATE_KEY +CHIP_ERROR FactoryDataProviderImpl::SSS_ConvertDacKey() +{ + size_t blobSize = kPrivateKeyBlobLength; + size_t newSize = sizeof(FactoryDataProvider::Header) + mHeader.size + kSssBlobMetadataLength; + uint8_t blob[kPrivateKeyBlobLength] = { 0 }; + uint8_t * data = static_cast(chip::Platform::MemoryAlloc(newSize)); + uint32_t offset = 0; + + VerifyOrReturnError(data != nullptr, CHIP_ERROR_INTERNAL); + + ReturnErrorOnFailure(SSS_ExportBlob(blob, &blobSize, offset)); + ChipLogError(DeviceLayer, "SSS: extracted blob from DAC private key"); + + hal_flash_status_t status = HAL_FlashRead(kFactoryDataStart, newSize - kSssBlobMetadataLength, data); + VerifyOrReturnError(status == kStatus_HAL_Flash_Success, CHIP_ERROR_INTERNAL); + ChipLogError(DeviceLayer, "SSS: cached factory data in RAM"); + + ReturnErrorOnFailure(ReplaceWithBlob(data, blob, blobSize, offset)); + ChipLogError(DeviceLayer, "SSS: replaced DAC private key with secured blob"); + + status = HAL_FlashEraseSector(kFactoryDataStart, kFactoryDataSize); + VerifyOrReturnError(status == kStatus_HAL_Flash_Success, CHIP_ERROR_INTERNAL); + status = HAL_FlashProgramUnaligned(kFactoryDataStart, newSize, data); + VerifyOrReturnError(status == kStatus_HAL_Flash_Success, CHIP_ERROR_INTERNAL); + ChipLogError(DeviceLayer, "SSS: updated factory data"); + + memset(data, 0, newSize); + chip::Platform::MemoryFree(data); + ChipLogError(DeviceLayer, "SSS: sanitized RAM cache"); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR FactoryDataProviderImpl::SSS_ExportBlob(uint8_t * data, size_t * dataLen, uint32_t & offset) +{ + uint8_t keyBuf[Crypto::kP256_PrivateKey_Length]; + MutableByteSpan dacPrivateKeySpan(keyBuf); + uint16_t keySize = 0; + + ReturnErrorOnFailure( + SearchForId(FactoryDataId::kDacPrivateKeyId, dacPrivateKeySpan.data(), dacPrivateKeySpan.size(), keySize, &offset)); + dacPrivateKeySpan.reduce_size(keySize); + + auto res = SSS_KEY_STORE_SET_KEY(&mContext, dacPrivateKeySpan.data(), Crypto::kP256_PrivateKey_Length, keySize * 8, + kSSS_KeyPart_Private); + VerifyOrReturnError(res == kStatus_SSS_Success, CHIP_ERROR_INTERNAL); + + res = sss_sscp_key_store_export_key(&g_keyStore, &mContext, data, dataLen, kSSS_blobType_ELKE_blob); + VerifyOrReturnError(res == kStatus_SSS_Success, CHIP_ERROR_INTERNAL); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR FactoryDataProviderImpl::ReplaceWithBlob(uint8_t * data, uint8_t * blob, size_t blobLen, uint32_t offset) +{ + size_t newSize = mHeader.size + kSssBlobMetadataLength; + FactoryDataProvider::Header * header = reinterpret_cast(data); + uint8_t * payload = data + sizeof(FactoryDataProvider::Header); + size_t subsequentDataOffset = offset + kValueOffset + Crypto::kP256_PrivateKey_Length; + + memmove(payload + subsequentDataOffset + kSssBlobMetadataLength, payload + subsequentDataOffset, + mHeader.size - subsequentDataOffset); + header->size = newSize; + memcpy(payload + offset + kLengthOffset, (uint16_t *) &blobLen, sizeof(uint16_t)); + memcpy(payload + offset + kValueOffset, blob, blobLen); + + uint8_t hash[Crypto::kSHA256_Hash_Length] = { 0 }; + ReturnErrorOnFailure(Crypto::Hash_SHA256(payload, header->size, hash)); + memcpy(header->hash, hash, sizeof(header->hash)); + + return CHIP_NO_ERROR; +} +#endif // CHIP_DEVICE_CONFIG_SECURE_DAC_PRIVATE_KEY + +#if CHIP_DEVICE_CONFIG_ENABLE_SSS_API_TEST + +#define _assert(condition) \ + if (!condition) \ + { \ + ChipLogError(DeviceLayer, "Condition failed" #condition); \ + while (1) \ + ; \ + } + +void FactoryDataProviderImpl::SSS_RunApiTest() +{ + uint8_t privateKey[Crypto::kP256_PrivateKey_Length] = { 0x18, 0xfe, 0x9a, 0xd9, 0x30, 0xdd, 0x2f, 0x62, 0xbe, 0x99, 0x43, + 0x93, 0xe8, 0xbe, 0x47, 0x28, 0x7f, 0xda, 0x5a, 0x71, 0x86, 0x1b, + 0x0e, 0x3f, 0x91, 0x27, 0x52, 0xd0, 0xba, 0xa7, 0x40, 0x02 }; + + auto error = SSS_InitContext(); + _assert((error == CHIP_NO_ERROR)); + + // Simulate factory data in RAM: create the header + dummy data + DAC private key entry + dummy data + uint8_t type = FactoryDataProvider::FactoryDataId::kDacPrivateKeyId; + uint8_t dummyType = FactoryDataProvider::FactoryDataId::kProductLabel; + uint16_t length = Crypto::kP256_PrivateKey_Length; + uint16_t dummyLength = 3; + uint32_t numberOfDummies = 10; + uint32_t dummySize = numberOfDummies * (sizeof(dummyType) + sizeof(dummyLength) + dummyLength); + uint32_t size = + sizeof(FactoryDataProvider::Header) + dummySize + sizeof(type) + sizeof(length) + kPrivateKeyBlobLength + dummySize; + uint8_t dummyData[3] = { 0xab }; + uint8_t hash[Crypto::kSHA256_Hash_Length] = { 0 }; + mHeader.hashId = FactoryDataProvider::kHashId; + mHeader.size = size - sizeof(FactoryDataProvider::Header); + mHeader.hash[0] = 0xde; + mHeader.hash[1] = 0xad; + mHeader.hash[2] = 0xbe; + mHeader.hash[3] = 0xef; + + uint8_t * factoryData = static_cast(chip::Platform::MemoryAlloc(size)); + _assert((factoryData != nullptr)); + + uint8_t * entry = factoryData + sizeof(mHeader); + for (auto i = 0; i < numberOfDummies; i++) + { + memcpy(entry, (void *) &dummyType, sizeof(dummyType)); + entry += sizeof(type); + memcpy(entry, (void *) &dummyLength, sizeof(dummyLength)); + entry += sizeof(length); + memcpy(entry, dummyData, dummyLength); + entry += dummyLength; + } + memcpy(entry, (void *) &type, sizeof(type)); + entry += sizeof(type); + memcpy(entry, (void *) &length, sizeof(length)); + entry += sizeof(length); + memcpy(entry, privateKey, Crypto::kP256_PrivateKey_Length); + entry += Crypto::kP256_PrivateKey_Length; + for (auto i = 0; i < numberOfDummies; i++) + { + memcpy(entry, (void *) &dummyType, sizeof(dummyType)); + entry += sizeof(type); + memcpy(entry, (void *) &dummyLength, sizeof(dummyLength)); + entry += sizeof(length); + memcpy(entry, dummyData, dummyLength); + entry += dummyLength; + } + + FactoryDataProvider::kFactoryDataPayloadStart = (uint32_t) factoryData + sizeof(FactoryDataProvider::Header); + + uint8_t keyBuf[Crypto::kP256_PrivateKey_Length]; + MutableByteSpan dacPrivateKeySpan(keyBuf); + uint16_t keySize = 0; + error = SearchForId(FactoryDataId::kCertDeclarationId, dacPrivateKeySpan.data(), dacPrivateKeySpan.size(), keySize); + _assert((error == CHIP_ERROR_NOT_FOUND)); + error = SearchForId(FactoryDataId::kDacPrivateKeyId, dacPrivateKeySpan.data(), dacPrivateKeySpan.size(), keySize); + _assert((error == CHIP_NO_ERROR)); + _assert((memcmp(dacPrivateKeySpan.data(), privateKey, Crypto::kP256_PrivateKey_Length) == 0)); + + size_t blobSize = kPrivateKeyBlobLength; + size_t newSize = sizeof(FactoryDataProvider::Header) + mHeader.size + kSssBlobMetadataLength; + uint8_t blob[kPrivateKeyBlobLength] = { 0 }; + + uint32_t offset = 0; + error = SSS_ExportBlob(blob, &blobSize, offset); + _assert((error == CHIP_NO_ERROR)); + error = ReplaceWithBlob(factoryData, blob, blobSize, offset); + _assert((error == CHIP_NO_ERROR)); + FactoryDataProvider::Header * header = reinterpret_cast(factoryData); + _assert((header->size == (mHeader.size + kSssBlobMetadataLength))); + _assert((header->hash[0] != 0xde)); + _assert((header->hash[1] != 0xad)); + _assert((header->hash[2] != 0xbe)); + _assert((header->hash[3] != 0xef)); + + memset(factoryData, 0, size); + chip::Platform::MemoryFree(factoryData); + FactoryDataProvider::kFactoryDataPayloadStart = FactoryDataProvider::kFactoryDataStart + sizeof(FactoryDataProvider::Header); + SSS_KEY_OBJ_FREE(&mContext); +} +#endif // CHIP_DEVICE_CONFIG_ENABLE_SSS_API_TEST + +} // namespace DeviceLayer +} // namespace chip diff --git a/src/platform/nxp/k32w/k32w1/FactoryDataProviderImpl.h b/src/platform/nxp/k32w/k32w1/FactoryDataProviderImpl.h new file mode 100644 index 00000000000000..67bef1959ea503 --- /dev/null +++ b/src/platform/nxp/k32w/k32w1/FactoryDataProviderImpl.h @@ -0,0 +1,109 @@ +/* + * + * 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. + */ +#pragma once + +#include +#include + +#include "sss_crypto.h" + +/* This flag should be defined when the factory data contains + * the DAC private key in plain text. It usually occurs in + * manufacturing. + * + * The init phase will use S200 to export an encrypted blob, + * then overwrite the private key section from internal flash. + * + * Should be used one time only for securing the private key. + * The manufacturer will then flash the real image, which shall + * not define this flag. + */ +#ifndef CHIP_DEVICE_CONFIG_SECURE_DAC_PRIVATE_KEY +#define CHIP_DEVICE_CONFIG_SECURE_DAC_PRIVATE_KEY 0 +#endif + +/* This flag should be defined to run SSS_RunApiTest tests. + */ +#ifndef CHIP_DEVICE_CONFIG_ENABLE_SSS_API_TEST +#define CHIP_DEVICE_CONFIG_ENABLE_SSS_API_TEST 0 +#endif + +namespace chip { +namespace DeviceLayer { + +/** + * This class extends the default FactoryDataProvider functionality + * by leveraging the secure subsystem for signing messages. + */ + +class FactoryDataProviderImpl : public FactoryDataProvider +{ +public: + ~FactoryDataProviderImpl(); + + CHIP_ERROR Init() override; + CHIP_ERROR SignWithDacKey(const ByteSpan & messageToSign, MutableByteSpan & outSignBuffer) override; + +private: + CHIP_ERROR SSS_InitContext(); + CHIP_ERROR SSS_ImportPrivateKeyBlob(); + CHIP_ERROR SSS_Sign(uint8_t * digest, Crypto::P256ECDSASignature & signature); +#if CHIP_DEVICE_CONFIG_SECURE_DAC_PRIVATE_KEY + /*! + * \brief Convert DAC private key to an SSS encrypted blob and update factory data + * + * @note This API should be called in manufacturing process context to replace + * DAC private key with an SSS encrypted blob. The conversion will be a + * one-time-only operation. + * @retval #CHIP_NO_ERROR if factory data was updated successfully. + */ + CHIP_ERROR SSS_ConvertDacKey(); + + /*! + * \brief Export an SSS encrypted blob from the DAC private key found in factory data + * + * @param data Pointer to an allocated buffer + * @param dataLen Pointer to a variable that will store the blob length + * @param offset Offset of private key from the start of factory data payload address (after header) + * + * @retval #CHIP_NO_ERROR if conversion to blob was successful. + */ + CHIP_ERROR SSS_ExportBlob(uint8_t * data, size_t * dataLen, uint32_t & offset); + + /*! + * \brief Replace DAC private key with the specified SSS encrypted blob + * + * @note A new hash has to be computed and written in the factory data header. + * @param data Pointer to a RAM buffer that duplicates the current factory data + * @param blob Pointer to blob data + * @param blobLen Blob length + * @param offset Offset of private key from the start of factory data payload address (after header) + * Extracted with SSS_ConvertToBlob. + * + * @retval #CHIP_NO_ERROR if conversion to blob was successful. + */ + CHIP_ERROR ReplaceWithBlob(uint8_t * data, uint8_t * blob, size_t blobLen, uint32_t offset); +#endif +#if CHIP_DEVICE_CONFIG_ENABLE_SSS_API_TEST + void SSS_RunApiTest(); +#endif + + sss_sscp_object_t mContext; +}; + +} // namespace DeviceLayer +} // namespace chip diff --git a/src/platform/nxp/k32w/k32w1/K32W1Config.cpp b/src/platform/nxp/k32w/k32w1/K32W1Config.cpp index ee41809dcca7b9..489d6363d8f4e9 100644 --- a/src/platform/nxp/k32w/k32w1/K32W1Config.cpp +++ b/src/platform/nxp/k32w/k32w1/K32W1Config.cpp @@ -55,7 +55,7 @@ namespace Internal { #define CHIP_PLAT_NVM_STATIC_ALLOC 1 #endif -#define CHIP_CONFIG_RAM_BUFFER_SIZE 10240 +#define CHIP_CONFIG_RAM_BUFFER_SIZE 14336 #ifndef NVM_ID_CHIP_CONFIG_DATA #define NVM_ID_CHIP_CONFIG_DATA 0xf104 @@ -378,6 +378,7 @@ CHIP_ERROR K32WConfig::FactoryResetConfig(void) CHIP_ERROR err = CHIP_NO_ERROR; FactoryResetConfigInternal(kMinConfigKey_ChipConfig, kMaxConfigKey_ChipConfig); + FactoryResetConfigInternal(kMinConfigKey_ChipCounter, kMaxConfigKey_ChipCounter); FactoryResetConfigInternal(kMinConfigKey_KVSKey, kMaxConfigKey_KVSKey); FactoryResetConfigInternal(kMinConfigKey_KVSValue, kMaxConfigKey_KVSValue); diff --git a/src/platform/nxp/k32w/k32w1/K32W1PersistentStorageOpKeystore.cpp b/src/platform/nxp/k32w/k32w1/K32W1PersistentStorageOpKeystore.cpp index 43560f549ff951..a3a4a480430979 100644 --- a/src/platform/nxp/k32w/k32w1/K32W1PersistentStorageOpKeystore.cpp +++ b/src/platform/nxp/k32w/k32w1/K32W1PersistentStorageOpKeystore.cpp @@ -37,47 +37,21 @@ namespace chip { using namespace chip::Crypto; -CHIP_ERROR P256KeypairSSS::Initialize(Crypto::ECPKeyTarget key_target) +static inline sss_sscp_object_t * to_keypair(P256KeypairContext * context) { - CHIP_ERROR error = CHIP_NO_ERROR; - size_t keyBitsLen = kP256_PrivateKey_Length * 8; - size_t keySize = SSS_ECP_KEY_SZ(kP256_PrivateKey_Length); - - Clear(); - - VerifyOrReturnError(sss_sscp_key_object_init(&mKeyObj, &g_keyStore) == kStatus_SSS_Success, CHIP_ERROR_INTERNAL); - - VerifyOrReturnError(sss_sscp_key_object_allocate_handle( - &mKeyObj, 0x0u, kSSS_KeyPart_Pair, kSSS_CipherType_EC_NIST_P, 3 * kP256_PrivateKey_Length, - SSS_KEYPROP_OPERATION_KDF | SSS_KEYPROP_OPERATION_ASYM) == kStatus_SSS_Success, - error = CHIP_ERROR_INTERNAL); - - VerifyOrExit(SSS_ECP_GENERATE_KEY(&mKeyObj, keyBitsLen) == kStatus_SSS_Success, error = CHIP_ERROR_INTERNAL); - - // The first byte of the public key is the uncompressed marker - Uint8::to_uchar(mPublicKey)[0] = 0x04; - - // Extract public key, write from the second byte - VerifyOrExit(SSS_KEY_STORE_GET_PUBKEY(&mKeyObj, Uint8::to_uchar(mPublicKey) + 1, &keySize, &keyBitsLen) == kStatus_SSS_Success, - CHIP_ERROR_INTERNAL); - - mInitialized = true; - -exit: - if (mInitialized != true) - (void) SSS_KEY_OBJ_FREE(&mKeyObj); - - return error; + return SafePointerCast(context); } CHIP_ERROR P256KeypairSSS::ExportBlob(P256SerializedKeypairSSS & output) const { VerifyOrReturnError(mInitialized, CHIP_ERROR_UNINITIALIZED); + sss_sscp_object_t * keypair = to_keypair(&mKeypair); + size_t keyBlobLen = output.Capacity(); - VerifyOrReturnError(sss_sscp_key_store_export_key(&g_keyStore, &mKeyObj, output.Bytes(), &keyBlobLen, - kSSS_blobType_ELKE_blob) == kStatus_SSS_Success, - CHIP_ERROR_INTERNAL); + auto res = sss_sscp_key_store_export_key(&g_keyStore, keypair, output.Bytes(), &keyBlobLen, kSSS_blobType_ELKE_blob); + VerifyOrReturnError(res == kStatus_SSS_Success, CHIP_ERROR_INTERNAL); + output.SetLength(keyBlobLen); return CHIP_NO_ERROR; @@ -85,77 +59,27 @@ CHIP_ERROR P256KeypairSSS::ExportBlob(P256SerializedKeypairSSS & output) const CHIP_ERROR P256KeypairSSS::ImportBlob(P256SerializedKeypairSSS & input) { - CHIP_ERROR error = CHIP_NO_ERROR; + sss_sscp_object_t * keypair = to_keypair(&mKeypair); if (false == mInitialized) { - VerifyOrExit((sss_sscp_key_object_init(&mKeyObj, &g_keyStore) == kStatus_SSS_Success), error = CHIP_ERROR_INTERNAL); + auto res = sss_sscp_key_object_init(keypair, &g_keyStore); + VerifyOrReturnError(res == kStatus_SSS_Success, CHIP_ERROR_INTERNAL); /* Allocate key handle */ - VerifyOrExit( - (sss_sscp_key_object_allocate_handle(&mKeyObj, 0x0u, kSSS_KeyPart_Pair, kSSS_CipherType_EC_NIST_P, - 3 * kP256_PrivateKey_Length, SSS_KEYPROP_OPERATION_ASYM) == kStatus_SSS_Success), - error = CHIP_ERROR_INTERNAL); + res = sss_sscp_key_object_allocate_handle(keypair, 0x0u, kSSS_KeyPart_Pair, kSSS_CipherType_EC_NIST_P, + 3 * kP256_PrivateKey_Length, SSS_KEYPROP_OPERATION_ASYM); + VerifyOrReturnError(res == kStatus_SSS_Success, CHIP_ERROR_INTERNAL); } - VerifyOrExit((sss_sscp_key_store_import_key(&g_keyStore, &mKeyObj, input.Bytes(), input.Length(), kP256_PrivateKey_Length * 8, + VerifyOrExit((sss_sscp_key_store_import_key(&g_keyStore, keypair, input.Bytes(), input.Length(), kP256_PrivateKey_Length * 8, kSSS_blobType_ELKE_blob) == kStatus_SSS_Success), - error = CHIP_ERROR_INTERNAL); + CHIP_ERROR_INTERNAL); mInitialized = true; exit: - return error; -} - -CHIP_ERROR P256KeypairSSS::ECDSA_sign_msg(const uint8_t * msg, const size_t msg_length, P256ECDSASignature & out_signature) const -{ - CHIP_ERROR error = CHIP_NO_ERROR; - sss_sscp_asymmetric_t asyc; - size_t signatureSize = kP256_ECDSA_Signature_Length_Raw; - - VerifyOrReturnError(mInitialized, CHIP_ERROR_UNINITIALIZED); - VerifyOrReturnError((msg != nullptr) && (msg_length > 0), CHIP_ERROR_INVALID_ARGUMENT); - - uint8_t digest[kSHA256_Hash_Length]; - memset(&digest[0], 0, sizeof(digest)); - ReturnErrorOnFailure(Hash_SHA256(msg, msg_length, &digest[0])); - - VerifyOrExit((sss_sscp_asymmetric_context_init(&asyc, &g_sssSession, &mKeyObj, kAlgorithm_SSS_ECDSA_SHA256, kMode_SSS_Sign) == - kStatus_SSS_Success), - error = CHIP_ERROR_INTERNAL); - VerifyOrExit((sss_sscp_asymmetric_sign_digest(&asyc, digest, kP256_FE_Length, out_signature.Bytes(), &signatureSize) == - kStatus_SSS_Success), - error = CHIP_ERROR_INTERNAL); - VerifyOrExit(out_signature.SetLength(kP256_ECDSA_Signature_Length_Raw) == CHIP_NO_ERROR, error = CHIP_ERROR_INTERNAL); - -exit: - (void) sss_sscp_asymmetric_context_free(&asyc); - return error; -} - -CHIP_ERROR P256KeypairSSS::NewCertificateSigningRequest(uint8_t * out_csr, size_t & csr_length) const -{ - VerifyOrReturnError(mInitialized, CHIP_ERROR_UNINITIALIZED); - - MutableByteSpan csr(out_csr, csr_length); - CHIP_ERROR err = GenerateCertificateSigningRequest(this, csr); - csr_length = (CHIP_NO_ERROR == err) ? csr.size() : 0; - return err; -} - -void P256KeypairSSS::Clear() -{ - if (mInitialized) - { - (void) SSS_KEY_OBJ_FREE(&mKeyObj); - mInitialized = false; - } -} - -P256KeypairSSS::~P256KeypairSSS() -{ - Clear(); + return CHIP_NO_ERROR; } bool K32W1PersistentStorageOpKeystore::HasOpKeypairForFabric(FabricIndex fabricIndex) const diff --git a/src/platform/nxp/k32w/k32w1/K32W1PersistentStorageOpKeystore.h b/src/platform/nxp/k32w/k32w1/K32W1PersistentStorageOpKeystore.h index 6402c235527ff0..c0aeabccd2e724 100644 --- a/src/platform/nxp/k32w/k32w1/K32W1PersistentStorageOpKeystore.h +++ b/src/platform/nxp/k32w/k32w1/K32W1PersistentStorageOpKeystore.h @@ -41,47 +41,17 @@ typedef Crypto::SensitiveDataBuffer P256SerializedKeypai class P256KeypairSSS : public Crypto::P256Keypair { public: - P256KeypairSSS() {} - ~P256KeypairSSS() override; - /** - * @brief Initialize the keypair. + * @brief Export an encrypted blob. * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise **/ - CHIP_ERROR Initialize(Crypto::ECPKeyTarget key_target) override; - CHIP_ERROR ExportBlob(P256SerializedKeypairSSS & output) const; - CHIP_ERROR ImportBlob(P256SerializedKeypairSSS & input); - - /** - * @brief Generate a new Certificate Signing Request (CSR). - * @param csr Newly generated CSR in DER format - * @param csr_length The caller provides the length of input buffer (csr). The function returns the actual length of generated - *CSR. - * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise - **/ - CHIP_ERROR NewCertificateSigningRequest(uint8_t * csr, size_t & csr_length) const override; - /** - * @brief A function to sign a msg using ECDSA - * @param msg Message that needs to be signed - * @param msg_length Length of message - * @param out_signature Buffer that will hold the output signature. The signature consists of: 2 EC elements (r and s), - * in raw point form (see SEC1). + * @brief Import an encrypted blob. * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise **/ - CHIP_ERROR ECDSA_sign_msg(const uint8_t * msg, size_t msg_length, Crypto::P256ECDSASignature & out_signature) const override; - - const Crypto::P256PublicKey & Pubkey() const override { return mPublicKey; } - - /** Release resources associated with this key pair */ - void Clear(); - -private: - Crypto::P256PublicKey mPublicKey; - mutable sss_sscp_object_t mKeyObj; - bool mInitialized = false; + CHIP_ERROR ImportBlob(P256SerializedKeypairSSS & input); }; /** diff --git a/src/platform/nxp/k32w/k32w1/KeyValueStoreManagerImpl.cpp b/src/platform/nxp/k32w/k32w1/KeyValueStoreManagerImpl.cpp index 00f6a9314398bc..6af22df6781d3b 100644 --- a/src/platform/nxp/k32w/k32w1/KeyValueStoreManagerImpl.cpp +++ b/src/platform/nxp/k32w/k32w1/KeyValueStoreManagerImpl.cpp @@ -36,7 +36,7 @@ namespace DeviceLayer { namespace PersistedStorage { /* TODO: adjust these values */ -constexpr size_t kMaxNumberOfKeys = 150; +constexpr size_t kMaxNumberOfKeys = 200; constexpr size_t kMaxKeyValueBytes = 255; KeyValueStoreManagerImpl KeyValueStoreManagerImpl::sInstance; diff --git a/src/platform/nxp/k32w/k32w1/Logging.cpp b/src/platform/nxp/k32w/k32w1/Logging.cpp index 62b5d114379f3a..5c68f4f11dab7a 100644 --- a/src/platform/nxp/k32w/k32w1/Logging.cpp +++ b/src/platform/nxp/k32w/k32w1/Logging.cpp @@ -12,6 +12,10 @@ #include "fsl_debug_console.h" #include +#ifdef PW_RPC_ENABLED +#include +#endif + #define K32W_LOG_MODULE_NAME chip #define EOL_CHARS "\r\n" /* End of Line Characters */ #define EOL_CHARS_LEN 2 /* Length of EOL */ @@ -109,7 +113,9 @@ void ENFORCE_FORMAT(1, 0) GenericLog(const char * format, va_list arg, const cha if (!isLogInitialized) { isLogInitialized = true; +#ifndef PW_RPC_ENABLED otPlatUartEnable(); +#endif } /* Prefix is composed of [Time Reference][Debug String][Module Name String] */ @@ -121,7 +127,11 @@ void ENFORCE_FORMAT(1, 0) GenericLog(const char * format, va_list arg, const cha VerifyOrDie(writtenLen > 0); memcpy(formattedMsg + prefixLen + writtenLen, EOL_CHARS, EOL_CHARS_LEN); +#ifndef PW_RPC_ENABLED otPlatUartSendBlocking((const uint8_t *) formattedMsg, strlen(formattedMsg)); +#else + PigweedLogger::PutString((const char *) formattedMsg, strlen(formattedMsg)); +#endif // Let the application know that a log message has been emitted. chip::DeviceLayer::OnLogOutput(); diff --git a/src/platform/nxp/k32w/k32w1/LowPowerHooks.cpp b/src/platform/nxp/k32w/k32w1/LowPowerHooks.cpp index 752344e5e42cae..bc849b476e57af 100644 --- a/src/platform/nxp/k32w/k32w1/LowPowerHooks.cpp +++ b/src/platform/nxp/k32w/k32w1/LowPowerHooks.cpp @@ -34,12 +34,12 @@ using namespace ::chip::DeviceLayer; extern "C" void App_AllowDeviceToSleep() { - PWR_AllowDeviceToSleep(); + ; } extern "C" void App_DisallowDeviceToSleep() { - PWR_DisallowDeviceToSleep(); + ; } #endif diff --git a/src/platform/nxp/k32w/k32w1/OTAHooks.cpp b/src/platform/nxp/k32w/k32w1/OTAHooks.cpp index b672ed8322177d..c045a111618e49 100644 --- a/src/platform/nxp/k32w/k32w1/OTAHooks.cpp +++ b/src/platform/nxp/k32w/k32w1/OTAHooks.cpp @@ -39,7 +39,7 @@ extern "C" void HAL_ResetMCU(void); #define ResetMCU HAL_ResetMCU -#if USE_SMU2_AS_SYSTEM_MEMORY +#if USE_SMU2_STATIC // The attribute specifier should not be changed. static chip::OTAFirmwareProcessor gApplicationProcessor __attribute__((section(".smu2"))); #else diff --git a/src/platform/nxp/k32w/k32w1/PlatformManagerImpl.cpp b/src/platform/nxp/k32w/k32w1/PlatformManagerImpl.cpp index 53e68779bcecd2..40d747fc8a21d5 100644 --- a/src/platform/nxp/k32w/k32w1/PlatformManagerImpl.cpp +++ b/src/platform/nxp/k32w/k32w1/PlatformManagerImpl.cpp @@ -29,7 +29,8 @@ #include #include #include -#include +#include +#include #if CHIP_SYSTEM_CONFIG_USE_LWIP #include @@ -39,6 +40,8 @@ #include "fwk_platform.h" #include +extern "C" void HAL_ResetMCU(void); + extern uint8_t __data_end__[], m_data0_end[]; memAreaCfg_t data0Heap = { .start_address = (void *) __data_end__, .end_address = (void *) m_data0_end }; @@ -68,6 +71,15 @@ CHIP_ERROR PlatformManagerImpl::InitBoardFwk(void) return CHIP_NO_ERROR; } +void PlatformManagerImpl::CleanReset() +{ + StopEventLoopTask(); + Shutdown(); +#if CHIP_PLAT_NVM_SUPPORT + NvCompletePendingOperations(); +#endif + HAL_ResetMCU(); +} static int app_entropy_source(void * data, unsigned char * output, size_t len, size_t * olen) { diff --git a/src/platform/nxp/k32w/k32w1/PlatformManagerImpl.h b/src/platform/nxp/k32w/k32w1/PlatformManagerImpl.h index 70ece1cdf11f3c..6798cb911ee377 100644 --- a/src/platform/nxp/k32w/k32w1/PlatformManagerImpl.h +++ b/src/platform/nxp/k32w/k32w1/PlatformManagerImpl.h @@ -50,6 +50,7 @@ class PlatformManagerImpl final : public PlatformManager, public Internal::Gener System::Clock::Timestamp GetStartTime() { return mStartTime; } CHIP_ERROR InitBoardFwk(void); + void CleanReset(); private: // ===== Methods that implement the PlatformManager abstract interface. diff --git a/src/platform/nxp/k32w/k32w1/SMU2Manager.cpp b/src/platform/nxp/k32w/k32w1/SMU2Manager.cpp new file mode 100644 index 00000000000000..f4e0216bb8955a --- /dev/null +++ b/src/platform/nxp/k32w/k32w1/SMU2Manager.cpp @@ -0,0 +1,165 @@ +/* + * + * Copyright (c) 2023 Project CHIP Authors + * Copyright (c) 2023 NXP + * 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 + * Provides the SMU2 namespace for K32W1 platform using the NXP SDK. + * This namespace implements all the necessary function to allocate + * OpenThread buffers from SMU2 region. + */ + +#include "SMU2Manager.h" +#include + +using namespace chip::DeviceLayer; +using namespace chip::DeviceLayer::Internal; + +namespace chip::SMU2 { +namespace { + +static const uint32_t AREA_START = (0x489C5380U); +static const uint32_t AREA_END = (0x489C87FFU); +static const uint32_t AREA_SIZE = (AREA_END - AREA_START); + +uint8_t mAreaId = 0; + +PersistentStorageDelegate * mStorage = nullptr; + +memAreaCfg_t mAreaDescriptor; +bool mDeviceCommissioned = false; +bool mUseAllocator = false; + +StorageKeyName GetSMU2AllocatorKey() +{ + return StorageKeyName::FromConst("nxp/ot-smu2"); +} + +void ResetBLEController() +{ + VerifyOrDie(BLEMgrImpl().ResetController() == CHIP_NO_ERROR); +} + +void RegisterArea(void) +{ + mem_status_t st = kStatus_MemSuccess; + + memset((void *) AREA_START, 0x00, AREA_SIZE); + + mAreaDescriptor.start_address = (void *) AREA_START; + mAreaDescriptor.end_address = (void *) AREA_END; + + st = MEM_RegisterExtendedArea(&mAreaDescriptor, &mAreaId, AREA_FLAGS_POOL_NOT_SHARED); + VerifyOrDie(st == kStatus_MemSuccess); +} + +void UnregisterArea(void) +{ + mem_status_t st = kStatus_MemSuccess; + + st = MEM_UnRegisterExtendedArea(mAreaId); + VerifyOrDie(st == kStatus_MemSuccess); + mAreaId = 0; + + memset((void *) AREA_START, 0x00, AREA_SIZE); +} + +void EventHandler(const ChipDeviceEvent * event, intptr_t) +{ + switch (event->Type) + { + case DeviceEventType::kCommissioningComplete: { + mDeviceCommissioned = true; + break; + } + + case DeviceEventType::kCHIPoBLEConnectionClosed: { + if (mDeviceCommissioned) + { + mUseAllocator = true; + mStorage->SyncSetKeyValue(GetSMU2AllocatorKey().KeyName(), (void *) &mUseAllocator, (uint16_t) sizeof(mUseAllocator)); + ResetBLEController(); + RegisterArea(); + } + break; + } + } +} + +} // anonymous namespace + +CHIP_ERROR Init(PersistentStorageDelegate * storage) +{ + CHIP_ERROR err = CHIP_NO_ERROR; + uint16_t size = (uint16_t) sizeof(mUseAllocator); + mStorage = storage; + + VerifyOrReturnError(storage != nullptr, CHIP_ERROR_INCORRECT_STATE); + + PlatformMgr().AddEventHandler(EventHandler, reinterpret_cast(nullptr)); + + err = mStorage->SyncGetKeyValue(GetSMU2AllocatorKey().KeyName(), (void *) &mUseAllocator, size); + + if (err == CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND) + { + mUseAllocator = false; + err = mStorage->SyncSetKeyValue(GetSMU2AllocatorKey().KeyName(), (void *) &mUseAllocator, size); + } + ReturnErrorOnFailure(err); + + if (mUseAllocator) + { + RegisterArea(); + } + + return err; +} + +CHIP_ERROR Deactivate(void) +{ + CHIP_ERROR err = CHIP_NO_ERROR; + + if (mUseAllocator) + { + mUseAllocator = false; + err = mStorage->SyncDeleteKeyValue(GetSMU2AllocatorKey().KeyName()); + ReturnErrorOnFailure(err); + + UnregisterArea(); + ResetBLEController(); + } + + return CHIP_NO_ERROR; +} + +void * Allocate(size_t size) +{ + size_t smu2Size = 0; + if (mAreaId) + { + smu2Size = MEM_GetFreeHeapSizeByAreaId(mAreaId); + if (size > smu2Size) + { + mAreaId = 0; + } + } + + return MEM_BufferAllocWithId(size, mAreaId); +} + +} // namespace chip::SMU2 diff --git a/src/platform/nxp/k32w/k32w1/SMU2Manager.h b/src/platform/nxp/k32w/k32w1/SMU2Manager.h new file mode 100644 index 00000000000000..7044d452727476 --- /dev/null +++ b/src/platform/nxp/k32w/k32w1/SMU2Manager.h @@ -0,0 +1,39 @@ +/* + * + * Copyright (c) 2023 Project CHIP Authors + * Copyright (c) 2023 NXP + * 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 + * Provides the SMU2 namespace for K32W1 platform using the NXP SDK. + * This namespace implements all the necessary function to allocate + * OpenThread buffers from SMU2 region. + */ + +#pragma once + +#include "fsl_component_mem_manager.h" +#include +#include + +namespace chip::SMU2 { + +CHIP_ERROR Init(PersistentStorageDelegate * storage); +CHIP_ERROR Deactivate(void); +void * Allocate(size_t size); + +} // namespace chip::SMU2 diff --git a/src/platform/nxp/k32w/k32w1/SystemTimeSupport.cpp b/src/platform/nxp/k32w/k32w1/SystemTimeSupport.cpp index a61c5d648bc039..7ef2a2ae0fff17 100644 --- a/src/platform/nxp/k32w/k32w1/SystemTimeSupport.cpp +++ b/src/platform/nxp/k32w/k32w1/SystemTimeSupport.cpp @@ -25,7 +25,7 @@ /* this file behaves like a config.h, comes first */ #include -extern "C" uint32_t otPlatAlarmMicroGetNow(void); +#include namespace chip { namespace System { @@ -43,7 +43,7 @@ uint64_t sBootTimeUS = 0; Microseconds64 ClockImpl::GetMonotonicMicroseconds64(void) { - return Clock::Microseconds64(otPlatAlarmMicroGetNow()); + return Clock::Microseconds64(otPlatTimeGet()); } Milliseconds64 ClockImpl::GetMonotonicMilliseconds64(void) @@ -53,12 +53,12 @@ Milliseconds64 ClockImpl::GetMonotonicMilliseconds64(void) uint64_t GetClock_Monotonic(void) { - return otPlatAlarmMicroGetNow(); + return otPlatTimeGet(); } uint64_t GetClock_MonotonicMS(void) { - return (otPlatAlarmMicroGetNow() / 1000); + return (otPlatTimeGet() / 1000); } uint64_t GetClock_MonotonicHiRes(void) diff --git a/src/platform/nxp/k32w/k32w1/ThreadStackManagerImpl.cpp b/src/platform/nxp/k32w/k32w1/ThreadStackManagerImpl.cpp index 7bf96771fb78d7..89c63694fed168 100644 --- a/src/platform/nxp/k32w/k32w1/ThreadStackManagerImpl.cpp +++ b/src/platform/nxp/k32w/k32w1/ThreadStackManagerImpl.cpp @@ -34,6 +34,9 @@ #include #include +#if defined(USE_SMU2_DYNAMIC) +#include +#endif #include namespace chip { @@ -83,6 +86,7 @@ bool ThreadStackManagerImpl::IsInitialized() } // namespace DeviceLayer } // namespace chip +using namespace ::chip; using namespace ::chip::DeviceLayer; /** @@ -113,7 +117,11 @@ extern "C" void * pvPortCallocRtos(size_t num, size_t size) extern "C" void * otPlatCAlloc(size_t aNum, size_t aSize) { +#if defined(USE_SMU2_DYNAMIC) + return SMU2::Allocate(aNum * aSize); +#else return CHIPPlatformMemoryCalloc(aNum, aSize); +#endif } extern "C" void otPlatFree(void * aPtr) diff --git a/src/platform/nxp/k32w/k32w1/args.gni b/src/platform/nxp/k32w/k32w1/args.gni index 4170e95ea6f632..2de35770927a63 100644 --- a/src/platform/nxp/k32w/k32w1/args.gni +++ b/src/platform/nxp/k32w/k32w1/args.gni @@ -13,18 +13,36 @@ # limitations under the License. import("//build_overrides/chip.gni") -import("//build_overrides/k32w1_sdk.gni") +import("//build_overrides/nxp_sdk.gni") import("//build_overrides/openthread.gni") declare_args() { chip_with_ot_cli = 0 chip_with_low_power = 0 + chip_convert_dac_private_key = 0 sdk_release = 1 } -chip_device_platform = "k32w1" +nxp_platform = "k32w/k32w1" +nxp_sdk_name = "k32w1_sdk" +nxp_device_layer = "nxp/${nxp_platform}" +nxp_use_lwip = false +nxp_use_mbedtls_port = false -lwip_platform = "k32w1" +# ARM architecture flags will be set based on NXP board. +arm_platform_config = "${nxp_sdk_build_root}/${nxp_sdk_name}/nxp_arm.gni" + +chip_device_platform = "nxp" + +chip_device_project_config_include = "" +chip_project_config_include = "" +chip_inet_project_config_include = "" +chip_system_project_config_include = "" +chip_ble_project_config_include = "" +chip_project_config_include_dirs = + [ "${chip_root}/examples/platform/${nxp_platform}/app/project_include" ] + +chip_enable_openthread = true chip_inet_config_enable_ipv4 = false @@ -39,7 +57,7 @@ chip_mdns = "platform" chip_system_config_use_open_thread_inet_endpoints = true chip_with_lwip = false -mbedtls_target = "${chip_root}/third_party/nxp/k32w1_sdk:mbedtls" +mbedtls_target = "${nxp_sdk_build_root}/${nxp_sdk_name}:mbedtls" openthread_external_mbedtls = mbedtls_target openthread_project_core_config_file = "OpenThreadConfig.h" diff --git a/src/platform/silabs/CHIPPlatformConfig.h b/src/platform/silabs/CHIPPlatformConfig.h index 5fc9abfa995a3b..93faf6b791b697 100644 --- a/src/platform/silabs/CHIPPlatformConfig.h +++ b/src/platform/silabs/CHIPPlatformConfig.h @@ -95,11 +95,11 @@ #ifdef SL_ICD_ENABLED #ifndef CHIP_CONFIG_ICD_IDLE_MODE_DURATION_SEC -#define CHIP_CONFIG_ICD_IDLE_MODE_DURATION_SEC SL_IDLE_MODE_INTERVAL +#define CHIP_CONFIG_ICD_IDLE_MODE_DURATION_SEC SL_IDLE_MODE_DURATION_S #endif // CHIP_CONFIG_ICD_IDLE_MODE_DURATION_SEC #ifndef CHIP_CONFIG_ICD_ACTIVE_MODE_DURATION_MS -#define CHIP_CONFIG_ICD_ACTIVE_MODE_DURATION_MS SL_ACTIVE_MODE_INTERVAL +#define CHIP_CONFIG_ICD_ACTIVE_MODE_DURATION_MS SL_ACTIVE_MODE_DURATION_MS #endif // CHIP_CONFIG_ICD_ACTIVE_MODE_DURATION_MS #ifndef CHIP_CONFIG_ICD_ACTIVE_MODE_THRESHOLD_MS diff --git a/src/protocols/bdx/BUILD.gn b/src/protocols/bdx/BUILD.gn index 17f18826ebe474..a95fd02202f626 100644 --- a/src/protocols/bdx/BUILD.gn +++ b/src/protocols/bdx/BUILD.gn @@ -20,6 +20,9 @@ static_library("bdx") { sources = [ "BdxMessages.cpp", "BdxMessages.h", + "BdxTransferDiagnosticLog.cpp", + "BdxTransferDiagnosticLog.h", + "BdxTransferDiagnosticLogPool.h", "BdxTransferProxy.h", "BdxTransferProxyDiagnosticLog.cpp", "BdxTransferProxyDiagnosticLog.h", diff --git a/src/protocols/bdx/BdxTransferDiagnosticLog.cpp b/src/protocols/bdx/BdxTransferDiagnosticLog.cpp new file mode 100644 index 00000000000000..8b349fed31e8f5 --- /dev/null +++ b/src/protocols/bdx/BdxTransferDiagnosticLog.cpp @@ -0,0 +1,198 @@ +/* + * + * 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 "BdxTransferDiagnosticLog.h" + +namespace chip { +namespace bdx { + +namespace { +// Max block size for the BDX transfer. +constexpr uint32_t kMaxBdxBlockSize = 1024; + +// Timeout for the BDX transfer session.. +constexpr System::Clock::Timeout kBdxTimeout = System::Clock::Seconds16(5 * 60); +constexpr TransferRole kBdxRole = TransferRole::kReceiver; +} // namespace + +void BdxTransferDiagnosticLog::HandleTransferSessionOutput(TransferSession::OutputEvent & event) +{ + assertChipStackLockedByCurrentThread(); + + ChipLogDetail(BDX, "Got an event %s", event.ToString(event.EventType)); + + switch (event.EventType) + { + case TransferSession::OutputEventType::kInitReceived: + AbortTransferOnFailure(OnTransferSessionBegin(event)); + break; + case TransferSession::OutputEventType::kStatusReceived: + ChipLogError(BDX, "Got StatusReport %x", static_cast(event.statusData.statusCode)); + LogErrorOnFailure(OnTransferSessionEnd(CHIP_ERROR_INTERNAL)); + break; + case TransferSession::OutputEventType::kInternalError: + LogErrorOnFailure(OnTransferSessionEnd(CHIP_ERROR_INTERNAL)); + break; + case TransferSession::OutputEventType::kTransferTimeout: + LogErrorOnFailure(OnTransferSessionEnd(CHIP_ERROR_TIMEOUT)); + break; + case TransferSession::OutputEventType::kBlockReceived: + AbortTransferOnFailure(OnBlockReceived(event)); + break; + case TransferSession::OutputEventType::kMsgToSend: + LogErrorOnFailure(OnMessageToSend(event)); + + if (event.msgTypeData.HasMessageType(MessageType::BlockAckEOF)) + { + LogErrorOnFailure(OnTransferSessionEnd(CHIP_NO_ERROR)); + } + break; + case TransferSession::OutputEventType::kAckEOFReceived: + case TransferSession::OutputEventType::kNone: + case TransferSession::OutputEventType::kQueryWithSkipReceived: + case TransferSession::OutputEventType::kQueryReceived: + case TransferSession::OutputEventType::kAckReceived: + case TransferSession::OutputEventType::kAcceptReceived: + // Nothing to do. + break; + default: + // Should never happen. + chipDie(); + break; + } +} + +CHIP_ERROR BdxTransferDiagnosticLog::OnMessageReceived(Messaging::ExchangeContext * ec, const PayloadHeader & payloadHeader, + System::PacketBufferHandle && payload) +{ + assertChipStackLockedByCurrentThread(); + + VerifyOrReturnError(ec != nullptr, CHIP_ERROR_INCORRECT_STATE); + + // If we receive a SendInit message, then we prepare for transfer + if (payloadHeader.HasMessageType(MessageType::SendInit)) + { + FabricIndex fabricIndex = ec->GetSessionHandle()->GetFabricIndex(); + NodeId peerNodeId = ec->GetSessionHandle()->GetPeer().GetNodeId(); + VerifyOrReturnError(fabricIndex != kUndefinedFabricIndex, CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrReturnError(peerNodeId != kUndefinedNodeId, CHIP_ERROR_INVALID_ARGUMENT); + + mTransferProxy.SetFabricIndex(fabricIndex); + mTransferProxy.SetPeerNodeId(peerNodeId); + auto flags(TransferControlFlags::kSenderDrive); + ReturnLogErrorOnFailure(Responder::PrepareForTransfer(mSystemLayer, kBdxRole, flags, kMaxBdxBlockSize, kBdxTimeout)); + } + + return TransferFacilitator::OnMessageReceived(ec, payloadHeader, std::move(payload)); +} + +CHIP_ERROR BdxTransferDiagnosticLog::OnMessageToSend(TransferSession::OutputEvent & event) +{ + assertChipStackLockedByCurrentThread(); + + VerifyOrReturnError(mExchangeCtx != nullptr, CHIP_ERROR_INCORRECT_STATE); + + auto & msgTypeData = event.msgTypeData; + bool isStatusReport = msgTypeData.HasMessageType(Protocols::SecureChannel::MsgType::StatusReport); + + // All messages sent from the Sender expect a response, except for a StatusReport which would indicate an error and + // the end of the transfer. + Messaging::SendFlags sendFlags; + VerifyOrDo(isStatusReport, sendFlags.Set(Messaging::SendMessageFlags::kExpectResponse)); + + // If there's an error sending the message, close the exchange by calling Reset. + auto err = mExchangeCtx->SendMessage(msgTypeData.ProtocolId, msgTypeData.MessageType, std::move(event.MsgData), sendFlags); + VerifyOrDo(CHIP_NO_ERROR == err, OnTransferSessionEnd(err)); + + return err; +} + +CHIP_ERROR BdxTransferDiagnosticLog::OnTransferSessionBegin(TransferSession::OutputEvent & event) +{ + assertChipStackLockedByCurrentThread(); + VerifyOrReturnError(nullptr != mDelegate, CHIP_ERROR_INCORRECT_STATE); + + ReturnErrorOnFailure(mTransferProxy.Init(&mTransfer)); + return mDelegate->OnTransferBegin(&mTransferProxy); +} + +CHIP_ERROR BdxTransferDiagnosticLog::OnTransferSessionEnd(CHIP_ERROR error) +{ + assertChipStackLockedByCurrentThread(); + VerifyOrReturnError(nullptr != mDelegate, CHIP_ERROR_INCORRECT_STATE); + + LogErrorOnFailure(mDelegate->OnTransferEnd(&mTransferProxy, error)); + Reset(); + return CHIP_NO_ERROR; +} + +CHIP_ERROR BdxTransferDiagnosticLog::OnBlockReceived(TransferSession::OutputEvent & event) +{ + assertChipStackLockedByCurrentThread(); + VerifyOrReturnError(nullptr != mDelegate, CHIP_ERROR_INCORRECT_STATE); + + ByteSpan blockData(event.blockdata.Data, event.blockdata.Length); + return mDelegate->OnTransferData(&mTransferProxy, blockData); +} + +void BdxTransferDiagnosticLog::AbortTransferOnFailure(CHIP_ERROR error) +{ + VerifyOrReturn(CHIP_NO_ERROR != error); + LogErrorOnFailure(error); + LogErrorOnFailure(mTransfer.AbortTransfer(GetBdxStatusCodeFromChipError(error))); +} + +void BdxTransferDiagnosticLog::Reset() +{ + assertChipStackLockedByCurrentThread(); + + Responder::ResetTransfer(); + + if (mExchangeCtx) + { + mIsExchangeClosing = true; + mExchangeCtx->Close(); + mIsExchangeClosing = false; + mExchangeCtx = nullptr; + } + + mTransferProxy.Reset(); +} + +void BdxTransferDiagnosticLog::OnExchangeClosing(Messaging::ExchangeContext * ec) +{ + // The exchange can be closing while TransferFacilitator is still accessing us, so + // the BdxTransferDiagnosticLog can not be released "right now". + mSystemLayer->ScheduleWork( + [](auto * systemLayer, auto * appState) -> void { + auto * _this = static_cast(appState); + _this->mPoolDelegate->Release(_this); + }, + this); + + // This block checks and handles the scenario where the exchange is closed externally (e.g., receiving a StatusReport). + // Continuing to use it could lead to a use-after-free error and such an error might occur when the poll timer triggers and + // OnTransferSessionEnd is called. + // We know it's not just us normally closing the exchange if mIsExchangeClosing is false. + VerifyOrReturn(!mIsExchangeClosing); + mExchangeCtx = nullptr; + LogErrorOnFailure(OnTransferSessionEnd(CHIP_ERROR_INTERNAL)); +} + +} // namespace bdx +} // namespace chip diff --git a/src/protocols/bdx/BdxTransferDiagnosticLog.h b/src/protocols/bdx/BdxTransferDiagnosticLog.h new file mode 100644 index 00000000000000..bc7a8773cd2dff --- /dev/null +++ b/src/protocols/bdx/BdxTransferDiagnosticLog.h @@ -0,0 +1,111 @@ +/* + * + * 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 +#include +#include + +namespace chip { +namespace bdx { + +class BdxTransferDiagnosticLog : public Responder +{ +public: + BdxTransferDiagnosticLog(BDXTransferServerDelegate * delegate, BdxTransferDiagnosticLogPoolDelegate * poolDelegate, + System::Layer * systemLayer) : + mSystemLayer(systemLayer), + mDelegate(delegate), mPoolDelegate(poolDelegate){}; + + ~BdxTransferDiagnosticLog() { Reset(); }; + + /** + * This method handles BDX messages and other TransferSession events. + * + * @param[in] event An OutputEvent that contains output from the TransferSession object. + */ + void HandleTransferSessionOutput(TransferSession::OutputEvent & event) override; + + void OnExchangeClosing(Messaging::ExchangeContext * ec) override; + +protected: + /** + * Called when a BDX message is received over the exchange context + * + * @param[in] ec The exchange context + * + * @param[in] payloadHeader The payload header of the message + * + * @param[in] payload The payload of the message + */ + CHIP_ERROR OnMessageReceived(Messaging::ExchangeContext * ec, const PayloadHeader & payloadHeader, + System::PacketBufferHandle && payload) override; + +private: + /** + * Called to send a BDX MsgToSend message over the exchange + * + * + * @param[in] event The output event to be send + */ + CHIP_ERROR OnMessageToSend(TransferSession::OutputEvent & event); + + /** + * Called to begin the transfer session when an init message has been received + * + * @param[in] event The output event received + */ + CHIP_ERROR OnTransferSessionBegin(TransferSession::OutputEvent & event); + + /** + * Called to end the transfer session when a BlockAckEOF message has been sent over the exchange + * or an error has occurred during the BDX session + * + * @param[in] error The error type + */ + CHIP_ERROR OnTransferSessionEnd(CHIP_ERROR error); + + /** + * Called when a block has been received from the Sender. The block is processed + * and written to a file and a block ack is sent back to the sender. + * + * @param[in] event The output event received + */ + CHIP_ERROR OnBlockReceived(TransferSession::OutputEvent & event); + + /** + * This method is called to reset state. It resets the transfer and cleans up the + * exchange and the fabric index and peer node id. + */ + void Reset(); + + void AbortTransferOnFailure(CHIP_ERROR error); + + BDXTransferProxyDiagnosticLog mTransferProxy; + bool mIsExchangeClosing = false; + + System::Layer * mSystemLayer; + + BDXTransferServerDelegate * mDelegate; + BdxTransferDiagnosticLogPoolDelegate * mPoolDelegate; +}; + +} // namespace bdx +} // namespace chip diff --git a/src/protocols/bdx/BdxTransferDiagnosticLogPool.h b/src/protocols/bdx/BdxTransferDiagnosticLogPool.h new file mode 100644 index 00000000000000..a2d7d3f5d11105 --- /dev/null +++ b/src/protocols/bdx/BdxTransferDiagnosticLogPool.h @@ -0,0 +1,58 @@ +/* + * + * 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 +#include + +namespace chip { +namespace bdx { + +class BdxTransferDiagnosticLog; + +class BdxTransferDiagnosticLogPoolDelegate +{ +public: + virtual ~BdxTransferDiagnosticLogPoolDelegate() {} + + virtual BdxTransferDiagnosticLog * Allocate(BDXTransferServerDelegate * delegate, System::Layer * systemLayer) = 0; + + virtual void Release(BdxTransferDiagnosticLog * client) = 0; +}; + +template +class BdxTransferDiagnosticLogPool : public BdxTransferDiagnosticLogPoolDelegate +{ +public: + ~BdxTransferDiagnosticLogPool() override { mTransferPool.ReleaseAll(); } + + BdxTransferDiagnosticLog * Allocate(BDXTransferServerDelegate * delegate, System::Layer * systemLayer) override + { + return mTransferPool.CreateObject(delegate, this, systemLayer); + } + + void Release(BdxTransferDiagnosticLog * transfer) override { mTransferPool.ReleaseObject(transfer); } + +private: + ObjectPool mTransferPool; +}; + +} // namespace bdx +} // namespace chip diff --git a/src/protocols/bdx/BdxTransferServer.cpp b/src/protocols/bdx/BdxTransferServer.cpp index b276dba51ab521..709d21b1f3b835 100644 --- a/src/protocols/bdx/BdxTransferServer.cpp +++ b/src/protocols/bdx/BdxTransferServer.cpp @@ -21,16 +21,7 @@ namespace chip { namespace bdx { -namespace { -// Max block size for the BDX transfer. -constexpr uint32_t kMaxBdxBlockSize = 1024; - -// Timeout for the BDX transfer session.. -constexpr System::Clock::Timeout kBdxTimeout = System::Clock::Seconds16(5 * 60); -constexpr TransferRole kBdxRole = TransferRole::kReceiver; -} // namespace - -CHIP_ERROR BDXTransferServer::ListenForSendInit(System::Layer * systemLayer, Messaging::ExchangeManager * exchangeMgr) +CHIP_ERROR BDXTransferServer::Init(System::Layer * systemLayer, Messaging::ExchangeManager * exchangeMgr) { VerifyOrReturnError(nullptr != systemLayer, CHIP_ERROR_INVALID_ARGUMENT); VerifyOrReturnError(nullptr != exchangeMgr, CHIP_ERROR_INVALID_ARGUMENT); @@ -40,170 +31,31 @@ CHIP_ERROR BDXTransferServer::ListenForSendInit(System::Layer * systemLayer, Mes return mExchangeMgr->RegisterUnsolicitedMessageHandlerForType(MessageType::SendInit, this); } -void BDXTransferServer::Shutdown() -{ - VerifyOrReturn(nullptr != mSystemLayer); - VerifyOrReturn(nullptr != mExchangeMgr); - - LogErrorOnFailure(mExchangeMgr->UnregisterUnsolicitedMessageHandlerForType(MessageType::SendInit)); - - mSystemLayer = nullptr; - mExchangeMgr = nullptr; -} - -void BDXTransferServer::HandleTransferSessionOutput(TransferSession::OutputEvent & event) -{ - assertChipStackLockedByCurrentThread(); - - ChipLogDetail(BDX, "Got an event %s", event.ToString(event.EventType)); - - switch (event.EventType) - { - case TransferSession::OutputEventType::kInitReceived: - AbortTransferOnFailure(OnTransferSessionBegin(event)); - break; - case TransferSession::OutputEventType::kStatusReceived: - ChipLogError(BDX, "Got StatusReport %x", static_cast(event.statusData.statusCode)); - LogErrorOnFailure(OnTransferSessionEnd(CHIP_ERROR_INTERNAL)); - break; - case TransferSession::OutputEventType::kInternalError: - LogErrorOnFailure(OnTransferSessionEnd(CHIP_ERROR_INTERNAL)); - break; - case TransferSession::OutputEventType::kTransferTimeout: - LogErrorOnFailure(OnTransferSessionEnd(CHIP_ERROR_TIMEOUT)); - break; - case TransferSession::OutputEventType::kBlockReceived: - AbortTransferOnFailure(OnBlockReceived(event)); - break; - case TransferSession::OutputEventType::kMsgToSend: - LogErrorOnFailure(OnMessageToSend(event)); - - if (event.msgTypeData.HasMessageType(MessageType::BlockAckEOF)) - { - LogErrorOnFailure(OnTransferSessionEnd(CHIP_NO_ERROR)); - } - break; - case TransferSession::OutputEventType::kAckEOFReceived: - case TransferSession::OutputEventType::kNone: - case TransferSession::OutputEventType::kQueryWithSkipReceived: - case TransferSession::OutputEventType::kQueryReceived: - case TransferSession::OutputEventType::kAckReceived: - case TransferSession::OutputEventType::kAcceptReceived: - // Nothing to do. - break; - default: - // Should never happen. - chipDie(); - break; - } -} - -CHIP_ERROR BDXTransferServer::OnMessageReceived(Messaging::ExchangeContext * ec, const PayloadHeader & payloadHeader, - System::PacketBufferHandle && payload) -{ - assertChipStackLockedByCurrentThread(); - - VerifyOrReturnError(ec != nullptr, CHIP_ERROR_INCORRECT_STATE); - - // If we receive a SendInit message, then we prepare for transfer - if (payloadHeader.HasMessageType(MessageType::SendInit)) - { - FabricIndex fabricIndex = ec->GetSessionHandle()->GetFabricIndex(); - NodeId peerNodeId = ec->GetSessionHandle()->GetPeer().GetNodeId(); - VerifyOrReturnError(fabricIndex != kUndefinedFabricIndex, CHIP_ERROR_INVALID_ARGUMENT); - VerifyOrReturnError(peerNodeId != kUndefinedNodeId, CHIP_ERROR_INVALID_ARGUMENT); - - mTransferProxy.SetFabricIndex(fabricIndex); - mTransferProxy.SetPeerNodeId(peerNodeId); - auto flags(TransferControlFlags::kSenderDrive); - ReturnLogErrorOnFailure(Responder::PrepareForTransfer(mSystemLayer, kBdxRole, flags, kMaxBdxBlockSize, kBdxTimeout)); - } - - return TransferFacilitator::OnMessageReceived(ec, payloadHeader, std::move(payload)); -} - -CHIP_ERROR BDXTransferServer::OnMessageToSend(TransferSession::OutputEvent & event) +CHIP_ERROR BDXTransferServer::OnUnsolicitedMessageReceived(const PayloadHeader & payloadHeader, + Messaging::ExchangeDelegate *& newDelegate) { - assertChipStackLockedByCurrentThread(); + auto * logTransfer = mPoolDelegate.Allocate(mDelegate, mSystemLayer); + VerifyOrReturnError(nullptr != logTransfer, CHIP_ERROR_NO_MEMORY); - VerifyOrReturnError(mExchangeCtx != nullptr, CHIP_ERROR_INCORRECT_STATE); - - auto & msgTypeData = event.msgTypeData; - bool isStatusReport = msgTypeData.HasMessageType(Protocols::SecureChannel::MsgType::StatusReport); - - // All messages sent from the Sender expect a response, except for a StatusReport which would indicate an error and - // the end of the transfer. - Messaging::SendFlags sendFlags; - VerifyOrDo(isStatusReport, sendFlags.Set(Messaging::SendMessageFlags::kExpectResponse)); - - // If there's an error sending the message, close the exchange by calling Reset. - auto err = mExchangeCtx->SendMessage(msgTypeData.ProtocolId, msgTypeData.MessageType, std::move(event.MsgData), sendFlags); - VerifyOrDo(CHIP_NO_ERROR == err, Reset()); - - return err; -} - -CHIP_ERROR BDXTransferServer::OnTransferSessionBegin(TransferSession::OutputEvent & event) -{ - assertChipStackLockedByCurrentThread(); - VerifyOrReturnError(nullptr != mDelegate, CHIP_ERROR_INCORRECT_STATE); - - ReturnErrorOnFailure(mTransferProxy.Init(&mTransfer)); - return mDelegate->OnTransferBegin(&mTransferProxy); -} - -CHIP_ERROR BDXTransferServer::OnTransferSessionEnd(CHIP_ERROR error) -{ - assertChipStackLockedByCurrentThread(); - VerifyOrReturnError(nullptr != mDelegate, CHIP_ERROR_INCORRECT_STATE); - - LogErrorOnFailure(mDelegate->OnTransferEnd(&mTransferProxy, error)); - Reset(); + newDelegate = logTransfer; return CHIP_NO_ERROR; } -CHIP_ERROR BDXTransferServer::OnBlockReceived(TransferSession::OutputEvent & event) -{ - assertChipStackLockedByCurrentThread(); - VerifyOrReturnError(nullptr != mDelegate, CHIP_ERROR_INCORRECT_STATE); - - ByteSpan blockData(event.blockdata.Data, event.blockdata.Length); - return mDelegate->OnTransferData(&mTransferProxy, blockData); -} - -void BDXTransferServer::AbortTransferOnFailure(CHIP_ERROR error) +void BDXTransferServer::OnExchangeCreationFailed(Messaging::ExchangeDelegate * delegate) { - VerifyOrReturn(CHIP_NO_ERROR != error); - LogErrorOnFailure(error); - LogErrorOnFailure(mTransfer.AbortTransfer(GetBdxStatusCodeFromChipError(error))); + auto * logTransfer = static_cast(delegate); + mPoolDelegate.Release(logTransfer); } -void BDXTransferServer::Reset() +void BDXTransferServer::Shutdown() { - assertChipStackLockedByCurrentThread(); - - Responder::ResetTransfer(); - - if (mExchangeCtx) - { - mIsExchangeClosing = true; - mExchangeCtx->Close(); - mIsExchangeClosing = false; - mExchangeCtx = nullptr; - } + VerifyOrReturn(nullptr != mSystemLayer); + VerifyOrReturn(nullptr != mExchangeMgr); - mTransferProxy.Reset(); -} + LogErrorOnFailure(mExchangeMgr->UnregisterUnsolicitedMessageHandlerForType(MessageType::SendInit)); -void BDXTransferServer::OnExchangeClosing(Messaging::ExchangeContext * ec) -{ - // This block checks and handles the scenario where the exchange is closed externally (e.g., receiving a StatusReport). - // Continuing to use it could lead to a use-after-free error and such an error might occur when the poll timer triggers and - // OnTransferSessionEnd is called. - // We know it's not just us normally closing the exchange if mIsExchangeClosing is false. - VerifyOrReturn(!mIsExchangeClosing); - mExchangeCtx = nullptr; - LogErrorOnFailure(OnTransferSessionEnd(CHIP_ERROR_INTERNAL)); + mSystemLayer = nullptr; + mExchangeMgr = nullptr; } } // namespace bdx diff --git a/src/protocols/bdx/BdxTransferServer.h b/src/protocols/bdx/BdxTransferServer.h index 83da8b97ecb6a8..0fac0e88b672de 100644 --- a/src/protocols/bdx/BdxTransferServer.h +++ b/src/protocols/bdx/BdxTransferServer.h @@ -18,97 +18,41 @@ #pragma once -#include "BdxTransferServerDelegate.h" +#include +#include #include -#include -#include -#include +#include namespace chip { namespace bdx { -class BDXTransferServer : public Responder +class BdxTransferDiagnosticLog; + +class BDXTransferServer : public Messaging::UnsolicitedMessageHandler { public: BDXTransferServer(){}; ~BDXTransferServer() { Shutdown(); }; - CHIP_ERROR ListenForSendInit(System::Layer * systemLayer, Messaging::ExchangeManager * exchangeMgr); + CHIP_ERROR Init(System::Layer * systemLayer, Messaging::ExchangeManager * exchangeMgr); void Shutdown(); void SetDelegate(BDXTransferServerDelegate * delegate) { mDelegate = delegate; } - /** - * This method handles BDX messages and other TransferSession events. - * - * @param[in] event An OutputEvent that contains output from the TransferSession object. - */ - void HandleTransferSessionOutput(TransferSession::OutputEvent & event) override; - - void OnExchangeClosing(Messaging::ExchangeContext * ec) override; - protected: - /** - * Called when a BDX message is received over the exchange context - * - * @param[in] ec The exchange context - * - * @param[in] payloadHeader The payload header of the message - * - * @param[in] payload The payload of the message - */ - CHIP_ERROR OnMessageReceived(Messaging::ExchangeContext * ec, const PayloadHeader & payloadHeader, - System::PacketBufferHandle && payload) override; + CHIP_ERROR OnUnsolicitedMessageReceived(const PayloadHeader & payloadHeader, + Messaging::ExchangeDelegate *& newDelegate) override; + void OnExchangeCreationFailed(Messaging::ExchangeDelegate * delegate) override; private: - /** - * Called to send a BDX MsgToSend message over the exchange - * - * - * @param[in] event The output event to be send - */ - CHIP_ERROR OnMessageToSend(TransferSession::OutputEvent & event); - - /** - * Called to begin the transfer session when an init message has been received - * - * @param[in] event The output event received - */ - CHIP_ERROR OnTransferSessionBegin(TransferSession::OutputEvent & event); - - /** - * Called to end the transfer session when a BlockAckEOF message has been sent over the exchange - * or an error has occurred during the BDX session - * - * @param[in] error The error type - */ - CHIP_ERROR OnTransferSessionEnd(CHIP_ERROR error); - - /** - * Called when a block has been received from the Sender. The block is processed - * and written to a file and a block ack is sent back to the sender. - * - * @param[in] event The output event received - */ - CHIP_ERROR OnBlockReceived(TransferSession::OutputEvent & event); - - /** - * This method is called to reset state. It resets the transfer and cleans up the - * exchange and the fabric index and peer node id. - */ - void Reset(); - - void AbortTransferOnFailure(CHIP_ERROR error); - System::Layer * mSystemLayer; Messaging::ExchangeManager * mExchangeMgr; - BDXTransferServerDelegate * mDelegate; - BDXTransferProxyDiagnosticLog mTransferProxy; - bool mIsExchangeClosing = false; + BDXTransferServerDelegate * mDelegate; + BdxTransferDiagnosticLogPool mPoolDelegate; }; } // namespace bdx diff --git a/src/protocols/interaction_model/StatusCode.h b/src/protocols/interaction_model/StatusCode.h index f5426834a39393..b004b4e04a9057 100644 --- a/src/protocols/interaction_model/StatusCode.h +++ b/src/protocols/interaction_model/StatusCode.h @@ -37,10 +37,7 @@ namespace chip { namespace Protocols { namespace InteractionModel { -// This table comes from the IM's "Status Code Table" section from the Interaction Model spec. -// TODO: This needs to go back to being an enum class. -// https://github.com/project-chip/connectedhomeip/issues/32025 -enum Status : uint8_t +enum class Status : uint8_t { #define CHIP_IM_STATUS_CODE(name, spec_name, value) name = value, #include @@ -105,7 +102,8 @@ class ClusterStatusCode template static ClusterStatusCode ClusterSpecificFailure(T cluster_specific_code) { - static_assert(std::numeric_limits::max() <= std::numeric_limits::max(), "Type used must fit in uint8_t"); + static_assert(std::numeric_limits>::max() <= std::numeric_limits::max(), + "Type used must fit in uint8_t"); return ClusterStatusCode(Status::Failure, chip::to_underlying(cluster_specific_code)); } @@ -121,7 +119,8 @@ class ClusterStatusCode template static ClusterStatusCode ClusterSpecificSuccess(T cluster_specific_code) { - static_assert(std::numeric_limits::max() <= std::numeric_limits::max(), "Type used must fit in uint8_t"); + static_assert(std::numeric_limits>::max() <= std::numeric_limits::max(), + "Type used must fit in uint8_t"); return ClusterStatusCode(Status::Success, chip::to_underlying(cluster_specific_code)); } diff --git a/src/python_testing/TC_EEM_2_1.py b/src/python_testing/TC_EEM_2_1.py new file mode 100644 index 00000000000000..909380401e49d6 --- /dev/null +++ b/src/python_testing/TC_EEM_2_1.py @@ -0,0 +1,86 @@ +# +# 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. + +import logging + +import chip.clusters as Clusters +from chip.clusters.Types import NullValue +from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main +from mobly import asserts +from TC_EnergyReporting_Utils import EnergyReportingBaseTestHelper + +logger = logging.getLogger(__name__) + + +class TC_EEM_2_1(MatterBaseTest, EnergyReportingBaseTestHelper): + + def desc_TC_EEM_2_1(self) -> str: + """Returns a description of this test""" + return "5.1.2. [TC-EEM-2.1] Attributes with Server as DUT" + + def pics_TC_EEM_2_1(self): + """ This function returns a list of PICS for this test case that must be True for the test to be run""" + return ["EEM.S"] + + def steps_TC_EEM_2_1(self) -> list[TestStep]: + steps = [ + TestStep("1", "Commissioning, already done", is_commissioning=True), + TestStep("2", "TH reads Accuracy attribute. Verify that the DUT response contains a MeasurementAccuracyStruct value."), + TestStep("3", "TH reads CumulativeEnergyImported attribute. Verify that the DUT response contains either null or an EnergyMeasurementStruct value."), + TestStep("4", "TH reads CumulativeEnergyExported attribute. Verify that the DUT response contains either null or an EnergyMeasurementStruct value."), + TestStep("5", "TH reads PeriodicEnergyImported attribute. Verify that the DUT response contains either null or an EnergyMeasurementStruct value."), + TestStep("6", "TH reads PeriodicEnergyExported attribute. Verify that the DUT response contains either null or an EnergyMeasurementStruct value."), + TestStep("7", "TH reads CumulativeEnergyReset attribute. Verify that the DUT response contains either null or an CumulativeEnergyResetStruct value."), + ] + + return steps + + @async_test_body + async def test_TC_EEM_2_1(self): + + self.step("1") + # Commission DUT - already done + + self.step("2") + accuracy = await self.read_eem_attribute_expect_success("Accuracy") + logger.info(f"Rx'd Accuracy: {accuracy}") + asserts.assert_not_equal(accuracy, NullValue, "Accuracy is not allowed to be null") + asserts.assert_equal(accuracy.measurementType, Clusters.ElectricalEnergyMeasurement.Enums.MeasurementTypeEnum.kElectricalEnergy, + "Accuracy measurementType must be ElectricalEnergy") + + self.step("3") + cumulativeEnergyImported = await self.read_eem_attribute_expect_success("CumulativeEnergyImported") + logger.info(f"Rx'd CumulativeEnergyImported: {cumulativeEnergyImported}") + + self.step("4") + cumulativeEnergyExported = await self.read_eem_attribute_expect_success("CumulativeEnergyExported") + logger.info(f"Rx'd CumulativeEnergyExported: {cumulativeEnergyExported}") + + self.step("5") + periodicEnergyImported = await self.read_eem_attribute_expect_success("PeriodicEnergyImported") + logger.info(f"Rx'd PeriodicEnergyImported: {periodicEnergyImported}") + + self.step("6") + periodicEnergyExported = await self.read_eem_attribute_expect_success("PeriodicEnergyExported") + logger.info(f"Rx'd PeriodicEnergyExported: {periodicEnergyExported}") + + self.step("7") + cumulativeEnergyReset = await self.read_eem_attribute_expect_success("CumulativeEnergyReset") + logger.info(f"Rx'd CumulativeEnergyReset: {cumulativeEnergyReset}") + + +if __name__ == "__main__": + default_matter_test_main() diff --git a/src/python_testing/TC_EEM_2_2.py b/src/python_testing/TC_EEM_2_2.py new file mode 100644 index 00000000000000..58e651de9425eb --- /dev/null +++ b/src/python_testing/TC_EEM_2_2.py @@ -0,0 +1,80 @@ +# +# 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. + + +import time + +from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main +from mobly import asserts +from TC_EnergyReporting_Utils import EnergyReportingBaseTestHelper + + +class TC_EEM_2_2(MatterBaseTest, EnergyReportingBaseTestHelper): + + def desc_TC_EEM_2_2(self) -> str: + """Returns a description of this test""" + return "5.1.3. [TC-EEM-2.2] Optional cumulative imported energy attributes with DUT as Server" + + def pics_TC_EEM_2_2(self): + """ This function returns a list of PICS for this test case that must be True for the test to be run""" + return ["EEM.S", "EEM.S.F02(CUME)", "EEM.S.F00(IMPE)"] + + def steps_TC_EEM_2_2(self) -> list[TestStep]: + steps = [ + TestStep("1", "Commissioning, already done", is_commissioning=True), + TestStep("2", "TH reads TestEventTriggersEnabled attribute from General Diagnostics Cluster. Verify that TestEventTriggersEnabled attribute has a value of 1 (True)"), + TestStep("3", "TH sends TestEventTrigger command to General Diagnostics Cluster on Endpoint 0 with EnableKey field set to PIXIT.EEM.TEST_EVENT_TRIGGER_KEY and EventTrigger field set to PIXIT.EEM.TEST_EVENT_TRIGGER for Start Fake Load Test 1kW Event"), + TestStep("4", "Wait 3 seconds"), + TestStep("4a", "TH reads from the DUT the CumulativeEnergyImported attribute. Verify the read is successful and note the value read."), + TestStep("5", "Wait 3 seconds"), + TestStep("5a", "TH reads from the DUT the CumulativeEnergyImported attribute. Verify the read is successful and that the value is greater than the value measured in step 4a."), + TestStep("6", "TH sends TestEventTrigger command to General Diagnostics Cluster on Endpoint 0 with EnableKey field set to PIXIT.EEM.TEST_EVENT_TRIGGER_KEY and EventTrigger field set to PIXIT.EEM.TEST_EVENT_TRIGGER for Stop Fake Readings Test Event."), + ] + + return steps + + @async_test_body + async def test_TC_EEM_2_2(self): + + self.step("1") + # Commission DUT - already done + + self.step("2") + await self.check_test_event_triggers_enabled() + + self.step("3") + await self.send_test_event_trigger_start_fake_1kw_load_2s() + + self.step("4") + time.sleep(3) + + self.step("4a") + cumulative_energy_imported = await self.read_eem_attribute_expect_success("CumulativeEnergyImported") + + self.step("5") + time.sleep(3) + + self.step("5a") + cumulative_energy_imported_2 = await self.read_eem_attribute_expect_success("CumulativeEnergyImported") + asserts.assert_greater(cumulative_energy_imported_2.energy, cumulative_energy_imported.energy, + f"Expected cumulative energy readings {cumulative_energy_imported_2.energy} > {cumulative_energy_imported.energy}") + + self.step("6") + await self.send_test_event_trigger_stop_fake_readings() + + +if __name__ == "__main__": + default_matter_test_main() diff --git a/src/python_testing/TC_EEM_2_3.py b/src/python_testing/TC_EEM_2_3.py new file mode 100644 index 00000000000000..1183d9591bcd5e --- /dev/null +++ b/src/python_testing/TC_EEM_2_3.py @@ -0,0 +1,80 @@ +# +# 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. + + +import time + +from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main +from mobly import asserts +from TC_EnergyReporting_Utils import EnergyReportingBaseTestHelper + + +class TC_EEM_2_3(MatterBaseTest, EnergyReportingBaseTestHelper): + + def desc_TC_EEM_2_3(self) -> str: + """Returns a description of this test""" + return "5.1.4. [TC-EEM-2.3] Optional cumulative exported energy attributes with DUT as Server" + + def pics_TC_EEM_2_3(self): + """ This function returns a list of PICS for this test case that must be True for the test to be run""" + return ["EEM.S", "EEM.S.F02(CUME)", "EEM.S.F01(EXPE)"] + + def steps_TC_EEM_2_3(self) -> list[TestStep]: + steps = [ + TestStep("1", "Commissioning, already done", is_commissioning=True), + TestStep("2", "TH reads TestEventTriggersEnabled attribute from General Diagnostics Cluster. Verify that TestEventTriggersEnabled attribute has a value of 1 (True)"), + TestStep("3", "TH sends TestEventTrigger command to General Diagnostics Cluster on Endpoint 0 with EnableKey field set to PIXIT.EEM.TEST_EVENT_TRIGGER_KEY and EventTrigger field set to PIXIT.EEM.TEST_EVENT_TRIGGER for Start Fake Generator Test 3kW Event"), + TestStep("4", "Wait 6 seconds"), + TestStep("4a", "TH reads from the DUT the CumulativeEnergyExported attribute. Verify the read is successful and note the value read."), + TestStep("5", "Wait 6 seconds"), + TestStep("5a", "TH reads from the DUT the CumulativeEnergyExported attribute. Verify the read is successful and that the value is greater than the value measured in step 4a."), + TestStep("6", "TH sends TestEventTrigger command to General Diagnostics Cluster on Endpoint 0 with EnableKey field set to PIXIT.EEM.TEST_EVENT_TRIGGER_KEY and EventTrigger field set to PIXIT.EEM.TEST_EVENT_TRIGGER for Stop Fake Readings Test Event."), + ] + + return steps + + @async_test_body + async def test_TC_EEM_2_3(self): + + self.step("1") + # Commission DUT - already done + + self.step("2") + await self.check_test_event_triggers_enabled() + + self.step("3") + await self.send_test_event_trigger_start_fake_3kw_generator_5s() + + self.step("4") + time.sleep(6) + + self.step("4a") + cumulative_energy_exported = await self.read_eem_attribute_expect_success("CumulativeEnergyExported") + + self.step("5") + time.sleep(6) + + self.step("5a") + cumulative_energy_exported_2 = await self.read_eem_attribute_expect_success("CumulativeEnergyExported") + asserts.assert_greater(cumulative_energy_exported_2.energy, cumulative_energy_exported.energy, + f"Expected cumulative energy readings {cumulative_energy_exported_2.energy} > {cumulative_energy_exported.energy}") + + self.step("6") + await self.send_test_event_trigger_stop_fake_readings() + + +if __name__ == "__main__": + default_matter_test_main() diff --git a/src/python_testing/TC_EEM_2_4.py b/src/python_testing/TC_EEM_2_4.py new file mode 100644 index 00000000000000..b219e3c4e770a5 --- /dev/null +++ b/src/python_testing/TC_EEM_2_4.py @@ -0,0 +1,80 @@ +# +# 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. + + +import time + +from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main +from mobly import asserts +from TC_EnergyReporting_Utils import EnergyReportingBaseTestHelper + + +class TC_EEM_2_4(MatterBaseTest, EnergyReportingBaseTestHelper): + + def desc_TC_EEM_2_4(self) -> str: + """Returns a description of this test""" + return "5.1.5. [TC-EEM-2.4] Optional periodic imported energy attributes with DUT as Server" + + def pics_TC_EEM_2_4(self): + """ This function returns a list of PICS for this test case that must be True for the test to be run""" + return ["EEM.S", "EEM.S.F03(PERE)", "EEM.S.F00(IMPE)"] + + def steps_TC_EEM_2_4(self) -> list[TestStep]: + steps = [ + TestStep("1", "Commissioning, already done", is_commissioning=True), + TestStep("2", "TH reads TestEventTriggersEnabled attribute from General Diagnostics Cluster. Verify that TestEventTriggersEnabled attribute has a value of 1 (True)"), + TestStep("3", "TH sends TestEventTrigger command to General Diagnostics Cluster on Endpoint 0 with EnableKey field set to PIXIT.EEM.TEST_EVENT_TRIGGER_KEY and EventTrigger field set to PIXIT.EEM.TEST_EVENT_TRIGGER for Start Fake Load Test 1kW Event"), + TestStep("4", "Wait 3 seconds"), + TestStep("4a", "TH reads from the DUT the PeriodicEnergyImported attribute. Verify the read is successful and note the value read."), + TestStep("5", "Wait 3 seconds"), + TestStep("5a", "TH reads from the DUT the PeriodicEnergyImported attribute. Verify the read is successful and that the value read has to be different from value measure in step 4a."), + TestStep("6", "TH sends TestEventTrigger command to General Diagnostics Cluster on Endpoint 0 with EnableKey field set to PIXIT.EEM.TEST_EVENT_TRIGGER_KEY and EventTrigger field set to PIXIT.EEM.TEST_EVENT_TRIGGER for Stop Fake Readings Test Event."), + ] + + return steps + + @async_test_body + async def test_TC_EEM_2_4(self): + + self.step("1") + # Commission DUT - already done + + self.step("2") + await self.check_test_event_triggers_enabled() + + self.step("3") + await self.send_test_event_trigger_start_fake_1kw_load_2s() + + self.step("4") + time.sleep(3) + + self.step("4a") + periodic_energy_imported = await self.read_eem_attribute_expect_success("PeriodicEnergyImported") + + self.step("5") + time.sleep(3) + + self.step("5a") + periodic_energy_imported_2 = await self.read_eem_attribute_expect_success("PeriodicEnergyImported") + asserts.assert_not_equal(periodic_energy_imported_2.energy, periodic_energy_imported.energy, + f"Expected different periodic energy readings {periodic_energy_imported_2.energy} to be != {periodic_energy_imported.energy}") + + self.step("6") + await self.send_test_event_trigger_stop_fake_readings() + + +if __name__ == "__main__": + default_matter_test_main() diff --git a/src/python_testing/TC_EEM_2_5.py b/src/python_testing/TC_EEM_2_5.py new file mode 100644 index 00000000000000..945a97f89da8aa --- /dev/null +++ b/src/python_testing/TC_EEM_2_5.py @@ -0,0 +1,80 @@ +# +# 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. + + +import time + +from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main +from mobly import asserts +from TC_EnergyReporting_Utils import EnergyReportingBaseTestHelper + + +class TC_EEM_2_5(MatterBaseTest, EnergyReportingBaseTestHelper): + + def desc_TC_EEM_2_5(self) -> str: + """Returns a description of this test""" + return "5.1.6. [TC-EEM-2.5] Optional periodic exported energy attributes with DUT as Server" + + def pics_TC_EEM_2_5(self): + """ This function returns a list of PICS for this test case that must be True for the test to be run""" + return ["EEM.S", "EEM.S.F03(PERE)", "EEM.S.F01(EXPE)"] + + def steps_TC_EEM_2_5(self) -> list[TestStep]: + steps = [ + TestStep("1", "Commissioning, already done", is_commissioning=True), + TestStep("2", "TH reads TestEventTriggersEnabled attribute from General Diagnostics Cluster. Verify that TestEventTriggersEnabled attribute has a value of 1 (True)"), + TestStep("3", "TH sends TestEventTrigger command to General Diagnostics Cluster on Endpoint 0 with EnableKey field set to PIXIT.EEM.TEST_EVENT_TRIGGER_KEY and EventTrigger field set to PIXIT.EEM.TEST_EVENT_TRIGGER for Start Fake Generator Test 3kW Event"), + TestStep("4", "Wait 6 seconds"), + TestStep("4a", "TH reads from the DUT the PeriodicEnergyExported attribute. Verify the read is successful and note the value read."), + TestStep("5", "Wait 6 seconds"), + TestStep("5a", "TH reads from the DUT the PeriodicEnergyExported attribute. Verify the read is successful and that the value read has to be different from value measure in step 4a."), + TestStep("6", "TH sends TestEventTrigger command to General Diagnostics Cluster on Endpoint 0 with EnableKey field set to PIXIT.EEM.TEST_EVENT_TRIGGER_KEY and EventTrigger field set to PIXIT.EEM.TEST_EVENT_TRIGGER for Stop Fake Readings Test Event."), + ] + + return steps + + @async_test_body + async def test_TC_EEM_2_5(self): + + self.step("1") + # Commission DUT - already done + + self.step("2") + await self.check_test_event_triggers_enabled() + + self.step("3") + await self.send_test_event_trigger_start_fake_3kw_generator_5s() + + self.step("4") + time.sleep(6) + + self.step("4a") + periodic_energy_exported = await self.read_eem_attribute_expect_success("PeriodicEnergyExported") + + self.step("5") + time.sleep(6) + + self.step("5a") + periodic_energy_exported_2 = await self.read_eem_attribute_expect_success("PeriodicEnergyExported") + asserts.assert_not_equal(periodic_energy_exported_2.energy, periodic_energy_exported.energy, + f"Expected different periodic energy readings {periodic_energy_exported_2.energy} to be != {periodic_energy_exported.energy}") + + self.step("6") + await self.send_test_event_trigger_stop_fake_readings() + + +if __name__ == "__main__": + default_matter_test_main() diff --git a/src/python_testing/TC_EPM_2_1.py b/src/python_testing/TC_EPM_2_1.py new file mode 100644 index 00000000000000..fc4347e1ec0a0d --- /dev/null +++ b/src/python_testing/TC_EPM_2_1.py @@ -0,0 +1,211 @@ +# +# 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. + +import logging + +import chip.clusters as Clusters +from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main +from mobly import asserts +from TC_EnergyReporting_Utils import EnergyReportingBaseTestHelper + +logger = logging.getLogger(__name__) + + +class TC_EPM_2_1(MatterBaseTest, EnergyReportingBaseTestHelper): + + def desc_TC_EPM_2_1(self) -> str: + """Returns a description of this test""" + return "5.1.2. [TC-EPM-2.1] Attributes with Server as DUT" + + def pics_TC_EPM_2_1(self): + """ This function returns a list of PICS for this test case that must be True for the test to be run""" + return ["EPM.S"] + + def steps_TC_EPM_2_1(self) -> list[TestStep]: + steps = [ + TestStep("1", "Commissioning, already done", is_commissioning=True), + TestStep("2", "TH reads PowerMode attribute. Verify that the DUT response contains an enum8 value"), + TestStep("3", "TH reads NumberOfMeasurementTypes attribute. Verify that the DUT response contains an uint8 value."), + TestStep("4", "TH reads Accuracy attribute. Verify that the DUT response contains a list of MeasurementAccuracyStruct entries - Verify that the list has between 1 and NumberOfMeasurementTypes entries."), + TestStep("5", "TH reads Ranges attribute. Verify that the DUT response contains a list of MeasurementRangeStruct entries - Verify that the list has between 0 and NumberOfMeasurementTypes entries."), + TestStep("6", "TH reads Voltage attribute. Verify that the DUT response contains either null or an int64 value. Value has to be between a range of -2^62 to 2^62."), + TestStep("7", "TH reads ActiveCurrent attribute. Verify that the DUT response contains either null or an int64 value. Value has to be between a range of -2^62 to 2^62."), + TestStep("8", "TH reads ReactiveCurrent attribute. Verify that the DUT response contains either null or an int64 value. Value has to be between a range of -2^62 to 2^62."), + TestStep("9", "TH reads ApparentCurrent attribute. Verify that the DUT response contains either null or an int64 value. Value has to be between a range of 0 to 2^62."), + TestStep("10", "TH reads ActivePower attribute. Verify that the DUT response contains either null or an int64 value. Value has to be between a range of -2^62 to 2^62."), + TestStep("11", "TH reads ReactivePower attribute. Verify that the DUT response contains either null or an int64 value. Value has to be between a range of -2^62 to 2^62."), + TestStep("12", "TH reads ApparentPower attribute. Verify that the DUT response contains either null or an int64 value. Value has to be between a range of -2^62 to 2^62."), + TestStep("13", "TH reads RMSVoltage attribute. Verify that the DUT response contains either null or an int64 value. Value has to be between a range of -2^62 to 2^62."), + TestStep("14", "TH reads RMSCurrent attribute. Verify that the DUT response contains either null or an int64 value. Value has to be between a range of -2^62 to 2^62."), + TestStep("15", "TH reads RMSPower attribute. Verify that the DUT response contains either null or an int64 value. Value has to be between a range of -2^62 to 2^62."), + TestStep("16", "TH reads Frequency attribute. Verify that the DUT response contains either null or an int64 value. Value has to be between a range of 0 to 1000000."), + TestStep("17", "TH reads HarmonicCurrents attribute. Verify that the DUT response contains a list of HarmonicMeasurementStruct entries."), + TestStep("18", "TH reads HarmonicPhases attribute. Verify that the DUT response contains a list of HarmonicMeasurementStruct entries."), + TestStep("19", "TH reads PowerFactor attribute. Verify that the DUT response contains either null or an int64 value. Value has to be between a range of -10000 to 10000."), + TestStep("20", "TH reads NeutralCurrent attribute. Verify that the DUT response contains either null or an int64 value. Value has to be between a range of -2^62 to 2^62."), + ] + + return steps + + @async_test_body + async def test_TC_EPM_2_1(self): + + self.step("1") + # Commission DUT - already done + + supported_attributes = await self.get_supported_epm_attributes() + + self.step("2") + power_mode = await self.read_epm_attribute_expect_success("PowerMode") + logger.info(f"Rx'd PowerMode: {power_mode}") + asserts.assert_not_equal(power_mode, Clusters.ElectricalPowerMeasurement.Enums.PowerModeEnum.kUnknown, + "PowerMode must not be Unknown") + + self.step("3") + number_of_measurements = await self.read_epm_attribute_expect_success("NumberOfMeasurementTypes") + logger.info(f"Rx'd NumberOfMeasurementTypes: {number_of_measurements}") + asserts.assert_greater_equal(number_of_measurements, 1, + "NumberOfMeasurementTypes must be >= 1") + + self.step("4") + accuracy = await self.read_epm_attribute_expect_success("Accuracy") + logger.info(f"Rx'd Accuracy: {accuracy}") + logger.info("Checking Accuracy meets spec requirements") + found_active_power = False + for measurement in accuracy: + logging.info( + f"measurementType:{measurement.measurementType} measured:{measurement.measured} minMeasuredValue:{measurement.minMeasuredValue} maxMeasuredValue:{measurement.maxMeasuredValue}") + + # Scan all measurement types to check we have the mandatory kActivePower + if (measurement.measurementType == Clusters.ElectricalPowerMeasurement.Enums.MeasurementTypeEnum.kActivePower): + found_active_power = True + + # Check that the ranges are in order from minimum to maximum and don't have gaps + asserts.assert_equal(measurement.minMeasuredValue, measurement.accuracyRanges[0].rangeMin, + "minMeasuredValue must be the same as 1st accuracyRange rangeMin") + + for index, range_entry in enumerate(measurement.accuracyRanges): + logging.info(f" [{index}] rangeMin:{range_entry.rangeMin} rangeMax:{range_entry.rangeMax} percentMax:{range_entry.percentMax} percentMin:{range_entry.percentMin} percentTypical:{range_entry.percentTypical} fixedMax:{range_entry.fixedMax} fixedMin:{range_entry.fixedMin} fixedTypical:{range_entry.fixedTypical}") + asserts.assert_greater(range_entry.rangeMax, range_entry.rangeMin, "rangeMax should be > rangeMin") + if index == 0: + minimum_range = range_entry.rangeMin + maximum_range = range_entry.rangeMax + prev_range_max = range_entry.rangeMax + else: + minimum_range = min(minimum_range, range_entry.rangeMin) + maximum_range = max(maximum_range, range_entry.rangeMax) + asserts.assert_equal(range_entry.rangeMin, prev_range_max + 1, + f"Index[{index}] rangeMin was not +1 more then previous index's rangeMax {prev_range_max}") + prev_range_max = range_entry.rangeMax + + # Check that the last range rangeMax has the same value as the measurement.maxMeasuredValue + asserts.assert_equal(measurement.maxMeasuredValue, prev_range_max, + "maxMeasuredValue must be the same as the last accuracyRange rangeMax") + asserts.assert_equal(maximum_range, measurement.maxMeasuredValue, + "The maxMeasuredValue must be the same as any of the maximum of all rangeMax's") + asserts.assert_equal(minimum_range, measurement.minMeasuredValue, + "The minMeasuredValue must be the same as any of the minimum of all rangeMin's") + + asserts.assert_is(found_active_power, True, "There must be an ActivePower measurement accuracy") + asserts.assert_equal(len(accuracy), number_of_measurements, + "The number of accuracy entries should match the NumberOfMeasurementTypes") + + self.step("5") + if self.pics_guard(Clusters.ElectricalPowerMeasurement.Attributes.Ranges.attribute_id in supported_attributes): + ranges = await self.read_epm_attribute_expect_success("Ranges") + logger.info(f"Rx'd Ranges: {ranges}") + # Check list length between 0 and NumberOfMeasurementTypes + asserts.assert_greater_equal(len(ranges), 0) + asserts.assert_less_equal(len(ranges), number_of_measurements) + + self.step("6") + if self.pics_guard(Clusters.ElectricalPowerMeasurement.Attributes.Voltage.attribute_id in supported_attributes): + voltage = await self.check_epm_attribute_in_range("Voltage", -2 ^ 62, 2 ^ 62, allow_null=True) + logger.info(f"Rx'd Voltage: {voltage}") + + self.step("7") + if self.pics_guard(Clusters.ElectricalPowerMeasurement.Attributes.ActiveCurrent.attribute_id in supported_attributes): + active_current = await self.check_epm_attribute_in_range("ActiveCurrent", -2 ^ 62, 2 ^ 62, allow_null=True) + logger.info(f"Rx'd ActiveCurrent: {active_current}") + + self.step("8") + if self.pics_guard(Clusters.ElectricalPowerMeasurement.Attributes.ReactiveCurrent.attribute_id in supported_attributes): + reactive_current = await self.check_epm_attribute_in_range("ReactiveCurrent", -2 ^ 62, 2 ^ 62, allow_null=True) + logger.info(f"Rx'd ReactiveCurrent: {reactive_current}") + + self.step("9") + if self.pics_guard(Clusters.ElectricalPowerMeasurement.Attributes.ApparentCurrent.attribute_id in supported_attributes): + apparent_current = await self.check_epm_attribute_in_range("ApparentCurrent", 0, 2 ^ 62, allow_null=True) + logger.info(f"Rx'd ApparentCurrent: {apparent_current}") + + self.step("10") + if self.pics_guard(Clusters.ElectricalPowerMeasurement.Attributes.ActivePower.attribute_id in supported_attributes): + active_power = await self.check_epm_attribute_in_range("ActivePower", -2 ^ 62, 2 ^ 62, allow_null=True) + logger.info(f"Rx'd ActivePower: {active_power}") + + self.step("11") + if self.pics_guard(Clusters.ElectricalPowerMeasurement.Attributes.ReactivePower.attribute_id in supported_attributes): + reactive_power = await self.check_epm_attribute_in_range("ReactivePower", -2 ^ 62, 2 ^ 62, allow_null=True) + logger.info(f"Rx'd ReactivePower: {reactive_power}") + + self.step("12") + if self.pics_guard(Clusters.ElectricalPowerMeasurement.Attributes.ApparentPower.attribute_id in supported_attributes): + apparent_power = await self.check_epm_attribute_in_range("ApparentPower", -2 ^ 62, 2 ^ 62, allow_null=True) + logger.info(f"Rx'd ApparentPower: {apparent_power}") + + self.step("13") + if self.pics_guard(Clusters.ElectricalPowerMeasurement.Attributes.RMSVoltage.attribute_id in supported_attributes): + rms_voltage = await self.check_epm_attribute_in_range("RMSVoltage", -2 ^ 62, 2 ^ 62, allow_null=True) + logger.info(f"Rx'd RMSVoltage: {rms_voltage}") + + self.step("14") + if self.pics_guard(Clusters.ElectricalPowerMeasurement.Attributes.RMSCurrent.attribute_id in supported_attributes): + rms_current = await self.check_epm_attribute_in_range("RMSCurrent", -2 ^ 62, 2 ^ 62, allow_null=True) + logger.info(f"Rx'd RMSCurrent: {rms_current}") + + self.step("15") + if self.pics_guard(Clusters.ElectricalPowerMeasurement.Attributes.RMSPower.attribute_id in supported_attributes): + rms_power = await self.check_epm_attribute_in_range("RMSPower", -2 ^ 62, 2 ^ 62, allow_null=True) + logger.info(f"Rx'd RMSPower: {rms_power}") + + self.step("16") + if self.pics_guard(Clusters.ElectricalPowerMeasurement.Attributes.Frequency.attribute_id in supported_attributes): + frequency = await self.check_epm_attribute_in_range("Frequency", 0, 1000000, allow_null=True) + logger.info(f"Rx'd Frequency: {frequency}") + + self.step("17") + if self.pics_guard(Clusters.ElectricalPowerMeasurement.Attributes.HarmonicCurrents.attribute_id in supported_attributes): + harmonic_currents = await self.read_epm_attribute_expect_success("HarmonicCurrents", allow_null=True) + logger.info(f"Rx'd HarmonicCurrents: {harmonic_currents}") + + self.step("18") + if self.pics_guard(Clusters.ElectricalPowerMeasurement.Attributes.HarmonicPhases.attribute_id in supported_attributes): + harmonic_phases = await self.read_epm_attribute_expect_success("HarmonicPhases", allow_null=True) + logger.info(f"Rx'd HarmonicPhases: {harmonic_phases}") + + self.step("19") + if self.pics_guard(Clusters.ElectricalPowerMeasurement.Attributes.PowerFactor.attribute_id in supported_attributes): + power_factor = await self.check_epm_attribute_in_range("PowerFactor", -10000, 10000, allow_null=True) + logger.info(f"Rx'd PowerFactor: {power_factor}") + + self.step("20") + if self.pics_guard(Clusters.ElectricalPowerMeasurement.Attributes.NeutralCurrent.attribute_id in supported_attributes): + neutral_current = await self.check_epm_attribute_in_range("NeutralCurrent", -2 ^ 62, 2 ^ 62, allow_null=True) + logger.info(f"Rx'd NeutralCurrent: {neutral_current}") + + +if __name__ == "__main__": + default_matter_test_main() diff --git a/src/python_testing/TC_EPM_2_2.py b/src/python_testing/TC_EPM_2_2.py new file mode 100644 index 00000000000000..eb6f6081f6d690 --- /dev/null +++ b/src/python_testing/TC_EPM_2_2.py @@ -0,0 +1,105 @@ +# +# 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. + + +import logging +import time + +from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main +from mobly import asserts +from TC_EnergyReporting_Utils import EnergyReportingBaseTestHelper + +logger = logging.getLogger(__name__) + + +class TC_EPM_2_2(MatterBaseTest, EnergyReportingBaseTestHelper): + + def desc_TC_EPM_2_2(self) -> str: + """Returns a description of this test""" + return "5.1.3. [TC-EPM-2.2] Primary functionality with DUT as Server" + + def pics_TC_EPM_2_2(self): + """ This function returns a list of PICS for this test case that must be True for the test to be run""" + # In this case - there is no feature flags needed to run this test case + return ["EPM.S"] + + def steps_TC_EPM_2_2(self) -> list[TestStep]: + steps = [ + TestStep("1", "Commissioning, already done", is_commissioning=True), + TestStep("2", "TH reads TestEventTriggersEnabled attribute from General Diagnostics Cluster. Verify that TestEventTriggersEnabled attribute has a value of 1 (True)"), + TestStep("3", "TH sends TestEventTrigger command to General Diagnostics Cluster on Endpoint 0 with EnableKey field set to PIXIT.EPM.TEST_EVENT_TRIGGER_KEY and EventTrigger field set to PIXIT.EPM.TEST_EVENT_TRIGGER for Start Fake Load Test 1kW Event"), + TestStep("4", "Wait 3 seconds"), + TestStep("4a", "TH reads from the DUT the ActivePower attribute. Verify the read is successful and that the value is between 980'000 and 1'020'000 mW. Note the value read."), + TestStep("4b", "TH reads from the DUT the ActiveCurrent attribute. Verify the read is successful and that the value is between 3'848 and 4'848 mA. Note the value read."), + TestStep("4c", "TH reads from the DUT the Voltage attribute. Verify the read is successful and that the value is between 229'000 and 231'000 mV. Note the value read."), + TestStep("5", "Wait 3 seconds"), + TestStep("5a", "TH reads from the DUT the ActivePower attribute. Verify the read is successful, that the value is between '980'000 and 1'020'000 mW, and the value is different from the value read in step 4a."), + TestStep("5b", "TH reads from the DUT the ActiveCurrent attribute. Verify the read is successful, that the value is between 3'848 and 4'848 mA, and the value is different from the value read in step 4b."), + TestStep("5c", "TH reads from the DUT the Voltage attribute. Verify the read is successful, that the value is between 229'000 and 231'000 mV, and the value is different from the value read in step 4c."), + TestStep("6", "TH sends TestEventTrigger command to General Diagnostics Cluster on Endpoint 0 with EnableKey field set to PIXIT.EPM.TEST_EVENT_TRIGGER_KEY and EventTrigger field set to PIXIT.EPM.TEST_EVENT_TRIGGER for Stop Fake Readings Test Event."), + ] + + return steps + + @async_test_body + async def test_TC_EPM_2_2(self): + + self.step("1") + # Commission DUT - already done + + self.step("2") + await self.check_test_event_triggers_enabled() + + self.step("3") + await self.send_test_event_trigger_start_fake_1kw_load_2s() + + # After 3 seconds... + self.step("4") + time.sleep(3) + + self.step("4a") + active_power = await self.check_epm_attribute_in_range("ActivePower", 980000, 1020000) # 1kW +/- 20W + + self.step("4b") + active_current = await self.check_epm_attribute_in_range("ActiveCurrent", 3848, 4848) # 4.348 A +/- 500mA + + self.step("4c") + voltage = await self.check_epm_attribute_in_range("Voltage", 229000, 231000) # 230V +/- 1V + + self.step("5") + # After 3 seconds... + time.sleep(3) + + self.step("5a") + active_power2 = await self.check_epm_attribute_in_range("ActivePower", 980000, 1020000) # 1kW +/- 20W + asserts.assert_not_equal(active_power, active_power2, + f"Expected ActivePower readings to have changed {active_power}, {active_power2}") + + self.step("5b") + active_current2 = await self.check_epm_attribute_in_range("ActiveCurrent", 3848, 4848) # 4.348 A +/- 500mA + asserts.assert_not_equal(active_current, active_current2, + f"Expected ActiveCurrent readings to have changed {active_current}, {active_current2}") + + self.step("5c") + voltage2 = await self.check_epm_attribute_in_range("Voltage", 229000, 231000) # 230V +/- 1V + asserts.assert_not_equal(voltage, voltage2, f"Expected Voltage readings to have changed {voltage}, {voltage2}") + + self.step("6") + await self.send_test_event_trigger_stop_fake_readings() + + +if __name__ == "__main__": + default_matter_test_main() diff --git a/src/python_testing/TC_EnergyReporting_Utils.py b/src/python_testing/TC_EnergyReporting_Utils.py new file mode 100644 index 00000000000000..4f26254d61a2de --- /dev/null +++ b/src/python_testing/TC_EnergyReporting_Utils.py @@ -0,0 +1,78 @@ +# +# 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. + + +import logging + +import chip.clusters as Clusters +from chip.clusters.Types import NullValue +from mobly import asserts + +logger = logging.getLogger(__name__) + + +class EnergyReportingBaseTestHelper: + + async def read_epm_attribute_expect_success(self, attribute: str = "", endpoint: int = None, ): + cluster = Clusters.Objects.ElectricalPowerMeasurement + full_attr = getattr(cluster.Attributes, attribute) + return await self.read_single_attribute_check_success(endpoint=endpoint, cluster=cluster, attribute=full_attr) + + async def read_eem_attribute_expect_success(self, attribute: str = "", endpoint: int = None): + cluster = Clusters.Objects.ElectricalEnergyMeasurement + full_attr = getattr(cluster.Attributes, attribute) + return await self.read_single_attribute_check_success(endpoint=endpoint, cluster=cluster, attribute=full_attr) + + def check_value_in_range(self, attribute: str, value: int, lower_value: int, upper_value: int): + asserts.assert_greater_equal(value, lower_value, + f"Unexpected '{attribute}' value - expected {lower_value}, was {value}") + asserts.assert_less_equal(value, upper_value, + f"Unexpected '{attribute}' value - expected {upper_value}, was {value}") + + async def check_epm_attribute_in_range(self, attribute, lower_value: int, upper_value: int, endpoint: int = None, allow_null: bool = False): + value = await self.read_epm_attribute_expect_success(endpoint=endpoint, attribute=attribute) + if allow_null and value is NullValue: + # skip the range check + logger.info("value is NULL - OK") + return value + + self.check_value_in_range(attribute, value, lower_value, upper_value) + return value + + async def check_eem_attribute_in_range(self, attribute, lower_value: int, upper_value: int, endpoint: int = None, allow_null: bool = False): + value = await self.read_eem_attribute_expect_success(endpoint=endpoint, attribute=attribute) + if allow_null and value is NullValue: + # skip the range check + logger.info("value is NULL - OK") + return value + + self.check_value_in_range(attribute, value, lower_value, upper_value) + return value + + async def get_supported_epm_attributes(self, endpoint: int = None): + return await self.read_epm_attribute_expect_success("AttributeList", endpoint) + + async def get_supported_eem_attributes(self, endpoint: int = None): + return await self.read_eem_attribute_expect_success("AttributeList", endpoint) + + async def send_test_event_trigger_stop_fake_readings(self): + await self.send_test_event_triggers(eventTrigger=0x0091000000000000) + + async def send_test_event_trigger_start_fake_1kw_load_2s(self): + await self.send_test_event_triggers(eventTrigger=0x0091000000000001) + + async def send_test_event_trigger_start_fake_3kw_generator_5s(self): + await self.send_test_event_triggers(eventTrigger=0x0091000000000002) diff --git a/src/python_testing/TC_IDM_1_4.py b/src/python_testing/TC_IDM_1_4.py index 86e49bb3523f42..507b5d74254abf 100644 --- a/src/python_testing/TC_IDM_1_4.py +++ b/src/python_testing/TC_IDM_1_4.py @@ -16,21 +16,16 @@ # import logging -from dataclasses import dataclass import chip.clusters as Clusters -from chip import ChipUtility from chip.exceptions import ChipStackError from chip.interaction_model import InteractionModelError, Status from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main, type_matches from mobly import asserts - -@dataclass -class FakeInvalidBasicInformationCommand(Clusters.BasicInformation.Commands.MfgSpecificPing): - @ChipUtility.classproperty - def must_use_timed_invoke(cls) -> bool: - return False +# If DUT supports `MaxPathsPerInvoke > 1`, additional command line argument +# run with +# --hex-arg PIXIT.DGGEN.TEST_EVENT_TRIGGER_KEY: class TC_IDM_1_4(MatterBaseTest): @@ -44,7 +39,9 @@ def steps_TC_IDM_1_4(self) -> list[TestStep]: TestStep(6, "Verify DUT responds to InvokeRequestMessage containing one valid paths, and one InvokeRequest to unsupported endpoint"), TestStep(7, "Verify DUT responds to InvokeRequestMessage containing two valid paths. One of which requires timed invoke, and TimedRequest in InvokeResponseMessage set to true, but never sending preceding Timed Invoke Action"), TestStep(8, "Verify DUT responds to InvokeRequestMessage containing two valid paths. One of which requires timed invoke, and TimedRequest in InvokeResponseMessage set to true"), - TestStep(9, "Verify DUT capable of responding to request with multiple InvokeResponseMessages")] + TestStep(9, "Verify DUT supports extended Data Model Testing feature in General Diagnostics Cluster"), + TestStep(10, "Verify DUT has TestEventTriggersEnabled attribute set to true in General Diagnostics Cluster"), + TestStep(11, "Verify DUT capable of responding to request with multiple InvokeResponseMessages")] return steps @async_test_body @@ -118,9 +115,14 @@ async def test_TC_IDM_1_4(self): if max_paths_per_invoke == 1: self.skip_all_remaining_steps(3) else: - await self.steps_3_to_9(False) + asserts.assert_true('PIXIT.DGGEN.TEST_EVENT_TRIGGER_KEY' in self.matter_test_config.global_test_params, + "PIXIT.DGGEN.TEST_EVENT_TRIGGER_KEY must be included on the command line in " + "the --hex-arg flag as PIXIT.DGGEN.TEST_EVENT_TRIGGER_KEY:, " + "e.g. --hex-arg PIXIT.DGGEN.TEST_EVENT_TRIGGER_KEY:000102030405060708090a0b0c0d0e0f") + + await self.remaining_batch_commands_test_steps(False) - async def steps_3_to_9(self, dummy_value): + async def remaining_batch_commands_test_steps(self, dummy_value): dev_ctrl = self.default_controller dut_node_id = self.dut_node_id @@ -247,8 +249,66 @@ async def steps_3_to_9(self, dummy_value): except InteractionModelError: asserts.fail("DUT failed with non-path specific error when path specific error was expected") - # Skipping test until https://github.com/project-chip/connectedhomeip/issues/31434 resolved - self.skip_step(9) + self.step(9) + try: + feature_map = await self.read_single_attribute( + dev_ctrl, + dut_node_id, + endpoint=0, + attribute=Clusters.GeneralDiagnostics.Attributes.FeatureMap + ) + except InteractionModelError: + asserts.fail("DUT failed to respond reading FeatureMap attribute") + has_data_model_test_feature = (feature_map & Clusters.GeneralDiagnostics.Bitmaps.Feature.kDataModelTest) != 0 + asserts.assert_true(has_data_model_test_feature, "DataModelTest Feature is not supported by DUT") + + self.step(10) + try: + test_event_triggers_enabled = await self.read_single_attribute( + dev_ctrl, + dut_node_id, + endpoint=0, + attribute=Clusters.GeneralDiagnostics.Attributes.TestEventTriggersEnabled + ) + except InteractionModelError: + asserts.fail("DUT failed to respond reading TestEventTriggersEnabled attribute") + asserts.assert_true(test_event_triggers_enabled, "Test Event Triggers must be enabled on DUT") + + self.step(11) + enable_key = self.matter_test_config.global_test_params['PIXIT.DGGEN.TEST_EVENT_TRIGGER_KEY'] + endpoint = 0 + command = Clusters.GeneralDiagnostics.Commands.PayloadTestRequest( + enableKey=enable_key, + value=ord('A'), + count=800 + ) + invoke_request_1 = Clusters.Command.InvokeRequestInfo(endpoint, command) + + command = Clusters.OperationalCredentials.Commands.CertificateChainRequest( + Clusters.OperationalCredentials.Enums.CertificateChainTypeEnum.kDACCertificate) + invoke_request_2 = Clusters.Command.InvokeRequestInfo(endpoint, command) + + try: + test_only_result = await dev_ctrl.TestOnlySendBatchCommands(dut_node_id, [invoke_request_1, invoke_request_2]) + except InteractionModelError: + asserts.fail("DUT failed to respond to batch commands, where response is expected to be too large to fit in a single ResponseMessage") + + responses = test_only_result.Responses + # This check is validating the number of InvokeResponses we got + asserts.assert_equal(len(responses), 2, "Unexpected number of InvokeResponses sent back from DUT") + asserts.assert_true(type_matches( + responses[0], Clusters.GeneralDiagnostics.Commands.PayloadTestResponse), "Unexpected return type for first InvokeRequest") + asserts.assert_true(type_matches( + responses[1], Clusters.OperationalCredentials.Commands.CertificateChainResponse), "Unexpected return type for second InvokeRequest") + logging.info("DUT successfully responded to a InvokeRequest action with two valid commands") + + asserts.assert_equal(responses[0].payload, b'A' * 800, "Expect response to match for count == 800") + # If this assert below fails then some assumptions we were relying on are now no longer true. + # This check is validating the number of InvokeResponsesMessages we got. This is different then the earlier + # `len(responses)` check as you can have multiple InvokeResponses in a single message. But this test step + # is explicitly making sure that we recieved multiple ResponseMessages. + asserts.assert_greater_equal(test_only_result.ResponseMessageCount, 2, + "DUT was expected to send multiple InvokeResponseMessages") if __name__ == "__main__": diff --git a/src/python_testing/TC_MWOCTRL_2_2.py b/src/python_testing/TC_MWOCTRL_2_2.py new file mode 100644 index 00000000000000..abe02d8237a8db --- /dev/null +++ b/src/python_testing/TC_MWOCTRL_2_2.py @@ -0,0 +1,94 @@ +# +# 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. +# + +import logging + +import chip.clusters as Clusters +from chip.interaction_model import InteractionModelError, Status +from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main +from mobly import asserts + +# This test requires several additional command line arguments +# run with +# --endpoint endpoint + + +class TC_MWOCTRL_2_2(MatterBaseTest): + + async def read_mwoctrl_attribute_expect_success(self, endpoint, attribute): + cluster = Clusters.Objects.MicrowaveOvenControl + return await self.read_single_attribute_check_success(endpoint=endpoint, cluster=cluster, attribute=attribute) + + def desc_TC_MWOCTRL_2_2(self) -> str: + return "[TC-MWOCTRL-2.2] Secondary functionality with DUT as Server" + + def steps_TC_MWOCTRL_2_2(self) -> list[TestStep]: + steps = [ + TestStep(1, "Commissioning, already done", is_commissioning=True), + TestStep(2, "Read the PowerSetting attribute"), + TestStep(3, "Send the SetCookingParameters command"), + TestStep(4, "Read and verify the PowerSetting attribute"), + ] + return steps + + def pics_TC_MWOCTRL_2_2(self) -> list[str]: + pics = [ + "MWOCTRL.S", + ] + return pics + + @async_test_body + async def test_TC_MWOCTRL_2_2(self): + + endpoint = self.user_params.get("endpoint", 1) + + self.step(1) + attributes = Clusters.MicrowaveOvenControl.Attributes + feature_map = await self.read_mwoctrl_attribute_expect_success(endpoint=endpoint, attribute=attributes.FeatureMap) + features = Clusters.MicrowaveOvenControl.Bitmaps.Feature + commands = Clusters.Objects.MicrowaveOvenControl.Commands + + feature_map = await self.read_mwoctrl_attribute_expect_success(endpoint=endpoint, attribute=attributes.FeatureMap) + + only_pwrnum_supported = feature_map == features.kPowerAsNumber + + if not only_pwrnum_supported: + logging.info("More than PWRNUM is supported so skipping remaining test steps") + self.skip_all_remaining_steps(2) + return + + logging.info("Only the PWRNUM feature is supported so continuing with remaining test steps") + self.step(2) + powerValue = await self.read_mwoctrl_attribute_expect_success(endpoint=endpoint, attribute=attributes.PowerSetting) + asserts.assert_greater_equal(powerValue, 10, "PowerSetting is less than 10") + asserts.assert_less_equal(powerValue, 100, "PowerSetting is greater than 100") + asserts.assert_true(powerValue % 10 == 0, "PowerSetting is not a multiple of 10") + + self.step(3) + newPowerValue = (powerValue+10) % 100 + try: + await self.send_single_cmd(cmd=commands.SetCookingParameters(powerSetting=newPowerValue), endpoint=endpoint) + except InteractionModelError as e: + asserts.assert_equal(e.status, Status.Success, "Unexpected error returned") + + self.step(4) + powerValue = await self.read_mwoctrl_attribute_expect_success(endpoint=endpoint, attribute=attributes.PowerSetting) + asserts.assert_true(powerValue == newPowerValue, "PowerSetting was not correctly set") + + +if __name__ == "__main__": + default_matter_test_main() diff --git a/src/python_testing/TC_MWOCTRL_2_3.py b/src/python_testing/TC_MWOCTRL_2_3.py new file mode 100644 index 00000000000000..0d34c5b3ee8fde --- /dev/null +++ b/src/python_testing/TC_MWOCTRL_2_3.py @@ -0,0 +1,114 @@ +# +# 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. +# + +import logging + +import chip.clusters as Clusters +from chip.interaction_model import InteractionModelError, Status +from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main +from mobly import asserts + +# This test requires several additional command line arguments +# run with +# --endpoint endpoint + + +class TC_MWOCTRL_2_3(MatterBaseTest): + + async def read_mwoctrl_attribute_expect_success(self, endpoint, attribute): + cluster = Clusters.Objects.MicrowaveOvenControl + return await self.read_single_attribute_check_success(endpoint=endpoint, cluster=cluster, attribute=attribute) + + def desc_TC_MWOCTRL_2_3(self) -> str: + return "[TC-MWOCTRL-2.3] PWRNUM functionality with DUT as Server" + + def steps_TC_MWOCTRL_2_3(self) -> list[TestStep]: + steps = [ + TestStep(1, "Commissioning, already done", is_commissioning=True), + TestStep(2, "Read the MinPower attribute"), + TestStep(3, "Read the MaxPower attribute"), + TestStep(4, "Read the PowerStep attribute"), + TestStep(5, "Read the PowerSetting attribute"), + TestStep(6, "Send the SetCookingParameters command"), + TestStep(7, "Read and verify the PowerSetting attribute"), + ] + return steps + + def pics_TC_MWOCTRL_2_3(self) -> list[str]: + pics = [ + "MWOCTRL.S", + ] + return pics + + @async_test_body + async def test_TC_MWOCTRL_2_3(self): + + endpoint = self.user_params.get("endpoint", 1) + + self.step(1) + attributes = Clusters.MicrowaveOvenControl.Attributes + feature_map = await self.read_mwoctrl_attribute_expect_success(endpoint=endpoint, attribute=attributes.FeatureMap) + features = Clusters.MicrowaveOvenControl.Bitmaps.Feature + commands = Clusters.Objects.MicrowaveOvenControl.Commands + + feature_map = await self.read_mwoctrl_attribute_expect_success(endpoint=endpoint, attribute=attributes.FeatureMap) + + supports_pwrnum_and_limits = feature_map & (features.kPowerAsNumber or features.kPowerNumberLimits) + + if not supports_pwrnum_and_limits: + logging.info("Device does not support PWRNUM and PWRLMTS so skipping the rest of the tests.") + self.skip_all_remaining_steps(2) + return + + self.step(2) + minPowerValue = await self.read_mwoctrl_attribute_expect_success(endpoint=endpoint, attribute=attributes.MinPower) + logging.info("MinPower is %s" % minPowerValue) + asserts.assert_true(minPowerValue >= 1, "MinPower is less than 1") + + self.step(3) + maxPowerValue = await self.read_mwoctrl_attribute_expect_success(endpoint=endpoint, attribute=attributes.MaxPower) + logging.info("MaxPower is %s" % maxPowerValue) + asserts.assert_true(maxPowerValue >= 1, "MaxPower is less than MinPower") + asserts.assert_true(maxPowerValue <= 100, "MaxPower is greater than 100") + + self.step(4) + powerStepValue = await self.read_mwoctrl_attribute_expect_success(endpoint=endpoint, attribute=attributes.PowerStep) + logging.info("PowerStep is %s" % powerStepValue) + asserts.assert_true(powerStepValue >= 1, "PowerStep is less than 1") + asserts.assert_true(powerStepValue <= maxPowerValue, "PowerStep is greater than MaxPower") + + self.step(5) + powerValue = await self.read_mwoctrl_attribute_expect_success(endpoint=endpoint, attribute=attributes.PowerSetting) + logging.info("PowerSetting is %s" % powerValue) + asserts.assert_true(powerValue >= minPowerValue, "PowerSetting is less than MinPower") + asserts.assert_true(powerValue <= maxPowerValue, "PowerSetting is greater than MaxPower") + asserts.assert_true((powerValue-minPowerValue) % powerStepValue == 0, "PowerSetting is not a multiple of 10") + + self.step(6) + newPowerValue = (powerValue-minPowerValue) % (maxPowerValue-minPowerValue)+powerStepValue+minPowerValue + try: + await self.send_single_cmd(cmd=commands.SetCookingParameters(powerSetting=newPowerValue), endpoint=endpoint) + except InteractionModelError as e: + asserts.assert_equal(e.status, Status.Success, "Unexpected error returned") + + self.step(7) + powerValue = await self.read_mwoctrl_attribute_expect_success(endpoint=endpoint, attribute=attributes.PowerSetting) + asserts.assert_true(powerValue == newPowerValue, "PowerSetting was not correctly set") + + +if __name__ == "__main__": + default_matter_test_main() diff --git a/src/python_testing/TC_MWOCTRL_2_4.py b/src/python_testing/TC_MWOCTRL_2_4.py new file mode 100644 index 00000000000000..8cb3885ada0613 --- /dev/null +++ b/src/python_testing/TC_MWOCTRL_2_4.py @@ -0,0 +1,99 @@ +# +# 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. +# + +import logging + +import chip.clusters as Clusters +from chip.interaction_model import InteractionModelError, Status +from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main +from mobly import asserts + +# This test requires several additional command line arguments +# run with +# --endpoint endpoint + + +class TC_MWOCTRL_2_4(MatterBaseTest): + + async def read_mwoctrl_attribute_expect_success(self, endpoint, attribute): + cluster = Clusters.Objects.MicrowaveOvenControl + return await self.read_single_attribute_check_success(endpoint=endpoint, cluster=cluster, attribute=attribute) + + def desc_TC_MWOCTRL_2_4(self) -> str: + return "[TC-MWOCTRL-2.4] WATTS functionality with DUT as Server" + + def steps_TC_MWOCTRL_2_4(self) -> list[TestStep]: + steps = [ + TestStep(1, "Commissioning, already done", is_commissioning=True), + TestStep(2, "Read the SupportedWatts attribute"), + TestStep(3, "Read the SelectedWattIndex attribute"), + TestStep(4, "Send the SetCookingParameters command"), + TestStep(5, "Read and verify the SelectedWattIndex attribute"), + ] + return steps + + def pics_TC_MWOCTRL_2_4(self) -> list[str]: + pics = [ + "MWOCTRL.S", + ] + return pics + + @async_test_body + async def test_TC_MWOCTRL_2_4(self): + + endpoint = self.user_params.get("endpoint", 1) + + self.step(1) + attributes = Clusters.MicrowaveOvenControl.Attributes + feature_map = await self.read_mwoctrl_attribute_expect_success(endpoint=endpoint, attribute=attributes.FeatureMap) + features = Clusters.MicrowaveOvenControl.Bitmaps.Feature + commands = Clusters.Objects.MicrowaveOvenControl.Commands + + feature_map = await self.read_mwoctrl_attribute_expect_success(endpoint=endpoint, attribute=attributes.FeatureMap) + + only_watts_supported = feature_map == features.kPowerInWatts + + if not only_watts_supported: + logging.info("PowerInWatts is not supported so skipping the rest of the tests.") + self.skip_all_remaining_steps(2) + return + + self.step(2) + supportedWattsList = await self.read_mwoctrl_attribute_expect_success(endpoint=endpoint, attribute=attributes.SupportedWatts) + asserts.assert_true(len(supportedWattsList) > 0, "SupportedWatts list is empty") + + self.step(3) + selectedWattIndex = await self.read_mwoctrl_attribute_expect_success(endpoint=endpoint, attribute=attributes.SelectedWattIndex) + logging.info("SelectedWattIndex is %s" % selectedWattIndex) + asserts.assert_true(selectedWattIndex >= 0 and selectedWattIndex < len( + supportedWattsList), "SelectedWattIndex is out of range") + + self.step(4) + newWattIndex = (selectedWattIndex+1) % (len(supportedWattsList)-1) + try: + await self.send_single_cmd(cmd=commands.SetCookingParameters(wattSettingIndex=newWattIndex), endpoint=endpoint) + except InteractionModelError as e: + asserts.assert_equal(e.status, Status.Success, "Unexpected error returned") + pass + + self.step(5) + selectedWattIndex = await self.read_mwoctrl_attribute_expect_success(endpoint=endpoint, attribute=attributes.SelectedWattIndex) + asserts.assert_true(selectedWattIndex == newWattIndex, "SelectedWattIndex was not correctly set") + + +if __name__ == "__main__": + default_matter_test_main() diff --git a/src/python_testing/TC_MWOM_1_2.py b/src/python_testing/TC_MWOM_1_2.py new file mode 100644 index 00000000000000..8dc60d9e131e68 --- /dev/null +++ b/src/python_testing/TC_MWOM_1_2.py @@ -0,0 +1,107 @@ +# +# Copyright (c) 2023 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. +# + +import logging + +import chip.clusters as Clusters +from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main +from mobly import asserts + + +class TC_MWOM_1_2(MatterBaseTest): + + async def read_mod_attribute_expect_success(self, endpoint, attribute): + cluster = Clusters.Objects.MicrowaveOvenMode + return await self.read_single_attribute_check_success(endpoint=endpoint, cluster=cluster, attribute=attribute) + + def desc_TC_MWOM_1_2(self) -> str: + return "[TC-MWOM-1.2] Cluster attributes with DUT as Server" + + def steps_TC_MWOM_1_2(self) -> list[TestStep]: + steps = [ + TestStep(1, "Commissioning, already done", is_commissioning=True), + TestStep(2, "Read the SupportedModes attribute"), + TestStep(3, "Read the CurrentMode attribute"), + ] + return steps + + def pics_TC_MWOM_1_2(self) -> list[str]: + pics = [ + "MWOM.S", + ] + return pics + + @async_test_body + async def test_TC_MWOM_1_2(self): + + endpoint = self.user_params.get("endpoint", 1) + + attributes = Clusters.MicrowaveOvenMode.Attributes + + self.step(1) + + self.step(2) + supported_modes = await self.read_mod_attribute_expect_success(endpoint=endpoint, attribute=attributes.SupportedModes) + asserts.assert_greater_equal(len(supported_modes), 2, "SupportedModes must have at least 2 entries!") + asserts.assert_less_equal(len(supported_modes), 255, "SupportedModes must have at most 255 entries!") + modes = set([m.mode for m in supported_modes]) + asserts.assert_equal(len(modes), len(supported_modes), "SupportedModes must have unique mode values") + + labels = set([m.label for m in supported_modes]) + asserts.assert_equal(len(labels), len(supported_modes), "SupportedModes must have unique mode label values") + + # common mode tags + commonTags = {0x0: 'Auto', + 0x1: 'Quick', + 0x2: 'Quiet', + 0x3: 'LowNoise', + 0x4: 'LowEnergy', + 0x5: 'Vacation', + 0x6: 'Min', + 0x7: 'Max', + 0x8: 'Night', + 0x9: 'Day'} + + # derived cluster defined tags + # kUnknownEnumValue may not be defined + try: + derivedTags = [tag.value for tag in Clusters.MicrowaveOvenMode.Enums.ModeTag + if tag is not Clusters.MicrowaveOvenMode.Enums.ModeTag.kUnknownEnumValue] + except AttributeError: + derivedTags = Clusters.MicrowaveOvenMode.Enums.ModeTag + + logging.info("Derived tags: %s" % derivedTags) + + for m in supported_modes: + for t in m.modeTags: + is_mfg = (0x8000 <= t.value and t.value <= 0xBFFF) + asserts.assert_true(t.value in commonTags.keys() or t.value in derivedTags or is_mfg, + "Found a SupportedModes entry with invalid mode tag value!") + if t.value == Clusters.MicrowaveOvenMode.Enums.ModeTag.kNormal: + normal_present = True + logging.info("Found normal mode tag %s with tag value %s", m.mode, t.value) + + asserts.assert_true(normal_present, "SupportedModes does not have an entry of Normal(0x4000)") + + self.step(3) + current_mode = await self.read_mod_attribute_expect_success(endpoint=endpoint, attribute=attributes.CurrentMode) + logging.info("CurrentMode: %s" % current_mode) + asserts.assert_true(current_mode in modes, "CurrentMode is not a supported mode!") + + +if __name__ == "__main__": + default_matter_test_main() diff --git a/src/python_testing/TC_RVCOPSTATE_2_4.py b/src/python_testing/TC_RVCOPSTATE_2_4.py index ddcb134ed96d77..3314eaade876bb 100644 --- a/src/python_testing/TC_RVCOPSTATE_2_4.py +++ b/src/python_testing/TC_RVCOPSTATE_2_4.py @@ -24,59 +24,26 @@ # Takes an OpState or RvcOpState state enum and returns a string representation def state_enum_to_text(state_enum): - if state_enum == Clusters.OperationalState.Enums.OperationalStateEnum.kStopped: - return "Stopped(0x00)" - elif state_enum == Clusters.OperationalState.Enums.OperationalStateEnum.kRunning: - return "Running(0x01)" - elif state_enum == Clusters.OperationalState.Enums.OperationalStateEnum.kPaused: - return "Paused(0x02)" - elif state_enum == Clusters.OperationalState.Enums.OperationalStateEnum.kError: - return "Error(0x03)" - elif state_enum == Clusters.RvcOperationalState.Enums.OperationalStateEnum.kSeekingCharger: - return "SeekingCharger(0x40)" - elif state_enum == Clusters.RvcOperationalState.Enums.OperationalStateEnum.kCharging: - return "Charging(0x41)" - elif state_enum == Clusters.RvcOperationalState.Enums.OperationalStateEnum.kDocked: - return "Docked(0x42)" - else: - return "UnknownEnumValue" + try: + return f'{Clusters.RvcOperationalState.Enums.OperationalStateEnum(state_enum).name[1:]}(0x{state_enum:02x})' + except AttributeError: + return f'{Clusters.OperationalState.Enums.OperationalStateEnum(state_enum).name[1:]}(0x{state_enum:02x})' # Takes an OpState or RvcOpState error enum and returns a string representation def error_enum_to_text(error_enum): - if error_enum == Clusters.OperationalState.Enums.ErrorStateEnum.kNoError: - return "NoError(0x00)" - elif error_enum == Clusters.OperationalState.Enums.ErrorStateEnum.kUnableToStartOrResume: - return "UnableToStartOrResume(0x01)" - elif error_enum == Clusters.OperationalState.Enums.ErrorStateEnum.kUnableToCompleteOperation: - return "UnableToCompleteOperation(0x02)" - elif error_enum == Clusters.OperationalState.Enums.ErrorStateEnum.kCommandInvalidInState: - return "CommandInvalidInState(0x03)" - elif error_enum == Clusters.RvcOperationalState.Enums.ErrorStateEnum.kFailedToFindChargingDock: - return "FailedToFindChargingDock(0x40)" - elif error_enum == Clusters.RvcOperationalState.Enums.ErrorStateEnum.kStuck: - return "Stuck(0x41)" - elif error_enum == Clusters.RvcOperationalState.Enums.ErrorStateEnum.kDustBinMissing: - return "DustBinMissing(0x42)" - elif error_enum == Clusters.RvcOperationalState.Enums.ErrorStateEnum.kDustBinFull: - return "DustBinFull(0x43)" - elif error_enum == Clusters.RvcOperationalState.Enums.ErrorStateEnum.kWaterTankEmpty: - return "WaterTankEmpty(0x44)" - elif error_enum == Clusters.RvcOperationalState.Enums.ErrorStateEnum.kWaterTankMissing: - return "WaterTankMissing(0x45)" - elif error_enum == Clusters.RvcOperationalState.Enums.ErrorStateEnum.kWaterTankLidOpen: - return "WaterTankLidOpen(0x46)" - elif error_enum == Clusters.RvcOperationalState.Enums.ErrorStateEnum.kMopCleaningPadMissing: - return "MopCleaningPadMissing(0x47)" - - def pics_TC_RVCOPSTATE_2_4(self) -> list[str]: - return ["RVCOPSTATE.S"] + try: + return f'{Clusters.RvcOperationalState.Enums.ErrorStateEnum(error_enum).name[1:]}(0x{error_enum:02x})' + except AttributeError: + return f'{Clusters.OperationalState.Enums.ErrorStateEnum(error_enum).name[1:]}(0x{error_enum:02x})' class TC_RVCOPSTATE_2_4(MatterBaseTest): def __init__(self, *args): super().__init__(*args) self.endpoint = None + self.is_ci = False + self.app_pipe = "/tmp/chip_rvc_fifo_" async def read_mod_attribute_expect_success(self, endpoint, attribute): cluster = Clusters.Objects.RvcOperationalState @@ -105,15 +72,29 @@ async def read_operational_state_with_check(self, step_number, expected_state): asserts.assert_equal(operational_state, expected_state, "OperationalState(%s) should be %s" % (operational_state, state_enum_to_text(expected_state))) - # Prints the instruction and waits for a user input to continue - def print_instruction(self, step_number, instruction): - self.print_step(step_number, instruction) - input("Press Enter when done.\n") + # Sends an RvcRunMode Change to mode command + async def send_run_change_to_mode_cmd(self, new_mode): + await self.send_single_cmd(cmd=Clusters.Objects.RvcRunMode.Commands.ChangeToMode(newMode=new_mode), + endpoint=self.endpoint) + + # Sends an out-of-band command to the rvc-app + def write_to_app_pipe(self, command): + with open(self.app_pipe, "w") as app_pipe: + app_pipe.write(command + "\n") + + def pics_TC_RVCOPSTATE_2_4(self) -> list[str]: + return ["RVCOPSTATE.S"] @async_test_body async def test_TC_RVCOPSTATE_2_4(self): self.endpoint = self.matter_test_config.endpoint asserts.assert_false(self.endpoint is None, "--endpoint must be included on the command line in.") + self.is_ci = self.check_pics("PICS_SDK_CI_ONLY") + if self.is_ci: + app_pid = self.matter_test_config.app_pid + if app_pid == 0: + asserts.fail("The --app-pid flag must be set when PICS_SDK_CI_ONLY is set.c") + self.app_pipe = self.app_pipe + str(app_pid) asserts.assert_true(self.check_pics("RVCOPSTATE.S.A0004"), "RVCOPSTATE.S.A0004 must be supported") asserts.assert_true(self.check_pics("RVCOPSTATE.S.C04.Tx"), "RVCOPSTATE.S.C04.Tx must be supported") @@ -123,55 +104,62 @@ async def test_TC_RVCOPSTATE_2_4(self): rvc_op_states = Clusters.RvcOperationalState.Enums.OperationalStateEnum op_errors = Clusters.OperationalState.Enums.ErrorStateEnum - self.print_step(1, "Commissioning, already done") - - if self.check_pics("RVCOPSTATE.S.M.ST_STOPPED"): - self.print_instruction(2, "Manually put the device in the STOPPED operational state") - - await self.read_operational_state_with_check(3, op_states.kStopped) - - await self.send_go_home_cmd_with_check(4, op_errors.kNoError) - - await self.read_operational_state_with_check(5, rvc_op_states.kSeekingCharger) + # These are the mode values used by the RVC example app that is used in CI. + rvc_app_run_mode_idle = 0 + rvc_app_run_mode_cleaning = 1 - if self.check_pics("RVCOPSTATE.S.M.ST_RUNNING"): - self.print_instruction(6, "Manually put the device in the RUNNING operational state") - - await self.read_operational_state_with_check(7, op_states.kRunning) - - await self.send_go_home_cmd_with_check(8, op_errors.kNoError) - - await self.read_operational_state_with_check(9, rvc_op_states.kSeekingCharger) - - if self.check_pics("RVCOPSTATE.S.M.ST_PAUSED"): - self.print_instruction(10, "Manually put the device in the PAUSED operational state") - - await self.read_operational_state_with_check(11, op_states.kPaused) - - await self.send_go_home_cmd_with_check(12, op_errors.kNoError) + self.print_step(1, "Commissioning, already done") - await self.read_operational_state_with_check(13, rvc_op_states.kSeekingCharger) + # Ensure that the device is in the correct state + if self.is_ci: + self.write_to_app_pipe('{"Name": "Reset"}') if self.check_pics("RVCOPSTATE.S.M.ST_ERROR"): - self.print_instruction(14, "Manually put the device in the ERROR operational state") + self.print_step(2, "Manually put the device in the ERROR operational state") + if self.is_ci: + self.write_to_app_pipe('{"Name": "ErrorEvent", "Error": "UnableToStartOrResume"}') + else: + input("Press Enter when done.\n") - await self.read_operational_state_with_check(15, op_states.kError) + await self.read_operational_state_with_check(3, op_states.kError) - await self.send_go_home_cmd_with_check(16, op_errors.kCommandInvalidInState) + await self.send_go_home_cmd_with_check(4, op_errors.kCommandInvalidInState) if self.check_pics("RVCOPSTATE.S.M.ST_CHARGING"): - self.print_instruction(17, "Manually put the device in the CHARGING operational state") + self.print_step(5, "Manually put the device in the CHARGING operational state") + if self.is_ci: + self.write_to_app_pipe('{"Name": "Reset"}') + self.write_to_app_pipe('{"Name": "Docked"}') + self.write_to_app_pipe('{"Name": "Charging"}') + else: + input("Press Enter when done.\n") - await self.read_operational_state_with_check(18, rvc_op_states.kCharging) + await self.read_operational_state_with_check(6, rvc_op_states.kCharging) - await self.send_go_home_cmd_with_check(19, op_errors.kCommandInvalidInState) + await self.send_go_home_cmd_with_check(7, op_errors.kCommandInvalidInState) if self.check_pics("RVCOPSTATE.S.M.ST_DOCKED"): - self.print_instruction(20, "Manually put the device in the DOCKED operational state") + self.print_step(8, "Manually put the device in the DOCKED operational state") + if self.is_ci: + self.write_to_app_pipe('{"Name": "Charged"}') + else: + input("Press Enter when done.\n") + + await self.read_operational_state_with_check(9, rvc_op_states.kDocked) - await self.read_operational_state_with_check(21, rvc_op_states.kDocked) + await self.send_go_home_cmd_with_check(10, op_errors.kCommandInvalidInState) + + if self.check_pics("PICS_M_ST_SEEKING_CHARGER"): + self.print_step(8, "Manually put the device in the SEEKING CHARGER operational state") + if self.is_ci: + await self.send_run_change_to_mode_cmd(rvc_app_run_mode_cleaning) + await self.send_run_change_to_mode_cmd(rvc_app_run_mode_idle) + else: + input("Press Enter when done.\n") + + await self.read_operational_state_with_check(9, rvc_op_states.kSeekingCharger) - await self.send_go_home_cmd_with_check(22, op_errors.kCommandInvalidInState) + await self.send_go_home_cmd_with_check(10, op_errors.kNoError) if __name__ == "__main__": diff --git a/src/python_testing/TC_RVCRUNM_2_2.py b/src/python_testing/TC_RVCRUNM_2_2.py index d7ee163b1eb37a..4868865c367d19 100644 --- a/src/python_testing/TC_RVCRUNM_2_2.py +++ b/src/python_testing/TC_RVCRUNM_2_2.py @@ -81,6 +81,12 @@ async def send_change_to_mode_with_check(self, new_mode, expected_error): "Expected a ChangeToMode response status of %s, got %s" % (error_enum_to_text(expected_error), error_enum_to_text(response.status))) + async def read_op_state_operational_state(self) -> Clusters.Objects.RvcOperationalState.Attributes.OperationalState: + ret = await self.read_mod_attribute_expect_success( + Clusters.RvcOperationalState, + Clusters.RvcOperationalState.Attributes.OperationalState) + return ret + # Sends and out-of-band command to the rvc-app def write_to_app_pipe(self, command): with open(self.app_pipe, "w") as app_pipe: @@ -181,12 +187,34 @@ async def test_TC_RVCRUNM_2_2(self): # This step is not described in the test plan, but it ought to be await self.read_current_mode_with_check(self.idle_mode_dut) - self.print_step(8, "Send ChangeToMode MODE_B command") + self.print_step(8, "Read RVCOPSTATE's OperationalState attribute") + op_state = await self.read_op_state_operational_state() + + valid_op_states = [ + Clusters.OperationalState.Enums.OperationalStateEnum.kStopped, + Clusters.OperationalState.Enums.OperationalStateEnum.kPaused, + Clusters.RvcOperationalState.Enums.OperationalStateEnum.kCharging, + Clusters.RvcOperationalState.Enums.OperationalStateEnum.kDocked] + + if op_state not in valid_op_states: + self.print_step(9, "Manually put the device in one of Stopped(0x00), Paused(0x02), Charging(0x41) or Docked(0x42)") + if self.is_ci: + self.write_to_app_pipe('{"Name": "ChargerFound"}') + else: + input("Press Enter when done.\n") + + self.print_step(10, "Read RVCOPSTATE's OperationalState attribute") + op_state = await self.read_op_state_operational_state() + + asserts.assert_true(op_state in valid_op_states, + "Expected RVCOPSTATE's OperationalState attribute to be one of Stopped(0x00), Paused(0x02), Charging(0x41) or Docked(0x42)") + + self.print_step(11, "Send ChangeToMode MODE_B command") await self.send_change_to_mode_with_check(self.mode_b, 0) # This step is not described in the test plan, but it ought to be await self.read_current_mode_with_check(self.mode_b) - self.print_step(9, "Send ChangeToMode idle command") + self.print_step(12, "Send ChangeToMode idle command") await self.send_change_to_mode_with_check(self.idle_mode_dut, 0) # This step is not described in the test plan, but it ought to be await self.read_current_mode_with_check(self.idle_mode_dut) diff --git a/src/python_testing/matter_testing_support.py b/src/python_testing/matter_testing_support.py index 2f3ca96d12038d..1515f0310d3302 100644 --- a/src/python_testing/matter_testing_support.py +++ b/src/python_testing/matter_testing_support.py @@ -976,8 +976,21 @@ def on_pass(self, record): self.runner_hook.test_stop(exception=None, duration=test_duration) def pics_guard(self, pics_condition: bool): + """Checks a condition and if False marks the test step as skipped and + returns False, otherwise returns True. + For example can be used to check if a test step should be run: + + self.step("4") + if self.pics_guard(condition_needs_to_be_true_to_execute): + # do the test for step 4 + + self.step("5") + if self.pics_guard(condition2_needs_to_be_true_to_execute): + # do the test for step 5 + """ if not pics_condition: self.mark_current_step_skipped() + return pics_condition def mark_current_step_skipped(self): try: diff --git a/src/system/BUILD.gn b/src/system/BUILD.gn index 1389bddc3ca4c0..9f24ad171be72a 100644 --- a/src/system/BUILD.gn +++ b/src/system/BUILD.gn @@ -60,8 +60,6 @@ if (chip_device_platform == "cc13x2_26x2") { import("${qpg_sdk_build_root}/qpg_sdk.gni") } else if (chip_device_platform == "k32w0") { import("//build_overrides/k32w0_sdk.gni") -} else if (chip_device_platform == "k32w1") { - import("//build_overrides/k32w1_sdk.gni") } else if (chip_device_platform == "nxp") { import("//build_overrides/nxp_sdk.gni") } else if (chip_device_platform == "psoc6") { @@ -189,9 +187,6 @@ source_set("system_config_header") { if (chip_device_platform == "k32w0") { public_deps += [ "${k32w0_sdk_build_root}:k32w0_sdk" ] } - if (chip_device_platform == "k32w1") { - public_deps += [ "${k32w1_sdk_build_root}:k32w1_sdk" ] - } if (chip_device_platform == "nxp") { public_deps += [ "${nxp_sdk_build_root}:nxp_sdk" ] } diff --git a/src/tracing/backend.h b/src/tracing/backend.h index 3d8bec8ada501f..c57e97ddd27638 100644 --- a/src/tracing/backend.h +++ b/src/tracing/backend.h @@ -64,6 +64,7 @@ class Backend : public ::chip::IntrusiveListNodeBase<> virtual void TraceInstant(const char * label, const char * group) {} virtual void TraceCounter(const char * label) {} + virtual void TraceMetric(const char * label, int32_t value) {} virtual void LogMessageSend(MessageSendInfo &) { TraceInstant("MessageSent", "Messaging"); } virtual void LogMessageReceived(MessageReceivedInfo &) { TraceInstant("MessageReceived", "Messaging"); } diff --git a/src/tracing/esp32_trace/esp32_tracing.cpp b/src/tracing/esp32_trace/esp32_tracing.cpp index 7937772606eec0..6193587be49c7d 100644 --- a/src/tracing/esp32_trace/esp32_tracing.cpp +++ b/src/tracing/esp32_trace/esp32_tracing.cpp @@ -153,6 +153,19 @@ void ESP32Backend::TraceCounter(const char * label) { ::Insights::ESPInsightsCounter::GetInstance(label)->ReportMetrics(); } + +void ESP32Backend::TraceMetric(const char * label, int32_t value) +{ + if (!mRegistered) + { + esp_diag_metrics_register("SYS_MTR" /*Tag of metrics */, label /* Unique key 8 */, label /* label displayed on dashboard */, + "insights.mtr" /* hierarchical path */, ESP_DIAG_DATA_TYPE_INT /* data_type */); + mRegistered = true; + } + ESP_LOGI("mtr", "The value of %s is %ld ", label, value); + esp_diag_metrics_add_int(label, value); +} + void ESP32Backend::TraceBegin(const char * label, const char * group) { HashValue hashValue = MurmurHash(group); diff --git a/src/tracing/esp32_trace/esp32_tracing.h b/src/tracing/esp32_trace/esp32_tracing.h index 6d9a277e06561d..3eb127c1d3367f 100644 --- a/src/tracing/esp32_trace/esp32_tracing.h +++ b/src/tracing/esp32_trace/esp32_tracing.h @@ -29,6 +29,7 @@ class ESP32Backend : public ::chip::Tracing::Backend void TraceInstant(const char * label, const char * group) override; void TraceCounter(const char * label) override; + void TraceMetric(const char * label, int32_t value) override; void LogMessageSend(MessageSendInfo &) override; void LogMessageReceived(MessageReceivedInfo &) override; @@ -36,6 +37,9 @@ class ESP32Backend : public ::chip::Tracing::Backend void LogNodeLookup(NodeLookupInfo &) override; void LogNodeDiscovered(NodeDiscoveredInfo &) override; void LogNodeDiscoveryFailed(NodeDiscoveryFailedInfo &) override; + +private: + bool mRegistered = false; }; } // namespace Insights diff --git a/src/tracing/esp32_trace/include/matter/tracing/macros_impl.h b/src/tracing/esp32_trace/include/matter/tracing/macros_impl.h index b95c20754237a1..8ebde173d8297b 100644 --- a/src/tracing/esp32_trace/include/matter/tracing/macros_impl.h +++ b/src/tracing/esp32_trace/include/matter/tracing/macros_impl.h @@ -29,6 +29,7 @@ #define MATTER_TRACE_END(label, group) ::chip::Tracing::Internal::End(label, group) #define MATTER_TRACE_INSTANT(label, group) ::chip::Tracing::Internal::Instant(label, group) #define MATTER_TRACE_COUNTER(label) ::chip::Tracing::Internal::Counter(label) +#define MATTER_TRACE_METRIC(label, value) ::chip::Tracing::Internal::Metric(label, value) namespace chip { namespace Tracing { diff --git a/src/tracing/json/json_tracing.cpp b/src/tracing/json/json_tracing.cpp index af66e12a61a50b..64627f079d04dd 100644 --- a/src/tracing/json/json_tracing.cpp +++ b/src/tracing/json/json_tracing.cpp @@ -295,6 +295,15 @@ void JsonBackend::TraceCounter(const char * label) OutputValue(value); } +void JsonBackend::TraceMetric(const char * label, int32_t val) +{ + ::Json::Value value; + value["label"] = label; + value["value"] = val; + + OutputValue(value); +} + void JsonBackend::LogMessageSend(MessageSendInfo & info) { ::Json::Value value; diff --git a/src/tracing/json/json_tracing.h b/src/tracing/json/json_tracing.h index 302c4bd5b5a485..e8ad8ee5894b03 100644 --- a/src/tracing/json/json_tracing.h +++ b/src/tracing/json/json_tracing.h @@ -52,6 +52,7 @@ class JsonBackend : public ::chip::Tracing::Backend void TraceEnd(const char * label, const char * group) override; void TraceInstant(const char * label, const char * group) override; void TraceCounter(const char * label) override; + void TraceMetric(const char * label, int32_t val) override; void LogMessageSend(MessageSendInfo &) override; void LogMessageReceived(MessageReceivedInfo &) override; void LogNodeLookup(NodeLookupInfo &) override; diff --git a/src/tracing/macros.h b/src/tracing/macros.h index b456137b88a166..0643a466c2a77d 100644 --- a/src/tracing/macros.h +++ b/src/tracing/macros.h @@ -26,6 +26,14 @@ // MATTER_TRACE_END(label, group) // MATTER_TRACE_INSTANT(label, group) // MATTER_TRACE_SCOPE(label, group) + +// Tracing macro to trace monotonically increasing counter values. +// MATTER_TRACE_COUNTER(label) + +// Tracing macro to represent historical metric data i.e the data points which represent different +// values at different point of time. +// MATTER_TRACE_METRIC(label, value) + #include #include #include @@ -79,6 +87,7 @@ #define MATTER_TRACE_INSTANT(...) _MATTER_TRACE_DISABLE(__VA_ARGS__) #define MATTER_TRACE_SCOPE(...) _MATTER_TRACE_DISABLE(__VA_ARGS__) #define MATTER_TRACE_COUNTER(...) _MATTER_TRACE_DISABLE(__VA_ARGS__) +#define MATTER_TRACE_METRIC(...) _MATTER_TRACE_DISABLE(__VA_ARGS__) #define MATTER_LOG_MESSAGE_SEND(...) _MATTER_TRACE_DISABLE(__VA_ARGS__) #define MATTER_LOG_MESSAGE_RECEIVED(...) _MATTER_TRACE_DISABLE(__VA_ARGS__) diff --git a/src/tracing/multiplexed/include/matter/tracing/macros_impl.h b/src/tracing/multiplexed/include/matter/tracing/macros_impl.h index 8b3e728289dc1d..eda5f2ed5142a4 100644 --- a/src/tracing/multiplexed/include/matter/tracing/macros_impl.h +++ b/src/tracing/multiplexed/include/matter/tracing/macros_impl.h @@ -29,6 +29,7 @@ #define MATTER_TRACE_END(label, group) ::chip::Tracing::Internal::End(label, group) #define MATTER_TRACE_INSTANT(label, group) ::chip::Tracing::Internal::Instant(label, group) #define MATTER_TRACE_COUNTER(label) ::chip::Tracing::Internal::Counter(label) +#define MATTER_TRACE_METRIC(label, value) ::chip::Tracing::Internal::Metric(label, value) namespace chip { namespace Tracing { diff --git a/src/tracing/none/include/matter/tracing/macros_impl.h b/src/tracing/none/include/matter/tracing/macros_impl.h index 3119dce2a2b49f..1fc940683d75e2 100644 --- a/src/tracing/none/include/matter/tracing/macros_impl.h +++ b/src/tracing/none/include/matter/tracing/macros_impl.h @@ -32,3 +32,4 @@ #define MATTER_TRACE_INSTANT(...) _MATTER_TRACE_DISABLE(__VA_ARGS__) #define MATTER_TRACE_SCOPE(...) _MATTER_TRACE_DISABLE(__VA_ARGS__) #define MATTER_TRACE_COUNTER(...) _MATTER_TRACE_DISABLE(__VA_ARGS__) +#define MATTER_TRACE_METRIC(...) _MATTER_TRACE_DISABLE(__VA_ARGS__) diff --git a/src/tracing/perfetto/include/matter/tracing/macros_impl.h b/src/tracing/perfetto/include/matter/tracing/macros_impl.h index 9b05d2f3539a45..559e877db1fe11 100644 --- a/src/tracing/perfetto/include/matter/tracing/macros_impl.h +++ b/src/tracing/perfetto/include/matter/tracing/macros_impl.h @@ -37,3 +37,5 @@ PERFETTO_DEFINE_CATEGORIES(perfetto::Category("Matter").SetDescription("Matter t static int count##_label = 0; \ TRACE_COUNTER("Matter", label, ++count##_label); \ } while (0) + +#define MATTER_TRACE_METRIC(label, value) TRACE_COUNTER("Matter", label, value) diff --git a/src/tracing/registry.cpp b/src/tracing/registry.cpp index 7c43442b5b83db..ee46b542e7f5f2 100644 --- a/src/tracing/registry.cpp +++ b/src/tracing/registry.cpp @@ -84,6 +84,14 @@ void Counter(const char * label) } } +void Metric(const char * label, int32_t value) +{ + for (auto & backend : gTracingBackends) + { + backend.TraceMetric(label, value); + } +} + void LogMessageSend(::chip::Tracing::MessageSendInfo & info) { for (auto & backend : gTracingBackends) diff --git a/src/tracing/registry.h b/src/tracing/registry.h index 083ebcb2225ad2..5f3b3c1a6cea84 100644 --- a/src/tracing/registry.h +++ b/src/tracing/registry.h @@ -77,6 +77,7 @@ void Begin(const char * label, const char * group); void End(const char * label, const char * group); void Instant(const char * label, const char * group); void Counter(const char * label); +void Metric(const char * label, int32_t value); void LogMessageSend(::chip::Tracing::MessageSendInfo & info); void LogMessageReceived(::chip::Tracing::MessageReceivedInfo & info); diff --git a/third_party/imgui/repo b/third_party/imgui/repo index f50ddc431e3b88..536090303a8fca 160000 --- a/third_party/imgui/repo +++ b/third_party/imgui/repo @@ -1 +1 @@ -Subproject commit f50ddc431e3b8840036e88abc4c3cf74500aa12b +Subproject commit 536090303a8fca7d896f77d6d63dc59249bc87f4 diff --git a/third_party/mbedtls/repo b/third_party/mbedtls/repo index 6b36a5db07ae0e..ede909f99ab6e6 160000 --- a/third_party/mbedtls/repo +++ b/third_party/mbedtls/repo @@ -1 +1 @@ -Subproject commit 6b36a5db07ae0e299c9e67f526c28db93e586e25 +Subproject commit ede909f99ab6e6a958a41e365251c2a1d2c4ed4d diff --git a/third_party/nxp/k32w1_sdk/BUILD.gn b/third_party/nxp/k32w1_sdk/BUILD.gn index 8173cdd0df7863..9a6cf009555de3 100644 --- a/third_party/nxp/k32w1_sdk/BUILD.gn +++ b/third_party/nxp/k32w1_sdk/BUILD.gn @@ -12,10 +12,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -import("//build_overrides/k32w1_sdk.gni") +import("//build_overrides/nxp_sdk.gni") + import("//build_overrides/mbedtls.gni") -import("${k32w1_sdk_build_root}/k32w1_sdk.gni") +import("${nxp_sdk_build_root}/nxp_sdk.gni") + +import("${nxp_sdk_build_root}/${nxp_sdk_name}/${nxp_sdk_name}.gni") + import("${mbedtls_root}/mbedtls.gni") declare_args() { @@ -25,7 +29,7 @@ declare_args() { assert(k32w1_sdk_target != "", "k32w1_sdk_target must be specified") -group("k32w1_sdk") { +group("nxp_sdk") { public_deps = [ k32w1_sdk_target ] } @@ -63,6 +67,12 @@ config("mbedtls_k32w1_config") { ] } + if (chip_crypto == "platform") { + defines += [ + # "MBEDTLS_CCM_ALT", + ] + } + include_dirs = [ chip_root ] } @@ -75,7 +85,7 @@ mbedtls_target("mbedtls") { public_configs = [ ":mbedtls_k32w1_config" ] public_deps = [ - ":k32w1_sdk", + ":nxp_sdk", "${chip_root}/third_party/openthread/platforms/nxp/k32w/k32w1:openthread_mbedtls_config_k32w1", ] } diff --git a/third_party/nxp/k32w1_sdk/k32w1_sdk.gni b/third_party/nxp/k32w1_sdk/k32w1_sdk.gni index 14f355b9da068c..7a8bf40afe7a04 100644 --- a/third_party/nxp/k32w1_sdk/k32w1_sdk.gni +++ b/third_party/nxp/k32w1_sdk/k32w1_sdk.gni @@ -13,27 +13,46 @@ # limitations under the License. import("//build_overrides/build.gni") import("//build_overrides/chip.gni") -import("//build_overrides/k32w1_sdk.gni") + +import("//build_overrides/nxp_sdk.gni") + import("//build_overrides/mbedtls.gni") import("//build_overrides/openthread.gni") import("${build_root}/config/compiler/compiler.gni") import("${chip_root}/src/crypto/crypto.gni") -import("${chip_root}/src/lib/core/core.gni") + import("${chip_root}/src/platform/device.gni") -import("${chip_root}/src/platform/nxp/k32w/k32w1/args.gni") + +import("${chip_root}/src/lib/core/core.gni") +import("${chip_root}/src/platform/nxp/${nxp_platform}/args.gni") + +import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni") declare_args() { # Location of the k32w1 SDK. k32w1_sdk_root = getenv("NXP_K32W1_SDK_ROOT") - use_smu2_as_system_memory = false + use_smu2_static = false + use_smu2_dynamic = false + use_hw_sha256 = false + use_hw_aes = false + + # ICD Matter Configuration flags + chip_ot_idle_interval_ms = 2000 # 2s Idle Intervals + chip_ot_active_interval_ms = 500 # 500ms Active Intervals + + nxp_idle_mode_interval_s = 600 # 10min Idle Mode Interval + nxp_active_mode_interval_ms = 10000 # 10s Active Mode Interval + nxp_active_mode_threshold_ms = 1000 # 1s Active Mode Threshold + nxp_icd_supported_clients_per_fabric = 2 # 2 registration slots per fabric } openthread_nxp_root = "${chip_root}/third_party/openthread/ot-nxp" assert(k32w1_sdk_root != "", "k32w1_sdk_root must be specified") -assert(!(use_smu2_as_system_memory && !chip_openthread_ftd), +assert(!((use_smu2_static && !chip_openthread_ftd) || + (use_smu2_dynamic && !chip_openthread_ftd)), "SMU2 can be used as system memory only with OT-FTD suppport") # Defines an k32w1 SDK build target. @@ -64,7 +83,7 @@ template("k32w1_sdk") { _sdk_include_dirs = [ "${k32w1_sdk_root}/devices/K32W1480", "${k32w1_sdk_root}/CMSIS/Core/Include", - "${k32w1_sdk_root}/platform/drivers/snt", + "${k32w1_sdk_root}/platform/drivers/elemu", "${k32w1_sdk_root}/platform/drivers/spc", "${k32w1_sdk_root}/platform/drivers/ccm32k", "${k32w1_sdk_root}/platform/drivers/wuu", @@ -114,6 +133,7 @@ template("k32w1_sdk") { "${k32w1_sdk_root}/middleware/multicore/rpmsg_lite/lib/include", "${k32w1_sdk_root}/middleware/multicore/rpmsg_lite/lib/include/platform/k32w1", + "${k32w1_sdk_root}/middleware/multicore/rpmsg_lite/lib/include/environment/freertos", "${k32w1_sdk_root}/middleware/multicore/mcmgr/src", "${k32w1_sdk_root}/middleware/wireless/ble_controller/interface", @@ -130,7 +150,7 @@ template("k32w1_sdk") { "${k32w1_sdk_root}/middleware/mbedtls/include/mbedtls", "${k32w1_sdk_root}/middleware/mbedtls/include", "${k32w1_sdk_root}/middleware/secure-subsystem/inc", - "${k32w1_sdk_root}/middleware/secure-subsystem/inc/snt", + "${k32w1_sdk_root}/middleware/secure-subsystem/inc/elemu", "${k32w1_sdk_root}/middleware/secure-subsystem/port/kw45_k4w1", "${k32w1_sdk_root}/middleware/wireless/XCVR/drv", @@ -187,7 +207,6 @@ template("k32w1_sdk") { "SERIAL_MANAGER_NON_BLOCKING_MODE=1", "SERIAL_USE_CONFIGURE_STRUCTURE=1", "SDK_COMPONENT_INTEGRATION=1", - "SERIAL_PORT_TYPE_UART=1", "gSerialManagerMaxInterfaces_c=1", "SDK_OS_FREE_RTOS", "gAppHighSystemClockFrequency_d=1", @@ -206,15 +225,15 @@ template("k32w1_sdk") { "gAppLowpowerEnabled_d=1", "BUTTON_SHORT_PRESS_THRESHOLD=1500", "BUTTON_LONG_PRESS_THRESHOLD=2500", - "SSS_CONFIG_FILE=\"fsl_sss_config_snt.h\"", - "SSCP_CONFIG_FILE=\"fsl_sscp_config_snt.h\"", + "SSS_CONFIG_FILE=\"fsl_sss_config_elemu.h\"", + "SSCP_CONFIG_FILE=\"fsl_sscp_config_elemu.h\"", "SDK_DEBUGCONSOLE=1", "NO_SYSCORECLK_UPD=0", "USE_RTOS=1", "USE_SDK_OSA=0", "FSL_RTOS_FREE_RTOS=1", - "MinimalHeapSize_c=0x8C00", + "MinimalHeapSize_c=0x7C00", "gMemManagerLightExtendHeapAreaUsage=0", "DEBUG_SERIAL_INTERFACE_INSTANCE=0", "APP_SERIAL_INTERFACE_INSTANCE=1", @@ -249,8 +268,23 @@ template("k32w1_sdk") { # gConnectPowerLeveldBm_c "gAdvertisingPowerLeveldBm_c=0", "gConnectPowerLeveldBm_c=0", + + #move these platform specific defines to args.gni + "NXP_OT_IDLE_INTERVAL=${chip_ot_idle_interval_ms}", + "NXP_OT_ACTIVE_INTERVAL=${chip_ot_active_interval_ms}", + "NXP_ICD_ENABLED=1", + "NXP_ACTIVE_MODE_THRESHOLD=${nxp_active_mode_threshold_ms}", + "NXP_ACTIVE_MODE_INTERVAL=${nxp_active_mode_interval_ms}", + "NXP_IDLE_MODE_INTERVAL=${nxp_idle_mode_interval_s}", + "NXP_ICD_SUPPORTED_CLIENTS_PER_FABRIC=${nxp_icd_supported_clients_per_fabric}", ] + if (chip_enable_pw_rpc) { + defines += [ "SERIAL_PORT_TYPE_UART_DMA=1" ] + } else { + defines += [ "SERIAL_PORT_TYPE_UART=1" ] + } + if (chip_with_low_power == 1 && chip_logging == true) { print( "WARNING: enabling logs in low power might break the LP timings. Use at your own risk!") @@ -270,13 +304,25 @@ template("k32w1_sdk") { defines += [ "CHIP_DEVICE_CONFIG_THREAD_ENABLE_CLI=1" ] } - if (use_smu2_as_system_memory) { + if (use_smu2_static) { defines += [ "__STARTUP_CLEAR_SMU2", "USE_SMU2_AS_SYSTEM_MEMORY", + "USE_SMU2_STATIC", + ] + } + + if (use_smu2_dynamic) { + defines += [ + "USE_SMU2_AS_SYSTEM_MEMORY", + "USE_SMU2_DYNAMIC", ] } + if (chip_with_factory_data == 1) { + defines += [ "CONFIG_CHIP_LOAD_REAL_FACTORY_DATA=1" ] + } + if (chip_with_low_power == 1) { defines += [ "chip_with_low_power=1", @@ -304,6 +350,14 @@ template("k32w1_sdk") { ] } + if (use_hw_sha256) { + defines += [ "USE_HW_SHA256" ] + } + + if (use_hw_aes) { + defines += [ "USE_HW_AES" ] + } + if (defined(invoker.defines)) { defines += invoker.defines } @@ -348,6 +402,7 @@ template("k32w1_sdk") { "${k32w1_sdk_root}/devices/K32W1480/drivers/fsl_clock.c", "${k32w1_sdk_root}/devices/K32W1480/drivers/fsl_cmc.c", "${k32w1_sdk_root}/devices/K32W1480/drivers/fsl_crc.c", + "${k32w1_sdk_root}/devices/K32W1480/drivers/fsl_elemu.c", "${k32w1_sdk_root}/devices/K32W1480/drivers/fsl_gpio.c", "${k32w1_sdk_root}/devices/K32W1480/drivers/fsl_imu.c", "${k32w1_sdk_root}/devices/K32W1480/drivers/fsl_k4_controller.c", @@ -356,7 +411,6 @@ template("k32w1_sdk") { "${k32w1_sdk_root}/devices/K32W1480/drivers/fsl_lptmr.c", "${k32w1_sdk_root}/devices/K32W1480/drivers/fsl_lpuart.c", "${k32w1_sdk_root}/devices/K32W1480/drivers/fsl_ltc.c", - "${k32w1_sdk_root}/devices/K32W1480/drivers/fsl_snt.c", "${k32w1_sdk_root}/devices/K32W1480/drivers/fsl_spc.c", "${k32w1_sdk_root}/devices/K32W1480/drivers/fsl_wuu.c", "${k32w1_sdk_root}/devices/K32W1480/utilities/debug_console/fsl_debug_console.c", @@ -364,6 +418,13 @@ template("k32w1_sdk") { "${k32w1_sdk_root}/devices/K32W1480/utilities/str/fsl_str.c", "${k32w1_sdk_root}/middleware/wireless/bluetooth/application/common/matter/ble_init.c", ] + + if (chip_enable_pw_rpc) { + sources += [ + "${k32w1_sdk_root}/devices/K32W1480/drivers/fsl_edma.c", + "${k32w1_sdk_root}/devices/K32W1480/drivers/fsl_lpuart_edma.c", + ] + } } else { sources += [ "${k32w1_sdk_root}/devices/KW45B41Z83/drivers/fsl_clock.c", @@ -371,6 +432,7 @@ template("k32w1_sdk") { "${k32w1_sdk_root}/platform/drivers/ccm32k/fsl_ccm32k.c", "${k32w1_sdk_root}/platform/drivers/cmc/fsl_cmc.c", "${k32w1_sdk_root}/platform/drivers/crc/fsl_crc.c", + "${k32w1_sdk_root}/platform/drivers/elemu/fsl_elemu.c", "${k32w1_sdk_root}/platform/drivers/flash_k4/fsl_k4_controller.c", "${k32w1_sdk_root}/platform/drivers/flash_k4/fsl_k4_flash.c", "${k32w1_sdk_root}/platform/drivers/gpio/fsl_gpio.c", @@ -379,13 +441,19 @@ template("k32w1_sdk") { "${k32w1_sdk_root}/platform/drivers/lptmr/fsl_lptmr.c", "${k32w1_sdk_root}/platform/drivers/lpuart/fsl_lpuart.c", "${k32w1_sdk_root}/platform/drivers/ltc/fsl_ltc.c", - "${k32w1_sdk_root}/platform/drivers/snt/fsl_snt.c", "${k32w1_sdk_root}/platform/drivers/spc/fsl_spc.c", "${k32w1_sdk_root}/platform/drivers/wuu/fsl_wuu.c", "${k32w1_sdk_root}/platform/utilities/assert/fsl_assert.c", "${k32w1_sdk_root}/platform/utilities/debug_console/fsl_debug_console.c", "${k32w1_sdk_root}/platform/utilities/str/fsl_str.c", ] + + if (chip_enable_pw_rpc) { + sources += [ + "${k32w1_sdk_root}/platform/drivers/lpuart/fsl_edma.c", + "${k32w1_sdk_root}/platform/drivers/lpuart/fsl_lpuart_edma.c", + ] + } } sources += [ @@ -422,7 +490,9 @@ template("k32w1_sdk") { "${k32w1_sdk_root}/middleware/multicore/rpmsg_lite/lib/virtio/virtqueue.c", "${k32w1_sdk_root}/middleware/secure-subsystem/port/kw45_k4w1/sss_aes.c", "${k32w1_sdk_root}/middleware/secure-subsystem/port/kw45_k4w1/sss_aes_cmac.c", + "${k32w1_sdk_root}/middleware/secure-subsystem/port/kw45_k4w1/sss_ccm.c", "${k32w1_sdk_root}/middleware/secure-subsystem/port/kw45_k4w1/sss_ecdh.c", + "${k32w1_sdk_root}/middleware/secure-subsystem/port/kw45_k4w1/sss_hmac_sha256.c", "${k32w1_sdk_root}/middleware/secure-subsystem/port/kw45_k4w1/sss_init.c", "${k32w1_sdk_root}/middleware/secure-subsystem/port/kw45_k4w1/sss_sha256.c", "${k32w1_sdk_root}/middleware/secure-subsystem/src/sscp/fsl_sscp_mu.c", @@ -460,6 +530,7 @@ template("k32w1_sdk") { "${k32w1_sdk_root}/middleware/wireless/framework/platform/kw45_k32w1/fwk_platform_extflash.c", "${k32w1_sdk_root}/middleware/wireless/framework/platform/kw45_k32w1/fwk_platform_ics.c", "${k32w1_sdk_root}/middleware/wireless/framework/platform/kw45_k32w1/fwk_platform_lowpower.c", + "${k32w1_sdk_root}/middleware/wireless/framework/platform/kw45_k32w1/fwk_platform_lowpower_timer.c", "${k32w1_sdk_root}/middleware/wireless/framework/platform/kw45_k32w1/fwk_platform_ot.c", "${k32w1_sdk_root}/middleware/wireless/framework/platform/kw45_k32w1/fwk_platform_ota.c", "${k32w1_sdk_root}/middleware/wireless/ieee-802.15.4/ieee_802_15_4/phy/source/PhyTime.c", diff --git a/src/app/tests/suites/commands/system/scripts/Stop.py b/third_party/nxp/k32w1_sdk/nxp_arm.gni old mode 100755 new mode 100644 similarity index 60% rename from src/app/tests/suites/commands/system/scripts/Stop.py rename to third_party/nxp/k32w1_sdk/nxp_arm.gni index 75f843e85e3835..78d1036cc8536a --- a/src/app/tests/suites/commands/system/scripts/Stop.py +++ b/third_party/nxp/k32w1_sdk/nxp_arm.gni @@ -1,6 +1,4 @@ -#!/usr/bin/env -S python3 -B - -# Copyright (c) 2022 Project CHIP Authors +# 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. @@ -14,15 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -import sys -import xmlrpc.client - -IP = '127.0.0.1' -PORT = 9000 +import("//build_overrides/nxp_sdk.gni") +import("${nxp_sdk_build_root}/nxp_sdk.gni") -if sys.platform == 'linux': - IP = '10.10.10.5' +assert(nxp_platform == "k32w/k32w1", "${nxp_platform} must be k32w/k32w1.") -# sys.argv[1] contains the key to the apps register -with xmlrpc.client.ServerProxy('http://' + IP + ':' + str(PORT) + '/', allow_none=True) as proxy: - proxy.stop(sys.argv[1]) +arm_arch = "armv8-m.main+dsp+fp" +arm_cpu = "cortex-m33" +arm_fpu = "fpv5-sp-d16" +arm_float_abi = "hard" diff --git a/third_party/nxp/k32w1_sdk/nxp_executable.gni b/third_party/nxp/k32w1_sdk/nxp_executable.gni new file mode 100644 index 00000000000000..bc78dfc13bf95c --- /dev/null +++ b/third_party/nxp/k32w1_sdk/nxp_executable.gni @@ -0,0 +1,34 @@ +# Copyright (c) 2020 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. + +import("//build_overrides/build.gni") +import("//build_overrides/chip.gni") + +import("${build_root}/toolchain/flashable_executable.gni") + +template("k32w1_executable") { + output_base_name = get_path_info(invoker.output_name, "name") + objcopy_image_name = output_base_name + ".srec" + objcopy_image_format = "srec" + objcopy = "arm-none-eabi-objcopy" + + # Copy flashing dependencies to the output directory so that the output + # is collectively self-contained; this allows flashing to work reliably + # even if the build and flashing steps take place on different machines + # or in different containers. + + flashable_executable(target_name) { + forward_variables_from(invoker, "*") + } +} diff --git a/third_party/openthread/ot-nxp b/third_party/openthread/ot-nxp index eb23212ca1e329..0a8fcca1828cac 160000 --- a/third_party/openthread/ot-nxp +++ b/third_party/openthread/ot-nxp @@ -1 +1 @@ -Subproject commit eb23212ca1e329a29c95c29c09438c8f2256d5c6 +Subproject commit 0a8fcca1828cac3e3d70577010c365b4dc8e3d66 diff --git a/third_party/openthread/platforms/nxp/k32w/k32w1/BUILD.gn b/third_party/openthread/platforms/nxp/k32w/k32w1/BUILD.gn index 341c8960ede578..446768b23b778c 100644 --- a/third_party/openthread/platforms/nxp/k32w/k32w1/BUILD.gn +++ b/third_party/openthread/platforms/nxp/k32w/k32w1/BUILD.gn @@ -13,9 +13,12 @@ # limitations under the License. import("//build_overrides/chip.gni") -import("//build_overrides/k32w1_sdk.gni") +import("//build_overrides/nxp_sdk.gni") import("//build_overrides/openthread.gni") -import("${chip_root}/third_party/nxp/k32w1_sdk/k32w1_sdk.gni") + +import("${nxp_sdk_build_root}/nxp_sdk.gni") + +import("${nxp_sdk_build_root}/${nxp_sdk_name}/${nxp_sdk_name}.gni") openthread_nxp_root = "${chip_root}/third_party/openthread/ot-nxp" @@ -28,7 +31,16 @@ config("openthread_k32w1_config") { "OPENTHREAD_CONFIG_IP6_SLAAC_ENABLE=1", "MBEDTLS_ENTROPY_HARDWARE_ALT=1", "OPENTHREAD_PLATFORM_CORE_CONFIG_FILE=\"app/project_include/OpenThreadConfig.h\"", + "MBEDTLS_THREADING_C=1", + "MBEDTLS_THREADING_ALT=1", ] + + if (use_smu2_dynamic) { + defines += [ + "OPENTHREAD_CONFIG_MESSAGE_USE_HEAP_ENABLE=1", + "OPENTHREAD_CONFIG_ENABLE_BUILTIN_MBEDTLS_MANAGEMENT=0", + ] + } } source_set("openthread_core_config_k32w1") { @@ -46,13 +58,13 @@ source_set("openthread_mbedtls_config_k32w1") { source_set("libopenthread-k32w1") { sources = [ + "${openthread_nxp_root}/src/common/crypto.c", "${openthread_nxp_root}/src/common/flash_nvm.c", "${openthread_nxp_root}/src/k32w1/k32w1/alarm.c", "${openthread_nxp_root}/src/k32w1/k32w1/diag.c", "${openthread_nxp_root}/src/k32w1/k32w1/entropy.c", "${openthread_nxp_root}/src/k32w1/k32w1/logging.c", "${openthread_nxp_root}/src/k32w1/k32w1/misc.c", - "${openthread_nxp_root}/src/k32w1/k32w1/power.c", "${openthread_nxp_root}/src/k32w1/k32w1/radio.c", "${openthread_nxp_root}/src/k32w1/k32w1/system.c", "${openthread_nxp_root}/src/k32w1/k32w1/uart.c", @@ -60,6 +72,14 @@ source_set("libopenthread-k32w1") { if (chip_crypto == "platform") { sources += [ "${openthread_nxp_root}/src/k32w1/k32w1/ecdsa_sss.cpp" ] + + if (use_hw_sha256) { + sources += [ "${openthread_nxp_root}/src/k32w1/k32w1/sha256_sss.cpp" ] + } + + if (use_hw_aes) { + sources += [ "${openthread_nxp_root}/src/k32w1/k32w1/aes_sss.cpp" ] + } } if (chip_with_ot_cli == 1) { @@ -68,7 +88,7 @@ source_set("libopenthread-k32w1") { public_deps = [ ":openthread_core_config_k32w1", - "${k32w1_sdk_build_root}:k32w1_sdk", + "${nxp_sdk_build_root}:nxp_sdk", "${openthread_root}/src/core:libopenthread_core_headers", "../../..:libopenthread-platform", "../../..:libopenthread-platform-utils", diff --git a/third_party/openthread/repo b/third_party/openthread/repo index cf357d70be94e6..b212a0a748070c 160000 --- a/third_party/openthread/repo +++ b/third_party/openthread/repo @@ -1 +1 @@ -Subproject commit cf357d70be94e6f3f21d07b3c16e29bb7ec5cc7e +Subproject commit b212a0a748070ccbda765c3ebed2aab8b6b08fce diff --git a/third_party/ot-br-posix/repo b/third_party/ot-br-posix/repo index 9326cc38b6b6ce..c5a7a35e3bd2f3 160000 --- a/third_party/ot-br-posix/repo +++ b/third_party/ot-br-posix/repo @@ -1 +1 @@ -Subproject commit 9326cc38b6b6ce81958a96d7821c4cb21976d636 +Subproject commit c5a7a35e3bd2f3da8cce1e2e2a3bbe5cdeedb729 diff --git a/third_party/silabs/SiWx917_sdk.gni b/third_party/silabs/SiWx917_sdk.gni index fd560b150c0d53..f3bf92d768d543 100644 --- a/third_party/silabs/SiWx917_sdk.gni +++ b/third_party/silabs/SiWx917_sdk.gni @@ -267,8 +267,8 @@ template("siwx917_sdk") { defines += [ "SL_ICD_ENABLED=1", "SL_ACTIVE_MODE_THRESHOLD=${sl_active_mode_threshold_ms}", - "SL_ACTIVE_MODE_INTERVAL=${sl_active_mode_interval_ms}", - "SL_IDLE_MODE_INTERVAL=${sl_idle_mode_interval_s}", + "SL_ACTIVE_MODE_DURATION_MS=${sl_active_mode_duration_ms}", + "SL_IDLE_MODE_DURATION_S=${sl_idle_mode_duration_s}", "SL_ICD_SUPPORTED_CLIENTS_PER_FABRIC=${sl_icd_supported_clients_per_fabric}", "SL_SI91X_MCU_WIRELESS_BASED_WAKEUP=1", "SL_SI91X_MCU_BUTTON_BASED_WAKEUP=1", diff --git a/third_party/silabs/efr32_sdk.gni b/third_party/silabs/efr32_sdk.gni index 415f89b4db04fb..bed0a1e43c308d 100644 --- a/third_party/silabs/efr32_sdk.gni +++ b/third_party/silabs/efr32_sdk.gni @@ -54,8 +54,8 @@ declare_args() { sl_ot_csl_timeout_sec = 30 # 30s CSL timeout # ICD Matter Configuration flags - sl_idle_mode_interval_s = 600 # 10min Idle Mode Interval - sl_active_mode_interval_ms = 1000 # 1s Active Mode Interval + sl_idle_mode_duration_s = 600 # 10min Idle Mode Duration + sl_active_mode_duration_ms = 1000 # 1s Active Mode Duration sl_active_mode_threshold_ms = 500 # 500ms Active Mode Threshold sl_icd_supported_clients_per_fabric = 2 # 2 registration slots per fabric sl_use_subscription_synching = false @@ -420,8 +420,8 @@ template("efr32_sdk") { defines += [ "SL_ICD_ENABLED=1", "SL_ACTIVE_MODE_THRESHOLD=${sl_active_mode_threshold_ms}", - "SL_ACTIVE_MODE_INTERVAL=${sl_active_mode_interval_ms}", - "SL_IDLE_MODE_INTERVAL=${sl_idle_mode_interval_s}", + "SL_ACTIVE_MODE_DURATION_MS=${sl_active_mode_duration_ms}", + "SL_IDLE_MODE_DURATION_S=${sl_idle_mode_duration_s}", "SL_ICD_SUPPORTED_CLIENTS_PER_FABRIC=${sl_icd_supported_clients_per_fabric}", ] diff --git a/third_party/ti_simplelink_sdk/mcuboot/flash_map_backend.h b/third_party/ti_simplelink_sdk/mcuboot/flash_map_backend.h index 728e2ef44cf882..de84f13558d573 100644 --- a/third_party/ti_simplelink_sdk/mcuboot/flash_map_backend.h +++ b/third_party/ti_simplelink_sdk/mcuboot/flash_map_backend.h @@ -55,7 +55,7 @@ #error "This file must be used with TI_BOOT_USE_EXTERNAL_FLASH enabled" #endif -#ifdef DeviceFamily_CC13X4 +#if defined(DeviceFamily_CC13X4) || defined(DeviceFamily_CC26X4) #if (MCUBOOT_IMAGE_NUMBER == 2) #define BOOT_SLOT_1_SIZE 0x0002B000 #define BOOT_SLOT_2_SIZE 0x000CC800 diff --git a/third_party/ti_simplelink_sdk/mcuboot/mcuboot.syscfg b/third_party/ti_simplelink_sdk/mcuboot/mcuboot.syscfg index 0a92846df1c88e..395996fbef1d04 100644 --- a/third_party/ti_simplelink_sdk/mcuboot/mcuboot.syscfg +++ b/third_party/ti_simplelink_sdk/mcuboot/mcuboot.syscfg @@ -34,11 +34,15 @@ * mcuboot.syscfg */ - -const Board = scripting.addModule("/ti/drivers/Board"); +const Button = scripting.addModule("/ti/drivers/apps/Button"); +const Button1 = Button.addInstance(); +const Button2 = Button.addInstance(); +const LED = scripting.addModule("/ti/drivers/apps/LED"); +const LED1 = LED.addInstance(); +const LED2 = LED.addInstance(); /* ======== Board ======== */ -var boardName = system.deviceData.board.name; +const deviceId = system.deviceData.deviceId; /** * Import the modules used in this configuration. @@ -50,19 +54,19 @@ for(var setting in ccfgSettings) CCFG[setting] = ccfgSettings[setting]; } -if (boardName.match(/CC13.2.7|CC26.2.7/)) +if (deviceId.match(/CC13.2.7|CC26.2.7/)) { // mcuboot stored at end of flash alongside CCFG CCFG.setFlashVectorTable = true; CCFG.addressFlashVectorTable = 0x000AC000; } -else if (boardName.match(/CC13.4|CC26.[34]/)) +else if (deviceId.match(/CC13.4|CC26.[34]/)) { // mcuboot stored at the beginning of flash CCFG.setFlashVectorTable = true; CCFG.addressFlashVectorTable = 0x00000000; } -else if (boardName.match(/CC23.0/)) { +else if (deviceId.match(/CC23.0/)) { // Nothing to do. Default pBldrVtor = 0x00000000 } else @@ -73,20 +77,30 @@ else CCFG.ccfgTemplate.$name = "ti_devices_CCFG_CCFGCC26XXTemplate0"; /* ======== GPIO ======== */ -var GPIO = scripting.addModule("/ti/drivers/GPIO"); -var gpio0 = GPIO.addInstance(); -gpio0.$hardware = system.deviceData.board.components.LED0; -gpio0.$name = "CONFIG_GPIO_LED_0"; +Button1.$name = "CONFIG_BTN_LEFT"; +if (deviceId.match(/CC2674R/)) +{ + Button1.button.$assign = "DIO_13"; +} +else +{ + Button1.button.$assign = "DIO_15"; +} +Button1.gpioPin.$name = "CONFIG_GPIO_BTN1"; +Button1.gpioPin.pull = "Pull Up"; +Button1.gpioPin.interruptTrigger = "Falling Edge"; -var gpio1 = GPIO.addInstance(); -gpio1.$hardware = system.deviceData.board.components.LED1; -gpio1.$name = "CONFIG_GPIO_LED_1"; +Button2.$name = "CONFIG_BTN_RIGHT"; +Button2.button.$assign = "DIO_14"; +Button2.gpioPin.$name = "CONFIG_GPIO_BTN2"; +Button2.gpioPin.pull = "Pull Up"; +Button2.gpioPin.interruptTrigger = "Falling Edge"; -var gpio2 = GPIO.addInstance(); -gpio2.$hardware = system.deviceData.board.components.BUTTON0; -gpio2.$name = "CONFIG_GPIO_BUTTON_0"; +LED1.$name = "CONFIG_LED_RED"; +LED1.ledPin.$assign = "DIO_6"; +LED1.gpioPin.$name = "CONFIG_GPIO_RLED"; -var gpio3 = GPIO.addInstance(); -gpio3.$hardware = system.deviceData.board.components.BUTTON1; -gpio3.$name = "CONFIG_GPIO_BUTTON_1"; \ No newline at end of file +LED2.$name = "CONFIG_LED_GREEN"; +LED2.ledPin.$assign = "DIO_7"; +LED2.gpioPin.$name = "CONFIG_GPIO_GLED"; \ No newline at end of file diff --git a/third_party/ti_simplelink_sdk/run_sdk_drivers_gen.py b/third_party/ti_simplelink_sdk/run_sdk_drivers_gen.py new file mode 100644 index 00000000000000..fbdf81b0dfd8fa --- /dev/null +++ b/third_party/ti_simplelink_sdk/run_sdk_drivers_gen.py @@ -0,0 +1,63 @@ +# Copyright 2020 Texas Instruments Incorporated + +"""A wrapper to run the SDK makefiles for Platform driver generation +Args: +1. [TI Simplelink SDK Root] +2. [Matter repository Root] +3. [Path to built drivers in repo] +""" + +import argparse +import os +import shutil +import subprocess +import sys + +parser = argparse.ArgumentParser() +parser.add_argument('--sdk', help="TI SDK root") +parser.add_argument('--chip-root', help="CHIP Root") +parser.add_argument('--src-path', help="the path where the built drivers exist") +parser.add_argument('--dest-path', help="path where drivers will be copied to") + +args = parser.parse_args() + +ret = False + +if os.getenv('_PW_ACTUAL_ENVIRONMENT_ROOT'): + CHIP_ENV_ROOT = os.getenv('_PW_ACTUAL_ENVIRONMENT_ROOT') +else: + CHIP_ENV_ROOT = os.path.join(args.chip_root, ".environment") + +GCC_ARMCOMPILER_PATH = os.path.join(CHIP_ENV_ROOT, "cipd", "packages", "arm") + +if not os.path.isdir(GCC_ARMCOMPILER_PATH): + print("Compiler Path is invalid: " + GCC_ARMCOMPILER_PATH) + sys.exit(2) + +source_file = args.sdk + args.src_path +dest_path = args.dest_path + +make_command = ["make", "-C", args.sdk, "CMAKE=cmake", "GCC_ARMCOMPILER=" + + GCC_ARMCOMPILER_PATH, "IAR_ARMCOMPILER=", "TICLANG_ARMCOMPILER=", "GENERATOR=Ninja"] + +pid = os.fork() +if pid: + status = os.wait() + if os.path.exists(source_file): + shutil.copy(source_file, dest_path) + else: + print("Driver does not exist or path is incorrect.") + sys.exit(2) + +else: + make_command = ["make", "-C", args.sdk, "CMAKE=cmake", "GCC_ARMCOMPILER=" + + GCC_ARMCOMPILER_PATH, "IAR_ARMCOMPILER=", "TICLANG_ARMCOMPILER=", "GENERATOR=Ninja"] + res = subprocess.run(make_command, capture_output=True, encoding="utf8") + if res.returncode != 0: + print("!!!!!!!!!!!! EXEC FAILED !!!!!!!!!!!!!!!!") + print("!!!!!!!!!!!!!!! STDOUT !!!!!!!!!!!!!!!!!!") + print("%s" % res.stdout) + print("!!!!!!!!!!!!!!! STDERR !!!!!!!!!!!!!!!!!!") + print("%s" % res.stderr) + print("res.returncode: %d", res.returncode) + sys.exit(1) diff --git a/third_party/ti_simplelink_sdk/ti_simplelink_board.gni b/third_party/ti_simplelink_sdk/ti_simplelink_board.gni index 747ca4adcbea49..e1828c9f88f302 100644 --- a/third_party/ti_simplelink_sdk/ti_simplelink_board.gni +++ b/third_party/ti_simplelink_sdk/ti_simplelink_board.gni @@ -76,12 +76,14 @@ if (ti_simplelink_board == "CC1352R1_LAUNCHXL") { } else if (ti_simplelink_board == "CC3220SF_LAUNCHXL") { ti_simplelink_device_family = "cc32xx" ti_simplelink_soc_family = "cc32xx" + ti_simplelink_isa = "m4" # set -DDeviceFamily_CC3220 ti_simplelink_soc = "cc32xxSF" } else if (ti_simplelink_board == "CC3235SF_LAUNCHXL") { ti_simplelink_device_family = "cc32xx" ti_simplelink_soc_family = "cc32xx" + ti_simplelink_isa = "m4" # set -DDeviceFamily_CC3220 ti_simplelink_soc = "cc32xxSF" diff --git a/third_party/ti_simplelink_sdk/ti_simplelink_sdk.gni b/third_party/ti_simplelink_sdk/ti_simplelink_sdk.gni index 797b47688f4a95..98a6acb916d30e 100644 --- a/third_party/ti_simplelink_sdk/ti_simplelink_sdk.gni +++ b/third_party/ti_simplelink_sdk/ti_simplelink_sdk.gni @@ -58,53 +58,58 @@ template("ti_sysconfig") { gen_outputs += [ output_dir + "/" + output ] } + config("cc13x2_26x2_${target_name}_config") { + ldflags = [ + "-nostartfiles", + "-fno-exceptions", + "-fno-unwind-tables", + ] + defines = [ "DeviceFamily_CC13X2_CC26X2" ] + } + + config("cc13x2x7_26x2x7_${target_name}_config") { + ldflags = [ + "-nostartfiles", + "-fno-exceptions", + "-fno-unwind-tables", + ] + defines = [ "DeviceFamily_CC26X2X7" ] + } + + config("cc13x4_26x4_${target_name}_config") { + ldflags = [ + "-nostartfiles", + "-fno-exceptions", + "-fno-unwind-tables", + ] + if (ti_simplelink_device == "") { + defines = [ "DeviceFamily_CC13X4" ] + } else { + defines = [ "DeviceFamily_CC26X4" ] + } + } + + config("cc32xx_${target_name}_config") { + ldflags = [ "-nostartfiles" ] + defines = [ "CC32XXWARE" ] + } + config("${target_name}_config") { include_dirs = [ output_dir, "${ti_simplelink_sdk_root}/source", ] - defines = [] - ldflags = [] + forward_variables_from(invoker, + [ + "cflags", + "ldflags", + ]) if (defined(invoker.include_dirs)) { include_dirs += invoker.include_dirs } - if (ti_simplelink_device_family == "cc13x2_26x2") { - ldflags += [ - "-nostartfiles", - "-fno-exceptions", - "-fno-unwind-tables", - ] - defines += [ "DeviceFamily_CC13X2_CC26X2" ] - } else if (ti_simplelink_device_family == "cc13x2x7_26x2x7") { - ldflags += [ - "-nostartfiles", - "-fno-exceptions", - "-fno-unwind-tables", - ] - defines += [ "DeviceFamily_CC26X2X7" ] - } else if (ti_simplelink_device_family == "cc13x4_26x4") { - ldflags += [ - "-nostartfiles", - "-fno-exceptions", - "-fno-unwind-tables", - ] - if (ti_simplelink_device == "") { - defines += [ "DeviceFamily_CC13X4" ] - } else { - defines += [ "DeviceFamily_CC26X4" ] - } - } else if (ti_simplelink_device_family == "cc32xx") { - ldflags += [ "-nostartfiles" ] - defines += [ "CC32XXWARE" ] - } - if (defined(invoker.cflags)) { - cflags = invoker.cflags - } - if (defined(invoker.ldflags)) { - ldflags += invoker.ldflags - } + configs = [ ":${ti_simplelink_device_family}_${target_name}_config" ] } pw_python_action("${target_name}_gen") { @@ -168,101 +173,104 @@ template("ti_sysconfig") { } template("ti_simplelink_sdk") { + assert(ti_simplelink_sdk_root != "", + "ti_simplelink_sdk_root must be specified") + + action("build_external_library") { + script = "${ti_simplelink_sdk_build_root}/run_sdk_drivers_gen.py" + outputs = [ "${target_gen_dir}/drivers_${ti_simplelink_soc_family}.a" ] + args = [ + "--sdk", + rebase_path(ti_simplelink_sdk_root), + "--chip-root", + rebase_path(chip_root), + "--src-path", + "/source/ti/drivers/lib/gcc/${ti_simplelink_isa}/drivers_${ti_simplelink_soc_family}.a", + "--dest-path", + rebase_path(target_gen_dir), + ] + } + if (defined(invoker.ti_simplelink_sdk_root)) { ti_simplelink_sdk_root = invoker.ti_simplelink_sdk_root } - assert(ti_simplelink_sdk_root != "", - "ti_simplelink_sdk_root must be specified") - sdk_target_name = target_name - config("${sdk_target_name}_config") { - include_dirs = [] - libs = [] - if (defined(invoker.include_dirs)) { - include_dirs += invoker.include_dirs - } + config("cc13x2_26x2_sdk_config") { + libs = [ + "${ti_simplelink_sdk_root}/source/ti/drivers/rf/lib/gcc/${ti_simplelink_isa}/rf_multiMode_${ti_simplelink_soc_family}.a", + "${ti_simplelink_sdk_root}/source/ti/devices/cc13x2_cc26x2/driverlib/bin/gcc/driverlib.lib", + ] + defines = [ "DeviceFamily_CC13X2_CC26X2" ] + } - # Treat these includes as system includes, so warnings in them are not fatal. - include_dirs += [ - "${ti_simplelink_sdk_root}/source", - "${ti_simplelink_sdk_root}/source/third_party/CMSIS/Include", - "${chip_root}/third_party/mbedtls/repo/include", + config("cc13x2x7_26x2x7_sdk_config") { + libs = [ + "${ti_simplelink_sdk_root}/source/ti/drivers/rf/lib/gcc/${ti_simplelink_isa}/rf_multiMode_${ti_simplelink_soc_family}.a", + "${ti_simplelink_sdk_root}/source/ti/devices/cc13x2x7_cc26x2x7/driverlib/bin/gcc/driverlib.lib", ] - defines = [] + defines = [ "DeviceFamily_CC13X2X7_CC26X2X7" ] + } - if (ti_simplelink_device_family == "cc13x2x7_26x2x7") { - libs += [ - "${ti_simplelink_sdk_root}/source/ti/drivers/lib/gcc/${ti_simplelink_isa}/drivers_${ti_simplelink_soc_family}.a", - "${ti_simplelink_sdk_root}/source/ti/drivers/rf/lib/gcc/${ti_simplelink_isa}/rf_multiMode_cc13x2.a", - ] - } else if (ti_simplelink_device_family == "cc13x2_26x2" || - ti_simplelink_device_family == "cc13x2x7_26x2x7" || - ti_simplelink_device_family == "cc13x4_26x4") { - assert(ti_simplelink_soc_family != "", - "ti_simplelink_soc_family must be specified") - assert(ti_simplelink_device_family != "", - "ti_simplelink_device_family must be specified") + config("cc13x4_26x4_sdk_config") { + libs = [ + "${ti_simplelink_sdk_root}/source/ti/drivers/rf/lib/gcc/${ti_simplelink_isa}/rf_multiMode_${ti_simplelink_soc_family}.a", + "${ti_simplelink_sdk_root}/source/ti/devices/cc13x4_cc26x4/driverlib/bin/gcc/driverlib.lib", + ] + defines = [ "FLASH_ONLY_BUILD" ] + if (ti_simplelink_device == "") { + defines += [ "DeviceFamily_CC13X4" ] + } else { + defines += [ "DeviceFamily_CC26X4" ] + } + if (ti_simplelink_board == "LP_EM_CC1354P10_1" || + (ti_simplelink_board == "CC2674" && + ti_simplelink_device == "CC2674R10RGZ")) { + defines += [ "EM_CC1354P10_1_LP" ] + } + } - libs += [ - "${ti_simplelink_sdk_root}/source/ti/drivers/lib/gcc/${ti_simplelink_isa}/drivers_${ti_simplelink_soc_family}.a", - "${ti_simplelink_sdk_root}/source/ti/drivers/rf/lib/gcc/${ti_simplelink_isa}/rf_multiMode_${ti_simplelink_soc_family}.a", - ] - } else if (ti_simplelink_device_family == "cc32xx") { - assert(ti_simplelink_soc_family != "", - "ti_simplelink_soc_family must be specified") - assert(ti_simplelink_device_family != "", - "ti_simplelink_device_family must be specified") + config("cc32xx_sdk_config") { + defines = [ "DeviceFamily_CC3220" ] - defines += [ "DeviceFamily_CC3220" ] + libs = [ + "${ti_simplelink_sdk_root}/source/ti/drivers/lib/gcc/m4/drivers_cc32xx.a", + "${ti_simplelink_sdk_root}/source/ti/devices/cc32xx/driverlib/gcc/Release/driverlib.a", + "${ti_simplelink_sdk_root}/source/ti/drivers/net/wifi/gcc/rtos/simplelink.a", + "${ti_simplelink_sdk_root}/source/ti/net/lib/gcc/m4/slnetsock_debug.a", + "${ti_simplelink_sdk_root}/source/ti/drivers/net/wifi/slnetif/gcc/Release/slnetifwifi.a", + "${ti_simplelink_sdk_root}/source/ti/drivers/lib/gcc/m4/drivers_${ti_simplelink_soc_family}.a", + ] + include_dirs = [ + "${ti_simplelink_sdk_root}/examples/rtos/common/", + "${ti_simplelink_sdk_root}/examples/rtos/common/ifmod", + ] + } - libs += [ - "${ti_simplelink_sdk_root}/source/ti/drivers/lib/gcc/m4/drivers_cc32xx.a", - "${ti_simplelink_sdk_root}/source/ti/devices/cc32xx/driverlib/gcc/Release/driverlib.a", - "${ti_simplelink_sdk_root}/source/ti/drivers/net/wifi/gcc/rtos/simplelink.a", - "${ti_simplelink_sdk_root}/source/ti/net/lib/gcc/m4/slnetsock_debug.a", - "${ti_simplelink_sdk_root}/source/ti/drivers/net/wifi/slnetif/gcc/Release/slnetifwifi.a", - ] - include_dirs += [ - "${ti_simplelink_sdk_root}/examples/rtos/common/", - "${ti_simplelink_sdk_root}/examples/rtos/common/ifmod", - ] - } + config("external_library_config") { + libs = [ "${target_gen_dir}/drivers_cc13x4.a" ] + } - if (ti_simplelink_device_family == "cc13x2_26x2") { - defines += [ "DeviceFamily_CC13X2_CC26X2" ] - libs += [ "${ti_simplelink_sdk_root}/source/ti/devices/cc13x2_cc26x2/driverlib/bin/gcc/driverlib.lib" ] - } else if (ti_simplelink_device_family == "cc13x2x7_26x2x7") { - defines += [ "DeviceFamily_CC13X2X7_CC26X2X7" ] - libs += [ "${ti_simplelink_sdk_root}/source/ti/devices/cc13x2x7_cc26x2x7/driverlib/bin/gcc/driverlib.lib" ] - } else if (ti_simplelink_device_family == "cc13x4_26x4") { - if (ti_simplelink_device == "") { - defines += [ "DeviceFamily_CC13X4" ] - } else { - defines += [ "DeviceFamily_CC26X4" ] - } - if (ti_simplelink_board == "LP_EM_CC1354P10_1" || - (ti_simplelink_board == "CC2674" && - ti_simplelink_device == "CC2674R10RGZ")) { - defines += [ "EM_CC1354P10_1_LP" ] - } - defines += [ "FLASH_ONLY_BUILD" ] - libs += [ "${ti_simplelink_sdk_root}/source/ti/devices/cc13x4_cc26x4/driverlib/bin/gcc/driverlib.lib" ] - } + group("external_library") { + public_configs = [ ":external_library_config" ] + deps = [ ":build_external_library" ] + } - if (ti_simplelink_device_family == "cc32xx") { - assert(ti_simplelink_soc_family != "", - "ti_simplelink_soc_family must be specified") - assert(ti_simplelink_device_family != "", - "ti_simplelink_device_family must be specified") + config("${sdk_target_name}_config") { + include_dirs = [ + "${ti_simplelink_sdk_root}/source", + "${ti_simplelink_sdk_root}/source/third_party/CMSIS/Include", + "${chip_root}/third_party/mbedtls/repo/include", + ] - libs += [ "${ti_simplelink_sdk_root}/source/ti/drivers/lib/gcc/m4/drivers_${ti_simplelink_soc_family}.a" ] + if (defined(invoker.include_dirs)) { + include_dirs += invoker.include_dirs } - if (defined(invoker.defines)) { - defines += invoker.defines - } + forward_variables_from(invoker, [ "defines" ]) + + configs = [ ":${ti_simplelink_device_family}_sdk_config" ] } source_set("${sdk_target_name}_dpl") { @@ -393,7 +401,41 @@ template("ti_simplelink_sdk") { } } - config("${sdk_target_name}_dmm_config") { + config("${sdk_target_name}_cc13x2_26x2_dmm_config") { + defines = [ + "INCLUDE_BGET_STATS", + "USE_DMM", + "NVOCMP_FREERTOS_MUTEX=1", + "USEOT", + "ICALL_EVENTS", + "ICALL_JT", + "ICALL_LITE", + "ICALL_MAX_NUM_ENTITIES=6", + "ICALL_MAX_NUM_TASKS=3", + "ICALL_STACK0_ADDR", + "POWER_SAVING", + "TBM_ACTIVE_ITEMS_ONLY", + "NPI_USE_UART", + "NPI_FLOW_CTRL=0", + "OSAL_CBTIMER_NUM_TASKS=1", + "USE_ICALL", + "BLE_START", + "FREERTOS", + ] + cflags = [ + "-Wno-conversion", + "-Wno-comment", + "-Wno-shadow", + "@" + rebase_path(ti_simplelink_sdk_root + + "/source/ti/ble5stack/config/build_components.opt", + root_build_dir), + "@" + rebase_path(ti_simplelink_sdk_root + + "/source/ti/ble5stack/config/factory_config.opt", + root_build_dir), + ] + } + + config("${sdk_target_name}_cc13x2x7_26x2x7_dmm_config") { include_dirs = [] libs = [] @@ -418,146 +460,218 @@ template("ti_simplelink_sdk") { "FREERTOS", ] - if (ti_simplelink_device_family == "cc13x2x7_26x2x7") { - libs += [ - "${ti_simplelink_sdk_root}/source/ti/dmm/lib/gcc/m4f/libdmmlib_freertos.a", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/libraries/cc26x2r1/OneLib.a", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/libraries/cc26x2r1/StackWrapper.a", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/libraries/cc26x2r1/ble_r2.symbols", - ] + libs += [ + "${ti_simplelink_sdk_root}/source/ti/dmm/lib/gcc/m4f/libdmmlib_freertos.a", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/libraries/cc26x2r1/OneLib.a", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/libraries/cc26x2r1/StackWrapper.a", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/libraries/cc26x2r1/ble_r2.symbols", + ] - defines += [ - "FLASH_ROM_BUILD", - "ONE_BLE_LIB_SIZE_OPTIMIZATION", - "STACK_LIBRARY", - "CC26XX", - "CC26X2", - "CC26X2R1_LAUNCHXL", - ] - include_dirs += [ - # DMM/BLE: - "${ti_simplelink_sdk_root}/source", - - # Eclipse the SDK config header from DMM - "${chip_root}/src/platform/cc13x2_26x2", - - # CHIPoBLE Added include dirs - "${ti_simplelink_sdk_root}/source/ti/dmm/apps/common/freertos/", - "${ti_simplelink_sdk_root}/source/ti/dmm/apps/common/freertos/itm", - "${ti_simplelink_sdk_root}/source/ti/dmm/thread/platform", - "${ti_simplelink_sdk_root}/source/", - "${ti_simplelink_sdk_root}/source/ti/", - "${ti_simplelink_sdk_root}/source/ti/dmm/", - "${ti_simplelink_sdk_root}/source/ti/dmm/apps/", - "${ti_simplelink_sdk_root}/source/ti/dmm/apps/common/thread/", - "${ti_simplelink_sdk_root}/source/ti/dmm/apps/common/thread/source/activity/", - "${ti_simplelink_sdk_root}/source/ti/common/nv", - - "${ti_simplelink_sdk_root}/source/ti/devices/cc13x2x7_cc26x2x7", - "${ti_simplelink_sdk_root}/source/ti/devices/cc13x2x7_cc26x2x7/inc", - "${ti_simplelink_sdk_root}/source/ti/devices/cc13x2x7_cc26x2x7/rf_patches", - "${ti_simplelink_sdk_root}/source/ti/devices/cc13x2x7_cc26x2x7/driverlib", - - "${ti_simplelink_sdk_root}/source/ti/ble5stack/common/cc26xx/npi/stack/", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/common/cc26xx/rcosc", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/controller/cc26xx/inc", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/inc", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/rom", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/common/cc26xx", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/common/cc26xx/freertos", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/icall/inc", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/icall/src", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/hal/src/target/_common", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/hal/src/target/_common/cc26xx", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/hal/src/inc", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/heapmgr", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/profiles/dev_info", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/hal/src/target/_common/cc26xx/", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/profiles/simple_profile", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/icall/src/inc", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/osal/src/inc", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/controller/cc26xx/inc/", - "${ti_simplelink_sdk_root}/source/ti/common/cc26xx", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/common/cc26xx/freertos/", - ] - } else if (ti_simplelink_device_family == "cc13x4_26x4") { - libs += [ "${ti_simplelink_sdk_root}/source/ti/dmm/lib/gcc/m33f/libdmmlib_freertos.a" ] - if (ti_simplelink_board == "LP_EM_CC1354P10_1" || - (ti_simplelink_board == "CC2674" && - ti_simplelink_device == "CC2674R10RGZ")) { - libs += [ - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/libraries/cc1354p10_1/OneLib.a", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/libraries/cc1354p10_1/StackWrapper.a", - ] - } else if (ti_simplelink_board == "LP_EM_CC1354P10_6" || - (ti_simplelink_board == "CC2674" && - ti_simplelink_device == "CC2674P10RGZ")) { - libs += [ - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/libraries/cc1354p10_6/OneLib.a", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/libraries/cc1354p10_6/StackWrapper.a", - ] - } + defines += [ + "FLASH_ROM_BUILD", + "ONE_BLE_LIB_SIZE_OPTIMIZATION", + "STACK_LIBRARY", + "CC26XX", + "CC26X2", + "CC26X2R1_LAUNCHXL", + ] - defines += [ - "ONE_BLE_LIB_SIZE_OPTIMIZATION", - "NVOCMP_NVPAGES=3", - "NVOCMP_NWSAMEITEM=1", - "CC13X2P", - "SYSCFG", - "CC13X4", - "CC13XX", - "EXTENDED_STACK_SETTINGS=EXTENDED_STACK_SETTINGS_DEFAULT", - ] + include_dirs += [ + # DMM/BLE: + "${ti_simplelink_sdk_root}/source", + + # Eclipse the SDK config header from DMM + "${chip_root}/src/platform/cc13x2_26x2", + + # CHIPoBLE Added include dirs + "${ti_simplelink_sdk_root}/source/ti/dmm/apps/common/freertos/", + "${ti_simplelink_sdk_root}/source/ti/dmm/apps/common/freertos/itm", + "${ti_simplelink_sdk_root}/source/ti/dmm/thread/platform", + "${ti_simplelink_sdk_root}/source/", + "${ti_simplelink_sdk_root}/source/ti/", + "${ti_simplelink_sdk_root}/source/ti/dmm/", + "${ti_simplelink_sdk_root}/source/ti/dmm/apps/", + "${ti_simplelink_sdk_root}/source/ti/dmm/apps/common/thread/", + "${ti_simplelink_sdk_root}/source/ti/dmm/apps/common/thread/source/activity/", + "${ti_simplelink_sdk_root}/source/ti/common/nv", + + "${ti_simplelink_sdk_root}/source/ti/devices/cc13x2x7_cc26x2x7", + "${ti_simplelink_sdk_root}/source/ti/devices/cc13x2x7_cc26x2x7/inc", + "${ti_simplelink_sdk_root}/source/ti/devices/cc13x2x7_cc26x2x7/rf_patches", + "${ti_simplelink_sdk_root}/source/ti/devices/cc13x2x7_cc26x2x7/driverlib", + + "${ti_simplelink_sdk_root}/source/ti/ble5stack/common/cc26xx/npi/stack/", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/common/cc26xx/rcosc", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/controller/cc26xx/inc", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/inc", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/rom", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/common/cc26xx", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/common/cc26xx/freertos", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/icall/inc", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/icall/src", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/hal/src/target/_common", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/hal/src/target/_common/cc26xx", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/hal/src/inc", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/heapmgr", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/profiles/dev_info", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/hal/src/target/_common/cc26xx/", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/profiles/simple_profile", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/icall/src/inc", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/osal/src/inc", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/controller/cc26xx/inc/", + "${ti_simplelink_sdk_root}/source/ti/common/cc26xx", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/common/cc26xx/freertos/", + ] + + cflags = [ + "-Wno-conversion", + "-Wno-comment", + "-Wno-shadow", + "@" + rebase_path(ti_simplelink_sdk_root + + "/source/ti/ble5stack/config/build_components.opt", + root_build_dir), + "@" + rebase_path(ti_simplelink_sdk_root + + "/source/ti/ble5stack/config/factory_config.opt", + root_build_dir), + ] + } + + config("${sdk_target_name}_cc13x4_26x4_dmm_config") { + include_dirs = [] + libs = [] - include_dirs += [ - # DMM/BLE: - "${ti_simplelink_sdk_root}/source", - - # Eclipse the SDK config header from DMM - "${chip_root}/src/platform/cc13x4_26x4", - "${chip_root}/src/platform/cc13xx_26xx", - - # CHIPoBLE Added include dirs - "${ti_simplelink_sdk_root}/source/ti/dmm/apps/common/freertos/", - "${ti_simplelink_sdk_root}/source/ti/dmm/apps/common/freertos/itm", - "${ti_simplelink_sdk_root}/source/ti/dmm/thread/platform", - "${ti_simplelink_sdk_root}/source/", - "${ti_simplelink_sdk_root}/source/ti/", - "${ti_simplelink_sdk_root}/source/ti/dmm/", - "${ti_simplelink_sdk_root}/source/ti/dmm/apps/", - "${ti_simplelink_sdk_root}/source/ti/dmm/apps/common/thread/", - "${ti_simplelink_sdk_root}/source/ti/dmm/apps/common/thread/source/activity/", - "${ti_simplelink_sdk_root}/source/ti/common/nv", - - "${ti_simplelink_sdk_root}/source/ti/devices/cc13x4_cc26x4", - "${ti_simplelink_sdk_root}/source/ti/devices/cc13x4_cc26x4/inc", - "${ti_simplelink_sdk_root}/source/ti/devices/cc13x4_cc26x4/rf_patches", - "${ti_simplelink_sdk_root}/source/ti/devices/cc13x4_cc26x4/driverlib", - - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/common/cc26xx/npi/stack/", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/common/cc26xx/rcosc", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/controller/cc26xx/inc", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/inc", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/rom", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/common/cc26xx", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/common/cc26xx/freertos", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/icall/inc", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/icall/src", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/hal/src/target/_common", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/hal/src/target/_common/cc26xx", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/hal/src/inc", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/heapmgr", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/profiles/dev_info", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/hal/src/target/_common/cc26xx/", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/profiles/simple_profile", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/icall/src/inc", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/osal/src/inc", - "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/controller/cc26xx/inc/", - "${ti_simplelink_sdk_root}/source/ti/common/cc26xx", - "${ti_simplelink_sdk_root}/source/ti/ble5stack/common/cc26xx/freertos/", + defines = [ + "INCLUDE_BGET_STATS", + "USE_DMM", + "NVOCMP_FREERTOS_MUTEX=1", + "USEOT", + "ICALL_EVENTS", + "ICALL_JT", + "ICALL_LITE", + "ICALL_MAX_NUM_ENTITIES=6", + "ICALL_MAX_NUM_TASKS=3", + "ICALL_STACK0_ADDR", + "POWER_SAVING", + "TBM_ACTIVE_ITEMS_ONLY", + "NPI_USE_UART", + "NPI_FLOW_CTRL=0", + "OSAL_CBTIMER_NUM_TASKS=1", + "USE_ICALL", + "BLE_START", + "FREERTOS", + ] + libs += [ "${ti_simplelink_sdk_root}/source/ti/dmm/lib/gcc/m4f/libdmmlib_freertos.a" ] + if (ti_simplelink_board == "LP_EM_CC1354P10_1" || + (ti_simplelink_board == "CC2674" && + ti_simplelink_device == "CC2674R10RGZ")) { + libs += [ + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/libraries/cc1354p10_1/OneLib.a", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/libraries/cc1354p10_1/StackWrapper.a", + ] + } else if (ti_simplelink_board == "LP_EM_CC1354P10_6" || + (ti_simplelink_board == "CC2674" && + ti_simplelink_device == "CC2674P10RGZ")) { + libs += [ + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/libraries/cc1354p10_6/OneLib.a", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/libraries/cc1354p10_6/StackWrapper.a", ] } + defines += [ + "ONE_BLE_LIB_SIZE_OPTIMIZATION", + "NVOCMP_NVPAGES=5", + "NVOCMP_NWSAMEITEM=1", + "CC13X2P", + "SYSCFG", + "CC13X4", + "CC13XX", + "EXTENDED_STACK_SETTINGS=EXTENDED_STACK_SETTINGS_DEFAULT", + ] + + include_dirs += [ + # DMM/BLE: + "${ti_simplelink_sdk_root}/source", + + # Eclipse the SDK config header from DMM + "${chip_root}/src/platform/cc13x4_26x4", + "${chip_root}/src/platform/cc13xx_26xx", + + # CHIPoBLE Added include dirs + "${ti_simplelink_sdk_root}/source/ti/dmm/apps/common/freertos/", + "${ti_simplelink_sdk_root}/source/ti/dmm/apps/common/freertos/itm", + "${ti_simplelink_sdk_root}/source/ti/dmm/thread/platform", + "${ti_simplelink_sdk_root}/source/", + "${ti_simplelink_sdk_root}/source/ti/", + "${ti_simplelink_sdk_root}/source/ti/dmm/", + "${ti_simplelink_sdk_root}/source/ti/dmm/apps/", + "${ti_simplelink_sdk_root}/source/ti/dmm/apps/common/thread/", + "${ti_simplelink_sdk_root}/source/ti/dmm/apps/common/thread/source/activity/", + "${ti_simplelink_sdk_root}/source/ti/common/nv", + + "${ti_simplelink_sdk_root}/source/ti/devices/cc13x4_cc26x4", + "${ti_simplelink_sdk_root}/source/ti/devices/cc13x4_cc26x4/inc", + "${ti_simplelink_sdk_root}/source/ti/devices/cc13x4_cc26x4/rf_patches", + "${ti_simplelink_sdk_root}/source/ti/devices/cc13x4_cc26x4/driverlib", + + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/common/cc26xx/npi/stack/", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/common/cc26xx/rcosc", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/controller/cc26xx/inc", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/inc", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/rom", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/common/cc26xx", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/common/cc26xx/freertos", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/icall/inc", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/icall/src", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/hal/src/target/_common", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/hal/src/target/_common/cc26xx", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/hal/src/inc", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/heapmgr", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/profiles/dev_info", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/hal/src/target/_common/cc26xx/", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/profiles/simple_profile", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/icall/src/inc", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/osal/src/inc", + "${ti_simplelink_sdk_root}/source/ti/ble5stack_flash/controller/cc26xx/inc/", + "${ti_simplelink_sdk_root}/source/ti/common/cc26xx", + "${ti_simplelink_sdk_root}/source/ti/ble5stack/common/cc26xx/freertos/", + ] + + cflags = [ + "-Wno-conversion", + "-Wno-comment", + "-Wno-shadow", + "@" + rebase_path(ti_simplelink_sdk_root + + "/source/ti/ble5stack/config/build_components.opt", + root_build_dir), + "@" + rebase_path(ti_simplelink_sdk_root + + "/source/ti/ble5stack/config/factory_config.opt", + root_build_dir), + ] + } + + config("${sdk_target_name}_cc32xx_dmm_config") { + include_dirs = [] + libs = [] + defines = [ + "INCLUDE_BGET_STATS", + "USE_DMM", + "NVOCMP_FREERTOS_MUTEX=1", + "USEOT", + "ICALL_EVENTS", + "ICALL_JT", + "ICALL_LITE", + "ICALL_MAX_NUM_ENTITIES=6", + "ICALL_MAX_NUM_TASKS=3", + "ICALL_STACK0_ADDR", + "POWER_SAVING", + "TBM_ACTIVE_ITEMS_ONLY", + "NPI_USE_UART", + "NPI_FLOW_CTRL=0", + "OSAL_CBTIMER_NUM_TASKS=1", + "USE_ICALL", + "BLE_START", + "FREERTOS", + ] cflags = [ "-Wno-conversion", "-Wno-comment", @@ -643,7 +757,7 @@ template("ti_simplelink_sdk") { public_configs = [ ":${sdk_target_name}_config", - ":${sdk_target_name}_dmm_config", + ":${sdk_target_name}_${ti_simplelink_device_family}_dmm_config", ] } } @@ -652,6 +766,7 @@ template("ti_simplelink_sdk") { public_deps = [ ":${sdk_target_name}_dpl", ":${sdk_target_name}_freertos", + ":build_external_library", ] if (ti_simplelink_device_family == "cc13x2_26x2" || ti_simplelink_device_family == "cc13x2x7_26x2x7" || @@ -663,71 +778,7 @@ template("ti_simplelink_sdk") { } if (defined(invoker.public_configs)) { public_configs = invoker.public_configs + public_configs += [ ":external_library_config" ] } } } - -# "${openthread_root}/src/core:libopenthread_core_headers", - -# config("${sdk_target_name}_openthread_platform_config") { -# include_dirs = [ -# "${chip_root}/third_party/openthread/repo/examples/platforms", -# "${chip_root}/third_party/openthread/repo/src/core", -# "${ti_simplelink_sdk_root}/source/ti/devices/${ti_simplelink_device_family}", -# ] - -# if (ti_simplelink_device_family == "cc13x2_26x2") { -# include_dirs += [ -# "${ti_simplelink_sdk_root}/source/ti/devices/cc13x2_cc26x2", -# "${ot_cc13x2_cc26x2}/src/cc13x2_cc26x2", -# ] -# } else if (ti_simplelink_device_family == "cc13x2x7_26x2x7") { -# include_dirs += [ -# "${ti_simplelink_sdk_root}/source/ti/devices/cc13x2x7_cc26x2x7", -# "${ot_cc13x2_cc26x2}/src/cc13x2_cc26x2", -# ] -# } -# } - -# source_set("${sdk_target_name}_openthread_platform") { -# cflags = [ -# "-Wno-int-conversion", -# "-Wno-address-of-packed-member", -# "-Wno-implicit-fallthrough", -# "-Wno-unused-label", -# ] -# public_deps = [ -# ":${sdk_target_name}_freertos", -# "${chip_root}/third_party/ti_simplelink_sdk:freertos", -# "${chip_root}/third_party/ti_simplelink_sdk:mbedtls", -# "${chip_root}/third_party/ti_simplelink_sdk:ti_simplelink_sysconfig", -# "${openthread_root}/src/core:libopenthread_core_headers", -# ] - -# configs -= [ "${build_root}/config/compiler:std_default" ] -# configs += [ ":${sdk_target_name}_posix_config" ] -# sources = [ -# "${ot_cc13x2_cc26x2}/src/cc13x2_cc26x2/alarm.c", -# "${ot_cc13x2_cc26x2}/src/cc13x2_cc26x2/alarm_micro.c", -# "${ot_cc13x2_cc26x2}/src/cc13x2_cc26x2/diag.c", -# "${ot_cc13x2_cc26x2}/src/cc13x2_cc26x2/entropy.c", -# "${ot_cc13x2_cc26x2}/src/cc13x2_cc26x2/misc.c", -# "${ot_cc13x2_cc26x2}/src/cc13x2_cc26x2/radio.c", -# "${ot_cc13x2_cc26x2}/src/cc13x2_cc26x2/settings.c", -# #"${ot_cc13x2_cc26x2}/src/cc13x2_cc26x2/system.c", -# ] - -# public_configs = [ -# ":${sdk_target_name}_config", -# ":${sdk_target_name}_openthread_platform_config", -# "${chip_root}/third_party/openthread/repo:openthread_config", -# ] - -# if (chip_openthread_ftd) { -# public_configs += -# [ "${chip_root}/third_party/openthread/repo:openthread_ftd_config" ] -# } else { -# public_configs += -# [ "${chip_root}/third_party/openthread/repo:openthread_mtd_config" ] -# } -# } diff --git a/zzz_generated/app-common/app-common/zap-generated/tests/simulated-cluster-objects.h b/zzz_generated/app-common/app-common/zap-generated/tests/simulated-cluster-objects.h deleted file mode 100644 index e75d11598b9b0b..00000000000000 --- a/zzz_generated/app-common/app-common/zap-generated/tests/simulated-cluster-objects.h +++ /dev/null @@ -1,1551 +0,0 @@ -/* - * - * Copyright (c) 2022 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 FILE IS GENERATED BY ZAP - -#include -#include - -#pragma once - -namespace chip { - -struct PairWithCodeCommand -{ - chip::NodeId nodeId; - chip::CharSpan payload; - Optional discoverOnce; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), nodeId)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(1), payload)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(2), discoverOnce)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, nodeId)); - break; - case 1: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, payload)); - break; - case 2: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, discoverOnce)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct UnpairCommand -{ - chip::NodeId nodeId; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), nodeId)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, nodeId)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct GetCommissionerNodeIdCommand -{ - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct GetCommissionerNodeIdResponse -{ - chip::NodeId nodeId; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), nodeId)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, nodeId)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct WaitForMsCommand -{ - uint32_t ms; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), ms)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, ms)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct WaitForCommissioningCommand -{ - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct WaitForCommissioneeCommand -{ - chip::NodeId nodeId; - Optional expireExistingSession; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), nodeId)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(1), expireExistingSession)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, nodeId)); - break; - case 1: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, expireExistingSession)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct WaitForMessageCommand -{ - Optional registerKey; - chip::CharSpan message; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), registerKey)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(1), message)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, registerKey)); - break; - case 1: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, message)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct FindCommissionableCommand -{ - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct FindCommissionableByShortDiscriminatorCommand -{ - uint64_t value; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), value)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, value)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct FindCommissionableByLongDiscriminatorCommand -{ - uint64_t value; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), value)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, value)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct FindCommissionableByCommissioningModeCommand -{ - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct FindCommissionableByVendorIdCommand -{ - uint64_t value; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), value)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, value)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct FindCommissionableByDeviceTypeCommand -{ - uint64_t value; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), value)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, value)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct FindCommissionableByNameCommand -{ - chip::CharSpan value; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), value)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, value)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct FindCommissionerCommand -{ - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct FindCommissionerByVendorIdCommand -{ - uint64_t value; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), value)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, value)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct FindCommissionerByDeviceTypeCommand -{ - uint64_t value; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), value)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, value)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct DiscoveryCommandResponse -{ - chip::CharSpan hostName; - chip::CharSpan instanceName; - uint16_t longDiscriminator; - uint8_t shortDiscriminator; - uint16_t vendorId; - uint16_t productId; - uint8_t commissioningMode; - uint32_t deviceType; - chip::CharSpan deviceName; - chip::ByteSpan rotatingId; - uint64_t rotatingIdLen; - uint16_t pairingHint; - chip::CharSpan pairingInstruction; - bool supportsTcp; - uint8_t numIPs; - uint16_t port; - Optional mrpRetryIntervalIdle; - Optional mrpRetryIntervalActive; - Optional mrpRetryActiveThreshold; - Optional isICDOperatingAsLIT; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), hostName)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(1), instanceName)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(2), longDiscriminator)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(3), shortDiscriminator)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(4), vendorId)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(5), productId)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(6), commissioningMode)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(7), deviceType)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(8), deviceName)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(9), rotatingId)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(10), rotatingIdLen)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(11), pairingHint)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(12), pairingInstruction)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(13), supportsTcp)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(14), numIPs)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(15), port)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(16), mrpRetryIntervalIdle)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(17), mrpRetryIntervalActive)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(18), mrpRetryActiveThreshold)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(19), isICDOperatingAsLIT)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, hostName)); - break; - case 1: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, instanceName)); - break; - case 2: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, longDiscriminator)); - break; - case 3: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, shortDiscriminator)); - break; - case 4: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, vendorId)); - break; - case 5: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, productId)); - break; - case 6: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, commissioningMode)); - break; - case 7: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, deviceType)); - break; - case 8: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, deviceName)); - break; - case 9: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, rotatingId)); - break; - case 10: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, rotatingIdLen)); - break; - case 11: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, pairingHint)); - break; - case 12: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, pairingInstruction)); - break; - case 13: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, supportsTcp)); - break; - case 14: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, numIPs)); - break; - case 15: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, port)); - break; - case 16: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, mrpRetryIntervalIdle)); - break; - case 17: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, mrpRetryIntervalActive)); - break; - case 18: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, mrpRetryActiveThreshold)); - break; - case 19: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, isICDOperatingAsLIT)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct BooleanEqualsCommand -{ - bool Value1; - bool Value2; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), Value1)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(1), Value2)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, Value1)); - break; - case 1: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, Value2)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct SignedNumberEqualsCommand -{ - int64_t Value1; - int64_t Value2; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), Value1)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(1), Value2)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, Value1)); - break; - case 1: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, Value2)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct UnsignedNumberEqualsCommand -{ - uint64_t Value1; - uint64_t Value2; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), Value1)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(1), Value2)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, Value1)); - break; - case 1: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, Value2)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct EqualityResponse -{ - bool Equals; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), Equals)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, Equals)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct LogCommand -{ - chip::CharSpan message; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), message)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, message)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct UserPromptCommand -{ - chip::CharSpan message; - Optional expectedValue; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), message)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(1), expectedValue)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, message)); - break; - case 1: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, expectedValue)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct StartCommand -{ - Optional registerKey; - Optional discriminator; - Optional port; - Optional kvs; - Optional minCommissioningTimeout; - Optional filepath; - Optional otaDownloadPath; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), registerKey)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(1), discriminator)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(2), port)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(3), kvs)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(4), minCommissioningTimeout)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(5), filepath)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(6), otaDownloadPath)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, registerKey)); - break; - case 1: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, discriminator)); - break; - case 2: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, port)); - break; - case 3: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, kvs)); - break; - case 4: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, minCommissioningTimeout)); - break; - case 5: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, filepath)); - break; - case 6: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, otaDownloadPath)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct StopCommand -{ - Optional registerKey; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), registerKey)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, registerKey)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct RebootCommand -{ - Optional registerKey; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), registerKey)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, registerKey)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct FactoryResetCommand -{ - Optional registerKey; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), registerKey)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, registerKey)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct CreateOtaImageCommand -{ - chip::CharSpan otaImageFilePath; - chip::CharSpan rawImageFilePath; - chip::CharSpan rawImageContent; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), otaImageFilePath)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(1), rawImageFilePath)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(2), rawImageContent)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, otaImageFilePath)); - break; - case 1: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, rawImageFilePath)); - break; - case 2: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, rawImageContent)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -struct CompareFilesCommand -{ - chip::CharSpan file1; - chip::CharSpan file2; - - CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const - { - chip::TLV::TLVType outer; - ReturnErrorOnFailure(writer.StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(0), file1)); - ReturnErrorOnFailure(chip::app::DataModel::Encode(writer, chip::TLV::ContextTag(1), file2)); - ReturnErrorOnFailure(writer.EndContainer(outer)); - return CHIP_NO_ERROR; - } - - CHIP_ERROR Decode(chip::TLV::TLVReader & reader) - { - CHIP_ERROR err = CHIP_NO_ERROR; - chip::TLV::TLVType outer; - VerifyOrReturnError(chip::TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); - ReturnErrorOnFailure(reader.EnterContainer(outer)); - - while ((err = reader.Next()) == CHIP_NO_ERROR) - { - VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); - switch (chip::TLV::TagNumFromTag(reader.GetTag())) - { - case 0: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, file1)); - break; - case 1: - ReturnErrorOnFailure(chip::app::DataModel::Decode(reader, file2)); - break; - default: - break; - } - } - - VerifyOrReturnError(err == CHIP_END_OF_TLV, err); - ReturnErrorOnFailure(reader.ExitContainer(outer)); - - return CHIP_NO_ERROR; - } -}; - -namespace app { -namespace Clusters { - -namespace CommissionerCommands { -namespace Commands { -namespace PairWithCode { -using Type = struct PairWithCodeCommand; -} -namespace Unpair { -using Type = struct UnpairCommand; -} -namespace GetCommissionerNodeId { -using Type = struct GetCommissionerNodeIdCommand; -} -namespace GetCommissionerNodeIdResponse { -using DecodableType = struct GetCommissionerNodeIdResponse; -} -} // namespace Commands -} // namespace CommissionerCommands - -namespace DelayCommands { -namespace Commands { -namespace WaitForMs { -using Type = struct WaitForMsCommand; -} -namespace WaitForCommissioning { -using Type = struct WaitForCommissioningCommand; -} -namespace WaitForCommissionee { -using Type = struct WaitForCommissioneeCommand; -} -namespace WaitForMessage { -using Type = struct WaitForMessageCommand; -} -} // namespace Commands -} // namespace DelayCommands - -namespace DiscoveryCommands { -namespace Commands { -namespace FindCommissionable { -using Type = struct FindCommissionableCommand; -} -namespace FindCommissionableByShortDiscriminator { -using Type = struct FindCommissionableByShortDiscriminatorCommand; -} -namespace FindCommissionableByLongDiscriminator { -using Type = struct FindCommissionableByLongDiscriminatorCommand; -} -namespace FindCommissionableByCommissioningMode { -using Type = struct FindCommissionableByCommissioningModeCommand; -} -namespace FindCommissionableByVendorId { -using Type = struct FindCommissionableByVendorIdCommand; -} -namespace FindCommissionableByDeviceType { -using Type = struct FindCommissionableByDeviceTypeCommand; -} -namespace FindCommissionableByName { -using Type = struct FindCommissionableByNameCommand; -} -namespace FindCommissioner { -using Type = struct FindCommissionerCommand; -} -namespace FindCommissionerByVendorId { -using Type = struct FindCommissionerByVendorIdCommand; -} -namespace FindCommissionerByDeviceType { -using Type = struct FindCommissionerByDeviceTypeCommand; -} -namespace DiscoveryCommandResponse { -using DecodableType = struct DiscoveryCommandResponse; -} -} // namespace Commands -} // namespace DiscoveryCommands - -namespace EqualityCommands { -namespace Commands { -namespace BooleanEquals { -using Type = struct BooleanEqualsCommand; -} -namespace SignedNumberEquals { -using Type = struct SignedNumberEqualsCommand; -} -namespace UnsignedNumberEquals { -using Type = struct UnsignedNumberEqualsCommand; -} -namespace EqualityResponse { -using DecodableType = struct EqualityResponse; -} -} // namespace Commands -} // namespace EqualityCommands - -namespace LogCommands { -namespace Commands { -namespace Log { -using Type = struct LogCommand; -} -namespace UserPrompt { -using Type = struct UserPromptCommand; -} -} // namespace Commands -} // namespace LogCommands - -namespace SystemCommands { -namespace Commands { -namespace Start { -using Type = struct StartCommand; -} -namespace Stop { -using Type = struct StopCommand; -} -namespace Reboot { -using Type = struct RebootCommand; -} -namespace FactoryReset { -using Type = struct FactoryResetCommand; -} -namespace CreateOtaImage { -using Type = struct CreateOtaImageCommand; -} -namespace CompareFiles { -using Type = struct CompareFilesCommand; -} -} // namespace Commands -} // namespace SystemCommands - -} // namespace Clusters -} // namespace app - -} // namespace chip diff --git a/zzz_generated/placeholder/app1/zap-generated/test/Commands.h b/zzz_generated/placeholder/app1/zap-generated/test/Commands.h deleted file mode 100644 index fd7e5da8588d13..00000000000000 --- a/zzz_generated/placeholder/app1/zap-generated/test/Commands.h +++ /dev/null @@ -1,1719 +0,0 @@ -/* - * - * Copyright (c) 2022 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 FILE IS GENERATED BY ZAP - -#pragma once - -#include "TestCommand.h" - -#include - -class Test_TC_WNCV_5_1_SimulatedSuite : public TestCommand -{ -public: - Test_TC_WNCV_5_1_SimulatedSuite() : TestCommand("Test_TC_WNCV_5_1_Simulated", 5) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_WNCV_5_1_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "Step 1a: DUT reads the FeatureMap attribute from TH"); - return WaitAttribute(GetEndpoint(0), WindowCovering::Id, WindowCovering::Attributes::FeatureMap::Id); - } - case 1: { - LogStep(1, "Step 2a: DUT reads the Type attribute from TH"); - VerifyOrDo(!ShouldSkip("WNCV.C.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(0), WindowCovering::Id, WindowCovering::Attributes::Type::Id); - } - case 2: { - LogStep(2, "Step 2b: DUT reads the EndProductType attribute from TH"); - VerifyOrDo(!ShouldSkip("WNCV.C.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(0), WindowCovering::Id, WindowCovering::Attributes::EndProductType::Id); - } - case 3: { - LogStep(3, "Step 3a: DUT reads the Mode attribute from TH"); - VerifyOrDo(!ShouldSkip("WNCV.C.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(0), WindowCovering::Id, WindowCovering::Attributes::Mode::Id); - } - case 4: { - LogStep(4, "Step 3b: DUT reads the ConfigStatus attribute from TH"); - VerifyOrDo(!ShouldSkip("WNCV.C.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(0), WindowCovering::Id, WindowCovering::Attributes::ConfigStatus::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_OCC_2_4_SimulatedSuite : public TestCommand -{ -public: - Test_TC_OCC_2_4_SimulatedSuite() : TestCommand("Test_TC_OCC_2_4_Simulated", 2) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_OCC_2_4_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "TH reads OccupancySensorType attribute from DUT"); - VerifyOrDo(!ShouldSkip("OCC.C.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), OccupancySensing::Id, OccupancySensing::Attributes::OccupancySensorType::Id); - } - case 1: { - LogStep(1, "TH reads OccupancySensorTypeBitmap attribute from DUT"); - VerifyOrDo(!ShouldSkip("OCC.C.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), OccupancySensing::Id, OccupancySensing::Attributes::OccupancySensorTypeBitmap::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_DGSW_3_2_SimulatedSuite : public TestCommand -{ -public: - Test_TC_DGSW_3_2_SimulatedSuite() : TestCommand("Test_TC_DGSW_3_2_Simulated", 1) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_DGSW_3_2_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "DUT sends ResetWatermarks to TH"); - VerifyOrDo(!ShouldSkip("DGSW.C.C00.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), SoftwareDiagnostics::Id, SoftwareDiagnostics::Commands::ResetWatermarks::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_DGETH_3_2_SimulatedSuite : public TestCommand -{ -public: - Test_TC_DGETH_3_2_SimulatedSuite() : TestCommand("Test_TC_DGETH_3_2_Simulated", 1) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_DGETH_3_2_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "DUT sends ResetCounts to TH"); - VerifyOrDo(!ShouldSkip("DGETH.C.C00.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), EthernetNetworkDiagnostics::Id, - EthernetNetworkDiagnostics::Commands::ResetCounts::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_DGWIFI_3_2_SimulatedSuite : public TestCommand -{ -public: - Test_TC_DGWIFI_3_2_SimulatedSuite() : TestCommand("Test_TC_DGWIFI_3_2_Simulated", 1) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_DGWIFI_3_2_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "DUT sends ResetCounts command to TH"); - VerifyOrDo(!ShouldSkip("DGWIFI.C.C00.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), WiFiNetworkDiagnostics::Id, WiFiNetworkDiagnostics::Commands::ResetCounts::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_WNCV_6_1_SimulatedSuite : public TestCommand -{ -public: - Test_TC_WNCV_6_1_SimulatedSuite() : TestCommand("Test_TC_WNCV_6_1_Simulated", 3) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_WNCV_6_1_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "Step 1a: DUT sends UpOrOpen command to TH"); - VerifyOrDo(!ShouldSkip("WNCV.C.C00.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), WindowCovering::Id, WindowCovering::Commands::UpOrOpen::Id); - } - case 1: { - LogStep(1, "Step 2a: DUT sends DownOrClose command to TH"); - VerifyOrDo(!ShouldSkip("WNCV.C.C01.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id); - } - case 2: { - LogStep(2, "Step 3a: DUT sends StopMotion command to TH"); - VerifyOrDo(!ShouldSkip("WNCV.C.C02.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), WindowCovering::Id, WindowCovering::Commands::StopMotion::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_WNCV_7_1_SimulatedSuite : public TestCommand -{ -public: - Test_TC_WNCV_7_1_SimulatedSuite() : TestCommand("Test_TC_WNCV_7_1_Simulated", 2) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_WNCV_7_1_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "Step 1a: If (PA_LF & LF) DUT sends GoToLiftPercentage command with 50% to DUT"); - VerifyOrDo(!ShouldSkip("WNCV.C.C05.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), WindowCovering::Id, WindowCovering::Commands::GoToLiftPercentage::Id); - } - case 1: { - LogStep(1, "Step 2a: If (PA_TL & TL) DUT sends GoToTiltPercentage command with 50% to DUT"); - VerifyOrDo(!ShouldSkip("WNCV.C.C08.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), WindowCovering::Id, WindowCovering::Commands::GoToTiltPercentage::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_CC_3_4_SimulatedSuite : public TestCommand -{ -public: - Test_TC_CC_3_4_SimulatedSuite() : TestCommand("Test_TC_CC_3_4_Simulated", 16) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - AddArgument("ConfigTransitionTime", 0, UINT16_MAX, &mConfigTransitionTime); - } - - ~Test_TC_CC_3_4_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - chip::Optional mConfigTransitionTime; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - case 3: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 7: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 11: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 14: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "PreCondition: Set TH OnOff to On"); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id); - } - case 1: { - LogStep(1, "DUT sends MoveToHue command to TH an Hue with _TransitionTime 300"); - VerifyOrDo(!ShouldSkip("CC.C.C00.Tx && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id); - } - case 2: { - LogStep(2, "DUT reads CurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.C00.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - case 3: { - LogStep(3, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 4: { - LogStep(4, "DUT reads CurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.C00.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - case 5: { - LogStep(5, "DUT sends MoveHue command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C01.Tx && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveHue::Id); - } - case 6: { - LogStep(6, "DUT reads CurrentHue attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C01.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - case 7: { - LogStep(7, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 8: { - LogStep(8, "DUT reads CurrentHue attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C01.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - case 9: { - LogStep(9, "DUT sends StepHue command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C02.Tx && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepHue::Id); - } - case 10: { - LogStep(10, "DUT reads CurrentHue attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C02.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - case 11: { - LogStep(11, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 12: { - LogStep(12, "DUT reads CurrentHue attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C02.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - case 13: { - LogStep(13, "DUT sends StopMoveStep command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C03.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id); - } - case 14: { - LogStep(14, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 15: { - LogStep(15, "Over TransitionTime, DUT reads CurrentHue attribute from TH"); - VerifyOrDo(!ShouldSkip("CC.C.C03.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_CC_4_5_SimulatedSuite : public TestCommand -{ -public: - Test_TC_CC_4_5_SimulatedSuite() : TestCommand("Test_TC_CC_4_5_Simulated", 22) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - AddArgument("ConfigTransitionTime", 0, UINT16_MAX, &mConfigTransitionTime); - } - - ~Test_TC_CC_4_5_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - chip::Optional mConfigTransitionTime; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - case 3: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 7: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 11: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 16: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 20: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "PreCondition: Set TH OnOff to On"); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id); - } - case 1: { - LogStep(1, "DUT sends MoveToSaturation command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C03.Tx && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id); - } - case 2: { - LogStep(2, "DUT reads CurrentSaturation attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.C03.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 3: { - LogStep(3, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 4: { - LogStep(4, "DUT reads CurrentSaturation attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.C03.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 5: { - LogStep(5, "DUT sends MoveSaturation command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C04.Tx && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveSaturation::Id); - } - case 6: { - LogStep(6, "DUT reads CurrentSaturation attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C04.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 7: { - LogStep(7, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 8: { - LogStep(8, "DUT reads CurrentSaturation attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C04.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 9: { - LogStep(9, "DUT sends StepSaturation command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C05.Tx && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepSaturation::Id); - } - case 10: { - LogStep(10, "DUT reads CurrentSaturation attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C05.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 11: { - LogStep(11, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 12: { - LogStep(12, "DUT reads CurrentSaturation attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C05.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 13: { - LogStep(13, "DUT sends MoveToHueAndSaturation command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C06.Tx && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHueAndSaturation::Id); - } - case 14: { - LogStep(14, "DUT reads CurrentSaturation attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C06.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 15: { - LogStep(15, "DUT reads CurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.C06.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - case 16: { - LogStep(16, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 17: { - LogStep(17, "DUT reads CurrentSaturation attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C06.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 18: { - LogStep(18, "DUT reads CurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.C06.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - case 19: { - LogStep(19, "DUT sends StopMoveStep command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C47.Tx && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id); - } - case 20: { - LogStep(20, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 21: { - LogStep(21, "Over TransitionTime, DUT reads CurrentSaturation attribute from TH"); - VerifyOrDo(!ShouldSkip("CC.C.C47.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_CC_5_4_SimulatedSuite : public TestCommand -{ -public: - Test_TC_CC_5_4_SimulatedSuite() : TestCommand("Test_TC_CC_5_4_Simulated", 9) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("ConfigTransitionTime", 0, UINT16_MAX, &mConfigTransitionTime); - } - - ~Test_TC_CC_5_4_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mTimeout; - chip::Optional mEndpoint; - chip::Optional mConfigTransitionTime; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - case 2: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 4: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 6: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 8: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "PreCondition: Set TH OnOff to On"); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id); - } - case 1: { - LogStep(1, "DUT sends MoveToColor command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C07.Tx && CC.C.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id); - } - case 2: { - LogStep(2, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 3: { - LogStep(3, "DUT sends MoveColor command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C08.Tx && CC.C.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveColor::Id); - } - case 4: { - LogStep(4, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 5: { - LogStep(5, "DUT sends StepColor command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C09.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepColor::Id); - } - case 6: { - LogStep(6, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 7: { - LogStep(7, "DUT sends StopMoveStep command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C47.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id); - } - case 8: { - LogStep(8, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_CC_6_4_SimulatedSuite : public TestCommand -{ -public: - Test_TC_CC_6_4_SimulatedSuite() : TestCommand("Test_TC_CC_6_4_Simulated", 18) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("ConfigTransitionTime", 0, UINT16_MAX, &mConfigTransitionTime); - } - - ~Test_TC_CC_6_4_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mTimeout; - chip::Optional mEndpoint; - chip::Optional mConfigTransitionTime; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - case 5: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 9: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 13: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 16: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "PreCondition: Set TH OnOff to On"); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id); - } - case 1: { - LogStep(1, - "* TH provides a server implementation of Color Control with F04(CT)=true and reasonable values of " - "ColorTempPhysicalMinMireds (e.g. 153 (6500K), ColorTempPhysicalMaxMireds (e.g. 454 (2200K)) DUT read " - "attribute ColorTempPhysicalMinMireds from TH"); - VerifyOrDo(!ShouldSkip("CC.C.A400b && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTempPhysicalMinMireds::Id); - } - case 2: { - LogStep(2, - "* TH provides a server implementation of Color Control with F04(CT)=true and reasonable values of " - "ColorTempPhysicalMinMireds (e.g. 153 (6500K), ColorTempPhysicalMaxMireds (e.g. 454 (2200K)) DUT read " - "attribute ColorTempPhysicalMaxMireds from TH"); - VerifyOrDo(!ShouldSkip("CC.C.A400c && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTempPhysicalMaxMireds::Id); - } - case 3: { - LogStep(3, "DUT sends MoveToColorTemperature command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C0a.Tx && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColorTemperature::Id); - } - case 4: { - LogStep(4, "DUT reads CurrentColorTemperatureMireds attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C0a.Tx && CC.C.A0007 && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id); - } - case 5: { - LogStep(5, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 6: { - LogStep(6, "DUT reads CurrentColorTemperatureMireds attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C0a.Tx && CC.C.A0007 && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id); - } - case 7: { - LogStep(7, "DUT sends MoveColorTemperatureMireds command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C4b.Tx && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveColorTemperature::Id); - } - case 8: { - LogStep(8, "DUT reads CurrentColorTemperatureMireds attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C4b.Tx && CC.C.A0007 && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id); - } - case 9: { - LogStep(9, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 10: { - LogStep(10, "DUT reads CurrentColorTemperatureMireds attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C4b.Tx && CC.C.A0007 && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id); - } - case 11: { - LogStep(11, "DUT sends StepColorTemperature command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C4c.Tx && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepColorTemperature::Id); - } - case 12: { - LogStep(12, "DUT reads CurrentColorTemperatureMireds attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C4c.Tx && CC.C.A0007 && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id); - } - case 13: { - LogStep(13, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 14: { - LogStep(14, "DUT reads CurrentColorTemperatureMireds attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C4c.Tx && CC.C.A0007 && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id); - } - case 15: { - LogStep(15, "DUT sends StopMoveStep command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C47.Tx && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id); - } - case 16: { - LogStep(16, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 17: { - LogStep(17, "DUT reads CurrentColorTemperatureMireds attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C47.Tx && CC.C.A0007 && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_CC_7_5_SimulatedSuite : public TestCommand -{ -public: - Test_TC_CC_7_5_SimulatedSuite() : TestCommand("Test_TC_CC_7_5_Simulated", 23) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("ConfigTransitionTime", 0, UINT16_MAX, &mConfigTransitionTime); - } - - ~Test_TC_CC_7_5_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mTimeout; - chip::Optional mEndpoint; - chip::Optional mConfigTransitionTime; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - case 3: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 7: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 11: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 16: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 21: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "PreCondition: Set TH OnOff to On"); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id); - } - case 1: { - LogStep(1, "DUT sends MoveToEnhancedHue command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C40.Tx && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id); - } - case 2: { - LogStep(2, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C40.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 3: { - LogStep(3, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 4: { - LogStep(4, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C40.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 5: { - LogStep(5, "DUT sends MoveEnhanced Hue command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C41.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveHue::Id); - } - case 6: { - LogStep(6, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C41.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 7: { - LogStep(7, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 8: { - LogStep(8, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C41.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 9: { - LogStep(9, "DUT sends StepEnhanced command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C42.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedStepHue::Id); - } - case 10: { - LogStep(10, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C42.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 11: { - LogStep(11, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 12: { - LogStep(12, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C42.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 13: { - LogStep(13, "DUT sends EnhancedMoveToHueAndSaturation command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C43.Tx && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHueAndSaturation::Id); - } - case 14: { - LogStep(14, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C43.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 15: { - LogStep(15, "DUT reads CurrentSaturation attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C43.Tx && CC.C.A0001 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 16: { - LogStep(16, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 17: { - LogStep(17, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C43.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 18: { - LogStep(18, "DUT reads CurrentSaturation attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C43.Tx && CC.C.A0001 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 19: { - LogStep(19, "DUT sends StopMoveStep command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C47.Tx && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id); - } - case 20: { - LogStep(20, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C47.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 21: { - LogStep(21, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 22: { - LogStep(22, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C47.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_CC_9_4_SimulatedSuite : public TestCommand -{ -public: - Test_TC_CC_9_4_SimulatedSuite() : TestCommand("Test_TC_CC_9_4_Simulated", 19) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - } - - ~Test_TC_CC_9_4_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mTimeout; - chip::Optional mCluster; - chip::Optional mEndpoint; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - case 7: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 9: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 11: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 13: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 15: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 17: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "PreCondition: Set TH OnOff to On"); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id); - } - case 1: { - LogStep(1, "DUT sends ColorLoopSet command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C44.Tx && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id); - } - case 2: { - LogStep(2, "DUT reads ColorLoopActive attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4002 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id); - } - case 3: { - LogStep(3, "DUT reads ColorLoopDirection attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4003 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id); - } - case 4: { - LogStep(4, "DUT reads ColorLoopTime attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4004 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopTime::Id); - } - case 5: { - LogStep(5, "DUT reads ColorLoopStartEnhancedHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4005 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopStartEnhancedHue::Id); - } - case 6: { - LogStep(6, "DUT reads EnhancedCurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4000 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 7: { - LogStep(7, "Wait 5000ms"); - VerifyOrDo(!ShouldSkip("CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = 5000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 8: { - LogStep(8, "DUT reads EnhancedCurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4000 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 9: { - LogStep(9, "Wait 5000ms"); - VerifyOrDo(!ShouldSkip("CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = 5000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 10: { - LogStep(10, "DUT reads EnhancedCurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4000 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 11: { - LogStep(11, "Wait 5000ms"); - VerifyOrDo(!ShouldSkip("CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = 5000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 12: { - LogStep(12, "DUT reads EnhancedCurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4000 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 13: { - LogStep(13, "Wait 5000ms"); - VerifyOrDo(!ShouldSkip("CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = 5000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 14: { - LogStep(14, "DUT reads EnhancedCurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4000 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 15: { - LogStep(15, "Wait 5000ms"); - VerifyOrDo(!ShouldSkip("CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = 5000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 16: { - LogStep(16, "DUT reads EnhancedCurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4000 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 17: { - LogStep(17, "Wait 5000ms"); - VerifyOrDo(!ShouldSkip("CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = 5000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 18: { - LogStep(18, "DUT reads EnhancedCurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4000 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_DGTHREAD_3_4_SimulatedSuite : public TestCommand -{ -public: - Test_TC_DGTHREAD_3_4_SimulatedSuite() : TestCommand("Test_TC_DGTHREAD_3_4_Simulated", 2) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_DGTHREAD_3_4_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "DUT sends ResetCounts command to TH"); - VerifyOrDo(!ShouldSkip("DGTHREAD.C.C00.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), ThreadNetworkDiagnostics::Id, ThreadNetworkDiagnostics::Commands::ResetCounts::Id); - } - case 1: { - LogStep(1, "DUT reads OverrunCount attribute value from TH"); - VerifyOrDo(!ShouldSkip("DGTHREAD.C.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(0), ThreadNetworkDiagnostics::Id, - ThreadNetworkDiagnostics::Attributes::OverrunCount::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_OO_3_2_SimulatedSuite : public TestCommand -{ -public: - Test_TC_OO_3_2_SimulatedSuite() : TestCommand("Test_TC_OO_3_2_Simulated", 6) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_OO_3_2_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "DUT issues an Off command to the TH"); - VerifyOrDo(!ShouldSkip("OO.C.C00.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id); - } - case 1: { - LogStep(1, "DUT issues an On command to the TH"); - VerifyOrDo(!ShouldSkip("OO.C.C01.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id); - } - case 2: { - LogStep(2, "DUT issues an Toggle command to the TH"); - VerifyOrDo(!ShouldSkip("OO.C.C02.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::Toggle::Id); - } - case 3: { - LogStep(3, "DUT issues an OffWithEffect command to the TH"); - VerifyOrDo(!ShouldSkip("OO.C.C40.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::OffWithEffect::Id); - } - case 4: { - LogStep(4, "DUT issues an OnWithRecallGlobalScene command to the TH"); - VerifyOrDo(!ShouldSkip("OO.C.C41.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithRecallGlobalScene::Id); - } - case 5: { - LogStep(5, "DUT issues an OnWithTimedOff command to the TH"); - VerifyOrDo(!ShouldSkip("OO.C.C42.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -std::unique_ptr GetTestCommand(std::string testName) -{ - if (testName == "Test_TC_WNCV_5_1_Simulated") - { - return std::unique_ptr(new Test_TC_WNCV_5_1_SimulatedSuite()); - } - if (testName == "Test_TC_OCC_2_4_Simulated") - { - return std::unique_ptr(new Test_TC_OCC_2_4_SimulatedSuite()); - } - if (testName == "Test_TC_DGSW_3_2_Simulated") - { - return std::unique_ptr(new Test_TC_DGSW_3_2_SimulatedSuite()); - } - if (testName == "Test_TC_DGETH_3_2_Simulated") - { - return std::unique_ptr(new Test_TC_DGETH_3_2_SimulatedSuite()); - } - if (testName == "Test_TC_DGWIFI_3_2_Simulated") - { - return std::unique_ptr(new Test_TC_DGWIFI_3_2_SimulatedSuite()); - } - if (testName == "Test_TC_WNCV_6_1_Simulated") - { - return std::unique_ptr(new Test_TC_WNCV_6_1_SimulatedSuite()); - } - if (testName == "Test_TC_WNCV_7_1_Simulated") - { - return std::unique_ptr(new Test_TC_WNCV_7_1_SimulatedSuite()); - } - if (testName == "Test_TC_CC_3_4_Simulated") - { - return std::unique_ptr(new Test_TC_CC_3_4_SimulatedSuite()); - } - if (testName == "Test_TC_CC_4_5_Simulated") - { - return std::unique_ptr(new Test_TC_CC_4_5_SimulatedSuite()); - } - if (testName == "Test_TC_CC_5_4_Simulated") - { - return std::unique_ptr(new Test_TC_CC_5_4_SimulatedSuite()); - } - if (testName == "Test_TC_CC_6_4_Simulated") - { - return std::unique_ptr(new Test_TC_CC_6_4_SimulatedSuite()); - } - if (testName == "Test_TC_CC_7_5_Simulated") - { - return std::unique_ptr(new Test_TC_CC_7_5_SimulatedSuite()); - } - if (testName == "Test_TC_CC_9_4_Simulated") - { - return std::unique_ptr(new Test_TC_CC_9_4_SimulatedSuite()); - } - if (testName == "Test_TC_DGTHREAD_3_4_Simulated") - { - return std::unique_ptr(new Test_TC_DGTHREAD_3_4_SimulatedSuite()); - } - if (testName == "Test_TC_OO_3_2_Simulated") - { - return std::unique_ptr(new Test_TC_OO_3_2_SimulatedSuite()); - } - - return nullptr; -} - -void PrintTestCommands() -{ - ChipLogError(chipTool, "Supported commands:"); - ChipLogError(chipTool, "\t* Test_TC_WNCV_5_1_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_OCC_2_4_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_DGSW_3_2_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_DGETH_3_2_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_DGWIFI_3_2_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_WNCV_6_1_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_WNCV_7_1_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_CC_3_4_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_CC_4_5_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_CC_5_4_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_CC_6_4_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_CC_7_5_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_CC_9_4_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_DGTHREAD_3_4_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_OO_3_2_Simulated"); -} diff --git a/zzz_generated/placeholder/app2/zap-generated/test/Commands.h b/zzz_generated/placeholder/app2/zap-generated/test/Commands.h deleted file mode 100644 index fd7e5da8588d13..00000000000000 --- a/zzz_generated/placeholder/app2/zap-generated/test/Commands.h +++ /dev/null @@ -1,1719 +0,0 @@ -/* - * - * Copyright (c) 2022 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 FILE IS GENERATED BY ZAP - -#pragma once - -#include "TestCommand.h" - -#include - -class Test_TC_WNCV_5_1_SimulatedSuite : public TestCommand -{ -public: - Test_TC_WNCV_5_1_SimulatedSuite() : TestCommand("Test_TC_WNCV_5_1_Simulated", 5) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_WNCV_5_1_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "Step 1a: DUT reads the FeatureMap attribute from TH"); - return WaitAttribute(GetEndpoint(0), WindowCovering::Id, WindowCovering::Attributes::FeatureMap::Id); - } - case 1: { - LogStep(1, "Step 2a: DUT reads the Type attribute from TH"); - VerifyOrDo(!ShouldSkip("WNCV.C.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(0), WindowCovering::Id, WindowCovering::Attributes::Type::Id); - } - case 2: { - LogStep(2, "Step 2b: DUT reads the EndProductType attribute from TH"); - VerifyOrDo(!ShouldSkip("WNCV.C.A000d"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(0), WindowCovering::Id, WindowCovering::Attributes::EndProductType::Id); - } - case 3: { - LogStep(3, "Step 3a: DUT reads the Mode attribute from TH"); - VerifyOrDo(!ShouldSkip("WNCV.C.A0017"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(0), WindowCovering::Id, WindowCovering::Attributes::Mode::Id); - } - case 4: { - LogStep(4, "Step 3b: DUT reads the ConfigStatus attribute from TH"); - VerifyOrDo(!ShouldSkip("WNCV.C.A0007"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(0), WindowCovering::Id, WindowCovering::Attributes::ConfigStatus::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_OCC_2_4_SimulatedSuite : public TestCommand -{ -public: - Test_TC_OCC_2_4_SimulatedSuite() : TestCommand("Test_TC_OCC_2_4_Simulated", 2) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_OCC_2_4_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "TH reads OccupancySensorType attribute from DUT"); - VerifyOrDo(!ShouldSkip("OCC.C.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), OccupancySensing::Id, OccupancySensing::Attributes::OccupancySensorType::Id); - } - case 1: { - LogStep(1, "TH reads OccupancySensorTypeBitmap attribute from DUT"); - VerifyOrDo(!ShouldSkip("OCC.C.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), OccupancySensing::Id, OccupancySensing::Attributes::OccupancySensorTypeBitmap::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_DGSW_3_2_SimulatedSuite : public TestCommand -{ -public: - Test_TC_DGSW_3_2_SimulatedSuite() : TestCommand("Test_TC_DGSW_3_2_Simulated", 1) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_DGSW_3_2_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "DUT sends ResetWatermarks to TH"); - VerifyOrDo(!ShouldSkip("DGSW.C.C00.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), SoftwareDiagnostics::Id, SoftwareDiagnostics::Commands::ResetWatermarks::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_DGETH_3_2_SimulatedSuite : public TestCommand -{ -public: - Test_TC_DGETH_3_2_SimulatedSuite() : TestCommand("Test_TC_DGETH_3_2_Simulated", 1) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_DGETH_3_2_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "DUT sends ResetCounts to TH"); - VerifyOrDo(!ShouldSkip("DGETH.C.C00.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), EthernetNetworkDiagnostics::Id, - EthernetNetworkDiagnostics::Commands::ResetCounts::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_DGWIFI_3_2_SimulatedSuite : public TestCommand -{ -public: - Test_TC_DGWIFI_3_2_SimulatedSuite() : TestCommand("Test_TC_DGWIFI_3_2_Simulated", 1) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_DGWIFI_3_2_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "DUT sends ResetCounts command to TH"); - VerifyOrDo(!ShouldSkip("DGWIFI.C.C00.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), WiFiNetworkDiagnostics::Id, WiFiNetworkDiagnostics::Commands::ResetCounts::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_WNCV_6_1_SimulatedSuite : public TestCommand -{ -public: - Test_TC_WNCV_6_1_SimulatedSuite() : TestCommand("Test_TC_WNCV_6_1_Simulated", 3) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_WNCV_6_1_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "Step 1a: DUT sends UpOrOpen command to TH"); - VerifyOrDo(!ShouldSkip("WNCV.C.C00.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), WindowCovering::Id, WindowCovering::Commands::UpOrOpen::Id); - } - case 1: { - LogStep(1, "Step 2a: DUT sends DownOrClose command to TH"); - VerifyOrDo(!ShouldSkip("WNCV.C.C01.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), WindowCovering::Id, WindowCovering::Commands::DownOrClose::Id); - } - case 2: { - LogStep(2, "Step 3a: DUT sends StopMotion command to TH"); - VerifyOrDo(!ShouldSkip("WNCV.C.C02.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), WindowCovering::Id, WindowCovering::Commands::StopMotion::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_WNCV_7_1_SimulatedSuite : public TestCommand -{ -public: - Test_TC_WNCV_7_1_SimulatedSuite() : TestCommand("Test_TC_WNCV_7_1_Simulated", 2) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_WNCV_7_1_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "Step 1a: If (PA_LF & LF) DUT sends GoToLiftPercentage command with 50% to DUT"); - VerifyOrDo(!ShouldSkip("WNCV.C.C05.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), WindowCovering::Id, WindowCovering::Commands::GoToLiftPercentage::Id); - } - case 1: { - LogStep(1, "Step 2a: If (PA_TL & TL) DUT sends GoToTiltPercentage command with 50% to DUT"); - VerifyOrDo(!ShouldSkip("WNCV.C.C08.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), WindowCovering::Id, WindowCovering::Commands::GoToTiltPercentage::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_CC_3_4_SimulatedSuite : public TestCommand -{ -public: - Test_TC_CC_3_4_SimulatedSuite() : TestCommand("Test_TC_CC_3_4_Simulated", 16) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - AddArgument("ConfigTransitionTime", 0, UINT16_MAX, &mConfigTransitionTime); - } - - ~Test_TC_CC_3_4_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - chip::Optional mConfigTransitionTime; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - case 3: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 7: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 11: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 14: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "PreCondition: Set TH OnOff to On"); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id); - } - case 1: { - LogStep(1, "DUT sends MoveToHue command to TH an Hue with _TransitionTime 300"); - VerifyOrDo(!ShouldSkip("CC.C.C00.Tx && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHue::Id); - } - case 2: { - LogStep(2, "DUT reads CurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.C00.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - case 3: { - LogStep(3, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 4: { - LogStep(4, "DUT reads CurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.C00.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - case 5: { - LogStep(5, "DUT sends MoveHue command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C01.Tx && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveHue::Id); - } - case 6: { - LogStep(6, "DUT reads CurrentHue attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C01.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - case 7: { - LogStep(7, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 8: { - LogStep(8, "DUT reads CurrentHue attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C01.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - case 9: { - LogStep(9, "DUT sends StepHue command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C02.Tx && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepHue::Id); - } - case 10: { - LogStep(10, "DUT reads CurrentHue attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C02.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - case 11: { - LogStep(11, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 12: { - LogStep(12, "DUT reads CurrentHue attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C02.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - case 13: { - LogStep(13, "DUT sends StopMoveStep command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C03.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id); - } - case 14: { - LogStep(14, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 15: { - LogStep(15, "Over TransitionTime, DUT reads CurrentHue attribute from TH"); - VerifyOrDo(!ShouldSkip("CC.C.C03.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_CC_4_5_SimulatedSuite : public TestCommand -{ -public: - Test_TC_CC_4_5_SimulatedSuite() : TestCommand("Test_TC_CC_4_5_Simulated", 22) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - AddArgument("ConfigTransitionTime", 0, UINT16_MAX, &mConfigTransitionTime); - } - - ~Test_TC_CC_4_5_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - chip::Optional mConfigTransitionTime; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - case 3: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 7: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 11: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 16: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 20: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "PreCondition: Set TH OnOff to On"); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id); - } - case 1: { - LogStep(1, "DUT sends MoveToSaturation command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C03.Tx && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToSaturation::Id); - } - case 2: { - LogStep(2, "DUT reads CurrentSaturation attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.C03.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 3: { - LogStep(3, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 4: { - LogStep(4, "DUT reads CurrentSaturation attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.C03.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 5: { - LogStep(5, "DUT sends MoveSaturation command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C04.Tx && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveSaturation::Id); - } - case 6: { - LogStep(6, "DUT reads CurrentSaturation attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C04.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 7: { - LogStep(7, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 8: { - LogStep(8, "DUT reads CurrentSaturation attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C04.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 9: { - LogStep(9, "DUT sends StepSaturation command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C05.Tx && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepSaturation::Id); - } - case 10: { - LogStep(10, "DUT reads CurrentSaturation attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C05.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 11: { - LogStep(11, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 12: { - LogStep(12, "DUT reads CurrentSaturation attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C05.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 13: { - LogStep(13, "DUT sends MoveToHueAndSaturation command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C06.Tx && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToHueAndSaturation::Id); - } - case 14: { - LogStep(14, "DUT reads CurrentSaturation attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C06.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 15: { - LogStep(15, "DUT reads CurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.C06.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - case 16: { - LogStep(16, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 17: { - LogStep(17, "DUT reads CurrentSaturation attribute from TH several times."); - VerifyOrDo(!ShouldSkip("CC.C.C06.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 18: { - LogStep(18, "DUT reads CurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.C06.Tx && CC.C.A0000 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::Id); - } - case 19: { - LogStep(19, "DUT sends StopMoveStep command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C47.Tx && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id); - } - case 20: { - LogStep(20, "Wait for ConfigTransitionTime"); - VerifyOrDo(!ShouldSkip("CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 21: { - LogStep(21, "Over TransitionTime, DUT reads CurrentSaturation attribute from TH"); - VerifyOrDo(!ShouldSkip("CC.C.C47.Tx && CC.C.A0001 && CC.C.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_CC_5_4_SimulatedSuite : public TestCommand -{ -public: - Test_TC_CC_5_4_SimulatedSuite() : TestCommand("Test_TC_CC_5_4_Simulated", 9) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("ConfigTransitionTime", 0, UINT16_MAX, &mConfigTransitionTime); - } - - ~Test_TC_CC_5_4_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mTimeout; - chip::Optional mEndpoint; - chip::Optional mConfigTransitionTime; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - case 2: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 4: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 6: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 8: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "PreCondition: Set TH OnOff to On"); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id); - } - case 1: { - LogStep(1, "DUT sends MoveToColor command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C07.Tx && CC.C.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColor::Id); - } - case 2: { - LogStep(2, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 3: { - LogStep(3, "DUT sends MoveColor command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C08.Tx && CC.C.F03"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveColor::Id); - } - case 4: { - LogStep(4, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 5: { - LogStep(5, "DUT sends StepColor command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C09.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepColor::Id); - } - case 6: { - LogStep(6, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 7: { - LogStep(7, "DUT sends StopMoveStep command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C47.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id); - } - case 8: { - LogStep(8, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_CC_6_4_SimulatedSuite : public TestCommand -{ -public: - Test_TC_CC_6_4_SimulatedSuite() : TestCommand("Test_TC_CC_6_4_Simulated", 18) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("ConfigTransitionTime", 0, UINT16_MAX, &mConfigTransitionTime); - } - - ~Test_TC_CC_6_4_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mTimeout; - chip::Optional mEndpoint; - chip::Optional mConfigTransitionTime; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - case 5: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 9: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 13: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 16: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "PreCondition: Set TH OnOff to On"); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id); - } - case 1: { - LogStep(1, - "* TH provides a server implementation of Color Control with F04(CT)=true and reasonable values of " - "ColorTempPhysicalMinMireds (e.g. 153 (6500K), ColorTempPhysicalMaxMireds (e.g. 454 (2200K)) DUT read " - "attribute ColorTempPhysicalMinMireds from TH"); - VerifyOrDo(!ShouldSkip("CC.C.A400b && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTempPhysicalMinMireds::Id); - } - case 2: { - LogStep(2, - "* TH provides a server implementation of Color Control with F04(CT)=true and reasonable values of " - "ColorTempPhysicalMinMireds (e.g. 153 (6500K), ColorTempPhysicalMaxMireds (e.g. 454 (2200K)) DUT read " - "attribute ColorTempPhysicalMaxMireds from TH"); - VerifyOrDo(!ShouldSkip("CC.C.A400c && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTempPhysicalMaxMireds::Id); - } - case 3: { - LogStep(3, "DUT sends MoveToColorTemperature command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C0a.Tx && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveToColorTemperature::Id); - } - case 4: { - LogStep(4, "DUT reads CurrentColorTemperatureMireds attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C0a.Tx && CC.C.A0007 && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id); - } - case 5: { - LogStep(5, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 6: { - LogStep(6, "DUT reads CurrentColorTemperatureMireds attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C0a.Tx && CC.C.A0007 && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id); - } - case 7: { - LogStep(7, "DUT sends MoveColorTemperatureMireds command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C4b.Tx && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::MoveColorTemperature::Id); - } - case 8: { - LogStep(8, "DUT reads CurrentColorTemperatureMireds attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C4b.Tx && CC.C.A0007 && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id); - } - case 9: { - LogStep(9, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 10: { - LogStep(10, "DUT reads CurrentColorTemperatureMireds attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C4b.Tx && CC.C.A0007 && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id); - } - case 11: { - LogStep(11, "DUT sends StepColorTemperature command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C4c.Tx && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StepColorTemperature::Id); - } - case 12: { - LogStep(12, "DUT reads CurrentColorTemperatureMireds attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C4c.Tx && CC.C.A0007 && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id); - } - case 13: { - LogStep(13, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 14: { - LogStep(14, "DUT reads CurrentColorTemperatureMireds attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C4c.Tx && CC.C.A0007 && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id); - } - case 15: { - LogStep(15, "DUT sends StopMoveStep command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C47.Tx && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id); - } - case 16: { - LogStep(16, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 17: { - LogStep(17, "DUT reads CurrentColorTemperatureMireds attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C47.Tx && CC.C.A0007 && CC.C.F04"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_CC_7_5_SimulatedSuite : public TestCommand -{ -public: - Test_TC_CC_7_5_SimulatedSuite() : TestCommand("Test_TC_CC_7_5_Simulated", 23) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("ConfigTransitionTime", 0, UINT16_MAX, &mConfigTransitionTime); - } - - ~Test_TC_CC_7_5_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mTimeout; - chip::Optional mEndpoint; - chip::Optional mConfigTransitionTime; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - case 3: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 7: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 11: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 16: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 21: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "PreCondition: Set TH OnOff to On"); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id); - } - case 1: { - LogStep(1, "DUT sends MoveToEnhancedHue command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C40.Tx && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHue::Id); - } - case 2: { - LogStep(2, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C40.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 3: { - LogStep(3, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 4: { - LogStep(4, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C40.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 5: { - LogStep(5, "DUT sends MoveEnhanced Hue command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C41.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveHue::Id); - } - case 6: { - LogStep(6, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C41.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 7: { - LogStep(7, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 8: { - LogStep(8, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C41.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 9: { - LogStep(9, "DUT sends StepEnhanced command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C42.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedStepHue::Id); - } - case 10: { - LogStep(10, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C42.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 11: { - LogStep(11, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 12: { - LogStep(12, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C42.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 13: { - LogStep(13, "DUT sends EnhancedMoveToHueAndSaturation command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C43.Tx && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::EnhancedMoveToHueAndSaturation::Id); - } - case 14: { - LogStep(14, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C43.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 15: { - LogStep(15, "DUT reads CurrentSaturation attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C43.Tx && CC.C.A0001 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 16: { - LogStep(16, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 17: { - LogStep(17, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C43.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 18: { - LogStep(18, "DUT reads CurrentSaturation attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C43.Tx && CC.C.A0001 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id); - } - case 19: { - LogStep(19, "DUT sends StopMoveStep command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C47.Tx && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::StopMoveStep::Id); - } - case 20: { - LogStep(20, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C47.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 21: { - LogStep(21, "Wait for ConfigTransitionTime"); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = mConfigTransitionTime.HasValue() ? mConfigTransitionTime.Value() : 3000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 22: { - LogStep(22, "DUT reads EnhancedCurrentHue attribute from TH (potentially multiple times)"); - VerifyOrDo(!ShouldSkip("CC.C.C47.Tx && CC.C.A4000 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_CC_9_4_SimulatedSuite : public TestCommand -{ -public: - Test_TC_CC_9_4_SimulatedSuite() : TestCommand("Test_TC_CC_9_4_Simulated", 19) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - } - - ~Test_TC_CC_9_4_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mTimeout; - chip::Optional mCluster; - chip::Optional mEndpoint; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - case 7: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 9: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 11: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 13: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 15: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - case 17: - VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0)); - shouldContinue = true; - break; - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "PreCondition: Set TH OnOff to On"); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id); - } - case 1: { - LogStep(1, "DUT sends ColorLoopSet command to TH"); - VerifyOrDo(!ShouldSkip("CC.C.C44.Tx && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), ColorControl::Id, ColorControl::Commands::ColorLoopSet::Id); - } - case 2: { - LogStep(2, "DUT reads ColorLoopActive attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4002 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopActive::Id); - } - case 3: { - LogStep(3, "DUT reads ColorLoopDirection attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4003 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopDirection::Id); - } - case 4: { - LogStep(4, "DUT reads ColorLoopTime attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4004 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopTime::Id); - } - case 5: { - LogStep(5, "DUT reads ColorLoopStartEnhancedHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4005 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorLoopStartEnhancedHue::Id); - } - case 6: { - LogStep(6, "DUT reads EnhancedCurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4000 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 7: { - LogStep(7, "Wait 5000ms"); - VerifyOrDo(!ShouldSkip("CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = 5000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 8: { - LogStep(8, "DUT reads EnhancedCurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4000 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 9: { - LogStep(9, "Wait 5000ms"); - VerifyOrDo(!ShouldSkip("CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = 5000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 10: { - LogStep(10, "DUT reads EnhancedCurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4000 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 11: { - LogStep(11, "Wait 5000ms"); - VerifyOrDo(!ShouldSkip("CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = 5000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 12: { - LogStep(12, "DUT reads EnhancedCurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4000 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 13: { - LogStep(13, "Wait 5000ms"); - VerifyOrDo(!ShouldSkip("CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = 5000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 14: { - LogStep(14, "DUT reads EnhancedCurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4000 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 15: { - LogStep(15, "Wait 5000ms"); - VerifyOrDo(!ShouldSkip("CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = 5000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 16: { - LogStep(16, "DUT reads EnhancedCurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4000 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - case 17: { - LogStep(17, "Wait 5000ms"); - VerifyOrDo(!ShouldSkip("CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - ListFreer listFreer; - chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value; - value.ms = 5000UL; - return WaitForMs(kIdentityAlpha, value); - } - case 18: { - LogStep(18, "DUT reads EnhancedCurrentHue attribute from TH periodically"); - VerifyOrDo(!ShouldSkip("CC.C.A4000 && CC.C.F02 && CC.C.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::EnhancedCurrentHue::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_DGTHREAD_3_4_SimulatedSuite : public TestCommand -{ -public: - Test_TC_DGTHREAD_3_4_SimulatedSuite() : TestCommand("Test_TC_DGTHREAD_3_4_Simulated", 2) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_DGTHREAD_3_4_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "DUT sends ResetCounts command to TH"); - VerifyOrDo(!ShouldSkip("DGTHREAD.C.C00.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(0), ThreadNetworkDiagnostics::Id, ThreadNetworkDiagnostics::Commands::ResetCounts::Id); - } - case 1: { - LogStep(1, "DUT reads OverrunCount attribute value from TH"); - VerifyOrDo(!ShouldSkip("DGTHREAD.C.A0006"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitAttribute(GetEndpoint(0), ThreadNetworkDiagnostics::Id, - ThreadNetworkDiagnostics::Attributes::OverrunCount::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -class Test_TC_OO_3_2_SimulatedSuite : public TestCommand -{ -public: - Test_TC_OO_3_2_SimulatedSuite() : TestCommand("Test_TC_OO_3_2_Simulated", 6) - { - AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); - AddArgument("cluster", &mCluster); - AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - } - - ~Test_TC_OO_3_2_SimulatedSuite() {} - -private: - chip::Optional mNodeId; - chip::Optional mCluster; - chip::Optional mEndpoint; - chip::Optional mTimeout; - - chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; } - - // - // Tests methods - // - - void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override - { - bool shouldContinue = false; - - switch (mTestIndex - 1) - { - default: - LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT)); - } - - if (shouldContinue) - { - ContinueOnChipMainThread(CHIP_NO_ERROR); - } - } - - CHIP_ERROR DoTestStep(uint16_t testIndex) override - { - using namespace chip::app::Clusters; - switch (testIndex) - { - case 0: { - LogStep(0, "DUT issues an Off command to the TH"); - VerifyOrDo(!ShouldSkip("OO.C.C00.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::Off::Id); - } - case 1: { - LogStep(1, "DUT issues an On command to the TH"); - VerifyOrDo(!ShouldSkip("OO.C.C01.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::On::Id); - } - case 2: { - LogStep(2, "DUT issues an Toggle command to the TH"); - VerifyOrDo(!ShouldSkip("OO.C.C02.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::Toggle::Id); - } - case 3: { - LogStep(3, "DUT issues an OffWithEffect command to the TH"); - VerifyOrDo(!ShouldSkip("OO.C.C40.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::OffWithEffect::Id); - } - case 4: { - LogStep(4, "DUT issues an OnWithRecallGlobalScene command to the TH"); - VerifyOrDo(!ShouldSkip("OO.C.C41.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithRecallGlobalScene::Id); - } - case 5: { - LogStep(5, "DUT issues an OnWithTimedOff command to the TH"); - VerifyOrDo(!ShouldSkip("OO.C.C42.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR)); - return WaitCommand(GetEndpoint(1), OnOff::Id, OnOff::Commands::OnWithTimedOff::Id); - } - } - return CHIP_NO_ERROR; - } -}; - -std::unique_ptr GetTestCommand(std::string testName) -{ - if (testName == "Test_TC_WNCV_5_1_Simulated") - { - return std::unique_ptr(new Test_TC_WNCV_5_1_SimulatedSuite()); - } - if (testName == "Test_TC_OCC_2_4_Simulated") - { - return std::unique_ptr(new Test_TC_OCC_2_4_SimulatedSuite()); - } - if (testName == "Test_TC_DGSW_3_2_Simulated") - { - return std::unique_ptr(new Test_TC_DGSW_3_2_SimulatedSuite()); - } - if (testName == "Test_TC_DGETH_3_2_Simulated") - { - return std::unique_ptr(new Test_TC_DGETH_3_2_SimulatedSuite()); - } - if (testName == "Test_TC_DGWIFI_3_2_Simulated") - { - return std::unique_ptr(new Test_TC_DGWIFI_3_2_SimulatedSuite()); - } - if (testName == "Test_TC_WNCV_6_1_Simulated") - { - return std::unique_ptr(new Test_TC_WNCV_6_1_SimulatedSuite()); - } - if (testName == "Test_TC_WNCV_7_1_Simulated") - { - return std::unique_ptr(new Test_TC_WNCV_7_1_SimulatedSuite()); - } - if (testName == "Test_TC_CC_3_4_Simulated") - { - return std::unique_ptr(new Test_TC_CC_3_4_SimulatedSuite()); - } - if (testName == "Test_TC_CC_4_5_Simulated") - { - return std::unique_ptr(new Test_TC_CC_4_5_SimulatedSuite()); - } - if (testName == "Test_TC_CC_5_4_Simulated") - { - return std::unique_ptr(new Test_TC_CC_5_4_SimulatedSuite()); - } - if (testName == "Test_TC_CC_6_4_Simulated") - { - return std::unique_ptr(new Test_TC_CC_6_4_SimulatedSuite()); - } - if (testName == "Test_TC_CC_7_5_Simulated") - { - return std::unique_ptr(new Test_TC_CC_7_5_SimulatedSuite()); - } - if (testName == "Test_TC_CC_9_4_Simulated") - { - return std::unique_ptr(new Test_TC_CC_9_4_SimulatedSuite()); - } - if (testName == "Test_TC_DGTHREAD_3_4_Simulated") - { - return std::unique_ptr(new Test_TC_DGTHREAD_3_4_SimulatedSuite()); - } - if (testName == "Test_TC_OO_3_2_Simulated") - { - return std::unique_ptr(new Test_TC_OO_3_2_SimulatedSuite()); - } - - return nullptr; -} - -void PrintTestCommands() -{ - ChipLogError(chipTool, "Supported commands:"); - ChipLogError(chipTool, "\t* Test_TC_WNCV_5_1_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_OCC_2_4_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_DGSW_3_2_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_DGETH_3_2_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_DGWIFI_3_2_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_WNCV_6_1_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_WNCV_7_1_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_CC_3_4_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_CC_4_5_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_CC_5_4_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_CC_6_4_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_CC_7_5_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_CC_9_4_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_DGTHREAD_3_4_Simulated"); - ChipLogError(chipTool, "\t* Test_TC_OO_3_2_Simulated"); -}