diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 1ecf1b4af10e50..3daabb694fb026 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -5,6 +5,7 @@ "--security-opt", "seccomp=unconfined", "--network=host", + "--privileged", "-v", "/dev/bus/usb:/dev/bus/usb:ro", "--device-cgroup-rule=a 189:* rmw", @@ -16,7 +17,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "BUILD_VERSION": "0.5.25" + "BUILD_VERSION": "0.5.33" } }, "remoteUser": "vscode", diff --git a/.github/.wordlist.txt b/.github/.wordlist.txt index 391e7bde76f92b..0ee788694f3dac 100644 --- a/.github/.wordlist.txt +++ b/.github/.wordlist.txt @@ -26,9 +26,9 @@ AdvRouterAddr AdvSendAdvert AE aef +AES algs alloc -ameba Ameba amebad amebaiot @@ -39,6 +39,7 @@ AppConfig ApplicationBasic ApplicationIdentifier ApplicationLauncher +ApplyUpdateRequest approver appspot aps @@ -50,6 +51,7 @@ armeabi ARMmbed armv asdk +AssertionError ASYNC att attId @@ -80,11 +82,11 @@ BasicCHIPRegression baudrate BD BDX +BDXDownloader BeagleBone befc bitbake bld -ble BLE BleApplicationDelegate BleLayer @@ -156,7 +158,6 @@ CHIPTest CHIPTool chmod chrpath -cipd CIPD CircleCI cJTAG @@ -215,6 +216,7 @@ cppreference CPROTO cpuapp cpython +CQM crypto cryptographic CSA @@ -269,6 +271,7 @@ DevKitC DevKitM df dfu +dhclient DHCP DHCPC DHCPv @@ -277,6 +280,7 @@ dialout diffstat diffsyms dimmable +dirname dirs disambiguated discoverable @@ -288,6 +292,7 @@ DK DL DM DMG +DMM DNS Dnsmasq dnsmasqd @@ -310,6 +315,8 @@ eabi EB ECC ECD +ECDH +ECDSA EchoMessage EchoRequests EchoResponse @@ -321,7 +328,6 @@ ee EEE eef ef -efr EFR eg EjQ @@ -337,9 +343,11 @@ eno entrypoint enum env +eq esd ESPPORT Espressif +esptool eth EthernetNetworkDiagnostics ethernets @@ -379,11 +387,11 @@ flashdebug focusable forkpty formatOnSave -fota FOTA FreeRTOS FreeRTOSConfig fsl +fstab fsync fullclean gcloud @@ -409,7 +417,6 @@ gn GND gni GNinja -gnuarmemb GNUARMEMB gnueabihf googleapis @@ -427,6 +434,7 @@ Gv gz hardcoded hardknott +hardwarever HardwareVersion HardwareVersionString hci @@ -435,6 +443,7 @@ hciconfig hdlc HKDF hoc +homebrew hostapd hostname href @@ -449,7 +458,6 @@ ifdef ifdefs IGMP ihex -im IM imager imagetool @@ -485,13 +493,14 @@ IPv ISCAN itemName iterable +JDK jinja -jlink JLink JLinkExe JLinkRTTClient JN jpg +jre js json JTAG @@ -535,6 +544,8 @@ lightin LightingColor LightingState LinkSoftwareAndDocumentationPack +LinuxOTAImageProcessor +LinuxOTARequestorDriver LocalConfigDisabled localhost localstatedir @@ -636,6 +647,7 @@ navpad ncs nding NDK +netcmp netif netplan NetworkCommissioning @@ -672,6 +684,7 @@ OnOff OnOffClusterTest OnPlatformEvent OO +openjdk OpenOCD OpenSSL OpenThread @@ -686,6 +699,16 @@ optionsMask optionsOverride orgs OTA +OTADownloader +OTAImageProcessorDriver +OTAImageProcessorInterface +OTAProviderIpAddress +OTAProviderNodeId +OTAProviderSerialPort +OTARequesterImpl +OTARequestor +OTARequestorDriver +OTARequestorSerialPort OTBR otcli PAA @@ -731,8 +754,6 @@ prj ProductID ProductLabel ProductName -productrev -ProductRevision ProductURL proto protobuf @@ -757,6 +778,7 @@ PyFunction pylint PyObject PyRun +pytest QEMU Qorvo QPG @@ -770,6 +792,7 @@ qvCHIP RADVD raspberryPi RasPi +rAv RCP ReadConfigValue readelf @@ -832,7 +855,6 @@ SDK's SDKs SDKTARGETSYSROOT sdl -segger SEGGER semver sendto @@ -840,10 +862,15 @@ SERIALDEVICE SerialNumber ServiceId SetDns +SetImageProcessorDelegate +SetOtaRequestorDriver SetpointRaiseLower +SetRequestorInstance SetUpPINCode SetupQRCode sexualized +SHA +shubhamdp SIGINT SiLabs SiliconLabs @@ -854,6 +881,7 @@ SLAAC SLTB SLWSTK SmartThings +smoketest SMP socat socio @@ -882,6 +910,7 @@ subcommand subcommands subdirectories subdirectory +subfolder submodule submodules subprocess @@ -896,7 +925,6 @@ sysconfdir SysConfig sysctl sysdeps -sysroot SYSROOT systemctl systemd @@ -956,7 +984,6 @@ ttyUSB TvChannel TXD txt -uart UART udhcpc UDP @@ -965,7 +992,6 @@ udpPort ug ui uint -unblur UNBLUR uncommissioned unfocus @@ -980,6 +1006,7 @@ URI usbmodem USBtoUART uscif +userguide USERINTERFACE UserLabel usermod diff --git a/.github/workflows/android.yaml b/.github/workflows/android.yaml index cdb345ff65173f..384a9db623b0bf 100644 --- a/.github/workflows/android.yaml +++ b/.github/workflows/android.yaml @@ -34,7 +34,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: connectedhomeip/chip-build-android:0.5.25 + image: connectedhomeip/chip-build-android:0.5.33 volumes: - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/bloat_check.yaml b/.github/workflows/bloat_check.yaml index 136366acbd2441..36532934ada930 100644 --- a/.github/workflows/bloat_check.yaml +++ b/.github/workflows/bloat_check.yaml @@ -30,7 +30,7 @@ jobs: runs-on: ubuntu-latest container: - image: connectedhomeip/chip-build:0.5.25 + image: connectedhomeip/chip-build:0.5.33 steps: - name: Checkout diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d10766215d9aea..39a01b9d163935 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -32,7 +32,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: connectedhomeip/chip-build:0.5.25 + image: connectedhomeip/chip-build:0.5.33 volumes: - "/tmp/log_output:/tmp/test_logs" options: @@ -68,7 +68,7 @@ jobs: run: scripts/build/gn_gen.sh --args="chip_config_memory_debug_checks=true chip_config_memory_debug_dmalloc=true" - name: Run Build timeout-minutes: 20 - run: scripts/build/gn_build.sh + run: scripts/run_in_build_env.sh "ninja -C ./out" - name: Run Tests timeout-minutes: 2 run: scripts/tests/gn_tests.sh @@ -84,21 +84,21 @@ jobs: run: scripts/build/gn_gen.sh --args="chip_detail_logging=false" - name: Run Build Without Detail Logging timeout-minutes: 20 - run: scripts/build/gn_build.sh + run: scripts/run_in_build_env.sh "ninja -C ./out" - name: Setup Build Without Progress Logging run: scripts/build/gn_gen.sh --args="chip_detail_logging=false chip_progress_logging=false" - name: Run Build Without Progress Logging timeout-minutes: 20 - run: scripts/build/gn_build.sh + run: scripts/run_in_build_env.sh "ninja -C ./out" build_linux: - name: Build on Linux (gcc_release, clang, mbedtls) + name: Build on Linux (gcc_release, clang, mbedtls, simulated) timeout-minutes: 60 runs-on: ubuntu-latest if: github.actor != 'restyled-io[bot]' container: - image: connectedhomeip/chip-build:0.5.25 + image: connectedhomeip/chip-build:0.5.33 volumes: - "/tmp/log_output:/tmp/test_logs" options: @@ -135,6 +135,14 @@ jobs: path: | .environment/gn_out/.ninja_log .environment/pigweed-venv/*.log + - name: Setup and Build Simulated Device + timeout-minutes: 5 + run: | + BUILD_TYPE=simulated + GN_ARGS='chip_tests_zap_config="app1" chip_project_config_include_dirs=["../../examples/placeholder/linux/apps/app1/include", "../../config/standalone"] chip_config_network_layer_ble=false' + CHIP_ROOT_PATH=examples/placeholder/linux + CHIP_ROOT_PATH="$CHIP_ROOT_PATH" BUILD_TYPE="$BUILD_TYPE" scripts/build/gn_gen.sh --args="$GN_ARGS" + scripts/run_in_build_env.sh "ninja -C ./out/$BUILD_TYPE" - name: Setup Build, Run Build and Run Tests timeout-minutes: 50 run: | @@ -146,7 +154,7 @@ jobs: esac scripts/build/gn_gen.sh --args="$GN_ARGS" - scripts/build/gn_build.sh + scripts/run_in_build_env.sh "ninja -C ./out" scripts/tests/gn_tests.sh done - name: Build using build_examples.py @@ -156,7 +164,7 @@ jobs: run: | ./scripts/run_in_build_env.sh \ "./scripts/build/build_examples.py --no-log-timestamps --target-glob 'linux-x64-*' build" - + # TODO Log Upload https://github.com/project-chip/connectedhomeip/issues/2227 # TODO https://github.com/project-chip/connectedhomeip/issues/1512 # - name: Run Code Coverage @@ -182,7 +190,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: connectedhomeip/chip-build:0.5.25 + image: connectedhomeip/chip-build:0.5.33 volumes: - "/tmp/log_output:/tmp/test_logs" options: @@ -202,64 +210,23 @@ jobs: uses: actions/checkout@v2 with: submodules: true - # - name: Initialize CodeQL - # if: ${{ github.event_name == 'push' && github.event.ref == 'refs/heads/master' }} - # uses: github/codeql-action/init@v1 - # with: - # languages: "cpp" - - name: Bootstrap timeout-minutes: 10 run: scripts/build/gn_bootstrap.sh - # - name: Uploading bootstrap logs - # uses: actions/upload-artifact@v2 - # if: ${{ always() }} - # with: - # name: bootstrap-logs - # path: | - # .environment/gn_out/.ninja_log - # .environment/pigweed-venv/*.log - name: Setup Build, Run Build and Run Tests timeout-minutes: 50 run: | - for BUILD_TYPE in python_lib; do - case $BUILD_TYPE in - "python_lib") GN_ARGS='enable_rtti=true enable_pylib=true chip_config_memory_debug_checks=false chip_config_memory_debug_dmalloc=false';; - esac - - scripts/build/gn_gen.sh --args="$GN_ARGS" - scripts/build/gn_build.sh - scripts/tests/gn_tests.sh - done + scripts/build/gn_gen.sh --args="enable_rtti=true enable_pylib=true chip_config_memory_debug_checks=false chip_config_memory_debug_dmalloc=false" + scripts/run_in_build_env.sh "ninja -C ./out" + scripts/tests/gn_tests.sh - name: Run Python library specific unit tests timeout-minutes: 5 run: | scripts/run_in_build_env.sh 'pip3 install ./out/controller/python/chip-0.0-cp37-abi3-linux_x86_64.whl' scripts/run_in_build_env.sh '(cd src/controller/python/test/unit_tests/ && python3 -m unittest -v)' - # TODO Log Upload https://github.com/project-chip/connectedhomeip/issues/2227 - # TODO https://github.com/project-chip/connectedhomeip/issues/1512 - # - name: Run Code Coverage - # if: ${{ contains('main', env.BUILD_TYPE) }} - # run: scripts/tools/codecoverage.sh - # - name: Upload Code Coverage - # if: ${{ contains('main', env.BUILD_TYPE) }} - # run: bash <(curl -s https://codecov.io/bash) - # - name: Remove third_party binaries for CodeQL Analysis - # run: find out -type d -name "third_party" -exec rm -rf {} + - # - name: Remove dbus binaries for CodeQL Analysis - # run: find out -type d -name "dbus" -exec rm -rf {} + - # - name: Remove nrfxlib binaries for CodeQL Analysis - # run: find . -type d -name "nrfxlib" -exec rm -rf {} + - # - name: Perform CodeQL Analysis - # if: ${{ github.event_name == 'push' && github.event.ref == 'refs/heads/master' }} - # uses: github/codeql-action/analyze@v1 build_darwin: - name: Build on Darwin (clang, python_lib) + name: Build on Darwin (clang, python_lib, simulated) timeout-minutes: 90 - - env: - BUILD_TYPE: clang - runs-on: macos-latest if: github.actor != 'restyled-io[bot]' @@ -292,6 +259,14 @@ jobs: path: | .environment/gn_out/.ninja_log .environment/pigweed-venv/*.log + - name: Setup and Build Simulated Device + timeout-minutes: 5 + run: | + BUILD_TYPE=simulated + GN_ARGS='chip_tests_zap_config="app1" chip_project_config_include_dirs=["../../examples/placeholder/linux/apps/app1/include", "../../config/standalone"] chip_config_network_layer_ble=false' + CHIP_ROOT_PATH=examples/placeholder/linux + CHIP_ROOT_PATH="$CHIP_ROOT_PATH" BUILD_TYPE="$BUILD_TYPE" scripts/build/gn_gen.sh --args="$GN_ARGS" + scripts/run_in_build_env.sh "ninja -C ./out/$BUILD_TYPE" - name: Setup Build, Run Build and Run Tests timeout-minutes: 75 # Just go ahead and do the "all" build; on Darwin that's fairly @@ -301,11 +276,11 @@ jobs: run: | for BUILD_TYPE in clang python_lib; do case $BUILD_TYPE in - "clang") GN_ARGS='is_clang=true target_os="all"';; + "clang") GN_ARGS='is_clang=true target_os="all" is_asan=true';; "python_lib") GN_ARGS='enable_rtti=true enable_pylib=true';; esac scripts/build/gn_gen.sh --args="$GN_ARGS" - scripts/build/gn_build.sh + scripts/run_in_build_env.sh "ninja -C ./out" scripts/tests/gn_tests.sh done - name: Uploading diagnostic logs diff --git a/.github/workflows/cirque.yaml b/.github/workflows/cirque.yaml index e1e031a3895d18..a695bb218e96d7 100644 --- a/.github/workflows/cirque.yaml +++ b/.github/workflows/cirque.yaml @@ -29,7 +29,7 @@ jobs: timeout-minutes: 60 env: - DOCKER_RUN_VERSION: 0.5.25 + DOCKER_RUN_VERSION: 0.5.33 GITHUB_CACHE_PATH: /tmp/cirque-cache/ runs-on: ubuntu-latest @@ -38,7 +38,7 @@ jobs: # need to run with privilege, which isn't supported by job.XXX.contaner # https://github.com/actions/container-action/issues/2 # container: -# image: connectedhomeip/chip-build-cirque:0.5.25 +# image: connectedhomeip/chip-build-cirque:0.5.33 # volumes: # - "/tmp:/tmp" # - "/dev/pts:/dev/pts" @@ -102,9 +102,11 @@ jobs: --volume /tmp:/tmp \ -- ./gn_build.sh \ chip_build_tests=false \ + chip_enable_wifi=false \ enable_host_gcc_build=true \ enable_host_gcc_mbedtls_build=false \ - enable_host_clang_build = false + enable_host_clang_build=false \ + enable_fake_tests=false - name: Run Tests timeout-minutes: 25 run: | diff --git a/.github/workflows/darwin.yaml b/.github/workflows/darwin.yaml index ead897aa3e924e..3880c6bbe8f8fe 100644 --- a/.github/workflows/darwin.yaml +++ b/.github/workflows/darwin.yaml @@ -114,7 +114,7 @@ jobs: run: | mkdir -p /tmp/darwin/framework-tests ../../../out/debug/chip-all-clusters-app > >(tee /tmp/darwin/framework-tests/all-cluster-app.log) 2> >(tee /tmp/darwin/framework-tests/all-cluster-app-err.log >&2) & - xcodebuild test -target "CHIP" -scheme "CHIP Framework Tests" -sdk macosx > >(tee /tmp/darwin/framework-tests/darwin-tests.log) 2> >(tee /tmp/darwin/framework-tests/darwin-tests-err.log >&2) + xcodebuild test -target "CHIP" -scheme "CHIP Framework Tests" -sdk macosx OTHER_CFLAGS='${inherited} -Werror -Wno-documentation -Wno-conditional-uninitialized -Wno-incomplete-umbrella' > >(tee /tmp/darwin/framework-tests/darwin-tests.log) 2> >(tee /tmp/darwin/framework-tests/darwin-tests-err.log >&2) working-directory: src/darwin/Framework - name: Uploading log files uses: actions/upload-artifact@v2 diff --git a/.github/workflows/docker_img.yaml b/.github/workflows/docker_img.yaml index 8d97ea78450a90..b25df22401c6b6 100644 --- a/.github/workflows/docker_img.yaml +++ b/.github/workflows/docker_img.yaml @@ -32,7 +32,7 @@ jobs: fail-fast: false matrix: # TODO: Enables "-crosscompile" and "-vscode" images - img: ["", "-android", "-cirque", "-efr32", "-esp32", "-esp32-qemu", "-infineon", "-k32w", "-mbed-os", "-nrf-platform", "-telink", "-tizen"] + img: ["", "-android", "-cirque", "-doxygen", "-efr32", "-esp32", "-esp32-qemu", "-infineon", "-k32w", "-mbed-os", "-nrf-platform", "-telink", "-tizen"] steps: - name: Checkout uses: actions/checkout@v2 @@ -43,6 +43,6 @@ jobs: - name: Scan for vulnerabilities uses: crazy-max/docker-scan-action@master with: - image: connectedhomeip/chip-build${{ matrix.img }}:0.5.25 + image: connectedhomeip/chip-build${{ matrix.img }}:0.5.33 annotations: true diff --git a/.github/workflows/doxygen.yaml b/.github/workflows/doxygen.yaml index 615eb5ab69d44d..df454c8ce40479 100644 --- a/.github/workflows/doxygen.yaml +++ b/.github/workflows/doxygen.yaml @@ -29,6 +29,9 @@ jobs: timeout-minutes: 5 runs-on: ubuntu-20.04 + container: + image: connectedhomeip/chip-build-doxygen:0.5.33 + if: github.actor != 'restyled-io[bot]' steps: diff --git a/.github/workflows/examples-ameba.yaml b/.github/workflows/examples-ameba.yaml index 501328f3153271..5c36324109bd32 100644 --- a/.github/workflows/examples-ameba.yaml +++ b/.github/workflows/examples-ameba.yaml @@ -28,7 +28,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: connectedhomeip/chip-build-ameba:0.5.25 + image: connectedhomeip/chip-build-ameba:0.5.33 options: --user root steps: diff --git a/.github/workflows/examples-efr32.yaml b/.github/workflows/examples-efr32.yaml index eac49417cefa2a..b7ef9c604c8032 100644 --- a/.github/workflows/examples-efr32.yaml +++ b/.github/workflows/examples-efr32.yaml @@ -21,7 +21,7 @@ on: concurrency: group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} cancel-in-progress: true - + jobs: efr32: name: EFR32 @@ -30,15 +30,12 @@ jobs: env: EFR32_BOARD: BRD4161A BUILD_TYPE: gn_efr32 - GH_EVENT_PR: ${{ github.event_name == 'pull_request' && github.event.number || 0 }} - GH_EVENT_HASH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} - GH_EVENT_PARENT: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }} runs-on: ubuntu-latest if: github.actor != 'restyled-io[bot]' container: - image: connectedhomeip/chip-build-efr32:0.5.25 + image: connectedhomeip/chip-build-efr32:0.5.33 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: @@ -46,6 +43,13 @@ jobs: uses: actions/checkout@v2 with: submodules: true + + - name: Set up environment for size reports + if: ${{ !env.ACT }} + env: + GH_CONTEXT: ${{ toJson(github) }} + run: scripts/tools/memory/gh_sizes_environment.py "${GH_CONTEXT}" + - name: Bootstrap timeout-minutes: 25 run: scripts/build/gn_bootstrap.sh @@ -82,6 +86,7 @@ jobs: scripts/examples/gn_efr32_example.sh examples/window-app/efr32/ out/window_app_debug BRD4161A .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py efr32 BRD4161A window-app \ out/window_app_debug/BRD4161A/chip-efr32-window-example.out /tmp/bloat_reports/ + - name: Uploading Size Reports uses: actions/upload-artifact@v2 if: ${{ !env.ACT }} diff --git a/.github/workflows/examples-esp32.yaml b/.github/workflows/examples-esp32.yaml index 67e903ec847ef0..c211657b4342db 100644 --- a/.github/workflows/examples-esp32.yaml +++ b/.github/workflows/examples-esp32.yaml @@ -30,15 +30,12 @@ jobs: env: BUILD_TYPE: esp32 - GH_EVENT_PR: ${{ github.event_name == 'pull_request' && github.event.number || 0 }} - GH_EVENT_HASH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} - GH_EVENT_PARENT: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }} runs-on: ubuntu-latest if: github.actor != 'restyled-io[bot]' container: - image: connectedhomeip/chip-build-esp32:0.5.25 + image: connectedhomeip/chip-build-esp32:0.5.33 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" @@ -47,6 +44,13 @@ jobs: uses: actions/checkout@v2 with: submodules: true + + - name: Set up environment for size reports + if: ${{ !env.ACT }} + env: + GH_CONTEXT: ${{ toJson(github) }} + run: scripts/tools/memory/gh_sizes_environment.py "${GH_CONTEXT}" + - name: Bootstrap timeout-minutes: 25 run: scripts/build/gn_bootstrap.sh @@ -103,6 +107,7 @@ jobs: - name: Build example IPv6 Only App timeout-minutes: 10 run: scripts/examples/esp_example.sh ipv6only-app sdkconfig.defaults + - name: Uploading Size Reports uses: actions/upload-artifact@v2 if: ${{ !env.ACT }} diff --git a/.github/workflows/examples-infineon.yaml b/.github/workflows/examples-infineon.yaml index 421e946f9fb426..de651be3d54ad9 100644 --- a/.github/workflows/examples-infineon.yaml +++ b/.github/workflows/examples-infineon.yaml @@ -26,24 +26,26 @@ concurrency: jobs: infineon: name: Infineon examples building - timeout-minutes: 30 - - env: - GH_EVENT_PR: ${{ github.event_name == 'pull_request' && github.event.number || 0 }} - GH_EVENT_HASH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} - GH_EVENT_PARENT: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }} + timeout-minutes: 60 runs-on: ubuntu-latest if: github.actor != 'restyled-io[bot]' container: - image: connectedhomeip/chip-build-infineon:0.5.25 + image: connectedhomeip/chip-build-infineon:0.5.33 steps: - name: Checkout uses: actions/checkout@v2 with: submodules: true + + - name: Set up environment for size reports + if: ${{ !env.ACT }} + env: + GH_CONTEXT: ${{ toJson(github) }} + run: scripts/tools/memory/gh_sizes_environment.py "${GH_CONTEXT}" + - name: Bootstrap timeout-minutes: 25 run: scripts/build/gn_bootstrap.sh @@ -71,6 +73,14 @@ jobs: .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ p6 default all-clusters-app \ out/infineon-p6-all-clusters/chip-p6-clusters-example.out + - name: Build lighting-app example + timeout-minutes: 10 + run: | + scripts/run_in_build_env.sh \ + "scripts/build/build_examples.py --no-log-timestamps --target 'infineon-p6-light' build" + .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ + p6 default light-app \ + out/infineon-p6-light/chip-p6-lighting-example.out - name: Uploading Size Reports uses: actions/upload-artifact@v2 if: ${{ !env.ACT }} @@ -79,3 +89,4 @@ jobs: path: | out/infineon-p6-lock/p6-default-lock-app-sizes.json out/infineon-p6-all-clusters/p6-default-all-clusters-app-sizes.json + out/infineon-p6-light/p6-default-light-app-sizes.json diff --git a/.github/workflows/examples-k32w.yaml b/.github/workflows/examples-k32w.yaml index 91b3fb1f9124ca..69f2fc023680c7 100644 --- a/.github/workflows/examples-k32w.yaml +++ b/.github/workflows/examples-k32w.yaml @@ -29,15 +29,12 @@ jobs: env: BUILD_TYPE: gn_k32w - GH_EVENT_PR: ${{ github.event_name == 'pull_request' && github.event.number || 0 }} - GH_EVENT_HASH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} - GH_EVENT_PARENT: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }} runs-on: ubuntu-latest if: github.actor != 'restyled-io[bot]' container: - image: connectedhomeip/chip-build-k32w:0.5.25 + image: connectedhomeip/chip-build-k32w:0.5.33 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: @@ -45,6 +42,13 @@ jobs: uses: actions/checkout@v2 with: submodules: true + + - name: Set up environment for size reports + if: ${{ !env.ACT }} + env: + GH_CONTEXT: ${{ toJson(github) }} + run: scripts/tools/memory/gh_sizes_environment.py "${GH_CONTEXT}" + - name: Bootstrap timeout-minutes: 25 run: scripts/build/gn_bootstrap.sh @@ -83,6 +87,7 @@ jobs: k32w k32w061+se05x+release lighting-app \ out/lighting_app_se_release/chip-k32w061-light-example \ /tmp/bloat_reports/ + - name: Uploading Size Reports uses: actions/upload-artifact@v2 if: ${{ !env.ACT }} diff --git a/.github/workflows/examples-linux-standalone.yaml b/.github/workflows/examples-linux-standalone.yaml index 81e5fd51c33d4e..12e651dcaf4bad 100644 --- a/.github/workflows/examples-linux-standalone.yaml +++ b/.github/workflows/examples-linux-standalone.yaml @@ -29,15 +29,12 @@ jobs: env: BUILD_TYPE: gn_linux - GH_EVENT_PR: ${{ github.event_name == 'pull_request' && github.event.number || 0 }} - GH_EVENT_HASH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} - GH_EVENT_PARENT: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }} runs-on: ubuntu-latest if: github.actor != 'restyled-io[bot]' container: - image: connectedhomeip/chip-build:0.5.25 + image: connectedhomeip/chip-build:0.5.33 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" @@ -46,6 +43,13 @@ jobs: uses: actions/checkout@v2 with: submodules: true + + - name: Set up environment for size reports + if: ${{ !env.ACT }} + env: + GH_CONTEXT: ${{ toJson(github) }} + run: scripts/tools/memory/gh_sizes_environment.py "${GH_CONTEXT}" + - name: Bootstrap timeout-minutes: 10 run: scripts/build/gn_bootstrap.sh @@ -123,6 +127,7 @@ jobs: linux debug ota-requestor-app \ out/ota_requestor_debug/chip-ota-requestor-app \ /tmp/bloat_reports/ + - name: Uploading Size Reports uses: actions/upload-artifact@v2 if: ${{ !env.ACT }} diff --git a/.github/workflows/examples-mbed.yaml b/.github/workflows/examples-mbed.yaml index 3140094dec60f6..ccbf9526c4ca67 100644 --- a/.github/workflows/examples-mbed.yaml +++ b/.github/workflows/examples-mbed.yaml @@ -32,15 +32,12 @@ jobs: BUILD_TYPE: mbedos APP_PROFILE: release APP_TARGET: CY8CPROTO_062_4343W - GH_EVENT_PR: ${{ github.event_name == 'pull_request' && github.event.number || 0 }} - GH_EVENT_HASH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} - GH_EVENT_PARENT: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }} runs-on: ubuntu-latest if: github.actor != 'restyled-io[bot]' container: - image: connectedhomeip/chip-build-mbed-os:0.5.25 + image: connectedhomeip/chip-build-mbed-os:0.5.33 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" @@ -50,6 +47,12 @@ jobs: with: submodules: true + - name: Set up environment for size reports + if: ${{ !env.ACT }} + env: + GH_CONTEXT: ${{ toJson(github) }} + run: scripts/tools/memory/gh_sizes_environment.py "${GH_CONTEXT}" + - name: Bootstrap timeout-minutes: 10 run: scripts/build/gn_bootstrap.sh @@ -82,7 +85,7 @@ jobs: /tmp/bloat_reports/ - name: Build pigweed-app example - timeout-minutes: 10 + timeout-minutes: 15 run: | scripts/examples/mbed_example.sh -a=pigweed-app -b=$APP_TARGET -p=$APP_PROFILE .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ diff --git a/.github/workflows/examples-nrfconnect.yaml b/.github/workflows/examples-nrfconnect.yaml index 988346ff2e98e5..b22a210938bb16 100644 --- a/.github/workflows/examples-nrfconnect.yaml +++ b/.github/workflows/examples-nrfconnect.yaml @@ -29,15 +29,12 @@ jobs: env: BUILD_TYPE: nrfconnect - GH_EVENT_PR: ${{ github.event_name == 'pull_request' && github.event.number || 0 }} - GH_EVENT_HASH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} - GH_EVENT_PARENT: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }} runs-on: ubuntu-latest if: github.actor != 'restyled-io[bot]' container: - image: connectedhomeip/chip-build-nrf-platform:0.5.25 + image: connectedhomeip/chip-build-nrf-platform:0.5.33 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" @@ -46,6 +43,13 @@ jobs: uses: actions/checkout@v2 with: submodules: true + + - name: Set up environment for size reports + if: ${{ !env.ACT }} + env: + GH_CONTEXT: ${{ toJson(github) }} + run: scripts/tools/memory/gh_sizes_environment.py "${GH_CONTEXT}" + - name: Bootstrap timeout-minutes: 25 run: scripts/build/gn_bootstrap.sh @@ -144,6 +148,15 @@ jobs: timeout-minutes: 10 run: | scripts/run_in_build_env.sh "scripts/tests/nrfconnect_native_posix_tests.sh native_posix_64" + + - name: Uploading Failed Test Logs + uses: actions/upload-artifact@v2 + if: ${{ failure() }} && ${{ !env.ACT }} + with: + name: test-log + path: | + src/test_driver/nrfconnect/build/Testing/Temporary/LastTest.log + - name: Uploading Size Reports uses: actions/upload-artifact@v2 if: ${{ !env.ACT }} diff --git a/.github/workflows/examples-qpg.yaml b/.github/workflows/examples-qpg.yaml index 82103a141b710c..2c4a08084d107c 100644 --- a/.github/workflows/examples-qpg.yaml +++ b/.github/workflows/examples-qpg.yaml @@ -29,15 +29,12 @@ jobs: env: BUILD_TYPE: gn_qpg - GH_EVENT_PR: ${{ github.event_name == 'pull_request' && github.event.number || 0 }} - GH_EVENT_HASH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} - GH_EVENT_PARENT: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }} runs-on: ubuntu-latest if: github.actor != 'restyled-io[bot]' container: - image: connectedhomeip/chip-build:0.5.25 + image: connectedhomeip/chip-build:0.5.33 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: @@ -45,6 +42,13 @@ jobs: uses: actions/checkout@v2 with: submodules: true + + - name: Set up environment for size reports + if: ${{ !env.ACT }} + env: + GH_CONTEXT: ${{ toJson(github) }} + run: scripts/tools/memory/gh_sizes_environment.py "${GH_CONTEXT}" + - name: Bootstrap timeout-minutes: 25 run: scripts/build/gn_bootstrap.sh @@ -85,6 +89,7 @@ jobs: timeout-minutes: 5 run: | config/qpg/chip-gn/build.sh + - name: Uploading Size Reports uses: actions/upload-artifact@v2 if: ${{ !env.ACT }} diff --git a/.github/workflows/examples-telink.yaml b/.github/workflows/examples-telink.yaml index dd65e5b34871e9..d2f838772926fe 100644 --- a/.github/workflows/examples-telink.yaml +++ b/.github/workflows/examples-telink.yaml @@ -27,15 +27,12 @@ jobs: name: Telink env: BUILD_TYPE: telink - GH_EVENT_PR: ${{ github.event_name == 'pull_request' && github.event.number || 0 }} - GH_EVENT_HASH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} - GH_EVENT_PARENT: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }} runs-on: ubuntu-latest if: github.actor != 'restyled-io[bot]' container: - image: connectedhomeip/chip-build-telink:0.5.25 + image: connectedhomeip/chip-build-telink:0.5.33 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" @@ -44,6 +41,13 @@ jobs: uses: actions/checkout@v2 with: submodules: true + + - name: Set up environment for size reports + if: ${{ !env.ACT }} + env: + GH_CONTEXT: ${{ toJson(github) }} + run: scripts/tools/memory/gh_sizes_environment.py "${GH_CONTEXT}" + - name: Build example Telink Lighting App run: | ./scripts/run_in_build_env.sh \ @@ -52,6 +56,7 @@ jobs: telink tlsr9518adk80d lighting-app \ out/telink-tlsr9518adk80d-light/zephyr/zephyr.elf \ /tmp/bloat_reports/ + - name: Uploading Size Reports uses: actions/upload-artifact@v2 if: ${{ !env.ACT }} diff --git a/.github/workflows/examples-tizen.yaml b/.github/workflows/examples-tizen.yaml index cf67d3adcaaf21..2d51cde782ccc3 100644 --- a/.github/workflows/examples-tizen.yaml +++ b/.github/workflows/examples-tizen.yaml @@ -28,7 +28,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: connectedhomeip/chip-build-tizen:0.5.25 + image: connectedhomeip/chip-build-tizen:0.5.33 options: --user root volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" diff --git a/.github/workflows/qemu.yaml b/.github/workflows/qemu.yaml index 3f61f8feb2efb7..8cb4edf47f36be 100644 --- a/.github/workflows/qemu.yaml +++ b/.github/workflows/qemu.yaml @@ -34,7 +34,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: connectedhomeip/chip-build-esp32-qemu:0.5.25 + image: connectedhomeip/chip-build-esp32-qemu:0.5.33 volumes: - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/release_artifacts.yaml b/.github/workflows/release_artifacts.yaml index 18fbb755ad2368..cae99f252b8119 100644 --- a/.github/workflows/release_artifacts.yaml +++ b/.github/workflows/release_artifacts.yaml @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest container: - image: connectedhomeip/chip-build-esp32:0.5.25 + image: connectedhomeip/chip-build-esp32:0.5.33 steps: - name: Checkout @@ -70,7 +70,7 @@ jobs: runs-on: ubuntu-latest container: - image: connectedhomeip/chip-build-efr32:0.5.25 + image: connectedhomeip/chip-build-efr32:0.5.33 steps: - name: Checkout uses: actions/checkout@v2 diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index c9b7b25f417943..4e7cc5b84567c0 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -20,7 +20,10 @@ on: workflow_dispatch: concurrency: - group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }} + group: + ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == + 'pull_request' && github.event.number) || (github.event_name == + 'workflow_dispatch' && github.run_number) || github.sha }} cancel-in-progress: true jobs: @@ -29,18 +32,18 @@ jobs: timeout-minutes: 60 strategy: - matrix: - type: [tsan] - eventloop: [eventloop_same, eventloop_separate] + matrix: + build_variant: [no-ble-tsan] + chip_tool: ["", -same-event-loop] env: - USE_SEPARATE_EVENTLOOP: ${{ matrix.eventloop == 'eventloop_separate' }} - USE_TSAN: ${{ matrix.type == 'tsan' }} + BUILD_VARIANT: ${{matrix.build_variant}} + CHIP_TOOL_VARIANT: ${{matrix.chip_tool}} if: github.actor != 'restyled-io[bot]' runs-on: ubuntu-latest container: - image: connectedhomeip/chip-build:0.5.25 + image: connectedhomeip/chip-build:0.5.33 options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" @@ -50,7 +53,9 @@ jobs: uses: actions/checkout@v2 with: submodules: true - - name: Try to ensure the directories for core dumping exist and we can write them. + - name: + Try to ensure the directories for core dumping exist and we + can write them. run: | mkdir /tmp/cores || true sysctl -w kernel.core_pattern=/tmp/cores/core.%u.%p.%t || true @@ -62,40 +67,41 @@ jobs: uses: actions/upload-artifact@v2 if: ${{ always() }} && ${{ !env.ACT }} with: - name: bootstrap-logs-linux-${{ matrix.type }}-${{ matrix.eventloop }} + name: + bootstrap-logs-linux-${{ matrix.type }}-${{ + matrix.eventloop }} path: | - .environment/gn_out/.ninja_log - .environment/pigweed-venv/*.log - - name: Build all clusters app - timeout-minutes: 5 - run: | - scripts/examples/gn_build_example.sh examples/all-clusters-app/linux out/debug/standalone/ chip_config_network_layer_ble=false is_tsan=${USE_TSAN} - - name: Build TV app - timeout-minutes: 5 - run: | - scripts/examples/gn_build_example.sh examples/tv-app/linux out/debug/standalone/ chip_config_network_layer_ble=false is_tsan=${USE_TSAN} - - name: Build chip-tool - timeout-minutes: 5 - run: | - scripts/examples/gn_build_example.sh examples/chip-tool out/debug/standalone/ is_tsan=${USE_TSAN} config_use_separate_eventloop=${USE_SEPARATE_EVENTLOOP} - - name: Copy objdir - run: | - # The idea is to not upload our objdir unless builds have - # actually succeeded, because that just wastes space. - rsync -a out/debug/standalone/ objdir-clone || true - - name: Run Tests + .environment/gn_out/.ninja_log + .environment/pigweed-venv/*.log + - name: Build Apps timeout-minutes: 20 run: | - scripts/tests/test_suites.sh - - name: Run TV Tests - timeout-minutes: 10 + ./scripts/run_in_build_env.sh \ + "./scripts/build/build_examples.py \ + --target linux-x64-chip-tool-${BUILD_VARIANT}${CHIP_TOOL_VARIANT} \ + --target linux-x64-all-clusters-${BUILD_VARIANT}-test-group \ + --target linux-x64-tv-app-${BUILD_VARIANT} \ + build \ + --copy-artifacts-to objdir-clone \ + " + - name: Run Tests + timeout-minutes: 30 run: | - scripts/tests/test_suites.sh -a tv + ./scripts/run_in_build_env.sh \ + "./scripts/tests/run_test_suite.py \ + --chip-tool ./out/linux-x64-chip-tool-${BUILD_VARIANT}${CHIP_TOOL_VARIANT}/chip-tool \ + run \ + --iterations 1 \ + --all-clusters-app ./out/linux-x64-all-clusters-${BUILD_VARIANT}-test-group/chip-all-clusters-app \ + --tv-app ./out/linux-x64-tv-app-${BUILD_VARIANT}/chip-tv-app \ + " - name: Uploading core files uses: actions/upload-artifact@v2 if: ${{ failure() }} && ${{ !env.ACT }} with: - name: crash-core-linux-${{ matrix.type }}-${{ matrix.eventloop }} + name: + crash-core-linux-${{ matrix.type }}-${{ matrix.eventloop + }} path: /tmp/cores/ # Cores are big; don't hold on to them too long. retention-days: 5 @@ -103,7 +109,9 @@ jobs: uses: actions/upload-artifact@v2 if: ${{ failure() }} && ${{ !env.ACT }} with: - name: crash-objdir-linux-${{ matrix.type }}-${{ matrix.eventloop }} + name: + crash-objdir-linux-${{ matrix.type }}-${{ matrix.eventloop + }} path: objdir-clone/ # objdirs are big; don't hold on to them too long. retention-days: 5 @@ -112,12 +120,12 @@ jobs: timeout-minutes: 60 strategy: - matrix: - type: [tsan] - eventloop: [eventloop_same, eventloop_separate] + matrix: + build_variant: [no-ble-tsan, no-ble-asan] + chip_tool: ["", -same-event-loop] env: - USE_SEPARATE_EVENTLOOP: ${{ matrix.eventloop == 'eventloop_separate' }} - USE_TSAN: ${{ matrix.type == 'tsan' }} + BUILD_VARIANT: ${{matrix.build_variant}} + CHIP_TOOL_VARIANT: ${{matrix.chip_tool}} if: github.actor != 'restyled-io[bot]' runs-on: macos-latest @@ -130,7 +138,9 @@ jobs: - name: Setup Environment # coreutils for stdbuf run: brew install openssl pkg-config coreutils - - name: Try to ensure the directories for core dumping and diagnostic log collection exist and we can write them. + - name: + Try to ensure the directories for core dumping and diagnostic + log collection exist and we can write them. run: | sudo chown ${USER} /cores || true mkdir -p ~/Library/Logs/DiagnosticReports || true @@ -150,39 +160,40 @@ jobs: uses: actions/upload-artifact@v2 if: ${{ always() }} && ${{ !env.ACT }} with: - name: bootstrap-logs-darwin-${{ matrix.type }}-${{ matrix.eventloop }} + name: + bootstrap-logs-darwin-${{ matrix.type }}-${{ + matrix.eventloop }} path: | - .environment/gn_out/.ninja_log - .environment/pigweed-venv/*.log - - name: Run Build Test Server - timeout-minutes: 10 - run: | - scripts/examples/gn_build_example.sh examples/all-clusters-app/linux out/debug/standalone/ chip_config_network_layer_ble=false is_tsan=${USE_TSAN} - - name: Build chip-tool - timeout-minutes: 10 - run: | - scripts/examples/gn_build_example.sh examples/chip-tool out/debug/standalone/ is_tsan=${USE_TSAN} config_use_separate_eventloop=${USE_SEPARATE_EVENTLOOP} - - name: Copy objdir + .environment/gn_out/.ninja_log + .environment/pigweed-venv/*.log + - name: Build Apps + timeout-minutes: 20 run: | - # The idea is to not upload our objdir unless builds have - # actually succeeded, because that just wastes space. - rsync -a out/debug/standalone/ objdir-clone || true - - name: Run Test Suites - timeout-minutes: 35 + ./scripts/run_in_build_env.sh \ + "./scripts/build/build_examples.py \ + --target darwin-x64-chip-tool-${BUILD_VARIANT}${CHIP_TOOL_VARIANT} \ + --target darwin-x64-all-clusters-${BUILD_VARIANT} \ + build \ + --copy-artifacts-to objdir-clone \ + " + - name: Run Tests + timeout-minutes: 45 run: | - scripts/tests/test_suites.sh - - name: Uploading application logs - uses: actions/upload-artifact@v2 - if: ${{ failure() }} && ${{ !env.ACT }} - with: - name: test-suite-app-logs-${{ matrix.type }}-${{ matrix.eventloop }} - path: /tmp/test_suites_app_logs/ - retention-days: 5 + ./scripts/run_in_build_env.sh \ + "./scripts/tests/run_test_suite.py \ + --chip-tool ./out/darwin-x64-chip-tool-${BUILD_VARIANT}${CHIP_TOOL_VARIANT}/chip-tool \ + --target-skip-glob '{TestGroupMessaging,TV_*}' \ + run \ + --iterations 1 \ + --all-clusters-app ./out/darwin-x64-all-clusters-${BUILD_VARIANT}/chip-all-clusters-app \ + " - name: Uploading core files uses: actions/upload-artifact@v2 if: ${{ failure() }} && ${{ !env.ACT }} with: - name: crash-core-darwin-${{ matrix.type }}-${{ matrix.eventloop }} + name: + crash-core-darwin-${{ matrix.type }}-${{ matrix.eventloop + }} path: /cores/ # Cores are big; don't hold on to them too long. retention-days: 5 @@ -190,13 +201,17 @@ jobs: uses: actions/upload-artifact@v2 if: ${{ failure() }} && ${{ !env.ACT }} with: - name: crash-log-darwin-${{ matrix.type }}-${{ matrix.eventloop }} + name: + crash-log-darwin-${{ matrix.type }}-${{ matrix.eventloop + }} path: ~/Library/Logs/DiagnosticReports/ - name: Uploading objdir for debugging uses: actions/upload-artifact@v2 if: ${{ failure() }} && ${{ !env.ACT }} with: - name: crash-objdir-darwin-${{ matrix.type }}-${{ matrix.eventloop }} + name: + crash-objdir-darwin-${{ matrix.type }}-${{ + matrix.eventloop }} path: objdir-clone/ # objdirs are big; don't hold on to them too long. retention-days: 5 diff --git a/.github/workflows/unit_integration_test.yaml b/.github/workflows/unit_integration_test.yaml index e7132151972fc0..d692edd02592d5 100644 --- a/.github/workflows/unit_integration_test.yaml +++ b/.github/workflows/unit_integration_test.yaml @@ -37,10 +37,9 @@ jobs: runs-on: ubuntu-latest container: - image: connectedhomeip/chip-build:0.5.25 + image: connectedhomeip/chip-build:0.5.33 volumes: - "/tmp/log_output:/tmp/test_logs" - - "/tmp/happy_test_logs:/tmp/happy_test_logs" options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" @@ -52,10 +51,7 @@ jobs: - name: Bootstrap timeout-minutes: 10 run: | - mkdir -p /tmp/happy_test_logs ; mkdir -p /tmp/log_output ; - scripts/tests/happy_tests.sh install_packages ; - scripts/tests/happy_tests.sh bootstrap ; scripts/build/gn_bootstrap.sh ; - name: Uploading bootstrap logs uses: actions/upload-artifact@v2 @@ -82,20 +78,13 @@ jobs: *) ;; esac - scripts/build/gn_gen.sh --args="$GN_ARGS chip_enable_happy_tests=true" + scripts/build/gn_gen.sh --args="$GN_ARGS" - name: Run Build timeout-minutes: 8 - run: scripts/build/gn_build.sh + run: scripts/run_in_build_env.sh "ninja -C out/$BUILD_TYPE" - name: Run Tests timeout-minutes: 15 - run: RUN_HAPPY_TESTS=1 scripts/tests/gn_tests.sh - - name: Uploading Happy Test Log - uses: actions/upload-artifact@v2 - if: ${{ always() }} && ${{ !env.ACT }} - with: - name: - happy_log-${{ steps.outsuffix.outputs.value }}-${{ matrix.type }} - path: /tmp/happy_test_logs/ + run: scripts/tests/gn_tests.sh # TODO Log Upload https://github.com/project-chip/connectedhomeip/issues/2227 # TODO https://github.com/project-chip/connectedhomeip/issues/1512 # - name: Run Code Coverage diff --git a/.github/workflows/zap_templates.yaml b/.github/workflows/zap_templates.yaml index 008d696457df00..66e0890624e8e7 100644 --- a/.github/workflows/zap_templates.yaml +++ b/.github/workflows/zap_templates.yaml @@ -39,7 +39,7 @@ jobs: uses: actions/setup-node@v1 with: node-version: '14.x' - - name: Use Java + - name: Use Java uses: actions/setup-java@v2 with: distribution: 'zulu' @@ -56,7 +56,7 @@ jobs: npm rebuild canvas --update-binary npm run build-spa - name: Generate all - timeout-minutes: 5 + timeout-minutes: 15 run: scripts/tools/zap_regen_all.py - name: Check for uncommited changes run: | diff --git a/.gitignore b/.gitignore index 888e0a722532c3..878192f2bddb6d 100644 --- a/.gitignore +++ b/.gitignore @@ -57,3 +57,6 @@ docs/html # compilation database for VSCode and other Ides compile_commands.json + +# backup files, usually created by the ZAP tool +*~ diff --git a/.gitmodules b/.gitmodules index bee8a7489182fa..85e0f84d9a05ce 100644 --- a/.gitmodules +++ b/.gitmodules @@ -46,10 +46,6 @@ path = third_party/cirque/repo url = https://github.com/openweave/cirque.git branch = master -[submodule "happy"] - path = third_party/happy/repo - url = https://github.com/openweave/happy.git - branch = master [submodule "nanopb"] path = third_party/nanopb/repo url = https://github.com/nanopb/nanopb.git diff --git a/.restyled.yaml b/.restyled.yaml index 176c2498fedc5b..2417db2ba8e7ea 100644 --- a/.restyled.yaml +++ b/.restyled.yaml @@ -67,6 +67,8 @@ exclude: - "third_party/nanopb/repo/**/*" - "src/android/CHIPTool/gradlew" # gradle wrapper generated file - "third_party/android_deps/gradlew" # gradle wrapper generated file + - "src/controller/python/chip/clusters/Objects.py" # generated file, no point to restyle + - "src/controller/python/chip/clusters/CHIPClusters.py" # generated file, no point to restyle changed_paths: diff --git a/.vscode/launch.json b/.vscode/launch.json index 147053871024d8..f89d0eaf3c462b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -192,7 +192,7 @@ "name": "Debug Mbed unit tests", "type": "cortex-debug", "request": "launch", - "cwd": "${workspaceRoot}/src/test_driver/mbed", + "cwd": "${workspaceRoot}/src/test_driver/mbed/unit_tests", "executable": "./build-${input:mbedTarget}/${input:mbedDebugProfile}/chip-mbed-unit-tests.elf", "armToolchainPath": "${env:PW_ENVIRONMENT_ROOT}/cipd/pigweed/bin/", // Pigweed environment bootstraping required "servertype": "openocd", @@ -225,7 +225,7 @@ "name": "Debug Mbed unit tests [remote]", "type": "cortex-debug", "request": "launch", - "cwd": "${workspaceRoot}/src/test_driver/mbed", + "cwd": "${workspaceRoot}/src/test_driver/mbed/unit_tests", "executable": "./build-${input:mbedTarget}/${input:mbedDebugProfile}/chip-mbed-unit-tests.elf", "armToolchainPath": "${env:PW_ENVIRONMENT_ROOT}/cipd/pigweed/bin/", // Pigweed environment bootstraping required "servertype": "external", @@ -252,7 +252,7 @@ "name": "Flash Mbed unit tests", "type": "cortex-debug", "request": "launch", - "cwd": "${workspaceRoot}/src/test_driver/mbed", + "cwd": "${workspaceRoot}/src/test_driver/mbed//unit_tests", "executable": "./build-${input:mbedTarget}/${input:mbedFlashProfile}/chip-mbed-unit-tests.elf", "armToolchainPath": "${env:PW_ENVIRONMENT_ROOT}/cipd/pigweed/bin/", // Pigweed environment bootstraping required "servertype": "openocd", @@ -277,7 +277,7 @@ "name": "Flash Mbed unit tests [remote]", "type": "cortex-debug", "request": "launch", - "cwd": "${workspaceRoot}/src/test_driver/mbed", + "cwd": "${workspaceRoot}/src/test_driver/mbed/unit_tests", "executable": "./build-${input:mbedTarget}/${input:mbedFlashProfile}/chip-mbed-unit-tests.elf", "armToolchainPath": "${env:PW_ENVIRONMENT_ROOT}/cipd/pigweed/bin/", // Pigweed environment bootstraping required "servertype": "external", diff --git a/.vscode/settings.json b/.vscode/settings.json index c4290296d8315f..6ff631080c2465 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -156,5 +156,6 @@ "clang-format.fallbackStyle": "WebKit", "files.trimFinalNewlines": true, "C_Cpp.default.cppStandard": "gnu++14", - "C_Cpp.default.cStandard": "gnu11" + "C_Cpp.default.cStandard": "gnu11", + "cmake.configureOnOpen": false } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index a7a102d81514e2..a0f49412f87aed 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -167,9 +167,20 @@ "base": "$gcc", "fileLocation": [ "relative", - "${workspaceFolder}/src/test_driver/mbed/build" + "${workspaceFolder}/src/test_driver/mbed/unit_tests/build" ] } + }, + { + "label": "Flash EFR32 board", + "type": "shell", + "command": "python3", + "args": [ + "${workspaceFolder}/out/${input:exampleTarget}/chip-efr32-*.flash.py" + ], + "problemMatcher": { + "base": "$gcc" + } } ], "inputs": [ @@ -229,10 +240,45 @@ "android-x64-chip-tool", "android-x86-chip-tool", "efr32-brd4161a-light", + "efr32-brd4163a-light", + "efr32-brd4164a-light", + "efr32-brd4166a-light", + "efr32-brd4170a-light", + "efr32-brd4186a-light", + "efr32-brd4187a-light", + "efr32-brd4304a-light", "efr32-brd4161a-light-rpc", + "efr32-brd4163a-light-rpc", + "efr32-brd4164a-light-rpc", + "efr32-brd4166a-light-rpc", + "efr32-brd4170a-light-rpc", + "efr32-brd4186a-light-rpc", + "efr32-brd4187a-light-rpc", + "efr32-brd4304a-light-rpc", "efr32-brd4161a-lock", + "efr32-brd4163a-lock", + "efr32-brd4164a-lock", + "efr32-brd4166a-lock", + "efr32-brd4170a-lock", + "efr32-brd4186a-lock", + "efr32-brd4187a-lock", + "efr32-brd4304a-lock", "efr32-brd4161a-unit-test", + "efr32-brd4163a-unit-test", + "efr32-brd4164a-unit-test", + "efr32-brd4166a-unit-test", + "efr32-brd4170a-unit-test", + "efr32-brd4186a-unit-test", + "efr32-brd4187a-unit-test", + "efr32-brd4304a-unit-test", "efr32-brd4161a-window-covering", + "efr32-brd4163a-window-covering", + "efr32-brd4164a-window-covering", + "efr32-brd4166a-window-covering", + "efr32-brd4170a-window-covering", + "efr32-brd4186a-window-covering", + "efr32-brd4187a-window-covering", + "efr32-brd4304a-window-covering", "esp32-c3devkit-all-clusters", "esp32-devkitc-all-clusters", "esp32-devkitc-all-clusters-ipv6only", @@ -246,6 +292,7 @@ "esp32-m5stack-all-clusters-rpc-ipv6only", "infineon-p6-all-clusters", "infineon-p6-lock", + "infineon-p6-light", "linux-arm64-all-clusters", "linux-arm64-all-clusters-ipv6only", "linux-arm64-chip-tool", diff --git a/BUILD.gn b/BUILD.gn index 57d4f38b76ce10..fb27e5768c16c5 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -57,7 +57,6 @@ if (current_toolchain != "${dir_pw_toolchain}/default:default") { "$dir_pw_watch/py", "integrations/mobly:chip_mobly", "scripts:requirements", - "third_party/happy", ] } @@ -163,15 +162,6 @@ if (current_toolchain != "${dir_pw_toolchain}/default:default") { ] } } - - # We don't always want to run happy tests, make them a seperate group. - if (chip_enable_happy_tests) { - group("happy_tests") { - if (chip_link_tests) { - deps = [ "//src:happy_tests" ] - } - } - } } else { # This is the unified build. Configure various real toolchains. import("${chip_root}/build/chip/chip_build.gni") @@ -315,7 +305,7 @@ if (current_toolchain != "${dir_pw_toolchain}/default:default") { if (enable_fake_tests) { chip_build("fake_platform") { - toolchain = "${build_root}/toolchain/host:fake_${host_cpu}_gcc" + toolchain = "${build_root}/toolchain/fake:fake_${host_cpu}_gcc" } } diff --git a/build/chip/happy_test.gni b/build/chip/happy_test.gni deleted file mode 100644 index 18392e9f9b9803..00000000000000 --- a/build/chip/happy_test.gni +++ /dev/null @@ -1,54 +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. - -import("//build_overrides/build.gni") -import("//build_overrides/chip.gni") - -import("${chip_root}/build/chip/tests.gni") - -assert(chip_build_tests) -assert(chip_enable_happy_tests) - -template("happy_test") { - _suite_name = target_name - _deps = invoker.deps - _test_output_dir = "${root_out_dir}/tests" - - _tests = [] - if (defined(invoker.tests)) { - foreach(_test, invoker.tests) { - action("${_test}_test") { - script = rebase_path("${chip_root}/scripts/tests/happy_test_wrapper.py") - data_deps = _deps - inputs = [ "${_test}.py" ] - outputs = [ "${_test_output_dir}/${_test}.testout" ] - - # GN will run python under virtual env, which will cause test failed to run - args = [ - "--ci=True", - "--silent=True", - "--test-bin-dir", - rebase_path("${_test_output_dir}"), - rebase_path("${_test}.py"), - ] - } - - _tests += [ ":${_test}_test" ] - } - } - - group("${_suite_name}") { - deps = _tests - } -} diff --git a/build/chip/tests.gni b/build/chip/tests.gni index 9d4089874027e9..70218c49728ed8 100644 --- a/build/chip/tests.gni +++ b/build/chip/tests.gni @@ -20,9 +20,6 @@ import("${chip_root}/src/platform/device.gni") declare_args() { # Enable building tests. chip_build_tests = current_os != "freertos" - - # Enable happy tests. - chip_enable_happy_tests = false } declare_args() { diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index d26edebaf3a929..81fb08caa8afdb 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn @@ -304,6 +304,9 @@ declare_args() { # enable undefined behavior sanitizer is_ubsan = false + # enable libfuzzer + is_libfuzzer = false + # Exit on sanitize error. Generally standard libraries may get errors # so not stopping on the first error is often useful is_sanitize_fatal = true @@ -374,7 +377,16 @@ config("sanitize_default") { } } +config("libfuzzer_fuzzing") { + cflags = [ "-fsanitize=fuzzer" ] + ldflags = cflags +} + config("fuzzing_default") { + configs = [] + if (is_libfuzzer) { + configs += [ ":libfuzzer_fuzzing" ] + } } declare_args() { diff --git a/build/toolchain/android/android_toolchain.gni b/build/toolchain/android/android_toolchain.gni index d54d2184913059..b2c3290a39a50b 100644 --- a/build/toolchain/android/android_toolchain.gni +++ b/build/toolchain/android/android_toolchain.gni @@ -55,6 +55,9 @@ template("android_clang_toolchain") { _ndk_host_cpu = "" if (host_cpu == "x64") { _ndk_host_cpu = "-x86_64" + } else if (host_cpu == "arm64") { + # until NDK 24.0.7856742-beta1, the host cpu on apple silicon is x86_64 + _ndk_host_cpu = "-x86_64" } _ndk_host = _ndk_host_os + _ndk_host_cpu diff --git a/build/toolchain/fake/BUILD.gn b/build/toolchain/fake/BUILD.gn new file mode 100644 index 00000000000000..62ef8fffcac96d --- /dev/null +++ b/build/toolchain/fake/BUILD.gn @@ -0,0 +1,27 @@ +# Copyright 2020 The Pigweed Authors +# 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_root}/toolchain/gcc_toolchain.gni") + +gcc_toolchain("fake_${host_cpu}_gcc") { + toolchain_args = { + current_os = host_os + current_os = host_os + current_cpu = host_cpu + is_clang = false + chip_fake_platform = true + } +} diff --git a/build/toolchain/flashable_executable.gni b/build/toolchain/flashable_executable.gni index afd155547a12a3..fdcb716cbaeb6e 100644 --- a/build/toolchain/flashable_executable.gni +++ b/build/toolchain/flashable_executable.gni @@ -57,6 +57,7 @@ template("gen_flashing_script") { [ "flashing_script_generator", "flashing_script_name", + "flashing_script_inputs", "flashing_options", "deps", "data_deps", @@ -72,6 +73,7 @@ template("gen_flashing_script") { ] script = flashing_script_generator + inputs = flashing_script_inputs } } @@ -131,6 +133,7 @@ template("flashable_executable") { gen_flashing_script("$target_name.flashing") { flashing_script_generator = invoker.flashing_script_generator + flashing_script_inputs = invoker.flashing_script_inputs flashing_script_name = "$root_out_dir/${invoker.flashing_script_name}" if (defined(invoker.flashing_options)) { flashing_options = invoker.flashing_options diff --git a/build/toolchain/host/BUILD.gn b/build/toolchain/host/BUILD.gn index 9640e65e51620a..5f8833852bf537 100644 --- a/build/toolchain/host/BUILD.gn +++ b/build/toolchain/host/BUILD.gn @@ -32,13 +32,3 @@ gcc_toolchain("${host_os}_${host_cpu}_clang") { is_clang = true } } - -gcc_toolchain("fake_${host_cpu}_gcc") { - toolchain_args = { - current_os = host_os - current_os = host_os - current_cpu = host_cpu - is_clang = false - chip_fake_platform = true - } -} diff --git a/build_overrides/k32w0_sdk.gni b/build_overrides/k32w0_sdk.gni index e8519a3ecafe91..fa487e9e7fb254 100644 --- a/build_overrides/k32w0_sdk.gni +++ b/build_overrides/k32w0_sdk.gni @@ -14,5 +14,5 @@ declare_args() { # Root directory for K32W SDK build files. - k32w0_sdk_build_root = "//third_party/k32w_sdk/nxp/k32w/k32w0" + k32w0_sdk_build_root = "//third_party/nxp/k32w0_sdk" } diff --git a/config/ameba/args.gni b/config/ameba/args.gni index b3f7af63e284ab..5d9420e0fbb63c 100755 --- a/config/ameba/args.gni +++ b/config/ameba/args.gni @@ -31,7 +31,5 @@ chip_inet_config_enable_udp_endpoint = true chip_bypass_rendezvous = false chip_config_network_layer_ble = true -chip_ip_commissioning = true -chip_use_clusters_for_ip_commissioning = true custom_toolchain = "//third_party/connectedhomeip/config/ameba/toolchain:ameba" diff --git a/config/esp32/components/chip/CMakeLists.txt b/config/esp32/components/chip/CMakeLists.txt index 967c2c6fcfd374..d45d7f365de625 100644 --- a/config/esp32/components/chip/CMakeLists.txt +++ b/config/esp32/components/chip/CMakeLists.txt @@ -29,14 +29,16 @@ if(NOT CHIP_ROOT) get_filename_component(CHIP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../../.. REALPATH) endif() -set(CHIP_REQURIE_COMPONENTS freertos lwip bt mdns mbedtls fatfs) +set(CHIP_REQURIE_COMPONENTS freertos lwip bt mdns mbedtls fatfs app_update console openthread) -if (CONFIG_ENABLE_CHIP_SHELL) - list(APPEND CHIP_REQURIE_COMPONENTS console) -endif() - -if (CONFIG_OPENTHREAD_ENABLED) - list(APPEND CHIP_REQURIE_COMPONENTS openthread) +if (NOT CMAKE_BUILD_EARLY_EXPANSION) + if (CONFIG_COMPILER_OPTIMIZATION_DEFAULT OR CONFIG_COMPILER_OPTIMIZATION_NONE) + set(is_debug TRUE) + else() + if (NOT CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE) + message(FATAL_ERROR "CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE shall be set") + endif() + endif() endif() idf_component_register(SRCS chip.c chip.cpp @@ -62,7 +64,7 @@ chip_gn_arg_append("esp32_ar" "\"${CMAKE_AR}\"") chip_gn_arg_append("esp32_cc" "\"${CMAKE_C_COMPILER}\"") chip_gn_arg_append("esp32_cxx" "\"${CMAKE_CXX_COMPILER}\"") chip_gn_arg_append("esp32_cpu" "\"esp32\"") -chip_gn_arg_bool("is_debug" is_debug) +chip_gn_arg_bool("is_debug" ${is_debug}) if(CONFIG_BT_ENABLED) chip_gn_arg_append("chip_config_network_layer_ble" "true") @@ -97,6 +99,10 @@ if (CONFIG_OPENTHREAD_ENABLED) chip_gn_arg_append("chip_enable_openthread" "true") endif() +if (CONFIG_ENABLE_OTA_REQUESTOR) + chip_gn_arg_append("chip_enable_ota_requestor" "true") +endif() + set(args_gn_input "${CMAKE_CURRENT_BINARY_DIR}/args.gn.in") file(GENERATE OUTPUT "${args_gn_input}" CONTENT "${chip_gn_args}") @@ -224,3 +230,8 @@ target_link_libraries(${COMPONENT_LIB} INTERFACE -Wl,--start-group # Make the component dependent on our CHIP build add_dependencies(${COMPONENT_LIB} chip_gn) + +if(CONFIG_ENABLE_PW_RPC) + set(WRAP_FUNCTIONS esp_log_write) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-Wl,--wrap=${WRAP_FUNCTIONS}") +endif() diff --git a/config/esp32/components/chip/Kconfig b/config/esp32/components/chip/Kconfig index 904c657f6bf1df..3e59822a63553b 100644 --- a/config/esp32/components/chip/Kconfig +++ b/config/esp32/components/chip/Kconfig @@ -67,17 +67,6 @@ menu "CHIP Core" message handlers with the CHIP message layer to direct incoming messages to their code. - config RMP_TIMER_DEFAULT_PERIOD_SHIFT - int "Default WRMP Timer Tick Interval Shift (ms)" - range 0 16 - default 6 - help - The default interval shift, in milliseconds (e.g. 6 bits shift - = 64ms), at which items in the WRMP pending message list are - processed for the purpose of retransmission or timeout. - - This value can be overridden by the application at runtime. - config ENABLE_PW_RPC bool "Enable Pigweed RPC library" default n @@ -400,26 +389,26 @@ menu "CHIP Device Layer" The device product id (in hex). This is a unique id assigned by the device vendor to identify the product or device type. Defaults to a CHIP-assigned id designating a non-production or test "product". - config DEFAULT_DEVICE_PRODUCT_REVISION - int "Default Device Product Revision" + config DEFAULT_DEVICE_HARDWARE_VERSION + int "Default Device Hardware Version" range 0 65535 default 0 help - The default device product revision. + The default device hardware version. - Product revisions are specific to a particular device vendor and product id, and typically - correspond to a revision of the physical device, a change to its packaging, and/or a change + Hardware versions are specific to a particular device vendor and product id, and typically + correspond to a version of the physical device, a change to its packaging, and/or a change to its marketing presentation. This value is generally *not* incremented for device software - revisions. + versions. - This is a default value which is used when a product revision has not been stored in device + This is a default value which is used when a hardware version has not been stored in device persistent storage (e.g. by a factory provisioning process). - config DEVICE_FIRMWARE_REVISION - string "Device Firmware Revision" + config DEVICE_SOFTWARE_VERSION + string "Device Software Version" default "" help - A string identifying the firmware revision running on the device. + A string identifying the software version running on the device. config DEVICE_TYPE int "Default Device type" diff --git a/config/esp32/components/chip/component.mk b/config/esp32/components/chip/component.mk index c1a18058759fff..21339e3bc3f95c 100644 --- a/config/esp32/components/chip/component.mk +++ b/config/esp32/components/chip/component.mk @@ -99,8 +99,8 @@ COMPONENT_ADD_INCLUDEDIRS += $(REL_OUTPUT_DIR)/src/include \ # Tell the ESP-IDF build system that the CHIP component defines its own build # and clean targets. -COMPONENT_OWNBUILDTARGET = 1 -COMPONENT_OWNCLEANTARGET = 1 +COMPONENT_OWNBUILDTARGET := chip_build +COMPONENT_OWNCLEANTARGET := chip_clean is_debug ?= true @@ -156,10 +156,10 @@ endif cd $(COMPONENT_PATH); ninja $(subst 1,-v,$(filter 1,$(V))) -C $(OUTPUT_DIR) esp32 -build : install-chip +chip_build : install-chip echo "CHIP built and installed..." cp -a ${OUTPUT_DIR}/lib/libCHIP.a ${OUTPUT_DIR}/libchip.a -clean: +chip_clean: echo "RM $(OUTPUT_DIR)" rm -rf $(OUTPUT_DIR) diff --git a/src/app/zap-templates/common/StructHelper.js b/config/ios/SystemProjectConfig.h similarity index 77% rename from src/app/zap-templates/common/StructHelper.js rename to config/ios/SystemProjectConfig.h index 8e37a6ba056295..06d9baaee59492 100644 --- a/src/app/zap-templates/common/StructHelper.js +++ b/config/ios/SystemProjectConfig.h @@ -15,14 +15,12 @@ * limitations under the License. */ -const kType = 'STRUCT'; - -function isStruct(type) -{ - return type.toUpperCase() == kType; -} +/** + * @file + * chip::System project configuration for standalone builds on iOS + * + */ +#ifndef SYSTEMPROJECTCONFIG_H +#define SYSTEMPROJECTCONFIG_H -// -// Module exports -// -exports.isStruct = isStruct; +#endif /* SYSTEMPROJECTCONFIG_H */ diff --git a/config/mbed/CMakeLists.txt b/config/mbed/CMakeLists.txt index b6bf30cfe9453b..b3e362e6ece434 100644 --- a/config/mbed/CMakeLists.txt +++ b/config/mbed/CMakeLists.txt @@ -371,6 +371,7 @@ target_include_directories(${APP_TARGET} PRIVATE ${PIGWEED_ROOT}/pw_log_basic/public_overrides ${PIGWEED_ROOT}/pw_span/public_overrides ${PIGWEED_ROOT}/pw_span/public + ${PIGWEED_ROOT}/pw_sync/public ${PIGWEED_ROOT}/pw_polyfill/public ${PIGWEED_ROOT}/pw_polyfill/standard_library_public ${PIGWEED_ROOT}/pw_polyfill/public_overrides diff --git a/config/nrfconnect/app/overlay-ota_requestor.conf b/config/nrfconnect/app/overlay-ota_requestor.conf new file mode 100644 index 00000000000000..51f0acd210a330 --- /dev/null +++ b/config/nrfconnect/app/overlay-ota_requestor.conf @@ -0,0 +1,17 @@ +# +# 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. +# + +CONFIG_CHIP_OTA_REQUESTOR=y diff --git a/config/nrfconnect/app/sample-defaults.conf b/config/nrfconnect/app/sample-defaults.conf index 829ef8ef29c880..93ac000214ad8b 100644 --- a/config/nrfconnect/app/sample-defaults.conf +++ b/config/nrfconnect/app/sample-defaults.conf @@ -25,6 +25,9 @@ CONFIG_ASSERT=y CONFIG_HW_STACK_PROTECTION=y CONFIG_SHELL=y +# Enable getting reboot reasons information +CONFIG_HWINFO=y + # Generic networking options CONFIG_NETWORKING=y CONFIG_NET_SOCKETS=y diff --git a/config/nrfconnect/chip-module/CMakeLists.txt b/config/nrfconnect/chip-module/CMakeLists.txt index b78bb83f021844..4852fefa702fe2 100644 --- a/config/nrfconnect/chip-module/CMakeLists.txt +++ b/config/nrfconnect/chip-module/CMakeLists.txt @@ -196,6 +196,7 @@ chip_gn_arg_bool ("chip_enable_openthread" CONFIG_NET_L2_OPENTH chip_gn_arg_bool ("chip_config_network_layer_ble" CONFIG_BT) chip_gn_arg_bool ("chip_inet_config_enable_ipv4" CONFIG_NET_IPV4) chip_gn_arg_bool ("chip_enable_nfc" CONFIG_CHIP_NFC_COMMISSIONING) +chip_gn_arg_bool ("chip_enable_ota_requestor" CONFIG_CHIP_OTA_REQUESTOR) chip_gn_arg_bool ("chip_build_tests" CONFIG_CHIP_BUILD_TESTS) chip_gn_arg_bool ("chip_monolithic_tests" CONFIG_CHIP_BUILD_TESTS) chip_gn_arg_bool ("chip_inet_config_enable_tcp_endpoint" CONFIG_CHIP_BUILD_TESTS) diff --git a/config/nrfconnect/chip-module/Kconfig b/config/nrfconnect/chip-module/Kconfig index 0969370e93f5a5..1789996f2d3279 100644 --- a/config/nrfconnect/chip-module/Kconfig +++ b/config/nrfconnect/chip-module/Kconfig @@ -26,4 +26,11 @@ config CHIP_NFC_COMMISSIONING imply NFC_NDEF_URI_REC imply NFC_NDEF_URI_MSG help - Enables NFC commissioning by sharing onboarding payload in NFC tag. \ No newline at end of file + Enables NFC commissioning by sharing onboarding payload in NFC tag. + +# See config/zephyr/Kconfig for full definition +config CHIP_OTA_REQUESTOR + bool + imply DFU_TARGET + imply STREAM_FLASH + imply STREAM_FLASH_ERASE diff --git a/config/python/CHIPProjectConfig.h b/config/python/CHIPProjectConfig.h index bdb2b613f7ceb7..7282f35db3a033 100644 --- a/config/python/CHIPProjectConfig.h +++ b/config/python/CHIPProjectConfig.h @@ -25,8 +25,6 @@ #define CHIP_CONFIG_ENABLE_EPHEMERAL_UDP_PORT 1 -#define CHIP_CONFIG_EVENT_LOGGING_UTC_TIMESTAMPS 1 - #define CHIP_CONFIG_EVENT_LOGGING_NUM_EXTERNAL_CALLBACKS 2 #define CHIP_CONFIG_EVENT_LOGGING_EXTERNAL_EVENT_SUPPORT 1 diff --git a/config/standalone/CHIPProjectConfig.h b/config/standalone/CHIPProjectConfig.h index 35343fc1561630..90873026e001ce 100644 --- a/config/standalone/CHIPProjectConfig.h +++ b/config/standalone/CHIPProjectConfig.h @@ -26,8 +26,6 @@ #define CHIP_CONFIG_ENABLE_EPHEMERAL_UDP_PORT 1 -#define CHIP_CONFIG_EVENT_LOGGING_UTC_TIMESTAMPS 1 - #define CHIP_CONFIG_EVENT_LOGGING_NUM_EXTERNAL_CALLBACKS 2 #define CHIP_CONFIG_EVENT_LOGGING_EXTERNAL_EVENT_SUPPORT 1 @@ -53,6 +51,8 @@ // WARNING: These options make it possible to circumvent basic Chip security functionality, // including message encryption. Because of this they MUST NEVER BE ENABLED IN PRODUCTION BUILDS. // +// To build with this flag, pass 'treat_warnings_as_errors=false' to gn/ninja. +// #define CHIP_CONFIG_SECURITY_TEST_MODE 0 #define CHIP_CONFIG_REQUIRE_AUTH 1 @@ -69,4 +69,10 @@ #define CHIP_CONFIG_DATA_MANAGEMENT_CLIENT_EXPERIMENTAL 1 +#ifndef CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT +#define CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT 4 +#endif + +#define CONFIG_IM_BUILD_FOR_UNIT_TEST 1 + #endif /* CHIPPROJECTCONFIG_H */ diff --git a/config/telink/chip-module/CMakeLists.txt b/config/telink/chip-module/CMakeLists.txt index 1e7c32e137c359..384e66ace0bc90 100644 --- a/config/telink/chip-module/CMakeLists.txt +++ b/config/telink/chip-module/CMakeLists.txt @@ -198,7 +198,6 @@ chip_gn_arg_bool ("chip_inet_config_enable_ipv4" CONFIG_NET_IPV4) chip_gn_arg_bool ("chip_build_tests" CONFIG_CHIP_BUILD_TESTS) chip_gn_arg_bool ("chip_inet_config_enable_tcp_endpoint" CONFIG_CHIP_BUILD_TESTS) chip_gn_arg_bool ("chip_build_libshell" CONFIG_CHIP_LIB_SHELL) -chip_gn_arg_bool ("chip_build_pw_rpc_lib" CONFIG_CHIP_PW_RPC) if (BOARD STREQUAL "native_posix") chip_gn_arg_string("target_cpu" "x86") @@ -246,6 +245,9 @@ target_include_directories(chip INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/gen/include ) target_link_directories(chip INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/lib) +if (CONFIG_CHIP_LIB_SHELL) + target_link_options(chip INTERFACE -Wl,--whole-archive -lCHIPShell -Wl,--no-whole-archive) +endif() target_link_libraries(chip INTERFACE -Wl,--start-group ${CHIP_LIBRARIES} -Wl,--end-group) add_dependencies(chip chip-gn) diff --git a/config/zephyr/Kconfig b/config/zephyr/Kconfig index 63aa1b37cde36b..63b9e727d17fbb 100644 --- a/config/zephyr/Kconfig +++ b/config/zephyr/Kconfig @@ -101,6 +101,13 @@ config CHIP_ENABLE_SLEEPY_END_DEVICE_SUPPORT help Enables Thread Sleepy End Device support in Matter. +config CHIP_OTA_REQUESTOR + bool "Enable OTA requestor" + help + Enables OTA (Over-the-air) Requestor role that allows a device to perform + Device Firmware Upgrade by quering and downloading a new firmware image + from an external OTA Provider node. + config APP_LINK_WITH_CHIP bool "Link 'app' with Connected Home over IP" default y diff --git a/docs/README.md b/docs/README.md index f71b164d56f965..9b49300f55f6b8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,7 +6,7 @@ [the build guide](guides/BUILDING.md) - Documentation about running [cirque](https://github.com/openweave/cirque) tests can be found in - [the cirque test guide](src/test_driver/linux-cirque/README.md) + [the cirque test guide](../src/test_driver/linux-cirque/README.md) - Documentation about standard build & development flows using [Visual Studio Code](https://code.visualstudio.com/) can be found in [the development guide](./VSCODE_DEVELOPMENT.md) diff --git a/docs/discussion/lwip_ipv6.md b/docs/discussion/lwip_ipv6.md index bbfc92d49df28f..adaabe5ddfcac2 100644 --- a/docs/discussion/lwip_ipv6.md +++ b/docs/discussion/lwip_ipv6.md @@ -17,6 +17,7 @@ need to incorporate this into their own middleware - write a RIO patch, upstream to lwip - Ensure patch is RFC compliant (especially re: expiry) +- UPDATE: Patch is available at https://savannah.nongnu.org/patch/?10114 ## Address Scopes diff --git a/docs/guides/BUILDING.md b/docs/guides/BUILDING.md index 1d8a4c2b602b65..5a76a187e39fd2 100644 --- a/docs/guides/BUILDING.md +++ b/docs/guides/BUILDING.md @@ -60,6 +60,8 @@ brew install openssl pkg-config However, that does not expose the package to `pkg-config`. To fix that, one needs to run something like the following: +Intel: + ``` cd /usr/local/lib/pkgconfig ln -s ../../Cellar/openssl@1.1/1.1.1g/lib/pkgconfig/* . @@ -68,6 +70,12 @@ ln -s ../../Cellar/openssl@1.1/1.1.1g/lib/pkgconfig/* . where `openssl@1.1/1.1.1g` may need to be replaced with the actual version of OpenSSL installed by Brew. +Apple Silicon: + +``` +export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:"/opt/homebrew/opt/openssl@3/lib/pkgconfig" +``` + Note: If using MacPorts, `port install openssl` is sufficient to satisfy this dependency. diff --git a/docs/guides/android_building.md b/docs/guides/android_building.md index ed9baeefb15365..6ca2d91dd54a1a 100644 --- a/docs/guides/android_building.md +++ b/docs/guides/android_building.md @@ -18,6 +18,7 @@ There are following Apps on Android - [Source files](#source) - [Requirements for building](#requirements) - [ABIs and TARGET_CPU](#abi) + - [Gradle & JDK Version](#jdk) - [Preparing for build](#preparing) - [Building Android CHIPTool from scripts](#building-scripts) - [Building Android CHIPTool from Android Studio](#building-studio) @@ -57,6 +58,20 @@ architecture: | x86 | x86 | | x86_64 | x64 | + + +### Gradle & JDK Version + +We are using Gradle 7.1.1 for all android project which does not support Java 17 +(https://docs.gradle.org/current/userguide/compatibility.html) while the default +JDK version on MacOS for Apple Silicon is 'openjdk 17.0.1' or above. + +Using JDK bundled with Android Studio will help with that. + +```shell +export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jre/Contents/Home/ +``` +
diff --git a/docs/guides/images/matter_ti_overview_simplified.png b/docs/guides/images/matter_ti_overview_simplified.png new file mode 100755 index 00000000000000..2586fa41fdd97a Binary files /dev/null and b/docs/guides/images/matter_ti_overview_simplified.png differ diff --git a/docs/guides/ip_commissioning.md b/docs/guides/ip_commissioning.md index feaf99993c5733..ca94e611bf0c62 100644 --- a/docs/guides/ip_commissioning.md +++ b/docs/guides/ip_commissioning.md @@ -40,7 +40,7 @@ device into commissioning mode. ### linux builds with an ethernet connection ```bash -gn gen out/debug --args='chip_ip_commissioning=true' +gn gen out/debug ninja -C out/debug ``` diff --git a/docs/guides/nrfconnect_android_commissioning.md b/docs/guides/nrfconnect_android_commissioning.md index 787ba5957a72ab..b6260873b968d7 100644 --- a/docs/guides/nrfconnect_android_commissioning.md +++ b/docs/guides/nrfconnect_android_commissioning.md @@ -1,6 +1,6 @@ # Commissioning nRF Connect Accessory using Android CHIPTool -You can use [CHIPTool](android_chiptool_building.md) for Android smartphones to +You can use [CHIPTool](android_building.md) for Android smartphones to commission a Nordic Semiconductor device running an nRF Connect platform example onto a Matter-enabled Thread network. @@ -104,7 +104,7 @@ learn how to build and program the example onto an nRF52840 DK. ## Building and installing Android CHIPTool To build the CHIPTool application for your smartphone, read the -[Building Android CHIPTool](android_chiptool_building.md) guide. +[Building Android](android_building.md) guide. After building, install the application by completing the following steps: diff --git a/docs/guides/nrfconnect_examples_cli.md b/docs/guides/nrfconnect_examples_cli.md index 056fda2ebadf71..5ac2589113d678 100644 --- a/docs/guides/nrfconnect_examples_cli.md +++ b/docs/guides/nrfconnect_examples_cli.md @@ -163,7 +163,7 @@ available configuration data or to add a specific subcommand. ```shell VendorId: 9050 (0x235A) ProductId: 20043 (0x4E4B) -ProductRevision: 1 (0x1) +HardwareVersion: 1 (0x1) FabricId: PinCode: 020202021 Discriminator: f00 @@ -208,12 +208,12 @@ uart:~$ matter config productid 20043 (0x4E4B) ``` -#### productrev +#### hardwarever -Prints the product revision of the device. Takes no arguments. +Prints the hardware version of the device. Takes no arguments. ```shell -uart:~$ matter config productrev +uart:~$ matter config hardwarever 1 (0x1) ``` diff --git a/docs/guides/python_chip_controller_building.md b/docs/guides/python_chip_controller_building.md index 8542bbfc434117..c3f9d65eac0f5f 100644 --- a/docs/guides/python_chip_controller_building.md +++ b/docs/guides/python_chip_controller_building.md @@ -155,7 +155,7 @@ I: 254 [DL]Device Configuration: I: 257 [DL] Serial Number: TEST_SN I: 260 [DL] Vendor Id: 9050 (0x235A) I: 263 [DL] Product Id: 20043 (0x4E4B) -I: 267 [DL] Product Revision: 1 +I: 267 [DL] Hardware Version: 1 I: 270 [DL] Setup Pin Code: 20202021 I: 273 [DL] Setup Discriminator: 3840 (0xF00) I: 278 [DL] Manufacturing Date: (not set) diff --git a/docs/guides/simulated_device_linux.md b/docs/guides/simulated_device_linux.md new file mode 100644 index 00000000000000..5bbd5f2b6452cf --- /dev/null +++ b/docs/guides/simulated_device_linux.md @@ -0,0 +1,144 @@ +# Simulated Device How-To (Linux) + +This document contains instructions on how to build, run, and interact with a +simulated device. All virtual accessories live in +[examples/placeholder/linux/apps](../../examples/placeholder/linux/apps). + +Each accessory needs to be hosted into a subfolder. It will be the name of the +application. For example `app1` will create a binary named `chip-app1`. + +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). + +### Prerequisite + +- [Building Prerequisites](./BUILDING.md#prerequisites) +- [Prepare For Building](./BUILDING.md#prepare-for-building) + +## Generating and building the default Simulated App with Script + +In order to utilize the app against a commissioner or controller, the app will +need to be specifically built. + +1. To generate the ZAP files, and build the `chip-app1` binary completing the + following steps: + + ``` + ./scripts/examples/gn_build_test_example.sh app1 + ``` + +## Build the App only + +In order to utilize the app against a commissioner or controller, the app will +need to be specifically built. + +1. To only build the `chip-app1` binary completing the following steps: + + ``` + source scripts/activate.sh + CHIP_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)" + GN_ARGS="chip_tests_zap_config=\"app1\"" + GN_ARGS+="chip_project_config_include_dirs=[\"$CHIP_ROOT/examples/placeholder/linux/apps/app1/include\", \"$CHIP_ROOT/config/standalone\"]" + GN_ARGS+="chip_config_network_layer_ble=false" + + gn gen --check --fail-on-unused-args --root=examples/placeholder/linux out/simulated --args="$GN_ARGS" + + ninja -C out/simulated + ``` + +## Running the app + +Now that the building is completed there is a `chip-app1` binary created. This +binary can be executed on a linux os. + +1. To generate the ZAP files, and build the `chip-app1` binary completing the + following steps: + + ``` + ./out/simulated/chip-app1 + ``` + +## Running the app with test parameter + +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. + +1. To generate the ZAP files, and build the `chip-app1` binary completing the + following steps: + + ``` + ./out/simulated/chip-app1 --command [TEST NAME] + ``` + +## Interacting with the simulated app + +Now that the building the app and starting it is complete, you will be able to +interact with it using chip-tool + +1. Follow the instruction to build chip-tool in the + [chip-tool readme](../../examples/chip-tool). + +2. Run this command to initiate the pairing. + ``` + ./out/debug/standalone/chip-tool pairing ethernet 0x654321 20202021 3842 [IP ADDRESS of App] 5542 + ``` +3. Run this command to complete the commissioning. + ``` + ./out/debug/standalone/chip-tool generalcommissioning commissioning-complete 0x654321 0 + ``` +4. Most tests will start at this point and now an send cluster commands with + chip-tool as follow. + + ``` + ./out/debug/standalone/chip-tool onoff on 0x654321 1 + ./out/debug/standalone/chip-tool onoff read on-off 0x654321 1 + ./out/debug/standalone/chip-tool onoff write on-time 1 0x654321 1 + ``` + + See [chip-tool readme](../../examples/chip-tool) for additional commands. + +## 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. + +1. YAML test file are located in + [YAML folder](../../src/app/tests/suites/certification/) +2. Test names must follow a strict format dues to CI of test recognition. The + format is as follows: + - Test_TC\_[`CATEGORY ABBREVIATION`]\_[`SECTION NUMBER`]\_[`SUBSECTION + NUMBER`]\_Simulated.yaml + - `IMPORTANT`: The test name must end in Simulated with the + capital. +3. Available properties can be found in + [YAML Test Name](../../src/app/tests/suites/README.md) +4. An Additional property is as follows: + + | Name | Description | + | ---- | --------------------------------------------------------------------------- | + | wait | The command that is expected to be received on the app from the controller. | + +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. Follow + [Gen Script](#generating-and-building-the-default-simulated-app-with-script) + to do so. +8. When submitting code for review, create 2 commits. One for YAML changes and + second for generated code. diff --git a/docs/guides/ti_platform_overview.md b/docs/guides/ti_platform_overview.md new file mode 100644 index 00000000000000..37a8e065232810 --- /dev/null +++ b/docs/guides/ti_platform_overview.md @@ -0,0 +1,121 @@ +# Texas Instruments platform overview + +The TI platform is a [Matter][matter_gh] platform based on the Texas Instruments +Incorporated SimpleLink SDK. + +The following diagram is a simplified representation of a Matter application +which built on the TI Platform. + +

+ matter_ti_overview_simplified +

+ +## Texas Instruments SimpleLink SDK + +The SimpleLink™ CC13xx and CC26xx Software Development Kit (SDK) delivers +components that enable engineers to develop applications on the Texas +Instruments SimpleLink CC13xx and CC26xx family of wireless microcontrollers +(MCUs). This software toolkit provides a cohesive and consistent software +experience for all SimpleLink CC13xx and CC26xx wireless MCU users by packaging +essential software components, such as a Bluetooth® Low Energy (BLE) protocol +stack supporting Bluetooth 5.2, Bluetooth Mesh, Thread 1.1.1 networking stack +based on OpenThread, Zigbee 3.0 compliant protocol suite, RF-Proprietary +examples, TI’s 15.4 Stack as well as the TI-RTOS kernel and TI Drivers in one +easy-to-use software package along with example applications and documentation. +In addition, the Dynamic Multi-Protocol Manager (DMM) software component enables +multiprotocol development on a single SimpleLink wireless MCU through +time-division multiplexing. + +The SimpleLink MCU portfolio offers a single development environment that +delivers flexible hardware, software, and tool options for customers developing +wired and wireless applications. With 100 percent code reuse across host MCUs, +Wi-Fi™, Bluetooth Low Energy, Sub-1GHz devices and more, choose the MCU or +connectivity standard that fits your design. A one-time investment with the +SimpleLink software development kit allows you to reuse often, opening the door +to create unlimited applications. For more information, visit +www.ti.com/simplelink. + +
+ +## BLE and Thread stacks + +In the TI example applications the Bluetooth Low Energy protocol is used to +provision the Thread protocol to enable Matter communication. Then Thread is +used for IP communication with other Matter devices. + +The TI applications leverage the Bluetooth Low Energy stack on the CC13X2 and +CC26X2 families. This BLE software is distributed in binary form within the TI +SimpleLink SDK. The BLE stack leverages code that is present in the device ROM +for certain common BLE operations. + +These applications leverage the OpenThread stack available within the Matter +repository for Thread communication. Platform support source is built from the +SimpleLink SDK. + +These connection protocols can be run concurrently by using the Texas +Instruments Dynamic Multi-protocol Manager. + +
+ +## LwIP stack + +The Lightweight IP stack interfaces with the OpenThread stack to offer standard +IP connectivity protocols that OpenThread does not natively support. This offers +a standard socket based interface to the Matter platform. + +
+ +## MbedTLS + +The MbedTLS library is used by OpenThread and Matter for a wide variety of +protocols. This ranges from basic AES and SHA to cryptographic protocols like +ECDSA and ECDH. + +The MbedTLS library is hardware accelerated using the TI SimpleLink SDK drivers. +This is achieved through the usage of `_ALT` defines in the MbedTLS +configuration file. + +
+ +## Matter integration + +Matter interacts with LwIP, OpenThread, and the TI BLE stack to achieve the +protocol and application functionality. A BLE profile is registered with the +TI-BLE stack to enable provisioning and configuration. Once the device is +provisioned Matter will configure the OpenThread interface to connect to an +existing Thread network or to start its own network. From there the Matter IP +messages are sent to the LwIP stack to be routed to the OpenThread stack for +transmission. + +Overall, applications generally only need to interface with the Cluster Library +from Matter. The transport of messages and configuration of the device is all +handled by the platform implementation files. + +
+ +# Matter example applications + +Sample Matter applications are provided for the TI platform. These can be used +as reference for your own application. + +- [lock-app](../../examples/lock-app/cc13x2x7_26x2x7/README.md) +- [pump-app](../../examples/pump-app/cc13x2x7_26x2x7/README.md) +- [pump-controller-app](../../examples/pump-controller-app/cc13x2x7_26x2x7/README.md) + +
+ +## Build system + +The TI platform uses GN to generate ninja build scripts. Build files have +already been written to build and link the TI specific code within the +SimpleLink SDK. + +
+ +## TI Support + +For technical support, please consider creating a post on TI's [E2E forum][e2e]. +Additionally, we welcome any feedback. + +[e2e]: https://e2e.ti.com/support/wireless-connectivity/zigbee-and-thread +[matter_gh]: https://github.com/project-chip/connectedhomeip diff --git a/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap b/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap index f1e980a8a0225f..546d4289e4834c 100644 --- a/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap +++ b/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap @@ -1,5 +1,5 @@ { - "featureLevel": 63, + "featureLevel": 67, "creator": "zap", "keyValuePairs": [ { @@ -31,9 +31,9 @@ ], "endpointTypes": [ { - "name": "Anonymous Endpoint Type", - "deviceTypeName": "CHIP-All-Clusters-Server", - "deviceTypeCode": 0, + "name": "MA-rootdevice", + "deviceTypeName": "MA-rootdevice", + "deviceTypeCode": 22, "deviceTypeProfileId": 259, "clusters": [ { @@ -80,7 +80,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -115,7 +115,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -130,7 +130,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -145,7 +145,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -220,7 +220,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -279,7 +279,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -294,7 +294,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -377,7 +377,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -452,7 +452,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -467,7 +467,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -482,7 +482,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -497,7 +497,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -512,7 +512,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -527,7 +527,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -578,7 +578,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -604,7 +604,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -619,7 +619,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -710,7 +710,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -736,7 +736,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -751,7 +751,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -777,7 +777,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -803,7 +803,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -818,7 +818,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -833,7 +833,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -848,7 +848,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -863,13 +863,148 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Binding", + "code": 30, + "mfgCode": null, + "define": "BINDING_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "Bind", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "Unbind", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0001", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Binding", + "code": 30, + "mfgCode": null, + "define": "BINDING_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0001", + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 } ] }, + { + "name": "Access Control", + "code": 31, + "mfgCode": null, + "define": "ACCESS_CONTROL_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [], + "attributes": [] + }, + { + "name": "Access Control", + "code": 31, + "mfgCode": null, + "define": "ACCESS_CONTROL_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [], + "attributes": [ + { + "name": "ACL", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Extension", + "code": 1, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, { "name": "Basic", "code": 40, @@ -898,7 +1033,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -949,7 +1084,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -964,7 +1099,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -979,7 +1114,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -994,7 +1129,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1009,13 +1144,13 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, { - "name": "UserLabel", + "name": "NodeLabel", "code": 5, "mfgCode": null, "side": "server", @@ -1024,7 +1159,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1039,7 +1174,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1054,7 +1189,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1069,7 +1204,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1084,7 +1219,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1099,7 +1234,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1114,7 +1249,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "20210614123456ZZ", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1129,7 +1264,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1144,7 +1279,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1159,7 +1294,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1174,7 +1309,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1189,7 +1324,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1204,6 +1339,21 @@ "singleton": 1, "bounded": 0, "defaultValue": "1", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "UniqueID", + "code": 18, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": 0, + "defaultValue": "", "reportable": 0, "minInterval": 0, "maxInterval": 65344, @@ -1219,7 +1369,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1232,14 +1382,14 @@ "mfgCode": null, "define": "OTA_PROVIDER_CLUSTER", "side": "client", - "enabled": 0, + "enabled": 1, "commands": [ { "name": "QueryImage", "code": 0, "mfgCode": null, "source": "client", - "incoming": 1, + "incoming": 0, "outgoing": 1 }, { @@ -1247,7 +1397,7 @@ "code": 1, "mfgCode": null, "source": "client", - "incoming": 1, + "incoming": 0, "outgoing": 1 }, { @@ -1255,7 +1405,7 @@ "code": 2, "mfgCode": null, "source": "client", - "incoming": 1, + "incoming": 0, "outgoing": 1 } ], @@ -1265,7 +1415,7 @@ "code": 65533, "mfgCode": null, "side": "client", - "included": 1, + "included": 0, "storageOption": "RAM", "singleton": 0, "bounded": 0, @@ -1294,7 +1444,7 @@ "outgoing": 1 }, { - "name": "ApplyUpdateRequestResponse", + "name": "ApplyUpdateResponse", "code": 4, "mfgCode": null, "source": "server", @@ -1339,7 +1489,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1365,7 +1515,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1380,7 +1530,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1395,7 +1545,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1403,18 +1553,69 @@ ] }, { - "name": "General Commissioning", - "code": 48, + "name": "Power Source Configuration", + "code": 46, "mfgCode": null, - "define": "GENERAL_COMMISSIONING_CLUSTER", + "define": "POWER_SOURCE_CONFIGURATION_CLUSTER", "side": "client", "enabled": 0, - "commands": [ - { - "name": "ArmFailSafe", - "code": 0, - "mfgCode": null, - "source": "client", + "commands": [], + "attributes": [] + }, + { + "name": "Power Source Configuration", + "code": 46, + "mfgCode": null, + "define": "POWER_SOURCE_CONFIGURATION_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [], + "attributes": [ + { + "name": "Sources", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "General Commissioning", + "code": 48, + "mfgCode": null, + "define": "GENERAL_COMMISSIONING_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "ArmFailSafe", + "code": 0, + "mfgCode": null, + "source": "client", "incoming": 1, "outgoing": 1 }, @@ -1446,7 +1647,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1497,7 +1698,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1512,11 +1713,56 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, + { + "name": "RegulatoryConfig", + "code": 2, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "LocationCapability", + "code": 3, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "6", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "ClusterRevision", "code": 65533, @@ -1527,7 +1773,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1618,7 +1864,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1708,8 +1954,8 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0", - "reportable": 0, + "defaultValue": "1", + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1724,7 +1970,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1769,7 +2015,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1795,7 +2041,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1810,7 +2056,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1825,7 +2071,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -1840,7 +2086,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -1855,7 +2101,52 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveHardwareFaults", + "code": 5, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveRadioFaults", + "code": 6, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveNetworkFaults", + "code": 7, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -1870,7 +2161,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1905,7 +2196,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1921,6 +2212,21 @@ "enabled": 1, "commands": [], "attributes": [ + { + "name": "ThreadMetrics", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "CurrentHeapFree", "code": 1, @@ -1931,7 +2237,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -1946,7 +2252,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -1961,11 +2267,26 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "ClusterRevision", "code": 65533, @@ -1976,7 +2297,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2021,7 +2342,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2036,7 +2357,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2051,7 +2372,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2066,7 +2387,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2081,7 +2402,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2096,7 +2417,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2111,7 +2432,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2122,11 +2443,11 @@ "mfgCode": null, "side": "server", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2137,11 +2458,11 @@ "mfgCode": null, "side": "server", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2156,7 +2477,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2171,7 +2492,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2186,7 +2507,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2201,7 +2522,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2216,7 +2537,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2231,7 +2552,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2246,7 +2567,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2261,7 +2582,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2276,7 +2597,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2291,7 +2612,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2306,7 +2627,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2321,7 +2642,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2336,7 +2657,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2351,7 +2672,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2366,7 +2687,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2381,7 +2702,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2396,7 +2717,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2411,7 +2732,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2426,7 +2747,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2441,7 +2762,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2456,7 +2777,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2471,7 +2792,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2486,7 +2807,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2501,7 +2822,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2516,7 +2837,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2531,7 +2852,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2546,7 +2867,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2561,7 +2882,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2576,7 +2897,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2591,7 +2912,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2606,7 +2927,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2621,7 +2942,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2636,7 +2957,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2651,7 +2972,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2666,7 +2987,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2681,7 +3002,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2696,7 +3017,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2711,7 +3032,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2726,7 +3047,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2741,7 +3062,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2756,7 +3077,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2771,7 +3092,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2786,7 +3107,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2801,7 +3122,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2816,7 +3137,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2831,7 +3152,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2846,7 +3167,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2861,7 +3182,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -2876,7 +3197,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -2891,7 +3212,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -2902,11 +3223,11 @@ "mfgCode": null, "side": "server", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2921,7 +3242,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2932,11 +3253,11 @@ "mfgCode": null, "side": "server", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2947,15 +3268,30 @@ "mfgCode": null, "side": "server", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x000F", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "ClusterRevision", "code": 65533, @@ -2966,7 +3302,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3001,7 +3337,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3027,7 +3363,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3042,7 +3378,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3057,7 +3393,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3072,7 +3408,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3087,7 +3423,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3102,7 +3438,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3117,7 +3453,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3132,7 +3468,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3147,7 +3483,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3162,7 +3498,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3177,7 +3513,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3192,7 +3528,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3207,6 +3543,21 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", "reportable": 0, "minInterval": 1, "maxInterval": 65534, @@ -3222,7 +3573,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3257,7 +3608,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3283,7 +3634,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3298,7 +3649,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3313,7 +3664,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3328,7 +3679,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3343,7 +3694,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3358,7 +3709,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3373,7 +3724,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3388,7 +3739,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3403,6 +3754,21 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", "reportable": 0, "minInterval": 1, "maxInterval": 65534, @@ -3418,7 +3784,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3444,7 +3810,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3470,7 +3836,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3500,7 +3866,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3515,7 +3881,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3566,7 +3932,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3582,6 +3948,51 @@ "enabled": 1, "commands": [], "attributes": [ + { + "name": "WindowStatus", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AdminFabricIndex", + "code": 1, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AdminVendorId", + "code": 2, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "ClusterRevision", "code": 65533, @@ -3592,7 +4003,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3691,7 +4102,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3750,7 +4161,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3765,7 +4176,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3780,7 +4191,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3795,7 +4206,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3810,7 +4221,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3825,7 +4236,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3833,13 +4244,95 @@ ] }, { - "name": "Door Lock", - "code": 257, + "name": "Group Key Management", + "code": 63, "mfgCode": null, - "define": "DOOR_LOCK_CLUSTER", + "define": "GROUP_KEY_MANAGEMENT_CLUSTER", "side": "client", "enabled": 0, - "commands": [ + "commands": [], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0001", + "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": [], + "attributes": [ + { + "name": "groups", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "group keys", + "code": 1, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0001", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Door Lock", + "code": 257, + "mfgCode": null, + "define": "DOOR_LOCK_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ { "name": "LockDoor", "code": 0, @@ -3873,7 +4366,7 @@ "outgoing": 1 }, { - "name": "SetPin", + "name": "SetPINCode", "code": 5, "mfgCode": null, "source": "client", @@ -3881,7 +4374,7 @@ "outgoing": 1 }, { - "name": "GetPin", + "name": "GetPINCode", "code": 6, "mfgCode": null, "source": "client", @@ -3889,7 +4382,7 @@ "outgoing": 1 }, { - "name": "ClearPin", + "name": "ClearPINCode", "code": 7, "mfgCode": null, "source": "client", @@ -3897,7 +4390,7 @@ "outgoing": 1 }, { - "name": "ClearAllPins", + "name": "ClearAllPINCodes", "code": 8, "mfgCode": null, "source": "client", @@ -3905,7 +4398,7 @@ "outgoing": 1 }, { - "name": "SetWeekdaySchedule", + "name": "SetWeekDaySchedule", "code": 11, "mfgCode": null, "source": "client", @@ -3913,7 +4406,7 @@ "outgoing": 1 }, { - "name": "GetWeekdaySchedule", + "name": "GetWeekDaySchedule", "code": 12, "mfgCode": null, "source": "client", @@ -3921,7 +4414,7 @@ "outgoing": 1 }, { - "name": "ClearWeekdaySchedule", + "name": "ClearWeekDaySchedule", "code": 13, "mfgCode": null, "source": "client", @@ -3929,7 +4422,7 @@ "outgoing": 1 }, { - "name": "SetYeardaySchedule", + "name": "SetYearDaySchedule", "code": 14, "mfgCode": null, "source": "client", @@ -3937,7 +4430,7 @@ "outgoing": 1 }, { - "name": "GetYeardaySchedule", + "name": "GetYearDaySchedule", "code": 15, "mfgCode": null, "source": "client", @@ -3945,7 +4438,7 @@ "outgoing": 1 }, { - "name": "ClearYeardaySchedule", + "name": "ClearYearDaySchedule", "code": 16, "mfgCode": null, "source": "client", @@ -3993,7 +4486,7 @@ "outgoing": 1 }, { - "name": "SetRfid", + "name": "SetRFIDCode", "code": 22, "mfgCode": null, "source": "client", @@ -4001,7 +4494,7 @@ "outgoing": 1 }, { - "name": "GetRfid", + "name": "GetRFIDCode", "code": 23, "mfgCode": null, "source": "client", @@ -4009,7 +4502,7 @@ "outgoing": 1 }, { - "name": "ClearRfid", + "name": "ClearRFIDCode", "code": 24, "mfgCode": null, "source": "client", @@ -4017,7 +4510,7 @@ "outgoing": 1 }, { - "name": "ClearAllRfids", + "name": "ClearAllRFIDCodes", "code": 25, "mfgCode": null, "source": "client", @@ -4036,7 +4529,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4050,27 +4543,10 @@ "define": "DOOR_LOCK_CLUSTER", "side": "server", "enabled": 0, - "commands": [ - { - "name": "LockDoorResponse", - "code": 0, - "mfgCode": null, - "source": "server", - "incoming": 1, - "outgoing": 1 - }, - { - "name": "UnlockDoorResponse", - "code": 1, - "mfgCode": null, - "source": "server", - "incoming": 1, - "outgoing": 1 - } - ], + "commands": [], "attributes": [ { - "name": "lock state", + "name": "LockState", "code": 0, "mfgCode": null, "side": "server", @@ -4085,7 +4561,7 @@ "reportableChange": 0 }, { - "name": "lock type", + "name": "LockType", "code": 1, "mfgCode": null, "side": "server", @@ -4094,13 +4570,13 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, { - "name": "actuator enabled", + "name": "ActuatorEnabled", "code": 2, "mfgCode": null, "side": "server", @@ -4109,13 +4585,13 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, { - "name": "door state", + "name": "DoorState", "code": 3, "mfgCode": null, "side": "server", @@ -4130,7 +4606,7 @@ "reportableChange": 0 }, { - "name": "enable logging", + "name": "EnableLogging", "code": 32, "mfgCode": null, "side": "server", @@ -4145,7 +4621,7 @@ "reportableChange": 0 }, { - "name": "language", + "name": "Language", "code": 33, "mfgCode": null, "side": "server", @@ -4160,7 +4636,7 @@ "reportableChange": 0 }, { - "name": "led settings", + "name": "LEDSettings", "code": 34, "mfgCode": null, "side": "server", @@ -4175,7 +4651,7 @@ "reportableChange": 0 }, { - "name": "auto relock time", + "name": "AutoRelockTime", "code": 35, "mfgCode": null, "side": "server", @@ -4190,7 +4666,7 @@ "reportableChange": 0 }, { - "name": "sound volume", + "name": "SoundVolume", "code": 36, "mfgCode": null, "side": "server", @@ -4205,7 +4681,7 @@ "reportableChange": 0 }, { - "name": "operating mode", + "name": "OperatingMode", "code": 37, "mfgCode": null, "side": "server", @@ -4220,7 +4696,7 @@ "reportableChange": 0 }, { - "name": "default configuration register", + "name": "DefaultConfigurationRegister", "code": 39, "mfgCode": null, "side": "server", @@ -4235,7 +4711,7 @@ "reportableChange": 0 }, { - "name": "enable local programming", + "name": "EnableLocalProgramming", "code": 40, "mfgCode": null, "side": "server", @@ -4250,7 +4726,7 @@ "reportableChange": 0 }, { - "name": "enable one touch locking", + "name": "EnableOneTouchLocking", "code": 41, "mfgCode": null, "side": "server", @@ -4265,7 +4741,7 @@ "reportableChange": 0 }, { - "name": "enable inside status led", + "name": "EnableInsideStatusLED", "code": 42, "mfgCode": null, "side": "server", @@ -4280,7 +4756,7 @@ "reportableChange": 0 }, { - "name": "enable privacy mode button", + "name": "EnablePrivacyModeButton", "code": 43, "mfgCode": null, "side": "server", @@ -4295,7 +4771,7 @@ "reportableChange": 0 }, { - "name": "wrong code entry limit", + "name": "WrongCodeEntryLimit", "code": 48, "mfgCode": null, "side": "server", @@ -4310,7 +4786,7 @@ "reportableChange": 0 }, { - "name": "user code temporary disable time", + "name": "UserCodeTemporaryDisableTime", "code": 49, "mfgCode": null, "side": "server", @@ -4325,7 +4801,7 @@ "reportableChange": 0 }, { - "name": "send pin over the air", + "name": "SendPINOverTheAir", "code": 50, "mfgCode": null, "side": "server", @@ -4340,7 +4816,7 @@ "reportableChange": 0 }, { - "name": "require pin for rf operation", + "name": "RequirePINforRemoteOperation", "code": 51, "mfgCode": null, "side": "server", @@ -4355,22 +4831,7 @@ "reportableChange": 0 }, { - "name": "zigbee security level", - "code": 52, - "mfgCode": null, - "side": "server", - "included": 0, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x00", - "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, - { - "name": "alarm mask", + "name": "AlarmMask", "code": 64, "mfgCode": null, "side": "server", @@ -4385,7 +4846,7 @@ "reportableChange": 0 }, { - "name": "keypad operation event mask", + "name": "KeypadOperationEventMask", "code": 65, "mfgCode": null, "side": "server", @@ -4400,7 +4861,7 @@ "reportableChange": 0 }, { - "name": "RF operation event mask", + "name": "RemoteOperationEventMask", "code": 66, "mfgCode": null, "side": "server", @@ -4415,7 +4876,7 @@ "reportableChange": 0 }, { - "name": "manual operation event mask", + "name": "ManualOperationEventMask", "code": 67, "mfgCode": null, "side": "server", @@ -4430,7 +4891,7 @@ "reportableChange": 0 }, { - "name": "rfid operation event mask", + "name": "RFIDOperationEventMask", "code": 68, "mfgCode": null, "side": "server", @@ -4445,7 +4906,7 @@ "reportableChange": 0 }, { - "name": "keypad programming event mask", + "name": "KeypadProgrammingEventMask", "code": 69, "mfgCode": null, "side": "server", @@ -4460,7 +4921,7 @@ "reportableChange": 0 }, { - "name": "rf programming event mask", + "name": "RemoteProgrammingEventMask", "code": 70, "mfgCode": null, "side": "server", @@ -4475,7 +4936,7 @@ "reportableChange": 0 }, { - "name": "rfid programming event mask", + "name": "RFIDProgrammingEventMask", "code": 71, "mfgCode": null, "side": "server", @@ -4499,7 +4960,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4542,7 +5003,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4568,7 +5029,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4583,7 +5044,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4598,7 +5059,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4613,7 +5074,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4628,7 +5089,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4767,7 +5228,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4793,7 +5254,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4808,7 +5269,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4823,7 +5284,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4838,7 +5299,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x616B", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4853,7 +5314,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x607D", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4868,7 +5329,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4883,7 +5344,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4898,7 +5359,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00FA", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4913,7 +5374,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x01", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4928,7 +5389,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4943,7 +5404,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4958,7 +5419,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4973,7 +5434,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4988,7 +5449,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5003,7 +5464,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5018,7 +5479,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5033,7 +5494,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5048,7 +5509,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5063,7 +5524,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5078,7 +5539,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5093,7 +5554,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5108,7 +5569,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5123,7 +5584,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5138,7 +5599,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5153,7 +5614,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5168,7 +5629,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5183,7 +5644,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5198,7 +5659,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5213,7 +5674,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5228,7 +5689,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5243,7 +5704,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5258,7 +5719,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5273,7 +5734,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5288,7 +5749,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5303,7 +5764,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5318,7 +5779,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5333,7 +5794,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5348,7 +5809,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5363,7 +5824,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5378,7 +5839,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5393,7 +5854,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5408,7 +5869,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x01", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5423,7 +5884,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5438,7 +5899,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5453,7 +5914,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0019", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5468,7 +5929,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5483,7 +5944,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5498,7 +5959,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xFEFF", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5513,7 +5974,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5528,7 +5989,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5543,7 +6004,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5569,7 +6030,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -5610,7 +6071,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -5625,7 +6086,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -5640,7 +6101,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -5655,7 +6116,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xFF", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -5670,7 +6131,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -5696,7 +6157,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5737,7 +6198,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x8000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5752,7 +6213,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x8000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5782,7 +6243,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5808,7 +6269,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5849,7 +6310,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5864,7 +6325,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5894,7 +6355,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5920,7 +6381,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5961,7 +6422,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5976,7 +6437,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -5991,7 +6452,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6026,7 +6487,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6069,7 +6530,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6084,7 +6545,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6099,7 +6560,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6114,7 +6575,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6129,7 +6590,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xff", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6144,7 +6605,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6195,7 +6656,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6230,7 +6691,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "false", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6245,7 +6706,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6260,7 +6721,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6275,7 +6736,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6290,7 +6751,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6305,7 +6766,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6320,7 +6781,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6335,7 +6796,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6350,7 +6811,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6365,7 +6826,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6380,7 +6841,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6395,7 +6856,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6410,7 +6871,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6425,7 +6886,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6440,7 +6901,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6455,7 +6916,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6470,7 +6931,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6485,7 +6946,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6500,158 +6961,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, - { - "name": "ClusterRevision", - "code": 65533, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x0001", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - } - ] - }, - { - "name": "Binding", - "code": 61440, - "mfgCode": null, - "define": "BINDING_CLUSTER", - "side": "client", - "enabled": 0, - "commands": [ - { - "name": "Bind", - "code": 0, - "mfgCode": null, - "source": "client", - "incoming": 1, - "outgoing": 1 - }, - { - "name": "Unbind", - "code": 1, - "mfgCode": null, - "source": "client", - "incoming": 1, - "outgoing": 1 - } - ], - "attributes": [ - { - "name": "ClusterRevision", - "code": 65533, - "mfgCode": null, - "side": "client", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x0001", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - } - ] - }, - { - "name": "Binding", - "code": 61440, - "mfgCode": null, - "define": "BINDING_CLUSTER", - "side": "server", - "enabled": 1, - "commands": [], - "attributes": [ - { - "name": "ClusterRevision", - "code": 65533, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x0001", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - } - ] - }, - { - "name": "Group Key Management", - "code": 61444, - "mfgCode": null, - "define": "GROUP_KEY_MANAGEMENT_CLUSTER", - "side": "client", - "enabled": 0, - "commands": [], - "attributes": [ - { - "name": "ClusterRevision", - "code": 65533, - "mfgCode": null, - "side": "client", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x0001", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - } - ] - }, - { - "name": "Group Key Management", - "code": 61444, - "mfgCode": null, - "define": "GROUP_KEY_MANAGEMENT_CLUSTER", - "side": "server", - "enabled": 1, - "commands": [], - "attributes": [ - { - "name": "groups", - "code": 0, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, - { - "name": "group keys", - "code": 1, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6666,7 +6976,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6676,9 +6986,9 @@ ] }, { - "name": "Anonymous Endpoint Type", - "deviceTypeName": "CHIP-All-Clusters-Server", - "deviceTypeCode": 0, + "name": "MA-rootdevice", + "deviceTypeName": "MA-rootdevice", + "deviceTypeCode": 22, "deviceTypeProfileId": 259, "clusters": [ { @@ -6725,7 +7035,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6760,7 +7070,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6775,7 +7085,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6790,7 +7100,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6865,7 +7175,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6924,7 +7234,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -6939,7 +7249,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7022,7 +7332,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7097,7 +7407,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7112,7 +7422,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7127,7 +7437,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7142,7 +7452,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7157,7 +7467,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7172,7 +7482,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7223,7 +7533,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7264,7 +7574,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x01", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7279,7 +7589,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7294,7 +7604,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7309,7 +7619,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7324,7 +7634,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7339,7 +7649,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "4", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7365,7 +7675,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7391,7 +7701,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7406,7 +7716,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7421,7 +7731,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7512,7 +7822,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7553,7 +7863,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7568,7 +7878,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -7583,7 +7893,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xFF", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -7598,7 +7908,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -7613,7 +7923,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -7628,7 +7938,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -7643,7 +7953,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7658,7 +7968,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -7673,7 +7983,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xFE", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -7688,7 +7998,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -7703,7 +8013,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -7718,7 +8028,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -7733,7 +8043,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7748,7 +8058,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7774,7 +8084,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7800,7 +8110,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7845,7 +8155,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7871,7 +8181,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7897,7 +8207,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7912,7 +8222,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7927,7 +8237,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7942,7 +8252,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7957,7 +8267,76 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Binding", + "code": 30, + "mfgCode": null, + "define": "BINDING_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [ + { + "name": "Bind", + "code": 0, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + }, + { + "name": "Unbind", + "code": 1, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 1 + } + ], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0001", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + } + ] + }, + { + "name": "Binding", + "code": 30, + "mfgCode": null, + "define": "BINDING_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [], + "attributes": [ + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0001", + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -7983,7 +8362,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8009,7 +8388,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8024,7 +8403,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8039,7 +8418,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8054,7 +8433,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8089,7 +8468,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8140,7 +8519,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8155,7 +8534,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8170,7 +8549,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8185,7 +8564,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8200,13 +8579,13 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, { - "name": "UserLabel", + "name": "NodeLabel", "code": 5, "mfgCode": null, "side": "server", @@ -8215,7 +8594,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8230,7 +8609,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8245,7 +8624,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8260,7 +8639,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8275,7 +8654,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8290,7 +8669,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8305,7 +8684,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8356,7 +8735,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8380,7 +8759,7 @@ "outgoing": 1 }, { - "name": "ApplyUpdateRequestResponse", + "name": "ApplyUpdateResponse", "code": 4, "mfgCode": null, "source": "server", @@ -8399,7 +8778,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8425,7 +8804,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8451,7 +8830,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8477,7 +8856,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8503,7 +8882,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8518,7 +8897,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8533,7 +8912,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8548,7 +8927,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8563,7 +8942,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8578,7 +8957,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8593,7 +8972,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8608,7 +8987,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8623,7 +9002,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8638,7 +9017,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -8653,7 +9032,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8696,7 +9075,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8739,7 +9118,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "o", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8754,7 +9133,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8769,7 +9148,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8860,7 +9239,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8951,7 +9330,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8977,7 +9356,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -8991,247 +9370,116 @@ "define": "BRIDGED_DEVICE_BASIC_CLUSTER", "side": "server", "enabled": 1, - "commands": [ - { - "name": "StartUp", - "code": 0, - "mfgCode": null, - "source": "server", - "incoming": 0, - "outgoing": 1 - }, - { - "name": "ShutDown", - "code": 1, - "mfgCode": null, - "source": "server", - "incoming": 0, - "outgoing": 1 - }, - { - "name": "Leave", - "code": 2, - "mfgCode": null, - "source": "server", - "incoming": 0, - "outgoing": 1 - }, - { - "name": "ReachableChanged", - "code": 3, - "mfgCode": null, - "source": "server", - "incoming": 1, - "outgoing": 1 - } - ], + "commands": [], "attributes": [ { - "name": "VendorName", - "code": 1, + "name": "ClusterRevision", + "code": 65533, "mfgCode": null, "side": "server", "included": 1, "storageOption": "RAM", "singleton": 1, "bounded": 0, - "defaultValue": "", - "reportable": 0, + "defaultValue": "1", + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 - }, - { - "name": "VendorID", - "code": 2, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 1, - "bounded": 0, - "defaultValue": "", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, - { - "name": "ProductName", - "code": 3, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 1, - "bounded": 0, - "defaultValue": "", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, - { - "name": "UserLabel", - "code": 5, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 1, - "bounded": 0, - "defaultValue": "", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, - { - "name": "HardwareVersion", - "code": 7, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 1, - "bounded": 0, - "defaultValue": "0x00", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, - { - "name": "HardwareVersionString", - "code": 8, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 1, - "bounded": 0, - "defaultValue": "", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, - { - "name": "SoftwareVersion", - "code": 9, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 1, - "bounded": 0, - "defaultValue": "0x00", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, - { - "name": "SoftwareVersionString", - "code": 10, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 1, - "bounded": 0, - "defaultValue": "", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, - { - "name": "ManufacturingDate", - "code": 11, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 1, - "bounded": 0, - "defaultValue": "", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, + } + ] + }, + { + "name": "Switch", + "code": 59, + "mfgCode": null, + "define": "SWITCH_CLUSTER", + "side": "client", + "enabled": 0, + "commands": [], + "attributes": [ { - "name": "PartNumber", - "code": 12, + "name": "ClusterRevision", + "code": 65533, "mfgCode": null, - "side": "server", + "side": "client", "included": 1, "storageOption": "RAM", - "singleton": 1, + "singleton": 0, "bounded": 0, - "defaultValue": "", - "reportable": 0, + "defaultValue": "0x0001", + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 - }, + } + ] + }, + { + "name": "Switch", + "code": 59, + "mfgCode": null, + "define": "SWITCH_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [], + "attributes": [ { - "name": "ProductURL", - "code": 13, + "name": "number of positions", + "code": 0, "mfgCode": null, "side": "server", "included": 1, "storageOption": "RAM", - "singleton": 1, + "singleton": 0, "bounded": 0, - "defaultValue": "", - "reportable": 0, + "defaultValue": "2", + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, { - "name": "ProductLabel", - "code": 14, + "name": "current position", + "code": 1, "mfgCode": null, "side": "server", "included": 1, "storageOption": "RAM", - "singleton": 1, + "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, { - "name": "SerialNumber", - "code": 15, + "name": "multi press max", + "code": 2, "mfgCode": null, "side": "server", "included": 1, "storageOption": "RAM", - "singleton": 1, + "singleton": 0, "bounded": 0, - "defaultValue": "", - "reportable": 0, + "defaultValue": "2", + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, { - "name": "Reachable", - "code": 17, + "name": "FeatureMap", + "code": 65532, "mfgCode": null, "side": "server", "included": 1, "storageOption": "RAM", - "singleton": 1, + "singleton": 0, "bounded": 0, - "defaultValue": "0x00", - "reportable": 0, + "defaultValue": "0", + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -9243,10 +9491,10 @@ "side": "server", "included": 1, "storageOption": "RAM", - "singleton": 1, + "singleton": 0, "bounded": 0, - "defaultValue": "1", - "reportable": 0, + "defaultValue": "0x0001", + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -9254,10 +9502,10 @@ ] }, { - "name": "Switch", - "code": 59, + "name": "Group Key Management", + "code": 63, "mfgCode": null, - "define": "SWITCH_CLUSTER", + "define": "GROUP_KEY_MANAGEMENT_CLUSTER", "side": "client", "enabled": 0, "commands": [], @@ -9272,7 +9520,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -9280,16 +9528,16 @@ ] }, { - "name": "Switch", - "code": 59, + "name": "Group Key Management", + "code": 63, "mfgCode": null, - "define": "SWITCH_CLUSTER", + "define": "GROUP_KEY_MANAGEMENT_CLUSTER", "side": "server", - "enabled": 1, + "enabled": 0, "commands": [], "attributes": [ { - "name": "number of positions", + "name": "groups", "code": 0, "mfgCode": null, "side": "server", @@ -9297,14 +9545,14 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "2", - "reportable": 0, + "defaultValue": "", + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, { - "name": "current position", + "name": "group keys", "code": 1, "mfgCode": null, "side": "server", @@ -9318,36 +9566,6 @@ "maxInterval": 65344, "reportableChange": 0 }, - { - "name": "multi press max", - "code": 2, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "2", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, - { - "name": "FeatureMap", - "code": 65532, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, { "name": "ClusterRevision", "code": 65533, @@ -9358,7 +9576,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -9384,7 +9602,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -9410,7 +9628,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -9425,7 +9643,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -9451,7 +9669,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -9492,7 +9710,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -9527,7 +9745,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -9568,7 +9786,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -9583,7 +9801,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -9598,7 +9816,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -9613,7 +9831,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "Coffee", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -9628,7 +9846,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -9676,7 +9894,7 @@ "outgoing": 1 }, { - "name": "SetPin", + "name": "SetPINCode", "code": 5, "mfgCode": null, "source": "client", @@ -9684,7 +9902,7 @@ "outgoing": 1 }, { - "name": "GetPin", + "name": "GetPINCode", "code": 6, "mfgCode": null, "source": "client", @@ -9692,7 +9910,7 @@ "outgoing": 1 }, { - "name": "ClearPin", + "name": "ClearPINCode", "code": 7, "mfgCode": null, "source": "client", @@ -9700,7 +9918,7 @@ "outgoing": 1 }, { - "name": "ClearAllPins", + "name": "ClearAllPINCodes", "code": 8, "mfgCode": null, "source": "client", @@ -9708,7 +9926,7 @@ "outgoing": 1 }, { - "name": "SetWeekdaySchedule", + "name": "SetWeekDaySchedule", "code": 11, "mfgCode": null, "source": "client", @@ -9716,7 +9934,7 @@ "outgoing": 1 }, { - "name": "GetWeekdaySchedule", + "name": "GetWeekDaySchedule", "code": 12, "mfgCode": null, "source": "client", @@ -9724,7 +9942,7 @@ "outgoing": 1 }, { - "name": "ClearWeekdaySchedule", + "name": "ClearWeekDaySchedule", "code": 13, "mfgCode": null, "source": "client", @@ -9732,7 +9950,7 @@ "outgoing": 1 }, { - "name": "SetYeardaySchedule", + "name": "SetYearDaySchedule", "code": 14, "mfgCode": null, "source": "client", @@ -9740,7 +9958,7 @@ "outgoing": 1 }, { - "name": "GetYeardaySchedule", + "name": "GetYearDaySchedule", "code": 15, "mfgCode": null, "source": "client", @@ -9748,7 +9966,7 @@ "outgoing": 1 }, { - "name": "ClearYeardaySchedule", + "name": "ClearYearDaySchedule", "code": 16, "mfgCode": null, "source": "client", @@ -9796,7 +10014,7 @@ "outgoing": 1 }, { - "name": "SetRfid", + "name": "SetRFIDCode", "code": 22, "mfgCode": null, "source": "client", @@ -9804,7 +10022,7 @@ "outgoing": 1 }, { - "name": "GetRfid", + "name": "GetRFIDCode", "code": 23, "mfgCode": null, "source": "client", @@ -9812,7 +10030,7 @@ "outgoing": 1 }, { - "name": "ClearRfid", + "name": "ClearRFIDCode", "code": 24, "mfgCode": null, "source": "client", @@ -9820,7 +10038,7 @@ "outgoing": 1 }, { - "name": "ClearAllRfids", + "name": "ClearAllRFIDCodes", "code": 25, "mfgCode": null, "source": "client", @@ -9839,7 +10057,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -9855,25 +10073,41 @@ "enabled": 1, "commands": [ { - "name": "LockDoorResponse", - "code": 0, + "name": "GetLogRecordResponse", + "code": 4, "mfgCode": null, "source": "server", - "incoming": 1, + "incoming": 0, "outgoing": 1 }, { - "name": "UnlockDoorResponse", - "code": 1, + "name": "GetPINCodeResponse", + "code": 6, "mfgCode": null, "source": "server", - "incoming": 1, + "incoming": 0, + "outgoing": 1 + }, + { + "name": "GetWeekDayScheduleResponse", + "code": 12, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 + }, + { + "name": "GetYearDayScheduleResponse", + "code": 15, + "mfgCode": null, + "source": "server", + "incoming": 0, "outgoing": 1 } ], "attributes": [ { - "name": "lock state", + "name": "LockState", "code": 0, "mfgCode": null, "side": "server", @@ -9888,7 +10122,7 @@ "reportableChange": 0 }, { - "name": "lock type", + "name": "LockType", "code": 1, "mfgCode": null, "side": "server", @@ -9897,13 +10131,13 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, { - "name": "actuator enabled", + "name": "ActuatorEnabled", "code": 2, "mfgCode": null, "side": "server", @@ -9912,13 +10146,13 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, { - "name": "door state", + "name": "DoorState", "code": 3, "mfgCode": null, "side": "server", @@ -9933,7 +10167,22 @@ "reportableChange": 0 }, { - "name": "enable logging", + "name": "NumberOfLogRecordsSupported", + "code": 16, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EnableLogging", "code": 32, "mfgCode": null, "side": "server", @@ -9948,7 +10197,7 @@ "reportableChange": 0 }, { - "name": "language", + "name": "Language", "code": 33, "mfgCode": null, "side": "server", @@ -9963,7 +10212,7 @@ "reportableChange": 0 }, { - "name": "led settings", + "name": "LEDSettings", "code": 34, "mfgCode": null, "side": "server", @@ -9978,11 +10227,11 @@ "reportableChange": 0 }, { - "name": "auto relock time", + "name": "AutoRelockTime", "code": 35, "mfgCode": null, "side": "server", - "included": 0, + "included": 1, "storageOption": "RAM", "singleton": 0, "bounded": 0, @@ -9993,7 +10242,7 @@ "reportableChange": 0 }, { - "name": "sound volume", + "name": "SoundVolume", "code": 36, "mfgCode": null, "side": "server", @@ -10008,11 +10257,11 @@ "reportableChange": 0 }, { - "name": "operating mode", + "name": "OperatingMode", "code": 37, "mfgCode": null, "side": "server", - "included": 0, + "included": 1, "storageOption": "RAM", "singleton": 0, "bounded": 0, @@ -10023,7 +10272,22 @@ "reportableChange": 0 }, { - "name": "default configuration register", + "name": "SupportedOperatingModes", + "code": 38, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0xFFF6", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "DefaultConfigurationRegister", "code": 39, "mfgCode": null, "side": "server", @@ -10038,7 +10302,7 @@ "reportableChange": 0 }, { - "name": "enable local programming", + "name": "EnableLocalProgramming", "code": 40, "mfgCode": null, "side": "server", @@ -10053,7 +10317,7 @@ "reportableChange": 0 }, { - "name": "enable one touch locking", + "name": "EnableOneTouchLocking", "code": 41, "mfgCode": null, "side": "server", @@ -10068,7 +10332,7 @@ "reportableChange": 0 }, { - "name": "enable inside status led", + "name": "EnableInsideStatusLED", "code": 42, "mfgCode": null, "side": "server", @@ -10083,7 +10347,7 @@ "reportableChange": 0 }, { - "name": "enable privacy mode button", + "name": "EnablePrivacyModeButton", "code": 43, "mfgCode": null, "side": "server", @@ -10098,7 +10362,7 @@ "reportableChange": 0 }, { - "name": "wrong code entry limit", + "name": "WrongCodeEntryLimit", "code": 48, "mfgCode": null, "side": "server", @@ -10113,7 +10377,7 @@ "reportableChange": 0 }, { - "name": "user code temporary disable time", + "name": "UserCodeTemporaryDisableTime", "code": 49, "mfgCode": null, "side": "server", @@ -10128,7 +10392,7 @@ "reportableChange": 0 }, { - "name": "send pin over the air", + "name": "SendPINOverTheAir", "code": 50, "mfgCode": null, "side": "server", @@ -10143,7 +10407,7 @@ "reportableChange": 0 }, { - "name": "require pin for rf operation", + "name": "RequirePINforRemoteOperation", "code": 51, "mfgCode": null, "side": "server", @@ -10158,22 +10422,7 @@ "reportableChange": 0 }, { - "name": "zigbee security level", - "code": 52, - "mfgCode": null, - "side": "server", - "included": 0, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x00", - "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, - { - "name": "alarm mask", + "name": "AlarmMask", "code": 64, "mfgCode": null, "side": "server", @@ -10188,7 +10437,7 @@ "reportableChange": 0 }, { - "name": "keypad operation event mask", + "name": "KeypadOperationEventMask", "code": 65, "mfgCode": null, "side": "server", @@ -10203,7 +10452,7 @@ "reportableChange": 0 }, { - "name": "RF operation event mask", + "name": "RemoteOperationEventMask", "code": 66, "mfgCode": null, "side": "server", @@ -10218,7 +10467,7 @@ "reportableChange": 0 }, { - "name": "manual operation event mask", + "name": "ManualOperationEventMask", "code": 67, "mfgCode": null, "side": "server", @@ -10233,7 +10482,7 @@ "reportableChange": 0 }, { - "name": "rfid operation event mask", + "name": "RFIDOperationEventMask", "code": 68, "mfgCode": null, "side": "server", @@ -10248,7 +10497,7 @@ "reportableChange": 0 }, { - "name": "keypad programming event mask", + "name": "KeypadProgrammingEventMask", "code": 69, "mfgCode": null, "side": "server", @@ -10263,7 +10512,7 @@ "reportableChange": 0 }, { - "name": "rf programming event mask", + "name": "RemoteProgrammingEventMask", "code": 70, "mfgCode": null, "side": "server", @@ -10278,7 +10527,7 @@ "reportableChange": 0 }, { - "name": "rfid programming event mask", + "name": "RFIDProgrammingEventMask", "code": 71, "mfgCode": null, "side": "server", @@ -10302,7 +10551,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10385,7 +10634,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "5", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10411,7 +10660,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10425,8 +10674,8 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0x0000", - "reportable": 0, + "defaultValue": "0x7FFF", + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10440,8 +10689,8 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0x0000", - "reportable": 0, + "defaultValue": "0x7FFF", + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10456,7 +10705,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x03", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10470,7 +10719,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0xFF", + "defaultValue": "50", "reportable": 1, "minInterval": 0, "maxInterval": 100, @@ -10485,7 +10734,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0xFF", + "defaultValue": "50", "reportable": 1, "minInterval": 0, "maxInterval": 100, @@ -10515,7 +10764,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0xFF", + "defaultValue": "500", "reportable": 1, "minInterval": 0, "maxInterval": 10000, @@ -10530,7 +10779,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0xFFFF", + "defaultValue": "500", "reportable": 1, "minInterval": 0, "maxInterval": 10000, @@ -10546,7 +10795,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10560,7 +10809,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0xFF", + "defaultValue": "500", "reportable": 1, "minInterval": 0, "maxInterval": 10000, @@ -10575,7 +10824,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0xFF", + "defaultValue": "500", "reportable": 1, "minInterval": 0, "maxInterval": 10000, @@ -10591,7 +10840,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10606,7 +10855,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xFFFF", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10621,7 +10870,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10636,7 +10885,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xFFFF", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10651,7 +10900,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 15, "reportableChange": 0 @@ -10681,7 +10930,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10696,7 +10945,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "5", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10739,7 +10988,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10765,7 +11014,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10780,7 +11029,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10795,7 +11044,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10810,7 +11059,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10825,7 +11074,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10851,7 +11100,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10877,7 +11126,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10892,7 +11141,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10907,7 +11156,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -10922,7 +11171,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -10937,7 +11186,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -10952,7 +11201,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -10967,7 +11216,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -10982,7 +11231,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -10997,7 +11246,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -11012,7 +11261,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -11027,7 +11276,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -11042,7 +11291,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -11057,7 +11306,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -11087,7 +11336,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11102,7 +11351,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11132,7 +11381,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -11142,12 +11391,12 @@ "code": 21, "mfgCode": null, "side": "server", - "included": 0, + "included": 1, "storageOption": "RAM", "singleton": 0, "bounded": 0, "defaultValue": "0x000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -11157,12 +11406,12 @@ "code": 22, "mfgCode": null, "side": "server", - "included": 0, + "included": 1, "storageOption": "RAM", "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -11177,7 +11426,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -11192,7 +11441,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11207,7 +11456,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -11222,7 +11471,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -11237,7 +11486,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -11252,7 +11501,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11319,7 +11568,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11377,7 +11626,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x02BC", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11392,7 +11641,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0BB8", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11407,7 +11656,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0640", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11422,7 +11671,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0C80", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11467,7 +11716,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0A28", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11482,7 +11731,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x07D0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11497,7 +11746,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x02BC", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11512,7 +11761,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0BB8", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11527,7 +11776,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0640", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11542,7 +11791,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0C80", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11557,7 +11806,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x19", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -11572,7 +11821,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x04", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11587,7 +11836,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x01", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11602,7 +11851,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11617,7 +11866,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "7", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11632,7 +11881,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "4", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11647,7 +11896,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11662,7 +11911,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x000b", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11677,7 +11926,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11703,7 +11952,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11729,7 +11978,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11744,7 +11993,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11759,7 +12008,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11774,7 +12023,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -11953,7 +12202,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12054,7 +12303,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12069,7 +12318,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12129,7 +12378,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12144,7 +12393,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12159,7 +12408,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12174,7 +12423,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12189,7 +12438,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12204,7 +12453,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12219,7 +12468,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12234,7 +12483,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12249,7 +12498,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12264,7 +12513,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12279,7 +12528,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12294,7 +12543,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12309,7 +12558,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12324,7 +12573,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12339,7 +12588,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12354,7 +12603,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12369,7 +12618,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12384,7 +12633,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12399,7 +12648,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12414,7 +12663,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12429,7 +12678,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12444,7 +12693,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12459,7 +12708,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12474,7 +12723,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12489,7 +12738,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12504,7 +12753,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12519,7 +12768,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12534,7 +12783,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12549,7 +12798,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12564,7 +12813,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12759,7 +13008,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12785,7 +13034,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -12825,8 +13074,8 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "", - "reportable": 0, + "defaultValue": "0x01", + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -12840,8 +13089,8 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "", - "reportable": 0, + "defaultValue": "0xFFFE", + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -12856,7 +13105,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -12871,7 +13120,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xFF", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -12886,7 +13135,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -12912,7 +13161,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12953,7 +13202,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x8000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12968,7 +13217,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x8000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -12998,7 +13247,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13024,7 +13273,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13065,7 +13314,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13080,7 +13329,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13140,7 +13389,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13166,7 +13415,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13192,7 +13441,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13207,7 +13456,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13222,7 +13471,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13237,7 +13486,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -13252,7 +13501,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13278,7 +13527,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13319,7 +13568,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13334,7 +13583,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13364,7 +13613,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13390,7 +13639,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13431,7 +13680,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13446,7 +13695,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13461,7 +13710,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13496,7 +13745,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13539,7 +13788,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13554,7 +13803,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13569,7 +13818,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13584,7 +13833,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13599,7 +13848,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xff", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13614,7 +13863,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13640,7 +13889,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13666,7 +13915,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13681,7 +13930,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13732,7 +13981,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13767,7 +14016,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13782,7 +14031,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13797,7 +14046,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13812,7 +14061,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13847,7 +14096,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13882,7 +14131,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -13897,7 +14146,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14012,7 +14261,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14127,7 +14376,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -14142,7 +14391,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xFF", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -14157,7 +14406,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -14172,7 +14421,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -14187,7 +14436,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -14202,7 +14451,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -14217,7 +14466,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -14232,7 +14481,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -14247,7 +14496,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14306,7 +14555,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14332,7 +14581,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14347,7 +14596,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14362,7 +14611,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14397,7 +14646,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14423,7 +14672,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14458,7 +14707,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14493,7 +14742,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14536,7 +14785,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14579,7 +14828,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14594,7 +14843,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14609,7 +14858,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14652,7 +14901,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14678,7 +14927,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14693,7 +14942,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14708,7 +14957,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14743,7 +14992,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14778,7 +15027,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14793,7 +15042,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14808,7 +15057,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14823,7 +15072,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14849,7 +15098,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14875,7 +15124,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14890,7 +15139,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14905,7 +15154,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14920,7 +15169,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14935,7 +15184,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14950,7 +15199,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14965,7 +15214,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x01", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -14980,7 +15229,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15023,7 +15272,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15058,7 +15307,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15176,6 +15425,30 @@ "source": "client", "incoming": 1, "outgoing": 0 + }, + { + "name": "SimpleStructEchoRequest", + "code": 17, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "TimedInvokeRequest", + "code": 18, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 + }, + { + "name": "TestSimpleOptionalArgumentRequest", + "code": 19, + "mfgCode": null, + "source": "client", + "incoming": 1, + "outgoing": 0 } ], "attributes": [ @@ -15189,7 +15462,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15243,6 +15516,14 @@ "source": "server", "incoming": 0, "outgoing": 1 + }, + { + "name": "SimpleStructResponse", + "code": 9, + "mfgCode": null, + "source": "server", + "incoming": 0, + "outgoing": 1 } ], "attributes": [ @@ -15256,7 +15537,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "false", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15271,7 +15552,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15286,7 +15567,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15301,7 +15582,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15316,7 +15597,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15331,7 +15612,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15346,11 +15627,26 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, + { + "name": "int24u", + "code": 7, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "int32u", "code": 8, @@ -15361,11 +15657,56 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, + { + "name": "int40u", + "code": 9, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "int48u", + "code": 10, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "int56u", + "code": 11, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "int64u", "code": 12, @@ -15376,7 +15717,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15391,7 +15732,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15406,11 +15747,26 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, + { + "name": "int24s", + "code": 15, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "int32s", "code": 16, @@ -15421,11 +15777,56 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, + { + "name": "int40s", + "code": 17, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "int48s", + "code": 18, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "int56s", + "code": 19, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "int64s", "code": 20, @@ -15436,7 +15837,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15451,7 +15852,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15466,11 +15867,41 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, + { + "name": "float_single", + "code": 23, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "float_double", + "code": 24, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "octet_string", "code": 25, @@ -15481,7 +15912,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15492,33 +15923,663 @@ "mfgCode": null, "side": "server", "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "list_octet_string", + "code": 27, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "list_struct_octet_string", + "code": 28, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "long_octet_string", + "code": 29, + "mfgCode": null, + "side": "server", + "included": 1, "storageOption": "RAM", "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "char_string", + "code": 30, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, { - "name": "list_octet_string", - "code": 27, + "name": "long_char_string", + "code": 31, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 + }, + { + "name": "epoch_us", + "code": 32, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "epoch_s", + "code": 33, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "vendor_id", + "code": 34, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "list_nullables_and_optionals_struct", + "code": 35, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "enum_attr", + "code": 36, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "struct", + "code": 37, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "range_restricted_int8u", + "code": 38, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "70", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "range_restricted_int8s", + "code": 39, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "range_restricted_int16u", + "code": 40, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "200", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "range_restricted_int16s", + "code": 41, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "list_long_octet_string", + "code": 42, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "timed_write_boolean", + "code": 48, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "unsupported", + "code": 255, + "mfgCode": null, + "side": "server", + "included": 0, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_boolean", + "code": 32768, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "false", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_bitmap8", + "code": 32769, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_bitmap16", + "code": 32770, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_bitmap32", + "code": 32771, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_bitmap64", + "code": 32772, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_int8u", + "code": 32773, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_int16u", + "code": 32774, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_int24u", + "code": 32775, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_int32u", + "code": 32776, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_int40u", + "code": 32777, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_int48u", + "code": 32778, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_int56u", + "code": 32779, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_int64u", + "code": 32780, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_int8s", + "code": 32781, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_int16s", + "code": 32782, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_int24s", + "code": 32783, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_int32s", + "code": 32784, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_int40s", + "code": 32785, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_int48s", + "code": 32786, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_int56s", + "code": 32787, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_int64s", + "code": 32788, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_enum8", + "code": 32789, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_enum16", + "code": 32790, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_float_single", + "code": 32791, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "nullable_float_double", + "code": 32792, "mfgCode": null, "side": "server", "included": 1, "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { - "name": "list_struct_octet_string", - "code": 28, + "name": "nullable_octet_string", + "code": 32793, "mfgCode": null, "side": "server", "included": 1, @@ -15526,14 +16587,14 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { - "name": "long_octet_string", - "code": 29, + "name": "nullable_char_string", + "code": 32798, "mfgCode": null, "side": "server", "included": 1, @@ -15541,14 +16602,14 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { - "name": "char_string", - "code": 30, + "name": "nullable_enum_attr", + "code": 32804, "mfgCode": null, "side": "server", "included": 1, @@ -15556,82 +16617,82 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { - "name": "long_char_string", - "code": 31, + "name": "nullable_struct", + "code": 32805, "mfgCode": null, "side": "server", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { - "name": "epoch_us", - "code": 32, + "name": "nullable_range_restricted_int8u", + "code": 32806, "mfgCode": null, "side": "server", "included": 1, "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "", - "reportable": 0, + "defaultValue": "70", + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 }, { - "name": "epoch_s", - "code": 33, + "name": "nullable_range_restricted_int8s", + "code": 32807, "mfgCode": null, "side": "server", "included": 1, "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "", - "reportable": 0, + "defaultValue": "0", + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 }, { - "name": "vendor_id", - "code": 34, + "name": "nullable_range_restricted_int16u", + "code": 32808, "mfgCode": null, "side": "server", "included": 1, "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "", - "reportable": 0, + "defaultValue": "200", + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 }, { - "name": "list_nullables_and_optionals_struct", - "code": 35, + "name": "nullable_range_restricted_int16s", + "code": 32809, "mfgCode": null, "side": "server", "included": 1, - "storageOption": "External", + "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "", - "reportable": 0, + "defaultValue": "0", + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -15646,7 +16707,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15672,7 +16733,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15698,7 +16759,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15713,7 +16774,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15728,7 +16789,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xffff", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15743,7 +16804,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x8000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15758,7 +16819,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x8000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15773,7 +16834,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xffff", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15788,7 +16849,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xffff", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15803,7 +16864,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xffff", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15818,7 +16879,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xffff", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15833,7 +16894,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xffff", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15848,7 +16909,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xffff", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -15863,158 +16924,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - } - ] - }, - { - "name": "Binding", - "code": 61440, - "mfgCode": null, - "define": "BINDING_CLUSTER", - "side": "client", - "enabled": 0, - "commands": [ - { - "name": "Bind", - "code": 0, - "mfgCode": null, - "source": "client", - "incoming": 1, - "outgoing": 1 - }, - { - "name": "Unbind", - "code": 1, - "mfgCode": null, - "source": "client", - "incoming": 1, - "outgoing": 1 - } - ], - "attributes": [ - { - "name": "ClusterRevision", - "code": 65533, - "mfgCode": null, - "side": "client", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x0001", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - } - ] - }, - { - "name": "Binding", - "code": 61440, - "mfgCode": null, - "define": "BINDING_CLUSTER", - "side": "server", - "enabled": 1, - "commands": [], - "attributes": [ - { - "name": "ClusterRevision", - "code": 65533, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x0001", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - } - ] - }, - { - "name": "Group Key Management", - "code": 61444, - "mfgCode": null, - "define": "GROUP_KEY_MANAGEMENT_CLUSTER", - "side": "client", - "enabled": 0, - "commands": [], - "attributes": [ - { - "name": "ClusterRevision", - "code": 65533, - "mfgCode": null, - "side": "client", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x0001", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - } - ] - }, - { - "name": "Group Key Management", - "code": 61444, - "mfgCode": null, - "define": "GROUP_KEY_MANAGEMENT_CLUSTER", - "side": "server", - "enabled": 0, - "commands": [], - "attributes": [ - { - "name": "groups", - "code": 0, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, - { - "name": "group keys", - "code": 1, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "", - "reportable": 0, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, - { - "name": "ClusterRevision", - "code": 65533, - "mfgCode": null, - "side": "server", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16024,10 +16934,10 @@ ] }, { - "name": "Anonymous Endpoint Type", - "deviceTypeName": null, - "deviceTypeCode": null, - "deviceTypeProfileId": null, + "name": "MA-rootdevice", + "deviceTypeName": "MA-rootdevice", + "deviceTypeCode": 22, + "deviceTypeProfileId": 259, "clusters": [ { "name": "Identify", @@ -16065,7 +16975,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16100,7 +17010,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16115,7 +17025,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16190,7 +17100,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16249,7 +17159,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16264,7 +17174,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16347,7 +17257,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16422,7 +17332,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16437,7 +17347,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16452,7 +17362,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16467,7 +17377,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16482,7 +17392,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16497,7 +17407,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16548,7 +17458,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16589,7 +17499,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16604,7 +17514,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16619,7 +17529,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16634,7 +17544,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16649,7 +17559,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16664,7 +17574,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "4", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16755,7 +17665,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16796,7 +17706,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16822,7 +17732,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -16848,7 +17758,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -16863,7 +17773,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -16878,7 +17788,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -16893,7 +17803,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -16908,7 +17818,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -16934,7 +17844,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -16985,7 +17895,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17000,7 +17910,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17015,7 +17925,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17030,7 +17940,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17045,13 +17955,13 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, { - "name": "UserLabel", + "name": "NodeLabel", "code": 5, "mfgCode": null, "side": "server", @@ -17060,7 +17970,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17075,7 +17985,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17090,7 +18000,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17105,7 +18015,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17120,7 +18030,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17135,7 +18045,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17150,7 +18060,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17198,7 +18108,7 @@ "outgoing": 1 }, { - "name": "SetPin", + "name": "SetPINCode", "code": 5, "mfgCode": null, "source": "client", @@ -17206,7 +18116,7 @@ "outgoing": 1 }, { - "name": "GetPin", + "name": "GetPINCode", "code": 6, "mfgCode": null, "source": "client", @@ -17214,7 +18124,7 @@ "outgoing": 1 }, { - "name": "ClearPin", + "name": "ClearPINCode", "code": 7, "mfgCode": null, "source": "client", @@ -17222,7 +18132,7 @@ "outgoing": 1 }, { - "name": "ClearAllPins", + "name": "ClearAllPINCodes", "code": 8, "mfgCode": null, "source": "client", @@ -17230,7 +18140,7 @@ "outgoing": 1 }, { - "name": "SetWeekdaySchedule", + "name": "SetWeekDaySchedule", "code": 11, "mfgCode": null, "source": "client", @@ -17238,7 +18148,7 @@ "outgoing": 1 }, { - "name": "GetWeekdaySchedule", + "name": "GetWeekDaySchedule", "code": 12, "mfgCode": null, "source": "client", @@ -17246,7 +18156,7 @@ "outgoing": 1 }, { - "name": "ClearWeekdaySchedule", + "name": "ClearWeekDaySchedule", "code": 13, "mfgCode": null, "source": "client", @@ -17254,7 +18164,7 @@ "outgoing": 1 }, { - "name": "SetYeardaySchedule", + "name": "SetYearDaySchedule", "code": 14, "mfgCode": null, "source": "client", @@ -17262,7 +18172,7 @@ "outgoing": 1 }, { - "name": "GetYeardaySchedule", + "name": "GetYearDaySchedule", "code": 15, "mfgCode": null, "source": "client", @@ -17270,7 +18180,7 @@ "outgoing": 1 }, { - "name": "ClearYeardaySchedule", + "name": "ClearYearDaySchedule", "code": 16, "mfgCode": null, "source": "client", @@ -17318,7 +18228,7 @@ "outgoing": 1 }, { - "name": "SetRfid", + "name": "SetRFIDCode", "code": 22, "mfgCode": null, "source": "client", @@ -17326,7 +18236,7 @@ "outgoing": 1 }, { - "name": "GetRfid", + "name": "GetRFIDCode", "code": 23, "mfgCode": null, "source": "client", @@ -17334,7 +18244,7 @@ "outgoing": 1 }, { - "name": "ClearRfid", + "name": "ClearRFIDCode", "code": 24, "mfgCode": null, "source": "client", @@ -17342,7 +18252,7 @@ "outgoing": 1 }, { - "name": "ClearAllRfids", + "name": "ClearAllRFIDCodes", "code": 25, "mfgCode": null, "source": "client", @@ -17361,7 +18271,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17375,27 +18285,10 @@ "define": "DOOR_LOCK_CLUSTER", "side": "server", "enabled": 0, - "commands": [ - { - "name": "LockDoorResponse", - "code": 0, - "mfgCode": null, - "source": "server", - "incoming": 1, - "outgoing": 1 - }, - { - "name": "UnlockDoorResponse", - "code": 1, - "mfgCode": null, - "source": "server", - "incoming": 1, - "outgoing": 1 - } - ], + "commands": [], "attributes": [ { - "name": "lock state", + "name": "LockState", "code": 0, "mfgCode": null, "side": "server", @@ -17410,7 +18303,7 @@ "reportableChange": 0 }, { - "name": "lock type", + "name": "LockType", "code": 1, "mfgCode": null, "side": "server", @@ -17419,13 +18312,13 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, { - "name": "actuator enabled", + "name": "ActuatorEnabled", "code": 2, "mfgCode": null, "side": "server", @@ -17434,13 +18327,13 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, { - "name": "door state", + "name": "DoorState", "code": 3, "mfgCode": null, "side": "server", @@ -17455,7 +18348,7 @@ "reportableChange": 0 }, { - "name": "enable logging", + "name": "EnableLogging", "code": 32, "mfgCode": null, "side": "server", @@ -17470,7 +18363,7 @@ "reportableChange": 0 }, { - "name": "language", + "name": "Language", "code": 33, "mfgCode": null, "side": "server", @@ -17485,7 +18378,7 @@ "reportableChange": 0 }, { - "name": "led settings", + "name": "LEDSettings", "code": 34, "mfgCode": null, "side": "server", @@ -17500,7 +18393,7 @@ "reportableChange": 0 }, { - "name": "auto relock time", + "name": "AutoRelockTime", "code": 35, "mfgCode": null, "side": "server", @@ -17515,7 +18408,7 @@ "reportableChange": 0 }, { - "name": "sound volume", + "name": "SoundVolume", "code": 36, "mfgCode": null, "side": "server", @@ -17530,7 +18423,7 @@ "reportableChange": 0 }, { - "name": "operating mode", + "name": "OperatingMode", "code": 37, "mfgCode": null, "side": "server", @@ -17545,7 +18438,7 @@ "reportableChange": 0 }, { - "name": "default configuration register", + "name": "DefaultConfigurationRegister", "code": 39, "mfgCode": null, "side": "server", @@ -17560,7 +18453,7 @@ "reportableChange": 0 }, { - "name": "enable local programming", + "name": "EnableLocalProgramming", "code": 40, "mfgCode": null, "side": "server", @@ -17575,7 +18468,7 @@ "reportableChange": 0 }, { - "name": "enable one touch locking", + "name": "EnableOneTouchLocking", "code": 41, "mfgCode": null, "side": "server", @@ -17590,7 +18483,7 @@ "reportableChange": 0 }, { - "name": "enable inside status led", + "name": "EnableInsideStatusLED", "code": 42, "mfgCode": null, "side": "server", @@ -17605,7 +18498,7 @@ "reportableChange": 0 }, { - "name": "enable privacy mode button", + "name": "EnablePrivacyModeButton", "code": 43, "mfgCode": null, "side": "server", @@ -17620,7 +18513,7 @@ "reportableChange": 0 }, { - "name": "wrong code entry limit", + "name": "WrongCodeEntryLimit", "code": 48, "mfgCode": null, "side": "server", @@ -17635,7 +18528,7 @@ "reportableChange": 0 }, { - "name": "user code temporary disable time", + "name": "UserCodeTemporaryDisableTime", "code": 49, "mfgCode": null, "side": "server", @@ -17650,7 +18543,7 @@ "reportableChange": 0 }, { - "name": "send pin over the air", + "name": "SendPINOverTheAir", "code": 50, "mfgCode": null, "side": "server", @@ -17665,7 +18558,7 @@ "reportableChange": 0 }, { - "name": "require pin for rf operation", + "name": "RequirePINforRemoteOperation", "code": 51, "mfgCode": null, "side": "server", @@ -17680,22 +18573,7 @@ "reportableChange": 0 }, { - "name": "zigbee security level", - "code": 52, - "mfgCode": null, - "side": "server", - "included": 0, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x00", - "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, - { - "name": "alarm mask", + "name": "AlarmMask", "code": 64, "mfgCode": null, "side": "server", @@ -17710,7 +18588,7 @@ "reportableChange": 0 }, { - "name": "keypad operation event mask", + "name": "KeypadOperationEventMask", "code": 65, "mfgCode": null, "side": "server", @@ -17725,7 +18603,7 @@ "reportableChange": 0 }, { - "name": "RF operation event mask", + "name": "RemoteOperationEventMask", "code": 66, "mfgCode": null, "side": "server", @@ -17740,7 +18618,7 @@ "reportableChange": 0 }, { - "name": "manual operation event mask", + "name": "ManualOperationEventMask", "code": 67, "mfgCode": null, "side": "server", @@ -17755,7 +18633,7 @@ "reportableChange": 0 }, { - "name": "rfid operation event mask", + "name": "RFIDOperationEventMask", "code": 68, "mfgCode": null, "side": "server", @@ -17770,7 +18648,7 @@ "reportableChange": 0 }, { - "name": "keypad programming event mask", + "name": "KeypadProgrammingEventMask", "code": 69, "mfgCode": null, "side": "server", @@ -17785,7 +18663,7 @@ "reportableChange": 0 }, { - "name": "rf programming event mask", + "name": "RemoteProgrammingEventMask", "code": 70, "mfgCode": null, "side": "server", @@ -17800,7 +18678,7 @@ "reportableChange": 0 }, { - "name": "rfid programming event mask", + "name": "RFIDProgrammingEventMask", "code": 71, "mfgCode": null, "side": "server", @@ -17824,7 +18702,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17867,7 +18745,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17893,7 +18771,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17908,7 +18786,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17923,7 +18801,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17938,7 +18816,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -17953,7 +18831,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18092,7 +18970,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18148,7 +19026,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18193,7 +19071,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18208,7 +19086,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18238,7 +19116,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x01", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18253,7 +19131,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18268,7 +19146,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18283,7 +19161,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18298,7 +19176,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18313,7 +19191,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18328,7 +19206,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18343,7 +19221,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18358,7 +19236,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18373,7 +19251,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18388,7 +19266,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18403,7 +19281,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18418,7 +19296,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18433,7 +19311,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18448,7 +19326,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18463,7 +19341,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18478,7 +19356,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18493,7 +19371,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18508,7 +19386,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18523,7 +19401,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18538,7 +19416,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18553,7 +19431,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18568,7 +19446,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18583,7 +19461,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18598,7 +19476,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18613,7 +19491,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18628,7 +19506,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18643,7 +19521,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18658,7 +19536,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18673,7 +19551,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18688,7 +19566,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18703,7 +19581,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18718,7 +19596,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18733,7 +19611,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x01", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18748,7 +19626,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18763,7 +19641,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18778,7 +19656,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0019", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18793,7 +19671,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18808,7 +19686,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18823,7 +19701,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xFEFF", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18838,7 +19716,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18853,7 +19731,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18868,7 +19746,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18894,7 +19772,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18935,7 +19813,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x8000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18950,7 +19828,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x8000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -18980,7 +19858,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -19006,7 +19884,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -19047,7 +19925,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -19062,7 +19940,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -19077,7 +19955,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -19112,7 +19990,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -19155,7 +20033,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -19170,7 +20048,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -19185,7 +20063,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -19200,7 +20078,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -19215,7 +20093,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xff", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -19230,7 +20108,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -19242,32 +20120,31 @@ ], "endpoints": [ { - "endpointTypeName": "Anonymous Endpoint Type", + "endpointTypeName": "MA-rootdevice", "endpointTypeIndex": 0, "profileId": 259, "endpointId": 0, "networkId": 0, - "endpointVersion": null, - "deviceIdentifier": null + "endpointVersion": 1, + "deviceIdentifier": 22 }, { - "endpointTypeName": "Anonymous Endpoint Type", + "endpointTypeName": "MA-rootdevice", "endpointTypeIndex": 1, - "profileId": "0x0103", + "profileId": 259, "endpointId": 1, "networkId": 0, - "endpointVersion": null, - "deviceIdentifier": null + "endpointVersion": 1, + "deviceIdentifier": 22 }, { - "endpointTypeName": "Anonymous Endpoint Type", + "endpointTypeName": "MA-rootdevice", "endpointTypeIndex": 2, - "profileId": "0x0103", + "profileId": 259, "endpointId": 2, "networkId": 0, - "endpointVersion": null, - "deviceIdentifier": null + "endpointVersion": 1, + "deviceIdentifier": 22 } - ], - "log": [] + ] } \ No newline at end of file diff --git a/examples/all-clusters-app/all-clusters-common/include/static-supported-modes-manager.h b/examples/all-clusters-app/all-clusters-common/include/static-supported-modes-manager.h new file mode 100644 index 00000000000000..2d4f674a65920d --- /dev/null +++ b/examples/all-clusters-app/all-clusters-common/include/static-supported-modes-manager.h @@ -0,0 +1,73 @@ +/* + * + * 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 + +namespace chip { +namespace app { +namespace Clusters { +namespace ModeSelect { + +/** + * This implementation statically defines the options. + */ + +class StaticSupportedModesManager : public chip::app::Clusters::ModeSelect::SupportedModesManager +{ + using ModeOptionStructType = Structs::ModeOptionStruct::Type; + using storage_value_type = const ModeOptionStructType; + + struct EndpointSpanPair + { + const EndpointId mEndpointId; + const Span mSpan; + + EndpointSpanPair(const EndpointId aEndpointId, const Span && aSpan) : + mEndpointId(aEndpointId), mSpan(aSpan) + {} + + EndpointSpanPair() : mEndpointId(0), mSpan(Span()) {} + }; + + static storage_value_type coffeeOptions[]; + static const EndpointSpanPair supportedOptionsByEndpoints[EMBER_AF_MODE_SELECT_CLUSTER_SERVER_ENDPOINT_COUNT]; + +public: + static const StaticSupportedModesManager instance; + + const SupportedModesManager::ModeOptionsProvider getModeOptionsProvider(EndpointId endpointId) const override; + + EmberAfStatus getModeOptionByMode(EndpointId endpointId, uint8_t mode, const ModeOptionStructType ** dataPtr) const override; + + ~StaticSupportedModesManager(){}; + + StaticSupportedModesManager() {} + + static inline const StaticSupportedModesManager & getStaticSupportedModesManagerInstance() { return instance; } +}; + +const SupportedModesManager * getSupportedModesManager(); + +} // namespace ModeSelect +} // namespace Clusters +} // namespace app +} // namespace chip diff --git a/examples/all-clusters-app/all-clusters-common/src/bridged-actions-stub.cpp b/examples/all-clusters-app/all-clusters-common/src/bridged-actions-stub.cpp index c4ed4eb0c8792e..caaad460a616b3 100644 --- a/examples/all-clusters-app/all-clusters-common/src/bridged-actions-stub.cpp +++ b/examples/all-clusters-app/all-clusters-common/src/bridged-actions-stub.cpp @@ -37,7 +37,7 @@ class BridgedActionsAttrAccess : public AttributeAccessInterface // Register for the Bridged Actions cluster on all endpoints. BridgedActionsAttrAccess() : AttributeAccessInterface(Optional::Missing(), BridgedActions::Id) {} - CHIP_ERROR Read(const ConcreteAttributePath & aPath, AttributeValueEncoder & aEncoder) override; + CHIP_ERROR Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) override; private: static constexpr uint16_t ClusterRevision = 1; @@ -48,6 +48,8 @@ class BridgedActionsAttrAccess : public AttributeAccessInterface CHIP_ERROR ReadClusterRevision(EndpointId endpoint, AttributeValueEncoder & aEncoder); }; +constexpr uint16_t BridgedActionsAttrAccess::ClusterRevision; + CHIP_ERROR BridgedActionsAttrAccess::ReadActionListAttribute(EndpointId endpoint, AttributeValueEncoder & aEncoder) { // Just return an empty list @@ -73,7 +75,7 @@ CHIP_ERROR BridgedActionsAttrAccess::ReadClusterRevision(EndpointId endpoint, At BridgedActionsAttrAccess gAttrAccess; -CHIP_ERROR BridgedActionsAttrAccess::Read(const ConcreteAttributePath & aPath, AttributeValueEncoder & aEncoder) +CHIP_ERROR BridgedActionsAttrAccess::Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) { VerifyOrDie(aPath.mClusterId == BridgedActions::Id); diff --git a/examples/all-clusters-app/all-clusters-common/src/static-supported-modes-manager.cpp b/examples/all-clusters-app/all-clusters-common/src/static-supported-modes-manager.cpp new file mode 100644 index 00000000000000..4f216bebd73e83 --- /dev/null +++ b/examples/all-clusters-app/all-clusters-common/src/static-supported-modes-manager.cpp @@ -0,0 +1,71 @@ +#include + +using namespace std; +using namespace chip; +using namespace chip::app::Clusters; +using namespace chip::app::Clusters::ModeSelect; + +using ModeOptionStructType = Structs::ModeOptionStruct::Type; +using storage_value_type = const ModeOptionStructType; +namespace { +Structs::ModeOptionStruct::Type buildModeOptionStruct(const char * label, uint8_t mode, uint32_t semanticTag) +{ + Structs::ModeOptionStruct::Type option; + option.label = CharSpan(label, strlen(label)); + option.mode = mode; + option.semanticTag = semanticTag; + return option; +} +} // namespace + +// TODO: Configure your options for each endpoint +storage_value_type StaticSupportedModesManager::coffeeOptions[] = { buildModeOptionStruct("Black", 0, 0), + buildModeOptionStruct("Cappuccino", 4, 0), + buildModeOptionStruct("Espresso", 7, 0) }; +const StaticSupportedModesManager::EndpointSpanPair + StaticSupportedModesManager::supportedOptionsByEndpoints[EMBER_AF_MODE_SELECT_CLUSTER_SERVER_ENDPOINT_COUNT] = { + EndpointSpanPair(1, Span(StaticSupportedModesManager::coffeeOptions)) // Options for Endpoint 1 + }; + +const StaticSupportedModesManager StaticSupportedModesManager::instance = StaticSupportedModesManager(); + +const SupportedModesManager::ModeOptionsProvider StaticSupportedModesManager::getModeOptionsProvider(EndpointId endpointId) const +{ + for (auto & endpointSpanPair : supportedOptionsByEndpoints) + { + if (endpointSpanPair.mEndpointId == endpointId) + { + return ModeOptionsProvider(endpointSpanPair.mSpan.data(), endpointSpanPair.mSpan.end()); + } + } + return ModeOptionsProvider(nullptr, nullptr); +} + +EmberAfStatus StaticSupportedModesManager::getModeOptionByMode(unsigned short endpointId, unsigned char mode, + const ModeOptionStructType ** dataPtr) const +{ + auto modeOptionsProvider = this->getModeOptionsProvider(endpointId); + if (modeOptionsProvider.begin() == nullptr) + { + return EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER; + } + auto * begin = this->getModeOptionsProvider(endpointId).begin(); + auto * end = this->getModeOptionsProvider(endpointId).end(); + + for (auto * it = begin; it != end; ++it) + { + auto & modeOption = *it; + if (modeOption.mode == mode) + { + *dataPtr = &modeOption; + return EMBER_ZCL_STATUS_SUCCESS; + } + } + emberAfPrintln(EMBER_AF_PRINT_DEBUG, "Cannot find the mode %" PRIu8, mode); + return EMBER_ZCL_STATUS_INVALID_VALUE; +} + +const ModeSelect::SupportedModesManager * ModeSelect::getSupportedModesManager() +{ + return &StaticSupportedModesManager::instance; +} diff --git a/examples/all-clusters-app/ameba/README.md b/examples/all-clusters-app/ameba/README.md index 38615327fa233f..69dfd29aa11c4c 100644 --- a/examples/all-clusters-app/ameba/README.md +++ b/examples/all-clusters-app/ameba/README.md @@ -10,7 +10,6 @@ control. - [Building the Example Application](#building-the-example-application) - [Commissioning and cluster control](#commissioning-and-cluster-control) - [Commissioning](#commissioning) - - [Bypass mode](#bypass-mode) - [BLE mode](#ble-mode) - [IP mode](#ip-mode) - [Cluster control](#cluster-control) @@ -59,36 +58,13 @@ The CHIP demo application is supported on ## Commissioning -There are three commissioning modes supported by Ameba platform: - -### Bypass mode - -1. In "connectedhomeip/config/ameba/args.gni" - - - set `chip_bypass_rendezvous = true` - - Set `chip_ip_commissioning = false` - - Set `chip_use_clusters_for_ip_commissioning = false` - - Set `chip_config_network_layer_ble = false` - -2. In "connectedhomeip/src/platform/Ameba/CHIPDevicePlatformConfig.h" - - - Set `#define CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE 0` - -3. Build and Flash -4. Use ATS\$ command to run all-cluster example. -5. Connect to AP using `ATW0, ATW1, ATWC` commands -6. Test with - [Chip-Tool](https://github.com/project-chip/connectedhomeip/tree/master/examples/chip-tool) - or - [Python Controller](https://github.com/project-chip/connectedhomeip/blob/master/docs/guides/python_chip_controller_building.md). +There are two commissioning modes supported by Ameba platform: ### BLE mode 1. In "connectedhomeip/config/ameba/args.gni" - set `chip_bypass_rendezvous = false` - - Set `chip_ip_commissioning = false` - - Set `chip_use_clusters_for_ip_commissioning = false` - Set `chip_config_network_layer_ble = true` 2. In "connectedhomeip/src/platform/Ameba/CHIPDevicePlatformConfig.h" @@ -107,8 +83,6 @@ There are three commissioning modes supported by Ameba platform: 1. In "connectedhomeip/config/ameba/args.gni" - set `chip_bypass_rendezvous = false` - - Set `chip_ip_commissioning = true` - - Set `chip_use_clusters_for_ip_commissioning = true` - Set `chip_config_network_layer_ble = false` 2. In "connectedhomeip/src/platform/Ameba/CHIPDevicePlatformConfig.h" diff --git a/examples/all-clusters-app/ameba/chip_main.cmake b/examples/all-clusters-app/ameba/chip_main.cmake index 7104367e829820..3c0aa18f15d08f 100755 --- a/examples/all-clusters-app/ameba/chip_main.cmake +++ b/examples/all-clusters-app/ameba/chip_main.cmake @@ -13,22 +13,6 @@ include(${prj_root}/GCC-RELEASE/project_hp/asdk/includepath.cmake) list( APPEND ${list_chip_main_sources} - #chip app - ${chip_dir}/src/app/Command.cpp - ${chip_dir}/src/app/CommandHandler.cpp - ${chip_dir}/src/app/InteractionModelEngine.cpp - ${chip_dir}/src/app/CommandSender.cpp - ${chip_dir}/src/app/decoder.cpp - ${chip_dir}/src/app/encoder-common.cpp - ${chip_dir}/src/app/EventManagement.cpp - ${chip_dir}/src/app/ReadClient.cpp - ${chip_dir}/src/app/ReadHandler.cpp - ${chip_dir}/src/app/WriteClient.cpp - ${chip_dir}/src/app/WriteHandler.cpp - ${chip_dir}/src/app/util/CHIPDeviceCallbacksMgr.cpp - ${chip_dir}/src/app/util/esi-management.cpp - ${chip_dir}/src/app/reporting/Engine.cpp - ${chip_dir}/zzz_generated/all-clusters-app/zap-generated/attribute-size.cpp ${chip_dir}/zzz_generated/all-clusters-app/zap-generated/CHIPClientCallbacks.cpp ${chip_dir}/zzz_generated/all-clusters-app/zap-generated/callback-stub.cpp @@ -36,6 +20,7 @@ list( ${chip_dir}/zzz_generated/all-clusters-app/zap-generated/CHIPClusters.cpp ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/bridged-actions-stub.cpp + ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/static-supported-modes-manager.cpp ${chip_dir}/examples/all-clusters-app/ameba/main/chipinterface.cpp ${chip_dir}/examples/all-clusters-app/ameba/main/DeviceCallbacks.cpp @@ -63,6 +48,7 @@ target_include_directories( ${chip_dir}/zzz_generated/all-clusters-app/zap-generated ${chip_dir}/zzz_generated/app-common ${chip_dir}/examples/all-clusters-app/all-clusters-common + ${chip_dir}/examples/all-clusters-app/all-clusters-common/include ${chip_dir}/examples/all-clusters-app/ameba/main/include ${chip_dir_output}/gen/include ${chip_dir}/src/include/ diff --git a/examples/all-clusters-app/ameba/main/chipinterface.cpp b/examples/all-clusters-app/ameba/main/chipinterface.cpp index d3059b23ca9764..e49d28aaca6c24 100644 --- a/examples/all-clusters-app/ameba/main/chipinterface.cpp +++ b/examples/all-clusters-app/ameba/main/chipinterface.cpp @@ -98,7 +98,7 @@ std::string createSetupPayload() ChipLogError(DeviceLayer, "Couldn't get discriminator: %s\r\n", ErrorStr(err)); return result; } - ChipLogProgress(DeviceLayer, "Setup discriminator: %u (0x%x)\r\n", discriminator, discriminator); + ChipLogProgress(DeviceLayer, "Setup discriminator: %d (0x%x)\r\n", discriminator, discriminator); uint32_t setupPINCode; err = ConfigurationMgr().GetSetupPinCode(setupPINCode); @@ -107,7 +107,7 @@ std::string createSetupPayload() ChipLogError(DeviceLayer, "Couldn't get setupPINCode: %s\r\n", ErrorStr(err)); return result; } - ChipLogProgress(DeviceLayer, "Setup PIN code: %u (0x%x)\r\n", setupPINCode, setupPINCode); + ChipLogProgress(DeviceLayer, "Setup PIN code: %lu (0x%lx)\r\n", setupPINCode, setupPINCode); uint16_t vendorId; err = ConfigurationMgr().GetVendorId(vendorId); @@ -180,7 +180,7 @@ std::string createSetupPayload() if (err != CHIP_NO_ERROR) { - ChipLogError(DeviceLayer, "Couldn't get payload string %\r\n" CHIP_ERROR_FORMAT, err.Format()); + ChipLogError(DeviceLayer, "Couldn't get payload string %lu\r\n" CHIP_ERROR_FORMAT, err.Format()); } return result; }; @@ -209,10 +209,11 @@ extern "C" void ChipTest(void) // Initialize device attestation config SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider()); - std::string qrCodeText = createSetupPayload(); - ChipLogProgress(DeviceLayer, "QR CODE Text: '%s'\r\n", qrCodeText.c_str()); - + if (RTW_SUCCESS != wifi_is_connected_to_ap()) { + std::string qrCodeText = createSetupPayload(); + ChipLogProgress(DeviceLayer, "QR CODE Text: '%s'\r\n", qrCodeText.c_str()); + std::vector qrCode(3 * qrCodeText.size() + 1); err = EncodeQRCodeToUrl(qrCodeText.c_str(), qrCodeText.size(), qrCode.data(), qrCode.max_size()); if (err == CHIP_NO_ERROR) diff --git a/examples/all-clusters-app/esp32/CMakeLists.txt b/examples/all-clusters-app/esp32/CMakeLists.txt index 024a42a8d4d43c..9685eac322e0b3 100644 --- a/examples/all-clusters-app/esp32/CMakeLists.txt +++ b/examples/all-clusters-app/esp32/CMakeLists.txt @@ -29,8 +29,6 @@ if(${IDF_TARGET} STREQUAL "esp32") list(APPEND EXTRA_COMPONENT_DIRS "${CMAKE_CURRENT_LIST_DIR}/../../common/m5stack-tft/repo/components/tft" "${CMAKE_CURRENT_LIST_DIR}/../../common/m5stack-tft/repo/components/spidriver" "${CMAKE_CURRENT_LIST_DIR}/../../common/screen-framework") -elseif(${IDF_TARGET} STREQUAL "esp32c3") - list(APPEND EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/examples/peripherals/rmt/led_strip/components") endif() project(chip-all-clusters-app) diff --git a/examples/all-clusters-app/esp32/README.md b/examples/all-clusters-app/esp32/README.md index 65e4eff495c53f..9aafdcad263a44 100644 --- a/examples/all-clusters-app/esp32/README.md +++ b/examples/all-clusters-app/esp32/README.md @@ -40,14 +40,14 @@ the riscv-esp32-elf toolchain for ESP32C3 modules. The VSCode devcontainer has these components pre-installed, so you can skip this step. To install these components manually, follow these steps: -- Clone the Espressif ESP-IDF and checkout - [v4.3 tag](https://github.com/espressif/esp-idf/releases/v4.3) +- Clone the Espressif ESP-IDF and checkout branch + [release/v4.4](https://github.com/espressif/esp-idf/tree/release/v4.4) $ mkdir ${HOME}/tools $ cd ${HOME}/tools $ git clone https://github.com/espressif/esp-idf.git $ cd esp-idf - $ git checkout v4.3 + $ git checkout release/v4.4 $ git submodule update --init $ ./install.sh diff --git a/examples/all-clusters-app/esp32/main/CMakeLists.txt b/examples/all-clusters-app/esp32/main/CMakeLists.txt index d342e16e5beff0..41e092378c7f5a 100644 --- a/examples/all-clusters-app/esp32/main/CMakeLists.txt +++ b/examples/all-clusters-app/esp32/main/CMakeLists.txt @@ -19,6 +19,7 @@ # The list of src and include dirs must be in sync with that in all-clusters-app/esp32/main/component.mk set(PRIV_INCLUDE_DIRS_LIST "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/zzz_generated/all-clusters-app" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/all-clusters-app/all-clusters-common/include" "${CMAKE_CURRENT_LIST_DIR}/include" ) set(SRC_DIRS_LIST @@ -26,6 +27,7 @@ set(SRC_DIRS_LIST "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/zzz_generated/all-clusters-app/zap-generated" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/zzz_generated/app-common/app-common/zap-generated/attributes" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/zzz_generated/app-common/app-common/zap-generated" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/platform/esp32/route_hook" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/platform/esp32/shell_extension" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/util" @@ -37,6 +39,7 @@ set(SRC_DIRS_LIST "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/on-off-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/level-control" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/identify-server" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/access-control-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/account-login-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/application-launcher-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/audio-output-server" @@ -55,7 +58,8 @@ set(SRC_DIRS_LIST "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/media-playback-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/ota-provider" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/target-navigator-server" - "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/thermostat-server" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/thermostat-server" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/thermostat-user-interface-configuration-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/thread_network_diagnostics_server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/tv-channel-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/scenes" @@ -70,6 +74,7 @@ set(SRC_DIRS_LIST "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/ethernet_network_diagnostics_server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/wifi_network_diagnostics_server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/pump-configuration-and-control-server" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/power-source-configuration-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/all-clusters-app/all-clusters-common/src" #${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/ias-zone-client ) @@ -116,11 +121,6 @@ target_compile_options(${COMPONENT_LIB} PRIVATE "-DLWIP_IPV6_SCOPES=0" "-DCHIP_H if (CONFIG_ENABLE_PW_RPC) -idf_component_get_property(chip_lib chip COMPONENT_LIB) - -set(WRAP_FUNCTIONS esp_log_write) -target_link_libraries(${chip_lib} INTERFACE "-Wl,--wrap=${WRAP_FUNCTIONS}") - get_filename_component(CHIP_ROOT ../third_party/connectedhomeip REALPATH) set(PIGWEED_ROOT "${CHIP_ROOT}/third_party/pigweed/repo") @@ -217,10 +217,16 @@ target_link_libraries(${COMPONENT_LIB} PUBLIC pw_trace_tokenized.protos.nanopb_rpc ) -set_property(TARGET ${chip_lib} APPEND PROPERTY LINK_LIBRARIES ${COMPONENT_LIB}) -target_include_directories(${chip_lib} PUBLIC - "$/protocol_buffer/gen/third_party/connectedhomeip/third_party/pigweed/repo/pw_rpc/protos.proto_library/nanopb_rpc" - "$/protocol_buffer/gen/third_party/connectedhomeip/third_party/pigweed/repo/pw_rpc/protos.proto_library/nanopb" - "$/protocol_buffer/gen/third_party/connectedhomeip/third_party/pigweed/repo/pw_rpc/protos.proto_library/pwpb") +target_link_options(${COMPONENT_LIB} + PUBLIC + "-T${PIGWEED_ROOT}/pw_tokenizer/pw_tokenizer_linker_sections.ld" +) + +target_compile_options(${COMPONENT_LIB} PRIVATE + "-DPW_RPC_ATTRIBUTE_SERVICE=1" + "-DPW_RPC_BUTTON_SERVICE=1" + "-DPW_RPC_DEVICE_SERVICE=1" + "-DPW_RPC_LIGHTING_SERVICE=1" + "-DPW_RPC_LOCKING_SERVICE=1") endif (CONFIG_ENABLE_PW_RPC) diff --git a/examples/all-clusters-app/esp32/main/DeviceCallbacks.cpp b/examples/all-clusters-app/esp32/main/DeviceCallbacks.cpp index 9c6f54421bbe9b..edccd2b899e960 100644 --- a/examples/all-clusters-app/esp32/main/DeviceCallbacks.cpp +++ b/examples/all-clusters-app/esp32/main/DeviceCallbacks.cpp @@ -28,11 +28,15 @@ #include "Globals.h" #include "LEDWidget.h" #include "WiFiWidget.h" +#include "esp_check.h" +#include "esp_err.h" #include "esp_heap_caps.h" #include "esp_log.h" +#include "route_hook/esp_route_hook.h" #include #include #include +#include #include #include #include @@ -46,9 +50,48 @@ using namespace ::chip::Inet; using namespace ::chip::System; using namespace ::chip::DeviceLayer; -uint32_t identifyTimerCount; constexpr uint32_t kIdentifyTimerDelayMS = 250; +void OnIdentifyTriggerEffect(Identify * identify) +{ + switch (identify->mCurrentEffectIdentifier) + { + case EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_BLINK: + statusLED1.Blink(kIdentifyTimerDelayMS * 2); + ChipLogProgress(Zcl, "EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_BLINK"); + break; + case EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_BREATHE: + ChipLogProgress(Zcl, "EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_BREATHE"); + break; + case EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_OKAY: + ChipLogProgress(Zcl, "EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_OKAY"); + break; + case EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_CHANNEL_CHANGE: + ChipLogProgress(Zcl, "EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_CHANNEL_CHANGE"); + break; + default: + ChipLogProgress(Zcl, "No identifier effect"); + break; + } + return; +} + +Identify gIdentify0 = { + chip::EndpointId{ 0 }, + [](Identify *) { ChipLogProgress(Zcl, "onIdentifyStart"); }, + [](Identify *) { ChipLogProgress(Zcl, "onIdentifyStop"); }, + EMBER_ZCL_IDENTIFY_IDENTIFY_TYPE_VISIBLE_LED, + OnIdentifyTriggerEffect, +}; + +Identify gIdentify1 = { + chip::EndpointId{ 1 }, + [](Identify *) { ChipLogProgress(Zcl, "onIdentifyStart"); }, + [](Identify *) { ChipLogProgress(Zcl, "onIdentifyStop"); }, + EMBER_ZCL_IDENTIFY_IDENTIFY_TYPE_VISIBLE_LED, + OnIdentifyTriggerEffect, +}; + void DeviceCallbacks::DeviceEventCallback(const ChipDeviceEvent * event, intptr_t arg) { switch (event->Type) @@ -83,6 +126,10 @@ void DeviceCallbacks::DeviceEventCallback(const ChipDeviceEvent * event, intptr_ // newly selected address. chip::app::DnssdServer::Instance().StartServer(); } + if (event->InterfaceIpAddressChanged.Type == InterfaceIpChangeType::kIpV6_Assigned) + { + ESP_ERROR_CHECK(esp_route_hook_init(esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"))); + } break; } @@ -101,10 +148,6 @@ void DeviceCallbacks::PostAttributeChangeCallback(EndpointId endpointId, Cluster OnOnOffPostAttributeChangeCallback(endpointId, attributeId, value); break; - case ZCL_IDENTIFY_CLUSTER_ID: - OnIdentifyPostAttributeChangeCallback(endpointId, attributeId, value); - break; - case ZCL_LEVEL_CONTROL_CLUSTER_ID: OnLevelControlAttributeChangeCallback(endpointId, attributeId, value); break; @@ -211,37 +254,6 @@ void DeviceCallbacks::OnColorControlAttributeChangeCallback(EndpointId endpointI } #endif -void IdentifyTimerHandler(Layer * systemLayer, void * appState) -{ - statusLED1.Animate(); - - if (identifyTimerCount) - { - systemLayer->StartTimer(Clock::Milliseconds32(kIdentifyTimerDelayMS), IdentifyTimerHandler, appState); - // Decrement the timer count. - identifyTimerCount--; - } -} - -void DeviceCallbacks::OnIdentifyPostAttributeChangeCallback(EndpointId endpointId, AttributeId attributeId, uint8_t * value) -{ - VerifyOrExit(attributeId == ZCL_IDENTIFY_TIME_ATTRIBUTE_ID, ESP_LOGI(TAG, "Unhandled Attribute ID: '0x%04x", attributeId)); - VerifyOrExit(endpointId == 1, ESP_LOGE(TAG, "Unexpected EndPoint ID: `0x%02x'", endpointId)); - - statusLED1.Blink(kIdentifyTimerDelayMS * 2); - - // timerCount represents the number of callback executions before we stop the timer. - // value is expressed in seconds and the timer is fired every 250ms, so just multiply value by 4. - // Also, we want timerCount to be odd number, so the ligth state ends in the same state it starts. - identifyTimerCount = (*value) * 4; - - DeviceLayer::SystemLayer().CancelTimer(IdentifyTimerHandler, this); - DeviceLayer::SystemLayer().StartTimer(Clock::Milliseconds32(kIdentifyTimerDelayMS), IdentifyTimerHandler, this); - -exit: - return; -} - bool emberAfBasicClusterMfgSpecificPingCallback(chip::app::Command * commandObj) { emberAfSendDefaultResponse(emberAfCurrentCommand(), EMBER_ZCL_STATUS_SUCCESS); diff --git a/examples/all-clusters-app/esp32/main/Kconfig.projbuild b/examples/all-clusters-app/esp32/main/Kconfig.projbuild index 0960168aadca4a..e82f04f2ac00e5 100644 --- a/examples/all-clusters-app/esp32/main/Kconfig.projbuild +++ b/examples/all-clusters-app/esp32/main/Kconfig.projbuild @@ -140,3 +140,12 @@ depends on ENABLE_PW_RPC about available pin numbers for UART. endmenu + +menu "OTA Options" + + config ENABLE_OTA_REQUESTOR + bool "Enable OTA Requestor" + default y + help + Enable this option to enable the OTA Requestor +endmenu diff --git a/examples/all-clusters-app/esp32/main/Rpc.cpp b/examples/all-clusters-app/esp32/main/Rpc.cpp deleted file mode 100644 index 0de247455fcd61..00000000000000 --- a/examples/all-clusters-app/esp32/main/Rpc.cpp +++ /dev/null @@ -1,352 +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 "sdkconfig.h" -#if CONFIG_ENABLE_PW_RPC -#include "PigweedLoggerMutex.h" -#include "RpcService.h" -#include "esp_log.h" -#include "freertos/FreeRTOS.h" -#include "freertos/event_groups.h" -#include "freertos/semphr.h" -#include "freertos/task.h" -#include "pw_log/log.h" -#include "pw_rpc/server.h" -#include "pw_sys_io/sys_io.h" -#include "rpc_services/Attributes.h" -#include "rpc_services/Button.h" -#include "rpc_services/Device.h" -#include "rpc_services/Lighting.h" -#include "rpc_services/Locking.h" - -#include - -#include "ScreenManager.h" -#include "esp_event.h" -#include "esp_log.h" -#include "esp_netif.h" -#include "esp_system.h" -#include "esp_wifi.h" -#include "freertos/FreeRTOS.h" -#include "freertos/semphr.h" -#include "freertos/timers.h" -#include "pw_containers/flat_map.h" -#include "pw_status/status.h" -#include "pw_status/try.h" -#include "pw_trace_tokenized/trace_rpc_service_nanopb.h" -#include "wifi_service/wifi_service.rpc.pb.h" -#include - -#include "WiFiProvisioning.h" - -#include "ESP32Utils.h" - -static const char * TAG = "RPC"; - -// Define trace time for pw_trace -PW_TRACE_TIME_TYPE pw_trace_GetTraceTime() -{ - return (PW_TRACE_TIME_TYPE) chip::System::SystemClock().GetMonotonicMicroseconds64().count(); -} -// Microsecond time source -size_t pw_trace_GetTraceTimeTicksPerSecond() -{ - return 1000000; -} - -namespace chip { -namespace rpc { -namespace { - -constexpr pw::containers::FlatMap kChannelToFreqMap({ { - { 1, 2412 }, { 2, 2417 }, { 3, 2422 }, { 4, 2427 }, { 5, 2432 }, { 6, 2437 }, { 7, 2442 }, { 8, 2447 }, - { 9, 2452 }, { 10, 2457 }, { 11, 2462 }, { 12, 2467 }, { 13, 2472 }, { 14, 2484 }, { 32, 5160 }, { 34, 5170 }, - { 36, 5180 }, { 38, 5190 }, { 40, 5200 }, { 42, 5210 }, { 44, 5220 }, { 46, 5230 }, { 48, 5240 }, { 50, 5250 }, - { 52, 5260 }, { 54, 5270 }, { 56, 5280 }, { 58, 5290 }, { 60, 5300 }, { 62, 5310 }, { 64, 5320 }, { 68, 5340 }, - { 96, 5480 }, { 100, 5500 }, { 102, 5510 }, { 104, 5520 }, { 106, 5530 }, { 108, 5540 }, { 110, 5550 }, { 112, 5560 }, - { 114, 5570 }, { 116, 5580 }, { 118, 5590 }, { 120, 5600 }, { 122, 5610 }, { 124, 5620 }, { 126, 5630 }, { 128, 5640 }, - { 132, 5660 }, { 134, 5670 }, { 136, 5680 }, { 138, 5690 }, { 140, 5700 }, { 142, 5710 }, { 144, 5720 }, { 149, 5745 }, - { 151, 5755 }, { 153, 5765 }, { 155, 5775 }, { 157, 5785 }, { 159, 5795 }, { 161, 5805 }, { 165, 5825 }, { 169, 5845 }, - { 173, 5865 }, { 183, 4915 }, { 184, 4920 }, { 185, 4925 }, { 187, 4935 }, { 188, 4940 }, { 189, 4945 }, { 192, 4960 }, - { 196, 4980 }, -} }); - -// These are potentially large objects for the scan results. -constexpr size_t kScanRecordsMax = sizeof(chip_rpc_ScanResults().aps) / sizeof(chip_rpc_ScanResult); -chip_rpc_ScanResults out_scan_records; -wifi_ap_record_t scan_records[kScanRecordsMax]; - -class Esp32Button final : public Button -{ -public: - pw::Status Event(ServerContext &, const chip_rpc_ButtonEvent & request, pw_protobuf_Empty & response) override - { -#if CONFIG_DEVICE_TYPE_M5STACK - if (request.pushed) - { - ScreenManager::ButtonPressed(1 + request.idx); - } - return pw::OkStatus(); -#else // CONFIG_DEVICE_TYPE_M5STACK - return pw::Status::Unimplemented(); -#endif // CONFIG_DEVICE_TYPE_M5STACK - } -}; - -class Esp32Device final : public Device -{ -public: - pw::Status Reboot(ServerContext & ctx, const pw_protobuf_Empty & request, pw_protobuf_Empty & response) override - { - mRebootTimer = xTimerCreateStatic("Reboot", kRebootTimerPeriodTicks, false, nullptr, RebootHandler, &mRebootTimerBuffer); - xTimerStart(mRebootTimer, 0); - return pw::OkStatus(); - } - -private: - static constexpr TickType_t kRebootTimerPeriodTicks = 1000; - TimerHandle_t mRebootTimer; - StaticTimer_t mRebootTimerBuffer; - - static void RebootHandler(TimerHandle_t) { esp_restart(); } -}; - -class Wifi final : public generated::Wifi -{ -public: - pw::Status GetChannel(ServerContext &, const pw_protobuf_Empty & request, chip_rpc_Channel & response) - { - uint8_t channel = 0; - wifi_second_chan_t second; - PW_TRY(EspToPwStatus(esp_wifi_get_channel(&channel, &second))); - response.channel = channel; - return pw::OkStatus(); - } - - pw::Status GetSsid(ServerContext &, const pw_protobuf_Empty & request, chip_rpc_Ssid & response) - { - wifi_config_t config; - PW_TRY(EspToPwStatus(esp_wifi_get_config(WIFI_IF_STA, &config))); - size_t size = std::min(sizeof(response.ssid.bytes), sizeof(config.sta.ssid)); - memcpy(response.ssid.bytes, config.sta.ssid, size); - response.ssid.size = size; - return pw::OkStatus(); - } - - pw::Status GetState(ServerContext &, const pw_protobuf_Empty & request, chip_rpc_State & response) - { - wifi_ap_record_t ap_info; - esp_err_t err = esp_wifi_sta_get_ap_info(&ap_info); - PW_TRY(EspToPwStatus(err)); - response.connected = (err != ESP_ERR_WIFI_NOT_CONNECT); - return pw::OkStatus(); - } - - pw::Status GetMacAddress(ServerContext &, const pw_protobuf_Empty & request, chip_rpc_MacAddress & response) - { - uint8_t mac[6]; - PW_TRY(EspToPwStatus(esp_wifi_get_mac(WIFI_IF_STA, mac))); - snprintf(response.mac_address, sizeof(response.mac_address), "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); - return pw::OkStatus(); - } - - pw::Status GetWiFiInterface(ServerContext &, const pw_protobuf_Empty & request, chip_rpc_WiFiInterface & response) - { - wifi_ap_record_t ap_info; - PW_TRY(EspToPwStatus(esp_wifi_sta_get_ap_info(&ap_info))); - snprintf(response.interface, sizeof(response.interface), "STA"); - return pw::OkStatus(); - } - - pw::Status GetIP4Address(ServerContext &, const pw_protobuf_Empty & request, chip_rpc_IP4Address & response) - { - esp_netif_ip_info_t ip_info; - PW_TRY(EspToPwStatus(esp_netif_get_ip_info(esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"), &ip_info))); - snprintf(response.address, sizeof(response.address), IPSTR, IP2STR(&ip_info.ip)); - return pw::OkStatus(); - } - - pw::Status GetIP6Address(ServerContext &, const pw_protobuf_Empty & request, chip_rpc_IP6Address & response) - { - esp_ip6_addr_t ip6; - PW_TRY(EspToPwStatus(esp_netif_get_ip6_linklocal(esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"), &ip6))); - snprintf(response.address, sizeof(response.address), IPV6STR, IPV62STR(ip6)); - return pw::OkStatus(); - } - - // NOTE: Currently this is blocking, it can be made non-blocking if needed - // but would require another worker thread to handle the scanning. - void StartScan(ServerContext &, const chip_rpc_ScanConfig & request, ServerWriter & writer) - { - wifi_scan_config_t scan_config; - if (request.ssid_count != 0) - { - scan_config.ssid = const_cast(reinterpret_cast(request.ssid[0].bytes)); - } - if (request.bssid_count != 0) - { - scan_config.bssid = const_cast(reinterpret_cast(request.bssid[0].bytes)); - } - scan_config.channel = request.channel; - scan_config.show_hidden = request.show_hidden; - scan_config.scan_type = static_cast(request.active_scan); - if (request.active_scan) - { - scan_config.scan_time.active.min = request.scan_time_min_ms; - scan_config.scan_time.active.max = request.scan_time_max_ms; - } - else - { - scan_config.scan_time.passive = request.scan_time_min_ms; - } - - auto err = esp_wifi_scan_start(&scan_config, true /* block */); - if (ESP_OK != err) - { - ESP_LOGI(TAG, "Error starting scan: %d", err); - return; - } - - // Output scan results - uint16_t num_scan_records = kScanRecordsMax; - err = esp_wifi_scan_get_ap_records(&num_scan_records, scan_records); - if (ESP_OK != err) - { - ESP_LOGI(TAG, "Error getting scanned APs: %d", err); - num_scan_records = 0; - } - ESP_LOGI(TAG, "%d", num_scan_records); - out_scan_records.aps_count = num_scan_records; - - for (size_t i = 0; i < num_scan_records; ++i) - { - out_scan_records.aps[i].ssid.size = std::min(sizeof(scan_records[i].ssid), sizeof(out_scan_records.aps[i].ssid.bytes)); - memcpy(out_scan_records.aps[i].ssid.bytes, scan_records[i].ssid, out_scan_records.aps[i].ssid.size); - out_scan_records.aps[i].bssid.size = - std::min(sizeof(scan_records[i].bssid), sizeof(out_scan_records.aps[i].bssid.bytes)); - memcpy(out_scan_records.aps[i].bssid.bytes, scan_records[i].bssid, out_scan_records.aps[i].bssid.size); - out_scan_records.aps[i].security_type = static_cast(scan_records[i].authmode); - out_scan_records.aps[i].channel = scan_records[i].primary; - auto found_channel = kChannelToFreqMap.find(scan_records[i].primary); - out_scan_records.aps[i].frequency = (found_channel ? found_channel->second : 0); - out_scan_records.aps[i].signal = scan_records[i].rssi; - } - writer.Write(out_scan_records); - writer.Finish(); - } - - pw::Status StopScan(ServerContext &, const pw_protobuf_Empty & request, pw_protobuf_Empty & response) - { - esp_wifi_scan_stop(); - return pw::OkStatus(); - } - - pw::Status Connect(ServerContext &, const chip_rpc_ConnectionData & request, chip_rpc_ConnectionResult & response) - { - char ssid[sizeof(wifi_config_t().sta.ssid)]; - char password[sizeof(wifi_config_t().sta.password)]; - size_t ssid_size = std::min(sizeof(ssid) - 1, static_cast(request.ssid.size)); - memcpy(ssid, request.ssid.bytes, ssid_size); - ssid[ssid_size] = '\0'; - size_t password_size = std::min(sizeof(password) - 1, static_cast(request.secret.size)); - memcpy(password, request.secret.bytes, password_size); - password[password_size] = '\0'; - return SetWiFiStationProvisioning(ssid, password) == CHIP_NO_ERROR ? pw::OkStatus() : pw::Status::Unknown(); - } - - pw::Status Disconnect(ServerContext &, const pw_protobuf_Empty & request, pw_protobuf_Empty & response) - { - chip::DeviceLayer::ConnectivityMgr().ClearWiFiStationProvision(); - chip::DeviceLayer::ConnectivityMgr().SetWiFiStationMode(chip::DeviceLayer::ConnectivityManager::kWiFiStationMode_Disabled); - return pw::OkStatus(); - } - -private: - static constexpr pw::Status EspToPwStatus(esp_err_t err) - { - switch (err) - { - case ESP_OK: - return pw::OkStatus(); - case ESP_ERR_WIFI_NOT_INIT: - return pw::Status::FailedPrecondition(); - case ESP_ERR_INVALID_ARG: - return pw::Status::InvalidArgument(); - case ESP_ERR_ESP_NETIF_INVALID_PARAMS: - return pw::Status::InvalidArgument(); - case ESP_ERR_WIFI_IF: - return pw::Status::NotFound(); - case ESP_ERR_WIFI_NOT_CONNECT: - return pw::Status::FailedPrecondition(); - case ESP_ERR_WIFI_NOT_STARTED: - return pw::Status::FailedPrecondition(); - case ESP_ERR_WIFI_CONN: - return pw::Status::Internal(); - case ESP_FAIL: - return pw::Status::Internal(); - default: - return pw::Status::Unknown(); - } - } -}; - -constexpr size_t kRpcStackSizeBytes = (8 * 1024); -constexpr uint8_t kRpcTaskPriority = 5; - -TaskHandle_t rpcTaskHandle; - -Attributes attributes_service; -Esp32Button button_service; -Esp32Device device_service; -Lighting lighting_service; -Locking locking_service; -Wifi wifi_service; -pw::trace::TraceService trace_service; - -void RegisterServices(pw::rpc::Server & server) -{ - server.RegisterService(attributes_service); - server.RegisterService(button_service); - server.RegisterService(device_service); - server.RegisterService(lighting_service); - server.RegisterService(locking_service); - server.RegisterService(wifi_service); - server.RegisterService(trace_service); - PW_TRACE_SET_ENABLED(true); -} - -void RunRpcService(void *) -{ - Start(RegisterServices, &logger_mutex); -} - -} // namespace - -void Init() -{ - PigweedLogger::init(); - - ESP_LOGI(TAG, "----------- esp32-rpc-service starting -----------"); - - xTaskCreate(RunRpcService, "RPC", kRpcStackSizeBytes / sizeof(StackType_t), nullptr, kRpcTaskPriority, &rpcTaskHandle); -} - -} // namespace rpc -} // namespace chip - -#endif // CONFIG_ENABLE_PW_RPC diff --git a/examples/all-clusters-app/esp32/main/include/DeviceCallbacks.h b/examples/all-clusters-app/esp32/main/include/DeviceCallbacks.h index c4549e6d3a938d..91cfcba3936eea 100644 --- a/examples/all-clusters-app/esp32/main/include/DeviceCallbacks.h +++ b/examples/all-clusters-app/esp32/main/include/DeviceCallbacks.h @@ -45,7 +45,5 @@ class DeviceCallbacks : public chip::DeviceManager::CHIPDeviceManagerCallbacks #if CONFIG_DEVICE_TYPE_ESP32_C3_DEVKITM void OnColorControlAttributeChangeCallback(chip::EndpointId endpointId, chip::AttributeId attributeId, uint8_t * value); #endif - void OnIdentifyPostAttributeChangeCallback(chip::EndpointId endpointId, chip::AttributeId attributeId, uint8_t * value); - bool mEndpointOnOffState[2]; }; diff --git a/examples/all-clusters-app/esp32/main/main.cpp b/examples/all-clusters-app/esp32/main/main.cpp index df04e343603201..d6d8cf49d51aeb 100644 --- a/examples/all-clusters-app/esp32/main/main.cpp +++ b/examples/all-clusters-app/esp32/main/main.cpp @@ -81,8 +81,6 @@ using namespace ::chip::Credentials; using namespace ::chip::DeviceManager; using namespace ::chip::DeviceLayer; -#define QRCODE_BASE_URL "https://dhrishi.github.io/connectedhomeip/qrcode.html" - #if CONFIG_DEVICE_TYPE_M5STACK #define BUTTON_1_GPIO_NUM GPIO_NUM_39 // Left button on M5Stack @@ -495,125 +493,11 @@ void SetupPretendDevices() AddAttribute("State", "Closed"); } -void GetGatewayIP(char * ip_buf, size_t ip_len) -{ - esp_netif_ip_info_t ipInfo; - esp_netif_get_ip_info(esp_netif_get_handle_from_ifkey("WIFI_AP_DEF"), &ipInfo); - esp_ip4addr_ntoa(&ipInfo.ip, ip_buf, ip_len); - ESP_LOGI(TAG, "Got gateway ip %s", ip_buf); -} - -bool isRendezvousBLE() -{ - RendezvousInformationFlags flags = RendezvousInformationFlags(CONFIG_RENDEZVOUS_MODE); - return flags.Has(RendezvousInformationFlag::kBLE); -} - -std::string createSetupPayload() -{ - CHIP_ERROR err = CHIP_NO_ERROR; - std::string result; - - uint16_t discriminator; - err = ConfigurationMgr().GetSetupDiscriminator(discriminator); - if (err != CHIP_NO_ERROR) - { - ESP_LOGE(TAG, "Couldn't get discriminator: %s", ErrorStr(err)); - return result; - } - ESP_LOGI(TAG, "Setup discriminator: %u (0x%x)", discriminator, discriminator); - - uint32_t setupPINCode; - err = ConfigurationMgr().GetSetupPinCode(setupPINCode); - if (err != CHIP_NO_ERROR) - { - ESP_LOGE(TAG, "Couldn't get setupPINCode: %s", ErrorStr(err)); - return result; - } - ESP_LOGI(TAG, "Setup PIN code: %u (0x%x)", setupPINCode, setupPINCode); - - uint16_t vendorId; - err = ConfigurationMgr().GetVendorId(vendorId); - if (err != CHIP_NO_ERROR) - { - ESP_LOGE(TAG, "Couldn't get vendorId: %s", ErrorStr(err)); - return result; - } - - uint16_t productId; - err = ConfigurationMgr().GetProductId(productId); - if (err != CHIP_NO_ERROR) - { - ESP_LOGE(TAG, "Couldn't get productId: %s", ErrorStr(err)); - return result; - } - - SetupPayload payload; - payload.version = 0; - payload.discriminator = discriminator; - payload.setUpPINCode = setupPINCode; - payload.rendezvousInformation = RendezvousInformationFlags(CONFIG_RENDEZVOUS_MODE); - payload.vendorID = vendorId; - payload.productID = productId; - - if (!isRendezvousBLE()) - { - char gw_ip[INET6_ADDRSTRLEN]; - GetGatewayIP(gw_ip, sizeof(gw_ip)); - payload.addOptionalVendorData(EXAMPLE_VENDOR_TAG_IP, gw_ip); - - QRCodeSetupPayloadGenerator generator(payload); - - size_t tlvDataLen = sizeof(gw_ip); - uint8_t tlvDataStart[tlvDataLen]; - err = generator.payloadBase38Representation(result, tlvDataStart, tlvDataLen); - } - else - { - QRCodeSetupPayloadGenerator generator(payload); - err = generator.payloadBase38Representation(result); - } - - { - ManualSetupPayloadGenerator generator(payload); - std::string outCode; - - if (generator.payloadDecimalStringRepresentation(outCode) == CHIP_NO_ERROR) - { - ESP_LOGI(TAG, "Short Manual(decimal) setup code: %s", outCode.c_str()); - } - else - { - ESP_LOGE(TAG, "Failed to get decimal setup code"); - } - - payload.commissioningFlow = CommissioningFlow::kCustom; - generator = ManualSetupPayloadGenerator(payload); - - if (generator.payloadDecimalStringRepresentation(outCode) == CHIP_NO_ERROR) - { - // intentional extra space here to align the log with the short code - ESP_LOGI(TAG, "Long Manual(decimal) setup code: %s", outCode.c_str()); - } - else - { - ESP_LOGE(TAG, "Failed to get decimal setup code"); - } - } - - if (err != CHIP_NO_ERROR) - { - ESP_LOGE(TAG, "Couldn't get payload string %" CHIP_ERROR_FORMAT, err.Format()); - } - return result; -}; - WiFiWidget pairingWindowLED; class AppCallbacks : public AppDelegate { public: - void OnReceiveError() override { statusLED1.BlinkOnError(); } void OnRendezvousStarted() override { bluetoothLED.Set(true); } void OnRendezvousStopped() override { @@ -696,20 +580,14 @@ extern "C" void app_main() chip::DeviceLayer::PlatformMgr().ScheduleWork(InitServer, reinterpret_cast(nullptr)); - std::string qrCodeText = createSetupPayload(); - ESP_LOGI(TAG, "QR CODE Text: '%s'", qrCodeText.c_str()); - - { - std::vector qrCode(3 * qrCodeText.size() + 1); - CHIP_ERROR error = EncodeQRCodeToUrl(qrCodeText.c_str(), qrCodeText.size(), qrCode.data(), qrCode.max_size()); - if (error == CHIP_NO_ERROR) - { - ESP_LOGI(TAG, "Copy/paste the below URL in a browser to see the QR CODE:\n\t%s?data=%s", QRCODE_BASE_URL, - qrCode.data()); - } - } + // Print QR Code URL + PrintOnboardingCodes(chip::RendezvousInformationFlags(CONFIG_RENDEZVOUS_MODE)); #if CONFIG_HAVE_DISPLAY + std::string qrCodeText; + + GetQRCode(qrCodeText, chip::RendezvousInformationFlags(CONFIG_RENDEZVOUS_MODE)); + // Initialize the display device. err = InitDisplay(); if (err != ESP_OK) @@ -804,10 +682,10 @@ extern "C" void app_main() #endif // CONFIG_HAVE_DISPLAY +#if CONFIG_DEVICE_TYPE_M5STACK // Run the UI Loop while (true) { -#if CONFIG_DEVICE_TYPE_M5STACK // TODO consider refactoring this example to use FreeRTOS tasks bool woken = false; @@ -832,10 +710,9 @@ extern "C" void app_main() } } -#endif // CONFIG_DEVICE_TYPE_M5STACK - vTaskDelay(50 / portTICK_PERIOD_MS); } +#endif // CONFIG_DEVICE_TYPE_M5STACK } bool lowPowerClusterSleep() diff --git a/examples/all-clusters-app/esp32/partitions.csv b/examples/all-clusters-app/esp32/partitions.csv index 665b8fe311bd5e..43acef25d0245d 100644 --- a/examples/all-clusters-app/esp32/partitions.csv +++ b/examples/all-clusters-app/esp32/partitions.csv @@ -1,6 +1,8 @@ # Name, Type, SubType, Offset, Size, Flags # Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap nvs, data, nvs, , 0x6000, +otadata, data, ota, , 0x2000, phy_init, data, phy, , 0x1000, -factory, app, factory, , 1900K, +ota_0, app, ota_0, , 1500K, +ota_1, app, ota_1, , 1500K, ot_storage, data, 0x3a, , 0x2000, diff --git a/examples/all-clusters-app/esp32/sdkconfig.defaults b/examples/all-clusters-app/esp32/sdkconfig.defaults index 52d7e229e3337f..a3a17d6ef7c47d 100644 --- a/examples/all-clusters-app/esp32/sdkconfig.defaults +++ b/examples/all-clusters-app/esp32/sdkconfig.defaults @@ -36,11 +36,20 @@ CONFIG_LWIP_IPV6_AUTOCONFIG=y # Use a custom partition table CONFIG_PARTITION_TABLE_CUSTOM=y -CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" # Vendor and product id CONFIG_DEVICE_VENDOR_ID=0x235A CONFIG_DEVICE_PRODUCT_ID=0x4541 +CONFIG_DEVICE_FIRMWARE_REVISION="prerelease" #enable debug shell CONFIG_ENABLE_CHIP_SHELL=y + +#enable lwIP route hooks +CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT=y +CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT=y + +# Serial Flasher config +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +CONFIG_ESPTOOLPY_FLASHSIZE="4MB" diff --git a/examples/all-clusters-app/esp32/sdkconfig_c3devkit.defaults b/examples/all-clusters-app/esp32/sdkconfig_c3devkit.defaults index a636628c96567d..737935b166f98f 100644 --- a/examples/all-clusters-app/esp32/sdkconfig_c3devkit.defaults +++ b/examples/all-clusters-app/esp32/sdkconfig_c3devkit.defaults @@ -38,5 +38,12 @@ CONFIG_LWIP_IPV6_AUTOCONFIG=y # Use a custom partition table CONFIG_PARTITION_TABLE_CUSTOM=y -CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +#enable lwIP route hooks +CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT=y +CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT=y + +# Serial Flasher config +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +CONFIG_ESPTOOLPY_FLASHSIZE="4MB" diff --git a/examples/all-clusters-app/esp32/sdkconfig_m5stack.defaults b/examples/all-clusters-app/esp32/sdkconfig_m5stack.defaults index 8e79b8ea82df50..5c318378f51189 100644 --- a/examples/all-clusters-app/esp32/sdkconfig_m5stack.defaults +++ b/examples/all-clusters-app/esp32/sdkconfig_m5stack.defaults @@ -38,7 +38,7 @@ CONFIG_LWIP_IPV6_AUTOCONFIG=y # Use a custom partition table CONFIG_PARTITION_TABLE_CUSTOM=y -CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" # Vendor and product id CONFIG_DEVICE_VENDOR_ID=0x235A @@ -50,3 +50,12 @@ CONFIG_ESP_MAIN_TASK_STACK_SIZE=5120 #enable debug shell CONFIG_ENABLE_CHIP_SHELL=y + +#enable lwIP route hooks +CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT=y +CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT=y + +# Serial Flasher config +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +CONFIG_ESPTOOLPY_FLASHSIZE="4MB" + diff --git a/examples/all-clusters-app/esp32/sdkconfig_m5stack_rpc.defaults b/examples/all-clusters-app/esp32/sdkconfig_m5stack_rpc.defaults index 2da74647c0f5fc..75142a9c7c54c6 100644 --- a/examples/all-clusters-app/esp32/sdkconfig_m5stack_rpc.defaults +++ b/examples/all-clusters-app/esp32/sdkconfig_m5stack_rpc.defaults @@ -38,7 +38,7 @@ CONFIG_LWIP_IPV6_AUTOCONFIG=y # Use a custom partition table CONFIG_PARTITION_TABLE_CUSTOM=y -CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" # Vendor and product id CONFIG_DEVICE_VENDOR_ID=0x235A @@ -56,4 +56,8 @@ CONFIG_EXAMPLE_UART_TXD=1 CONFIG_ENABLE_PW_RPC=y # Disable shell -CONFIG_ENABLE_CHIP_SHELL=n \ No newline at end of file +CONFIG_ENABLE_CHIP_SHELL=n + +# Serial Flasher config +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +CONFIG_ESPTOOLPY_FLASHSIZE="4MB" diff --git a/examples/all-clusters-app/linux/BUILD.gn b/examples/all-clusters-app/linux/BUILD.gn index f7b180f4461187..351b79e8f5f316 100644 --- a/examples/all-clusters-app/linux/BUILD.gn +++ b/examples/all-clusters-app/linux/BUILD.gn @@ -18,6 +18,7 @@ import("//build_overrides/chip.gni") executable("chip-all-clusters-app") { sources = [ "${chip_root}/examples/all-clusters-app/all-clusters-common/src/bridged-actions-stub.cpp", + "${chip_root}/examples/all-clusters-app/all-clusters-common/src/static-supported-modes-manager.cpp", "include/tv-callbacks.cpp", "main.cpp", ] @@ -28,6 +29,9 @@ executable("chip-all-clusters-app") { "${chip_root}/src/lib", ] + include_dirs = + [ "${chip_root}/examples/all-clusters-app/all-clusters-common/include" ] + cflags = [ "-Wconversion" ] output_dir = root_out_dir diff --git a/examples/all-clusters-app/mbed/CMakeLists.txt b/examples/all-clusters-app/mbed/CMakeLists.txt index a05bf5cca47a4a..a71393a6880cfa 100644 --- a/examples/all-clusters-app/mbed/CMakeLists.txt +++ b/examples/all-clusters-app/mbed/CMakeLists.txt @@ -37,6 +37,8 @@ target_include_directories(${APP_TARGET} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/main/include/ ${APP_ROOT}/all-clusters-common + ${APP_ROOT}/all-clusters-common/include + ${APP_CLUSTERS} ${MBED_COMMON}/util/include ${CHIP_ROOT}/src/app ${CHIP_ROOT}/third_party/nlio/repo/include @@ -67,6 +69,7 @@ target_sources(${APP_TARGET} PRIVATE ${CHIP_ROOT}/src/app/server/CommissioningWindowManager.cpp ${CHIP_ROOT}/examples/all-clusters-app/all-clusters-common/src/bridged-actions-stub.cpp + ${CHIP_ROOT}/examples/all-clusters-app/all-clusters-common/src/static-supported-modes-manager.cpp ${APP_UTIL}/DataModelHandler.cpp ${APP_UTIL}/af-event.cpp @@ -90,6 +93,7 @@ target_sources(${APP_TARGET} PRIVATE ${APP_CLUSTERS}/basic/basic.cpp ${APP_CLUSTERS}/bindings/bindings.cpp ${APP_CLUSTERS}/on-off-server/on-off-server.cpp + ${APP_CLUSTERS}/access-control-server/access-control-server.cpp ${APP_CLUSTERS}/account-login-server/account-login-server.cpp ${APP_CLUSTERS}/application-launcher-server/application-launcher-server.cpp ${APP_CLUSTERS}/audio-output-server/audio-output-server.cpp @@ -112,7 +116,6 @@ target_sources(${APP_TARGET} PRIVATE ${APP_CLUSTERS}/media-input-server/media-input-server.cpp ${APP_CLUSTERS}/media-playback-server/media-playback-server.cpp ${APP_CLUSTERS}/mode-select-server/mode-select-server.cpp - ${APP_CLUSTERS}/mode-select-server/static-supported-modes-manager.cpp ${APP_CLUSTERS}/network-commissioning/network-commissioning-ember.cpp ${APP_CLUSTERS}/network-commissioning/network-commissioning.cpp ${APP_CLUSTERS}/on-off-server/on-off-server.cpp @@ -120,6 +123,7 @@ target_sources(${APP_TARGET} PRIVATE ${APP_CLUSTERS}/scenes/scenes.cpp ${APP_CLUSTERS}/target-navigator-server/target-navigator-server.cpp ${APP_CLUSTERS}/thermostat-server/thermostat-server.cpp + ${APP_CLUSTERS}/thermostat-user-interface-configuration-server/thermostat-user-interface-configuration-server.cpp ${APP_CLUSTERS}/tv-channel-server/tv-channel-server.cpp ${APP_CLUSTERS}/operational-credentials-server/operational-credentials-server.cpp ${APP_CLUSTERS}/test-cluster-server/test-cluster-server.cpp @@ -134,6 +138,7 @@ target_sources(${APP_TARGET} PRIVATE ${APP_CLUSTERS}/identify-server/identify-server.cpp ${APP_CLUSTERS}/window-covering-server/window-covering-server.cpp ${APP_CLUSTERS}/general_diagnostics_server/general_diagnostics_server.cpp + ${APP_CLUSTERS}/power-source-configuration-server/power-source-configuration-server.cpp ) target_link_libraries(${APP_TARGET} mbed-os-posix-socket mbed-os mbed-ble mbed-events mbed-netsocket mbed-storage mbed-storage-kv-global-api mbed-mbedtls mbed-emac chip) diff --git a/examples/all-clusters-app/mbed/mbed_app.json b/examples/all-clusters-app/mbed/mbed_app.json index 6271cbc091cf58..be14989fe20fb1 100644 --- a/examples/all-clusters-app/mbed/mbed_app.json +++ b/examples/all-clusters-app/mbed/mbed_app.json @@ -18,7 +18,8 @@ "MXCRYPTO_DISABLED", "NL_ASSERT_LOG=NL_ASSERT_LOG_DEFAULT", "NL_ASSERT_EXPECT_FLAGS=NL_ASSERT_FLAG_LOG", - "WHD_PRINT_DISABLE" + "WHD_PRINT_DISABLE", + "MBED_CONF_LWIP_NETBUF_RECVINFO_ENABLED" ] } }, diff --git a/examples/all-clusters-app/p6/BUILD.gn b/examples/all-clusters-app/p6/BUILD.gn index d34ad7bf427d55..5b99c3f3b3b6f6 100644 --- a/examples/all-clusters-app/p6/BUILD.gn +++ b/examples/all-clusters-app/p6/BUILD.gn @@ -61,6 +61,7 @@ p6_executable("clusters_app") { sources = [ "${chip_root}/examples/all-clusters-app/all-clusters-common/src/bridged-actions-stub.cpp", + "${chip_root}/examples/all-clusters-app/all-clusters-common/src/static-supported-modes-manager.cpp", "${examples_plat_dir}/LEDWidget.cpp", "${examples_plat_dir}/init_p6Platform.cpp", "src/AppTask.cpp", @@ -82,6 +83,7 @@ p6_executable("clusters_app") { "include", "${examples_plat_dir}", "${p6_project_dir}/include", + "${chip_root}/examples/all-clusters-app/all-clusters-common/include", ] defines = [] diff --git a/examples/all-clusters-app/p6/include/CHIPProjectConfig.h b/examples/all-clusters-app/p6/include/CHIPProjectConfig.h index a09d73cfe0f276..7a6ada1013b678 100644 --- a/examples/all-clusters-app/p6/include/CHIPProjectConfig.h +++ b/examples/all-clusters-app/p6/include/CHIPProjectConfig.h @@ -48,24 +48,24 @@ #define CHIP_CONFIG_REQUIRE_AUTH 1 /** - * CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_REVISION + * CHIP_DEVICE_CONFIG_DEVICE_HARDWARE_VERSION * - * The product revision number assigned to device or product by the device vendor. This - * number is scoped to the device product id, and typically corresponds to a revision of the + * The hardware version number assigned to device or product by the device vendor. This + * number is scoped to the device product id, and typically corresponds to a version of the * physical device, a change to its packaging, and/or a change to its marketing presentation. - * This value is generally *not* incremented for device software revisions. + * This value is generally *not* incremented for device software versions. */ -#define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_REVISION 1 +#define CHIP_DEVICE_CONFIG_DEVICE_HARDWARE_VERSION 1 /** - * CHIP_DEVICE_CONFIG_DEVICE_FIRMWARE_REVISION_STRING + * CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING * - * A string identifying the firmware revision running on the device. - * CHIP service currently expects the firmware version to be in the format + * A string identifying the software version running on the device. + * CHIP service currently expects the software version to be in the format * {MAJOR_VERSION}.0d{MINOR_VERSION} */ -#ifndef CHIP_DEVICE_CONFIG_DEVICE_FIRMWARE_REVISION_STRING -#define CHIP_DEVICE_CONFIG_DEVICE_FIRMWARE_REVISION_STRING "0.1ALPHA" +#ifndef CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING +#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING "0.1ALPHA" #endif /** * CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE @@ -90,13 +90,6 @@ */ #define CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER "TEST_SN" -/** - * CHIP_CONFIG_EVENT_LOGGING_UTC_TIMESTAMPS - * - * Enable recording UTC timestamps. - */ -#define CHIP_CONFIG_EVENT_LOGGING_UTC_TIMESTAMPS 1 - /** * CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE * diff --git a/examples/all-clusters-app/p6/src/AppTask.cpp b/examples/all-clusters-app/p6/src/AppTask.cpp index 9dbb22fd3eb8c9..e2ce865f6fc39f 100644 --- a/examples/all-clusters-app/p6/src/AppTask.cpp +++ b/examples/all-clusters-app/p6/src/AppTask.cpp @@ -107,7 +107,7 @@ CHIP_ERROR AppTask::Init() // Initialise WSTK buttons PB0 and PB1 (including debounce). ButtonHandler::Init(); - P6_LOG("Current Firmware Version: %s", CHIP_DEVICE_CONFIG_DEVICE_FIRMWARE_REVISION_STRING); + P6_LOG("Current Software Version: %s", CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING); // Initialize LEDs sStatusLED.Init(SYSTEM_STATE_LED); diff --git a/examples/all-clusters-app/p6/src/main.cpp b/examples/all-clusters-app/p6/src/main.cpp index 68446f6ecf05ab..a943c132dc3620 100644 --- a/examples/all-clusters-app/p6/src/main.cpp +++ b/examples/all-clusters-app/p6/src/main.cpp @@ -89,7 +89,14 @@ int main(void) // Init Chip memory management before the stack chip::Platform::MemoryInit(); - CHIP_ERROR ret = PlatformMgr().InitChipStack(); + CHIP_ERROR ret = chip::DeviceLayer::PersistedStorage::KeyValueStoreMgrImpl().Init(); + if (ret != CHIP_NO_ERROR) + { + P6_LOG("PersistedStorage::KeyValueStoreMgrImpl().Init() failed"); + appError(ret); + } + + ret = PlatformMgr().InitChipStack(); if (ret != CHIP_NO_ERROR) { P6_LOG("PlatformMgr().InitChipStack() failed"); diff --git a/examples/bridge-app/bridge-common/bridge-app.zap b/examples/bridge-app/bridge-common/bridge-app.zap index 14fe77b851abce..efdfc46078c922 100644 --- a/examples/bridge-app/bridge-common/bridge-app.zap +++ b/examples/bridge-app/bridge-common/bridge-app.zap @@ -1,5 +1,5 @@ { - "featureLevel": 63, + "featureLevel": 67, "creator": "zap", "keyValuePairs": [ { @@ -31,10 +31,10 @@ ], "endpointTypes": [ { - "name": "Anonymous Endpoint Type", - "deviceTypeName": "Bridge Device", - "deviceTypeCode": 2571, - "deviceTypeProfileId": 43981, + "name": "MA-bridge", + "deviceTypeName": "MA-bridge", + "deviceTypeCode": 14, + "deviceTypeProfileId": 259, "clusters": [ { "name": "Descriptor", @@ -55,7 +55,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -81,7 +81,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -96,7 +96,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -111,7 +111,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -126,7 +126,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -141,7 +141,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -167,7 +167,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -218,7 +218,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -233,7 +233,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -248,7 +248,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -263,7 +263,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -278,13 +278,13 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, { - "name": "UserLabel", + "name": "NodeLabel", "code": 5, "mfgCode": null, "side": "server", @@ -293,7 +293,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -308,7 +308,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -323,7 +323,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -338,7 +338,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -353,7 +353,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -368,7 +368,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -383,7 +383,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -434,7 +434,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -485,7 +485,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -500,11 +500,56 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, + { + "name": "RegulatoryConfig", + "code": 2, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "LocationCapability", + "code": 3, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "6", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "ClusterRevision", "code": 65533, @@ -515,7 +560,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -606,7 +651,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -687,6 +732,21 @@ } ], "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "ClusterRevision", "code": 65533, @@ -697,7 +757,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -742,7 +802,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -768,7 +828,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -783,7 +843,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -798,7 +858,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -813,7 +873,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -828,7 +888,52 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveHardwareFaults", + "code": 5, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveRadioFaults", + "code": 6, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveNetworkFaults", + "code": 7, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -843,7 +948,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -878,7 +983,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -894,6 +999,21 @@ "enabled": 1, "commands": [], "attributes": [ + { + "name": "ThreadMetrics", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "CurrentHeapFree", "code": 1, @@ -904,7 +1024,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -919,7 +1039,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -934,11 +1054,26 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "ClusterRevision", "code": 65533, @@ -949,7 +1084,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -975,7 +1110,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -990,7 +1125,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1005,7 +1140,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1020,7 +1155,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1035,7 +1170,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1050,7 +1185,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1065,7 +1200,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1076,11 +1211,11 @@ "mfgCode": null, "side": "server", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1091,11 +1226,11 @@ "mfgCode": null, "side": "server", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1110,7 +1245,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1125,7 +1260,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1140,7 +1275,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1155,7 +1290,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1170,7 +1305,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1185,7 +1320,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1200,7 +1335,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1215,7 +1350,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1230,7 +1365,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1245,7 +1380,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1260,7 +1395,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1275,7 +1410,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1290,7 +1425,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1305,7 +1440,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1320,7 +1455,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1335,7 +1470,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1350,7 +1485,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1365,7 +1500,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1380,7 +1515,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1395,7 +1530,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1410,7 +1545,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1425,7 +1560,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1440,7 +1575,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1455,7 +1590,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1470,7 +1605,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1485,7 +1620,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1500,7 +1635,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1515,7 +1650,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1530,7 +1665,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1545,7 +1680,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1560,7 +1695,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1575,7 +1710,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1590,7 +1725,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1605,7 +1740,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1620,7 +1755,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1635,7 +1770,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1650,7 +1785,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1665,7 +1800,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1680,7 +1815,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1695,7 +1830,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1710,7 +1845,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1725,7 +1860,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1740,7 +1875,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1755,7 +1890,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1770,7 +1905,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1785,7 +1920,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1800,7 +1935,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1815,7 +1950,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -1830,7 +1965,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -1845,7 +1980,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -1856,11 +1991,11 @@ "mfgCode": null, "side": "server", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1875,7 +2010,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1886,11 +2021,11 @@ "mfgCode": null, "side": "server", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1901,15 +2036,30 @@ "mfgCode": null, "side": "server", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "15", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "ClusterRevision", "code": 65533, @@ -1920,7 +2070,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1946,7 +2096,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1972,7 +2122,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -1987,7 +2137,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2002,7 +2152,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2017,7 +2167,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2032,7 +2182,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2047,7 +2197,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -2062,7 +2212,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -2077,7 +2227,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -2092,7 +2242,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -2107,7 +2257,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -2122,7 +2272,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -2137,7 +2287,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -2152,6 +2302,21 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", "reportable": 0, "minInterval": 1, "maxInterval": 65534, @@ -2167,7 +2332,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2202,7 +2367,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2228,7 +2393,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -2243,7 +2408,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -2258,7 +2423,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2273,7 +2438,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2288,7 +2453,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2303,7 +2468,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2318,7 +2483,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2333,7 +2498,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -2348,6 +2513,21 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000000000000000", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "3", "reportable": 0, "minInterval": 1, "maxInterval": 65534, @@ -2363,7 +2543,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2414,7 +2594,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2430,6 +2610,51 @@ "enabled": 1, "commands": [], "attributes": [ + { + "name": "WindowStatus", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AdminFabricIndex", + "code": 1, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AdminVendorId", + "code": 2, + "mfgCode": null, + "side": "server", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "ClusterRevision", "code": 65533, @@ -2440,7 +2665,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2539,7 +2764,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2598,7 +2823,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2613,7 +2838,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2628,7 +2853,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2643,7 +2868,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2658,7 +2883,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -2673,7 +2898,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2683,10 +2908,10 @@ ] }, { - "name": "Anonymous Endpoint Type", - "deviceTypeName": "LO-dimmablelight", + "name": "MA-dimmablelight", + "deviceTypeName": "MA-dimmablelight", "deviceTypeCode": 257, - "deviceTypeProfileId": 260, + "deviceTypeProfileId": 259, "clusters": [ { "name": "Identify", @@ -2724,7 +2949,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2759,7 +2984,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2774,7 +2999,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2849,7 +3074,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2908,7 +3133,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -2923,7 +3148,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3006,7 +3231,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3081,7 +3306,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3096,7 +3321,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3111,7 +3336,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3126,7 +3351,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3141,7 +3366,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3156,7 +3381,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3207,7 +3432,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3248,7 +3473,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "4", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3339,7 +3564,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3380,7 +3605,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3395,7 +3620,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3410,7 +3635,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xFF", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3425,7 +3650,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3440,7 +3665,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3455,7 +3680,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3470,7 +3695,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3485,7 +3710,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0000", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3500,7 +3725,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0xFE", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3515,7 +3740,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3530,7 +3755,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3545,7 +3770,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3560,7 +3785,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3575,7 +3800,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3601,7 +3826,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3627,7 +3852,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3642,7 +3867,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3657,7 +3882,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3672,7 +3897,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3687,7 +3912,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "1", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -3713,7 +3938,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3764,7 +3989,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3779,7 +4004,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3794,7 +4019,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3809,7 +4034,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3824,13 +4049,13 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 }, { - "name": "UserLabel", + "name": "NodeLabel", "code": 5, "mfgCode": null, "side": "server", @@ -3839,7 +4064,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3854,7 +4079,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3869,7 +4094,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3884,7 +4109,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3899,7 +4124,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "0x00", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3914,7 +4139,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3929,7 +4154,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "3", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3955,7 +4180,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -3981,7 +4206,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4011,7 +4236,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "2", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4026,7 +4251,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4041,7 +4266,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4067,7 +4292,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4093,7 +4318,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4108,7 +4333,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0x0001", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -4120,23 +4345,22 @@ ], "endpoints": [ { - "endpointTypeName": "Anonymous Endpoint Type", + "endpointTypeName": "MA-bridge", "endpointTypeIndex": 0, - "profileId": 43981, + "profileId": 259, "endpointId": 0, "networkId": 0, - "endpointVersion": null, - "deviceIdentifier": null + "endpointVersion": 1, + "deviceIdentifier": 14 }, { - "endpointTypeName": "Anonymous Endpoint Type", + "endpointTypeName": "MA-dimmablelight", "endpointTypeIndex": 1, - "profileId": "0x0104", + "profileId": 259, "endpointId": 1, "networkId": 0, - "endpointVersion": null, - "deviceIdentifier": null + "endpointVersion": 1, + "deviceIdentifier": 257 } - ], - "log": [] + ] } \ No newline at end of file diff --git a/src/lwip/qpg/arch/perf.h b/examples/bridge-app/bridge-common/include/CHIPProjectAppConfig.h similarity index 57% rename from src/lwip/qpg/arch/perf.h rename to examples/bridge-app/bridge-common/include/CHIPProjectAppConfig.h index 5c15942730ca8f..036cbda81ad736 100644 --- a/src/lwip/qpg/arch/perf.h +++ b/examples/bridge-app/bridge-common/include/CHIPProjectAppConfig.h @@ -1,6 +1,7 @@ /* + * * Copyright (c) 2020 Project CHIP Authors - * Copyright (c) 2018-2019 Google LLC. + * 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. @@ -15,19 +16,19 @@ * limitations under the License. */ -/* +/** + * @file + * Example project configuration file for CHIP. * - * Description: - * This file defines processor-architecture-specific constants, - * interfaces and types required for LwIP performance - * measurement. + * This is a place to put application or project-specific overrides + * to the default configuration values for general CHIP features. * */ -#ifndef CHIP_LWIP_FREERTOS_ARCH_PERF_H -#define CHIP_LWIP_FREERTOS_ARCH_PERF_H +#pragma once -#define PERF_START -#define PERF_STOP(s) +// overrides CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT in CHIPProjectConfig +#define CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT 16 -#endif /* CHIP_LWIP_FREERTOS_ARCH_PERF_H */ +// include the CHIPProjectConfig from config/standalone +#include diff --git a/examples/bridge-app/esp32/CMakeLists.txt b/examples/bridge-app/esp32/CMakeLists.txt index 0a0bc8b1131b65..dd174e3e7ec1c8 100644 --- a/examples/bridge-app/esp32/CMakeLists.txt +++ b/examples/bridge-app/esp32/CMakeLists.txt @@ -23,9 +23,9 @@ set(EXTRA_COMPONENT_DIRS "${CMAKE_CURRENT_LIST_DIR}/../../common/QRCode" ) +# TODO: add CHIPProjectAppConfig.h to esp32 project(chip-bridge-app) -idf_build_set_property(CXX_COMPILE_OPTIONS "-std=gnu++14;-Os;-DLWIP_IPV6_SCOPES=0;-DCHIP_HAVE_CONFIG_H;-DDYNAMIC_ENDPOINT_COUNT=16" APPEND) +idf_build_set_property(CXX_COMPILE_OPTIONS "-std=gnu++14;-Os;-DLWIP_IPV6_SCOPES=0;-DCHIP_HAVE_CONFIG_H;-DCHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT=16" APPEND) idf_build_set_property(C_COMPILE_OPTIONS "-Os;-DLWIP_IPV6_SCOPES=0" APPEND) flashing_script() - diff --git a/examples/bridge-app/esp32/README.md b/examples/bridge-app/esp32/README.md index add83d3346f770..7b731bd64dc4dc 100644 --- a/examples/bridge-app/esp32/README.md +++ b/examples/bridge-app/esp32/README.md @@ -83,14 +83,14 @@ Development Framework and the xtensa-esp32-elf toolchain. The VSCode devcontainer has these components pre-installed, so you can skip this step. To install these components manually, follow these steps: -- Clone the Espressif ESP-IDF and checkout - [v4.3 tag](https://github.com/espressif/esp-idf/releases/v4.3) +- Clone the Espressif ESP-IDF and checkout branch + [release/v4.4](https://github.com/espressif/esp-idf/tree/release/v4.4) $ mkdir ${HOME}/tools $ cd ${HOME}/tools $ git clone https://github.com/espressif/esp-idf.git $ cd esp-idf - $ git checkout v4.3 + $ git checkout release/v4.4 $ git submodule update --init $ ./install.sh diff --git a/examples/bridge-app/esp32/main/CMakeLists.txt b/examples/bridge-app/esp32/main/CMakeLists.txt index 9d524d5d131721..f718d005201fb8 100644 --- a/examples/bridge-app/esp32/main/CMakeLists.txt +++ b/examples/bridge-app/esp32/main/CMakeLists.txt @@ -33,13 +33,14 @@ idf_component_register(PRIV_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/thread_network_diagnostics_server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/wifi_network_diagnostics_server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/software_diagnostics_server" - "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/general_diagnostics_server" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/general_diagnostics_server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/descriptor" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/network-commissioning" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/on-off-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/operational-credentials-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/general-commissioning-server" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/platform/esp32/route_hook" PRIV_REQUIRES chip QRCode bt) -set_property(TARGET ${COMPONENT_LIB} PROPERTY CXX_STANDARD 14) +set_property(TARGET ${COMPONENT_LIB} PROPERTY CXX_STANDARD 14) target_compile_options(${COMPONENT_LIB} PRIVATE "-DLWIP_IPV6_SCOPES=0" "-DCHIP_HAVE_CONFIG_H") diff --git a/examples/bridge-app/esp32/main/DeviceCallbacks.cpp b/examples/bridge-app/esp32/main/DeviceCallbacks.cpp index 48c3863feec7a3..a0491fc2df7af5 100644 --- a/examples/bridge-app/esp32/main/DeviceCallbacks.cpp +++ b/examples/bridge-app/esp32/main/DeviceCallbacks.cpp @@ -17,8 +17,11 @@ */ #include "DeviceCallbacks.h" +#include "esp_check.h" +#include "esp_err.h" #include "esp_heap_caps.h" #include "esp_log.h" +#include "route_hook/esp_route_hook.h" #include #include #include @@ -81,6 +84,7 @@ void DeviceCallbacks::OnInternetConnectivityChange(const ChipDeviceEvent * event { ESP_LOGI(TAG, "IPv6 Server ready..."); chip::app::DnssdServer::Instance().StartServer(); + ESP_ERROR_CHECK(esp_route_hook_init(esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"))); } else if (event->InternetConnectivityChange.IPv6 == kConnectivity_Lost) { diff --git a/examples/bridge-app/esp32/main/main.cpp b/examples/bridge-app/esp32/main/main.cpp index 80d17acd86d325..411ff15c5bec8d 100644 --- a/examples/bridge-app/esp32/main/main.cpp +++ b/examples/bridge-app/esp32/main/main.cpp @@ -43,14 +43,14 @@ using namespace ::chip::Platform; static DeviceCallbacks AppCallback; -static const int kUserLabelSize = 32; +static const int kNodeLabelSize = 32; // Current ZCL implementation of Struct uses a max-size array of 254 bytes static const int kDescriptorAttributeArraySize = 254; static const int kFixedLabelAttributeArraySize = 254; static EndpointId gCurrentEndpointId; static EndpointId gFirstDynamicEndpointId; -static Device * gDevices[DYNAMIC_ENDPOINT_COUNT]; // number of dynamic endpoints count +static Device * gDevices[CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT]; // number of dynamic endpoints count // 4 Bridged devices static Device gLight1("Light 1", "Office"); @@ -74,27 +74,27 @@ static Device gLight4("Light 4", "Den"); // Declare On/Off cluster attributes DECLARE_DYNAMIC_ATTRIBUTE_LIST_BEGIN(onOffAttrs) -DECLARE_DYNAMIC_ATTRIBUTE(ZCL_ON_OFF_ATTRIBUTE_ID, BOOLEAN, 1, 0) /* on/off */ -DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); +DECLARE_DYNAMIC_ATTRIBUTE(ZCL_ON_OFF_ATTRIBUTE_ID, BOOLEAN, 1, 0), /* on/off */ + DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); // Declare Descriptor cluster attributes DECLARE_DYNAMIC_ATTRIBUTE_LIST_BEGIN(descriptorAttrs) DECLARE_DYNAMIC_ATTRIBUTE(ZCL_DEVICE_LIST_ATTRIBUTE_ID, ARRAY, kDescriptorAttributeArraySize, 0), /* device list */ DECLARE_DYNAMIC_ATTRIBUTE(ZCL_SERVER_LIST_ATTRIBUTE_ID, ARRAY, kDescriptorAttributeArraySize, 0), /* server list */ DECLARE_DYNAMIC_ATTRIBUTE(ZCL_CLIENT_LIST_ATTRIBUTE_ID, ARRAY, kDescriptorAttributeArraySize, 0), /* client list */ - DECLARE_DYNAMIC_ATTRIBUTE(ZCL_PARTS_LIST_ATTRIBUTE_ID, ARRAY, kDescriptorAttributeArraySize, 0) /* parts list */ + DECLARE_DYNAMIC_ATTRIBUTE(ZCL_PARTS_LIST_ATTRIBUTE_ID, ARRAY, kDescriptorAttributeArraySize, 0), /* parts list */ DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); // Declare Bridged Device Basic information cluster attributes DECLARE_DYNAMIC_ATTRIBUTE_LIST_BEGIN(bridgedDeviceBasicAttrs) -DECLARE_DYNAMIC_ATTRIBUTE(ZCL_USER_LABEL_ATTRIBUTE_ID, CHAR_STRING, kUserLabelSize, 0), /* UserLabel */ - DECLARE_DYNAMIC_ATTRIBUTE(ZCL_REACHABLE_ATTRIBUTE_ID, BOOLEAN, 1, 0) /* Reachable */ +DECLARE_DYNAMIC_ATTRIBUTE(ZCL_NODE_LABEL_ATTRIBUTE_ID, CHAR_STRING, kNodeLabelSize, 0), /* NodeLabel */ + DECLARE_DYNAMIC_ATTRIBUTE(ZCL_REACHABLE_ATTRIBUTE_ID, BOOLEAN, 1, 0), /* Reachable */ DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); // Declare Fixed Label cluster attributes DECLARE_DYNAMIC_ATTRIBUTE_LIST_BEGIN(fixedLabelAttrs) -DECLARE_DYNAMIC_ATTRIBUTE(ZCL_LABEL_LIST_ATTRIBUTE_ID, ARRAY, kFixedLabelAttributeArraySize, 0) /* label list */ -DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); +DECLARE_DYNAMIC_ATTRIBUTE(ZCL_LABEL_LIST_ATTRIBUTE_ID, ARRAY, kFixedLabelAttributeArraySize, 0), /* label list */ + DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); // Declare Cluster List for Bridged Light endpoint DECLARE_DYNAMIC_CLUSTER_LIST_BEGIN(bridgedLightClusters) @@ -116,7 +116,7 @@ DECLARE_DYNAMIC_ENDPOINT(bridgedLightEndpoint, bridgedLightClusters); CHIP_ERROR AddDeviceEndpoint(Device * dev, EmberAfEndpointType * ep, uint16_t deviceType) { uint8_t index = 0; - while (index < DYNAMIC_ENDPOINT_COUNT) + while (index < CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT) { if (NULL == gDevices[index]) { @@ -144,7 +144,7 @@ CHIP_ERROR AddDeviceEndpoint(Device * dev, EmberAfEndpointType * ep, uint16_t de CHIP_ERROR RemoveDeviceEndpoint(Device * dev) { - for (uint8_t index = 0; index < DYNAMIC_ENDPOINT_COUNT; index++) + for (uint8_t index = 0; index < CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT; index++) { if (gDevices[index] == dev) { @@ -195,7 +195,7 @@ EmberAfStatus HandleReadBridgedDeviceBasicAttribute(Device * dev, chip::Attribut { *buffer = dev->IsReachable() ? 1 : 0; } - else if ((attributeId == ZCL_USER_LABEL_ATTRIBUTE_ID) && (maxReadLength == 32)) + else if ((attributeId == ZCL_NODE_LABEL_ATTRIBUTE_ID) && (maxReadLength == 32)) { ToZclCharString(buffer, dev->GetName(), static_cast(maxReadLength - 1)); } @@ -264,7 +264,7 @@ EmberAfStatus emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterI { uint16_t endpointIndex = emberAfGetDynamicIndexFromEndpoint(endpoint); - if ((endpointIndex < DYNAMIC_ENDPOINT_COUNT) && (gDevices[endpointIndex] != NULL)) + if ((endpointIndex < CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT) && (gDevices[endpointIndex] != NULL)) { Device * dev = gDevices[endpointIndex]; @@ -291,7 +291,7 @@ EmberAfStatus emberAfExternalAttributeWriteCallback(EndpointId endpoint, Cluster { uint16_t endpointIndex = emberAfGetDynamicIndexFromEndpoint(endpoint); - if (endpointIndex < DYNAMIC_ENDPOINT_COUNT) + if (endpointIndex < CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT) { Device * dev = gDevices[endpointIndex]; @@ -323,10 +323,10 @@ void HandleDeviceStatusChanged(Device * dev, Device::Changed_t itemChangedMask) if (itemChangedMask & Device::kChanged_Name) { - uint8_t zclName[kUserLabelSize]; - ToZclCharString(zclName, dev->GetName(), kUserLabelSize - 1); + uint8_t zclName[kNodeLabelSize + 1]; + ToZclCharString(zclName, dev->GetName(), kNodeLabelSize); MatterReportingAttributeChangeCallback(dev->GetEndpointId(), ZCL_BRIDGED_DEVICE_BASIC_CLUSTER_ID, - ZCL_USER_LABEL_ATTRIBUTE_ID, CLUSTER_MASK_SERVER, 0, ZCL_CHAR_STRING_ATTRIBUTE_TYPE, + ZCL_NODE_LABEL_ATTRIBUTE_ID, CLUSTER_MASK_SERVER, 0, ZCL_CHAR_STRING_ATTRIBUTE_TYPE, zclName); } if (itemChangedMask & Device::kChanged_Location) @@ -334,7 +334,7 @@ void HandleDeviceStatusChanged(Device * dev, Device::Changed_t itemChangedMask) uint8_t buffer[kFixedLabelAttributeArraySize]; EmberAfAttributeMetadata am = { .attributeId = ZCL_LABEL_LIST_ATTRIBUTE_ID, .size = kFixedLabelAttributeArraySize, - .defaultValue = nullptr }; + .defaultValue = static_cast(0) }; EncodeFixedLabel("room", dev->GetLocation(), buffer, sizeof(buffer), &am); diff --git a/examples/bridge-app/esp32/sdkconfig.defaults b/examples/bridge-app/esp32/sdkconfig.defaults index 956dcfe0eecedd..6a6589e1040577 100644 --- a/examples/bridge-app/esp32/sdkconfig.defaults +++ b/examples/bridge-app/esp32/sdkconfig.defaults @@ -36,3 +36,6 @@ CONFIG_LWIP_IPV6_AUTOCONFIG=y # Use a custom partition table CONFIG_PARTITION_TABLE_CUSTOM=y CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" + +CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT=y +CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT=y diff --git a/examples/bridge-app/linux/BUILD.gn b/examples/bridge-app/linux/BUILD.gn index 572142d2357782..0f27218e003c55 100644 --- a/examples/bridge-app/linux/BUILD.gn +++ b/examples/bridge-app/linux/BUILD.gn @@ -20,6 +20,7 @@ assert(chip_build_tools) executable("chip-bridge-app") { sources = [ + "${chip_root}/examples/tv-app/tv-common/include/CHIPProjectAppConfig.h", "Device.cpp", "Options.cpp", "include/Device.h", @@ -33,9 +34,6 @@ executable("chip-bridge-app") { cflags = [ "-Wconversion" ] - # TODO: the definition of DYNAMIC_ENDPOINT_COUNT needs find a common home! - cflags += [ "-DDYNAMIC_ENDPOINT_COUNT=16" ] - include_dirs = [ "include" ] output_dir = root_out_dir diff --git a/examples/bridge-app/linux/README.md b/examples/bridge-app/linux/README.md index 546ea0a7e83819..9cdd2a30f8080c 100644 --- a/examples/bridge-app/linux/README.md +++ b/examples/bridge-app/linux/README.md @@ -129,16 +129,6 @@ value/label pair `"room"`/`[light name]`. ## Running the Complete Example on Raspberry Pi 4 -> If you want to test ZCL, please disable Rendezvous -> -> gn gen out/debug --args='bypass_rendezvous=true' -> ninja -C out/debug -> -> Note that GN will set bypass_rendezvous for future builds, to enable -> rendezvous, re-generate using -> -> gn gen out/debug --args='chip_bypass_rendezvous=false' - - Prerequisites 1. A Raspberry Pi 4 board diff --git a/examples/bridge-app/linux/args.gni b/examples/bridge-app/linux/args.gni index a6463ca2c05fae..7039d20e181994 100644 --- a/examples/bridge-app/linux/args.gni +++ b/examples/bridge-app/linux/args.gni @@ -15,3 +15,11 @@ import("//build_overrides/chip.gni") import("${chip_root}/config/standalone/args.gni") + +chip_device_project_config_include = "" +chip_project_config_include = "" +chip_system_project_config_include = "" + +chip_project_config_include_dirs = + [ "${chip_root}/examples/bridge-app/bridge-common/include" ] +chip_project_config_include_dirs += [ "${chip_root}/config/standalone" ] diff --git a/examples/bridge-app/linux/main.cpp b/examples/bridge-app/linux/main.cpp index 530e255599cc49..3d7deecc5649d1 100644 --- a/examples/bridge-app/linux/main.cpp +++ b/examples/bridge-app/linux/main.cpp @@ -50,7 +50,7 @@ using namespace chip::Inet; using namespace chip::Transport; using namespace chip::DeviceLayer; -static const int kUserLabelSize = 32; +static const int kNodeLabelSize = 32; // Current ZCL implementation of Struct uses a max-size array of 254 bytes static const int kDescriptorAttributeArraySize = 254; static const int kFixedLabelAttributeArraySize = 254; @@ -59,7 +59,7 @@ static const int kFixedLabelElementsOctetStringSize = 16; static EndpointId gCurrentEndpointId; static EndpointId gFirstDynamicEndpointId; -static Device * gDevices[DYNAMIC_ENDPOINT_COUNT]; +static Device * gDevices[CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT]; // ENDPOINT DEFINITIONS: // ================================================================================= @@ -94,27 +94,27 @@ static Device * gDevices[DYNAMIC_ENDPOINT_COUNT]; // Declare On/Off cluster attributes DECLARE_DYNAMIC_ATTRIBUTE_LIST_BEGIN(onOffAttrs) -DECLARE_DYNAMIC_ATTRIBUTE(ZCL_ON_OFF_ATTRIBUTE_ID, BOOLEAN, 1, 0) /* on/off */ -DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); +DECLARE_DYNAMIC_ATTRIBUTE(ZCL_ON_OFF_ATTRIBUTE_ID, BOOLEAN, 1, 0), /* on/off */ + DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); // Declare Descriptor cluster attributes DECLARE_DYNAMIC_ATTRIBUTE_LIST_BEGIN(descriptorAttrs) DECLARE_DYNAMIC_ATTRIBUTE(ZCL_DEVICE_LIST_ATTRIBUTE_ID, ARRAY, kDescriptorAttributeArraySize, 0), /* device list */ DECLARE_DYNAMIC_ATTRIBUTE(ZCL_SERVER_LIST_ATTRIBUTE_ID, ARRAY, kDescriptorAttributeArraySize, 0), /* server list */ DECLARE_DYNAMIC_ATTRIBUTE(ZCL_CLIENT_LIST_ATTRIBUTE_ID, ARRAY, kDescriptorAttributeArraySize, 0), /* client list */ - DECLARE_DYNAMIC_ATTRIBUTE(ZCL_PARTS_LIST_ATTRIBUTE_ID, ARRAY, kDescriptorAttributeArraySize, 0) /* parts list */ + DECLARE_DYNAMIC_ATTRIBUTE(ZCL_PARTS_LIST_ATTRIBUTE_ID, ARRAY, kDescriptorAttributeArraySize, 0), /* parts list */ DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); // Declare Bridged Device Basic information cluster attributes DECLARE_DYNAMIC_ATTRIBUTE_LIST_BEGIN(bridgedDeviceBasicAttrs) -DECLARE_DYNAMIC_ATTRIBUTE(ZCL_USER_LABEL_ATTRIBUTE_ID, CHAR_STRING, kUserLabelSize, 0), /* UserLabel */ - DECLARE_DYNAMIC_ATTRIBUTE(ZCL_REACHABLE_ATTRIBUTE_ID, BOOLEAN, 1, 0) /* Reachable */ +DECLARE_DYNAMIC_ATTRIBUTE(ZCL_NODE_LABEL_ATTRIBUTE_ID, CHAR_STRING, kNodeLabelSize, 0), /* NodeLabel */ + DECLARE_DYNAMIC_ATTRIBUTE(ZCL_REACHABLE_ATTRIBUTE_ID, BOOLEAN, 1, 0), /* Reachable */ DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); // Declare Fixed Label cluster attributes DECLARE_DYNAMIC_ATTRIBUTE_LIST_BEGIN(fixedLabelAttrs) -DECLARE_DYNAMIC_ATTRIBUTE(ZCL_LABEL_LIST_ATTRIBUTE_ID, ARRAY, kFixedLabelAttributeArraySize, 0) /* label list */ -DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); +DECLARE_DYNAMIC_ATTRIBUTE(ZCL_LABEL_LIST_ATTRIBUTE_ID, ARRAY, kFixedLabelAttributeArraySize, 0), /* label list */ + DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); // Declare Cluster List for Bridged Light endpoint DECLARE_DYNAMIC_CLUSTER_LIST_BEGIN(bridgedLightClusters) @@ -135,10 +135,10 @@ DECLARE_DYNAMIC_ENDPOINT(bridgedLightEndpoint, bridgedLightClusters); // Declare Switch cluster attributes DECLARE_DYNAMIC_ATTRIBUTE_LIST_BEGIN(switchAttrs) -DECLARE_DYNAMIC_ATTRIBUTE(ZCL_NUMBER_OF_POSITIONS_ATTRIBUTE_ID, INT8U, 1, 0), /* NumberOfPositions */ - DECLARE_DYNAMIC_ATTRIBUTE(ZCL_CURRENT_POSITION_ATTRIBUTE_ID, INT8U, 1, 0), /* CurrentPosition */ - DECLARE_DYNAMIC_ATTRIBUTE(ZCL_MULTI_PRESS_MAX_ATTRIBUTE_ID, INT8U, 1, 0), /* MultiPressMax */ - DECLARE_DYNAMIC_ATTRIBUTE(ZCL_FEATURE_MAP_SERVER_ATTRIBUTE_ID, BITMAP32, 4, 0) /* FeatureMap */ +DECLARE_DYNAMIC_ATTRIBUTE(ZCL_NUMBER_OF_POSITIONS_ATTRIBUTE_ID, INT8U, 1, 0), /* NumberOfPositions */ + DECLARE_DYNAMIC_ATTRIBUTE(ZCL_CURRENT_POSITION_ATTRIBUTE_ID, INT8U, 1, 0), /* CurrentPosition */ + DECLARE_DYNAMIC_ATTRIBUTE(ZCL_MULTI_PRESS_MAX_ATTRIBUTE_ID, INT8U, 1, 0), /* MultiPressMax */ + DECLARE_DYNAMIC_ATTRIBUTE(ZCL_FEATURE_MAP_SERVER_ATTRIBUTE_ID, BITMAP32, 4, 0), /* FeatureMap */ DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); // Declare Descriptor cluster attributes @@ -146,19 +146,19 @@ DECLARE_DYNAMIC_ATTRIBUTE_LIST_BEGIN(switchDescriptorAttrs) DECLARE_DYNAMIC_ATTRIBUTE(ZCL_DEVICE_LIST_ATTRIBUTE_ID, ARRAY, kDescriptorAttributeArraySize, 0), /* device list */ DECLARE_DYNAMIC_ATTRIBUTE(ZCL_SERVER_LIST_ATTRIBUTE_ID, ARRAY, kDescriptorAttributeArraySize, 0), /* server list */ DECLARE_DYNAMIC_ATTRIBUTE(ZCL_CLIENT_LIST_ATTRIBUTE_ID, ARRAY, kDescriptorAttributeArraySize, 0), /* client list */ - DECLARE_DYNAMIC_ATTRIBUTE(ZCL_PARTS_LIST_ATTRIBUTE_ID, ARRAY, kDescriptorAttributeArraySize, 0) /* parts list */ + DECLARE_DYNAMIC_ATTRIBUTE(ZCL_PARTS_LIST_ATTRIBUTE_ID, ARRAY, kDescriptorAttributeArraySize, 0), /* parts list */ DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); // Declare Bridged Device Basic information cluster attributes DECLARE_DYNAMIC_ATTRIBUTE_LIST_BEGIN(switchBridgedDeviceBasicAttrs) -DECLARE_DYNAMIC_ATTRIBUTE(ZCL_USER_LABEL_ATTRIBUTE_ID, CHAR_STRING, kUserLabelSize, 0), /* UserLabel */ - DECLARE_DYNAMIC_ATTRIBUTE(ZCL_REACHABLE_ATTRIBUTE_ID, BOOLEAN, 1, 0) /* Reachable */ +DECLARE_DYNAMIC_ATTRIBUTE(ZCL_NODE_LABEL_ATTRIBUTE_ID, CHAR_STRING, kNodeLabelSize, 0), /* NodeLabel */ + DECLARE_DYNAMIC_ATTRIBUTE(ZCL_REACHABLE_ATTRIBUTE_ID, BOOLEAN, 1, 0), /* Reachable */ DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); // Declare Fixed Label cluster attributes DECLARE_DYNAMIC_ATTRIBUTE_LIST_BEGIN(switchFixedLabelAttrs) -DECLARE_DYNAMIC_ATTRIBUTE(ZCL_LABEL_LIST_ATTRIBUTE_ID, ARRAY, kFixedLabelAttributeArraySize, 0) /* label list */ -DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); +DECLARE_DYNAMIC_ATTRIBUTE(ZCL_LABEL_LIST_ATTRIBUTE_ID, ARRAY, kFixedLabelAttributeArraySize, 0), /* label list */ + DECLARE_DYNAMIC_ATTRIBUTE_LIST_END(); // Declare Cluster List for Bridged Switch endpoint DECLARE_DYNAMIC_CLUSTER_LIST_BEGIN(bridgedSwitchClusters) @@ -184,7 +184,7 @@ DECLARE_DYNAMIC_ENDPOINT(bridgedSwitchEndpoint, bridgedSwitchClusters); int AddDeviceEndpoint(Device * dev, EmberAfEndpointType * ep, uint16_t deviceType) { uint8_t index = 0; - while (index < DYNAMIC_ENDPOINT_COUNT) + while (index < CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT) { if (NULL == gDevices[index]) { @@ -219,7 +219,7 @@ int AddDeviceEndpoint(Device * dev, EmberAfEndpointType * ep, uint16_t deviceTyp int RemoveDeviceEndpoint(Device * dev) { uint8_t index = 0; - while (index < DYNAMIC_ENDPOINT_COUNT) + while (index < CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT) { if (gDevices[index] == dev) { @@ -267,11 +267,11 @@ void HandleDeviceStatusChanged(Device * dev, Device::Changed_t itemChangedMask) if (itemChangedMask & Device::kChanged_Name) { - uint8_t zclName[kUserLabelSize]; + uint8_t zclName[kNodeLabelSize]; MutableByteSpan zclNameSpan(zclName); MakeZclCharString(zclNameSpan, dev->GetName()); MatterReportingAttributeChangeCallback(dev->GetEndpointId(), ZCL_BRIDGED_DEVICE_BASIC_CLUSTER_ID, - ZCL_USER_LABEL_ATTRIBUTE_ID, CLUSTER_MASK_SERVER, 0, ZCL_CHAR_STRING_ATTRIBUTE_TYPE, + ZCL_NODE_LABEL_ATTRIBUTE_ID, CLUSTER_MASK_SERVER, 0, ZCL_CHAR_STRING_ATTRIBUTE_TYPE, zclNameSpan.data()); } @@ -280,7 +280,7 @@ void HandleDeviceStatusChanged(Device * dev, Device::Changed_t itemChangedMask) uint8_t buffer[kFixedLabelAttributeArraySize]; EmberAfAttributeMetadata am = { .attributeId = ZCL_LABEL_LIST_ATTRIBUTE_ID, .size = kFixedLabelAttributeArraySize, - .defaultValue = nullptr }; + .defaultValue = static_cast(0) }; EncodeFixedLabel("room", dev->GetLocation(), buffer, sizeof(buffer), &am); @@ -342,7 +342,7 @@ EmberAfStatus HandleReadBridgedDeviceBasicAttribute(Device * dev, chip::Attribut { *buffer = dev->IsReachable() ? 1 : 0; } - else if ((attributeId == ZCL_USER_LABEL_ATTRIBUTE_ID) && (maxReadLength == 32)) + else if ((attributeId == ZCL_NODE_LABEL_ATTRIBUTE_ID) && (maxReadLength == 32)) { uint8_t bufferMemory[254]; MutableByteSpan zclString(bufferMemory); @@ -460,7 +460,7 @@ EmberAfStatus emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterI EmberAfStatus ret = EMBER_ZCL_STATUS_FAILURE; - if ((endpointIndex < DYNAMIC_ENDPOINT_COUNT) && (gDevices[endpointIndex] != NULL)) + if ((endpointIndex < CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT) && (gDevices[endpointIndex] != NULL)) { Device * dev = gDevices[endpointIndex]; @@ -496,7 +496,7 @@ EmberAfStatus emberAfExternalAttributeWriteCallback(EndpointId endpoint, Cluster // ChipLogProgress(DeviceLayer, "emberAfExternalAttributeWriteCallback: ep=%d", endpoint); - if (endpointIndex < DYNAMIC_ENDPOINT_COUNT) + if (endpointIndex < CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT) { Device * dev = gDevices[endpointIndex]; diff --git a/examples/build_overrides/k32w0_sdk.gni b/examples/build_overrides/k32w0_sdk.gni index 51a2821b4ab1fc..e77b63d1e02fa9 100644 --- a/examples/build_overrides/k32w0_sdk.gni +++ b/examples/build_overrides/k32w0_sdk.gni @@ -15,5 +15,5 @@ declare_args() { # Root directory for k32w SDK. k32w0_sdk_build_root = - "//third_party/connectedhomeip/third_party/k32w_sdk/nxp/k32w/k32w0" + "//third_party/connectedhomeip/third_party/nxp/k32w0_sdk" } diff --git a/examples/chip-tool-darwin/main.m b/examples/chip-tool-darwin/main.m index 19b9ccb6f2807b..9cd1af24d17fe4 100644 --- a/examples/chip-tool-darwin/main.m +++ b/examples/chip-tool-darwin/main.m @@ -16,14 +16,7 @@ * */ -#import -#import -#import -#import -#import -#import -#import -#import +#import #import int main(int argc, const char * argv[]) { return EXIT_SUCCESS; } diff --git a/examples/chip-tool-darwin/third_party/connectedhomeip b/examples/chip-tool-darwin/third_party/connectedhomeip new file mode 120000 index 00000000000000..1b20c9fb816b63 --- /dev/null +++ b/examples/chip-tool-darwin/third_party/connectedhomeip @@ -0,0 +1 @@ +../../../ \ No newline at end of file diff --git a/examples/chip-tool/BUILD.gn b/examples/chip-tool/BUILD.gn index 7f5a419fe7dd25..c78ea55662db76 100644 --- a/examples/chip-tool/BUILD.gn +++ b/examples/chip-tool/BUILD.gn @@ -30,12 +30,17 @@ executable("chip-tool") { "commands/common/CHIPCommand.cpp", "commands/common/CHIPCommand.h", "commands/common/Command.cpp", + "commands/common/CommandInvoker.h", "commands/common/Commands.cpp", "commands/discover/DiscoverCommand.cpp", "commands/discover/DiscoverCommissionablesCommand.cpp", "commands/discover/DiscoverCommissionersCommand.cpp", - "commands/pairing/CommissionedListCommand.cpp", - "commands/pairing/CommissionedListCommand.h", + + # TODO - enable CommissionedListCommand once DNS Cache is implemented + # "commands/pairing/CommissionedListCommand.cpp", + # "commands/pairing/CommissionedListCommand.h", + "commands/pairing/OpenCommissioningWindowCommand.cpp", + "commands/pairing/OpenCommissioningWindowCommand.h", "commands/pairing/PairingCommand.cpp", "commands/payload/AdditionalDataParseCommand.cpp", "commands/payload/SetupPayloadParseCommand.cpp", @@ -48,6 +53,8 @@ executable("chip-tool") { defines = [ "CONFIG_USE_SEPARATE_EVENTLOOP=${config_use_separate_eventloop}" ] deps = [ + "${chip_root}/src/app/server", + "${chip_root}/src/app/tests/suites/pics", "${chip_root}/src/controller/data_model", "${chip_root}/src/lib", "${chip_root}/src/platform", diff --git a/examples/chip-tool/README.md b/examples/chip-tool/README.md index 871361d45fca96..61a23a6209a8af 100644 --- a/examples/chip-tool/README.md +++ b/examples/chip-tool/README.md @@ -42,13 +42,6 @@ configuration. To initiate a client commissioning request to a device, run the built executable and choose the pairing mode. -##### Commission a device configured to bypass Rendezvous - -The command below commissions a device with the provided IP address and port of -the server to talk to. - - $ chip-tool pairing bypass ${NODE_ID_TO_ASSIGN} 192.168.0.30 5540 - #### Commission a device over BLE Run the built executable and pass it the discriminator and pairing code of the @@ -433,7 +426,6 @@ Usage: | Commands: | +-------------------------------------------------------------------------------------+ | * unpair | - | * bypass | | * ble | | * softap | +-------------------------------------------------------------------------------------+ diff --git a/examples/chip-tool/args.gni b/examples/chip-tool/args.gni index 311ddab32d5fe5..a76f3e8996ce3c 100644 --- a/examples/chip-tool/args.gni +++ b/examples/chip-tool/args.gni @@ -15,3 +15,10 @@ import("//build_overrides/chip.gni") import("${chip_root}/config/standalone/args.gni") + +chip_device_project_config_include = "" +chip_project_config_include = "" +chip_system_project_config_include = "" + +chip_project_config_include_dirs = [ "${chip_root}/examples/chip-tool/include" ] +chip_project_config_include_dirs += [ "${chip_root}/config/standalone" ] diff --git a/examples/chip-tool/commands/clusters/ModelCommand.cpp b/examples/chip-tool/commands/clusters/ModelCommand.cpp index 25fdfa8ec7a697..01406250d7a360 100644 --- a/examples/chip-tool/commands/clusters/ModelCommand.cpp +++ b/examples/chip-tool/commands/clusters/ModelCommand.cpp @@ -26,28 +26,21 @@ using namespace ::chip; CHIP_ERROR ModelCommand::RunCommand() { ChipLogProgress(chipTool, "Sending command to node 0x%" PRIx64, mNodeId); - - CHIP_ERROR err = mController.GetConnectedDevice(mNodeId, &mOnDeviceConnectedCallback, &mOnDeviceConnectionFailureCallback); - VerifyOrExit(err == CHIP_NO_ERROR, - ChipLogError(chipTool, "Failed in initiating connection to the device: %" PRIu64 ", error %" CHIP_ERROR_FORMAT, - mNodeId, err.Format())); - -exit: - return err; + return CurrentCommissioner().GetConnectedDevice(mNodeId, &mOnDeviceConnectedCallback, &mOnDeviceConnectionFailureCallback); } -void ModelCommand::OnDeviceConnectedFn(void * context, chip::Controller::Device * device) +void ModelCommand::OnDeviceConnectedFn(void * context, ChipDevice * device) { ModelCommand * command = reinterpret_cast(context); - VerifyOrReturn(command != nullptr, - ChipLogError(chipTool, "Device connected, but cannot send the command, as the context is null")); + VerifyOrReturn(command != nullptr, ChipLogError(chipTool, "OnDeviceConnectedFn: context is null")); command->SendCommand(device, command->mEndPointId); } -void ModelCommand::OnDeviceConnectionFailureFn(void * context, NodeId deviceId, CHIP_ERROR error) +void ModelCommand::OnDeviceConnectionFailureFn(void * context, NodeId deviceId, CHIP_ERROR err) { + LogErrorOnFailure(err); + ModelCommand * command = reinterpret_cast(context); - ChipLogError(chipTool, "Failed in connecting to the device %" PRIu64 ". Error %" CHIP_ERROR_FORMAT, deviceId, error.Format()); - VerifyOrReturn(command != nullptr, ChipLogError(chipTool, "ModelCommand context is null")); - command->SetCommandExitStatus(error); + VerifyOrReturn(command != nullptr, ChipLogError(chipTool, "OnDeviceConnectionFailureFn: context is null")); + command->SetCommandExitStatus(err); } diff --git a/examples/chip-tool/commands/clusters/ModelCommand.h b/examples/chip-tool/commands/clusters/ModelCommand.h index c70d35477f80c4..b03361433e0996 100644 --- a/examples/chip-tool/commands/clusters/ModelCommand.h +++ b/examples/chip-tool/commands/clusters/ModelCommand.h @@ -21,17 +21,12 @@ #include "../../config/PersistentStorage.h" #include "../common/CHIPCommand.h" #include -#include #include -// Limits on endpoint values. -#define CHIP_ZCL_ENDPOINT_MIN 0x00 -#define CHIP_ZCL_ENDPOINT_MAX 0xF0 - class ModelCommand : public CHIPCommand { public: - using ChipDevice = ::chip::Controller::Device; + using ChipDevice = ::chip::OperationalDeviceProxy; ModelCommand(const char * commandName) : CHIPCommand(commandName), mOnDeviceConnectedCallback(OnDeviceConnectedFn, this), @@ -42,6 +37,7 @@ class ModelCommand : public CHIPCommand { AddArgument("node-id", 0, UINT64_MAX, &mNodeId); AddArgument("endpoint-id", CHIP_ZCL_ENDPOINT_MIN, CHIP_ZCL_ENDPOINT_MAX, &mEndPointId); + AddArgument("timedInteractionTimeoutMs", 0, UINT16_MAX, &mTimedInteractionTimeoutMs); } /////////// CHIPCommand Interface ///////// @@ -50,6 +46,9 @@ class ModelCommand : public CHIPCommand virtual CHIP_ERROR SendCommand(ChipDevice * device, uint8_t endPointId) = 0; +protected: + chip::Optional mTimedInteractionTimeoutMs; + private: chip::NodeId mNodeId; uint8_t mEndPointId; @@ -57,6 +56,6 @@ class ModelCommand : public CHIPCommand static void OnDeviceConnectedFn(void * context, ChipDevice * device); static void OnDeviceConnectionFailureFn(void * context, NodeId deviceId, CHIP_ERROR error); - chip::Callback::Callback mOnDeviceConnectedCallback; - chip::Callback::Callback mOnDeviceConnectionFailureCallback; + chip::Callback::Callback mOnDeviceConnectedCallback; + chip::Callback::Callback mOnDeviceConnectionFailureCallback; }; diff --git a/examples/chip-tool/commands/common/CHIPCommand.cpp b/examples/chip-tool/commands/common/CHIPCommand.cpp index 6d70fc68d8016e..b8568da129a48e 100644 --- a/examples/chip-tool/commands/common/CHIPCommand.cpp +++ b/examples/chip-tool/commands/common/CHIPCommand.cpp @@ -21,14 +21,18 @@ #include #include #include +#include #include -#include #include #include #include using DeviceControllerFactory = chip::Controller::DeviceControllerFactory; +constexpr chip::FabricId kIdentityAlphaFabricId = 1; +constexpr chip::FabricId kIdentityBetaFabricId = 2; +constexpr chip::FabricId kIdentityGammaFabricId = 3; + CHIP_ERROR CHIPCommand::Run() { #if CHIP_DEVICE_LAYER_TARGET_LINUX && CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE @@ -36,16 +40,102 @@ CHIP_ERROR CHIPCommand::Run() ReturnLogErrorOnFailure(chip::DeviceLayer::Internal::BLEMgrImpl().ConfigureBle(0, true)); #endif - ReturnLogErrorOnFailure(mStorage.Init()); - ReturnLogErrorOnFailure(mOpCredsIssuer.Initialize(mStorage)); - ReturnLogErrorOnFailure(mFabricStorage.Initialize(&mStorage)); + ReturnLogErrorOnFailure(mDefaultStorage.Init()); + ReturnLogErrorOnFailure(mFabricStorage.Initialize(&mDefaultStorage)); + + chip::Controller::FactoryInitParams factoryInitParams; + factoryInitParams.fabricStorage = &mFabricStorage; + factoryInitParams.listenPort = static_cast(mDefaultStorage.GetListenPort() + CurrentCommissionerIndex()); + ReturnLogErrorOnFailure(DeviceControllerFactory::GetInstance().Init(factoryInitParams)); + + ReturnLogErrorOnFailure(InitializeCommissioner(GetIdentity(), CurrentCommissionerIndex())); + + chip::DeviceLayer::PlatformMgr().ScheduleWork(RunQueuedCommand, reinterpret_cast(this)); + ReturnLogErrorOnFailure(StartWaiting(GetWaitDuration())); + + Shutdown(); + + // + // We can call DeviceController::Shutdown() safely without grabbing the stack lock + // since the CHIP thread and event queue have been stopped, preventing any thread + // races. + // + ReturnLogErrorOnFailure(ShutdownCommissioner(GetIdentity())); + + return CHIP_NO_ERROR; +} + +void CHIPCommand::SetIdentity(const char * identity) +{ + std::string name = std::string(identity); + if (name.compare(kIdentityAlpha) != 0 && name.compare(kIdentityBeta) != 0 && name.compare(kIdentityGamma) != 0) + { + ChipLogError(chipTool, "Unknown commissioner name: %s. Supported names are [%s, %s, %s]", name.c_str(), kIdentityAlpha, + kIdentityBeta, kIdentityGamma); + chipDie(); + } + + mCommissionerName.SetValue(const_cast(identity)); +} + +std::string CHIPCommand::GetIdentity() +{ + std::string name = mCommissionerName.HasValue() ? mCommissionerName.Value() : kIdentityAlpha; + if (name.compare(kIdentityAlpha) != 0 && name.compare(kIdentityBeta) != 0 && name.compare(kIdentityGamma) != 0) + { + ChipLogError(chipTool, "Unknown commissioner name: %s. Supported names are [%s, %s, %s]", name.c_str(), kIdentityAlpha, + kIdentityBeta, kIdentityGamma); + chipDie(); + } + + return name; +} + +uint16_t CHIPCommand::CurrentCommissionerIndex() +{ + uint16_t index = 0; + std::string name = GetIdentity(); + if (name.compare(kIdentityAlpha) == 0) + { + index = kIdentityAlphaFabricId; + } + else if (name.compare(kIdentityBeta) == 0) + { + index = kIdentityBetaFabricId; + } + else if (name.compare(kIdentityGamma) == 0) + { + index = kIdentityGammaFabricId; + } + + VerifyOrDieWithMsg(index != 0, chipTool, "Unknown commissioner name: %s. Supported names are [%s, %s, %s]", name.c_str(), + kIdentityAlpha, kIdentityBeta, kIdentityGamma); + return index; +} + +chip::Controller::DeviceCommissioner & CHIPCommand::CurrentCommissioner() +{ + auto item = mCommissioners.find(GetIdentity()); + return *item->second.get(); +} + +CHIP_ERROR CHIPCommand::ShutdownCommissioner(std::string key) +{ + return mCommissioners[key].get()->Shutdown(); +} + +CHIP_ERROR CHIPCommand::InitializeCommissioner(std::string key, chip::FabricId fabricId) +{ chip::Platform::ScopedMemoryBuffer noc; chip::Platform::ScopedMemoryBuffer icac; chip::Platform::ScopedMemoryBuffer rcac; chip::Credentials::SetDeviceAttestationCredentialsProvider(chip::Credentials::Examples::GetExampleDACProvider()); - chip::Credentials::SetDeviceAttestationVerifier(chip::Credentials::Examples::GetExampleDACVerifier()); + + // TODO: Replace testingRootStore with a AttestationTrustStore that has the necessary official PAA roots available + const chip::Credentials::AttestationTrustStore * testingRootStore = chip::Credentials::GetTestAttestationTrustStore(); + chip::Credentials::SetDeviceAttestationVerifier(chip::Credentials::GetDefaultDACVerifier(testingRootStore)); VerifyOrReturnError(noc.Alloc(chip::Controller::kMaxCHIPDERCertLength), CHIP_ERROR_NO_MEMORY); VerifyOrReturnError(icac.Alloc(chip::Controller::kMaxCHIPDERCertLength), CHIP_ERROR_NO_MEMORY); @@ -61,15 +151,14 @@ CHIP_ERROR CHIPCommand::Run() // TODO - OpCreds should only be generated for pairing command // store the credentials in persistent storage, and // generate when not available in the storage. - ReturnLogErrorOnFailure(mOpCredsIssuer.GenerateNOCChainAfterValidation(mStorage.GetLocalNodeId(), 0, ephemeralKey.Pubkey(), - rcacSpan, icacSpan, nocSpan)); - - chip::Controller::FactoryInitParams factoryInitParams; - factoryInitParams.fabricStorage = &mFabricStorage; - factoryInitParams.listenPort = mStorage.GetListenPort(); + ReturnLogErrorOnFailure(mCommissionerStorage.Init(key.c_str())); + ReturnLogErrorOnFailure(mOpCredsIssuer.Initialize(mCommissionerStorage)); + ReturnLogErrorOnFailure(mOpCredsIssuer.GenerateNOCChainAfterValidation(mCommissionerStorage.GetLocalNodeId(), fabricId, + ephemeralKey.Pubkey(), rcacSpan, icacSpan, nocSpan)); + std::unique_ptr commissioner = std::make_unique(); chip::Controller::SetupParams commissionerParams; - commissionerParams.storageDelegate = &mStorage; + commissionerParams.storageDelegate = &mCommissionerStorage; commissionerParams.operationalCredentialsDelegate = &mOpCredsIssuer; commissionerParams.ephemeralKeypair = &ephemeralKey; commissionerParams.controllerRCAC = rcacSpan; @@ -77,20 +166,8 @@ CHIP_ERROR CHIPCommand::Run() commissionerParams.controllerNOC = nocSpan; commissionerParams.controllerVendorId = chip::VendorId::TestVendor1; - ReturnLogErrorOnFailure(DeviceControllerFactory::GetInstance().Init(factoryInitParams)); - ReturnLogErrorOnFailure(DeviceControllerFactory::GetInstance().SetupCommissioner(commissionerParams, mController)); - - chip::DeviceLayer::PlatformMgr().ScheduleWork(RunQueuedCommand, reinterpret_cast(this)); - ReturnLogErrorOnFailure(StartWaiting(GetWaitDuration())); - - Shutdown(); - - // - // We can call DeviceController::Shutdown() safely without grabbing the stack lock - // since the CHIP thread and event queue have been stopped, preventing any thread - // races. - // - ReturnLogErrorOnFailure(mController.Shutdown()); + ReturnLogErrorOnFailure(DeviceControllerFactory::GetInstance().SetupCommissioner(commissionerParams, *(commissioner.get()))); + mCommissioners[key] = std::move(commissioner); return CHIP_NO_ERROR; } diff --git a/examples/chip-tool/commands/common/CHIPCommand.h b/examples/chip-tool/commands/common/CHIPCommand.h index 9bb5345e8f47fe..f1aeadbbffea81 100644 --- a/examples/chip-tool/commands/common/CHIPCommand.h +++ b/examples/chip-tool/commands/common/CHIPCommand.h @@ -18,6 +18,8 @@ #pragma once +#include + #include "../../config/PersistentStorage.h" #include "Command.h" @@ -25,18 +27,21 @@ class PersistentStorage; +constexpr const char kIdentityAlpha[] = "alpha"; +constexpr const char kIdentityBeta[] = "beta"; +constexpr const char kIdentityGamma[] = "gamma"; + class CHIPCommand : public Command { public: - using ChipDevice = ::chip::Controller::Device; + using ChipDevice = ::chip::DeviceProxy; using ChipDeviceCommissioner = ::chip::Controller::DeviceCommissioner; using ChipDeviceController = ::chip::Controller::DeviceController; - using ChipSerializedDevice = ::chip::Controller::SerializedDevice; using IPAddress = ::chip::Inet::IPAddress; using NodeId = ::chip::NodeId; using PeerAddress = ::chip::Transport::PeerAddress; - CHIPCommand(const char * commandName) : Command(commandName) {} + CHIPCommand(const char * commandName) : Command(commandName) { AddArgument("commissioner-name", &mCommissionerName); } /////////// Command Interface ///////// CHIP_ERROR Run() override; @@ -63,15 +68,29 @@ class CHIPCommand : public Command // loop has been stopped. virtual void Shutdown() {} - ChipDeviceCommissioner mController; - PersistentStorage mStorage; + PersistentStorage mDefaultStorage; + PersistentStorage mCommissionerStorage; chip::SimpleFabricStorage mFabricStorage; + chip::Controller::ExampleOperationalCredentialsIssuer mOpCredsIssuer; + + std::string GetIdentity(); + void SetIdentity(const char * name); + + // This method returns the commissioner instance to be used for running the command. + // The default commissioner instance name is "alpha", but it can be overriden by passing + // --identity "instance name" when running a command. + ChipDeviceCommissioner & CurrentCommissioner(); private: + CHIP_ERROR InitializeCommissioner(std::string key, chip::FabricId fabricId); + CHIP_ERROR ShutdownCommissioner(std::string key); + uint16_t CurrentCommissionerIndex(); + std::map> mCommissioners; + chip::Optional mCommissionerName; + static void RunQueuedCommand(intptr_t commandArg); CHIP_ERROR mCommandExitStatus = CHIP_ERROR_INTERNAL; - chip::Controller::ExampleOperationalCredentialsIssuer mOpCredsIssuer; CHIP_ERROR StartWaiting(chip::System::Clock::Timeout seconds); void StopWaiting(); diff --git a/examples/chip-tool/commands/common/Command.cpp b/examples/chip-tool/commands/common/Command.cpp index e1c9ba153c1d82..01559c5376599f 100644 --- a/examples/chip-tool/commands/common/Command.cpp +++ b/examples/chip-tool/commands/common/Command.cpp @@ -32,22 +32,71 @@ #include #include +constexpr const char * kOptionalArgumentPrefix = "--"; +constexpr size_t kOptionalArgumentPrefixLength = 2; + bool Command::InitArguments(int argc, char ** argv) { bool isValidCommand = false; - size_t argsCount = mArgs.size(); - VerifyOrExit(argsCount == (size_t)(argc), - ChipLogError(chipTool, "InitArgs: Wrong arguments number: %d instead of %zu", argc, argsCount)); + size_t argvExtraArgsCount = (size_t) argc; + size_t mandatoryArgsCount = 0; + size_t optionalArgsCount = 0; + for (size_t i = 0; i < mArgs.size(); i++) + { + if (mArgs[i].isOptional()) + { + optionalArgsCount++; + } + else + { + mandatoryArgsCount++; + argvExtraArgsCount--; + } + } - for (size_t i = 0; i < argsCount; i++) + VerifyOrExit((size_t)(argc) >= mandatoryArgsCount && (argvExtraArgsCount == 0 || (argvExtraArgsCount && optionalArgsCount)), + ChipLogError(chipTool, "InitArgs: Wrong arguments number: %d instead of %zu", argc, mandatoryArgsCount)); + + // Initialize mandatory arguments + for (size_t i = 0; i < mandatoryArgsCount; i++) { - if (!InitArgument(i, argv[i])) + char * arg = argv[i]; + if (!InitArgument(i, arg)) { ExitNow(); } } + // Initialize optional arguments + // Optional arguments expect a name and a value, so i is increased by 2 on every step. + for (size_t i = mandatoryArgsCount; i < (size_t) argc; i += 2) + { + bool found = false; + for (size_t j = mandatoryArgsCount; j < mandatoryArgsCount + optionalArgsCount; j++) + { + // optional arguments starts with kOptionalArgumentPrefix + if (strlen(argv[i]) <= kOptionalArgumentPrefixLength && + strncmp(argv[i], kOptionalArgumentPrefix, kOptionalArgumentPrefixLength) != 0) + { + continue; + } + + if (strcmp(argv[i] + strlen(kOptionalArgumentPrefix), mArgs[j].name) == 0) + { + found = true; + + VerifyOrExit((size_t) argc > (i + 1), + ChipLogError(chipTool, "InitArgs: Optional argument %s missing value.", argv[i])); + if (!InitArgument(j, argv[i + 1])) + { + ExitNow(); + } + } + } + VerifyOrExit(found, ChipLogError(chipTool, "InitArgs: Optional argument %s does not exist.", argv[i])); + } + isValidCommand = true; exit: @@ -84,6 +133,40 @@ static bool ParseAddressWithInterface(const char * addressString, Command::Addre return true; } +// The callback should return whether the argument is valid, for the non-null +// case. It can't directly write to isValidArgument (by closing over it) +// because in the nullable-and-null case we need to do that from this function, +// via the return value. +template +bool HandleNullableOptional(Argument & arg, char * argValue, std::function callback) +{ + if (arg.isOptional()) + { + if (arg.isNullable()) + { + arg.value = &(reinterpret_cast> *>(arg.value)->Emplace()); + } + else + { + arg.value = &(reinterpret_cast *>(arg.value)->Emplace()); + } + } + + if (arg.isNullable()) + { + auto * nullable = reinterpret_cast *>(arg.value); + if (strcmp(argValue, "null") == 0) + { + nullable->SetNull(); + return true; + } + + arg.value = &(nullable->SetNonNull()); + } + + return callback(reinterpret_cast(arg.value)); +} + bool Command::InitArgument(size_t argIndex, char * argValue) { bool isValidArgument = false; @@ -93,200 +176,234 @@ bool Command::InitArgument(size_t argIndex, char * argValue) switch (arg.type) { case ArgumentType::Attribute: { - char * value = reinterpret_cast(arg.value); - isValidArgument = (strcmp(argValue, value) == 0); + if (arg.isOptional() || arg.isNullable()) + { + isValidArgument = false; + } + else + { + char * value = reinterpret_cast(arg.value); + isValidArgument = (strcmp(argValue, value) == 0); + } break; } case ArgumentType::String: { - const char ** value = reinterpret_cast(arg.value); - *value = argValue; - isValidArgument = true; + isValidArgument = HandleNullableOptional(arg, argValue, [&](auto * value) { + *value = argValue; + return true; + }); break; } case ArgumentType::CharString: { - auto * value = static_cast *>(arg.value); - *value = chip::Span(argValue, strlen(argValue)); - isValidArgument = true; + isValidArgument = HandleNullableOptional(arg, argValue, [&](auto * value) { + *value = chip::Span(argValue, strlen(argValue)); + return true; + }); break; } case ArgumentType::OctetString: { - auto * value = static_cast(arg.value); - // We support two ways to pass an octet string argument. If it happens - // to be all-ASCII, you can just pass it in. Otherwise you can pass in - // 0x followed by the hex-encoded bytes. - size_t argLen = strlen(argValue); - static constexpr char hexPrefix[] = "hex:"; - constexpr size_t prefixLen = ArraySize(hexPrefix) - 1; // Don't count the null - if (strncmp(argValue, hexPrefix, prefixLen) == 0) - { - // Hex-encoded. Decode it into a temporary buffer first, so if we - // run into errors we can do correct "argument is not valid" logging - // that actually shows the value that was passed in. After we - // determine it's valid, modify the passed-in value to hold the - // right bytes, so we don't need to worry about allocating storage - // for this somewhere else. This works because the hex - // representation is always longer than the octet string it encodes, - // so we have enough space in argValue for the decoded version. - chip::Platform::ScopedMemoryBuffer buffer; - if (!buffer.Calloc(argLen)) // Bigger than needed, but it's fine. + isValidArgument = HandleNullableOptional(arg, argValue, [&](auto * value) { + // We support two ways to pass an octet string argument. If it happens + // to be all-ASCII, you can just pass it in. Otherwise you can pass in + // 0x followed by the hex-encoded bytes. + size_t argLen = strlen(argValue); + static constexpr char hexPrefix[] = "hex:"; + constexpr size_t prefixLen = ArraySize(hexPrefix) - 1; // Don't count the null + if (strncmp(argValue, hexPrefix, prefixLen) == 0) { - isValidArgument = false; - break; + // Hex-encoded. Decode it into a temporary buffer first, so if we + // run into errors we can do correct "argument is not valid" logging + // that actually shows the value that was passed in. After we + // determine it's valid, modify the passed-in value to hold the + // right bytes, so we don't need to worry about allocating storage + // for this somewhere else. This works because the hex + // representation is always longer than the octet string it encodes, + // so we have enough space in argValue for the decoded version. + chip::Platform::ScopedMemoryBuffer buffer; + if (!buffer.Calloc(argLen)) // Bigger than needed, but it's fine. + { + return false; + } + + size_t octetCount = chip::Encoding::HexToBytes(argValue + prefixLen, argLen - prefixLen, buffer.Get(), argLen); + if (octetCount == 0) + { + return false; + } + + memcpy(argValue, buffer.Get(), octetCount); + *value = chip::ByteSpan(chip::Uint8::from_char(argValue), octetCount); + return true; } - - size_t octetCount = chip::Encoding::HexToBytes(argValue + prefixLen, argLen - prefixLen, buffer.Get(), argLen); - if (octetCount == 0) + else { - isValidArgument = false; - break; + // Just ASCII. Check for the "str:" prefix. + static constexpr char strPrefix[] = "str:"; + constexpr size_t strPrefixLen = ArraySize(strPrefix) - 1; // Don't count the null + if (strncmp(argValue, strPrefix, strPrefixLen) == 0) + { + // Skip the prefix + argValue += strPrefixLen; + argLen -= strPrefixLen; + } + *value = chip::ByteSpan(chip::Uint8::from_char(argValue), argLen); + return true; } - - memcpy(argValue, buffer.Get(), octetCount); - *value = chip::ByteSpan(chip::Uint8::from_char(argValue), octetCount); - isValidArgument = true; - } - else - { - // Just ASCII. Check for the "str:" prefix. - static constexpr char strPrefix[] = "str:"; - constexpr size_t strPrefixLen = ArraySize(strPrefix) - 1; // Don't count the null - if (strncmp(argValue, strPrefix, strPrefixLen) == 0) - { - // Skip the prefix - argValue += strPrefixLen; - argLen -= strPrefixLen; - } - *value = chip::ByteSpan(chip::Uint8::from_char(argValue), argLen); - isValidArgument = true; - } + }); break; } case ArgumentType::Boolean: case ArgumentType::Number_uint8: { - uint8_t * value = reinterpret_cast(arg.value); - - // stringstream treats uint8_t as char, which is not what we want here. - uint16_t tmpValue; - std::stringstream ss; - isHexNotation ? ss << std::hex << argValue : ss << argValue; - ss >> tmpValue; - if (chip::CanCastTo(tmpValue)) - { - *value = static_cast(tmpValue); + isValidArgument = HandleNullableOptional(arg, argValue, [&](auto * value) { + // stringstream treats uint8_t as char, which is not what we want here. + uint16_t tmpValue; + std::stringstream ss; + isHexNotation ? ss << std::hex << argValue : ss << argValue; + ss >> tmpValue; + if (chip::CanCastTo(tmpValue)) + { + *value = static_cast(tmpValue); - uint64_t min = chip::CanCastTo(arg.min) ? static_cast(arg.min) : 0; - uint64_t max = arg.max; - isValidArgument = (!ss.fail() && ss.eof() && *value >= min && *value <= max); - } - else - { - isValidArgument = false; - } + uint64_t min = chip::CanCastTo(arg.min) ? static_cast(arg.min) : 0; + uint64_t max = arg.max; + return (!ss.fail() && ss.eof() && *value >= min && *value <= max); + } + else + { + return false; + } + }); break; } case ArgumentType::Number_uint16: { - uint16_t * value = reinterpret_cast(arg.value); - std::stringstream ss; - isHexNotation ? ss << std::hex << argValue : ss << argValue; - ss >> *value; - - uint64_t min = chip::CanCastTo(arg.min) ? static_cast(arg.min) : 0; - uint64_t max = arg.max; - isValidArgument = (!ss.fail() && ss.eof() && *value >= min && *value <= max); + isValidArgument = HandleNullableOptional(arg, argValue, [&](auto * value) { + std::stringstream ss; + isHexNotation ? ss << std::hex << argValue : ss << argValue; + ss >> *value; + + uint64_t min = chip::CanCastTo(arg.min) ? static_cast(arg.min) : 0; + uint64_t max = arg.max; + return (!ss.fail() && ss.eof() && *value >= min && *value <= max); + }); break; } case ArgumentType::Number_uint32: { - uint32_t * value = reinterpret_cast(arg.value); - std::stringstream ss; - isHexNotation ? ss << std::hex << argValue : ss << argValue; - ss >> *value; - - uint64_t min = chip::CanCastTo(arg.min) ? static_cast(arg.min) : 0; - uint64_t max = arg.max; - isValidArgument = (!ss.fail() && ss.eof() && *value >= min && *value <= max); + isValidArgument = HandleNullableOptional(arg, argValue, [&](auto * value) { + std::stringstream ss; + isHexNotation ? ss << std::hex << argValue : ss << argValue; + ss >> *value; + + uint64_t min = chip::CanCastTo(arg.min) ? static_cast(arg.min) : 0; + uint64_t max = arg.max; + return (!ss.fail() && ss.eof() && *value >= min && *value <= max); + }); break; } case ArgumentType::Number_uint64: { - uint64_t * value = reinterpret_cast(arg.value); - std::stringstream ss; - isHexNotation ? ss << std::hex << argValue : ss << argValue; - ss >> *value; - - uint64_t min = chip::CanCastTo(arg.min) ? static_cast(arg.min) : 0; - uint64_t max = arg.max; - isValidArgument = (!ss.fail() && ss.eof() && *value >= min && *value <= max); + isValidArgument = HandleNullableOptional(arg, argValue, [&](auto * value) { + std::stringstream ss; + isHexNotation ? ss << std::hex << argValue : ss << argValue; + ss >> *value; + + uint64_t min = chip::CanCastTo(arg.min) ? static_cast(arg.min) : 0; + uint64_t max = arg.max; + return (!ss.fail() && ss.eof() && *value >= min && *value <= max); + }); break; } case ArgumentType::Number_int8: { - int8_t * value = reinterpret_cast(arg.value); - - // stringstream treats int8_t as char, which is not what we want here. - int16_t tmpValue; - std::stringstream ss; - isHexNotation ? ss << std::hex << argValue : ss << argValue; - ss >> tmpValue; - if (chip::CanCastTo(tmpValue)) - { - *value = static_cast(tmpValue); + isValidArgument = HandleNullableOptional(arg, argValue, [&](auto * value) { + // stringstream treats int8_t as char, which is not what we want here. + int16_t tmpValue; + std::stringstream ss; + isHexNotation ? ss << std::hex << argValue : ss << argValue; + ss >> tmpValue; + if (chip::CanCastTo(tmpValue)) + { + *value = static_cast(tmpValue); - int64_t min = arg.min; - int64_t max = chip::CanCastTo(arg.max) ? static_cast(arg.max) : INT64_MAX; - isValidArgument = (!ss.fail() && ss.eof() && *value >= min && *value <= max); - } - else - { - isValidArgument = false; - } + int64_t min = arg.min; + int64_t max = chip::CanCastTo(arg.max) ? static_cast(arg.max) : INT64_MAX; + return (!ss.fail() && ss.eof() && *value >= min && *value <= max); + } + else + { + return false; + } + }); break; } case ArgumentType::Number_int16: { - int16_t * value = reinterpret_cast(arg.value); - std::stringstream ss; - isHexNotation ? ss << std::hex << argValue : ss << argValue; - ss >> *value; - - int64_t min = arg.min; - int64_t max = chip::CanCastTo(arg.max) ? static_cast(arg.max) : INT64_MAX; - isValidArgument = (!ss.fail() && ss.eof() && *value >= min && *value <= max); + isValidArgument = HandleNullableOptional(arg, argValue, [&](auto * value) { + std::stringstream ss; + isHexNotation ? ss << std::hex << argValue : ss << argValue; + ss >> *value; + + int64_t min = arg.min; + int64_t max = chip::CanCastTo(arg.max) ? static_cast(arg.max) : INT64_MAX; + return (!ss.fail() && ss.eof() && *value >= min && *value <= max); + }); break; } case ArgumentType::Number_int32: { - int32_t * value = reinterpret_cast(arg.value); - std::stringstream ss; - isHexNotation ? ss << std::hex << argValue : ss << argValue; - ss >> *value; - - int64_t min = arg.min; - int64_t max = chip::CanCastTo(arg.max) ? static_cast(arg.max) : INT64_MAX; - isValidArgument = (!ss.fail() && ss.eof() && *value >= min && *value <= max); + isValidArgument = HandleNullableOptional(arg, argValue, [&](auto * value) { + std::stringstream ss; + isHexNotation ? ss << std::hex << argValue : ss << argValue; + ss >> *value; + + int64_t min = arg.min; + int64_t max = chip::CanCastTo(arg.max) ? static_cast(arg.max) : INT64_MAX; + return (!ss.fail() && ss.eof() && *value >= min && *value <= max); + }); break; } case ArgumentType::Number_int64: { - int64_t * value = reinterpret_cast(arg.value); - std::stringstream ss; - isHexNotation ? ss << std::hex << argValue : ss << argValue; - ss >> *value; - - int64_t min = arg.min; - int64_t max = chip::CanCastTo(arg.max) ? static_cast(arg.max) : INT64_MAX; - isValidArgument = (!ss.fail() && ss.eof() && *value >= min && *value <= max); + isValidArgument = HandleNullableOptional(arg, argValue, [&](auto * value) { + std::stringstream ss; + isHexNotation ? ss << std::hex << argValue : ss << argValue; + ss >> *value; + + int64_t min = arg.min; + int64_t max = chip::CanCastTo(arg.max) ? static_cast(arg.max) : INT64_MAX; + return (!ss.fail() && ss.eof() && *value >= min && *value <= max); + }); + break; + } + + case ArgumentType::Float: { + isValidArgument = HandleNullableOptional(arg, argValue, [&](auto * value) { + std::stringstream ss; + ss << argValue; + ss >> *value; + return (!ss.fail() && ss.eof()); + }); + break; + } + + case ArgumentType::Double: { + isValidArgument = HandleNullableOptional(arg, argValue, [&](auto * value) { + std::stringstream ss; + ss << argValue; + ss >> *value; + return (!ss.fail() && ss.eof()); + }); break; } case ArgumentType::Address: { - AddressWithInterface * value = reinterpret_cast(arg.value); - isValidArgument = ParseAddressWithInterface(argValue, value); + isValidArgument = HandleNullableOptional( + arg, argValue, [&](auto * value) { return ParseAddressWithInterface(argValue, value); }); break; } } @@ -299,62 +416,86 @@ bool Command::InitArgument(size_t argIndex, char * argValue) return isValidArgument; } -size_t Command::AddArgument(const char * name, const char * value) +size_t Command::AddArgument(const char * name, const char * value, uint8_t flags) { Argument arg; arg.type = ArgumentType::Attribute; arg.name = name; arg.value = const_cast(reinterpret_cast(value)); + arg.flags = flags; - mArgs.emplace_back(arg); - return mArgs.size(); + return AddArgumentToList(std::move(arg)); } -size_t Command::AddArgument(const char * name, char ** value) +size_t Command::AddArgument(const char * name, char ** value, uint8_t flags) { Argument arg; - arg.type = ArgumentType::CharString; + arg.type = ArgumentType::String; arg.name = name; arg.value = reinterpret_cast(value); + arg.flags = flags; - mArgs.emplace_back(arg); - return mArgs.size(); + return AddArgumentToList(std::move(arg)); } -size_t Command::AddArgument(const char * name, chip::CharSpan * value) +size_t Command::AddArgument(const char * name, chip::CharSpan * value, uint8_t flags) { Argument arg; arg.type = ArgumentType::CharString; arg.name = name; arg.value = reinterpret_cast(value); + arg.flags = flags; - mArgs.emplace_back(arg); - return mArgs.size(); + return AddArgumentToList(std::move(arg)); } -size_t Command::AddArgument(const char * name, chip::ByteSpan * value) +size_t Command::AddArgument(const char * name, chip::ByteSpan * value, uint8_t flags) { Argument arg; arg.type = ArgumentType::OctetString; arg.name = name; arg.value = reinterpret_cast(value); + arg.flags = flags; - mArgs.emplace_back(arg); - return mArgs.size(); + return AddArgumentToList(std::move(arg)); } -size_t Command::AddArgument(const char * name, AddressWithInterface * out) +size_t Command::AddArgument(const char * name, AddressWithInterface * out, uint8_t flags) { Argument arg; arg.type = ArgumentType::Address; arg.name = name; arg.value = reinterpret_cast(out); + arg.flags = flags; + + return AddArgumentToList(std::move(arg)); +} + +size_t Command::AddArgument(const char * name, float min, float max, float * out, uint8_t flags) +{ + Argument arg; + arg.type = ArgumentType::Float; + arg.name = name; + arg.value = reinterpret_cast(out); + arg.flags = flags; + // Ignore min/max for now; they're always +-Infinity anyway. + + return AddArgumentToList(std::move(arg)); +} + +size_t Command::AddArgument(const char * name, double min, double max, double * out, uint8_t flags) +{ + Argument arg; + arg.type = ArgumentType::Double; + arg.name = name; + arg.value = reinterpret_cast(out); + arg.flags = flags; + // Ignore min/max for now; they're always +-Infinity anyway. - mArgs.emplace_back(arg); - return mArgs.size(); + return AddArgumentToList(std::move(arg)); } -size_t Command::AddArgument(const char * name, int64_t min, uint64_t max, void * out, ArgumentType type) +size_t Command::AddArgument(const char * name, int64_t min, uint64_t max, void * out, ArgumentType type, uint8_t flags) { Argument arg; arg.type = type; @@ -362,12 +503,12 @@ size_t Command::AddArgument(const char * name, int64_t min, uint64_t max, void * arg.value = out; arg.min = min; arg.max = max; + arg.flags = flags; - mArgs.emplace_back(arg); - return mArgs.size(); + return AddArgumentToList(std::move(arg)); } -size_t Command::AddArgument(const char * name, int64_t min, uint64_t max, void * out) +size_t Command::AddArgument(const char * name, int64_t min, uint64_t max, void * out, uint8_t flags) { Argument arg; arg.type = ArgumentType::Number_uint8; @@ -375,9 +516,9 @@ size_t Command::AddArgument(const char * name, int64_t min, uint64_t max, void * arg.value = out; arg.min = min; arg.max = max; + arg.flags = flags; - mArgs.emplace_back(arg); - return mArgs.size(); + return AddArgumentToList(std::move(arg)); } const char * Command::GetArgumentName(size_t index) const @@ -404,3 +545,28 @@ const char * Command::GetAttribute(void) const return nullptr; } + +size_t Command::AddArgumentToList(Argument && argument) +{ + if (argument.isOptional() || mArgs.empty() || !mArgs.back().isOptional()) + { + // Safe to just append. + mArgs.emplace_back(std::move(argument)); + return mArgs.size(); + } + + // We're inserting a non-optional arg but we already have something optional + // in the list. Insert before the first optional arg. + for (auto cur = mArgs.cbegin(), end = mArgs.cend(); cur != end; ++cur) + { + if ((*cur).isOptional()) + { + mArgs.emplace(cur, std::move(argument)); + return mArgs.size(); + } + } + + // Never reached. + VerifyOrDie(false); + return 0; +} diff --git a/examples/chip-tool/commands/common/Command.h b/examples/chip-tool/commands/common/Command.h index e3da77dd679108..d1f5955eeb7266 100644 --- a/examples/chip-tool/commands/common/Command.h +++ b/examples/chip-tool/commands/common/Command.h @@ -18,7 +18,6 @@ #pragma once -#include "controller/ExampleOperationalCredentialsIssuer.h" #include #include #include @@ -34,6 +33,10 @@ class Command; +// Limits on endpoint values. +#define CHIP_ZCL_ENDPOINT_MIN 0x00 +#define CHIP_ZCL_ENDPOINT_MAX 0xF0 + template std::unique_ptr make_unique(Args &&... args) { @@ -59,6 +62,8 @@ enum ArgumentType Number_int16, Number_int32, Number_int64, + Float, + Double, Boolean, String, CharString, @@ -74,6 +79,16 @@ struct Argument int64_t min; uint64_t max; void * value; + uint8_t flags; + + enum + { + kOptional = (1 << 0), + kNullable = (1 << 1), + }; + + bool isOptional() const { return flags & kOptional; } + bool isNullable() const { return flags & kNullable; } }; class Command @@ -91,10 +106,11 @@ class Command const char * GetName(void) const { return mName; } const char * GetAttribute(void) const; const char * GetArgumentName(size_t index) const; + bool GetArgumentIsOptional(size_t index) const { return mArgs[index].isOptional(); } size_t GetArgumentsCount(void) const { return mArgs.size(); } bool InitArguments(int argc, char ** argv); - size_t AddArgument(const char * name, const char * value); + size_t AddArgument(const char * name, const char * value, uint8_t flags = 0); /** * @brief * Add a char string command argument @@ -103,90 +119,106 @@ class Command * @param value A pointer to a `char *` where the argv value will be stored * @returns The number of arguments currently added to the command */ - size_t AddArgument(const char * name, char ** value); + size_t AddArgument(const char * name, char ** value, uint8_t flags = 0); + /** * Add an octet string command argument */ - size_t AddArgument(const char * name, chip::ByteSpan * value); - size_t AddArgument(const char * name, chip::Span * value); - size_t AddArgument(const char * name, AddressWithInterface * out); - size_t AddArgument(const char * name, int64_t min, uint64_t max, bool * out) + size_t AddArgument(const char * name, chip::ByteSpan * value, uint8_t flags = 0); + size_t AddArgument(const char * name, chip::Span * value, uint8_t flags = 0); + size_t AddArgument(const char * name, AddressWithInterface * out, uint8_t flags = 0); + size_t AddArgument(const char * name, int64_t min, uint64_t max, bool * out, uint8_t flags = 0) { - return AddArgument(name, min, max, reinterpret_cast(out), Boolean); + return AddArgument(name, min, max, reinterpret_cast(out), Boolean, flags); } - size_t AddArgument(const char * name, int64_t min, uint64_t max, int8_t * out) + size_t AddArgument(const char * name, int64_t min, uint64_t max, int8_t * out, uint8_t flags = 0) { - return AddArgument(name, min, max, reinterpret_cast(out), Number_int8); + return AddArgument(name, min, max, reinterpret_cast(out), Number_int8, flags); } - size_t AddArgument(const char * name, int64_t min, uint64_t max, int16_t * out) + size_t AddArgument(const char * name, int64_t min, uint64_t max, int16_t * out, uint8_t flags = 0) { - return AddArgument(name, min, max, reinterpret_cast(out), Number_int16); + return AddArgument(name, min, max, reinterpret_cast(out), Number_int16, flags); } - size_t AddArgument(const char * name, int64_t min, uint64_t max, int32_t * out) + size_t AddArgument(const char * name, int64_t min, uint64_t max, int32_t * out, uint8_t flags = 0) { - return AddArgument(name, min, max, reinterpret_cast(out), Number_int32); + return AddArgument(name, min, max, reinterpret_cast(out), Number_int32, flags); } - size_t AddArgument(const char * name, int64_t min, uint64_t max, int64_t * out) + size_t AddArgument(const char * name, int64_t min, uint64_t max, int64_t * out, uint8_t flags = 0) { - return AddArgument(name, min, max, reinterpret_cast(out), Number_int64); + return AddArgument(name, min, max, reinterpret_cast(out), Number_int64, flags); } - size_t AddArgument(const char * name, int64_t min, uint64_t max, uint8_t * out) + size_t AddArgument(const char * name, int64_t min, uint64_t max, uint8_t * out, uint8_t flags = 0) { - return AddArgument(name, min, max, reinterpret_cast(out), Number_uint8); + return AddArgument(name, min, max, reinterpret_cast(out), Number_uint8, flags); } - size_t AddArgument(const char * name, int64_t min, uint64_t max, uint16_t * out) + size_t AddArgument(const char * name, int64_t min, uint64_t max, uint16_t * out, uint8_t flags = 0) { - return AddArgument(name, min, max, reinterpret_cast(out), Number_uint16); + return AddArgument(name, min, max, reinterpret_cast(out), Number_uint16, flags); } - size_t AddArgument(const char * name, int64_t min, uint64_t max, uint32_t * out) + size_t AddArgument(const char * name, int64_t min, uint64_t max, uint32_t * out, uint8_t flags = 0) { - return AddArgument(name, min, max, reinterpret_cast(out), Number_uint32); + return AddArgument(name, min, max, reinterpret_cast(out), Number_uint32, flags); } - size_t AddArgument(const char * name, int64_t min, uint64_t max, uint64_t * out) + size_t AddArgument(const char * name, int64_t min, uint64_t max, uint64_t * out, uint8_t flags = 0) { - return AddArgument(name, min, max, reinterpret_cast(out), Number_uint64); + return AddArgument(name, min, max, reinterpret_cast(out), Number_uint64, flags); } + size_t AddArgument(const char * name, float min, float max, float * out, uint8_t flags = 0); + size_t AddArgument(const char * name, double min, double max, double * out, uint8_t flags = 0); + template ::value>> - size_t AddArgument(const char * name, int64_t min, uint64_t max, T * out) + size_t AddArgument(const char * name, int64_t min, uint64_t max, T * out, uint8_t flags = 0) { - return AddArgument(name, min, max, reinterpret_cast *>(out)); + return AddArgument(name, min, max, reinterpret_cast *>(out), flags); } template size_t AddArgument(const char * name, chip::Optional * value) { - // We always require our args to be provided for the moment. - return AddArgument(name, &value->Emplace()); + return AddArgument(name, reinterpret_cast(value), Argument::kOptional); } template size_t AddArgument(const char * name, int64_t min, uint64_t max, chip::Optional * value) { - // We always require our args to be provided for the moment. - return AddArgument(name, min, max, &value->Emplace()); + return AddArgument(name, min, max, reinterpret_cast(value), Argument::kOptional); } template - size_t AddArgument(const char * name, chip::app::DataModel::Nullable * value) + size_t AddArgument(const char * name, chip::app::DataModel::Nullable * value, uint8_t flags = 0) { - // We always require our args to be provided for the moment. - return AddArgument(name, &value->SetNonNull()); + return AddArgument(name, reinterpret_cast(value), flags | Argument::kNullable); } template - size_t AddArgument(const char * name, int64_t min, uint64_t max, chip::app::DataModel::Nullable * value) + size_t AddArgument(const char * name, int64_t min, uint64_t max, chip::app::DataModel::Nullable * value, uint8_t flags = 0) + { + return AddArgument(name, min, max, reinterpret_cast(value), flags | Argument::kNullable); + } + + size_t AddArgument(const char * name, float min, float max, chip::app::DataModel::Nullable * value, uint8_t flags = 0) + { + return AddArgument(name, min, max, reinterpret_cast(value), flags | Argument::kNullable); + } + + size_t AddArgument(const char * name, double min, double max, chip::app::DataModel::Nullable * value, uint8_t flags = 0) { - // We always require our args to be provided for the moment. - return AddArgument(name, min, max, &value->SetNonNull()); + return AddArgument(name, min, max, reinterpret_cast(value), flags | Argument::kNullable); } virtual CHIP_ERROR Run() = 0; private: bool InitArgument(size_t argIndex, char * argValue); - size_t AddArgument(const char * name, int64_t min, uint64_t max, void * out, ArgumentType type); - size_t AddArgument(const char * name, int64_t min, uint64_t max, void * out); + size_t AddArgument(const char * name, int64_t min, uint64_t max, void * out, ArgumentType type, uint8_t flags); + size_t AddArgument(const char * name, int64_t min, uint64_t max, void * out, uint8_t flags); + + /** + * Add the Argument to our list. This preserves the property that all + * optional arguments come at the end of the list. + */ + size_t AddArgumentToList(Argument && argument); const char * mName = nullptr; std::vector mArgs; diff --git a/examples/chip-tool/commands/common/CommandInvoker.h b/examples/chip-tool/commands/common/CommandInvoker.h new file mode 100644 index 00000000000000..6583cc9124280e --- /dev/null +++ b/examples/chip-tool/commands/common/CommandInvoker.h @@ -0,0 +1,234 @@ +/* + * 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 + +namespace chip { +namespace Controller { +namespace detail { +template +class ResponseReceiver : public app::CommandSender::Callback +{ +public: + using SuccessCallback = void (*)(void * context, const ResponseType & data); + using FailureCallback = void (*)(void * context, EmberAfStatus status); + + virtual ~ResponseReceiver() {} + +protected: + ResponseReceiver(void * aContext, SuccessCallback aOnSuccess, FailureCallback aOnError) : + mContext(aContext), mOnSuccess(aOnSuccess), mOnError(aOnError) + {} + + inline void OnResponse(app::CommandSender * aCommandSender, const app::ConcreteCommandPath & aPath, + const app::StatusIB & aStatus, TLV::TLVReader * aData) override; + + void OnError(const app::CommandSender * aCommandSender, const app::StatusIB & aStatus, CHIP_ERROR aError) override + { + mOnError(mContext, app::ToEmberAfStatus(aStatus.mStatus)); + } + + void OnDone(app::CommandSender * aCommandSender) override + { + Platform::Delete(aCommandSender); + Platform::Delete(this); + } + +private: + void * mContext; + SuccessCallback mOnSuccess; + FailureCallback mOnError; +}; + +template +class CommandInvoker final : public ResponseReceiver +{ + using Super = ResponseReceiver; + +public: + CommandInvoker(void * aContext, typename Super::SuccessCallback aOnSuccess, typename Super::FailureCallback aOnError) : + Super(aContext, aOnSuccess, aOnError) + {} + + /** + * Use of CommandInvoker looks as follows: + * + * auto invoker = CommandInvoker::Alloc(args); + * VerifyOrReturnError(invoker != nullptr, CHIP_ERROR_NO_MEMORY); + * ReturnErrorOnFailure(invoker->InvokeCommand(args)); + * invoker.release(); // The invoker will deallocate itself now. + */ + static auto Alloc(void * aContext, typename Super::SuccessCallback aOnSuccess, typename Super::FailureCallback aOnError) + { + return Platform::MakeUnique(aContext, aOnSuccess, aOnError); + } + + CHIP_ERROR InvokeCommand(DeviceProxy * aDevice, EndpointId aEndpoint, const RequestType & aRequestData, + const Optional & aTimedInvokeTimeoutMs) + { + app::CommandPathParams commandPath = { aEndpoint, 0 /* groupId */, RequestType::GetClusterId(), RequestType::GetCommandId(), + (app::CommandPathFlags::kEndpointIdValid) }; + auto commandSender = + Platform::MakeUnique(this, aDevice->GetExchangeManager(), aTimedInvokeTimeoutMs.HasValue()); + VerifyOrReturnError(commandSender != nullptr, CHIP_ERROR_NO_MEMORY); + + ReturnErrorOnFailure(commandSender->AddRequestDataNoTimedCheck(commandPath, aRequestData, aTimedInvokeTimeoutMs)); + ReturnErrorOnFailure(commandSender->SendCommandRequest(aDevice->GetSecureSession().Value())); + commandSender.release(); + return CHIP_NO_ERROR; + } + + CHIP_ERROR InvokeGroupCommand(DeviceProxy * aDevice, GroupId groupId, const RequestType & aRequestData) + { + app::CommandPathParams commandPath = { 0 /* endpoint */, groupId, RequestType::GetClusterId(), RequestType::GetCommandId(), + (app::CommandPathFlags::kGroupIdValid) }; + + auto commandSender = Platform::MakeUnique(this, aDevice->GetExchangeManager()); + VerifyOrReturnError(commandSender != nullptr, CHIP_ERROR_NO_MEMORY); + + ReturnErrorOnFailure(commandSender->AddRequestData(commandPath, aRequestData)); + + if (aDevice->GetSecureSession().HasValue()) + { + SessionHandle session = aDevice->GetSecureSession().Value(); + session.SetGroupId(groupId); + + if (!session.IsGroupSession()) + { + return CHIP_ERROR_INCORRECT_STATE; + } + + ReturnErrorOnFailure(commandSender->SendCommandRequest(session)); + } + else + { + // something fishy is going on + return CHIP_ERROR_INCORRECT_STATE; + } + + commandSender.release(); + return CHIP_NO_ERROR; + } +}; + +template +void ResponseReceiver::OnResponse(app::CommandSender * aCommandSender, const app::ConcreteCommandPath & aPath, + const app::StatusIB & aStatus, TLV::TLVReader * aData) +{ + ResponseType response; + CHIP_ERROR err = CHIP_NO_ERROR; + + // + // We're expecting response data in this variant of OnResponse. Consequently, aReader should always be + // non-null. If it is, it means we received a success status code instead, which is not what was expected. + // + VerifyOrExit(aData != nullptr, err = CHIP_ERROR_SCHEMA_MISMATCH); + + // + // Validate that the data response we received matches what we expect in terms of its cluster and command IDs. + // + VerifyOrExit(aPath.mClusterId == ResponseType::GetClusterId() && aPath.mCommandId == ResponseType::GetCommandId(), + err = CHIP_ERROR_SCHEMA_MISMATCH); + + err = app::DataModel::Decode(*aData, response); + SuccessOrExit(err); + + mOnSuccess(mContext, response); + +exit: + if (err != CHIP_NO_ERROR) + { + mOnError(mContext, app::ToEmberAfStatus(Protocols::InteractionModel::Status::Failure)); + } +} + +template <> +inline void ResponseReceiver::OnResponse(app::CommandSender * aCommandSender, + const app::ConcreteCommandPath & aPath, + const app::StatusIB & aStatus, TLV::TLVReader * aData) +{ + // + // If we got a valid reader, it means we received response data that we were not expecting to receive. + // + if (aData != nullptr) + { + mOnError(mContext, app::ToEmberAfStatus(Protocols::InteractionModel::Status::Failure)); + return; + } + + app::DataModel::NullObjectType nullResp; + mOnSuccess(mContext, nullResp); +} + +} // namespace detail + +template +CHIP_ERROR InvokeCommand(DeviceProxy * aDevice, void * aContext, + typename detail::CommandInvoker::SuccessCallback aSuccessCallback, + typename detail::CommandInvoker::FailureCallback aFailureCallback, EndpointId aEndpoint, + const RequestType & aRequestData, const Optional & aTimedInvokeTimeoutMs) +{ + auto invoker = detail::CommandInvoker::Alloc(aContext, aSuccessCallback, aFailureCallback); + VerifyOrReturnError(invoker != nullptr, CHIP_ERROR_NO_MEMORY); + ReturnErrorOnFailure(invoker->InvokeCommand(aDevice, aEndpoint, aRequestData, aTimedInvokeTimeoutMs)); + invoker.release(); + return CHIP_NO_ERROR; +} + +template +CHIP_ERROR InvokeCommand(DeviceProxy * aDevice, void * aContext, + typename detail::CommandInvoker::SuccessCallback aSuccessCallback, + typename detail::CommandInvoker::FailureCallback aFailureCallback, EndpointId aEndpoint, + const RequestType & aRequestData, uint16_t aTimedInvokeTimeoutMs) +{ + return InvokeCommand(aDevice, aContext, aSuccessCallback, aFailureCallback, aEndpoint, aRequestData, + MakeOptional(aTimedInvokeTimeoutMs)); +} + +template = 0> +CHIP_ERROR InvokeCommand(DeviceProxy * aDevice, void * aContext, + typename detail::CommandInvoker::SuccessCallback aSuccessCallback, + typename detail::CommandInvoker::FailureCallback aFailureCallback, EndpointId aEndpoint, + const RequestType & aRequestData) +{ + return InvokeCommand(aDevice, aContext, aSuccessCallback, aFailureCallback, aEndpoint, aRequestData, NullOptional); +} + +// Group commands can't do timed invoke in a meaningful way. +template = 0> +CHIP_ERROR InvokeGroupCommand(DeviceProxy * aDevice, void * aContext, + typename detail::CommandInvoker::SuccessCallback aSuccessCallback, + typename detail::CommandInvoker::FailureCallback aFailureCallback, GroupId groupId, + const RequestType & aRequestData) +{ + auto invoker = detail::CommandInvoker::Alloc(aContext, aSuccessCallback, aFailureCallback); + VerifyOrReturnError(invoker != nullptr, CHIP_ERROR_NO_MEMORY); + ReturnErrorOnFailure(invoker->InvokeGroupCommand(aDevice, groupId, aRequestData)); + invoker.release(); + return CHIP_NO_ERROR; +} + +} // namespace Controller +} // namespace chip diff --git a/examples/chip-tool/commands/common/Commands.cpp b/examples/chip-tool/commands/common/Commands.cpp index 18550d724853e7..555c03a1133071 100644 --- a/examples/chip-tool/commands/common/Commands.cpp +++ b/examples/chip-tool/commands/common/Commands.cpp @@ -255,7 +255,16 @@ void Commands::ShowCommand(std::string executable, std::string clusterName, Comm for (size_t i = 0; i < argumentsCount; i++) { arguments += " "; + bool isOptional = command->GetArgumentIsOptional(i); + if (isOptional) + { + arguments += "[--"; + } arguments += command->GetArgumentName(i); + if (isOptional) + { + arguments += "]"; + } } fprintf(stderr, " %s %s %s\n", executable.c_str(), clusterName.c_str(), arguments.c_str()); } diff --git a/examples/chip-tool/commands/common/Commands.h b/examples/chip-tool/commands/common/Commands.h index cc1d027ba987b7..90dabbe33f6dc7 100644 --- a/examples/chip-tool/commands/common/Commands.h +++ b/examples/chip-tool/commands/common/Commands.h @@ -20,7 +20,6 @@ #include "../../config/PersistentStorage.h" #include "Command.h" -#include #include class Commands diff --git a/examples/chip-tool/commands/discover/Commands.h b/examples/chip-tool/commands/discover/Commands.h index 697750fb052408..cbcdf2e27bd938 100644 --- a/examples/chip-tool/commands/discover/Commands.h +++ b/examples/chip-tool/commands/discover/Commands.h @@ -36,26 +36,31 @@ class Resolve : public DiscoverCommand, public chip::Dnssd::ResolverDelegate chip::Dnssd::Resolver::Instance().SetResolverDelegate(this); ChipLogProgress(chipTool, "Dnssd: Searching for NodeId: %" PRIx64 " FabricId: %" PRIx64 " ...", remoteId, fabricId); return chip::Dnssd::Resolver::Instance().ResolveNodeId(chip::PeerId().SetNodeId(remoteId).SetCompressedFabricId(fabricId), - chip::Inet::IPAddressType::kAny); + chip::Inet::IPAddressType::kAny, + chip::Dnssd::Resolver::CacheBypass::On); } void OnNodeIdResolved(const chip::Dnssd::ResolvedNodeData & nodeData) override { char addrBuffer[chip::Transport::PeerAddress::kMaxToStringSize]; - nodeData.mAddress.ToString(addrBuffer); - ChipLogProgress(chipTool, "NodeId Resolution: %" PRIu64 " Address: %s, Port: %" PRIu16, nodeData.mPeerId.GetNodeId(), - addrBuffer, nodeData.mPort); + + ChipLogProgress(chipTool, "NodeId Resolution: %" PRIu64 " Port: %" PRIu16, nodeData.mPeerId.GetNodeId(), nodeData.mPort); ChipLogProgress(chipTool, " Hostname: %s", nodeData.mHostName); + for (size_t i = 0; i < nodeData.mNumIPs; ++i) + { + nodeData.mAddress[i].ToString(addrBuffer); + ChipLogProgress(chipTool, " addr %zu: %s", i, addrBuffer); + } auto retryInterval = nodeData.GetMrpRetryIntervalIdle(); if (retryInterval.HasValue()) - ChipLogProgress(chipTool, " MRP retry interval (idle): %" PRIu32 "ms", retryInterval.Value()); + ChipLogProgress(chipTool, " MRP retry interval (idle): %" PRIu32 "ms", retryInterval.Value().count()); retryInterval = nodeData.GetMrpRetryIntervalActive(); if (retryInterval.HasValue()) - ChipLogProgress(chipTool, " MRP retry interval (active): %" PRIu32 "ms", retryInterval.Value()); + ChipLogProgress(chipTool, " MRP retry interval (active): %" PRIu32 "ms", retryInterval.Value().count()); ChipLogProgress(chipTool, " Supports TCP: %s", nodeData.mSupportsTcp ? "yes" : "no"); SetCommandExitStatus(CHIP_NO_ERROR); @@ -78,8 +83,8 @@ class Update : public DiscoverCommand CHIP_ERROR RunCommand(NodeId remoteId, uint64_t fabricId) override { ChipLogProgress(chipTool, "Mdns: Updating NodeId: %" PRIx64 " Compressed FabricId: %" PRIx64 " ...", remoteId, - mController.GetCompressedFabricId()); - return mController.UpdateDevice(remoteId); + CurrentCommissioner().GetCompressedFabricId()); + return CurrentCommissioner().UpdateDevice(remoteId); } /////////// DeviceAddressUpdateDelegate Interface ///////// diff --git a/examples/chip-tool/commands/discover/DiscoverCommand.cpp b/examples/chip-tool/commands/discover/DiscoverCommand.cpp index 0ac9dd6e557603..1cf6f87a4b8427 100644 --- a/examples/chip-tool/commands/discover/DiscoverCommand.cpp +++ b/examples/chip-tool/commands/discover/DiscoverCommand.cpp @@ -20,6 +20,6 @@ CHIP_ERROR DiscoverCommand::RunCommand() { - mController.RegisterDeviceAddressUpdateDelegate(this); + CurrentCommissioner().RegisterDeviceAddressUpdateDelegate(this); return RunCommand(mNodeId, mFabricId); } diff --git a/examples/chip-tool/commands/discover/DiscoverCommand.h b/examples/chip-tool/commands/discover/DiscoverCommand.h index 6e651a5fc94c8a..67d34b086b62ad 100644 --- a/examples/chip-tool/commands/discover/DiscoverCommand.h +++ b/examples/chip-tool/commands/discover/DiscoverCommand.h @@ -20,7 +20,6 @@ #include "../../config/PersistentStorage.h" #include "../common/CHIPCommand.h" -#include class DiscoverCommand : public CHIPCommand, public chip::Controller::DeviceAddressUpdateDelegate { diff --git a/examples/chip-tool/commands/discover/DiscoverCommissionablesCommand.cpp b/examples/chip-tool/commands/discover/DiscoverCommissionablesCommand.cpp index af7b276d4554a3..fd116833696027 100644 --- a/examples/chip-tool/commands/discover/DiscoverCommissionablesCommand.cpp +++ b/examples/chip-tool/commands/discover/DiscoverCommissionablesCommand.cpp @@ -23,33 +23,12 @@ using namespace ::chip; CHIP_ERROR DiscoverCommissionablesCommand::RunCommand() { - mController.RegisterDeviceDiscoveryDelegate(this); + CurrentCommissioner().RegisterDeviceDiscoveryDelegate(this); Dnssd::DiscoveryFilter filter(Dnssd::DiscoveryFilterType::kNone, (uint64_t) 0); - return mController.DiscoverCommissionableNodes(filter); + return CurrentCommissioner().DiscoverCommissionableNodes(filter); } void DiscoverCommissionablesCommand::OnDiscoveredDevice(const chip::Dnssd::DiscoveredNodeData & nodeData) { - char rotatingId[chip::Dnssd::kMaxRotatingIdLen * 2 + 1] = ""; - Encoding::BytesToUppercaseHexString(nodeData.rotatingId, nodeData.rotatingIdLen, rotatingId, sizeof(rotatingId)); - - ChipLogProgress(Discovery, "Discovered Node: "); - ChipLogProgress(Discovery, "\tHost name:\t\t%s", nodeData.hostName); - ChipLogProgress(Discovery, "\tPort:\t\t\t%u", nodeData.port); - ChipLogProgress(Discovery, "\tLong discriminator:\t%u", nodeData.longDiscriminator); - ChipLogProgress(Discovery, "\tVendor ID:\t\t%u", nodeData.vendorId); - ChipLogProgress(Discovery, "\tProduct ID:\t\t%u", nodeData.productId); - ChipLogProgress(Discovery, "\tCommissioning Mode\t%u", nodeData.commissioningMode); - ChipLogProgress(Discovery, "\tDevice Type\t\t%u", nodeData.deviceType); - ChipLogProgress(Discovery, "\tDevice Name\t\t%s", nodeData.deviceName); - ChipLogProgress(Discovery, "\tRotating Id\t\t%s", rotatingId); - ChipLogProgress(Discovery, "\tPairing Instruction\t%s", nodeData.pairingInstruction); - ChipLogProgress(Discovery, "\tPairing Hint\t\t0x%x", nodeData.pairingHint); - for (int i = 0; i < nodeData.numIPs; i++) - { - char buf[chip::Inet::IPAddress::kMaxStringLength]; - nodeData.ipAddress[i].ToString(buf); - - ChipLogProgress(Discovery, "\tAddress %d:\t\t%s", i, buf); - } + nodeData.LogDetail(); } diff --git a/examples/chip-tool/commands/pairing/Commands.h b/examples/chip-tool/commands/pairing/Commands.h index 3b7ba676271605..564bed55a2a889 100644 --- a/examples/chip-tool/commands/pairing/Commands.h +++ b/examples/chip-tool/commands/pairing/Commands.h @@ -19,8 +19,12 @@ #pragma once #include "CommissionedListCommand.h" +#include "OpenCommissioningWindowCommand.h" #include "PairingCommand.h" +#include +#include + class Unpair : public PairingCommand { public: @@ -140,12 +144,17 @@ class Ethernet : public PairingCommand Ethernet() : PairingCommand("ethernet", PairingMode::Ethernet, PairingNetworkType::Ethernet) {} }; -class OpenCommissioningWindow : public PairingCommand +class StartUdcServerCommand : public CHIPCommand { public: - OpenCommissioningWindow() : - PairingCommand("open-commissioning-window", PairingMode::OpenCommissioningWindow, PairingNetworkType::None) - {} + StartUdcServerCommand() : CHIPCommand("start-udc-server") {} + chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(300); } + + CHIP_ERROR RunCommand() override + { + chip::app::DnssdServer::Instance().StartServer(chip::Dnssd::CommissioningMode::kDisabled); + return CHIP_NO_ERROR; + } }; void registerCommandsPairing(Commands & commands) @@ -169,8 +178,10 @@ void registerCommandsPairing(Commands & commands) make_unique(), make_unique(), make_unique(), - make_unique(), - make_unique(), + // TODO - enable CommissionedListCommand once DNS Cache is implemented + // make_unique(), + make_unique(), + make_unique(), }; commands.Register(clusterName, clusterCommands); diff --git a/examples/chip-tool/commands/pairing/OpenCommissioningWindowCommand.cpp b/examples/chip-tool/commands/pairing/OpenCommissioningWindowCommand.cpp new file mode 100644 index 00000000000000..030a5858067bd9 --- /dev/null +++ b/examples/chip-tool/commands/pairing/OpenCommissioningWindowCommand.cpp @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2021 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "OpenCommissioningWindowCommand.h" + +using namespace ::chip; + +CHIP_ERROR OpenCommissioningWindowCommand::RunCommand() +{ + return CurrentCommissioner().GetConnectedDevice(mNodeId, &mOnDeviceConnectedCallback, &mOnDeviceConnectionFailureCallback); +} + +void OpenCommissioningWindowCommand::OnDeviceConnectedFn(void * context, chip::OperationalDeviceProxy * device) +{ + OpenCommissioningWindowCommand * command = reinterpret_cast(context); + VerifyOrReturn(command != nullptr, ChipLogError(chipTool, "OnDeviceConnectedFn: context is null")); + command->OpenCommissioningWindow(); +} +void OpenCommissioningWindowCommand::OnDeviceConnectionFailureFn(void * context, NodeId remoteId, CHIP_ERROR err) +{ + LogErrorOnFailure(err); + + OpenCommissioningWindowCommand * command = reinterpret_cast(context); + VerifyOrReturn(command != nullptr, ChipLogError(chipTool, "OnDeviceConnectionFailureFn: context is null")); + command->SetCommandExitStatus(err); +} + +void OpenCommissioningWindowCommand::OnOpenCommissioningWindowResponse(void * context, NodeId remoteId, CHIP_ERROR err, + chip::SetupPayload payload) +{ + LogErrorOnFailure(err); + + OpenCommissioningWindowCommand * command = reinterpret_cast(context); + VerifyOrReturn(command != nullptr, ChipLogError(chipTool, "OnOpenCommissioningWindowCommand: context is null")); + command->SetCommandExitStatus(err); +} + +CHIP_ERROR OpenCommissioningWindowCommand::OpenCommissioningWindow() +{ + return CurrentCommissioner().OpenCommissioningWindowWithCallback( + mNodeId, mTimeout, mIteration, mDiscriminator, mCommissioningWindowOption, &mOnOpenCommissioningWindowCallback, + /* readVIDPIDAttributes */ true); +} diff --git a/examples/chip-tool/commands/pairing/OpenCommissioningWindowCommand.h b/examples/chip-tool/commands/pairing/OpenCommissioningWindowCommand.h new file mode 100644 index 00000000000000..92130cdb02ceca --- /dev/null +++ b/examples/chip-tool/commands/pairing/OpenCommissioningWindowCommand.h @@ -0,0 +1,57 @@ +/* + * 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 "../common/CHIPCommand.h" + +class OpenCommissioningWindowCommand : public CHIPCommand +{ +public: + OpenCommissioningWindowCommand() : + CHIPCommand("open-commissioning-window"), mOnDeviceConnectedCallback(OnDeviceConnectedFn, this), + mOnDeviceConnectionFailureCallback(OnDeviceConnectionFailureFn, this), + mOnOpenCommissioningWindowCallback(OnOpenCommissioningWindowResponse, this) + { + AddArgument("node-id", 0, UINT64_MAX, &mNodeId); + AddArgument("option", 0, UINT8_MAX, &mCommissioningWindowOption); + AddArgument("timeout", 0, UINT16_MAX, &mTimeout); + AddArgument("iteration", 0, UINT16_MAX, &mIteration); + AddArgument("discriminator", 0, 4096, &mDiscriminator); + } + + /////////// CHIPCommand Interface ///////// + CHIP_ERROR RunCommand() override; + chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(5); } + +private: + NodeId mNodeId; + uint8_t mCommissioningWindowOption; + uint16_t mTimeout; + uint16_t mIteration; + uint16_t mDiscriminator; + + CHIP_ERROR OpenCommissioningWindow(); + static void OnDeviceConnectedFn(void * context, chip::OperationalDeviceProxy * device); + static void OnDeviceConnectionFailureFn(void * context, NodeId deviceId, CHIP_ERROR error); + static void OnOpenCommissioningWindowResponse(void * context, NodeId deviceId, CHIP_ERROR status, chip::SetupPayload payload); + + chip::Callback::Callback mOnDeviceConnectedCallback; + chip::Callback::Callback mOnDeviceConnectionFailureCallback; + chip::Callback::Callback mOnOpenCommissioningWindowCallback; +}; diff --git a/examples/chip-tool/commands/pairing/PairingCommand.cpp b/examples/chip-tool/commands/pairing/PairingCommand.cpp index efd4581ca57211..62ed4e94ca2e36 100644 --- a/examples/chip-tool/commands/pairing/PairingCommand.cpp +++ b/examples/chip-tool/commands/pairing/PairingCommand.cpp @@ -34,24 +34,15 @@ constexpr uint32_t kTimeoutMs = 6000; CHIP_ERROR PairingCommand::RunCommand() { - CHIP_ERROR err = CHIP_NO_ERROR; - - mController.RegisterDeviceAddressUpdateDelegate(this); - mController.RegisterPairingDelegate(this); - - err = RunInternal(mNodeId); - VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(chipTool, "Init Failure! PairDevice: %s", ErrorStr(err))); - -exit: - return err; + CurrentCommissioner().RegisterDeviceAddressUpdateDelegate(this); + CurrentCommissioner().RegisterPairingDelegate(this); + return RunInternal(mNodeId); } CHIP_ERROR PairingCommand::RunInternal(NodeId remoteId) { CHIP_ERROR err = CHIP_NO_ERROR; - InitCallbacks(); - switch (mPairingMode) { case PairingMode::None: @@ -74,41 +65,20 @@ CHIP_ERROR PairingCommand::RunInternal(NodeId remoteId) break; case PairingMode::Ethernet: err = Pair(remoteId, PeerAddress::UDP(mRemoteAddr.address, mRemotePort)); - break; - case PairingMode::OpenCommissioningWindow: - err = mController.GetConnectedDevice(remoteId, &mOnDeviceConnectedCallback, &mOnDeviceConnectionFailureCallback); - if (err != CHIP_NO_ERROR) - { - ChipLogError(chipTool, "Failed in initiating connection to the device: %" PRIu64 ", error %" CHIP_ERROR_FORMAT, - remoteId, err.Format()); - } - break; } return err; } -void PairingCommand::OnDeviceConnectedFn(void * context, chip::Controller::Device * device) -{ - PairingCommand * command = reinterpret_cast(context); - command->OpenCommissioningWindow(); -} -void PairingCommand::OnDeviceConnectionFailureFn(void * context, NodeId deviceId, CHIP_ERROR error) -{ - PairingCommand * command = reinterpret_cast(context); - ChipLogError(chipTool, "Failed in connecting to the device %" PRIu64 ". Error %" CHIP_ERROR_FORMAT, deviceId, error.Format()); - command->SetCommandExitStatus(error); -} - CHIP_ERROR PairingCommand::PairWithQRCode(NodeId remoteId) { - return mController.PairDevice(remoteId, mOnboardingPayload); + return CurrentCommissioner().PairDevice(remoteId, mOnboardingPayload); } CHIP_ERROR PairingCommand::PairWithManualCode(NodeId remoteId) { - return mController.PairDevice(remoteId, mOnboardingPayload); + return CurrentCommissioner().PairDevice(remoteId, mOnboardingPayload); } CHIP_ERROR PairingCommand::Pair(NodeId remoteId, PeerAddress address) @@ -116,7 +86,7 @@ CHIP_ERROR PairingCommand::Pair(NodeId remoteId, PeerAddress address) RendezvousParameters params = RendezvousParameters().SetSetupPINCode(mSetupPINCode).SetDiscriminator(mDiscriminator).SetPeerAddress(address); - return mController.PairDevice(remoteId, params); + return CurrentCommissioner().PairDevice(remoteId, params); } CHIP_ERROR PairingCommand::PairWithMdns(NodeId remoteId) @@ -144,35 +114,17 @@ CHIP_ERROR PairingCommand::PairWithMdns(NodeId remoteId) break; } - mController.RegisterDeviceDiscoveryDelegate(this); - return mController.DiscoverCommissionableNodes(filter); + CurrentCommissioner().RegisterDeviceDiscoveryDelegate(this); + return CurrentCommissioner().DiscoverCommissionableNodes(filter); } CHIP_ERROR PairingCommand::Unpair(NodeId remoteId) { - CHIP_ERROR err = mController.UnpairDevice(remoteId); + CHIP_ERROR err = CurrentCommissioner().UnpairDevice(remoteId); SetCommandExitStatus(err); return err; } -void PairingCommand::OnOpenCommissioningWindowResponse(void * context, NodeId remoteId, CHIP_ERROR err, chip::SetupPayload payload) -{ - PairingCommand * command = reinterpret_cast(context); - if (err != CHIP_NO_ERROR) - { - ChipLogError(chipTool, - "Failed in opening commissioning window on the device: 0x" ChipLogFormatX64 ", error %" CHIP_ERROR_FORMAT, - ChipLogValueX64(remoteId), err.Format()); - } - command->SetCommandExitStatus(err); -} - -CHIP_ERROR PairingCommand::OpenCommissioningWindow() -{ - return mController.OpenCommissioningWindowWithCallback(mNodeId, mTimeout, mIteration, mDiscriminator, - mCommissioningWindowOption, &mOnOpenCommissioningWindowCallback); -} - void PairingCommand::OnStatusUpdate(DevicePairingDelegate::Status status) { switch (status) @@ -241,14 +193,11 @@ CHIP_ERROR PairingCommand::SetupNetwork() { case PairingNetworkType::None: case PairingNetworkType::Ethernet: - // Nothing to do other than to resolve the device's operational address. - err = UpdateNetworkAddress(); - VerifyOrExit(err == CHIP_NO_ERROR, - ChipLogError(chipTool, "Setup failure! Error calling UpdateNetworkAddress: %s", ErrorStr(err))); + // Nothing to do here - device address has been resolved as part of the commissioning process. break; case PairingNetworkType::WiFi: case PairingNetworkType::Thread: - err = mController.GetDevice(mNodeId, &mDevice); + err = CurrentCommissioner().GetDeviceBeingCommissioned(mNodeId, &mDevice); VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(chipTool, "Setup failure! No pairing for device: %" PRIu64, mNodeId)); mCluster.Associate(mDevice, mEndpointId); @@ -263,25 +212,6 @@ CHIP_ERROR PairingCommand::SetupNetwork() return err; } -void PairingCommand::InitCallbacks() -{ - mOnAddThreadNetworkCallback = - new Callback::Callback(OnAddNetworkResponse, this); - mOnAddWiFiNetworkCallback = - new Callback::Callback(OnAddNetworkResponse, this); - mOnEnableNetworkCallback = - new Callback::Callback(OnEnableNetworkResponse, this); - mOnFailureCallback = new Callback::Callback(OnDefaultFailureResponse, this); -} - -void PairingCommand::Shutdown() -{ - delete mOnAddThreadNetworkCallback; - delete mOnAddWiFiNetworkCallback; - delete mOnEnableNetworkCallback; - delete mOnFailureCallback; -} - CHIP_ERROR PairingCommand::AddNetwork(PairingNetworkType networkType) { return (networkType == PairingNetworkType::WiFi) ? AddWiFiNetwork() : AddThreadNetwork(); @@ -289,16 +219,16 @@ CHIP_ERROR PairingCommand::AddNetwork(PairingNetworkType networkType) CHIP_ERROR PairingCommand::AddThreadNetwork() { - Callback::Cancelable * successCallback = mOnAddThreadNetworkCallback->Cancel(); - Callback::Cancelable * failureCallback = mOnFailureCallback->Cancel(); + Callback::Cancelable * successCallback = mOnAddThreadNetworkCallback.Cancel(); + Callback::Cancelable * failureCallback = mOnFailureCallback.Cancel(); return mCluster.AddThreadNetwork(successCallback, failureCallback, mOperationalDataset, kBreadcrumb, kTimeoutMs); } CHIP_ERROR PairingCommand::AddWiFiNetwork() { - Callback::Cancelable * successCallback = mOnAddWiFiNetworkCallback->Cancel(); - Callback::Cancelable * failureCallback = mOnFailureCallback->Cancel(); + Callback::Cancelable * successCallback = mOnAddWiFiNetworkCallback.Cancel(); + Callback::Cancelable * failureCallback = mOnFailureCallback.Cancel(); return mCluster.AddWiFiNetwork(successCallback, failureCallback, mSSID, mPassword, kBreadcrumb, kTimeoutMs); } @@ -325,8 +255,8 @@ chip::ByteSpan PairingCommand::GetThreadNetworkId() CHIP_ERROR PairingCommand::EnableNetwork() { - Callback::Cancelable * successCallback = mOnEnableNetworkCallback->Cancel(); - Callback::Cancelable * failureCallback = mOnFailureCallback->Cancel(); + Callback::Cancelable * successCallback = mOnEnableNetworkCallback.Cancel(); + Callback::Cancelable * failureCallback = mOnFailureCallback.Cancel(); ByteSpan networkId; if (mNetworkType == PairingNetworkType::WiFi) @@ -414,18 +344,20 @@ void PairingCommand::OnEnableNetworkResponse(void * context, uint8_t errorCode, CHIP_ERROR PairingCommand::UpdateNetworkAddress() { ChipLogProgress(chipTool, "Mdns: Updating NodeId: %" PRIx64 " Compressed FabricId: %" PRIx64 " ...", mNodeId, - mController.GetCompressedFabricId()); - return mController.UpdateDevice(mNodeId); + CurrentCommissioner().GetCompressedFabricId()); + return CurrentCommissioner().UpdateDevice(mNodeId); } void PairingCommand::OnAddressUpdateComplete(NodeId nodeId, CHIP_ERROR err) { ChipLogProgress(chipTool, "OnAddressUpdateComplete: %" PRIx64 ": %s", nodeId, ErrorStr(err)); - if (err != CHIP_NO_ERROR && nodeId == mNodeId) + if (err != CHIP_NO_ERROR) { - // Set exit status only if the address update failed. - // Otherwise wait for OnCommissioningComplete() callback. - SetCommandExitStatus(err); + // For some devices, it may take more time to appear on the network and become discoverable + // over DNS-SD, so don't give up on failure and restart the address update. Note that this + // will not be repeated endlessly as each chip-tool command has a timeout (in the case of + // the `pairing` command it equals 120s). + UpdateNetworkAddress(); } } @@ -437,7 +369,7 @@ void PairingCommand::OnDiscoveredDevice(const chip::Dnssd::DiscoveredNodeData & ChipLogProgress(chipTool, "Discovered Device: %s:%u", buf, port); // Stop Mdns discovery. Is it the right method ? - mController.RegisterDeviceDiscoveryDelegate(nullptr); + CurrentCommissioner().RegisterDeviceDiscoveryDelegate(nullptr); Inet::InterfaceId interfaceId = nodeData.ipAddress[0].IsIPv6LinkLocal() ? nodeData.interfaceId[0] : Inet::InterfaceId::Null(); PeerAddress peerAddress = PeerAddress::UDP(nodeData.ipAddress[0], port, interfaceId); diff --git a/examples/chip-tool/commands/pairing/PairingCommand.h b/examples/chip-tool/commands/pairing/PairingCommand.h index c3c23cfffffefa..e5d0dc36ec00b7 100644 --- a/examples/chip-tool/commands/pairing/PairingCommand.h +++ b/examples/chip-tool/commands/pairing/PairingCommand.h @@ -18,15 +18,12 @@ #pragma once -#include "../../config/PersistentStorage.h" #include "../common/CHIPCommand.h" #include #include -#include #include #include -#include enum class PairingMode { @@ -37,7 +34,6 @@ enum class PairingMode SoftAP, Ethernet, OnNetwork, - OpenCommissioningWindow, }; enum class PairingNetworkType @@ -59,9 +55,8 @@ class PairingCommand : public CHIPCommand, CHIPCommand(commandName), mPairingMode(mode), mNetworkType(networkType), mFilterType(filterType), mRemoteAddr{ IPAddress::Any, chip::Inet::InterfaceId::Null() }, - mOnDeviceConnectedCallback(OnDeviceConnectedFn, this), - mOnDeviceConnectionFailureCallback(OnDeviceConnectionFailureFn, this), - mOnOpenCommissioningWindowCallback(OnOpenCommissioningWindowResponse, this) + mOnAddThreadNetworkCallback(OnAddNetworkResponse, this), mOnAddWiFiNetworkCallback(OnAddNetworkResponse, this), + mOnEnableNetworkCallback(OnEnableNetworkResponse, this), mOnFailureCallback(OnDefaultFailureResponse, this) { AddArgument("node-id", 0, UINT64_MAX, &mNodeId); @@ -88,7 +83,6 @@ class PairingCommand : public CHIPCommand, AddArgument("payload", &mOnboardingPayload); break; case PairingMode::Ble: - AddArgument("fabric-id", 0, UINT64_MAX, &mFabricId); AddArgument("setup-pin-code", 0, 134217727, &mSetupPINCode); AddArgument("discriminator", 0, 4096, &mDiscriminator); break; @@ -96,7 +90,6 @@ class PairingCommand : public CHIPCommand, AddArgument("setup-pin-code", 0, 134217727, &mSetupPINCode); break; case PairingMode::SoftAP: - AddArgument("fabric-id", 0, UINT64_MAX, &mFabricId); AddArgument("setup-pin-code", 0, 134217727, &mSetupPINCode); AddArgument("discriminator", 0, 4096, &mDiscriminator); AddArgument("device-remote-ip", &mRemoteAddr); @@ -108,12 +101,6 @@ class PairingCommand : public CHIPCommand, AddArgument("device-remote-ip", &mRemoteAddr); AddArgument("device-remote-port", 0, UINT16_MAX, &mRemotePort); break; - case PairingMode::OpenCommissioningWindow: - AddArgument("option", 0, UINT8_MAX, &mCommissioningWindowOption); - AddArgument("timeout", 0, UINT16_MAX, &mTimeout); - AddArgument("iteration", 0, UINT16_MAX, &mIteration); - AddArgument("discriminator", 0, 4096, &mDiscriminator); - break; } switch (filterType) @@ -147,7 +134,6 @@ class PairingCommand : public CHIPCommand, /////////// CHIPCommand Interface ///////// CHIP_ERROR RunCommand() override; chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(120); } - void Shutdown() override; /////////// DevicePairingDelegate Interface ///////// void OnStatusUpdate(chip::Controller::DevicePairingDelegate::Status status) override; @@ -174,9 +160,7 @@ class PairingCommand : public CHIPCommand, CHIP_ERROR PairWithManualCode(NodeId remoteId); CHIP_ERROR PairWithCode(NodeId remoteId, chip::SetupPayload payload); CHIP_ERROR Unpair(NodeId remoteId); - CHIP_ERROR OpenCommissioningWindow(); - void InitCallbacks(); CHIP_ERROR SetupNetwork(); CHIP_ERROR AddNetwork(PairingNetworkType networkType); CHIP_ERROR AddThreadNetwork(); @@ -192,12 +176,8 @@ class PairingCommand : public CHIPCommand, Command::AddressWithInterface mRemoteAddr; NodeId mNodeId; uint16_t mRemotePort; - uint64_t mFabricId; - uint16_t mTimeout; - uint16_t mIteration; uint16_t mDiscriminator; uint32_t mSetupPINCode; - uint8_t mCommissioningWindowOption; chip::ByteSpan mOperationalDataset; uint8_t mExtendedPanId[chip::Thread::kSizeExtendedPanId]; chip::ByteSpan mSSID; @@ -206,19 +186,11 @@ class PairingCommand : public CHIPCommand, uint64_t mDiscoveryFilterCode; char * mDiscoveryFilterInstanceName; - chip::Callback::Callback * mOnAddThreadNetworkCallback = nullptr; - chip::Callback::Callback * mOnAddWiFiNetworkCallback = nullptr; - chip::Callback::Callback * mOnEnableNetworkCallback = nullptr; - chip::Callback::Callback * mOnFailureCallback = nullptr; - ChipDevice * mDevice; + chip::Callback::Callback mOnAddThreadNetworkCallback; + chip::Callback::Callback mOnAddWiFiNetworkCallback; + chip::Callback::Callback mOnEnableNetworkCallback; + chip::Callback::Callback mOnFailureCallback; + chip::CommissioneeDeviceProxy * mDevice; chip::Controller::NetworkCommissioningCluster mCluster; chip::EndpointId mEndpointId = 0; - - static void OnDeviceConnectedFn(void * context, chip::Controller::Device * device); - static void OnDeviceConnectionFailureFn(void * context, NodeId deviceId, CHIP_ERROR error); - static void OnOpenCommissioningWindowResponse(void * context, NodeId deviceId, CHIP_ERROR status, chip::SetupPayload payload); - - chip::Callback::Callback mOnDeviceConnectedCallback; - chip::Callback::Callback mOnDeviceConnectionFailureCallback; - chip::Callback::Callback mOnOpenCommissioningWindowCallback; }; diff --git a/examples/chip-tool/commands/reporting/ReportingCommand.cpp b/examples/chip-tool/commands/reporting/ReportingCommand.cpp index 2a6ad8b15d430d..7e627f4ba2a1b3 100644 --- a/examples/chip-tool/commands/reporting/ReportingCommand.cpp +++ b/examples/chip-tool/commands/reporting/ReportingCommand.cpp @@ -26,7 +26,8 @@ using namespace ::chip; CHIP_ERROR ReportingCommand::RunCommand() { - CHIP_ERROR err = mController.GetConnectedDevice(mNodeId, &mOnDeviceConnectedCallback, &mOnDeviceConnectionFailureCallback); + CHIP_ERROR err = + CurrentCommissioner().GetConnectedDevice(mNodeId, &mOnDeviceConnectedCallback, &mOnDeviceConnectionFailureCallback); VerifyOrExit( err == CHIP_NO_ERROR, ChipLogError(chipTool, "Failed in initiating connection to the device: %" PRIu64 ", error %s", mNodeId, ErrorStr(err))); @@ -35,7 +36,7 @@ CHIP_ERROR ReportingCommand::RunCommand() return err; } -void ReportingCommand::OnDeviceConnectedFn(void * context, chip::Controller::Device * device) +void ReportingCommand::OnDeviceConnectedFn(void * context, chip::OperationalDeviceProxy * device) { ReportingCommand * command = reinterpret_cast(context); VerifyOrReturn(command != nullptr, diff --git a/examples/chip-tool/commands/reporting/ReportingCommand.h b/examples/chip-tool/commands/reporting/ReportingCommand.h index aba585685f81af..609e11daf602ba 100644 --- a/examples/chip-tool/commands/reporting/ReportingCommand.h +++ b/examples/chip-tool/commands/reporting/ReportingCommand.h @@ -21,12 +21,6 @@ #include "../../config/PersistentStorage.h" #include "../common/CHIPCommand.h" -#include - -// Limits on endpoint values. -#define CHIP_ZCL_ENDPOINT_MIN 0x00 -#define CHIP_ZCL_ENDPOINT_MAX 0xF0 - class ReportingCommand : public CHIPCommand { public: @@ -48,9 +42,9 @@ class ReportingCommand : public CHIPCommand NodeId mNodeId; uint8_t mEndPointId; - static void OnDeviceConnectedFn(void * context, chip::Controller::Device * device); + static void OnDeviceConnectedFn(void * context, chip::OperationalDeviceProxy * device); static void OnDeviceConnectionFailureFn(void * context, NodeId deviceId, CHIP_ERROR error); - chip::Callback::Callback mOnDeviceConnectedCallback; - chip::Callback::Callback mOnDeviceConnectionFailureCallback; + chip::Callback::Callback mOnDeviceConnectedCallback; + chip::Callback::Callback mOnDeviceConnectionFailureCallback; }; diff --git a/examples/chip-tool/commands/tests/TestCommand.cpp b/examples/chip-tool/commands/tests/TestCommand.cpp index e8d19276ee61d9..4e9f01af3cdf5c 100644 --- a/examples/chip-tool/commands/tests/TestCommand.cpp +++ b/examples/chip-tool/commands/tests/TestCommand.cpp @@ -20,15 +20,28 @@ CHIP_ERROR TestCommand::RunCommand() { - return mController.GetConnectedDevice(mNodeId, &mOnDeviceConnectedCallback, &mOnDeviceConnectionFailureCallback); + if (mPICSFilePath.HasValue()) + { + PICS.SetValue(PICSBooleanReader::Read(mPICSFilePath.Value())); + } + + NextTest(); + + return CHIP_NO_ERROR; } -void TestCommand::OnDeviceConnectedFn(void * context, chip::Controller::Device * device) +CHIP_ERROR TestCommand::WaitForCommissionee() +{ + return CurrentCommissioner().GetConnectedDevice(mNodeId, &mOnDeviceConnectedCallback, &mOnDeviceConnectionFailureCallback); +} + +void TestCommand::OnDeviceConnectedFn(void * context, chip::OperationalDeviceProxy * device) { ChipLogProgress(chipTool, " **** Test Setup: Device Connected\n"); auto * command = static_cast(context); VerifyOrReturn(command != nullptr, ChipLogError(chipTool, "Device connected, but cannot run the test, as the context is null")); - command->mDevice = device; + command->mDevices[command->GetIdentity()] = device; + command->NextTest(); } @@ -55,7 +68,14 @@ CHIP_ERROR TestCommand::Wait(chip::System::Clock::Timeout duration) CHIP_ERROR TestCommand::Log(const char * message) { ChipLogDetail(chipTool, "%s", message); - WaitForMs(0); + ReturnErrorOnFailure(ContinueOnChipMainThread()); + return CHIP_NO_ERROR; +} + +CHIP_ERROR TestCommand::UserPrompt(const char * message) +{ + ChipLogDetail(chipTool, "USER_PROMPT: %s", message); + ReturnErrorOnFailure(ContinueOnChipMainThread()); return CHIP_NO_ERROR; } @@ -87,6 +107,30 @@ bool TestCommand::CheckConstraintFormat(const char * itemName, const char * curr return true; } +bool TestCommand::CheckConstraintStartsWith(const char * itemName, const chip::Span 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 TestCommand::CheckConstraintEndsWith(const char * itemName, const chip::Span 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 TestCommand::CheckConstraintMinLength(const char * itemName, uint64_t current, uint64_t expected) { if (current < expected) @@ -109,38 +153,44 @@ bool TestCommand::CheckConstraintMaxLength(const char * itemName, uint64_t curre return true; } -bool TestCommand::CheckValueAsList(const char * itemName, uint64_t current, uint64_t expected) +bool TestCommand::CheckValueAsString(const char * itemName, chip::ByteSpan current, chip::ByteSpan expected) { - if (current != expected) + if (!current.data_equal(expected)) { - Exit(std::string(itemName) + " count mismatch: " + std::to_string(current) + " != " + std::to_string(expected)); + Exit(std::string(itemName) + " value mismatch, expecting " + + std::string(chip::Uint8::to_const_char(expected.data()), expected.size())); return false; } return true; } -bool TestCommand::CheckValueAsString(const char * itemName, const chip::ByteSpan current, const char * expected) +bool TestCommand::CheckValueAsString(const char * itemName, chip::CharSpan current, chip::CharSpan expected) { - const chip::ByteSpan expectedArgument = chip::ByteSpan(chip::Uint8::from_const_char(expected), strlen(expected)); - - if (!current.data_equal(expectedArgument)) + if (!current.data_equal(expected)) { - Exit(std::string(itemName) + " value mismatch, expecting " + std::string(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; } -bool TestCommand::CheckValueAsString(const char * itemName, const chip::CharSpan current, const char * expected) +bool TestCommand::ShouldSkip(const char * expression) { - const chip::CharSpan expectedArgument(expected, strlen(expected)); - if (!current.data_equal(expectedArgument)) + // If there is no PICS configuration file, considers that nothing should be skipped. + if (!PICS.HasValue()) { - Exit(std::string(itemName) + " value mismatch, expecting " + std::string(expected)); return false; } - return true; + std::map pics(PICS.Value()); + bool shouldSkip = !PICSBooleanExpressionParser::Eval(expression, pics); + if (shouldSkip) + { + ChipLogProgress(chipTool, " **** Skipping: %s == false\n", expression); + ContinueOnChipMainThread(); + } + return shouldSkip; } diff --git a/examples/chip-tool/commands/tests/TestCommand.h b/examples/chip-tool/commands/tests/TestCommand.h index 25eaaa5e5c9506..c314699e0e7a59 100644 --- a/examples/chip-tool/commands/tests/TestCommand.h +++ b/examples/chip-tool/commands/tests/TestCommand.h @@ -21,12 +21,16 @@ #include "../common/CHIPCommand.h" #include #include -#include +#include +#include +#include #include #include #include #include +constexpr uint16_t kTimeoutInSeconds = 30; + class TestCommand : public CHIPCommand { public: @@ -36,27 +40,37 @@ class TestCommand : public CHIPCommand { AddArgument("node-id", 0, UINT64_MAX, &mNodeId); AddArgument("delayInMs", 0, UINT64_MAX, &mDelayInMs); + AddArgument("timeout", 0, UINT16_MAX, &mTimeout); + AddArgument("endpoint-id", CHIP_ZCL_ENDPOINT_MIN, CHIP_ZCL_ENDPOINT_MAX, &mEndpointId); + AddArgument("PICS", &mPICSFilePath); } /////////// CHIPCommand Interface ///////// CHIP_ERROR RunCommand() override; - chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(30); } + chip::System::Clock::Timeout GetWaitDuration() const override + { + return chip::System::Clock::Seconds16(mTimeout.HasValue() ? mTimeout.Value() : kTimeoutInSeconds); + } virtual void NextTest() = 0; /////////// GlobalCommands Interface ///////// CHIP_ERROR Wait(chip::System::Clock::Timeout ms); CHIP_ERROR WaitForMs(uint16_t ms) { return Wait(chip::System::Clock::Milliseconds32(ms)); } + CHIP_ERROR WaitForCommissionee(); CHIP_ERROR Log(const char * message); + CHIP_ERROR UserPrompt(const char * message); protected: - ChipDevice * mDevice; + std::map mDevices; chip::NodeId mNodeId; - static void OnDeviceConnectedFn(void * context, chip::Controller::Device * device); + static void OnDeviceConnectedFn(void * context, chip::OperationalDeviceProxy * device); static void OnDeviceConnectionFailureFn(void * context, NodeId deviceId, CHIP_ERROR error); static void OnWaitForMsFn(chip::System::Layer * systemLayer, void * context); + CHIP_ERROR ContinueOnChipMainThread() { return WaitForMs(0); }; + void Exit(std::string message); void ThrowFailureResponse(); void ThrowSuccessResponse(); @@ -65,6 +79,8 @@ class TestCommand : public CHIPCommand bool CheckConstraintFormat(const char * itemName, const char * current, const char * expected); bool CheckConstraintMinLength(const char * itemName, uint64_t current, uint64_t expected); bool CheckConstraintMaxLength(const char * itemName, uint64_t current, uint64_t expected); + bool CheckConstraintStartsWith(const char * itemName, const chip::Span current, const char * expected); + bool CheckConstraintEndsWith(const char * itemName, const chip::Span current, const char * expected); template bool CheckConstraintMinValue(const char * itemName, T current, T expected) { @@ -87,12 +103,34 @@ class TestCommand : public CHIPCommand return true; } - template - bool CheckConstraintNotValue(const char * itemName, T current, T expected) + template + bool CheckConstraintNotValue(const char * itemName, T current, U expected) { if (current == expected) { - Exit(std::string(itemName) + " value == notValue: " + std::to_string(current) + " == " + std::to_string(expected)); + Exit(std::string(itemName) + " got unexpected value: " + std::to_string(current)); + return false; + } + + return true; + } + + bool CheckConstraintNotValue(const char * itemName, chip::CharSpan current, 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, chip::ByteSpan current, chip::ByteSpan expected) + { + if (current.data_equal(expected)) + { + Exit(std::string(itemName) + " got unexpected value of size: " + std::to_string(current.size())); return false; } @@ -106,93 +144,80 @@ class TestCommand : public CHIPCommand { if (current != expected) { - Exit(std::string(itemName) + " value mismatch: " + std::to_string(current) + " != " + std::to_string(expected)); + Exit(std::string(itemName) + " value mismatch: expected " + std::to_string(expected) + " but got " + + std::to_string(current)); return false; } return true; } - template ::value, int> = 0> - bool CheckValue(const char * itemName, T current, U expected) + template + bool CheckValue(const char * itemName, chip::BitFlags current, U expected) { - return CheckValue(itemName, to_underlying(current), expected); + return CheckValue(itemName, current.Raw(), expected); } - bool CheckValueAsList(const char * itemName, uint64_t current, uint64_t expected); - - template - bool CheckValueAsListHelper(const char * itemName, typename chip::app::DataModel::DecodableList::Iterator iter) + template ::value, int> = 0> + bool CheckValue(const char * itemName, T current, U expected) { - if (iter.Next()) - { - Exit(std::string(itemName) + " value mismatch: expected no more items but found " + std::to_string(iter.GetValue())); - return false; - } - if (iter.GetStatus() != CHIP_NO_ERROR) - { - Exit(std::string(itemName) + - " value mismatch: expected no more items but got an error: " + iter.GetStatus().AsString()); - return false; - } - return true; + return CheckValue(itemName, chip::to_underlying(current), expected); } - template - bool CheckValueAsListHelper(const char * itemName, typename chip::app::DataModel::DecodableList::Iterator & iter, - const U & firstItem, ValueTypes &&... otherItems) + /** + * 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 haveValue = iter.Next(); + bool hasValue = iter.Next(); if (iter.GetStatus() != CHIP_NO_ERROR) { - Exit(std::string(itemName) + " value mismatch: expected " + std::to_string(firstItem) + - " but got error: " + iter.GetStatus().AsString()); - return false; - } - if (!haveValue) - { - Exit(std::string(itemName) + " value mismatch: expected " + std::to_string(firstItem) + - " but found nothing or an error"); + Exit(std::string(listName) + " value mismatch: error '" + iter.GetStatus().AsString() + "'decoding item at index " + + std::to_string(index)); return false; } - if (iter.GetValue() != firstItem) + + if (hasValue) { - Exit(std::string(itemName) + " value mismatch: expected " + std::to_string(firstItem) + " but found " + - std::to_string(iter.GetValue())); - return false; + return true; } - return CheckValueAsListHelper(itemName, iter, std::forward(otherItems)...); - } - template - bool CheckValueAsList(const char * itemName, chip::app::DataModel::DecodableList list, ValueTypes &&... items) - { - auto iter = list.begin(); - return CheckValueAsListHelper(itemName, iter, std::forward(items)...); + Exit(std::string(listName) + " value mismatch: should have value at index " + std::to_string(index) + + " but doesn't (actual value too short)"); + return false; } - template - bool CheckValueAsListLength(const char * itemName, chip::app::DataModel::DecodableList list, uint64_t expectedLength) + /** + * 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) { - // We don't just use list.ComputeSize(), because we want to check that - // all the values in the list correctly decode to our type too. - auto iter = list.begin(); - uint64_t count = 0; - while (iter.Next()) - { - ++count; - } + bool hasValue = iter.Next(); if (iter.GetStatus() != CHIP_NO_ERROR) { - Exit(std::string(itemName) + " list length mismatch: expected " + std::to_string(expectedLength) + " but got an error"); + Exit(std::string(listName) + " value mismatch: error '" + iter.GetStatus().AsString() + + "'decoding item after we have seen " + std::to_string(expectedCount) + " items"); return false; } - return CheckValueAsList(itemName, count, expectedLength); + + 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; } - bool CheckValueAsString(const char * itemName, chip::ByteSpan current, const char * expected); + bool CheckValueAsString(const char * itemName, chip::ByteSpan current, chip::ByteSpan expected); - bool CheckValueAsString(const char * itemName, chip::CharSpan current, const char * expected); + bool CheckValueAsString(const char * itemName, chip::CharSpan current, chip::CharSpan expected); template bool CheckValuePresent(const char * itemName, const chip::Optional & value) @@ -230,15 +255,21 @@ class TestCommand : public CHIPCommand return false; } - chip::Callback::Callback mOnDeviceConnectedCallback; - chip::Callback::Callback mOnDeviceConnectionFailureCallback; + chip::Callback::Callback mOnDeviceConnectedCallback; + chip::Callback::Callback mOnDeviceConnectionFailureCallback; + + bool ShouldSkip(const char * expression); void Wait() { - if (mDelayInMs) + if (mDelayInMs.HasValue()) { - chip::test_utils::SleepMillis(mDelayInMs); + chip::test_utils::SleepMillis(mDelayInMs.Value()); } }; - uint64_t mDelayInMs = 0; + chip::Optional mDelayInMs; + chip::Optional mPICSFilePath; + chip::Optional mEndpointId; + chip::Optional mTimeout; + chip::Optional> PICS; }; diff --git a/examples/chip-tool/config/PersistentStorage.cpp b/examples/chip-tool/config/PersistentStorage.cpp index 8eff627554f626..20444da6d59b02 100644 --- a/examples/chip-tool/config/PersistentStorage.cpp +++ b/examples/chip-tool/config/PersistentStorage.cpp @@ -32,13 +32,21 @@ using namespace ::chip; using namespace ::chip::Controller; using namespace ::chip::Logging; -constexpr const char kFilename[] = "/tmp/chip_tool_config.ini"; constexpr const char kDefaultSectionName[] = "Default"; constexpr const char kPortKey[] = "ListenPort"; constexpr const char kLoggingKey[] = "LoggingLevel"; constexpr const char kLocalNodeIdKey[] = "LocalNodeId"; constexpr LogCategory kDefaultLoggingLevel = kLogCategory_Detail; +std::string GetFilename(const char * name) +{ + if (name == nullptr) + { + return "/tmp/chip_tool_config.ini"; + } + return "/tmp/chip_tool_config." + std::string(name) + ".ini"; +} + namespace { std::string StringToBase64(const std::string & value) @@ -70,22 +78,22 @@ std::string Base64ToString(const std::string & b64Value) } // namespace -CHIP_ERROR PersistentStorage::Init() +CHIP_ERROR PersistentStorage::Init(const char * name) { CHIP_ERROR err = CHIP_NO_ERROR; std::ifstream ifs; - ifs.open(kFilename, std::ifstream::in); + ifs.open(GetFilename(name), std::ifstream::in); if (!ifs.good()) { - CommitConfig(); - ifs.open(kFilename, std::ifstream::in); + CommitConfig(name); + ifs.open(GetFilename(name), std::ifstream::in); } VerifyOrExit(ifs.is_open(), err = CHIP_ERROR_OPEN_FAILED); + mName = name; mConfig.parse(ifs); ifs.close(); - exit: return err; } @@ -121,7 +129,7 @@ CHIP_ERROR PersistentStorage::SyncSetKeyValue(const char * key, const void * val section[key] = StringToBase64(std::string(static_cast(value), size)); mConfig.sections[kDefaultSectionName] = section; - return CommitConfig(); + return CommitConfig(mName); } CHIP_ERROR PersistentStorage::SyncDeleteKeyValue(const char * key) @@ -130,16 +138,15 @@ CHIP_ERROR PersistentStorage::SyncDeleteKeyValue(const char * key) section.erase(key); mConfig.sections[kDefaultSectionName] = section; - return CommitConfig(); + return CommitConfig(mName); } -CHIP_ERROR PersistentStorage::CommitConfig() +CHIP_ERROR PersistentStorage::CommitConfig(const char * name) { CHIP_ERROR err = CHIP_NO_ERROR; std::ofstream ofs; - std::string tmpPath = kFilename; - tmpPath.append(".tmp"); + std::string tmpPath = GetFilename(name) + ".tmp"; ofs.open(tmpPath, std::ofstream::out | std::ofstream::trunc); VerifyOrExit(ofs.good(), err = CHIP_ERROR_WRITE_FAILED); @@ -147,7 +154,7 @@ CHIP_ERROR PersistentStorage::CommitConfig() ofs.close(); VerifyOrExit(ofs.good(), err = CHIP_ERROR_WRITE_FAILED); - VerifyOrExit(rename(tmpPath.c_str(), kFilename) == 0, err = CHIP_ERROR_WRITE_FAILED); + VerifyOrExit(rename(tmpPath.c_str(), GetFilename(name).c_str()) == 0, err = CHIP_ERROR_WRITE_FAILED); exit: return err; @@ -156,9 +163,10 @@ CHIP_ERROR PersistentStorage::CommitConfig() uint16_t PersistentStorage::GetListenPort() { CHIP_ERROR err = CHIP_NO_ERROR; + // By default chip-tool listens on CHIP_PORT + 1. This is done in order to avoid // having 2 servers listening on CHIP_PORT when one runs an accessory server locally. - uint16_t chipListenPort = CHIP_PORT + 1; + uint16_t chipListenPort = static_cast(CHIP_PORT + 1); char value[6]; uint16_t size = static_cast(sizeof(value)); diff --git a/examples/chip-tool/config/PersistentStorage.h b/examples/chip-tool/config/PersistentStorage.h index c2832a3c407e29..fd06571c1b6b61 100644 --- a/examples/chip-tool/config/PersistentStorage.h +++ b/examples/chip-tool/config/PersistentStorage.h @@ -26,7 +26,7 @@ class PersistentStorage : public chip::PersistentStorageDelegate { public: - CHIP_ERROR Init(); + CHIP_ERROR Init(const char * name = nullptr); /////////// PersistentStorageDelegate Interface ///////// CHIP_ERROR SyncGetKeyValue(const char * key, void * buffer, uint16_t & size) override; @@ -43,6 +43,7 @@ class PersistentStorage : public chip::PersistentStorageDelegate CHIP_ERROR SetLocalNodeId(chip::NodeId nodeId); private: - CHIP_ERROR CommitConfig(); + CHIP_ERROR CommitConfig(const char * name); inipp::Ini mConfig; + const char * mName; }; diff --git a/examples/chip-tool/include/CHIPProjectAppConfig.h b/examples/chip-tool/include/CHIPProjectAppConfig.h new file mode 100644 index 00000000000000..81010d4cacffad --- /dev/null +++ b/examples/chip-tool/include/CHIPProjectAppConfig.h @@ -0,0 +1,76 @@ +/* + * + * Copyright (c) 2020-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 + * Project configuration for CHIP Tool. + * + */ +#ifndef CHIPPROJECTCONFIG_H +#define CHIPPROJECTCONFIG_H + +#define CHIP_CONFIG_ENABLE_EPHEMERAL_UDP_PORT 1 + +#define CHIP_CONFIG_EVENT_LOGGING_NUM_EXTERNAL_CALLBACKS 2 + +#define CHIP_CONFIG_EVENT_LOGGING_EXTERNAL_EVENT_SUPPORT 1 + +// Uncomment this for a large Tunnel MTU. +//#define CHIP_CONFIG_TUNNEL_INTERFACE_MTU (9000) + +// Enable support functions for parsing command-line arguments +#define CHIP_CONFIG_ENABLE_ARG_PARSER 1 + +// Use a default pairing code if one hasn't been provisioned in flash. +#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE 20202021 +#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR 0xF00 + +// Enable reading DRBG seed data from /dev/(u)random. +// This is needed for test applications and the CHIP device manager to function +// properly when CHIP_CONFIG_RNG_IMPLEMENTATION_CHIPDRBG is enabled. +#define CHIP_CONFIG_DEV_RANDOM_DRBG_SEED 1 + +// For convenience, Chip Security Test Mode can be enabled and the +// requirement for authentication in various protocols can be disabled. +// +// WARNING: These options make it possible to circumvent basic Chip security functionality, +// including message encryption. Because of this they MUST NEVER BE ENABLED IN PRODUCTION BUILDS. +// +#define CHIP_CONFIG_SECURITY_TEST_MODE 0 +#define CHIP_CONFIG_REQUIRE_AUTH 1 + +// Increase session idle timeout in stand-alone builds for the convenience of developers. +#define CHIP_CONFIG_DEFAULT_SECURITY_SESSION_IDLE_TIMEOUT 120000 + +#define CHIP_CONFIG_ENABLE_UPDATE 1 + +#define CHIP_CONFIG_LEGACY_CASE_AUTH_DELEGATE 0 + +#define CHIP_CONFIG_LEGACY_KEY_EXPORT_DELEGATE 0 + +#define CHIP_SYSTEM_CONFIG_PACKETBUFFER_POOL_SIZE 0 + +#define CHIP_CONFIG_DATA_MANAGEMENT_CLIENT_EXPERIMENTAL 1 + +#define CHIP_DEVICE_CONFIG_ENABLE_TEST_DEVICE_IDENTITY 1 + +#define CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY 1 + +// Enable some test-only interaction model APIs. +#define CONFIG_IM_BUILD_FOR_UNIT_TEST 1 + +#endif /* CHIPPROJECTCONFIG_H */ diff --git a/examples/chip-tool/templates/commands.zapt b/examples/chip-tool/templates/commands.zapt index 317553d3548140..78fd416bb433e4 100644 --- a/examples/chip-tool/templates/commands.zapt +++ b/examples/chip-tool/templates/commands.zapt @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -45,6 +46,13 @@ CHIP_ERROR LogValue(const char * label, size_t indent, X value) return CHIP_NO_ERROR; } +template ::value, int> = 0> +CHIP_ERROR LogValue(const char * label, size_t indent, X value) +{ + ChipLogProgress(chipTool, "%s%s: %s", IndentStr(indent).c_str(), label, std::to_string(value).c_str()); + return CHIP_NO_ERROR; +} + CHIP_ERROR LogValue(const char * label, size_t indent, bool value) { ChipLogProgress(chipTool, "%s%s: %s", IndentStr(indent).c_str(), label, value ? "TRUE" : "FALSE"); @@ -66,7 +74,15 @@ CHIP_ERROR LogValue(const char * label, size_t indent, chip::CharSpan value) CHIP_ERROR LogValue(const char * label, size_t indent, chip::ByteSpan value) { - ChipLogProgress(chipTool, "%s%s: %zu", IndentStr(indent).c_str(), label, value.size()); + char buffer[CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE]; + if (CHIP_NO_ERROR == chip::Encoding::BytesToUppercaseHexString(value.data(), value.size(), &buffer[0], CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE)) + { + ChipLogProgress(chipTool, "%s%s: %s", IndentStr(indent).c_str(), label, buffer); + } + else + { + ChipLogProgress(chipTool, "%s%s: %zu", IndentStr(indent).c_str(), label, value.size()); + } return CHIP_NO_ERROR; } @@ -153,6 +169,11 @@ CHIP_ERROR LogValue(const char * label, size_t indent, {{zapTypeToDecodableClust } // anonymous namespace +static void OnDefaultSuccessResponseWithoutExit(void * context) +{ + ChipLogProgress(chipTool, "Default Success Response"); +} + static void OnDefaultSuccessResponse(void * context) { ChipLogProgress(chipTool, "Default Success Response"); @@ -179,79 +200,62 @@ static void OnDefaultFailure(void * context, EmberAfStatus status) OnDefaultFailureResponse(context, status); }; -static void OnBooleanAttributeResponse(void * context, bool value) +static void OnBooleanAttributeReport(void * context, bool value) { ChipLogProgress(chipTool, "Boolean attribute Response: %d", value); - - ModelCommand * command = static_cast(context); - command->SetCommandExitStatus(CHIP_NO_ERROR); } -static void OnInt8uAttributeResponse(void * context, uint8_t value) +static void OnInt8uAttributeReport(void * context, uint8_t value) { ChipLogProgress(chipTool, "Int8u attribute Response: %" PRIu8, value); - - ModelCommand * command = static_cast(context); - command->SetCommandExitStatus(CHIP_NO_ERROR); } -static void OnInt16uAttributeResponse(void * context, uint16_t value) +static void OnInt16uAttributeReport(void * context, uint16_t value) { ChipLogProgress(chipTool, "Int16u attribute Response: %" PRIu16, value); - - ModelCommand * command = static_cast(context); - command->SetCommandExitStatus(CHIP_NO_ERROR); } -static void OnInt32uAttributeResponse(void * context, uint32_t value) +static void OnInt32uAttributeReport(void * context, uint32_t value) { ChipLogProgress(chipTool, "Int32u attribute Response: %" PRIu32, value); - - ModelCommand * command = static_cast(context); - command->SetCommandExitStatus(CHIP_NO_ERROR); } -static void OnInt64uAttributeResponse(void * context, uint64_t value) +static void OnInt64uAttributeReport(void * context, uint64_t value) { ChipLogProgress(chipTool, "Int64u attribute Response: %" PRIu64, value); - - ModelCommand * command = static_cast(context); - command->SetCommandExitStatus(CHIP_NO_ERROR); } -static void OnInt8sAttributeResponse(void * context, int8_t value) +static void OnInt8sAttributeReport(void * context, int8_t value) { ChipLogProgress(chipTool, "Int8s attribute Response: %" PRId8, value); - - ModelCommand * command = static_cast(context); - command->SetCommandExitStatus(CHIP_NO_ERROR); } -static void OnInt16sAttributeResponse(void * context, int16_t value) +static void OnInt16sAttributeReport(void * context, int16_t value) { ChipLogProgress(chipTool, "Int16s attribute Response: %" PRId16, value); - - ModelCommand * command = static_cast(context); - command->SetCommandExitStatus(CHIP_NO_ERROR); } -static void OnInt32sAttributeResponse(void * context, int32_t value) +static void OnInt32sAttributeReport(void * context, int32_t value) { ChipLogProgress(chipTool, "Int32s attribute Response: %" PRId32, value); - - ModelCommand * command = static_cast(context); - command->SetCommandExitStatus(CHIP_NO_ERROR); } -static void OnInt64sAttributeResponse(void * context, int64_t value) +static void OnInt64sAttributeReport(void * context, int64_t value) { ChipLogProgress(chipTool, "Int64s attribute Response: %" PRId64, value); +} - ModelCommand * command = static_cast(context); - command->SetCommandExitStatus(CHIP_NO_ERROR); +static void OnFloatAttributeReport(void * context, float value) +{ + ChipLogProgress(chipTool, "Float attribute Response: %f", value); +} + +static void OnDoubleAttributeReport(void * context, double value) +{ + ChipLogProgress(chipTool, "Double attribute Response: %f", value); } -static void OnOctetStringAttributeResponse(void * context, const chip::ByteSpan value) +static void OnOctetStringAttributeReport(void * context, const chip::ByteSpan value) { char buffer[CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE]; if (CHIP_NO_ERROR == chip::Encoding::BytesToUppercaseHexString(value.data(), value.size(), &buffer[0], CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE)) { @@ -259,34 +263,22 @@ static void OnOctetStringAttributeResponse(void * context, const chip::ByteSpan } else { ChipLogProgress(chipTool, "OctetString attribute Response len: %zu", value.size()); } - - ModelCommand * command = static_cast(context); - command->SetCommandExitStatus(CHIP_NO_ERROR); } -static void OnCharStringAttributeResponse(void * context, const chip::CharSpan value) +static void OnCharStringAttributeReport(void * context, const chip::CharSpan value) { ChipLogProgress(chipTool, "CharString attribute Response: %.*s", static_cast(value.size()), value.data()); - - ModelCommand * command = static_cast(context); - command->SetCommandExitStatus(CHIP_NO_ERROR); } -{{#chip_client_clusters}} -{{#chip_server_cluster_attributes}} -{{#if isList}} -static void On{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}ListAttributeResponse(void * context, {{zapTypeToDecodableClusterObjectType type ns=parent.name isArgument=true}} list) +template +static void OnGeneralAttributeResponse(void * context, const char * label, T value) { - CHIP_ERROR err = LogValue("On{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}ListAttributeResponse", 0, list); + CHIP_ERROR err = LogValue(label, 0, value); - ModelCommand * command = static_cast(context); + auto * command = static_cast(context); command->SetCommandExitStatus(err); } -{{/if}} -{{/chip_server_cluster_attributes}} -{{/chip_client_clusters}} - {{#chip_client_clusters}} {{#chip_cluster_responses}} static void On{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}Success(void * context, const chip::app::Clusters::{{asUpperCamelCase parent.name}}::Commands::{{asUpperCamelCase name}}::DecodableType & data) @@ -351,9 +343,7 @@ public: {{/if}} {{/chip_cluster_command_non_expanded_arguments}} - chip::Controller::{{asUpperCamelCase parent.name}}Cluster cluster; - cluster.Associate(device, endpointId); - return cluster.InvokeCommand(mRequest, this, {{#if hasSpecificResponse}}On{{asUpperCamelCase parent.name}}{{asUpperCamelCase response.name}}Success{{else}}OnDefaultSuccess{{/if}}, OnDefaultFailure); + return chip::Controller::InvokeCommand(device, this, {{#if hasSpecificResponse}}On{{asUpperCamelCase parent.name}}{{asUpperCamelCase response.name}}Success{{else}}OnDefaultSuccess{{/if}}, OnDefaultFailure, endpointId, mRequest, mTimedInteractionTimeoutMs); } private: @@ -363,6 +353,8 @@ private: {{/chip_cluster_commands}} {{#chip_server_cluster_attributes}} +{{! TODO: Various types (floats, structs) not supported here. }} +{{#unless (isStrEqual chipCallback.name "Unsupported")}} /* * Attribute {{asUpperCamelCase name}} */ @@ -377,8 +369,6 @@ public: ~Read{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}() { - delete onSuccessCallback; - delete onFailureCallback; } CHIP_ERROR SendCommand(ChipDevice * device, uint8_t endpointId) override @@ -387,26 +377,32 @@ public: chip::Controller::{{asUpperCamelCase parent.name}}Cluster cluster; cluster.Associate(device, endpointId); - return cluster.ReadAttribute{{asUpperCamelCase name}}(onSuccessCallback->Cancel(), onFailureCallback->Cancel()); + return cluster.ReadAttribute(this, + OnAttributeResponse, + OnDefaultFailure); } -private: -{{#if isList}} - chip::Callback::Callback<{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}ListAttributeCallback> * onSuccessCallback = new chip::Callback::Callback<{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}ListAttributeCallback>(On{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}ListAttributeResponse, this); -{{else}} - chip::Callback::Callback<{{chipCallback.name}}AttributeCallback> * onSuccessCallback = new chip::Callback::Callback<{{chipCallback.name}}AttributeCallback>(On{{chipCallback.name}}AttributeResponse, this); -{{/if}} - chip::Callback::Callback * onFailureCallback = new chip::Callback::Callback(OnDefaultFailureResponse, this); + static void OnAttributeResponse(void * context, {{zapTypeToDecodableClusterObjectType type ns=parent.name isArgument=true}} value) + { + OnGeneralAttributeResponse(context, "{{asUpperCamelCase parent.name}}.{{asUpperCamelCase name}} response", value); + } }; {{#if isWritableAttribute}} +{{! No list support for writing yet. Need to figure out how to represent the + values. }} +{{#unless isList}} class Write{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}: public ModelCommand { public: Write{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}(): ModelCommand("write") { AddArgument("attr-name", "{{asDelimitedCommand (asUpperCamelCase name)}}"); - {{#if (isString type)}} + {{#if isArray}} + // {{label}} Array parsing is not supported yet + {{else if isStruct}} + // {{label}} Struct parsing is not supported yet + {{else if (isString type)}} AddArgument("attr-value", &mValue); {{else}} AddArgument("attr-value", {{asTypeMinValue type}}, {{asTypeMaxValue type}}, &mValue); @@ -416,8 +412,6 @@ public: ~Write{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}() { - delete onSuccessCallback; - delete onFailureCallback; } CHIP_ERROR SendCommand(ChipDevice * device, uint8_t endpointId) override @@ -426,17 +420,17 @@ public: chip::Controller::{{asUpperCamelCase parent.name}}Cluster cluster; cluster.Associate(device, endpointId); - return cluster.WriteAttribute{{asUpperCamelCase name}}(onSuccessCallback->Cancel(), onFailureCallback->Cancel(), mValue); + return cluster.WriteAttribute(mValue, this, OnDefaultSuccessResponse, OnDefaultFailure, mTimedInteractionTimeoutMs); } private: - chip::Callback::Callback * onSuccessCallback = new chip::Callback::Callback(OnDefaultSuccessResponse, this); - chip::Callback::Callback * onFailureCallback = new chip::Callback::Callback(OnDefaultFailureResponse, this); - {{chipType}} mValue; + {{zapTypeToEncodableClusterObjectType type ns=parent.name}} mValue; }; +{{/unless}} {{/if}} {{#if isReportableAttribute}} +{{#unless isList}} class Report{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}: public ModelCommand { public: @@ -445,12 +439,14 @@ public: AddArgument("attr-name", "{{asDelimitedCommand (asUpperCamelCase name)}}"); AddArgument("min-interval", 0, UINT16_MAX, &mMinInterval); AddArgument("max-interval", 0, UINT16_MAX, &mMaxInterval); + AddArgument("wait", 0, 1, &mWait); ModelCommand::AddArguments(); } ~Report{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}() { delete onSuccessCallback; + delete onSuccessCallbackWithoutExit; delete onFailureCallback; delete onReportCallback; } @@ -462,24 +458,30 @@ public: chip::Controller::{{asUpperCamelCase parent.name}}Cluster cluster; cluster.Associate(device, endpointId); - CHIP_ERROR err = cluster.ReportAttribute{{asUpperCamelCase name}}(onReportCallback->Cancel()); - if (err != CHIP_NO_ERROR) - { - return err; - } + ReturnErrorOnFailure(cluster.ReportAttribute{{asUpperCamelCase name}}(onReportCallback->Cancel())); - return cluster.SubscribeAttribute{{asUpperCamelCase name}}(onSuccessCallback->Cancel(), onFailureCallback->Cancel(), mMinInterval, mMaxInterval); + chip::Callback::Cancelable * successCallback = mWait ? onSuccessCallbackWithoutExit->Cancel() : onSuccessCallback->Cancel(); + return cluster.SubscribeAttribute{{asUpperCamelCase name}}(successCallback, onFailureCallback->Cancel(), mMinInterval, mMaxInterval); + } + + chip::System::Clock::Timeout GetWaitDuration() const override + { + return chip::System::Clock::Seconds16(mWait ? UINT16_MAX : 10); } private: chip::Callback::Callback * onSuccessCallback = new chip::Callback::Callback(OnDefaultSuccessResponse, this); + chip::Callback::Callback * onSuccessCallbackWithoutExit = new chip::Callback::Callback(OnDefaultSuccessResponseWithoutExit, this); chip::Callback::Callback * onFailureCallback = new chip::Callback::Callback(OnDefaultFailureResponse, this); - chip::Callback::Callback<{{chipCallback.name}}AttributeCallback> * onReportCallback = new chip::Callback::Callback<{{chipCallback.name}}AttributeCallback>(On{{chipCallback.name}}AttributeResponse, this); + chip::Callback::Callback<{{chipCallback.name}}AttributeCallback> * onReportCallback = new chip::Callback::Callback<{{chipCallback.name}}AttributeCallback>(On{{chipCallback.name}}AttributeReport, this); uint16_t mMinInterval; uint16_t mMaxInterval; + bool mWait; }; +{{/unless}} {{/if}} +{{/unless}} {{/chip_server_cluster_attributes}} {{/chip_client_clusters}} @@ -496,13 +498,22 @@ void registerCluster{{asUpperCamelCase name}}(Commands & commands) make_unique<{{asUpperCamelCase clusterName}}{{asUpperCamelCase name}}>(), // {{/chip_cluster_commands}} {{#chip_server_cluster_attributes}} + {{! TODO: Various types (floats, structs) not supported here. }} + {{#unless (isStrEqual chipCallback.name "Unsupported")}} make_unique(), // {{#if isWritableAttribute}} + {{! No list support for writing yet. Need to figure out how to + represent the values. }} + {{#unless isList}} make_unique(), // + {{/unless}} {{/if}} {{#if isReportableAttribute}} + {{#unless isList}} make_unique(), // + {{/unless}} {{/if}} + {{/unless}} {{/chip_server_cluster_attributes}} }; diff --git a/examples/chip-tool/templates/helper.js b/examples/chip-tool/templates/helper.js index d42f5fb5a36136..dc95273dc2a06e 100644 --- a/examples/chip-tool/templates/helper.js +++ b/examples/chip-tool/templates/helper.js @@ -48,6 +48,9 @@ function asTypeMinValue(type) case 'uint32_t': case 'uint64_t': return '0'; + case 'float': + case 'double': + return `-std::numeric_limits<${basicType}>::infinity()`; default: error = 'asTypeMinValue: Unhandled underlying type ' + zclType + ' for original type ' + type; throw error; @@ -82,6 +85,9 @@ function asTypeMaxValue(type) case 'uint32_t': case 'uint64_t': return 'UINT' + parseInt(basicType.slice(4)) + '_MAX'; + case 'float': + case 'double': + return `std::numeric_limits<${basicType}>::infinity()`; default: return 'err'; error = 'asTypeMaxValue: Unhandled underlying type ' + zclType + ' for original type ' + type; @@ -97,9 +103,15 @@ function asTypeMaxValue(type) return templateUtil.templatePromise(this.global, promise); } +function utf8StringLength(str) +{ + return new TextEncoder().encode(str).length +} + // // Module exports // exports.asDelimitedCommand = asDelimitedCommand; exports.asTypeMinValue = asTypeMinValue; exports.asTypeMaxValue = asTypeMaxValue; +exports.utf8StringLength = utf8StringLength; diff --git a/examples/chip-tool/templates/partials/test_cluster.zapt b/examples/chip-tool/templates/partials/test_cluster.zapt index 46a869fdfea6fc..498f8e4a115063 100644 --- a/examples/chip-tool/templates/partials/test_cluster.zapt +++ b/examples/chip-tool/templates/partials/test_cluster.zapt @@ -32,7 +32,7 @@ class {{filename}}: public TestCommand {{#chip_tests_items}} case {{index}}: ChipLogProgress(chipTool, " ***** Test Step {{index}} : {{label}}\n"); - err = Test{{asUpperCamelCase label}}_{{index}}(); + err = {{#if PICS}}ShouldSkip("{{PICS}}") ? CHIP_NO_ERROR : {{/if}}Test{{asUpperCamelCase label}}_{{index}}(); break; {{/chip_tests_items}} } @@ -44,29 +44,54 @@ class {{filename}}: public TestCommand } } + {{#if timeout}} + chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(mTimeout.HasValue() : mTimeout.Value() : {{timeout}}); } + {{/if}} private: std::atomic_uint16_t mTestIndex; const uint16_t mTestCount = {{totalTests}}; + {{#chip_tests_items}} + {{#chip_tests_item_response_parameters}} + {{#if saveAs}} + {{chipType}} {{saveAs}}; + {{/if}} + {{/chip_tests_item_response_parameters}} + {{/chip_tests_items}} + {{#*inline "failureCallback"}}mOnFailureCallback_{{index}}{{/inline}} {{#*inline "successCallback"}}mOnSuccessCallback_{{index}}{{/inline}} + + {{#if isGroupCommand}} + {{#*inline "doneCallback"}}mOnDoneCallback_{{index}}{{/inline}} + {{/if}} + {{#*inline "failureResponse"}}OnFailureCallback_{{index}}{{/inline}} {{#*inline "successResponse"}}OnSuccessCallback_{{index}}{{/inline}} + + {{#*inline "doneResponse"}}OnDoneCallback_{{index}}{{/inline}} + {{#*inline "successArguments"}}void * context{{#chip_tests_item_response_parameters}}, {{zapTypeToDecodableClusterObjectType type ns=parent.cluster isArgument=true}} {{asLowerCamelCase name}}{{/chip_tests_item_response_parameters}}{{/inline}} {{#*inline "failureArguments"}}void * context, uint8_t status{{/inline}} + {{#if isGroupCommand}} + {{#*inline "doneArguments"}}void * context{{/inline}} + {{/if}} + {{#chip_tests_items}} {{#unless (isTestOnlyCluster cluster)}} {{#unless isWait}} {{#unless isCommand}} {{#unless isWriteAttribute}} + {{#unless isReadAttribute}} chip::Callback::CallbackfailureArguments}})> {{>failureCallback}} { {{>failureResponse}}, this }; chip::Callback::CallbacksuccessArguments}})> {{>successCallback}} { {{>successResponse}}, this }; {{/unless}} {{/unless}} {{/unless}} {{/unless}} + {{/unless}} {{/chip_tests_items}} {{#chip_tests_items}} @@ -78,6 +103,20 @@ class {{filename}}: public TestCommand { (static_cast<{{filename}} *>(context))->OnFailureResponse_{{index}}(chip::to_underlying(status)); } + + {{#if isGroupCommand}} + static void {{>doneResponse}}(void * context) + { + (static_cast<{{filename}} *>(context))->OnDoneResponse_{{index}}(); + + } + {{/if}} + + {{else if isReadAttribute}} + static void {{>failureResponse}}(void * context, EmberAfStatus status) + { + (static_cast<{{filename}} *>(context))->OnFailureResponse_{{index}}(chip::to_underlying(status)); + } {{else}} static void {{>failureResponse}}({{> failureArguments}}) { @@ -110,47 +149,91 @@ class {{filename}}: public TestCommand {{#if (isTestOnlyCluster cluster)}} CHIP_ERROR {{>testCommand}}() { + SetIdentity(kIdentity{{asUpperCamelCase identity}}); return {{command}}({{#chip_tests_item_parameters}}{{#not_first}}, {{/not_first}}{{#if (isString type)}}"{{/if}}{{definedValue}}{{#if (isString type)}}"{{/if}}{{/chip_tests_item_parameters}}); } {{else if isWait}} CHIP_ERROR {{>testCommand}}() { - ChipLogError(chipTool, "[Endpoint: {{endpoint}} Cluster: {{cluster}} {{#if isAttribute}}Attribute: {{attribute}}{{else}}Command: {{wait}}{{/if}}] {{label}}"); + const chip::EndpointId endpoint = mEndpointId.HasValue() ? mEndpointId.Value() : {{endpoint}}; + ChipLogError(chipTool, "[Endpoint: 0x%08x Cluster: {{cluster}} {{#if isAttribute}}Attribute: {{attribute}}{{else}}Command: {{wait}}{{/if}}] {{label}}", endpoint); {{#*inline "waitForTypeName"}}{{#if isAttribute}}Attribute{{else}}Command{{/if}}{{/inline}} {{#*inline "waitForTypeId"}}chip::app::Clusters::{{asUpperCamelCase cluster}}::{{#if isAttribute}}Attributes::{{attribute}}{{else}}Commands::{{wait}}{{/if}}::Id{{/inline}} ClearAttributeAndCommandPaths(); - m{{>waitForTypeName}}Path = chip::app::Concrete{{>waitForTypeName}}Path({{endpoint}}, chip::app::Clusters::{{asUpperCamelCase cluster}}::Id, {{>waitForTypeId}}); + m{{>waitForTypeName}}Path = chip::app::Concrete{{>waitForTypeName}}Path(endpoint, chip::app::Clusters::{{asUpperCamelCase cluster}}::Id, {{>waitForTypeId}}); return CHIP_NO_ERROR; } {{else}} {{#*inline "failureResponse"}}OnFailureResponse_{{index}}{{/inline}} {{#*inline "successResponse"}}OnSuccessResponse_{{index}}{{/inline}} + {{#*inline "doneResponse"}}OnDoneResponse_{{index}}{{/inline}} + {{#*inline "failureArguments"}}uint8_t status{{/inline}} {{#*inline "successArguments"}}{{#chip_tests_item_response_parameters}}{{#not_first}}, {{/not_first}}{{zapTypeToDecodableClusterObjectType type ns=parent.cluster isArgument=true}} {{asLowerCamelCase name}}{{/chip_tests_item_response_parameters}}{{/inline}} + {{#*inline "doneArguments"}}{{/inline}} + {{#*inline "device"}}mDevices[kIdentity{{asUpperCamelCase identity}}]{{/inline}} CHIP_ERROR {{>testCommand}}() { - chip::Controller::{{asUpperCamelCase cluster}}ClusterTest cluster; - cluster.Associate(mDevice, {{endpoint}}); + {{#if isGroupCommand}} + const chip::GroupId groupId = {{groupId}}; + {{else}} + const chip::EndpointId endpoint = mEndpointId.HasValue() ? mEndpointId.Value() : {{endpoint}}; + {{/if}} + + {{~#*inline "maybeTimedInteractionTimeout"}} + {{#if timedInteractionTimeoutMs}} + , {{timedInteractionTimeoutMs}} + {{else if commandObject.mustUseTimedInvoke}} + , chip::NullOptional + {{else if attributeObject.mustUseTimedWrite}} + , chip::NullOptional + {{/if}} + {{/inline~}} + + {{~#*inline "maybeWait"}} + {{#if busyWaitMs}} + { + using namespace chip::System::Clock::Literals; + // Busy-wait for {{busyWaitMs}} milliseconds. + auto & clock = chip::System::SystemClock(); + auto start = clock.GetMonotonicTimestamp(); + while (clock.GetMonotonicTimestamp() - start < {{busyWaitMs}}_ms); + } + {{/if}} + {{/inline~}} {{#if isCommand}} - using requestType = chip::app::Clusters::{{asUpperCamelCase cluster}}::Commands::{{asUpperCamelCase command}}::Type; - using responseType = chip::app::{{chip_tests_item_response_type}}; + using RequestType = chip::app::Clusters::{{asUpperCamelCase cluster}}::Commands::{{asUpperCamelCase command}}::Type; - chip::app::Clusters::{{asUpperCamelCase cluster}}::Commands::{{asUpperCamelCase command}}::Type request; + RequestType request; {{#chip_tests_item_parameters}} {{>commandValue ns=parent.cluster container=(concat "request." (asLowerCamelCase label)) definedValue=definedValue}} {{/chip_tests_item_parameters}} - auto success = [](void * context, const responseType & data) { + auto success = [](void * context, const typename RequestType::ResponseType & data) { (static_cast<{{filename}} *>(context))->OnSuccessResponse_{{index}}({{#chip_tests_item_response_parameters}}{{#not_first}}, {{/not_first}}data.{{asLowerCamelCase name}}{{/chip_tests_item_response_parameters}}); }; auto failure = [](void * context, EmberAfStatus status) { (static_cast<{{filename}} *>(context))->OnFailureResponse_{{index}}(status); }; - {{#if async}}ReturnErrorOnFailure({{else}}return {{/if}}cluster.InvokeCommand(request, this, success, failure){{#if async}}){{/if}}; + + ReturnErrorOnFailure(chip::Controller::{{#if isGroupCommand}}InvokeGroupCommand{{else}}InvokeCommand{{/if}}({{>device}}, this, success, failure, + {{#if isGroupCommand}}groupId{{else}}endpoint{{/if}}, + request + {{> maybeTimedInteractionTimeout }} + )); + {{> maybeWait }} + {{#unless async}}return CHIP_NO_ERROR;{{/unless}} + {{else}} + chip::Controller::{{asUpperCamelCase cluster}}ClusterTest cluster; + {{#if isGroupCommand}} + cluster.AssociateWithGroup({{>device}}, groupId); {{else}} + cluster.Associate({{>device}}, endpoint); + {{/if}} + {{#chip_tests_item_parameters}} {{zapTypeToEncodableClusterObjectType type ns=parent.cluster}} {{asLowerCamelCase name}}Argument; {{>commandValue ns=parent.cluster container=(concat (asLowerCamelCase name) "Argument") definedValue=definedValue}} @@ -159,7 +242,17 @@ class {{filename}}: public TestCommand {{#if isWriteAttribute}} {{#*inline "failureResponse"}}OnFailureCallback_{{index}}{{/inline}} {{#*inline "successResponse"}}OnSuccessCallback_{{index}}{{/inline}} - {{#if async}}ReturnErrorOnFailure({{else}}return {{/if}}cluster.WriteAttribute({{#chip_tests_item_parameters}}{{asLowerCamelCase name}}Argument, {{/chip_tests_item_parameters}}this, {{>successResponse}}, {{>failureResponse}}){{#if async}}){{/if}}; + {{#*inline "doneResponse"}}OnDoneCallback_{{index}}{{/inline}} + ReturnErrorOnFailure(cluster.WriteAttribute({{#chip_tests_item_parameters}}{{asLowerCamelCase name}}Argument, {{/chip_tests_item_parameters}}this, {{>successResponse}}, {{>failureResponse}} + {{~> maybeTimedInteractionTimeout ~}} + {{~#if isGroupCommand}}, {{>doneResponse}}{{/if~}} + )); + {{> maybeWait }} + {{#unless async}}return CHIP_NO_ERROR;{{/unless}} + {{else if isReadAttribute}} + {{#*inline "failureResponse"}}OnFailureCallback_{{index}}{{/inline}} + {{#*inline "successResponse"}}OnSuccessCallback_{{index}}{{/inline}} + {{#if async}}ReturnErrorOnFailure({{else}}return {{/if}}cluster.ReadAttribute({{#chip_tests_item_parameters}}{{asLowerCamelCase name}}Argument, {{/chip_tests_item_parameters}}this, {{>successResponse}}, {{>failureResponse}}){{#if async}}){{/if}}; {{else}} {{~#*inline "commandName"}}{{asUpperCamelCase commandName}}{{#if isAttribute}}Attribute{{asUpperCamelCase attribute}}{{/if}}{{/inline}} {{#if async}}ReturnErrorOnFailure({{else}}return {{/if}}cluster.{{>commandName}}({{>successCallback}}.Cancel(){{#unless isWaitForReport}}, {{>failureCallback}}.Cancel(){{/unless}}{{#chip_tests_item_parameters}}, {{asLowerCamelCase name}}Argument{{/chip_tests_item_parameters}}){{#if async}}){{/if}}; @@ -171,17 +264,23 @@ class {{filename}}: public TestCommand void {{>failureResponse}}({{>failureArguments}}) { - {{~#unless response.error}} - {{#if optional}}(status == EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE) ? NextTest() : {{/if}}ThrowFailureResponse(); + {{#if response.error}} + VerifyOrReturn(CheckValue("status", status, {{response.error}})); + {{#unless async}}NextTest();{{/unless}} + {{else if response.errorWrongValue}} + VerifyOrReturn(CheckConstraintNotValue("status", status, 0)); + {{#unless async}}NextTest();{{/unless}} {{else}} - {{#unless async}}NextTest();{{/unless}} - {{/unless}} + {{#if optional}}(status == EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE) ? NextTest() : {{/if}}ThrowFailureResponse(); + {{/if}} } void {{>successResponse}}({{>successArguments}}) { {{~#if response.error}} - ThrowSuccessResponse(); + ThrowSuccessResponse(); + {{else if response.errorWrongValue}} + ThrowSuccessResponse(); {{else}} {{! This block can be removed if there is a mechanism to remove the report handler}} {{#if isWaitForReport}} @@ -193,26 +292,8 @@ class {{filename}}: public TestCommand {{/if}} {{#chip_tests_item_response_parameters}} {{~#*inline "item"}}{{asLowerCamelCase name}}{{#if isOptional}}.Value(){{/if}}{{/inline}} - {{~#*inline "itemValue"}}{{>item}}{{#if isNullable}}.Value(){{/if}}{{/inline}} {{#if hasExpectedValue}} - {{#if isOptional}} - {{~#*inline "item"}}{{asLowerCamelCase name}}{{/inline}} - VerifyOrReturn(CheckValuePresent("{{> item}}", {{> item}})); - {{/if}} - {{#if (isLiteralNull expectedValue)}} - VerifyOrReturn(CheckValueNull("{{> item}}", {{> item}})); - {{else}} - {{#if isNullable}} - VerifyOrReturn(CheckValueNonNull("{{> item}}", {{> item}})); - {{/if}} - VerifyOrReturn(CheckValue - {{~#if isList}}AsListLength("{{>itemValue}}", {{>itemValue}}, {{expectedValue.length}}) - {{else if isArray}}AsList("{{>itemValue}}", {{>itemValue}}{{#if expectedValue.length}}, {{expectedValue}}{{/if}}) - {{else if (isString type)}}AsString("{{>itemValue}}", {{>itemValue}}, "{{expectedValue}}") - {{else}}<{{chipType}}>("{{>itemValue}}", {{>itemValue}}, {{expectedValue}}{{asTypeLiteralSuffix type}}) - {{/if}} - ); - {{/if}} + {{>valueEquals actual=(asLowerCamelCase name) label=(asLowerCamelCase name) expected=expectedValue}} {{/if}} {{#if hasExpectedConstraints}} {{#if isOptional}} @@ -221,17 +302,30 @@ class {{filename}}: public TestCommand {{/if}} {{#if expectedConstraints.type}}VerifyOrReturn(CheckConstraintType("{{>item}}", "", "{{expectedConstraints.type}}"));{{/if}} {{~#if expectedConstraints.format}}VerifyOrReturn(CheckConstraintFormat("{{>item}}", "", "{{expectedConstraints.format}}"));{{/if}} + {{~#if expectedConstraints.startsWith}}VerifyOrReturn(CheckConstraintStartsWith("{{>item}}", {{>item}}, "{{expectedConstraints.startsWith}}"));{{/if}} + {{~#if expectedConstraints.endsWith}}VerifyOrReturn(CheckConstraintEndsWith("{{>item}}", {{>item}}, "{{expectedConstraints.endsWith}}"));{{/if}} {{~#if expectedConstraints.minLength}}VerifyOrReturn(CheckConstraintMinLength("{{>item}}", {{>item}}.size(), {{expectedConstraints.minLength}}));{{/if}} {{~#if expectedConstraints.maxLength}}VerifyOrReturn(CheckConstraintMaxLength("{{>item}}", {{>item}}.size(), {{expectedConstraints.maxLength}}));{{/if}} {{~#if expectedConstraints.minValue}}VerifyOrReturn(CheckConstraintMinValue<{{chipType}}>("{{>item}}", {{>item}}, {{expectedConstraints.minValue}}));{{/if}} {{~#if expectedConstraints.maxValue}}VerifyOrReturn(CheckConstraintMaxValue<{{chipType}}>("{{>item}}", {{>item}}, {{expectedConstraints.maxValue}}));{{/if}} - {{~#if expectedConstraints.notValue}}VerifyOrReturn(CheckConstraintNotValue<{{chipType}}>("{{>item}}", {{>item}}, {{expectedConstraints.notValue}}));{{/if}} + {{~#if expectedConstraints.notValue}}VerifyOrReturn(CheckConstraintNotValue("{{>item}}", {{>item}}, {{asTypedLiteral expectedConstraints.notValue type}}));{{/if}} + {{/if}} + + {{#if saveAs}} + {{saveAs}} = {{>item}}; {{/if}} {{/chip_tests_item_response_parameters}} {{#unless async}}NextTest();{{/unless}} {{/if}} } + {{#if isGroupCommand}} + void {{>doneResponse}}({{>doneArguments}}) + { + NextTest(); + } + {{/if}} + {{/if}} {{/chip_tests_items}} }; diff --git a/examples/chip-tool/templates/partials/test_cluster_command_value.zapt b/examples/chip-tool/templates/partials/test_cluster_command_value.zapt index 97838912a570cf..91fc57eb0097b9 100644 --- a/examples/chip-tool/templates/partials/test_cluster_command_value.zapt +++ b/examples/chip-tool/templates/partials/test_cluster_command_value.zapt @@ -32,14 +32,14 @@ {{#if_chip_enum type}} static_cast<{{zapTypeToEncodableClusterObjectType type ns=ns}}>({{definedValue}}); {{else if (isCharString type)}} - chip::Span("{{definedValue}}", strlen("{{definedValue}}")); + chip::Span("{{definedValue}}garbage: not in length on purpose", {{utf8StringLength definedValue}}); {{else if (isOctetString type)}} - chip::ByteSpan(chip::Uint8::from_const_char("{{definedValue}}"), strlen("{{definedValue}}")); + chip::ByteSpan(chip::Uint8::from_const_char("{{octetStringEscapedForCLiteral definedValue}}garbage: not in length on purpose"), {{definedValue.length}}); {{else}} {{#if_is_bitmap type}} static_cast<{{zapTypeToEncodableClusterObjectType type ns=ns}}>({{definedValue}}); {{else}} - {{definedValue}}{{asTypeLiteralSuffix type}}; + {{asTypedLiteral definedValue type}}; {{/if_is_bitmap}} {{/if_chip_enum}} {{/if_is_struct}} diff --git a/examples/chip-tool/templates/partials/test_cluster_value_equals.zapt b/examples/chip-tool/templates/partials/test_cluster_value_equals.zapt new file mode 100644 index 00000000000000..bdb9d3e1020a69 --- /dev/null +++ b/examples/chip-tool/templates/partials/test_cluster_value_equals.zapt @@ -0,0 +1,38 @@ +{{#if isOptional}} + VerifyOrReturn(CheckValuePresent("{{label}}", {{actual}})); + {{>valueEquals label=(concat label ".Value()") actual=(concat actual ".Value()") expected=expected isOptional=false}} +{{else if isNullable}} + {{#if (isLiteralNull expected)}} + VerifyOrReturn(CheckValueNull("{{label}}", {{actual}})); + {{else}} + VerifyOrReturn(CheckValueNonNull("{{label}}", {{actual}})); + {{>valueEquals label=(concat label ".Value()") actual=(concat actual ".Value()") expected=expected isNullable=false}} + {{/if}} +{{else if isArray}} + auto iter = {{actual}}.begin(); + {{#each expected}} + VerifyOrReturn(CheckNextListItemDecodes("{{../label}}", iter, {{@index}})); + {{>valueEquals label=(concat ../label "[" @index "]") actual="iter.GetValue()" expected=this isArray=false type=../type chipType=../chipType}} + {{/each}} + VerifyOrReturn(CheckNoMoreListItems("{{label}}", iter, {{expected.length}})); +{{else}} + {{#if_is_struct type}} + {{! Iterate over the actual types in the struct, so we pick up the right + type/optionality/nullability information for them for our recursive + call. }} + {{#zcl_struct_items_by_struct_name type}} + {{#if (expectedValueHasProp ../expected (asLowerCamelCase label))}} + {{>valueEquals label=(concat ../label "." (asLowerCamelCase label)) actual=(concat ../actual "." (asLowerCamelCase label)) expected=(lookup ../expected (asLowerCamelCase label))}} + {{/if}} + {{/zcl_struct_items_by_struct_name}} + {{! Maybe we should add a check for properties in the expected object (other + than "global") that are not present in the struct ? }} + {{else}} + VerifyOrReturn(CheckValue + {{~#if (isOctetString type)}}AsString("{{label}}", {{actual}}, chip::ByteSpan(chip::Uint8::from_const_char("{{octetStringEscapedForCLiteral expected}}"), {{expected.length}})) + {{else if (isCharString type)}}AsString("{{label}}", {{actual}}, chip::CharSpan("{{expected}}", {{utf8StringLength expected}})) + {{else}}("{{label}}", {{actual}}, {{asTypedLiteral expected type}}) + {{/if}} + ); + {{/if_is_struct}} +{{/if}} diff --git a/examples/chip-tool/templates/reporting-commands.zapt b/examples/chip-tool/templates/reporting-commands.zapt index 25d0808300a888..a0d10f149d49a4 100644 --- a/examples/chip-tool/templates/reporting-commands.zapt +++ b/examples/chip-tool/templates/reporting-commands.zapt @@ -3,7 +3,7 @@ #pragma once #include - +#include "../cluster/Commands.h" // For the LogValue bits and read callbacks typedef void (*UnsupportedAttributeCallback)(void * context); @@ -19,7 +19,11 @@ public: {{#chip_client_clusters}} {{#chip_server_cluster_attributes}} {{#if isReportableAttribute}} +{{#unless isList}} +{{#unless (isStrEqual chipCallback.name "Unsupported")}} delete onReport{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}Callback; +{{/unless}} +{{/unless}} {{/if}} {{/chip_server_cluster_attributes}} {{/chip_client_clusters}} @@ -31,52 +35,25 @@ public: {{#chip_client_clusters}} {{#chip_server_cluster_attributes}} {{#if isReportableAttribute}} +{{#unless isList}} +{{#unless (isStrEqual chipCallback.name "Unsupported")}} callbacksMgr.AddReportCallback(remoteId, endpointId, {{asHex parent.code 4}}, {{asHex code 4}}, onReport{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}Callback->Cancel(), BasicAttributeFilter<{{chipCallback.name}}AttributeCallback>); +{{/unless}} +{{/unless}} {{/if}} {{/chip_server_cluster_attributes}} {{/chip_client_clusters}} } - static void OnDefaultSuccessResponse(void * context) - { - ChipLogProgress(chipTool, "Default Success Response"); - } - - static void OnDefaultFailureResponse(void * context, uint8_t status) - { - ChipLogProgress(chipTool, "Default Failure Response: 0x%02x", status); - } - - static void OnUnsupportedAttributeResponse(void * context) - { - ChipLogError(chipTool, "Unsupported attribute Response. This should never happen !"); - } - - static void OnBooleanAttributeResponse(void * context, bool value) - { - ChipLogProgress(chipTool, "Boolean attribute Response: %d", value); - } - - static void OnInt8uAttributeResponse(void * context, uint8_t value) - { - ChipLogProgress(chipTool, "Int8u attribute Response: %" PRIu8, value); - } - - static void OnInt16uAttributeResponse(void * context, uint16_t value) - { - ChipLogProgress(chipTool, "Int16u attribute Response: %" PRIu16, value); - } - - static void OnInt16sAttributeResponse(void * context, int16_t value) - { - ChipLogProgress(chipTool, "Int16s attribute Response: %" PRId16, value); - } - private: {{#chip_client_clusters}} {{#chip_server_cluster_attributes}} {{#if isReportableAttribute}} - chip::Callback::Callback<{{chipCallback.name}}AttributeCallback> * onReport{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}Callback = new chip::Callback::Callback<{{chipCallback.name}}AttributeCallback>(On{{chipCallback.name}}AttributeResponse, this); +{{#unless isList}} +{{#unless (isStrEqual chipCallback.name "Unsupported")}} + chip::Callback::Callback * onReport{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}Callback = new chip::Callback::Callback(Read{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}::OnAttributeResponse, this); + {{/unless}} +{{/unless}} {{/if}} {{/chip_server_cluster_attributes}} {{/chip_client_clusters}} diff --git a/examples/chip-tool/templates/templates.json b/examples/chip-tool/templates/templates.json index 9fa7f7f4d4c38e..17afafd04192de 100644 --- a/examples/chip-tool/templates/templates.json +++ b/examples/chip-tool/templates/templates.json @@ -31,6 +31,10 @@ { "name": "commandValue", "path": "partials/test_cluster_command_value.zapt" + }, + { + "name": "valueEquals", + "path": "partials/test_cluster_value_equals.zapt" } ], "templates": [ diff --git a/examples/chip-tool/templates/tests-commands.zapt b/examples/chip-tool/templates/tests-commands.zapt index 4f950dbcd8f825..27e6ac1ea84b28 100644 --- a/examples/chip-tool/templates/tests-commands.zapt +++ b/examples/chip-tool/templates/tests-commands.zapt @@ -3,6 +3,23 @@ #pragma once #include +#include +#include +#include + +#include // For INFINITY + +class TestList : public Command +{ +public: + TestList() : Command("list") {}; + CHIP_ERROR Run() override + { + {{#chip_tests (getTests)}}printf("{{filename}}\n");{{/chip_tests}} + + return CHIP_NO_ERROR; + } +}; {{>test_cluster tests=(getTests)}} @@ -11,6 +28,7 @@ void registerCommandsTests(Commands & commands) const char * clusterName = "Tests"; commands_list clusterCommands = { + make_unique(), {{#chip_tests (getTests)}} make_unique<{{filename}}>(), {{/chip_tests}} diff --git a/examples/chip-tool/templates/tests.js b/examples/chip-tool/templates/tests.js index 5003ad980ca36a..12ba90c3e99995 100644 --- a/examples/chip-tool/templates/tests.js +++ b/examples/chip-tool/templates/tests.js @@ -20,6 +20,7 @@ function getTests() const BinaryInput = [ 'Test_TC_BI_1_1', 'Test_TC_BI_2_1', + 'Test_TC_BI_2_2', ]; const BooleanState = [ @@ -48,6 +49,7 @@ function getTests() 'Test_TC_CC_7_3', 'Test_TC_CC_7_4', 'Test_TC_CC_8_1', + 'Test_TC_CC_9_1', 'Test_TC_CC_9_2', 'Test_TC_CC_9_3', ]; @@ -55,6 +57,7 @@ function getTests() const DeviceManagement = [ 'Test_TC_DM_1_1', 'Test_TC_DM_3_1', + 'Test_TC_DM_2_2', ]; const ElectricalMeasurement = [ @@ -67,6 +70,10 @@ function getTests() 'Test_TC_FLW_2_2', ]; + const IlluminanceMeasurement = [ + 'Test_TC_ILL_1_1', + ]; + const OccupancySensing = [ 'Test_TC_OCC_1_1', 'Test_TC_OCC_2_1', @@ -101,6 +108,7 @@ function getTests() 'Test_TC_OO_1_1', 'Test_TC_OO_2_1', 'Test_TC_OO_2_2', + 'Test_TC_OO_2_3', ]; const PressureMeasurement = [ @@ -129,6 +137,8 @@ function getTests() const Thermostat = [ 'Test_TC_TSTAT_1_1', + 'Test_TC_TSTAT_2_1', + 'Test_TC_TSTAT_2_2', ]; const ThermostatUserConfiguration = [ @@ -144,6 +154,8 @@ function getTests() const WindowCovering = [ 'Test_TC_WNCV_1_1', 'Test_TC_WNCV_2_1', + 'Test_TC_WNCV_2_2', + 'Test_TC_WNCV_2_4', 'Test_TC_WNCV_2_5', 'Test_TC_WNCV_3_1', 'Test_TC_WNCV_3_2', @@ -170,15 +182,20 @@ function getTests() 'TestConstraints', 'TestDelayCommands', 'TestLogCommands', + 'TestSaveAs', 'TestDescriptorCluster', 'TestBasicInformation', 'TestIdentifyCluster', + 'TestGroupsCluster', 'TestOperationalCredentialsCluster', 'TestModeSelectCluster', + 'TestGroupMessaging', ]; const SoftwareDiagnostics = [ 'Test_TC_DIAGSW_1_1', + 'Test_TC_DIAGSW_2_1', + 'Test_TC_DIAGSW_3_2', ]; const Subscriptions = [ @@ -192,6 +209,7 @@ function getTests() DeviceManagement, // ElectricalMeasurement, // FlowMeasurement, // + IlluminanceMeasurement, // LevelControl, // MediaControl, // OccupancySensing, // diff --git a/examples/common/pigweed/mbed/Rpc.cpp b/examples/common/pigweed/mbed/Rpc.cpp index 4f9ccde46beecc..e16c3afc816673 100644 --- a/examples/common/pigweed/mbed/Rpc.cpp +++ b/examples/common/pigweed/mbed/Rpc.cpp @@ -58,7 +58,7 @@ namespace rpc { class MbedButton final : public Button { public: - pw::Status Event(ServerContext &, const chip_rpc_ButtonEvent & request, pw_protobuf_Empty & response) + pw::Status Event(const chip_rpc_ButtonEvent & request, pw_protobuf_Empty & response) { GetAppTask().ButtonEventHandler(request.idx, request.pushed); return pw::OkStatus(); diff --git a/examples/common/pigweed/protos/attributes_service.proto b/examples/common/pigweed/protos/attributes_service.proto index 2802c445f36a77..2705498450d658 100644 --- a/examples/common/pigweed/protos/attributes_service.proto +++ b/examples/common/pigweed/protos/attributes_service.proto @@ -70,9 +70,121 @@ enum AttributeType { ZCL_UNKNOWN_ATTRIBUTE_TYPE = 0xFF; // Unknown } +enum ClusterType { + ZCL_INVALID_CLUSTER_ID = 0x0000; + ZCL_POWER_CONFIG_CLUSTER_ID = 0x0001; + ZCL_DEVICE_TEMP_CLUSTER_ID = 0x0002; + ZCL_IDENTIFY_CLUSTER_ID = 0x0003; + ZCL_GROUPS_CLUSTER_ID = 0x0004; + ZCL_SCENES_CLUSTER_ID = 0x0005; + ZCL_ON_OFF_CLUSTER_ID = 0x0006; + ZCL_ON_OFF_SWITCH_CONFIG_CLUSTER_ID = 0x0007; + ZCL_LEVEL_CONTROL_CLUSTER_ID = 0x0008; + ZCL_ALARM_CLUSTER_ID = 0x0009; + ZCL_TIME_CLUSTER_ID = 0x000A; + ZCL_BINARY_INPUT_BASIC_CLUSTER_ID = 0x000F; + ZCL_POWER_PROFILE_CLUSTER_ID = 0x001A; + ZCL_APPLIANCE_CONTROL_CLUSTER_ID = 0x001B; + ZCL_DESCRIPTOR_CLUSTER_ID = 0x001D; + ZCL_POLL_CONTROL_CLUSTER_ID = 0x0020; + ZCL_BRIDGED_ACTIONS_CLUSTER_ID = 0x0025; + ZCL_BASIC_CLUSTER_ID = 0x0028; + ZCL_OTA_PROVIDER_CLUSTER_ID = 0x0029; + ZCL_OTA_REQUESTOR_CLUSTER_ID = 0x002A; + ZCL_POWER_SOURCE_CLUSTER_ID = 0x002F; + ZCL_GENERAL_COMMISSIONING_CLUSTER_ID = 0x0030; + ZCL_NETWORK_COMMISSIONING_CLUSTER_ID = 0x0031; + ZCL_DIAGNOSTIC_LOGS_CLUSTER_ID = 0x0032; + ZCL_GENERAL_DIAGNOSTICS_CLUSTER_ID = 0x0033; + ZCL_SOFTWARE_DIAGNOSTICS_CLUSTER_ID = 0x0034; + ZCL_THREAD_NETWORK_DIAGNOSTICS_CLUSTER_ID = 0x0035; + ZCL_WIFI_NETWORK_DIAGNOSTICS_CLUSTER_ID = 0x0036; + ZCL_ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER_ID = 0x0037; + ZCL_BRIDGED_DEVICE_BASIC_CLUSTER_ID = 0x0039; + ZCL_SWITCH_CLUSTER_ID = 0x003B; + ZCL_ADMINISTRATOR_COMMISSIONING_CLUSTER_ID = 0x003C; + ZCL_OPERATIONAL_CREDENTIALS_CLUSTER_ID = 0x003E; + ZCL_FIXED_LABEL_CLUSTER_ID = 0x0040; + ZCL_BOOLEAN_STATE_CLUSTER_ID = 0x0045; + ZCL_MODE_SELECT_CLUSTER_ID = 0x0050; + ZCL_SHADE_CONFIG_CLUSTER_ID = 0x0100; + ZCL_DOOR_LOCK_CLUSTER_ID = 0x0101; + ZCL_WINDOW_COVERING_CLUSTER_ID = 0x0102; + ZCL_BARRIER_CONTROL_CLUSTER_ID = 0x0103; + ZCL_PUMP_CONFIG_CONTROL_CLUSTER_ID = 0x0200; + ZCL_THERMOSTAT_CLUSTER_ID = 0x0201; + ZCL_FAN_CONTROL_CLUSTER_ID = 0x0202; + ZCL_DEHUMID_CONTROL_CLUSTER_ID = 0x0203; + ZCL_THERMOSTAT_UI_CONFIG_CLUSTER_ID = 0x0204; + ZCL_COLOR_CONTROL_CLUSTER_ID = 0x0300; + ZCL_BALLAST_CONFIGURATION_CLUSTER_ID = 0x0301; + ZCL_ILLUMINANCE_MEASUREMENT_CLUSTER_ID = 0x0400; + ZCL_TEMP_MEASUREMENT_CLUSTER_ID = 0x0402; + ZCL_PRESSURE_MEASUREMENT_CLUSTER_ID = 0x0403; + ZCL_FLOW_MEASUREMENT_CLUSTER_ID = 0x0404; + ZCL_RELATIVE_HUMIDITY_MEASUREMENT_CLUSTER_ID = 0x0405; + ZCL_OCCUPANCY_SENSING_CLUSTER_ID = 0x0406; + ZCL_CARBON_MONOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x040C; + ZCL_CARBON_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x040D; + ZCL_ETHYLENE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x040E; + ZCL_ETHYLENE_OXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x040F; + ZCL_HYDROGEN_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0410; + ZCL_HYDROGEN_SULPHIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0411; + ZCL_NITRIC_OXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0412; + ZCL_NITROGEN_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0413; + ZCL_OXYGEN_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0414; + ZCL_OZONE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0415; + ZCL_SULFUR_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0416; + ZCL_DISSOLVED_OXYGEN_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0417; + ZCL_BROMATE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0418; + ZCL_CHLORAMINES_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0419; + ZCL_CHLORINE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041A; + ZCL_FECAL_COLIFORM_AND_E_COLI_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041B; + ZCL_FLUORIDE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041C; + ZCL_HALOACETIC_ACIDS_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041D; + ZCL_TOTAL_TRIHALOMETHANES_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041E; + ZCL_TOTAL_COLIFORM_BACTERIA_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x041F; + ZCL_TURBIDITY_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0420; + ZCL_COPPER_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0421; + ZCL_LEAD_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0422; + ZCL_MANGANESE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0423; + ZCL_SULFATE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0424; + ZCL_BROMODICHLOROMETHANE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0425; + ZCL_BROMOFORM_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0426; + ZCL_CHLORODIBROMOMETHANE_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0427; + ZCL_CHLOROFORM_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0428; + ZCL_SODIUM_CONCENTRATION_MEASUREMENT_CLUSTER_ID = 0x0429; + ZCL_IAS_ZONE_CLUSTER_ID = 0x0500; + ZCL_IAS_ACE_CLUSTER_ID = 0x0501; + ZCL_IAS_WD_CLUSTER_ID = 0x0502; + ZCL_WAKE_ON_LAN_CLUSTER_ID = 0x0503; + ZCL_TV_CHANNEL_CLUSTER_ID = 0x0504; + ZCL_TARGET_NAVIGATOR_CLUSTER_ID = 0x0505; + ZCL_MEDIA_PLAYBACK_CLUSTER_ID = 0x0506; + ZCL_MEDIA_INPUT_CLUSTER_ID = 0x0507; + ZCL_LOW_POWER_CLUSTER_ID = 0x0508; + ZCL_KEYPAD_INPUT_CLUSTER_ID = 0x0509; + ZCL_CONTENT_LAUNCH_CLUSTER_ID = 0x050A; + ZCL_AUDIO_OUTPUT_CLUSTER_ID = 0x050B; + ZCL_APPLICATION_LAUNCHER_CLUSTER_ID = 0x050C; + ZCL_APPLICATION_BASIC_CLUSTER_ID = 0x050D; + ZCL_ACCOUNT_LOGIN_CLUSTER_ID = 0x050E; + ZCL_TEST_CLUSTER_ID = 0x050F; + ZCL_MESSAGING_CLUSTER_ID = 0x0703; + ZCL_APPLIANCE_IDENTIFICATION_CLUSTER_ID = 0x0B00; + ZCL_METER_IDENTIFICATION_CLUSTER_ID = 0x0B01; + ZCL_APPLIANCE_EVENTS_AND_ALERT_CLUSTER_ID = 0x0B02; + ZCL_APPLIANCE_STATISTICS_CLUSTER_ID = 0x0B03; + ZCL_ELECTRICAL_MEASUREMENT_CLUSTER_ID = 0x0B04; + ZCL_BINDING_CLUSTER_ID = 0xF000; + ZCL_GROUP_KEY_MANAGEMENT_CLUSTER_ID = 0xF004; + ZCL_SAMPLE_MFG_SPECIFIC_CLUSTER_ID = 0xFC00; +} + + message AttributeMetadata { uint32 endpoint = 1; - uint32 cluster = 2; + ClusterType cluster = 2; uint32 attribute_id = 3; AttributeType type = 4; } @@ -84,6 +196,9 @@ message AttributeData { uint32 data_uint16 = 3; uint32 data_uint32 = 4; bytes data_bytes = 5; + int32 data_int8 = 6; + int32 data_int16 = 7; + int32 data_int32 = 8; }; } @@ -95,4 +210,4 @@ message AttributeWrite { service Attributes { rpc Write(AttributeWrite) returns (pw.protobuf.Empty){} rpc Read(AttributeMetadata) returns (AttributeData){} -} \ No newline at end of file +} diff --git a/examples/common/pigweed/protos/device_service.proto b/examples/common/pigweed/protos/device_service.proto index fdca9667a1daf9..1e9f3281ffb99d 100644 --- a/examples/common/pigweed/protos/device_service.proto +++ b/examples/common/pigweed/protos/device_service.proto @@ -20,7 +20,7 @@ message DeviceInfo { message FabricInfo { uint32 fabric_id = 1; - uint32 node_id = 2; + uint64 node_id = 2; } message DeviceState { diff --git a/examples/common/pigweed/rpc_console/py/BUILD.gn b/examples/common/pigweed/rpc_console/py/BUILD.gn index a9fa6b5797b58e..a7d8ec88ca63c5 100644 --- a/examples/common/pigweed/rpc_console/py/BUILD.gn +++ b/examples/common/pigweed/rpc_console/py/BUILD.gn @@ -15,8 +15,8 @@ import("//build_overrides/chip.gni") import("//build_overrides/pigweed.gni") -import("$dir_pw_build/mirror_tree.gni") import("$dir_pw_build/python.gni") +import("$dir_pw_build/python_dist.gni") import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni") pw_python_package("chip_rpc") { @@ -46,8 +46,7 @@ pw_python_package("chip_rpc") { ] } -pw_mirror_tree("chip_rpc_wheel") { - path_data_keys = [ "pw_python_package_wheels" ] - deps = [ ":chip_rpc.wheel" ] +pw_python_wheels("chip_rpc_wheel") { + packages = [ ":chip_rpc" ] directory = "$root_out_dir/chip_rpc_console_wheels" } diff --git a/examples/common/pigweed/rpc_services/Attributes.h b/examples/common/pigweed/rpc_services/Attributes.h index 58dd977adf3afa..93b26f809dd543 100644 --- a/examples/common/pigweed/rpc_services/Attributes.h +++ b/examples/common/pigweed/rpc_services/Attributes.h @@ -32,7 +32,7 @@ namespace rpc { class Attributes : public generated::Attributes { public: - ::pw::Status Write(ServerContext &, const chip_rpc_AttributeWrite & request, pw_protobuf_Empty & response) + ::pw::Status Write(const chip_rpc_AttributeWrite & request, pw_protobuf_Empty & response) { const void * data; switch (request.data.which_data) @@ -49,6 +49,15 @@ class Attributes : public generated::Attributes case chip_rpc_AttributeData_data_uint32_tag: data = &request.data.data.data_uint32; break; + case chip_rpc_AttributeData_data_int8_tag: + data = &request.data.data.data_int8; + break; + case chip_rpc_AttributeData_data_int16_tag: + data = &request.data.data.data_int16; + break; + case chip_rpc_AttributeData_data_int32_tag: + data = &request.data.data.data_int32; + break; case chip_rpc_AttributeData_data_bytes_tag: data = &request.data.data.data_bytes; break; @@ -61,7 +70,7 @@ class Attributes : public generated::Attributes return pw::OkStatus(); } - ::pw::Status Read(ServerContext &, const chip_rpc_AttributeMetadata & request, chip_rpc_AttributeData & response) + ::pw::Status Read(const chip_rpc_AttributeMetadata & request, chip_rpc_AttributeData & response) { void * data; size_t size = 0; @@ -108,9 +117,21 @@ class Attributes : public generated::Attributes case chip_rpc_AttributeType_ZCL_INT56U_ATTRIBUTE_TYPE: case chip_rpc_AttributeType_ZCL_INT64U_ATTRIBUTE_TYPE: case chip_rpc_AttributeType_ZCL_INT8S_ATTRIBUTE_TYPE: + data = &response.data.data_int8; + size = sizeof(response.data.data_int8); + response.which_data = chip_rpc_AttributeData_data_int8_tag; + break; case chip_rpc_AttributeType_ZCL_INT16S_ATTRIBUTE_TYPE: + data = &response.data.data_int16; + size = sizeof(response.data.data_int16); + response.which_data = chip_rpc_AttributeData_data_int16_tag; + break; case chip_rpc_AttributeType_ZCL_INT24S_ATTRIBUTE_TYPE: case chip_rpc_AttributeType_ZCL_INT32S_ATTRIBUTE_TYPE: + data = &response.data.data_int32; + size = sizeof(response.data.data_int32); + response.which_data = chip_rpc_AttributeData_data_int32_tag; + break; case chip_rpc_AttributeType_ZCL_INT40S_ATTRIBUTE_TYPE: case chip_rpc_AttributeType_ZCL_INT48S_ATTRIBUTE_TYPE: case chip_rpc_AttributeType_ZCL_INT56S_ATTRIBUTE_TYPE: diff --git a/examples/common/pigweed/rpc_services/Button.h b/examples/common/pigweed/rpc_services/Button.h index 87531e2035cb73..924783a5d6f86c 100644 --- a/examples/common/pigweed/rpc_services/Button.h +++ b/examples/common/pigweed/rpc_services/Button.h @@ -28,7 +28,7 @@ class Button : public generated::Button