Apply Upstream code (2021-03-17)
authorJihoon Jung <jh8801.jung@samsung.com>
Wed, 17 Mar 2021 03:31:05 +0000 (12:31 +0900)
committer정지훈/Tizen Platform Lab(SR)/Staff Engineer/삼성전자 <jh8801.jung@samsung.com>
Wed, 17 Mar 2021 05:38:14 +0000 (14:38 +0900)
Signed-off-by: Jihoon Jung <jh8801.jung@samsung.com>
194 files changed:
docs/BUILDING.md
docs/dots/Rendezvous/RendezvousSessionGeneral.dot
docs/dots/Rendezvous/RendezvousSessionInit.dot
docs/guides/linux_thread_connectivity.md [new file with mode: 0644]
docs/guides/nxp_k32w_android_commissioning.md
docs/guides/openthread_rcp_nrf_dongle.md [new file with mode: 0644]
docs/images/linux_thread_connectivity.svg [new file with mode: 0644]
examples/all-clusters-app/all-clusters-common/BUILD.gn
examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
examples/all-clusters-app/all-clusters-common/gen/CHIPClustersObjc.h
examples/all-clusters-app/all-clusters-common/gen/CHIPClustersObjc.mm
examples/all-clusters-app/all-clusters-common/gen/IMClusterCommandHandler.cpp
examples/all-clusters-app/all-clusters-common/gen/attribute-id.h
examples/all-clusters-app/all-clusters-common/gen/call-command-handler.cpp
examples/all-clusters-app/all-clusters-common/gen/callback-stub.cpp
examples/all-clusters-app/all-clusters-common/gen/callback.h
examples/all-clusters-app/all-clusters-common/gen/client-command-macro.h
examples/all-clusters-app/all-clusters-common/gen/cluster-id.h
examples/all-clusters-app/all-clusters-common/gen/command-id.h
examples/all-clusters-app/all-clusters-common/gen/endpoint_config.h
examples/all-clusters-app/all-clusters-common/gen/gen_config.h
examples/all-clusters-app/all-clusters-common/gen/print-cluster.h
examples/all-clusters-app/esp32/main/component.mk
examples/bridge-app/bridge-common/BUILD.gn
examples/bridge-app/bridge-common/bridge-app.zap
examples/bridge-app/bridge-common/gen/CHIPClustersObjc.h
examples/bridge-app/bridge-common/gen/CHIPClustersObjc.mm
examples/bridge-app/bridge-common/gen/IMClusterCommandHandler.cpp
examples/bridge-app/bridge-common/gen/attribute-id.h
examples/bridge-app/bridge-common/gen/call-command-handler.cpp
examples/bridge-app/bridge-common/gen/callback-stub.cpp
examples/bridge-app/bridge-common/gen/callback.h
examples/bridge-app/bridge-common/gen/client-command-macro.h
examples/bridge-app/bridge-common/gen/cluster-id.h
examples/bridge-app/bridge-common/gen/command-id.h
examples/bridge-app/bridge-common/gen/endpoint_config.h
examples/bridge-app/bridge-common/gen/gen_config.h
examples/bridge-app/bridge-common/gen/print-cluster.h
examples/chip-tool/config/PersistentStorage.cpp
examples/chip-tool/config/PersistentStorage.h
examples/chip-tool/gen/CHIPClustersObjc.mm
examples/chip-tool/gen/attribute-id.h
examples/chip-tool/gen/client-command-macro.h
examples/chip-tool/gen/cluster-id.h
examples/chip-tool/gen/command-id.h
examples/chip-tool/gen/print-cluster.h
examples/lighting-app/efr32/src/AppTask.cpp
examples/lighting-app/k32w/.gn [new file with mode: 0644]
examples/lighting-app/k32w/BUILD.gn [new file with mode: 0644]
examples/lighting-app/k32w/README.md [new file with mode: 0644]
examples/lighting-app/k32w/args.gni [new file with mode: 0644]
examples/lighting-app/k32w/build_overrides [new symlink]
examples/lighting-app/k32w/data.bin [new file with mode: 0644]
examples/lighting-app/k32w/main/AppTask.cpp [new file with mode: 0644]
examples/lighting-app/k32w/main/LightingManager.cpp [new file with mode: 0644]
examples/lighting-app/k32w/main/ZclCallbacks.cpp [new file with mode: 0644]
examples/lighting-app/k32w/main/include/AppEvent.h [new file with mode: 0644]
examples/lighting-app/k32w/main/include/AppTask.h [new file with mode: 0644]
examples/lighting-app/k32w/main/include/LightingManager.h [new file with mode: 0644]
examples/lighting-app/k32w/main/include/app_config.h [new file with mode: 0644]
examples/lighting-app/k32w/main/main.cpp [new file with mode: 0644]
examples/lighting-app/k32w/third_party/connectedhomeip [new symlink]
examples/lighting-app/lighting-common/gen/CHIPClustersObjc.mm
examples/lighting-app/lighting-common/gen/attribute-id.h
examples/lighting-app/lighting-common/gen/client-command-macro.h
examples/lighting-app/lighting-common/gen/cluster-id.h
examples/lighting-app/lighting-common/gen/command-id.h
examples/lighting-app/lighting-common/gen/endpoint_config.h
examples/lighting-app/lighting-common/gen/print-cluster.h
examples/lighting-app/lighting-common/lighting-app.zap
examples/lock-app/efr32/src/AppTask.cpp
examples/lock-app/k32w/BUILD.gn
examples/lock-app/k32w/main/AppTask.cpp
examples/lock-app/lock-common/BUILD.gn
examples/lock-app/lock-common/gen/CHIPClustersObjc.h
examples/lock-app/lock-common/gen/CHIPClustersObjc.mm
examples/lock-app/lock-common/gen/IMClusterCommandHandler.cpp
examples/lock-app/lock-common/gen/attribute-id.h
examples/lock-app/lock-common/gen/call-command-handler.cpp
examples/lock-app/lock-common/gen/callback-stub.cpp
examples/lock-app/lock-common/gen/callback.h
examples/lock-app/lock-common/gen/client-command-macro.h
examples/lock-app/lock-common/gen/cluster-id.h
examples/lock-app/lock-common/gen/command-id.h
examples/lock-app/lock-common/gen/endpoint_config.h
examples/lock-app/lock-common/gen/gen_config.h
examples/lock-app/lock-common/gen/print-cluster.h
examples/lock-app/lock-common/lock-app.zap
examples/lock-app/nrfconnect/CMakeLists.txt
examples/platform/k32w/app/ldscripts/chip-k32w061-linker.ld [moved from examples/platform/k32w/app/ldscripts/chip-k32w061-lock-example.ld with 100% similarity]
examples/platform/k32w/doc/images/nxp_hw_connectivity.JPG
examples/shell/shell_common/cmd_ping.cpp
examples/temperature-measurement-app/esp32/main/component.mk
examples/temperature-measurement-app/esp32/main/gen/CHIPClustersObjc.h
examples/temperature-measurement-app/esp32/main/gen/CHIPClustersObjc.mm
examples/temperature-measurement-app/esp32/main/gen/IMClusterCommandHandler.cpp
examples/temperature-measurement-app/esp32/main/gen/attribute-id.h
examples/temperature-measurement-app/esp32/main/gen/call-command-handler.cpp
examples/temperature-measurement-app/esp32/main/gen/callback-stub.cpp
examples/temperature-measurement-app/esp32/main/gen/callback.h
examples/temperature-measurement-app/esp32/main/gen/client-command-macro.h
examples/temperature-measurement-app/esp32/main/gen/cluster-id.h
examples/temperature-measurement-app/esp32/main/gen/command-id.h
examples/temperature-measurement-app/esp32/main/gen/endpoint_config.h
examples/temperature-measurement-app/esp32/main/gen/gen_config.h
examples/temperature-measurement-app/esp32/main/gen/print-cluster.h
examples/temperature-measurement-app/esp32/main/temperature-measurement.zap
examples/tv-app/tv-common/BUILD.gn
examples/tv-app/tv-common/gen/CHIPClustersObjc.h
examples/tv-app/tv-common/gen/CHIPClustersObjc.mm
examples/tv-app/tv-common/gen/IMClusterCommandHandler.cpp
examples/tv-app/tv-common/gen/attribute-id.h
examples/tv-app/tv-common/gen/call-command-handler.cpp
examples/tv-app/tv-common/gen/callback-stub.cpp
examples/tv-app/tv-common/gen/callback.h
examples/tv-app/tv-common/gen/client-command-macro.h
examples/tv-app/tv-common/gen/cluster-id.h
examples/tv-app/tv-common/gen/command-id.h
examples/tv-app/tv-common/gen/endpoint_config.h
examples/tv-app/tv-common/gen/gen_config.h
examples/tv-app/tv-common/gen/print-cluster.h
examples/tv-app/tv-common/tv-app.zap
integrations/docker/images/chip-build-k32w/Dockerfile [new file with mode: 0644]
integrations/docker/images/chip-build-k32w/build.sh [new symlink]
integrations/docker/images/chip-build-k32w/run.sh [new symlink]
integrations/docker/images/chip-build-k32w/version [new symlink]
scripts/setup/linux/install_packages.sh
src/app/chip-zcl-zpro-codec-api.h
src/app/clusters/network-commissioning/network-commissioning.cpp
src/app/encoder.cpp
src/app/server/RendezvousServer.cpp
src/app/server/Server.cpp
src/app/zap-templates/app-templates.json
src/app/zap-templates/templates/app/CHIPClustersObjc-src.zapt [moved from src/app/zap-templates/templates/chip/CHIPClustersObjc-src.zapt with 94% similarity]
src/app/zap-templates/templates/app/CHIPClustersObjc.zapt [moved from src/app/zap-templates/templates/chip/CHIPClustersObjc.zapt with 100% similarity]
src/app/zap-templates/zcl/commissioning.xml
src/controller/BUILD.gn
src/controller/CHIPClusters.h
src/controller/CHIPDeviceController.cpp
src/controller/CHIPDeviceController.h
src/controller/CHIPDeviceController_deprecated.cpp [deleted file]
src/controller/CHIPDeviceController_deprecated.h [deleted file]
src/controller/controller-clusters.zap
src/controller/java/AndroidDeviceControllerWrapper.cpp
src/controller/java/AndroidDeviceControllerWrapper.h
src/controller/python/BUILD.gn
src/controller/python/ChipDeviceController-StorageDelegate.cpp
src/controller/python/ChipDeviceController-StorageDelegate.h
src/controller/python/README.md
src/controller/python/chip/internal/CommissionerImpl.cpp
src/darwin/Framework/CHIP.xcodeproj/project.pbxproj
src/darwin/Framework/CHIP/CHIPDeviceController.mm
src/darwin/Framework/CHIP/CHIPPersistentStorageDelegateBridge.h
src/darwin/Framework/CHIP/CHIPPersistentStorageDelegateBridge.mm
src/darwin/Framework/CHIP/gen/CHIPClustersObjc.mm
src/darwin/Framework/CHIP/gen/attribute-id.h
src/darwin/Framework/CHIP/gen/client-command-macro.h
src/darwin/Framework/CHIP/gen/cluster-id.h
src/darwin/Framework/CHIP/gen/command-id.h
src/darwin/Framework/CHIP/gen/print-cluster.h
src/include/platform/ConnectivityManager.h
src/include/platform/ThreadStackManager.h
src/include/platform/internal/GenericNetworkProvisioningServerImpl.cpp [deleted file]
src/include/platform/internal/GenericNetworkProvisioningServerImpl.h [deleted file]
src/include/platform/internal/NetworkProvisioningServer.h [deleted file]
src/inet/UDPEndPoint.cpp
src/lib/core/CHIPPersistentStorageDelegate.h
src/messaging/ExchangeMgr.cpp
src/platform/BUILD.gn
src/platform/EFR32/BLEManagerImpl.h
src/platform/EFR32/ConfigurationManagerImpl.h
src/platform/EFR32/NetworkProvisioningServerImpl.cpp [deleted file]
src/platform/EFR32/NetworkProvisioningServerImpl.h [deleted file]
src/platform/EFR32/efr32-chip-mbedtls-config.h
src/platform/EFR32/freertos_bluetooth.c
src/platform/ESP32/BLEManagerImpl.h
src/platform/ESP32/ConfigurationManagerImpl.h
src/platform/ESP32/ConnectivityManagerImpl.h
src/platform/ESP32/NetworkProvisioningServerImpl.cpp [deleted file]
src/platform/ESP32/NetworkProvisioningServerImpl.h [deleted file]
src/platform/K32W/BLEManagerImpl.h
src/platform/K32W/ConfigurationManagerImpl.h
src/platform/K32W/NetworkProvisioningServerImpl.cpp [deleted file]
src/platform/K32W/NetworkProvisioningServerImpl.h [deleted file]
src/platform/Linux/bluez/Helper.cpp
src/platform/qpg6100/BLEManagerImpl.h
src/system/SystemPacketBuffer.cpp
src/system/SystemPacketBuffer.h
src/system/tests/TestSystemPacketBuffer.cpp
src/transport/AdminPairingTable.cpp
src/transport/SecureSessionMgr.cpp
src/transport/SecureSessionMgr.h
src/transport/StorablePeerConnection.cpp
src/transport/raw/MessageHeader.h

index f44a18f..20fc977 100644 (file)
@@ -86,6 +86,38 @@ sudo apt-get install pi-bluetooth
 
 You need to reboot your RPi after install `pi-bluetooth`.
 
+By default, wpa_supplicant is not allowed to update (overwrite) configuration,
+if you want chip app to be able to store the configuration changes permanently,
+we need to make the following changes.
+
+1. Edit the dbus-fi.w1.wpa_supplicant1.service file to use configuration file
+   instead.
+
+```
+sudo nano /etc/systemd/system/dbus-fi.w1.wpa_supplicant1.service
+```
+
+Change the wpa_supplicant start parameters to:
+
+```
+ExecStart=/sbin/wpa_supplicant -u -s -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
+```
+
+2. Add the wpa-supplicant configuration file
+
+```
+sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
+```
+
+And add the following content to the file:
+
+```
+ctrl_interface=DIR=/run/wpa_supplicant
+update_config=1
+```
+
+Finally, reboot your RPi.
+
 ### Build Preparation
 
 Before running any other build command, the `scripts/activate.sh` environment
index d3b1145..8578363 100644 (file)
@@ -6,7 +6,7 @@ digraph RendezvousSession
   subgraph cluster_controller {
     label=<<b>Controller</b>>
 
-    ChipDeviceController [shape=record label=<{ChipDeviceController|<font point-size="11">RendezvousSessionDelegate</font>}>, URL="@ref chip::DeviceController::ChipDeviceController"]
+    DeviceCommissioner [shape=record label=<{DeviceCommissioner|<font point-size="11">RendezvousSessionDelegate</font>}>, URL="@ref chip::Controller::DeviceCommissioner"]
   }
 
   # This section represents device-only elements
@@ -29,9 +29,9 @@ digraph RendezvousSession
   # Main relationships
   #############################
   RendezvousParameters [shape=ellipse, URL="@ref chip::RendezvousParameters"]
-  RendezvousParameters -> { ChipDeviceController, RendezvousDeviceDelegate} [arrowhead=none]
+  RendezvousParameters -> { DeviceCommissioner, RendezvousDeviceDelegate} [arrowhead=none]
 
-  {ChipDeviceController, RendezvousDeviceDelegate} -> RendezvousSession
+  {DeviceCommissioner, RendezvousDeviceDelegate} -> RendezvousSession
   RendezvousSession -> TransportBle
   RendezvousSession -> TransportInet [style=dashed, color=gray]
 }
index 0751ef5..79983ce 100644 (file)
@@ -7,7 +7,7 @@ digraph RendezvousSession
     label=<<b>Controller</b>>
     node [fillcolor="white:gray", gradientangle=90]
 
-    ChipDeviceController [shape=record label=<{ChipDeviceController|<font point-size="11">RendezvousSessionDelegate</font>}>, URL="@ref chip::DeviceController::ChipDeviceController"]
+    DeviceCommissioner [shape=record label=<{DeviceCommissioner|<font point-size="11">RendezvousSessionDelegate</font>}>, URL="@ref chip::Controller::DeviceCommissioner"]
   }
 
   # This section represents device-only elements
@@ -66,7 +66,7 @@ digraph RendezvousSession
   #############################
   # Main relationships
   #############################
-  {ChipDeviceController, RendezvousDeviceDelegate} -> RendezvousSession
+  {DeviceCommissioner, RendezvousDeviceDelegate} -> RendezvousSession
 
   RendezvousSession -> HasDiscriminator
 
diff --git a/docs/guides/linux_thread_connectivity.md b/docs/guides/linux_thread_connectivity.md
new file mode 100644 (file)
index 0000000..35ca8de
--- /dev/null
@@ -0,0 +1,122 @@
+# Configuring Thread network on a Linux machine
+
+You can use a Project CHIP controller such as
+[Python CHIP Controller](../../src/controller/python/README.md) to control
+Thread devices enabled for Project CHIP from a Linux host.
+
+For this purpose, you must equip the host with a Thread radio device, create a
+new Thread network, and ensure that packets addressed to devices within the
+network are routed through the radio device.
+
+<hr>
+
+-   [Overview](#overview)
+-   [Requirements](#requirements)
+-   [Configuration](#configuration)
+-   [Preparing OpenThread Radio Co-Processor device](#preparing-openthread-radio-co-processor)
+-   [Configuring OpenThread Border Router](#configuring-openthread-border-router)
+-   [Testing](#testing)
+
+<hr>
+
+## Overview
+
+The following figure shows the setup created as a result of configuring Thread
+network on a Linux machine.
+
+![linux_thread_connectivity](../images/linux_thread_connectivity.svg)
+
+In this setup, the connectivity between Python CHIP Controller and Thread
+devices is ensured in the following way:
+
+-   CHIP messages generated by the Project CHIP controller are routed through a
+    virtual network interface **otbr0** to
+    [OpenThread Border Router container](https://openthread.io/guides/border-router/docker)
+    in Docker.
+-   The OpenThread Border Router container uses a device with the
+    [OpenThread Radio Co-Processor](https://openthread.io/platforms/co-processor)
+    firmware to transmit Project CHIP messages to the Thread network.
+-   CHIP-enabled Thread devices connected to the same Thread network receive and
+    consume Project CHIP messages.
+
+<hr>
+
+## Requirements
+
+You need the following hardware and software for this configuration:
+
+-   OpenThread Radio Co-Processor device (for example,
+    [nRF52840 Dongle](https://www.nordicsemi.com/Software-and-tools/Development-Kits/nRF52840-Dongle))
+-   Linux machine with Ubuntu v20.04 or later
+
+<hr>
+
+## Configuration
+
+The configuration process is composed of the following steps:
+
+-   Preparing OpenThread Radio Co-Processor (RCP) device
+-   Configuring OpenThread Border Router container in Docker
+
+### Configuring OpenThread Radio Co-Processor
+
+Read
+[Configuring OpenThread Radio Co-processor on nRF52840 Dongle](openthread_rcp_nrf_dongle.md)
+to learn how to configure Nordic Semiconductor's
+[nRF52840 Dongle](https://www.nordicsemi.com/Software-and-tools/Development-Kits/nRF52840-Dongle)
+as OpenThread Radio Co-Processor.
+
+You can replace the nRF52840 Dongle with a variety of development boards from
+different vendors. If you are using a Raspberry Pi as your testing platform, you
+can execute this step on a more powerful Linux machine to shorten the firmware
+build time.
+
+### Configuring OpenThread Border Router
+
+To configure OpenThread Border Router, complete the following steps:
+
+1.  Install Docker daemon:
+
+        $ sudo apt update && sudo apt install docker.io
+
+2.  Start the Docker daemon:
+
+        $ sudo systemctl start docker
+
+3.  Create an IPv6 network for the OpenThread Border Router container in Docker:
+
+        $ sudo docker network create --ipv6 --subnet fd11:db8:1::/64 -o com.docker.network.bridge.name=otbr0 otbr
+
+4.  Start the OpenThread Border Router container using the following command (in
+    the last line, replace _/dev/ttyACM0_ with the device node name of the
+    OpenThread Radio Co-processor):
+
+        $ sudo docker run -it --rm --privileged --network otbr -p 8080:80 -e NAT64=0 -e DNS64=0 \
+                --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" \
+                --volume /dev/ttyACM0:/dev/radio openthread/otbr --radio-url spinel+hdlc+uart:///dev/radio
+
+5.  Open the `http://localhost:8080/` address in a web browser. If you are using
+    a Raspberry Pi without a screen, but you have a different device in the same
+    network, you can start a web browser on that device and use the address of
+    the Raspberry Pi instead of `localhost`.
+6.  Click **Form** in the menu to the left. The network forming creator window
+    appears.
+7.  Make sure that the On-Mesh Prefix is set to `fd11:22::`. This value is used
+    later to configure the IPv6 packet routing.
+8.  Click the **Form** button at the bottom of the window to form a new Thread
+    network using the default settings.
+9.  To ensure that packets addressed to devices in the Thread network are routed
+    through the OpenThread Border Router container in Docker, run the following
+    command with the On-Mesh Prefix that you set earlier:
+
+        $ sudo ip -6 route add fd11:22::/64 dev otbr0 via fd11:db8:1::2
+
+<hr>
+
+## Testing
+
+After Open Thread Border Router has been configured, complete the steps
+described in the
+[Python CHIP Controller README](../../src/controller/python/README.md) to
+commission a Thread device into the network and control it using the Project
+CHIP protocol.
index d63a6a4..6cad0ef 100644 (file)
@@ -3,8 +3,8 @@
 This article describes how to use
 [CHIPTool](../../src/android/CHIPTool/README.md) for Android smartphones to
 commission an NXP K32W061 DK6 running
-[NXP K32W Lock Example Application](../../examples/lock-app/k32w/README.md) onto
-a CHIP-enabled Thread network.
+[NXP K32W Lock/Light Example Application](../../examples/lock-light-app/k32w/README.md)
+onto a CHIP-enabled Thread network.
 
 <hr>
 
@@ -12,7 +12,7 @@ a CHIP-enabled Thread network.
 -   [Requirements](#requirements)
 -   [Building and programming OpenThread RCP firmware](#building-rcp-firmware)
 -   [Configuring PC as Thread Border Router](#configuring-pc)
--   [Building and programming NXP K32W Lock Example Application](#building-example)
+-   [Building and programming NXP K32W Lock/Light Example Application](#building-example)
 -   [Building and installing Android CHIPTool](#building-chiptool)
 -   [Forming a Thread network on the Border Router](#form-thread)
 -   [Preparing accessory device](#preparing-accessory)
@@ -45,7 +45,7 @@ with a spare Wi-Fi card and an
 device.
 
 The following diagram shows the connectivity between network components required
-to allow communication between devices running the CHIPTool and Lock
+to allow communication between devices running the CHIPTool and Lock/Light
 applications:
 
 ![nxp_hw_connectivity](../../examples/platform/k32w/doc/images/nxp_hw_connectivity.JPG)
@@ -306,11 +306,15 @@ To make your PC work as a Thread Border Router, complete the following tasks:
 
 <a name="building-example"></a>
 
-## Building and programming NXP K32W Lock Example Application
+## Building and programming NXP K32W Lock/Light Example Application
 
 See
 [NXP K32W Lock Example Application README](../../examples/lock-app/k32w/README.md)
-to learn how to build and program the example onto an K32W061 DK6.
+to learn how to build and program the lock example onto an K32W061 DK6.
+
+See
+[NXP K32W Light Example Application README](../../examples/lighting-app/k32w/README.md)
+to learn how to build and program the light example onto an K32W061 DK6.
 
 <hr>
 
@@ -442,10 +446,11 @@ following steps:
 
 2. Verify that the text box on the screen is not empty and contains the IPv6
    address of the accessory device.
-3. Tap the following buttons to change the lock state:
+3. Tap the following buttons to change the lock/light state:
 
-    - _ON_ and _OFF_ buttons lock and unlock the door, respectively.
-    - _TOGGLE_ changes the lock state to the opposite.
+    - _ON_ and _OFF_ buttons lock/turn on and unlock/turn off the door/light
+      bulb, respectively.
+    - _TOGGLE_ changes the lock/light state to the opposite.
 
-The _LED D3_ on the device turns on or off based on the changes of the lock
-state.
+The _LED D3_ on the device turns on or off based on the changes of the
+lock/light state.
diff --git a/docs/guides/openthread_rcp_nrf_dongle.md b/docs/guides/openthread_rcp_nrf_dongle.md
new file mode 100644 (file)
index 0000000..0324810
--- /dev/null
@@ -0,0 +1,64 @@
+# Configuring OpenThread Radio Co-processor on nRF52840 Dongle
+
+OpenThread Radio Co-processor design allows to add Thread network capabilities
+to devices that do not natively support Thread.
+
+You can build and program
+[OpenThread Radio Co-Processor](https://openthread.io/platforms/co-processor)
+(RCP) firmware onto Nordic Semiconductor's
+[nRF52840 Dongle](https://www.nordicsemi.com/Software-and-tools/Development-Kits/nRF52840-Dongle).
+Once programmed, the dongle can be used for
+[configuring Thread network on a Linux machine](linux_thread_connectivity.md).
+
+## Building and programming the RCP firmware onto an nRF52840 Dongle
+
+Run the following commands to build and program the RCP firmware onto an
+nRF52840 Dongle:
+
+1.  Clone the OpenThread repository into the current directory:
+
+        $ git clone https://github.com/openthread/openthread.git
+
+2.  Enter the _openthread_ directory:
+
+        $ cd openthread
+
+3.  Install OpenThread dependencies:
+
+        $ ./script/bootstrap
+
+4.  Set up the build environment:
+
+        $ ./bootstrap
+
+5.  Build OpenThread for the nRF52840 Dongle:
+
+         $ make -f examples/Makefile-nrf52840 BOOTLOADER=USB USB=1 THREAD_VERSION=1.2
+
+    This creates an RCP image at `output/nrf52840/bin/ot-rcp`.
+
+6.  Convert the RCP image to the `.hex` format:
+
+        $ arm-none-eabi-objcopy -O ihex output/nrf52840/bin/ot-rcp output/nrf52840/bin/ot-rcp.hex
+
+7.  Install
+    [nRF Util](https://www.nordicsemi.com/Software-and-tools/Development-Tools/nRF-Util):
+
+        $ python3 -m pip install -U nrfutil
+
+8.  Generate the RCP firmware package:
+
+        $ nrfutil pkg generate --hw-version 52 --sd-req=0x00 \
+            --application output/nrf52840/bin/ot-rcp.hex \
+            --application-version 1 output/nrf52840/bin/ot-rcp.zip
+
+9.  Connect the nRF52840 Dongle to the USB port.
+
+10. Press the **Reset** button on the dongle to put it into the DFU mode. Red
+    LED on the dongle starts blinking.
+
+11. To install the RCP firmware package onto the dongle, run the following
+    command, with _/dev/ttyACM0_ replaced with the device node name of your
+    nRF52840 Dongle:
+
+        $ nrfutil dfu usb-serial -pkg output/nrf52840/bin/ot-rcp.zip -p /dev/ttyACM0
diff --git a/docs/images/linux_thread_connectivity.svg b/docs/images/linux_thread_connectivity.svg
new file mode 100644 (file)
index 0000000..5c354da
--- /dev/null
@@ -0,0 +1,312 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generated by Microsoft Visio, SVG Export linux_thread_connectivity.svg Drawing -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="4.23943in"
+   height="5.23793in"
+   viewBox="0 0 305.239 377.131"
+   xml:space="preserve"
+   color-interpolation-filters="sRGB"
+   class="st10"
+   version="1.1"
+   id="svg105"
+   sodipodi:docname="linux_thread_connectivity.svg"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"><metadata
+   id="metadata109"><rdf:RDF><cc:Work
+       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+   pagecolor="#ffffff"
+   bordercolor="#666666"
+   borderopacity="1"
+   objecttolerance="10"
+   gridtolerance="10"
+   guidetolerance="10"
+   inkscape:pageopacity="0"
+   inkscape:pageshadow="2"
+   inkscape:window-width="1920"
+   inkscape:window-height="1163"
+   id="namedview107"
+   showgrid="false"
+   inkscape:zoom="1.3274742"
+   inkscape:cx="247.77132"
+   inkscape:cy="268.19765"
+   inkscape:window-x="0"
+   inkscape:window-y="0"
+   inkscape:window-maximized="1"
+   inkscape:current-layer="g103" />
+       <style
+   type="text/css"
+   id="style2">
+       <![CDATA[
+               .st1 {fill:#768692;stroke:none;stroke-width:1}
+               .st2 {fill:#ffffff;font-family:Gotham Light;font-size:1.00001em}
+               .st3 {fill:#d9e1e2;stroke:none;stroke-width:1}
+               .st4 {fill:#333f48;font-family:Calibri;font-size:1.00001em}
+               .st5 {font-size:1em}
+               .st6 {marker-end:url(#mrkr13-19);stroke:#0033a0;stroke-linecap:butt;stroke-width:1}
+               .st7 {fill:#0033a0;fill-opacity:1;stroke:#0033a0;stroke-opacity:1;stroke-width:0.28409090909091}
+               .st8 {fill:#ffffff;stroke:none;stroke-linecap:butt;stroke-width:7.2}
+               .st9 {fill:#0033a0;font-family:Calibri;font-size:1.00001em}
+               .st10 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+       ]]>
+       </style>
+
+       <defs
+   id="Markers">
+               <g
+   id="lend13">
+                       <path
+   d="M 3 1 L 0 0 L 3 -1 L 3 1 "
+   style="stroke:none"
+   id="path4" />
+               </g>
+               <marker
+   id="mrkr13-19"
+   class="st7"
+   refX="-10.56"
+   orient="auto"
+   markerUnits="strokeWidth"
+   overflow="visible">
+                       <use
+   xlink:href="#lend13"
+   transform="scale(-3.52,-3.52) "
+   id="use7" />
+               </marker>
+       </defs>
+       <g
+   id="g103">
+               <title
+   id="title11">Drawing</title>
+               <g
+   id="shape6-1"
+   transform="translate(19,-143.724)">
+                       <title
+   id="title13">Nordic Middle Grey</title>
+                       <desc
+   id="desc15">Linux machine (Raspberry Pi or other)</desc>
+                       <rect
+   x="0"
+   y="162.724"
+   width="267.239"
+   height="214.407"
+   class="st1"
+   id="rect17" />
+                       <text
+   x="20.52"
+   y="177.52"
+   class="st2"
+   id="text19">Linux machine (Raspberry Pi or other)</text>
+               </g>
+               <g
+   id="shape7-4"
+   transform="translate(32.1469,-293.961)">
+                       <title
+   id="title22">Nordic Light Grey</title>
+                       <desc
+   id="desc24">Controller (Python CHIP Controller)</desc>
+                       <rect
+   x="0"
+   y="339.126"
+   width="240.945"
+   height="38.0053"
+   class="st3"
+   id="rect26" />
+                       <text
+   x="121.36"
+   y="354.53"
+   class="st4"
+   id="text30"
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.00000191px;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#333f48"><tspan
+     sodipodi:role="line"
+     id="tspan111"
+     x="121.36"
+     y="354.53">Controller</tspan><tspan
+     sodipodi:role="line"
+     id="tspan113"
+     x="121.36"
+     y="369.53">(Python CHIP Controller)</tspan></text>
+               </g>
+               <g
+   id="shape8-8"
+   transform="translate(32.1469,-227.609)">
+                       <title
+   id="title33">Nordic Light Grey.8</title>
+                       <desc
+   id="desc35">Virtual network interface (otbr0)</desc>
+                       <rect
+   x="0"
+   y="339.126"
+   width="240.945"
+   height="38.0053"
+   class="st3"
+   id="rect37" />
+                       <text
+   x="27.259998"
+   y="361.73001"
+   class="st4"
+   id="text39"
+   style="font-size:12.00012016px;font-family:Calibri;fill:#333f48">Virtual network interface (otbr0)</text>
+               </g>
+               <g
+   id="shape9-11"
+   transform="translate(32.1469,-160.732)">
+                       <title
+   id="title42">Nordic Light Grey.9</title>
+                       <desc
+   id="desc44">OpenThread Border Router Docker image</desc>
+                       <rect
+   x="0"
+   y="339.126"
+   width="240.945"
+   height="38.0053"
+   class="st3"
+   id="rect46" />
+                       <text
+   x="123.24924"
+   y="345.42401"
+   class="st4"
+   id="text48"
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.00000165px;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr;text-anchor:middle;fill:#333f48;stroke-width:0.97102857;"
+   transform="scale(0.97102858,1.0298358)"><tspan
+     sodipodi:role="line"
+     id="tspan115"
+     x="123.24924"
+     y="345.42401">OpenThread Border Router</tspan><tspan
+     sodipodi:role="line"
+     id="tspan117"
+     x="123.24924"
+     y="359.98901">Docker container</tspan></text>
+               </g>
+               <g
+   id="shape10-14"
+   transform="translate(145.533,-293.961)">
+                       <title
+   id="title51">Dynamic connector</title>
+                       <path
+   d="M7.09 377.13 L7.09 394.92"
+   class="st6"
+   id="path53" />
+               </g>
+               <g
+   id="shape11-20"
+   transform="translate(145.533,-227.609)">
+                       <title
+   id="title56">Dynamic connector.11</title>
+                       <path
+   d="M7.09 377.13 L7.09 395.44"
+   class="st6"
+   id="path58" />
+               </g>
+               <g
+   id="shape12-25"
+   transform="translate(32.1469,-85.0367)">
+                       <title
+   id="title61">Nordic Light Grey.12</title>
+                       <desc
+   id="desc63">OpenThread Radio Co-Processor (on nRF52840 Dongle or other)</desc>
+                       <rect
+   x="0"
+   y="339.126"
+   width="240.945"
+   height="38.0053"
+   class="st3"
+   id="rect65" />
+                       <text
+   x="23.459999"
+   y="354.53"
+   class="st4"
+   id="text69"
+   style="font-size:12.00012016px;font-family:Calibri;fill:#333f48">OpenThread Radio Co-Processor <tspan
+   x="26.869999"
+   dy="14.400145"
+   class="st5"
+   id="tspan67"
+   style="font-size:12.00012016px">(on nRF52840 Dongle or other)</tspan></text>
+               </g>
+               <g
+   id="shape13-29"
+   transform="translate(32.1469,-19)">
+                       <title
+   id="title72">Nordic Light Grey.13</title>
+                       <desc
+   id="desc74">Thread device enabled for Project CHIP</desc>
+                       <rect
+   x="0"
+   y="339.126"
+   width="240.945"
+   height="38.0053"
+   class="st3"
+   id="rect76" />
+                       <text
+   x="121.13"
+   y="354.23001"
+   class="st4"
+   id="text78"
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.00000191px;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#333f48"><tspan
+     sodipodi:role="line"
+     id="tspan119"
+     x="121.13"
+     y="354.23001">Thread device enabled</tspan><tspan
+     sodipodi:role="line"
+     id="tspan121"
+     x="121.13"
+     y="369.23001">for Project CHIP</tspan></text>
+               </g>
+               <g
+   id="shape14-32"
+   transform="translate(145.533,-85.0367)">
+                       <title
+   id="title81">Dynamic connector.14</title>
+                       <desc
+   id="desc83">Thread</desc>
+                       <path
+   d="M7.09 377.13 L7.09 394.6"
+   class="st6"
+   id="path85" />
+                       <rect
+   x="18.4487"
+   y="383.947"
+   width="34.3597"
+   height="14.4001"
+   class="st8"
+   id="rect87" />
+                       <text
+   x="18.45"
+   y="394.75"
+   class="st9"
+   id="text89">Thread</text>
+               </g>
+               <g
+   id="shape15-39"
+   transform="translate(145.533,-160.732)">
+                       <title
+   id="title92">Dynamic connector.15</title>
+                       <desc
+   id="desc94">USB</desc>
+                       <path
+   d="M7.09 377.13 L7.09 404.26"
+   class="st6"
+   id="path96" />
+                       <rect
+   x="17.4499"
+   y="397.28"
+   width="19.7405"
+   height="14.4001"
+   class="st8"
+   id="rect98" />
+                       <text
+   x="17.45"
+   y="408.08"
+   class="st9"
+   id="text100">USB</text>
+               </g>
+       </g>
+</svg>
\ No newline at end of file
index 0715d61..1575d1c 100644 (file)
@@ -39,6 +39,8 @@ source_set("all-clusters-common") {
     "${chip_root}/src/app/clusters/level-control/level-control.cpp",
     "${chip_root}/src/app/clusters/low-power-server/low-power-server.cpp",
     "${chip_root}/src/app/clusters/media-playback-server/media-playback-server.cpp",
+    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning-ember.cpp",
+    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning.cpp",
     "${chip_root}/src/app/clusters/on-off-server/on-off.cpp",
     "${chip_root}/src/app/clusters/scenes/scenes.cpp",
     "${chip_root}/src/app/clusters/temperature-measurement-server/temperature-measurement-server.cpp",
index 1bf6846..47fc9c8 100644 (file)
@@ -1,5 +1,5 @@
 {
-  "writeTime": "Thu Mar 11 2021 17:27:52 GMT+0100 (Central European Standard Time)",
+  "writeTime": "Fri Mar 12 2021 15:15:46 GMT+0800 (China Standard Time)",
   "featureLevel": 11,
   "creator": "zap",
   "keyValuePairs": [
           "define": "GROUPS_CLUSTER",
           "side": "client",
           "enabled": 0,
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
-          ],
           "commands": [
             {
               "name": "AddGroup",
               "incoming": 1,
               "outgoing": 1
             }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "3",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
           ]
         },
         {
           "define": "SCENES_CLUSTER",
           "side": "server",
           "enabled": 0,
-          "commands": [
-            {
-              "name": "AddSceneResponse",
-              "code": 0,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "ViewSceneResponse",
-              "code": 1,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "RemoveSceneResponse",
-              "code": 2,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "RemoveAllScenesResponse",
-              "code": 3,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "StoreSceneResponse",
-              "code": 4,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "GetSceneMembershipResponse",
-              "code": 6,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            }
-          ],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
+          ],
+          "commands": [
+            {
+              "name": "AddSceneResponse",
+              "code": 0,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "ViewSceneResponse",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveSceneResponse",
+              "code": 2,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveAllScenesResponse",
+              "code": 3,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "StoreSceneResponse",
+              "code": 4,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "GetSceneMembershipResponse",
+              "code": 6,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            }
           ]
         },
         {
           "define": "ON_OFF_CLUSTER",
           "side": "server",
           "enabled": 1,
-          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ]
+          ],
+          "commands": []
         },
         {
           "name": "Level Control",
           "define": "BARRIER_CONTROL_CLUSTER",
           "side": "client",
           "enabled": 0,
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x0001",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ],
           "commands": [
             {
               "name": "BarrierControlGoToPercent",
               "incoming": 1,
               "outgoing": 1
             }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "0x0001",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
           ]
         },
         {
           "define": "IDENTIFY_CLUSTER",
           "side": "server",
           "enabled": 1,
+          "commands": [
+            {
+              "name": "IdentifyQueryResponse",
+              "code": 0,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ],
-          "commands": [
-            {
-              "name": "IdentifyQueryResponse",
-              "code": 0,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            }
           ]
         },
         {
           "define": "SCENES_CLUSTER",
           "side": "client",
           "enabled": 0,
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "3",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ],
           "commands": [
             {
               "name": "AddScene",
               "incoming": 1,
               "outgoing": 1
             }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
           ]
         },
         {
           ]
         },
         {
+          "name": "Network Commissioning",
+          "code": 49,
+          "mfgCode": null,
+          "define": "NETWORK_COMMISSIONING_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "commands": [
+            {
+              "name": "ScanNetworks",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "AddWiFiNetwork",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "UpdateWiFiNetwork",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "AddThreadNetwork",
+              "code": 6,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "UpdateThreadNetwork",
+              "code": 8,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "RemoveNetwork",
+              "code": 10,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "EnableNetwork",
+              "code": 12,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "DisableNetwork",
+              "code": 14,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "GetLastNetworkCommissioningResult",
+              "code": 16,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "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": "Network Commissioning",
+          "code": 49,
+          "mfgCode": null,
+          "define": "NETWORK_COMMISSIONING_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "ScanNetworksResponse",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "AddWiFiNetworkResponse",
+              "code": 3,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "UpdateWiFiNetworkResponse",
+              "code": 5,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "AddThreadNetworkResponse",
+              "code": 7,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "UpdateThreadNetworkResponse",
+              "code": 9,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveNetworkResponse",
+              "code": 11,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "EnableNetworkResponse",
+              "code": 13,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "DisableNetworkResponse",
+              "code": 15,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "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": "Door Lock",
           "code": 257,
           "mfgCode": null,
index f518ac9..f82aca7 100644 (file)
@@ -530,6 +530,52 @@ NS_ASSUME_NONNULL_BEGIN
 @end
 
 /**
+ * Cluster Network Commissioning
+ *
+ */
+@interface CHIPNetworkCommissioning : CHIPCluster
+
+- (void)addThreadNetwork:(NSData *)operationalDataset
+              breadcrumb:(uint64_t)breadcrumb
+               timeoutMs:(uint32_t)timeoutMs
+       completionHandler:(ResponseHandler)completionHandler;
+- (void)addWiFiNetwork:(NSData *)ssid
+           credentials:(NSData *)credentials
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler;
+- (void)disableNetwork:(NSData *)networkID
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler;
+- (void)enableNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler;
+- (void)getLastNetworkCommissioningResult:(uint32_t)timeoutMs completionHandler:(ResponseHandler)completionHandler;
+- (void)removeNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler;
+- (void)scanNetworks:(NSData *)ssid
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler;
+- (void)updateThreadNetwork:(NSData *)operationalDataset
+                 breadcrumb:(uint64_t)breadcrumb
+                  timeoutMs:(uint32_t)timeoutMs
+          completionHandler:(ResponseHandler)completionHandler;
+- (void)updateWiFiNetwork:(NSData *)ssid
+              credentials:(NSData *)credentials
+               breadcrumb:(uint64_t)breadcrumb
+                timeoutMs:(uint32_t)timeoutMs
+        completionHandler:(ResponseHandler)completionHandler;
+
+- (void)readAttributeClusterRevision:(ResponseHandler)completionHandler;
+
+@end
+
+/**
  * Cluster On/off
  *
  */
index 48568b1..f364b2e 100644 (file)
@@ -21,7 +21,7 @@
 
 #import "CHIPDevice.h"
 #import "CHIPDevice_Internal.h"
-#import "ChipError.h"
+#import "CHIPError.h"
 #import "gen/CHIPClientCallbacks.h"
 #import "gen/CHIPClustersObjc.h"
 
@@ -292,6 +292,38 @@ private:
     bool mKeepAlive;
 };
 
+class CHIPInt64uAttributeCallbackBridge : public Callback::Callback<Int64uAttributeCallback> {
+public:
+    CHIPInt64uAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
+        : Callback::Callback<Int64uAttributeCallback>(CallbackFn, this)
+        , mHandler(handler)
+        , mQueue(queue)
+        , mKeepAlive(keepAlive)
+    {
+    }
+
+    ~CHIPInt64uAttributeCallbackBridge() {};
+
+    static void CallbackFn(void * context, uint64_t value)
+    {
+        CHIPInt64uAttributeCallbackBridge * callback = reinterpret_cast<CHIPInt64uAttributeCallbackBridge *>(context);
+        if (callback && callback->mQueue) {
+            dispatch_async(callback->mQueue, ^{
+                callback->mHandler(nil, @ { @"value" : [NSNumber numberWithUnsignedLongLong:value] });
+                if (!callback->mKeepAlive) {
+                    callback->Cancel();
+                    delete callback;
+                }
+            });
+        }
+    };
+
+private:
+    ResponseHandler mHandler;
+    dispatch_queue_t mQueue;
+    bool mKeepAlive;
+};
+
 class CHIPInt16sAttributeCallbackBridge : public Callback::Callback<Int16sAttributeCallback> {
 public:
     CHIPInt16sAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
@@ -5367,6 +5399,285 @@ private:
 
 @end
 
+@interface CHIPNetworkCommissioning ()
+@property (readonly) Controller::NetworkCommissioningCluster cppCluster;
+@end
+
+@implementation CHIPNetworkCommissioning
+
+- (Controller::ClusterBase *)getCluster
+{
+    return &_cppCluster;
+}
+
+- (void)addThreadNetwork:(NSData *)operationalDataset
+              breadcrumb:(uint64_t)breadcrumb
+               timeoutMs:(uint32_t)timeoutMs
+       completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterAddThreadNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterAddThreadNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.AddThreadNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) operationalDataset.bytes, operationalDataset.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)addWiFiNetwork:(NSData *)ssid
+           credentials:(NSData *)credentials
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterAddWiFiNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterAddWiFiNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.AddWiFiNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) ssid.bytes, ssid.length),
+        chip::ByteSpan((const uint8_t *) credentials.bytes, credentials.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)disableNetwork:(NSData *)networkID
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterDisableNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterDisableNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.DisableNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) networkID.bytes, networkID.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)enableNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterEnableNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterEnableNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.EnableNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) networkID.bytes, networkID.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)getLastNetworkCommissioningResult:(uint32_t)timeoutMs completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPDefaultSuccessCallbackBridge * onSuccess = new CHIPDefaultSuccessCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.GetLastNetworkCommissioningResult(onSuccess->Cancel(), onFailure->Cancel(), timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)removeNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterRemoveNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterRemoveNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.RemoveNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) networkID.bytes, networkID.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)scanNetworks:(NSData *)ssid
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterScanNetworksResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterScanNetworksResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.ScanNetworks(
+        onSuccess->Cancel(), onFailure->Cancel(), chip::ByteSpan((const uint8_t *) ssid.bytes, ssid.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)updateThreadNetwork:(NSData *)operationalDataset
+                 breadcrumb:(uint64_t)breadcrumb
+                  timeoutMs:(uint32_t)timeoutMs
+          completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterUpdateThreadNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterUpdateThreadNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.UpdateThreadNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) operationalDataset.bytes, operationalDataset.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)updateWiFiNetwork:(NSData *)ssid
+              credentials:(NSData *)credentials
+               breadcrumb:(uint64_t)breadcrumb
+                timeoutMs:(uint32_t)timeoutMs
+        completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterUpdateWiFiNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterUpdateWiFiNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.UpdateWiFiNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) ssid.bytes, ssid.length),
+        chip::ByteSpan((const uint8_t *) credentials.bytes, credentials.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+
+- (void)readAttributeClusterRevision:(ResponseHandler)completionHandler
+{
+    CHIPInt16uAttributeCallbackBridge * onSuccess = new CHIPInt16uAttributeCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.ReadAttributeClusterRevision(onSuccess->Cancel(), onFailure->Cancel());
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+
+@end
+
 @interface CHIPOnOff ()
 @property (readonly) Controller::OnOffCluster cppCluster;
 @end
index fd7bc57..c3a00f3 100644 (file)
@@ -2216,6 +2216,335 @@ void DispatchServerCommand(app::Command * command, CommandId commandId, Endpoint
 
 } // namespace MediaPlayback
 
+namespace NetworkCommissioning {
+
+void DispatchServerCommand(app::Command * command, CommandId commandId, EndpointId endpointId, TLV::TLVReader & dataTlv)
+{
+    {
+        switch (commandId)
+        {
+        case ZCL_ADD_THREAD_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(operationalDataset);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterAddThreadNetworkCallback(const_cast<uint8_t *>(operationalDataset), breadcrumb,
+                                                                       timeoutMs);
+            break;
+        }
+        case ZCL_ADD_WI_FI_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * ssid;
+            const uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(ssid);
+                    break;
+                case 1:
+                    TLVError = dataTlv.GetDataPtr(credentials);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 3:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(const_cast<uint8_t *>(ssid),
+                                                                     const_cast<uint8_t *>(credentials), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_DISABLE_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(networkID);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterDisableNetworkCallback(const_cast<uint8_t *>(networkID), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_ENABLE_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(networkID);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterEnableNetworkCallback(const_cast<uint8_t *>(networkID), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(timeoutMs);
+            break;
+        }
+        case ZCL_REMOVE_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * NetworkID;
+            uint64_t Breadcrumb;
+            uint32_t TimeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(NetworkID);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(Breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(TimeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterRemoveNetworkCallback(const_cast<uint8_t *>(NetworkID), Breadcrumb, TimeoutMs);
+            break;
+        }
+        case ZCL_SCAN_NETWORKS_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * ssid;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(ssid);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterScanNetworksCallback(const_cast<uint8_t *>(ssid), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(operationalDataset);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(const_cast<uint8_t *>(operationalDataset), breadcrumb,
+                                                                          timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * ssid;
+            const uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(ssid);
+                    break;
+                case 1:
+                    TLVError = dataTlv.GetDataPtr(credentials);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 3:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(const_cast<uint8_t *>(ssid),
+                                                                        const_cast<uint8_t *>(credentials), breadcrumb, timeoutMs);
+            break;
+        }
+        default: {
+            // Unrecognized command ID, error status will apply.
+            // TODO: Encode response for command not found
+            ChipLogError(Zcl, "Unknown command %" PRIx16 " for cluster %" PRIx16, commandId, ZCL_NETWORK_COMMISSIONING_CLUSTER_ID);
+            break;
+        }
+        }
+    }
+}
+
+} // namespace NetworkCommissioning
+
 namespace OnOff {
 
 void DispatchServerCommand(app::Command * command, CommandId commandId, EndpointId endpointId, TLV::TLVReader & dataTlv)
@@ -2538,6 +2867,9 @@ void DispatchSingleClusterCommand(chip::ClusterId aClusterId, chip::CommandId aC
     case ZCL_MEDIA_PLAYBACK_CLUSTER_ID:
         clusters::MediaPlayback::DispatchServerCommand(apCommandObj, aCommandId, aEndPointId, aReader);
         break;
+    case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
+        clusters::NetworkCommissioning::DispatchServerCommand(apCommandObj, aCommandId, aEndPointId, aReader);
+        break;
     case ZCL_ON_OFF_CLUSTER_ID:
         clusters::OnOff::DispatchServerCommand(apCommandObj, aCommandId, aEndPointId, aReader);
         break;
index 8c8757f..72a0198 100644 (file)
 #define ZCL_FABRIC_ID_ATTRIBUTE_ID (0x0000)
 #define ZCL_BREADCRUMB_ATTRIBUTE_ID (0x0001)
 
+// Attribute ids for cluster: Network Commissioning
+
+// Client attributes
+
+// Server attributes
+
 // Attribute ids for cluster: Shade Configuration
 
 // Client attributes
 
 // Server attributes
 
-// Attribute ids for cluster: Network Commissioning
-
-// Client attributes
-
-// Server attributes
-
 // Attribute ids for cluster: Binding
 
 // Client attributes
index f34585d..2cb3340 100644 (file)
@@ -42,6 +42,7 @@ EmberAfStatus emberAfIdentifyClusterServerCommandParse(EmberAfClusterCommand * c
 EmberAfStatus emberAfLevelControlClusterServerCommandParse(EmberAfClusterCommand * cmd);
 EmberAfStatus emberAfLowPowerClusterServerCommandParse(EmberAfClusterCommand * cmd);
 EmberAfStatus emberAfMediaPlaybackClusterServerCommandParse(EmberAfClusterCommand * cmd);
+EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd);
 EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd);
 EmberAfStatus emberAfScenesClusterServerCommandParse(EmberAfClusterCommand * cmd);
 EmberAfStatus emberAfTemperatureMeasurementClusterServerCommandParse(EmberAfClusterCommand * cmd);
@@ -128,6 +129,9 @@ EmberAfStatus emberAfClusterSpecificCommandParse(EmberAfClusterCommand * cmd)
         case ZCL_MEDIA_PLAYBACK_CLUSTER_ID:
             result = emberAfMediaPlaybackClusterServerCommandParse(cmd);
             break;
+        case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
+            result = emberAfNetworkCommissioningClusterServerCommandParse(cmd);
+            break;
         case ZCL_ON_OFF_CLUSTER_ID:
             result = emberAfOnOffClusterServerCommandParse(cmd);
             break;
@@ -1886,6 +1890,265 @@ EmberAfStatus emberAfMediaPlaybackClusterServerCommandParse(EmberAfClusterComman
     }
     return status(wasHandled, true, cmd->mfgSpecific);
 }
+EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd)
+{
+    bool wasHandled = false;
+
+    if (!cmd->mfgSpecific)
+    {
+        switch (cmd->commandId)
+        {
+        case ZCL_ADD_THREAD_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            operationalDataset = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset      = static_cast<uint16_t>(payloadOffset + emberAfStringLength(operationalDataset) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterAddThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_ADD_WI_FI_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * ssid;
+            uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            ssid          = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            credentials   = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(credentials) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_DISABLE_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            networkID     = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(networkID) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterDisableNetworkCallback(networkID, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_ENABLE_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            networkID     = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(networkID) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterEnableNetworkCallback(networkID, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(timeoutMs);
+            break;
+        }
+        case ZCL_REMOVE_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * NetworkID;
+            uint64_t Breadcrumb;
+            uint32_t TimeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            NetworkID     = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(NetworkID) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            Breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            TimeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterRemoveNetworkCallback(NetworkID, Breadcrumb, TimeoutMs);
+            break;
+        }
+        case ZCL_SCAN_NETWORKS_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * ssid;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            ssid          = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterScanNetworksCallback(ssid, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            operationalDataset = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset      = static_cast<uint16_t>(payloadOffset + emberAfStringLength(operationalDataset) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * ssid;
+            uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            ssid          = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            credentials   = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(credentials) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
+            break;
+        }
+        default: {
+            // Unrecognized command ID, error status will apply.
+            break;
+        }
+        }
+    }
+    return status(wasHandled, true, cmd->mfgSpecific);
+}
 EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd)
 {
     bool wasHandled = false;
index b50c4f2..f4108c8 100644 (file)
@@ -69,6 +69,9 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId)
     case ZCL_MEDIA_PLAYBACK_CLUSTER_ID:
         emberAfMediaPlaybackClusterInitCallback(endpoint);
         break;
+    case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
+        emberAfNetworkCommissioningClusterInitCallback(endpoint);
+        break;
     case ZCL_ON_OFF_CLUSTER_ID:
         emberAfOnOffClusterInitCallback(endpoint);
         break;
@@ -154,6 +157,11 @@ void __attribute__((weak)) emberAfMediaPlaybackClusterInitCallback(EndpointId en
     // To prevent warning
     (void) endpoint;
 }
+void __attribute__((weak)) emberAfNetworkCommissioningClusterInitCallback(EndpointId endpoint)
+{
+    // To prevent warning
+    (void) endpoint;
+}
 void __attribute__((weak)) emberAfOnOffClusterInitCallback(EndpointId endpoint)
 {
     // To prevent warning
index d585784..1167dd1 100644 (file)
@@ -149,6 +149,14 @@ void emberAfLowPowerClusterInitCallback(chip::EndpointId endpoint);
  */
 void emberAfMediaPlaybackClusterInitCallback(chip::EndpointId endpoint);
 
+/** @brief Network Commissioning Cluster Init
+ *
+ * Cluster Init
+ *
+ * @param endpoint    Endpoint that is being initialized
+ */
+void emberAfNetworkCommissioningClusterInitCallback(chip::EndpointId endpoint);
+
 /** @brief On/off Cluster Init
  *
  * Cluster Init
@@ -1157,6 +1165,77 @@ EmberAfStatus emberAfMediaPlaybackClusterServerPreAttributeChangedCallback(chip:
 void emberAfMediaPlaybackClusterServerTickCallback(chip::EndpointId endpoint);
 
 //
+// Network Commissioning Cluster server
+//
+
+/** @brief Network Commissioning Cluster Server Init
+ *
+ * Server Init
+ *
+ * @param endpoint    Endpoint that is being initialized
+ */
+void emberAfNetworkCommissioningClusterServerInitCallback(chip::EndpointId endpoint);
+
+/** @brief Network Commissioning Cluster Server Attribute Changed
+ *
+ * Server Attribute Changed
+ *
+ * @param endpoint    Endpoint that is being initialized
+ * @param attributeId Attribute that changed
+ */
+void emberAfNetworkCommissioningClusterServerAttributeChangedCallback(chip::EndpointId endpoint, chip::AttributeId attributeId);
+
+/** @brief Network Commissioning Cluster Server Manufacturer Specific Attribute Changed
+ *
+ * Server Manufacturer Specific Attribute Changed
+ *
+ * @param endpoint          Endpoint that is being initialized
+ * @param attributeId       Attribute that changed
+ * @param manufacturerCode  Manufacturer Code of the attribute that changed
+ */
+void emberAfNetworkCommissioningClusterServerManufacturerSpecificAttributeChangedCallback(chip::EndpointId endpoint,
+                                                                                          chip::AttributeId attributeId,
+                                                                                          uint16_t manufacturerCode);
+
+/** @brief Network Commissioning Cluster Server Message Sent
+ *
+ * Server Message Sent
+ *
+ * @param type               The type of message sent
+ * @param indexOrDestination The destination or address to which the message was sent
+ * @param apsFrame           The APS frame for the message
+ * @param msgLen             The length of the message
+ * @param message            The message that was sent
+ * @param status             The status of the sent message
+ */
+void emberAfNetworkCommissioningClusterServerMessageSentCallback(EmberOutgoingMessageType type, uint64_t indexOrDestination,
+                                                                 EmberApsFrame * apsFrame, uint16_t msgLen, uint8_t * message,
+                                                                 EmberStatus status);
+
+/** @brief Network Commissioning Cluster Server Pre Attribute Changed
+ *
+ * server Pre Attribute Changed
+ *
+ * @param endpoint      Endpoint that is being initialized
+ * @param attributeId   Attribute to be changed
+ * @param attributeType Attribute type
+ * @param size          Attribute size
+ * @param value         Attribute value
+ */
+EmberAfStatus emberAfNetworkCommissioningClusterServerPreAttributeChangedCallback(chip::EndpointId endpoint,
+                                                                                  chip::AttributeId attributeId,
+                                                                                  EmberAfAttributeType attributeType, uint8_t size,
+                                                                                  uint8_t * value);
+
+/** @brief Network Commissioning Cluster Server Tick
+ *
+ * server Tick
+ *
+ * @param endpoint  Endpoint that is being served
+ */
+void emberAfNetworkCommissioningClusterServerTickCallback(chip::EndpointId endpoint);
+
+//
 // On/off Cluster server
 //
 
@@ -1998,6 +2077,91 @@ bool emberAfMediaPlaybackClusterStartOverRequestCallback();
 bool emberAfMediaPlaybackClusterStopRequestCallback();
 
 /**
+ * @brief Network Commissioning Cluster AddThreadNetwork Command callback
+ * @param operationalDataset
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterAddThreadNetworkCallback(uint8_t * operationalDataset, uint64_t breadcrumb,
+                                                                uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster AddWiFiNetwork Command callback
+ * @param ssid
+ * @param credentials
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(uint8_t * ssid, uint8_t * credentials, uint64_t breadcrumb,
+                                                              uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster DisableNetwork Command callback
+ * @param networkID
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterDisableNetworkCallback(uint8_t * networkID, uint64_t breadcrumb, uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster EnableNetwork Command callback
+ * @param networkID
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterEnableNetworkCallback(uint8_t * networkID, uint64_t breadcrumb, uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster GetLastNetworkCommissioningResult Command callback
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster RemoveNetwork Command callback
+ * @param networkID
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterRemoveNetworkCallback(uint8_t * NetworkID, uint64_t Breadcrumb, uint32_t TimeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster ScanNetworks Command callback
+ * @param ssid
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterScanNetworksCallback(uint8_t * ssid, uint64_t breadcrumb, uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster UpdateThreadNetwork Command callback
+ * @param operationalDataset
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(uint8_t * operationalDataset, uint64_t breadcrumb,
+                                                                   uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster UpdateWiFiNetwork Command callback
+ * @param ssid
+ * @param credentials
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(uint8_t * ssid, uint8_t * credentials, uint64_t breadcrumb,
+                                                                 uint32_t timeoutMs);
+
+/**
  * @brief On/off Cluster Off Command callback
  */
 
index f72c96f..79d1e15 100644 (file)
                                                                                                                                    \
                                   ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
 
+/** @brief Command description for ScanNetworks
+ *
+ * Command: ScanNetworks
+ * @param ssid OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterScanNetworks(ssid, breadcrumb, timeoutMs)                                                                  \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_SCAN_NETWORKS_COMMAND_ID, "uuu", ssid, breadcrumb, timeoutMs);
+
+/** @brief Command description for ScanNetworksResponse
+ *
+ * Command: ScanNetworksResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ * @param wifiScanResults WiFiInterfaceScanResult []
+ * @param wifiScanResultsLen int
+ * @param threadScanResults ThreadInterfaceScanResult []
+ * @param threadScanResultsLen int
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterScanNetworksResponse(errorCode, debugText, wifiScanResults, wifiScanResultsLen, threadScanResults,         \
+                                             threadScanResultsLen)                                                                 \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID, "uubb", errorCode, debugText, wifiScanResults,            \
+                                  wifiScanResultsLen, threadScanResults, threadScanResultsLen);
+
+/** @brief Command description for AddWiFiNetwork
+ *
+ * Command: AddWiFiNetwork
+ * @param ssid OCTET_STRING
+ * @param credentials OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                   \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
+
+/** @brief Command description for AddWiFiNetworkResponse
+ *
+ * Command: AddWiFiNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddWiFiNetworkResponse(errorCode, debugText)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for UpdateWiFiNetwork
+ *
+ * Command: UpdateWiFiNetwork
+ * @param ssid OCTET_STRING
+ * @param credentials OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
+
+/** @brief Command description for UpdateWiFiNetworkResponse
+ *
+ * Command: UpdateWiFiNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateWiFiNetworkResponse(errorCode, debugText)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for AddThreadNetwork
+ *
+ * Command: AddThreadNetwork
+ * @param operationalDataset OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
+
+/** @brief Command description for AddThreadNetworkResponse
+ *
+ * Command: AddThreadNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddThreadNetworkResponse(errorCode, debugText)                                                             \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for UpdateThreadNetwork
+ *
+ * Command: UpdateThreadNetwork
+ * @param operationalDataset OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                             \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
+
+/** @brief Command description for UpdateThreadNetworkResponse
+ *
+ * Command: UpdateThreadNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateThreadNetworkResponse(errorCode, debugText)                                                          \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for RemoveNetwork
+ *
+ * Command: RemoveNetwork
+ * @param NetworkID OCTET_STRING
+ * @param Breadcrumb INT64U
+ * @param TimeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterRemoveNetwork(NetworkID, Breadcrumb, TimeoutMs)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_REMOVE_NETWORK_COMMAND_ID, "uuu", NetworkID, Breadcrumb, TimeoutMs);
+
+/** @brief Command description for RemoveNetworkResponse
+ *
+ * Command: RemoveNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterRemoveNetworkResponse(errorCode, debugText)                                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for EnableNetwork
+ *
+ * Command: EnableNetwork
+ * @param networkID OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterEnableNetwork(networkID, breadcrumb, timeoutMs)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ENABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
+
+/** @brief Command description for EnableNetworkResponse
+ *
+ * Command: EnableNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterEnableNetworkResponse(errorCode, debugText)                                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for DisableNetwork
+ *
+ * Command: DisableNetwork
+ * @param networkID OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterDisableNetwork(networkID, breadcrumb, timeoutMs)                                                           \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_DISABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
+
+/** @brief Command description for DisableNetworkResponse
+ *
+ * Command: DisableNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterDisableNetworkResponse(errorCode, debugText)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for GetLastNetworkCommissioningResult
+ *
+ * Command: GetLastNetworkCommissioningResult
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterGetLastNetworkCommissioningResult(timeoutMs)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID, "u", timeoutMs);
+
 /** @brief Command description for LockDoor
  *
  * Command: LockDoor
                                   ZCL_GET_ENDPOINT_LIST_REQUEST_COMMAND_ID, "uuuub", startIndex, total, startIndex, count,         \
                                   endpointInformationRecordList, endpointInformationRecordListLen);
 
-/** @brief Command description for ScanNetworks
- *
- * Command: ScanNetworks
- * @param ssid OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterScanNetworks(ssid, breadcrumb, timeoutMs)                                                                  \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_SCAN_NETWORKS_COMMAND_ID, "uuu", ssid, breadcrumb, timeoutMs);
-
-/** @brief Command description for ScanNetworksResponse
- *
- * Command: ScanNetworksResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- * @param wifiScanResults WiFiInterfaceScanResult []
- * @param wifiScanResultsLen int
- * @param threadScanResults ThreadInterfaceScanResult []
- * @param threadScanResultsLen int
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterScanNetworksResponse(errorCode, debugText, wifiScanResults, wifiScanResultsLen, threadScanResults,         \
-                                             threadScanResultsLen)                                                                 \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID, "uubb", errorCode, debugText, wifiScanResults,            \
-                                  wifiScanResultsLen, threadScanResults, threadScanResultsLen);
-
-/** @brief Command description for AddWiFiNetwork
- *
- * Command: AddWiFiNetwork
- * @param ssid OCTET_STRING
- * @param credentials OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                   \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
-
-/** @brief Command description for AddWiFiNetworkResponse
- *
- * Command: AddWiFiNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddWiFiNetworkResponse(errorCode, debugText)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for UpdateWiFiNetwork
- *
- * Command: UpdateWiFiNetwork
- * @param ssid OCTET_STRING
- * @param credentials OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
-
-/** @brief Command description for UpdateWiFiNetworkResponse
- *
- * Command: UpdateWiFiNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateWiFiNetworkResponse(errorCode, debugText)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for AddThreadNetwork
- *
- * Command: AddThreadNetwork
- * @param operationalDataset OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
-
-/** @brief Command description for AddThreadNetworkResponse
- *
- * Command: AddThreadNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddThreadNetworkResponse(errorCode, debugText)                                                             \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for UpdateThreadNetwork
- *
- * Command: UpdateThreadNetwork
- * @param operationalDataset OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                             \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
-
-/** @brief Command description for UpdateThreadNetworkResponse
- *
- * Command: UpdateThreadNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateThreadNetworkResponse(errorCode, debugText)                                                          \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for RemoveNetwork
- *
- * Command: RemoveNetwork
- * @param NetworkID OCTET_STRING
- * @param Breadcrumb INT64U
- * @param TimeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterRemoveNetwork(NetworkID, Breadcrumb, TimeoutMs)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_REMOVE_NETWORK_COMMAND_ID, "uuu", NetworkID, Breadcrumb, TimeoutMs);
-
-/** @brief Command description for RemoveNetworkResponse
- *
- * Command: RemoveNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterRemoveNetworkResponse(errorCode, debugText)                                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for EnableNetwork
- *
- * Command: EnableNetwork
- * @param networkID OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterEnableNetwork(networkID, breadcrumb, timeoutMs)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ENABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
-
-/** @brief Command description for EnableNetworkResponse
- *
- * Command: EnableNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterEnableNetworkResponse(errorCode, debugText)                                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for DisableNetwork
- *
- * Command: DisableNetwork
- * @param networkID OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterDisableNetwork(networkID, breadcrumb, timeoutMs)                                                           \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_DISABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
-
-/** @brief Command description for DisableNetworkResponse
- *
- * Command: DisableNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterDisableNetworkResponse(errorCode, debugText)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for GetLastNetworkCommissioningResult
- *
- * Command: GetLastNetworkCommissioningResult
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterGetLastNetworkCommissioningResult(timeoutMs)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID, "u", timeoutMs);
-
 /** @brief Command description for Bind
  *
  * Command: Bind
index d77da91..add8f83 100644 (file)
@@ -86,6 +86,9 @@
 // Definitions for cluster: General Commissioning
 #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030)
 
+// Definitions for cluster: Network Commissioning
+#define ZCL_NETWORK_COMMISSIONING_CLUSTER_ID (0x0031)
+
 // Definitions for cluster: Shade Configuration
 #define ZCL_SHADE_CONFIG_CLUSTER_ID (0x0100)
 
 // Definitions for cluster: ZLL Commissioning
 #define ZCL_ZLL_COMMISSIONING_CLUSTER_ID (0x1000)
 
-// Definitions for cluster: Network Commissioning
-#define ZCL_NETWORK_COMMISSIONING_CLUSTER_ID (0xAAAA)
-
 // Definitions for cluster: Binding
 #define ZCL_BINDING_CLUSTER_ID (0xF000)
 
index adc2b1c..864943b 100644 (file)
 #define ZCL_COMMISSIONING_COMPLETE_COMMAND_ID (0x06)
 #define ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID (0x07)
 
+// Commands for cluster: Network Commissioning
+#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00)
+#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01)
+#define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
+#define ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x03)
+#define ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x04)
+#define ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x05)
+#define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
+#define ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x07)
+#define ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID (0x08)
+#define ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x09)
+#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x0A)
+#define ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID (0x0B)
+#define ZCL_ENABLE_NETWORK_COMMAND_ID (0x0C)
+#define ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID (0x0D)
+#define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
+#define ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID (0x0F)
+#define ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID (0x10)
+
 // Commands for cluster: Door Lock
 #define ZCL_LOCK_DOOR_COMMAND_ID (0x00)
 #define ZCL_LOCK_DOOR_RESPONSE_COMMAND_ID (0x00)
 #define ZCL_GET_ENDPOINT_LIST_REQUEST_COMMAND_ID (0x42)
 #define ZCL_GET_ENDPOINT_LIST_RESPONSE_COMMAND_ID (0x42)
 
-// Commands for cluster: Network Commissioning
-#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00)
-#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01)
-#define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
-#define ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x03)
-#define ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x04)
-#define ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x05)
-#define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
-#define ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x07)
-#define ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID (0x08)
-#define ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x09)
-#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x0A)
-#define ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID (0x0B)
-#define ZCL_ENABLE_NETWORK_COMMAND_ID (0x0C)
-#define ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID (0x0D)
-#define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
-#define ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID (0x0F)
-#define ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID (0x10)
-
 // Commands for cluster: Binding
 #define ZCL_BIND_COMMAND_ID (0x00)
 #define ZCL_UNBIND_COMMAND_ID (0x01)
index 202d80c..1a35ec1 100644 (file)
 
 #define ZAP_ATTRIBUTE_MASK(mask) ATTRIBUTE_MASK_##mask
 // This is an array of EmberAfAttributeMetadata structures.
-#define GENERATED_ATTRIBUTE_COUNT 126
+#define GENERATED_ATTRIBUTE_COUNT 127
 #define GENERATED_ATTRIBUTES                                                                                                       \
     {                                                                                                                              \
         { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 2 } }, /* Identify (server): cluster revision */                           \
             }, /* Basic (server): SoftwareVersion */                                                                               \
             {                                                                                                                      \
                 0x000A, ZAP_TYPE(CHAR_STRING), 64, ZAP_ATTRIBUTE_MASK(SINGLETON), { (uint8_t *) ZAP_LONG_DEFAULTS_INDEX(180) }     \
-            },                                                          /* Basic (server): SoftwareVersionString */                \
-            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* General Commissioning (server): cluster revision */     \
+            }, /* Basic (server): SoftwareVersionString */                                                                         \
             {                                                                                                                      \
                 0x0000, ZAP_TYPE(OCTET_STRING), 8, 0, { (uint8_t *) ZAP_LONG_DEFAULTS_INDEX(244) }                                 \
             }, /* General Commissioning (server): FabricId */                                                                      \
             {                                                                                                                      \
                 0x0001, ZAP_TYPE(INT64U), 8, ZAP_ATTRIBUTE_MASK(WRITABLE), { (uint8_t *) ZAP_LONG_DEFAULTS_INDEX(252) }            \
             },                                                          /* General Commissioning (server): Breadcrumb */           \
+            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* General Commissioning (server): cluster revision */     \
+            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Network Commissioning (server): cluster revision */     \
             { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 3 } },      /* Door Lock (server): cluster revision */                 \
             { 0x0000, ZAP_TYPE(ENUM8), 1, 0, { (uint8_t *) 2 } },       /* Door Lock (server): lock state */                       \
             { 0x0001, ZAP_TYPE(ENUM8), 1, 0, { (uint8_t *) 0 } },       /* Door Lock (server): lock type */                        \
             },                                                          /* IAS Zone (server): IAS CIE address */                   \
             { 0x0011, ZAP_TYPE(INT8U), 1, 0, { (uint8_t *) 0xff } },    /* IAS Zone (server): Zone ID */                           \
             { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Low Power (server): cluster revision */                 \
-            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Application Basic (server): cluster revision */         \
             {                                                                                                                      \
                 0x0000, ZAP_TYPE(OCTET_STRING), 32, 0, { (uint8_t *) ZAP_LONG_DEFAULTS_INDEX(522) }                                \
             },                                                     /* Application Basic (server): vendor name */                   \
             { 0x0001, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0 } }, /* Application Basic (server): vendor id */                     \
             {                                                                                                                      \
                 0x0002, ZAP_TYPE(OCTET_STRING), 32, 0, { (uint8_t *) ZAP_LONG_DEFAULTS_INDEX(554) }                                \
-            },                                                     /* Application Basic (server): application name */              \
-            { 0x0003, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0 } }, /* Application Basic (server): product id */                    \
+            },                                                          /* Application Basic (server): application name */         \
+            { 0x0003, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0 } },      /* Application Basic (server): product id */               \
+            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Application Basic (server): cluster revision */         \
             {                                                                                                                      \
                 0x0005, ZAP_TYPE(OCTET_STRING), 32, 0, { (uint8_t *) ZAP_LONG_DEFAULTS_INDEX(586) }                                \
             },                                                          /* Application Basic (server): application id */           \
             { 0x0006, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0 } },      /* Application Basic (server): catalog vendor id */        \
             { 0x0007, ZAP_TYPE(ENUM8), 1, 0, { (uint8_t *) 0x01 } },    /* Application Basic (server): application satus */        \
             { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Binding (server): cluster revision */                   \
-            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Media Playback (server): cluster revision */            \
             { 0x0000, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0 } },      /* Media Playback (server): current state */               \
+            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Media Playback (server): cluster revision */            \
             { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Content Launch (server): cluster revision */            \
             { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 2 } },      /* On/off (server): cluster revision */                    \
             { 0x0000, ZAP_TYPE(BOOLEAN), 1, 0, { (uint8_t *) 0x00 } },  /* On/off (server): on/off */                              \
     };
 
 #define ZAP_CLUSTER_MASK(mask) CLUSTER_MASK_##mask
-#define GENERATED_CLUSTER_COUNT 19
+#define GENERATED_CLUSTER_COUNT 20
 #define GENERATED_CLUSTERS                                                                                                         \
     {                                                                                                                              \
         { 0x0003,                                                                                                                  \
             {                                                                                                                      \
                 0x0030, ZAP_ATTRIBUTE_INDEX(26), 3, 18, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
             }, /* Endpoint: 1, Cluster: General Commissioning (server) */                                                          \
+            {                                                                                                                      \
+                0x0031, ZAP_ATTRIBUTE_INDEX(29), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
+            }, /* Endpoint: 1, Cluster: Network Commissioning (server) */                                                          \
             { 0x0101,                                                                                                              \
-              ZAP_ATTRIBUTE_INDEX(29),                                                                                             \
+              ZAP_ATTRIBUTE_INDEX(30),                                                                                             \
               4,                                                                                                                   \
               5,                                                                                                                   \
               ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(ATTRIBUTE_CHANGED_FUNCTION),                                             \
               chipFuncArrayDoorLockServer }, /* Endpoint: 1, Cluster: Door Lock (server) */                                        \
             {                                                                                                                      \
-                0x0103, ZAP_ATTRIBUTE_INDEX(33), 5, 7, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
+                0x0103, ZAP_ATTRIBUTE_INDEX(34), 5, 7, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
             }, /* Endpoint: 1, Cluster: Barrier Control (server) */                                                                \
             { 0x0300,                                                                                                              \
-              ZAP_ATTRIBUTE_INDEX(38),                                                                                             \
+              ZAP_ATTRIBUTE_INDEX(39),                                                                                             \
               51,                                                                                                                  \
               336,                                                                                                                 \
               ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION),                                                          \
               chipFuncArrayColorControlServer }, /* Endpoint: 1, Cluster: Color Control (server) */                                \
             {                                                                                                                      \
-                0x0402, ZAP_ATTRIBUTE_INDEX(89), 4, 8, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
+                0x0402, ZAP_ATTRIBUTE_INDEX(90), 4, 8, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
             }, /* Endpoint: 1, Cluster: Temperature Measurement (server) */                                                        \
             { 0x0500,                                                                                                              \
-              ZAP_ATTRIBUTE_INDEX(93),                                                                                             \
+              ZAP_ATTRIBUTE_INDEX(94),                                                                                             \
               6,                                                                                                                   \
               16,                                                                                                                  \
               ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION) | ZAP_CLUSTER_MASK(PRE_ATTRIBUTE_CHANGED_FUNCTION) |      \
                   ZAP_CLUSTER_MASK(MESSAGE_SENT_FUNCTION),                                                                         \
               chipFuncArrayIasZoneServer }, /* Endpoint: 1, Cluster: IAS Zone (server) */                                          \
             {                                                                                                                      \
-                0x0508, ZAP_ATTRIBUTE_INDEX(99), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
+                0x0508, ZAP_ATTRIBUTE_INDEX(100), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
             }, /* Endpoint: 1, Cluster: Low Power (server) */                                                                      \
             {                                                                                                                      \
-                0x050D, ZAP_ATTRIBUTE_INDEX(100), 8, 105, ZAP_CLUSTER_MASK(SERVER), NULL                                           \
+                0x050D, ZAP_ATTRIBUTE_INDEX(101), 8, 105, ZAP_CLUSTER_MASK(SERVER), NULL                                           \
             }, /* Endpoint: 1, Cluster: Application Basic (server) */                                                              \
             {                                                                                                                      \
-                0xF000, ZAP_ATTRIBUTE_INDEX(108), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
+                0xF000, ZAP_ATTRIBUTE_INDEX(109), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
             }, /* Endpoint: 1, Cluster: Binding (server) */                                                                        \
             {                                                                                                                      \
-                0xF001, ZAP_ATTRIBUTE_INDEX(109), 2, 4, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
+                0xF001, ZAP_ATTRIBUTE_INDEX(110), 2, 4, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
             }, /* Endpoint: 1, Cluster: Media Playback (server) */                                                                 \
             {                                                                                                                      \
-                0xF002, ZAP_ATTRIBUTE_INDEX(111), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
+                0xF002, ZAP_ATTRIBUTE_INDEX(112), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
             }, /* Endpoint: 1, Cluster: Content Launch (server) */                                                                 \
             { 0x0006,                                                                                                              \
-              ZAP_ATTRIBUTE_INDEX(112),                                                                                            \
+              ZAP_ATTRIBUTE_INDEX(113),                                                                                            \
               2,                                                                                                                   \
               3,                                                                                                                   \
               ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION),                                                          \
               chipFuncArrayOnOffServer }, /* Endpoint: 2, Cluster: On/off (server) */                                              \
             {                                                                                                                      \
-                0x0028, ZAP_ATTRIBUTE_INDEX(114), 12, 254, ZAP_CLUSTER_MASK(SERVER), NULL                                          \
+                0x0028, ZAP_ATTRIBUTE_INDEX(115), 12, 254, ZAP_CLUSTER_MASK(SERVER), NULL                                          \
             }, /* Endpoint: 2, Cluster: Basic (server) */                                                                          \
     }
 
 // This is an array of EmberAfEndpointType structures.
 #define GENERATED_ENDPOINT_TYPES                                                                                                   \
     {                                                                                                                              \
-        { ZAP_CLUSTER_INDEX(0), 17, 780 }, { ZAP_CLUSTER_INDEX(17), 2, 257 },                                                      \
+        { ZAP_CLUSTER_INDEX(0), 18, 782 }, { ZAP_CLUSTER_INDEX(18), 2, 257 },                                                      \
     }
 
 // Largest attribute size is needed for various buffers
 #define ATTRIBUTE_SINGLETONS_SIZE (508)
 
 // Total size of attribute storage
-#define ATTRIBUTE_MAX_SIZE (1037)
+#define ATTRIBUTE_MAX_SIZE (1039)
 
 // Number of fixed endpoints
 #define FIXED_ENDPOINT_COUNT (2)
 
 // Array of EmberAfCommandMetadata structs.
 #define ZAP_COMMAND_MASK(mask) COMMAND_MASK_##mask
-#define EMBER_AF_GENERATED_COMMAND_COUNT (115)
+#define EMBER_AF_GENERATED_COMMAND_COUNT (132)
 #define GENERATED_COMMANDS                                                                                                         \
     {                                                                                                                              \
         { 0x0003, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) },     /* Identify (server): Identify */                                 \
             { 0x0030, 0x06, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* General Commissioning (server): CommissioningComplete */       \
             { 0x0030, 0x07,                                                                                                        \
               ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* General Commissioning (server): CommissioningCompleteResponse */             \
+            { 0x0031, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): ScanNetworks */                \
+            { 0x0031, 0x01, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): ScanNetworksResponse */        \
+            { 0x0031, 0x02, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): AddWiFiNetwork */              \
+            { 0x0031, 0x03, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): AddWiFiNetworkResponse */      \
+            { 0x0031, 0x04, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): UpdateWiFiNetwork */           \
+            { 0x0031, 0x05, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): UpdateWiFiNetworkResponse */   \
+            { 0x0031, 0x06, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): AddThreadNetwork */            \
+            { 0x0031, 0x07, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): AddThreadNetworkResponse */    \
+            { 0x0031, 0x08, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): UpdateThreadNetwork */         \
+            { 0x0031, 0x09, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): UpdateThreadNetworkResponse */ \
+            { 0x0031, 0x0A, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): RemoveNetwork */               \
+            { 0x0031, 0x0B, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): RemoveNetworkResponse */       \
+            { 0x0031, 0x0C, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): EnableNetwork */               \
+            { 0x0031, 0x0D, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): EnableNetworkResponse */       \
+            { 0x0031, 0x0E, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): DisableNetwork */              \
+            { 0x0031, 0x0F, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): DisableNetworkResponse */      \
+            { 0x0031, 0x10,                                                                                                        \
+              ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): GetLastNetworkCommissioningResult */         \
             { 0x0101, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Door Lock (server): LockDoor */                                \
             { 0x0101, 0x00, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Door Lock (server): LockDoorResponse */                        \
             { 0x0101, 0x01, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Door Lock (server): UnlockDoor */                              \
index 6a1a6e9..09a3a3e 100644 (file)
@@ -43,6 +43,7 @@
 #define EMBER_AF_LEVEL_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_LOW_POWER_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_MEDIA_PLAYBACK_CLUSTER_SERVER_ENDPOINT_COUNT (1)
+#define EMBER_AF_NETWORK_COMMISSIONING_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_ON_OFF_CLUSTER_SERVER_ENDPOINT_COUNT (2)
 #define EMBER_AF_SCENES_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_TEMP_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_PLUGIN_MEDIA_PLAYBACK_SERVER
 #define EMBER_AF_PLUGIN_MEDIA_PLAYBACK
 
+// Use this macro to check if the server side of the Network Commissioning cluster is included
+#define ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER
+#define EMBER_AF_PLUGIN_NETWORK_COMMISSIONING_SERVER
+#define EMBER_AF_PLUGIN_NETWORK_COMMISSIONING
+
 // Use this macro to check if the server side of the On/off cluster is included
 #define ZCL_USING_ON_OFF_CLUSTER_SERVER
 #define EMBER_AF_PLUGIN_ON_OFF_SERVER
index bd08d38..8c737e9 100644 (file)
 #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER
 #endif
 
+#if defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_CLIENT)
+#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER { ZCL_NETWORK_COMMISSIONING_CLUSTER_ID, 49, "Network Commissioning" },
+#else
+#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER
+#endif
+
 #if defined(ZCL_USING_SHADE_CONFIG_CLUSTER_SERVER) || defined(ZCL_USING_SHADE_CONFIG_CLUSTER_CLIENT)
 #define CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER { ZCL_SHADE_CONFIG_CLUSTER_ID, 256, "Shade Configuration" },
 #else
 #define CHIP_PRINTCLUSTER_ZLL_COMMISSIONING_CLUSTER
 #endif
 
-#if defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_CLIENT)
-#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER { ZCL_NETWORK_COMMISSIONING_CLUSTER_ID, 43690, "Network Commissioning" },
-#else
-#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER
-#endif
-
 #if defined(ZCL_USING_BINDING_CLUSTER_SERVER) || defined(ZCL_USING_BINDING_CLUSTER_CLIENT)
 #define CHIP_PRINTCLUSTER_BINDING_CLUSTER { ZCL_BINDING_CLUSTER_ID, 61440, "Binding" },
 #else
     CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER                                                                                            \
     CHIP_PRINTCLUSTER_BASIC_CLUSTER                                                                                                \
     CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER                                                                                \
+    CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER                                                                                \
     CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER                                                                                         \
     CHIP_PRINTCLUSTER_DOOR_LOCK_CLUSTER                                                                                            \
     CHIP_PRINTCLUSTER_WINDOW_COVERING_CLUSTER                                                                                      \
     CHIP_PRINTCLUSTER_ELECTRICAL_MEASUREMENT_CLUSTER                                                                               \
     CHIP_PRINTCLUSTER_DIAGNOSTICS_CLUSTER                                                                                          \
     CHIP_PRINTCLUSTER_ZLL_COMMISSIONING_CLUSTER                                                                                    \
-    CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER                                                                                \
     CHIP_PRINTCLUSTER_BINDING_CLUSTER                                                                                              \
     CHIP_PRINTCLUSTER_MEDIA_PLAYBACK_CLUSTER                                                                                       \
     CHIP_PRINTCLUSTER_CONTENT_LAUNCH_CLUSTER                                                                                       \
index df7b728..2c99a76 100644 (file)
@@ -37,6 +37,7 @@ COMPONENT_SRCDIRS :=
   ../third_party/connectedhomeip/src/app/clusters/content-launch-server             \
   ../third_party/connectedhomeip/src/app/clusters/low-power-server                  \
   ../third_party/connectedhomeip/src/app/clusters/media-playback-server             \
+  ../third_party/connectedhomeip/src/app/clusters/network-commissioning             \
   ../third_party/connectedhomeip/src/app/clusters/temperature-measurement-server    \
   ../third_party/connectedhomeip/src/app/clusters/scenes                            \
   ../third_party/connectedhomeip/src/app/clusters/basic                             \
index 2e7f426..90d5518 100644 (file)
@@ -26,6 +26,8 @@ source_set("bridge-common") {
     "${chip_root}/src/app/clusters/basic/basic.cpp",
     "${chip_root}/src/app/clusters/bindings/bindings.cpp",
     "${chip_root}/src/app/clusters/level-control/level-control.cpp",
+    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning-ember.cpp",
+    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning.cpp",
     "${chip_root}/src/app/clusters/on-off-server/on-off.cpp",
     "${chip_root}/src/app/reporting/reporting-default-configuration.cpp",
     "${chip_root}/src/app/reporting/reporting.cpp",
index 405d0aa..c788f1e 100644 (file)
@@ -1,5 +1,5 @@
 {
-  "writeTime": "Tue Feb 16 2021 18:07:17 GMT+0100 (Central European Standard Time)",
+  "writeTime": "Fri Mar 12 2021 15:17:33 GMT+0800 (China Standard Time)",
   "featureLevel": 11,
   "creator": "zap",
   "keyValuePairs": [
       "deviceTypeProfileId": 260,
       "clusters": [
         {
-          "name": "Basic",
-          "code": 40,
+          "name": "Identify",
+          "code": 3,
           "mfgCode": null,
-          "define": "BASIC_CLUSTER",
+          "define": "IDENTIFY_CLUSTER",
           "side": "client",
           "enabled": 0,
-          "commands": [],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
-          ]
-        },
-        {
-          "name": "Basic",
-          "code": 40,
-          "mfgCode": null,
-          "define": "BASIC_CLUSTER",
-          "side": "server",
-          "enabled": 1,
           "commands": [
             {
-              "name": "StartUp",
+              "name": "Identify",
               "code": 0,
               "mfgCode": null,
-              "source": "server",
+              "source": "client",
               "incoming": 1,
-              "outgoing": 1
+              "outgoing": 0
             },
             {
-              "name": "ShutDown",
+              "name": "IdentifyQuery",
               "code": 1,
               "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "Leave",
-              "code": 2,
-              "mfgCode": null,
-              "source": "server",
+              "source": "client",
               "incoming": 1,
-              "outgoing": 1
+              "outgoing": 0
             }
           ],
           "attributes": [
               "name": "cluster revision",
               "code": 65533,
               "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            },
-            {
-              "name": "InteractionModelVersion",
-              "code": 0,
-              "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            },
-            {
-              "name": "VendorName",
-              "code": 1,
-              "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "",
-              "reportable": 0,
-              "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": "ProductID",
-              "code": 4,
-              "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": "Location",
-              "code": 6,
-              "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": "Identify",
-          "code": 3,
-          "mfgCode": null,
-          "define": "IDENTIFY_CLUSTER",
-          "side": "client",
-          "enabled": 0,
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
               "side": "client",
               "included": 1,
               "storageOption": "RAM",
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ],
-          "commands": [
-            {
-              "name": "Identify",
-              "code": 0,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "IdentifyQuery",
-              "code": 1,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            }
           ]
         },
         {
           "define": "IDENTIFY_CLUSTER",
           "side": "server",
           "enabled": 0,
-          "commands": [
-            {
-              "name": "IdentifyQueryResponse",
-              "code": 0,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            }
-          ],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
+          ],
+          "commands": [
+            {
+              "name": "IdentifyQueryResponse",
+              "code": 0,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            }
           ]
         },
         {
           "define": "GROUPS_CLUSTER",
           "side": "client",
           "enabled": 0,
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "3",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ],
           "commands": [
             {
               "name": "AddGroup",
               "incoming": 1,
               "outgoing": 0
             }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
           ]
         },
         {
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ]
-        },
-        {
-          "name": "Scenes",
-          "code": 5,
-          "mfgCode": null,
-          "define": "SCENES_CLUSTER",
-          "side": "server",
-          "enabled": 0,
+          ]
+        },
+        {
+          "name": "Scenes",
+          "code": 5,
+          "mfgCode": null,
+          "define": "SCENES_CLUSTER",
+          "side": "server",
+          "enabled": 0,
+          "commands": [
+            {
+              "name": "AddSceneResponse",
+              "code": 0,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "ViewSceneResponse",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveSceneResponse",
+              "code": 2,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveAllScenesResponse",
+              "code": 3,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "StoreSceneResponse",
+              "code": 4,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "GetSceneMembershipResponse",
+              "code": 6,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            }
+          ],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ],
-          "commands": [
-            {
-              "name": "AddSceneResponse",
-              "code": 0,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "ViewSceneResponse",
-              "code": 1,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "RemoveSceneResponse",
-              "code": 2,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "RemoveAllScenesResponse",
-              "code": 3,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "StoreSceneResponse",
-              "code": 4,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "GetSceneMembershipResponse",
-              "code": 6,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            }
           ]
         },
         {
               "reportableChange": 0
             }
           ]
-        }
-      ]
-    },
-    {
-      "name": "Anonymous Endpoint Type",
-      "deviceTypeName": "LO-colordimmablelight",
-      "deviceTypeCode": 258,
-      "deviceTypeProfileId": 260,
-      "clusters": [
+        },
         {
           "name": "Basic",
           "code": 40,
               "reportableChange": 0
             }
           ]
-        },
+        }
+      ]
+    },
+    {
+      "name": "Anonymous Endpoint Type",
+      "deviceTypeName": "LO-colordimmablelight",
+      "deviceTypeCode": 258,
+      "deviceTypeProfileId": 260,
+      "clusters": [
         {
           "name": "Identify",
           "code": 3,
           "define": "IDENTIFY_CLUSTER",
           "side": "client",
           "enabled": 0,
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "2",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
-          ],
           "commands": [
             {
               "name": "Identify",
               "incoming": 1,
               "outgoing": 0
             }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "2",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
           ]
         },
         {
               "defaultValue": "4",
               "reportable": 0,
               "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
-          ]
-        },
-        {
-          "name": "Color Control",
-          "code": 768,
-          "mfgCode": null,
-          "define": "COLOR_CONTROL_CLUSTER",
-          "side": "client",
-          "enabled": 0,
-          "commands": [
-            {
-              "name": "MoveToHue",
-              "code": 0,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "MoveHue",
-              "code": 1,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "StepHue",
-              "code": 2,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "MoveToSaturation",
-              "code": 3,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "MoveSaturation",
-              "code": 4,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "StepSaturation",
-              "code": 5,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "MoveToHueAndSaturation",
-              "code": 6,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "MoveToColor",
-              "code": 7,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "MoveColor",
-              "code": 8,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "StepColor",
-              "code": 9,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "EnhancedMoveToHue",
-              "code": 64,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "EnhancedMoveHue",
-              "code": 65,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "EnhancedStepHue",
-              "code": 66,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "EnhancedMoveToHueAndSaturation",
-              "code": 67,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "ColorLoopSet",
-              "code": 68,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "StopMoveStep",
-              "code": 71,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
+              "maxInterval": 65344,
+              "reportableChange": 0
             }
-          ],
+          ]
+        },
+        {
+          "name": "Basic",
+          "code": 40,
+          "mfgCode": null,
+          "define": "BASIC_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "side": "client",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
               "defaultValue": "3",
               "reportable": 0,
           ]
         },
         {
-          "name": "Color Control",
-          "code": 768,
+          "name": "Basic",
+          "code": 40,
           "mfgCode": null,
-          "define": "COLOR_CONTROL_CLUSTER",
+          "define": "BASIC_CLUSTER",
           "side": "server",
-          "enabled": 0,
-          "commands": [],
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "StartUp",
+              "code": 0,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "ShutDown",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "Leave",
+              "code": 2,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
           "attributes": [
             {
               "name": "cluster revision",
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
               "defaultValue": "3",
               "reportable": 0,
               "reportableChange": 0
             },
             {
-              "name": "current hue",
+              "name": "InteractionModelVersion",
               "code": 0,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "0x00",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "current saturation",
+              "name": "VendorName",
               "code": 1,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "0x00",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "remaining time",
+              "name": "VendorID",
               "code": 2,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "0x0000",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "current x",
+              "name": "ProductName",
               "code": 3,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "0x616B",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "current y",
+              "name": "ProductID",
               "code": 4,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "0x607D",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "color temperature",
-              "code": 7,
+              "name": "UserLabel",
+              "code": 5,
               "mfgCode": null,
               "side": "server",
-              "included": 0,
+              "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "0x00FA",
-              "reportable": 1,
+              "defaultValue": "",
+              "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "color mode",
-              "code": 8,
+              "name": "Location",
+              "code": 6,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "0x01",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "color control options",
-              "code": 15,
+              "name": "HardwareVersion",
+              "code": 7,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
               "defaultValue": "0x00",
               "reportable": 0,
               "reportableChange": 0
             },
             {
-              "name": "number of primaries",
-              "code": 16,
+              "name": "HardwareVersionString",
+              "code": 8,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
               "defaultValue": "",
               "reportable": 0,
               "reportableChange": 0
             },
             {
-              "name": "primary 1 x",
-              "code": 17,
+              "name": "SoftwareVersion",
+              "code": 9,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "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": "Color Control",
+          "code": 768,
+          "mfgCode": null,
+          "define": "COLOR_CONTROL_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "commands": [
+            {
+              "name": "MoveToHue",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "MoveHue",
+              "code": 1,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "StepHue",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "MoveToSaturation",
+              "code": 3,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "MoveSaturation",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "StepSaturation",
+              "code": 5,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "MoveToHueAndSaturation",
+              "code": 6,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "MoveToColor",
+              "code": 7,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "MoveColor",
+              "code": 8,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "StepColor",
+              "code": 9,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "EnhancedMoveToHue",
+              "code": 64,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "EnhancedMoveHue",
+              "code": 65,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "EnhancedStepHue",
+              "code": 66,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "EnhancedMoveToHueAndSaturation",
+              "code": 67,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
             },
             {
-              "name": "primary 1 y",
-              "code": 18,
+              "name": "ColorLoopSet",
+              "code": 68,
               "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
             },
             {
-              "name": "primary 1 intensity",
-              "code": 19,
+              "name": "StopMoveStep",
+              "code": 71,
               "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            },
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            }
+          ],
+          "attributes": [
             {
-              "name": "primary 2 x",
-              "code": 21,
+              "name": "cluster revision",
+              "code": 65533,
               "mfgCode": null,
-              "side": "server",
+              "side": "client",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "3",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
-            },
+            }
+          ]
+        },
+        {
+          "name": "Color Control",
+          "code": 768,
+          "mfgCode": null,
+          "define": "COLOR_CONTROL_CLUSTER",
+          "side": "server",
+          "enabled": 0,
+          "commands": [],
+          "attributes": [
             {
-              "name": "primary 2 y",
-              "code": 22,
+              "name": "cluster revision",
+              "code": 65533,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "3",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "primary 2 intensity",
-              "code": 23,
+              "name": "current hue",
+              "code": 0,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "0x00",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "primary 3 x",
-              "code": 25,
+              "name": "current saturation",
+              "code": 1,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "0x00",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "primary 3 y",
-              "code": 26,
+              "name": "remaining time",
+              "code": 2,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "0x0000",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "primary 3 intensity",
-              "code": 27,
+              "name": "current x",
+              "code": 3,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "0x616B",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "primary 4 x",
-              "code": 32,
+              "name": "current y",
+              "code": 4,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "0x607D",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "primary 4 y",
-              "code": 33,
+              "name": "color temperature",
+              "code": 7,
               "mfgCode": null,
               "side": "server",
-              "included": 1,
+              "included": 0,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
-              "reportable": 0,
+              "defaultValue": "0x00FA",
+              "reportable": 1,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "primary 4 intensity",
-              "code": 34,
+              "name": "color mode",
+              "code": 8,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "0x01",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "primary 5 x",
-              "code": 36,
+              "name": "color control options",
+              "code": 15,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "0x00",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "primary 5 y",
-              "code": 37,
+              "name": "number of primaries",
+              "code": 16,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "reportableChange": 0
             },
             {
-              "name": "primary 5 intensity",
-              "code": 38,
+              "name": "primary 1 x",
+              "code": 17,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "reportableChange": 0
             },
             {
-              "name": "primary 6 x",
-              "code": 40,
+              "name": "primary 1 y",
+              "code": 18,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "reportableChange": 0
             },
             {
-              "name": "primary y",
-              "code": 41,
+              "name": "primary 1 intensity",
+              "code": 19,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "reportableChange": 0
             },
             {
-              "name": "primary 6 intensity",
-              "code": 42,
+              "name": "primary 2 x",
+              "code": 21,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "reportableChange": 0
             },
             {
-              "name": "couple color temp to level min-mireds",
-              "code": 16397,
+              "name": "primary 2 y",
+              "code": 22,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "reportableChange": 0
             },
             {
-              "name": "start up color temperature mireds",
-              "code": 16400,
+              "name": "primary 2 intensity",
+              "code": 23,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "reportableChange": 0
             },
             {
-              "name": "enhanced current hue",
-              "code": 16384,
+              "name": "primary 3 x",
+              "code": 25,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0x0000",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "enhanced color mode",
-              "code": 16385,
+              "name": "primary 3 y",
+              "code": 26,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0x01",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "color loop active",
-              "code": 16386,
+              "name": "primary 3 intensity",
+              "code": 27,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0x00",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "color loop direction",
-              "code": 16387,
+              "name": "primary 4 x",
+              "code": 32,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0x00",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "color loop time",
-              "code": 16388,
+              "name": "primary 4 y",
+              "code": 33,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0x0019",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "color loop start enhanced hue",
-              "code": 16389,
+              "name": "primary 4 intensity",
+              "code": 34,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0x2300",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "color loop stored enhanced hue",
-              "code": 16390,
+              "name": "primary 5 x",
+              "code": 36,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0x0000",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "color capabilities",
-              "code": 16394,
-              "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "0x0000",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
-          ]
-        },
-        {
-          "name": "Occupancy Sensing",
-          "code": 1030,
-          "mfgCode": null,
-          "define": "OCCUPANCY_SENSING_CLUSTER",
-          "side": "client",
-          "enabled": 0,
-          "commands": [],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "2",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
-          ]
-        },
-        {
-          "name": "Occupancy Sensing",
-          "code": 1030,
-          "mfgCode": null,
-          "define": "OCCUPANCY_SENSING_CLUSTER",
-          "side": "server",
-          "enabled": 0,
-          "commands": [],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
+              "name": "primary 5 y",
+              "code": 37,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "2",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "occupancy",
-              "code": 0,
+              "name": "primary 5 intensity",
+              "code": 38,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "singleton": 0,
               "bounded": 0,
               "defaultValue": "",
-              "reportable": 1,
+              "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "occupancy sensor type",
-              "code": 1,
+              "name": "primary 6 x",
+              "code": 40,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "reportableChange": 0
             },
             {
-              "name": "occupancy sensor type bitmap",
-              "code": 2,
+              "name": "primary 6 y",
+              "code": 41,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
-            }
-          ]
-        },
-        {
-          "name": "ZLL Commissioning",
-          "code": 4096,
-          "mfgCode": null,
-          "define": "ZLL_COMMISSIONING_CLUSTER",
-          "side": "client",
-          "enabled": 0,
-          "commands": [
-            {
-              "name": "ScanRequest",
-              "code": 0,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "DeviceInformationRequest",
-              "code": 2,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "IdentifyRequest",
-              "code": 6,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "ResetToFactoryNewRequest",
-              "code": 7,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "NetworkStartRequest",
-              "code": 16,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "NetworkJoinRouterRequest",
-              "code": 18,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "NetworkJoinEndDeviceRequest",
-              "code": 20,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "NetworkUpdateRequest",
-              "code": 22,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "GetGroupIdentifiersRequest",
-              "code": 65,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
             },
             {
-              "name": "GetEndpointListRequest",
-              "code": 66,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
+              "name": "primary 6 intensity",
+              "code": 42,
               "mfgCode": null,
-              "side": "client",
+              "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0x0001",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
-            }
-          ]
-        },
-        {
-          "name": "ZLL Commissioning",
-          "code": 4096,
-          "mfgCode": null,
-          "define": "ZLL_COMMISSIONING_CLUSTER",
-          "side": "server",
-          "enabled": 0,
-          "commands": [
-            {
-              "name": "ScanResponse",
-              "code": 1,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "DeviceInformationResponse",
-              "code": 3,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "NetworkStartResponse",
-              "code": 17,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "NetworkJoinRouterResponse",
-              "code": 19,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "NetworkJoinEndDeviceResponse",
-              "code": 21,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "EndpointInformation",
-              "code": 64,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "GetGroupIdentifiersResponse",
-              "code": 65,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
             },
             {
-              "name": "GetEndpointListResponse",
-              "code": 66,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
+              "name": "couple color temp to level min-mireds",
+              "code": 16397,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0x0001",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
-            }
-          ]
-        }
-      ]
-    },
-    {
-      "name": "Anonymous Endpoint Type",
-      "deviceTypeName": "LO-colortemperaturelight",
-      "deviceTypeCode": 268,
-      "deviceTypeProfileId": 260,
-      "clusters": [
-        {
-          "name": "Basic",
-          "code": 0,
-          "mfgCode": null,
-          "define": "BASIC_CLUSTER",
-          "side": "client",
-          "enabled": 0,
-          "commands": [],
-          "attributes": [
+            },
             {
-              "name": "cluster revision",
-              "code": 65533,
+              "name": "start up color temperature mireds",
+              "code": 16400,
               "mfgCode": null,
-              "side": "client",
+              "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "3",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
-            }
-          ]
-        },
-        {
-          "name": "Basic",
-          "code": 0,
-          "mfgCode": null,
-          "define": "BASIC_CLUSTER",
-          "side": "server",
-          "enabled": 0,
-          "commands": [],
-          "attributes": [
+            },
             {
-              "name": "cluster revision",
-              "code": 65533,
+              "name": "enhanced current hue",
+              "code": 16384,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "3",
+              "defaultValue": "0x0000",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "ZCL version",
-              "code": 0,
+              "name": "enhanced color mode",
+              "code": 16385,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0x08",
+              "defaultValue": "0x01",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "application version",
-              "code": 1,
+              "name": "color loop active",
+              "code": 16386,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
               "defaultValue": "0x00",
               "reportable": 0,
               "reportableChange": 0
             },
             {
-              "name": "stack version",
-              "code": 2,
+              "name": "color loop direction",
+              "code": 16387,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
               "defaultValue": "0x00",
               "reportable": 0,
               "reportableChange": 0
             },
             {
-              "name": "hardware version",
-              "code": 3,
+              "name": "color loop time",
+              "code": 16388,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0x00",
+              "defaultValue": "0x0019",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "manufacturer name",
-              "code": 4,
+              "name": "color loop start enhanced hue",
+              "code": 16389,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "0x2300",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "model identifier",
-              "code": 5,
+              "name": "color loop stored enhanced hue",
+              "code": 16390,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "0x0000",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "date code",
-              "code": 6,
+              "name": "color capabilities",
+              "code": 16394,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "0x0000",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
-            },
+            }
+          ]
+        },
+        {
+          "name": "Occupancy Sensing",
+          "code": 1030,
+          "mfgCode": null,
+          "define": "OCCUPANCY_SENSING_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "commands": [],
+          "attributes": [
             {
-              "name": "power source",
-              "code": 7,
+              "name": "cluster revision",
+              "code": 65533,
               "mfgCode": null,
-              "side": "server",
+              "side": "client",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0x00",
+              "defaultValue": "2",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
-            },
+            }
+          ]
+        },
+        {
+          "name": "Occupancy Sensing",
+          "code": 1030,
+          "mfgCode": null,
+          "define": "OCCUPANCY_SENSING_CLUSTER",
+          "side": "server",
+          "enabled": 0,
+          "commands": [],
+          "attributes": [
             {
-              "name": "generic device class",
-              "code": 8,
+              "name": "cluster revision",
+              "code": 65533,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0xFF",
+              "defaultValue": "2",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "generic device type",
-              "code": 9,
+              "name": "occupancy",
+              "code": 0,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0xFF",
-              "reportable": 0,
+              "defaultValue": "",
+              "reportable": 1,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "product code",
-              "code": 10,
+              "name": "occupancy sensor type",
+              "code": 1,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
               "defaultValue": "",
               "reportable": 0,
               "reportableChange": 0
             },
             {
-              "name": "product url",
-              "code": 11,
+              "name": "occupancy sensor type bitmap",
+              "code": 2,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
               "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "ZLL Commissioning",
+          "code": 4096,
+          "mfgCode": null,
+          "define": "ZLL_COMMISSIONING_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "commands": [
+            {
+              "name": "ScanRequest",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
             },
             {
-              "name": "sw build id",
-              "code": 16384,
+              "name": "DeviceInformationRequest",
+              "code": 2,
               "mfgCode": null,
-              "side": "server",
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "IdentifyRequest",
+              "code": 6,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "ResetToFactoryNewRequest",
+              "code": 7,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "NetworkStartRequest",
+              "code": 16,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "NetworkJoinRouterRequest",
+              "code": 18,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "NetworkJoinEndDeviceRequest",
+              "code": 20,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "NetworkUpdateRequest",
+              "code": 22,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "GetGroupIdentifiersRequest",
+              "code": 65,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "GetEndpointListRequest",
+              "code": 66,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "0x0001",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
           ]
         },
         {
-          "name": "Identify",
-          "code": 3,
+          "name": "ZLL Commissioning",
+          "code": 4096,
           "mfgCode": null,
-          "define": "IDENTIFY_CLUSTER",
-          "side": "client",
+          "define": "ZLL_COMMISSIONING_CLUSTER",
+          "side": "server",
           "enabled": 0,
+          "commands": [
+            {
+              "name": "ScanResponse",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "DeviceInformationResponse",
+              "code": 3,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "NetworkStartResponse",
+              "code": 17,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "NetworkJoinRouterResponse",
+              "code": 19,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "NetworkJoinEndDeviceResponse",
+              "code": 21,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "EndpointInformation",
+              "code": 64,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "GetGroupIdentifiersResponse",
+              "code": 65,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "GetEndpointListResponse",
+              "code": 66,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            }
+          ],
           "attributes": [
             {
               "name": "cluster revision",
               "code": 65533,
               "mfgCode": null,
-              "side": "client",
+              "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "2",
+              "defaultValue": "0x0001",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ],
+          ]
+        }
+      ]
+    },
+    {
+      "name": "Anonymous Endpoint Type",
+      "deviceTypeName": "LO-colortemperaturelight",
+      "deviceTypeCode": 268,
+      "deviceTypeProfileId": 260,
+      "clusters": [
+        {
+          "name": "Identify",
+          "code": 3,
+          "mfgCode": null,
+          "define": "IDENTIFY_CLUSTER",
+          "side": "client",
+          "enabled": 0,
           "commands": [
             {
               "name": "Identify",
               "incoming": 1,
               "outgoing": 0
             }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "2",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
           ]
         },
         {
           "define": "IDENTIFY_CLUSTER",
           "side": "server",
           "enabled": 0,
-          "commands": [
-            {
-              "name": "IdentifyQueryResponse",
-              "code": 0,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            }
-          ],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
+          ],
+          "commands": [
+            {
+              "name": "IdentifyQueryResponse",
+              "code": 0,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            }
           ]
         },
         {
           "define": "GROUPS_CLUSTER",
           "side": "client",
           "enabled": 0,
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "3",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ],
           "commands": [
             {
               "name": "AddGroup",
               "incoming": 1,
               "outgoing": 0
             }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
           ]
         },
         {
       "deviceTypeProfileId": 43981,
       "clusters": [
         {
-          "name": "Basic",
-          "code": 0,
+          "name": "Network Commissioning",
+          "code": 49,
           "mfgCode": null,
-          "define": "BASIC_CLUSTER",
+          "define": "NETWORK_COMMISSIONING_CLUSTER",
           "side": "client",
           "enabled": 0,
-          "commands": [
-            {
-              "name": "ResetToFactoryDefaults",
-              "code": 0,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            }
-          ],
           "attributes": [
             {
               "name": "cluster revision",
               "side": "client",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "3",
+              "defaultValue": "0x0001",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             }
+          ],
+          "commands": [
+            {
+              "name": "ScanNetworks",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "AddWiFiNetwork",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "UpdateWiFiNetwork",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "AddThreadNetwork",
+              "code": 6,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "UpdateThreadNetwork",
+              "code": 8,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "RemoveNetwork",
+              "code": 10,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "EnableNetwork",
+              "code": 12,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "DisableNetwork",
+              "code": 14,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "GetLastNetworkCommissioningResult",
+              "code": 16,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            }
           ]
         },
         {
-          "name": "Basic",
-          "code": 0,
+          "name": "Network Commissioning",
+          "code": 49,
           "mfgCode": null,
-          "define": "BASIC_CLUSTER",
+          "define": "NETWORK_COMMISSIONING_CLUSTER",
           "side": "server",
           "enabled": 1,
-          "commands": [],
-          "attributes": [
+          "commands": [
             {
-              "name": "cluster revision",
-              "code": 65533,
+              "name": "ScanNetworksResponse",
+              "code": 1,
               "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
             },
             {
-              "name": "ZCL version",
-              "code": 0,
+              "name": "AddWiFiNetworkResponse",
+              "code": 3,
               "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "0x08",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
             },
             {
-              "name": "power source",
+              "name": "UpdateWiFiNetworkResponse",
+              "code": 5,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "AddThreadNetworkResponse",
               "code": 7,
               "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "UpdateThreadNetworkResponse",
+              "code": 9,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveNetworkResponse",
+              "code": 11,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "EnableNetworkResponse",
+              "code": 13,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "DisableNetworkResponse",
+              "code": 15,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0x00",
+              "defaultValue": "0x0001",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
       "networkId": 0
     }
   ]
-}
+}
\ No newline at end of file
index e41b61b..b066625 100644 (file)
@@ -114,6 +114,52 @@ NS_ASSUME_NONNULL_BEGIN
 @end
 
 /**
+ * Cluster Network Commissioning
+ *
+ */
+@interface CHIPNetworkCommissioning : CHIPCluster
+
+- (void)addThreadNetwork:(NSData *)operationalDataset
+              breadcrumb:(uint64_t)breadcrumb
+               timeoutMs:(uint32_t)timeoutMs
+       completionHandler:(ResponseHandler)completionHandler;
+- (void)addWiFiNetwork:(NSData *)ssid
+           credentials:(NSData *)credentials
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler;
+- (void)disableNetwork:(NSData *)networkID
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler;
+- (void)enableNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler;
+- (void)getLastNetworkCommissioningResult:(uint32_t)timeoutMs completionHandler:(ResponseHandler)completionHandler;
+- (void)removeNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler;
+- (void)scanNetworks:(NSData *)ssid
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler;
+- (void)updateThreadNetwork:(NSData *)operationalDataset
+                 breadcrumb:(uint64_t)breadcrumb
+                  timeoutMs:(uint32_t)timeoutMs
+          completionHandler:(ResponseHandler)completionHandler;
+- (void)updateWiFiNetwork:(NSData *)ssid
+              credentials:(NSData *)credentials
+               breadcrumb:(uint64_t)breadcrumb
+                timeoutMs:(uint32_t)timeoutMs
+        completionHandler:(ResponseHandler)completionHandler;
+
+- (void)readAttributeClusterRevision:(ResponseHandler)completionHandler;
+
+@end
+
+/**
  * Cluster On/off
  *
  */
index f583357..8b04fff 100644 (file)
@@ -21,7 +21,7 @@
 
 #import "CHIPDevice.h"
 #import "CHIPDevice_Internal.h"
-#import "ChipError.h"
+#import "CHIPError.h"
 #import "gen/CHIPClientCallbacks.h"
 #import "gen/CHIPClustersObjc.h"
 
@@ -292,6 +292,38 @@ private:
     bool mKeepAlive;
 };
 
+class CHIPInt64uAttributeCallbackBridge : public Callback::Callback<Int64uAttributeCallback> {
+public:
+    CHIPInt64uAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
+        : Callback::Callback<Int64uAttributeCallback>(CallbackFn, this)
+        , mHandler(handler)
+        , mQueue(queue)
+        , mKeepAlive(keepAlive)
+    {
+    }
+
+    ~CHIPInt64uAttributeCallbackBridge() {};
+
+    static void CallbackFn(void * context, uint64_t value)
+    {
+        CHIPInt64uAttributeCallbackBridge * callback = reinterpret_cast<CHIPInt64uAttributeCallbackBridge *>(context);
+        if (callback && callback->mQueue) {
+            dispatch_async(callback->mQueue, ^{
+                callback->mHandler(nil, @ { @"value" : [NSNumber numberWithUnsignedLongLong:value] });
+                if (!callback->mKeepAlive) {
+                    callback->Cancel();
+                    delete callback;
+                }
+            });
+        }
+    };
+
+private:
+    ResponseHandler mHandler;
+    dispatch_queue_t mQueue;
+    bool mKeepAlive;
+};
+
 class CHIPInt16sAttributeCallbackBridge : public Callback::Callback<Int16sAttributeCallback> {
 public:
     CHIPInt16sAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
@@ -1112,6 +1144,285 @@ private:
 
 @end
 
+@interface CHIPNetworkCommissioning ()
+@property (readonly) Controller::NetworkCommissioningCluster cppCluster;
+@end
+
+@implementation CHIPNetworkCommissioning
+
+- (Controller::ClusterBase *)getCluster
+{
+    return &_cppCluster;
+}
+
+- (void)addThreadNetwork:(NSData *)operationalDataset
+              breadcrumb:(uint64_t)breadcrumb
+               timeoutMs:(uint32_t)timeoutMs
+       completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterAddThreadNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterAddThreadNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.AddThreadNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) operationalDataset.bytes, operationalDataset.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)addWiFiNetwork:(NSData *)ssid
+           credentials:(NSData *)credentials
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterAddWiFiNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterAddWiFiNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.AddWiFiNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) ssid.bytes, ssid.length),
+        chip::ByteSpan((const uint8_t *) credentials.bytes, credentials.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)disableNetwork:(NSData *)networkID
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterDisableNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterDisableNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.DisableNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) networkID.bytes, networkID.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)enableNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterEnableNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterEnableNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.EnableNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) networkID.bytes, networkID.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)getLastNetworkCommissioningResult:(uint32_t)timeoutMs completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPDefaultSuccessCallbackBridge * onSuccess = new CHIPDefaultSuccessCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.GetLastNetworkCommissioningResult(onSuccess->Cancel(), onFailure->Cancel(), timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)removeNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterRemoveNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterRemoveNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.RemoveNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) networkID.bytes, networkID.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)scanNetworks:(NSData *)ssid
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterScanNetworksResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterScanNetworksResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.ScanNetworks(
+        onSuccess->Cancel(), onFailure->Cancel(), chip::ByteSpan((const uint8_t *) ssid.bytes, ssid.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)updateThreadNetwork:(NSData *)operationalDataset
+                 breadcrumb:(uint64_t)breadcrumb
+                  timeoutMs:(uint32_t)timeoutMs
+          completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterUpdateThreadNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterUpdateThreadNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.UpdateThreadNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) operationalDataset.bytes, operationalDataset.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)updateWiFiNetwork:(NSData *)ssid
+              credentials:(NSData *)credentials
+               breadcrumb:(uint64_t)breadcrumb
+                timeoutMs:(uint32_t)timeoutMs
+        completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterUpdateWiFiNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterUpdateWiFiNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.UpdateWiFiNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) ssid.bytes, ssid.length),
+        chip::ByteSpan((const uint8_t *) credentials.bytes, credentials.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+
+- (void)readAttributeClusterRevision:(ResponseHandler)completionHandler
+{
+    CHIPInt16uAttributeCallbackBridge * onSuccess = new CHIPInt16uAttributeCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.ReadAttributeClusterRevision(onSuccess->Cancel(), onFailure->Cancel());
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+
+@end
+
 @interface CHIPOnOff ()
 @property (readonly) Controller::OnOffCluster cppCluster;
 @end
index e5c62ee..38e77a9 100644 (file)
@@ -305,6 +305,335 @@ void DispatchServerCommand(app::Command * command, CommandId commandId, Endpoint
 
 } // namespace LevelControl
 
+namespace NetworkCommissioning {
+
+void DispatchServerCommand(app::Command * command, CommandId commandId, EndpointId endpointId, TLV::TLVReader & dataTlv)
+{
+    {
+        switch (commandId)
+        {
+        case ZCL_ADD_THREAD_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(operationalDataset);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterAddThreadNetworkCallback(const_cast<uint8_t *>(operationalDataset), breadcrumb,
+                                                                       timeoutMs);
+            break;
+        }
+        case ZCL_ADD_WI_FI_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * ssid;
+            const uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(ssid);
+                    break;
+                case 1:
+                    TLVError = dataTlv.GetDataPtr(credentials);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 3:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(const_cast<uint8_t *>(ssid),
+                                                                     const_cast<uint8_t *>(credentials), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_DISABLE_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(networkID);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterDisableNetworkCallback(const_cast<uint8_t *>(networkID), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_ENABLE_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(networkID);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterEnableNetworkCallback(const_cast<uint8_t *>(networkID), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(timeoutMs);
+            break;
+        }
+        case ZCL_REMOVE_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * NetworkID;
+            uint64_t Breadcrumb;
+            uint32_t TimeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(NetworkID);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(Breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(TimeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterRemoveNetworkCallback(const_cast<uint8_t *>(NetworkID), Breadcrumb, TimeoutMs);
+            break;
+        }
+        case ZCL_SCAN_NETWORKS_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * ssid;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(ssid);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterScanNetworksCallback(const_cast<uint8_t *>(ssid), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(operationalDataset);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(const_cast<uint8_t *>(operationalDataset), breadcrumb,
+                                                                          timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * ssid;
+            const uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(ssid);
+                    break;
+                case 1:
+                    TLVError = dataTlv.GetDataPtr(credentials);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 3:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(const_cast<uint8_t *>(ssid),
+                                                                        const_cast<uint8_t *>(credentials), breadcrumb, timeoutMs);
+            break;
+        }
+        default: {
+            // Unrecognized command ID, error status will apply.
+            // TODO: Encode response for command not found
+            ChipLogError(Zcl, "Unknown command %" PRIx16 " for cluster %" PRIx16, commandId, ZCL_NETWORK_COMMISSIONING_CLUSTER_ID);
+            break;
+        }
+        }
+    }
+}
+
+} // namespace NetworkCommissioning
+
 namespace OnOff {
 
 void DispatchServerCommand(app::Command * command, CommandId commandId, EndpointId endpointId, TLV::TLVReader & dataTlv)
@@ -352,6 +681,9 @@ void DispatchSingleClusterCommand(chip::ClusterId aClusterId, chip::CommandId aC
     case ZCL_LEVEL_CONTROL_CLUSTER_ID:
         clusters::LevelControl::DispatchServerCommand(apCommandObj, aCommandId, aEndPointId, aReader);
         break;
+    case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
+        clusters::NetworkCommissioning::DispatchServerCommand(apCommandObj, aCommandId, aEndPointId, aReader);
+        break;
     case ZCL_ON_OFF_CLUSTER_ID:
         clusters::OnOff::DispatchServerCommand(apCommandObj, aCommandId, aEndPointId, aReader);
         break;
index 8c8757f..72a0198 100644 (file)
 #define ZCL_FABRIC_ID_ATTRIBUTE_ID (0x0000)
 #define ZCL_BREADCRUMB_ATTRIBUTE_ID (0x0001)
 
+// Attribute ids for cluster: Network Commissioning
+
+// Client attributes
+
+// Server attributes
+
 // Attribute ids for cluster: Shade Configuration
 
 // Client attributes
 
 // Server attributes
 
-// Attribute ids for cluster: Network Commissioning
-
-// Client attributes
-
-// Server attributes
-
 // Attribute ids for cluster: Binding
 
 // Client attributes
index 8a3306f..4680bec 100644 (file)
@@ -30,6 +30,7 @@ using namespace chip;
 
 EmberAfStatus emberAfBasicClusterServerCommandParse(EmberAfClusterCommand * cmd);
 EmberAfStatus emberAfLevelControlClusterServerCommandParse(EmberAfClusterCommand * cmd);
+EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd);
 EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd);
 
 static EmberAfStatus status(bool wasHandled, bool clusterExists, bool mfgSpecific)
@@ -78,6 +79,9 @@ EmberAfStatus emberAfClusterSpecificCommandParse(EmberAfClusterCommand * cmd)
         case ZCL_LEVEL_CONTROL_CLUSTER_ID:
             result = emberAfLevelControlClusterServerCommandParse(cmd);
             break;
+        case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
+            result = emberAfNetworkCommissioningClusterServerCommandParse(cmd);
+            break;
         case ZCL_ON_OFF_CLUSTER_ID:
             result = emberAfOnOffClusterServerCommandParse(cmd);
             break;
@@ -307,6 +311,265 @@ EmberAfStatus emberAfLevelControlClusterServerCommandParse(EmberAfClusterCommand
     }
     return status(wasHandled, true, cmd->mfgSpecific);
 }
+EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd)
+{
+    bool wasHandled = false;
+
+    if (!cmd->mfgSpecific)
+    {
+        switch (cmd->commandId)
+        {
+        case ZCL_ADD_THREAD_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            operationalDataset = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset      = static_cast<uint16_t>(payloadOffset + emberAfStringLength(operationalDataset) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterAddThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_ADD_WI_FI_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * ssid;
+            uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            ssid          = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            credentials   = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(credentials) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_DISABLE_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            networkID     = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(networkID) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterDisableNetworkCallback(networkID, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_ENABLE_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            networkID     = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(networkID) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterEnableNetworkCallback(networkID, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(timeoutMs);
+            break;
+        }
+        case ZCL_REMOVE_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * NetworkID;
+            uint64_t Breadcrumb;
+            uint32_t TimeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            NetworkID     = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(NetworkID) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            Breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            TimeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterRemoveNetworkCallback(NetworkID, Breadcrumb, TimeoutMs);
+            break;
+        }
+        case ZCL_SCAN_NETWORKS_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * ssid;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            ssid          = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterScanNetworksCallback(ssid, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            operationalDataset = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset      = static_cast<uint16_t>(payloadOffset + emberAfStringLength(operationalDataset) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * ssid;
+            uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            ssid          = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            credentials   = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(credentials) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
+            break;
+        }
+        default: {
+            // Unrecognized command ID, error status will apply.
+            break;
+        }
+        }
+    }
+    return status(wasHandled, true, cmd->mfgSpecific);
+}
 EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd)
 {
     bool wasHandled = false;
index eed6cef..f40262e 100644 (file)
@@ -33,6 +33,9 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId)
     case ZCL_LEVEL_CONTROL_CLUSTER_ID:
         emberAfLevelControlClusterInitCallback(endpoint);
         break;
+    case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
+        emberAfNetworkCommissioningClusterInitCallback(endpoint);
+        break;
     case ZCL_ON_OFF_CLUSTER_ID:
         emberAfOnOffClusterInitCallback(endpoint);
         break;
@@ -52,6 +55,11 @@ void __attribute__((weak)) emberAfLevelControlClusterInitCallback(EndpointId end
     // To prevent warning
     (void) endpoint;
 }
+void __attribute__((weak)) emberAfNetworkCommissioningClusterInitCallback(EndpointId endpoint)
+{
+    // To prevent warning
+    (void) endpoint;
+}
 void __attribute__((weak)) emberAfOnOffClusterInitCallback(EndpointId endpoint)
 {
     // To prevent warning
index 26742ee..dfac28f 100644 (file)
@@ -53,6 +53,14 @@ void emberAfBasicClusterInitCallback(chip::EndpointId endpoint);
  */
 void emberAfLevelControlClusterInitCallback(chip::EndpointId endpoint);
 
+/** @brief Network Commissioning Cluster Init
+ *
+ * Cluster Init
+ *
+ * @param endpoint    Endpoint that is being initialized
+ */
+void emberAfNetworkCommissioningClusterInitCallback(chip::EndpointId endpoint);
+
 /** @brief On/off Cluster Init
  *
  * Cluster Init
@@ -202,6 +210,77 @@ EmberAfStatus emberAfLevelControlClusterServerPreAttributeChangedCallback(chip::
 void emberAfLevelControlClusterServerTickCallback(chip::EndpointId endpoint);
 
 //
+// Network Commissioning Cluster server
+//
+
+/** @brief Network Commissioning Cluster Server Init
+ *
+ * Server Init
+ *
+ * @param endpoint    Endpoint that is being initialized
+ */
+void emberAfNetworkCommissioningClusterServerInitCallback(chip::EndpointId endpoint);
+
+/** @brief Network Commissioning Cluster Server Attribute Changed
+ *
+ * Server Attribute Changed
+ *
+ * @param endpoint    Endpoint that is being initialized
+ * @param attributeId Attribute that changed
+ */
+void emberAfNetworkCommissioningClusterServerAttributeChangedCallback(chip::EndpointId endpoint, chip::AttributeId attributeId);
+
+/** @brief Network Commissioning Cluster Server Manufacturer Specific Attribute Changed
+ *
+ * Server Manufacturer Specific Attribute Changed
+ *
+ * @param endpoint          Endpoint that is being initialized
+ * @param attributeId       Attribute that changed
+ * @param manufacturerCode  Manufacturer Code of the attribute that changed
+ */
+void emberAfNetworkCommissioningClusterServerManufacturerSpecificAttributeChangedCallback(chip::EndpointId endpoint,
+                                                                                          chip::AttributeId attributeId,
+                                                                                          uint16_t manufacturerCode);
+
+/** @brief Network Commissioning Cluster Server Message Sent
+ *
+ * Server Message Sent
+ *
+ * @param type               The type of message sent
+ * @param indexOrDestination The destination or address to which the message was sent
+ * @param apsFrame           The APS frame for the message
+ * @param msgLen             The length of the message
+ * @param message            The message that was sent
+ * @param status             The status of the sent message
+ */
+void emberAfNetworkCommissioningClusterServerMessageSentCallback(EmberOutgoingMessageType type, uint64_t indexOrDestination,
+                                                                 EmberApsFrame * apsFrame, uint16_t msgLen, uint8_t * message,
+                                                                 EmberStatus status);
+
+/** @brief Network Commissioning Cluster Server Pre Attribute Changed
+ *
+ * server Pre Attribute Changed
+ *
+ * @param endpoint      Endpoint that is being initialized
+ * @param attributeId   Attribute to be changed
+ * @param attributeType Attribute type
+ * @param size          Attribute size
+ * @param value         Attribute value
+ */
+EmberAfStatus emberAfNetworkCommissioningClusterServerPreAttributeChangedCallback(chip::EndpointId endpoint,
+                                                                                  chip::AttributeId attributeId,
+                                                                                  EmberAfAttributeType attributeType, uint8_t size,
+                                                                                  uint8_t * value);
+
+/** @brief Network Commissioning Cluster Server Tick
+ *
+ * server Tick
+ *
+ * @param endpoint  Endpoint that is being served
+ */
+void emberAfNetworkCommissioningClusterServerTickCallback(chip::EndpointId endpoint);
+
+//
 // On/off Cluster server
 //
 
@@ -344,6 +423,91 @@ bool emberAfLevelControlClusterStopCallback(uint8_t optionMask, uint8_t optionOv
 bool emberAfLevelControlClusterStopWithOnOffCallback();
 
 /**
+ * @brief Network Commissioning Cluster AddThreadNetwork Command callback
+ * @param operationalDataset
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterAddThreadNetworkCallback(uint8_t * operationalDataset, uint64_t breadcrumb,
+                                                                uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster AddWiFiNetwork Command callback
+ * @param ssid
+ * @param credentials
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(uint8_t * ssid, uint8_t * credentials, uint64_t breadcrumb,
+                                                              uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster DisableNetwork Command callback
+ * @param networkID
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterDisableNetworkCallback(uint8_t * networkID, uint64_t breadcrumb, uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster EnableNetwork Command callback
+ * @param networkID
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterEnableNetworkCallback(uint8_t * networkID, uint64_t breadcrumb, uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster GetLastNetworkCommissioningResult Command callback
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster RemoveNetwork Command callback
+ * @param networkID
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterRemoveNetworkCallback(uint8_t * NetworkID, uint64_t Breadcrumb, uint32_t TimeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster ScanNetworks Command callback
+ * @param ssid
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterScanNetworksCallback(uint8_t * ssid, uint64_t breadcrumb, uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster UpdateThreadNetwork Command callback
+ * @param operationalDataset
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(uint8_t * operationalDataset, uint64_t breadcrumb,
+                                                                   uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster UpdateWiFiNetwork Command callback
+ * @param ssid
+ * @param credentials
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(uint8_t * ssid, uint8_t * credentials, uint64_t breadcrumb,
+                                                                 uint32_t timeoutMs);
+
+/**
  * @brief On/off Cluster Off Command callback
  */
 
index f72c96f..79d1e15 100644 (file)
                                                                                                                                    \
                                   ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
 
+/** @brief Command description for ScanNetworks
+ *
+ * Command: ScanNetworks
+ * @param ssid OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterScanNetworks(ssid, breadcrumb, timeoutMs)                                                                  \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_SCAN_NETWORKS_COMMAND_ID, "uuu", ssid, breadcrumb, timeoutMs);
+
+/** @brief Command description for ScanNetworksResponse
+ *
+ * Command: ScanNetworksResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ * @param wifiScanResults WiFiInterfaceScanResult []
+ * @param wifiScanResultsLen int
+ * @param threadScanResults ThreadInterfaceScanResult []
+ * @param threadScanResultsLen int
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterScanNetworksResponse(errorCode, debugText, wifiScanResults, wifiScanResultsLen, threadScanResults,         \
+                                             threadScanResultsLen)                                                                 \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID, "uubb", errorCode, debugText, wifiScanResults,            \
+                                  wifiScanResultsLen, threadScanResults, threadScanResultsLen);
+
+/** @brief Command description for AddWiFiNetwork
+ *
+ * Command: AddWiFiNetwork
+ * @param ssid OCTET_STRING
+ * @param credentials OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                   \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
+
+/** @brief Command description for AddWiFiNetworkResponse
+ *
+ * Command: AddWiFiNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddWiFiNetworkResponse(errorCode, debugText)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for UpdateWiFiNetwork
+ *
+ * Command: UpdateWiFiNetwork
+ * @param ssid OCTET_STRING
+ * @param credentials OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
+
+/** @brief Command description for UpdateWiFiNetworkResponse
+ *
+ * Command: UpdateWiFiNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateWiFiNetworkResponse(errorCode, debugText)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for AddThreadNetwork
+ *
+ * Command: AddThreadNetwork
+ * @param operationalDataset OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
+
+/** @brief Command description for AddThreadNetworkResponse
+ *
+ * Command: AddThreadNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddThreadNetworkResponse(errorCode, debugText)                                                             \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for UpdateThreadNetwork
+ *
+ * Command: UpdateThreadNetwork
+ * @param operationalDataset OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                             \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
+
+/** @brief Command description for UpdateThreadNetworkResponse
+ *
+ * Command: UpdateThreadNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateThreadNetworkResponse(errorCode, debugText)                                                          \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for RemoveNetwork
+ *
+ * Command: RemoveNetwork
+ * @param NetworkID OCTET_STRING
+ * @param Breadcrumb INT64U
+ * @param TimeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterRemoveNetwork(NetworkID, Breadcrumb, TimeoutMs)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_REMOVE_NETWORK_COMMAND_ID, "uuu", NetworkID, Breadcrumb, TimeoutMs);
+
+/** @brief Command description for RemoveNetworkResponse
+ *
+ * Command: RemoveNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterRemoveNetworkResponse(errorCode, debugText)                                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for EnableNetwork
+ *
+ * Command: EnableNetwork
+ * @param networkID OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterEnableNetwork(networkID, breadcrumb, timeoutMs)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ENABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
+
+/** @brief Command description for EnableNetworkResponse
+ *
+ * Command: EnableNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterEnableNetworkResponse(errorCode, debugText)                                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for DisableNetwork
+ *
+ * Command: DisableNetwork
+ * @param networkID OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterDisableNetwork(networkID, breadcrumb, timeoutMs)                                                           \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_DISABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
+
+/** @brief Command description for DisableNetworkResponse
+ *
+ * Command: DisableNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterDisableNetworkResponse(errorCode, debugText)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for GetLastNetworkCommissioningResult
+ *
+ * Command: GetLastNetworkCommissioningResult
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterGetLastNetworkCommissioningResult(timeoutMs)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID, "u", timeoutMs);
+
 /** @brief Command description for LockDoor
  *
  * Command: LockDoor
                                   ZCL_GET_ENDPOINT_LIST_REQUEST_COMMAND_ID, "uuuub", startIndex, total, startIndex, count,         \
                                   endpointInformationRecordList, endpointInformationRecordListLen);
 
-/** @brief Command description for ScanNetworks
- *
- * Command: ScanNetworks
- * @param ssid OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterScanNetworks(ssid, breadcrumb, timeoutMs)                                                                  \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_SCAN_NETWORKS_COMMAND_ID, "uuu", ssid, breadcrumb, timeoutMs);
-
-/** @brief Command description for ScanNetworksResponse
- *
- * Command: ScanNetworksResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- * @param wifiScanResults WiFiInterfaceScanResult []
- * @param wifiScanResultsLen int
- * @param threadScanResults ThreadInterfaceScanResult []
- * @param threadScanResultsLen int
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterScanNetworksResponse(errorCode, debugText, wifiScanResults, wifiScanResultsLen, threadScanResults,         \
-                                             threadScanResultsLen)                                                                 \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID, "uubb", errorCode, debugText, wifiScanResults,            \
-                                  wifiScanResultsLen, threadScanResults, threadScanResultsLen);
-
-/** @brief Command description for AddWiFiNetwork
- *
- * Command: AddWiFiNetwork
- * @param ssid OCTET_STRING
- * @param credentials OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                   \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
-
-/** @brief Command description for AddWiFiNetworkResponse
- *
- * Command: AddWiFiNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddWiFiNetworkResponse(errorCode, debugText)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for UpdateWiFiNetwork
- *
- * Command: UpdateWiFiNetwork
- * @param ssid OCTET_STRING
- * @param credentials OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
-
-/** @brief Command description for UpdateWiFiNetworkResponse
- *
- * Command: UpdateWiFiNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateWiFiNetworkResponse(errorCode, debugText)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for AddThreadNetwork
- *
- * Command: AddThreadNetwork
- * @param operationalDataset OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
-
-/** @brief Command description for AddThreadNetworkResponse
- *
- * Command: AddThreadNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddThreadNetworkResponse(errorCode, debugText)                                                             \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for UpdateThreadNetwork
- *
- * Command: UpdateThreadNetwork
- * @param operationalDataset OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                             \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
-
-/** @brief Command description for UpdateThreadNetworkResponse
- *
- * Command: UpdateThreadNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateThreadNetworkResponse(errorCode, debugText)                                                          \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for RemoveNetwork
- *
- * Command: RemoveNetwork
- * @param NetworkID OCTET_STRING
- * @param Breadcrumb INT64U
- * @param TimeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterRemoveNetwork(NetworkID, Breadcrumb, TimeoutMs)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_REMOVE_NETWORK_COMMAND_ID, "uuu", NetworkID, Breadcrumb, TimeoutMs);
-
-/** @brief Command description for RemoveNetworkResponse
- *
- * Command: RemoveNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterRemoveNetworkResponse(errorCode, debugText)                                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for EnableNetwork
- *
- * Command: EnableNetwork
- * @param networkID OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterEnableNetwork(networkID, breadcrumb, timeoutMs)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ENABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
-
-/** @brief Command description for EnableNetworkResponse
- *
- * Command: EnableNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterEnableNetworkResponse(errorCode, debugText)                                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for DisableNetwork
- *
- * Command: DisableNetwork
- * @param networkID OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterDisableNetwork(networkID, breadcrumb, timeoutMs)                                                           \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_DISABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
-
-/** @brief Command description for DisableNetworkResponse
- *
- * Command: DisableNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterDisableNetworkResponse(errorCode, debugText)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for GetLastNetworkCommissioningResult
- *
- * Command: GetLastNetworkCommissioningResult
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterGetLastNetworkCommissioningResult(timeoutMs)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID, "u", timeoutMs);
-
 /** @brief Command description for Bind
  *
  * Command: Bind
index d77da91..add8f83 100644 (file)
@@ -86,6 +86,9 @@
 // Definitions for cluster: General Commissioning
 #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030)
 
+// Definitions for cluster: Network Commissioning
+#define ZCL_NETWORK_COMMISSIONING_CLUSTER_ID (0x0031)
+
 // Definitions for cluster: Shade Configuration
 #define ZCL_SHADE_CONFIG_CLUSTER_ID (0x0100)
 
 // Definitions for cluster: ZLL Commissioning
 #define ZCL_ZLL_COMMISSIONING_CLUSTER_ID (0x1000)
 
-// Definitions for cluster: Network Commissioning
-#define ZCL_NETWORK_COMMISSIONING_CLUSTER_ID (0xAAAA)
-
 // Definitions for cluster: Binding
 #define ZCL_BINDING_CLUSTER_ID (0xF000)
 
index adc2b1c..864943b 100644 (file)
 #define ZCL_COMMISSIONING_COMPLETE_COMMAND_ID (0x06)
 #define ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID (0x07)
 
+// Commands for cluster: Network Commissioning
+#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00)
+#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01)
+#define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
+#define ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x03)
+#define ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x04)
+#define ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x05)
+#define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
+#define ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x07)
+#define ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID (0x08)
+#define ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x09)
+#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x0A)
+#define ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID (0x0B)
+#define ZCL_ENABLE_NETWORK_COMMAND_ID (0x0C)
+#define ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID (0x0D)
+#define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
+#define ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID (0x0F)
+#define ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID (0x10)
+
 // Commands for cluster: Door Lock
 #define ZCL_LOCK_DOOR_COMMAND_ID (0x00)
 #define ZCL_LOCK_DOOR_RESPONSE_COMMAND_ID (0x00)
 #define ZCL_GET_ENDPOINT_LIST_REQUEST_COMMAND_ID (0x42)
 #define ZCL_GET_ENDPOINT_LIST_RESPONSE_COMMAND_ID (0x42)
 
-// Commands for cluster: Network Commissioning
-#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00)
-#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01)
-#define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
-#define ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x03)
-#define ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x04)
-#define ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x05)
-#define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
-#define ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x07)
-#define ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID (0x08)
-#define ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x09)
-#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x0A)
-#define ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID (0x0B)
-#define ZCL_ENABLE_NETWORK_COMMAND_ID (0x0C)
-#define ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID (0x0D)
-#define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
-#define ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID (0x0F)
-#define ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID (0x10)
-
 // Commands for cluster: Binding
 #define ZCL_BIND_COMMAND_ID (0x00)
 #define ZCL_UNBIND_COMMAND_ID (0x01)
index b186045..b797a63 100644 (file)
 
 #define ZAP_ATTRIBUTE_MASK(mask) ATTRIBUTE_MASK_##mask
 // This is an array of EmberAfAttributeMetadata structures.
-#define GENERATED_ATTRIBUTE_COUNT 50
+#define GENERATED_ATTRIBUTE_COUNT 51
 #define GENERATED_ATTRIBUTES                                                                                                       \
     {                                                                                                                              \
-        { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 2 } },         /* On/off (server): cluster revision */                     \
+        { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } },    /* Network Commissioning (server): cluster revision */      \
+            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 2 } },     /* On/off (server): cluster revision */                     \
             { 0x0000, ZAP_TYPE(BOOLEAN), 1, 0, { (uint8_t *) 0x00 } }, /* On/off (server): on/off */                               \
             { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 3 } },     /* Level Control (server): cluster revision */              \
             { 0x0000, ZAP_TYPE(INT8U), 1, 0, { (uint8_t *) 0x00 } },   /* Level Control (server): current level */                 \
     };
 
 #define ZAP_CLUSTER_MASK(mask) CLUSTER_MASK_##mask
-#define GENERATED_CLUSTER_COUNT 8
+#define GENERATED_CLUSTER_COUNT 9
 #define GENERATED_CLUSTERS                                                                                                         \
     {                                                                                                                              \
         {                                                                                                                          \
-            0x0006,                                                                                                                \
-            ZAP_ATTRIBUTE_INDEX(0),                                                                                                \
-            2,                                                                                                                     \
-            3,                                                                                                                     \
-            ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION),                                                            \
-            chipFuncArrayOnOffServer                                                                                               \
-        }, /* Endpoint: 1, Cluster: On/off (server) */                                                                             \
+            0x0031, ZAP_ATTRIBUTE_INDEX(0), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                                   \
+        }, /* Endpoint: 0, Cluster: Network Commissioning (server) */                                                              \
+            { 0x0006,                                                                                                              \
+              ZAP_ATTRIBUTE_INDEX(1),                                                                                              \
+              2,                                                                                                                   \
+              3,                                                                                                                   \
+              ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION),                                                          \
+              chipFuncArrayOnOffServer }, /* Endpoint: 1, Cluster: On/off (server) */                                              \
             { 0x0008,                                                                                                              \
-              ZAP_ATTRIBUTE_INDEX(2),                                                                                              \
+              ZAP_ATTRIBUTE_INDEX(3),                                                                                              \
               2,                                                                                                                   \
               3,                                                                                                                   \
               ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION),                                                          \
               chipFuncArrayLevelControlServer }, /* Endpoint: 1, Cluster: Level Control (server) */                                \
             {                                                                                                                      \
-                0x0028, ZAP_ATTRIBUTE_INDEX(4), 12, 254, ZAP_CLUSTER_MASK(SERVER), NULL                                            \
+                0x0028, ZAP_ATTRIBUTE_INDEX(5), 12, 254, ZAP_CLUSTER_MASK(SERVER), NULL                                            \
             }, /* Endpoint: 1, Cluster: Basic (server) */                                                                          \
             { 0x0006,                                                                                                              \
-              ZAP_ATTRIBUTE_INDEX(16),                                                                                             \
+              ZAP_ATTRIBUTE_INDEX(17),                                                                                             \
               6,                                                                                                                   \
               9,                                                                                                                   \
               ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION),                                                          \
               chipFuncArrayOnOffServer }, /* Endpoint: 2, Cluster: On/off (server) */                                              \
             { 0x0008,                                                                                                              \
-              ZAP_ATTRIBUTE_INDEX(22),                                                                                             \
+              ZAP_ATTRIBUTE_INDEX(23),                                                                                             \
               5,                                                                                                                   \
               7,                                                                                                                   \
               ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION),                                                          \
               chipFuncArrayLevelControlServer }, /* Endpoint: 2, Cluster: Level Control (server) */                                \
             {                                                                                                                      \
-                0x0028, ZAP_ATTRIBUTE_INDEX(27), 12, 254, ZAP_CLUSTER_MASK(SERVER), NULL                                           \
+                0x0028, ZAP_ATTRIBUTE_INDEX(28), 12, 254, ZAP_CLUSTER_MASK(SERVER), NULL                                           \
             }, /* Endpoint: 2, Cluster: Basic (server) */                                                                          \
             { 0x0006,                                                                                                              \
-              ZAP_ATTRIBUTE_INDEX(39),                                                                                             \
+              ZAP_ATTRIBUTE_INDEX(40),                                                                                             \
               6,                                                                                                                   \
               9,                                                                                                                   \
               ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION),                                                          \
               chipFuncArrayOnOffServer }, /* Endpoint: 3, Cluster: On/off (server) */                                              \
             { 0x0008,                                                                                                              \
-              ZAP_ATTRIBUTE_INDEX(45),                                                                                             \
+              ZAP_ATTRIBUTE_INDEX(46),                                                                                             \
               5,                                                                                                                   \
               7,                                                                                                                   \
               ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION),                                                          \
 // This is an array of EmberAfEndpointType structures.
 #define GENERATED_ENDPOINT_TYPES                                                                                                   \
     {                                                                                                                              \
-        { ZAP_CLUSTER_INDEX(0), 0, 0 }, { ZAP_CLUSTER_INDEX(0), 3, 260 }, { ZAP_CLUSTER_INDEX(3), 3, 270 },                        \
-            { ZAP_CLUSTER_INDEX(6), 2, 16 },                                                                                       \
+        { ZAP_CLUSTER_INDEX(0), 1, 2 }, { ZAP_CLUSTER_INDEX(1), 3, 260 }, { ZAP_CLUSTER_INDEX(4), 3, 270 },                        \
+            { ZAP_CLUSTER_INDEX(7), 2, 16 },                                                                                       \
     }
 
 // Largest attribute size is needed for various buffers
 #define ATTRIBUTE_SINGLETONS_SIZE (508)
 
 // Total size of attribute storage
-#define ATTRIBUTE_MAX_SIZE (546)
+#define ATTRIBUTE_MAX_SIZE (548)
 
 // Number of fixed endpoints
 #define FIXED_ENDPOINT_COUNT (4)
 
 // Array of EmberAfCommandMetadata structs.
 #define ZAP_COMMAND_MASK(mask) COMMAND_MASK_##mask
-#define EMBER_AF_GENERATED_COMMAND_COUNT (45)
+#define EMBER_AF_GENERATED_COMMAND_COUNT (62)
 #define GENERATED_COMMANDS                                                                                                         \
     {                                                                                                                              \
         { 0x0006, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) },     /* On/off (server): Off */                                        \
             { 0x0028, 0x01, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): ShutDown */                                    \
             { 0x0028, 0x02, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): Leave */                                       \
             { 0x0028, 0x02, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): Leave */                                       \
+            { 0x0031, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): ScanNetworks */                \
+            { 0x0031, 0x01, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): ScanNetworksResponse */        \
+            { 0x0031, 0x02, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): AddWiFiNetwork */              \
+            { 0x0031, 0x03, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): AddWiFiNetworkResponse */      \
+            { 0x0031, 0x04, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): UpdateWiFiNetwork */           \
+            { 0x0031, 0x05, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): UpdateWiFiNetworkResponse */   \
+            { 0x0031, 0x06, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): AddThreadNetwork */            \
+            { 0x0031, 0x07, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): AddThreadNetworkResponse */    \
+            { 0x0031, 0x08, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): UpdateThreadNetwork */         \
+            { 0x0031, 0x09, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): UpdateThreadNetworkResponse */ \
+            { 0x0031, 0x0A, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): RemoveNetwork */               \
+            { 0x0031, 0x0B, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): RemoveNetworkResponse */       \
+            { 0x0031, 0x0C, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): EnableNetwork */               \
+            { 0x0031, 0x0D, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): EnableNetworkResponse */       \
+            { 0x0031, 0x0E, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): DisableNetwork */              \
+            { 0x0031, 0x0F, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): DisableNetworkResponse */      \
+            { 0x0031, 0x10,                                                                                                        \
+              ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): GetLastNetworkCommissioningResult */         \
     }
 
 // Array of EmberAfManufacturerCodeEntry structures for commands.
index 3f145a5..d5a4494 100644 (file)
@@ -31,6 +31,7 @@
 /**** Cluster endpoint counts ****/
 #define EMBER_AF_BASIC_CLUSTER_SERVER_ENDPOINT_COUNT (2)
 #define EMBER_AF_LEVEL_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (3)
+#define EMBER_AF_NETWORK_COMMISSIONING_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_ON_OFF_CLUSTER_SERVER_ENDPOINT_COUNT (3)
 
 /**** Cluster Plugins ****/
 #define EMBER_AF_PLUGIN_LEVEL_CONTROL_MINIMUM_LEVEL 0
 #define EMBER_AF_PLUGIN_LEVEL_CONTROL_RATE 0
 
+// Use this macro to check if the server side of the Network Commissioning cluster is included
+#define ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER
+#define EMBER_AF_PLUGIN_NETWORK_COMMISSIONING_SERVER
+#define EMBER_AF_PLUGIN_NETWORK_COMMISSIONING
+
 // Use this macro to check if the server side of the On/off cluster is included
 #define ZCL_USING_ON_OFF_CLUSTER_SERVER
 #define EMBER_AF_PLUGIN_ON_OFF_SERVER
index bd08d38..8c737e9 100644 (file)
 #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER
 #endif
 
+#if defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_CLIENT)
+#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER { ZCL_NETWORK_COMMISSIONING_CLUSTER_ID, 49, "Network Commissioning" },
+#else
+#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER
+#endif
+
 #if defined(ZCL_USING_SHADE_CONFIG_CLUSTER_SERVER) || defined(ZCL_USING_SHADE_CONFIG_CLUSTER_CLIENT)
 #define CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER { ZCL_SHADE_CONFIG_CLUSTER_ID, 256, "Shade Configuration" },
 #else
 #define CHIP_PRINTCLUSTER_ZLL_COMMISSIONING_CLUSTER
 #endif
 
-#if defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_CLIENT)
-#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER { ZCL_NETWORK_COMMISSIONING_CLUSTER_ID, 43690, "Network Commissioning" },
-#else
-#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER
-#endif
-
 #if defined(ZCL_USING_BINDING_CLUSTER_SERVER) || defined(ZCL_USING_BINDING_CLUSTER_CLIENT)
 #define CHIP_PRINTCLUSTER_BINDING_CLUSTER { ZCL_BINDING_CLUSTER_ID, 61440, "Binding" },
 #else
     CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER                                                                                            \
     CHIP_PRINTCLUSTER_BASIC_CLUSTER                                                                                                \
     CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER                                                                                \
+    CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER                                                                                \
     CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER                                                                                         \
     CHIP_PRINTCLUSTER_DOOR_LOCK_CLUSTER                                                                                            \
     CHIP_PRINTCLUSTER_WINDOW_COVERING_CLUSTER                                                                                      \
     CHIP_PRINTCLUSTER_ELECTRICAL_MEASUREMENT_CLUSTER                                                                               \
     CHIP_PRINTCLUSTER_DIAGNOSTICS_CLUSTER                                                                                          \
     CHIP_PRINTCLUSTER_ZLL_COMMISSIONING_CLUSTER                                                                                    \
-    CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER                                                                                \
     CHIP_PRINTCLUSTER_BINDING_CLUSTER                                                                                              \
     CHIP_PRINTCLUSTER_MEDIA_PLAYBACK_CLUSTER                                                                                       \
     CHIP_PRINTCLUSTER_CONTENT_LAUNCH_CLUSTER                                                                                       \
index 1ae0466..2170fd3 100644 (file)
@@ -53,11 +53,11 @@ exit:
     return err;
 }
 
-void PersistentStorage::SetDelegate(PersistentStorageResultDelegate * delegate) {}
+void PersistentStorage::SetStorageDelegate(PersistentStorageResultDelegate * delegate) {}
 
-void PersistentStorage::GetKeyValue(const char * key) {}
+void PersistentStorage::AsyncGetKeyValue(const char * key) {}
 
-CHIP_ERROR PersistentStorage::GetKeyValue(const char * key, char * value, uint16_t & size)
+CHIP_ERROR PersistentStorage::SyncGetKeyValue(const char * key, char * value, uint16_t & size)
 {
     CHIP_ERROR err = CHIP_NO_ERROR;
     std::string iniValue;
@@ -79,7 +79,7 @@ exit:
     return err;
 }
 
-void PersistentStorage::SetKeyValue(const char * key, const char * value)
+void PersistentStorage::AsyncSetKeyValue(const char * key, const char * value)
 {
     auto section = mConfig.sections[kDefaultSectionName];
     section[key] = std::string(value);
@@ -88,7 +88,7 @@ void PersistentStorage::SetKeyValue(const char * key, const char * value)
     CommitConfig();
 }
 
-void PersistentStorage::DeleteKeyValue(const char * key)
+void PersistentStorage::AsyncDeleteKeyValue(const char * key)
 {
     auto section = mConfig.sections[kDefaultSectionName];
     section.erase(key);
@@ -126,7 +126,7 @@ uint16_t PersistentStorage::GetListenPort()
 
     char value[6];
     uint16_t size = static_cast<uint16_t>(sizeof(value));
-    err           = GetKeyValue(kPortKey, value, size);
+    err           = SyncGetKeyValue(kPortKey, value, size);
     if (CHIP_NO_ERROR == err)
     {
         uint16_t tmpValue;
@@ -148,7 +148,7 @@ LogCategory PersistentStorage::GetLoggingLevel()
 
     char value[9];
     uint16_t size = static_cast<uint16_t>(sizeof(value));
-    err           = GetKeyValue(kLoggingKey, value, size);
+    err           = SyncGetKeyValue(kLoggingKey, value, size);
     if (CHIP_NO_ERROR == err)
     {
         if (strcasecmp(value, "none") == 0)
index edef1cd..85fc73f 100644 (file)
@@ -28,11 +28,11 @@ public:
     CHIP_ERROR Init();
 
     /////////// PersistentStorageDelegate Interface /////////
-    void SetDelegate(chip::PersistentStorageResultDelegate * delegate) override;
-    void GetKeyValue(const char * key) override;
-    CHIP_ERROR GetKeyValue(const char * key, char * value, uint16_t & size) override;
-    void SetKeyValue(const char * key, const char * value) override;
-    void DeleteKeyValue(const char * key) override;
+    void SetStorageDelegate(chip::PersistentStorageResultDelegate * delegate) override;
+    void AsyncGetKeyValue(const char * key) override;
+    CHIP_ERROR SyncGetKeyValue(const char * key, char * value, uint16_t & size) override;
+    void AsyncSetKeyValue(const char * key, const char * value) override;
+    void AsyncDeleteKeyValue(const char * key) override;
 
     uint16_t GetListenPort();
     chip::Logging::LogCategory GetLoggingLevel();
index cd60722..f256509 100644 (file)
@@ -21,7 +21,7 @@
 
 #import "CHIPDevice.h"
 #import "CHIPDevice_Internal.h"
-#import "ChipError.h"
+#import "CHIPError.h"
 #import "gen/CHIPClientCallbacks.h"
 #import "gen/CHIPClustersObjc.h"
 
@@ -292,6 +292,38 @@ private:
     bool mKeepAlive;
 };
 
+class CHIPInt64uAttributeCallbackBridge : public Callback::Callback<Int64uAttributeCallback> {
+public:
+    CHIPInt64uAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
+        : Callback::Callback<Int64uAttributeCallback>(CallbackFn, this)
+        , mHandler(handler)
+        , mQueue(queue)
+        , mKeepAlive(keepAlive)
+    {
+    }
+
+    ~CHIPInt64uAttributeCallbackBridge() {};
+
+    static void CallbackFn(void * context, uint64_t value)
+    {
+        CHIPInt64uAttributeCallbackBridge * callback = reinterpret_cast<CHIPInt64uAttributeCallbackBridge *>(context);
+        if (callback && callback->mQueue) {
+            dispatch_async(callback->mQueue, ^{
+                callback->mHandler(nil, @ { @"value" : [NSNumber numberWithUnsignedLongLong:value] });
+                if (!callback->mKeepAlive) {
+                    callback->Cancel();
+                    delete callback;
+                }
+            });
+        }
+    };
+
+private:
+    ResponseHandler mHandler;
+    dispatch_queue_t mQueue;
+    bool mKeepAlive;
+};
+
 class CHIPInt16sAttributeCallbackBridge : public Callback::Callback<Int16sAttributeCallback> {
 public:
     CHIPInt16sAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
index 8c8757f..72a0198 100644 (file)
 #define ZCL_FABRIC_ID_ATTRIBUTE_ID (0x0000)
 #define ZCL_BREADCRUMB_ATTRIBUTE_ID (0x0001)
 
+// Attribute ids for cluster: Network Commissioning
+
+// Client attributes
+
+// Server attributes
+
 // Attribute ids for cluster: Shade Configuration
 
 // Client attributes
 
 // Server attributes
 
-// Attribute ids for cluster: Network Commissioning
-
-// Client attributes
-
-// Server attributes
-
 // Attribute ids for cluster: Binding
 
 // Client attributes
index f72c96f..79d1e15 100644 (file)
                                                                                                                                    \
                                   ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
 
+/** @brief Command description for ScanNetworks
+ *
+ * Command: ScanNetworks
+ * @param ssid OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterScanNetworks(ssid, breadcrumb, timeoutMs)                                                                  \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_SCAN_NETWORKS_COMMAND_ID, "uuu", ssid, breadcrumb, timeoutMs);
+
+/** @brief Command description for ScanNetworksResponse
+ *
+ * Command: ScanNetworksResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ * @param wifiScanResults WiFiInterfaceScanResult []
+ * @param wifiScanResultsLen int
+ * @param threadScanResults ThreadInterfaceScanResult []
+ * @param threadScanResultsLen int
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterScanNetworksResponse(errorCode, debugText, wifiScanResults, wifiScanResultsLen, threadScanResults,         \
+                                             threadScanResultsLen)                                                                 \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID, "uubb", errorCode, debugText, wifiScanResults,            \
+                                  wifiScanResultsLen, threadScanResults, threadScanResultsLen);
+
+/** @brief Command description for AddWiFiNetwork
+ *
+ * Command: AddWiFiNetwork
+ * @param ssid OCTET_STRING
+ * @param credentials OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                   \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
+
+/** @brief Command description for AddWiFiNetworkResponse
+ *
+ * Command: AddWiFiNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddWiFiNetworkResponse(errorCode, debugText)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for UpdateWiFiNetwork
+ *
+ * Command: UpdateWiFiNetwork
+ * @param ssid OCTET_STRING
+ * @param credentials OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
+
+/** @brief Command description for UpdateWiFiNetworkResponse
+ *
+ * Command: UpdateWiFiNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateWiFiNetworkResponse(errorCode, debugText)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for AddThreadNetwork
+ *
+ * Command: AddThreadNetwork
+ * @param operationalDataset OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
+
+/** @brief Command description for AddThreadNetworkResponse
+ *
+ * Command: AddThreadNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddThreadNetworkResponse(errorCode, debugText)                                                             \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for UpdateThreadNetwork
+ *
+ * Command: UpdateThreadNetwork
+ * @param operationalDataset OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                             \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
+
+/** @brief Command description for UpdateThreadNetworkResponse
+ *
+ * Command: UpdateThreadNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateThreadNetworkResponse(errorCode, debugText)                                                          \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for RemoveNetwork
+ *
+ * Command: RemoveNetwork
+ * @param NetworkID OCTET_STRING
+ * @param Breadcrumb INT64U
+ * @param TimeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterRemoveNetwork(NetworkID, Breadcrumb, TimeoutMs)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_REMOVE_NETWORK_COMMAND_ID, "uuu", NetworkID, Breadcrumb, TimeoutMs);
+
+/** @brief Command description for RemoveNetworkResponse
+ *
+ * Command: RemoveNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterRemoveNetworkResponse(errorCode, debugText)                                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for EnableNetwork
+ *
+ * Command: EnableNetwork
+ * @param networkID OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterEnableNetwork(networkID, breadcrumb, timeoutMs)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ENABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
+
+/** @brief Command description for EnableNetworkResponse
+ *
+ * Command: EnableNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterEnableNetworkResponse(errorCode, debugText)                                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for DisableNetwork
+ *
+ * Command: DisableNetwork
+ * @param networkID OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterDisableNetwork(networkID, breadcrumb, timeoutMs)                                                           \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_DISABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
+
+/** @brief Command description for DisableNetworkResponse
+ *
+ * Command: DisableNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterDisableNetworkResponse(errorCode, debugText)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for GetLastNetworkCommissioningResult
+ *
+ * Command: GetLastNetworkCommissioningResult
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterGetLastNetworkCommissioningResult(timeoutMs)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID, "u", timeoutMs);
+
 /** @brief Command description for LockDoor
  *
  * Command: LockDoor
                                   ZCL_GET_ENDPOINT_LIST_REQUEST_COMMAND_ID, "uuuub", startIndex, total, startIndex, count,         \
                                   endpointInformationRecordList, endpointInformationRecordListLen);
 
-/** @brief Command description for ScanNetworks
- *
- * Command: ScanNetworks
- * @param ssid OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterScanNetworks(ssid, breadcrumb, timeoutMs)                                                                  \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_SCAN_NETWORKS_COMMAND_ID, "uuu", ssid, breadcrumb, timeoutMs);
-
-/** @brief Command description for ScanNetworksResponse
- *
- * Command: ScanNetworksResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- * @param wifiScanResults WiFiInterfaceScanResult []
- * @param wifiScanResultsLen int
- * @param threadScanResults ThreadInterfaceScanResult []
- * @param threadScanResultsLen int
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterScanNetworksResponse(errorCode, debugText, wifiScanResults, wifiScanResultsLen, threadScanResults,         \
-                                             threadScanResultsLen)                                                                 \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID, "uubb", errorCode, debugText, wifiScanResults,            \
-                                  wifiScanResultsLen, threadScanResults, threadScanResultsLen);
-
-/** @brief Command description for AddWiFiNetwork
- *
- * Command: AddWiFiNetwork
- * @param ssid OCTET_STRING
- * @param credentials OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                   \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
-
-/** @brief Command description for AddWiFiNetworkResponse
- *
- * Command: AddWiFiNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddWiFiNetworkResponse(errorCode, debugText)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for UpdateWiFiNetwork
- *
- * Command: UpdateWiFiNetwork
- * @param ssid OCTET_STRING
- * @param credentials OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
-
-/** @brief Command description for UpdateWiFiNetworkResponse
- *
- * Command: UpdateWiFiNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateWiFiNetworkResponse(errorCode, debugText)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for AddThreadNetwork
- *
- * Command: AddThreadNetwork
- * @param operationalDataset OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
-
-/** @brief Command description for AddThreadNetworkResponse
- *
- * Command: AddThreadNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddThreadNetworkResponse(errorCode, debugText)                                                             \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for UpdateThreadNetwork
- *
- * Command: UpdateThreadNetwork
- * @param operationalDataset OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                             \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
-
-/** @brief Command description for UpdateThreadNetworkResponse
- *
- * Command: UpdateThreadNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateThreadNetworkResponse(errorCode, debugText)                                                          \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for RemoveNetwork
- *
- * Command: RemoveNetwork
- * @param NetworkID OCTET_STRING
- * @param Breadcrumb INT64U
- * @param TimeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterRemoveNetwork(NetworkID, Breadcrumb, TimeoutMs)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_REMOVE_NETWORK_COMMAND_ID, "uuu", NetworkID, Breadcrumb, TimeoutMs);
-
-/** @brief Command description for RemoveNetworkResponse
- *
- * Command: RemoveNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterRemoveNetworkResponse(errorCode, debugText)                                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for EnableNetwork
- *
- * Command: EnableNetwork
- * @param networkID OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterEnableNetwork(networkID, breadcrumb, timeoutMs)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ENABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
-
-/** @brief Command description for EnableNetworkResponse
- *
- * Command: EnableNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterEnableNetworkResponse(errorCode, debugText)                                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for DisableNetwork
- *
- * Command: DisableNetwork
- * @param networkID OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterDisableNetwork(networkID, breadcrumb, timeoutMs)                                                           \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_DISABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
-
-/** @brief Command description for DisableNetworkResponse
- *
- * Command: DisableNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterDisableNetworkResponse(errorCode, debugText)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for GetLastNetworkCommissioningResult
- *
- * Command: GetLastNetworkCommissioningResult
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterGetLastNetworkCommissioningResult(timeoutMs)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID, "u", timeoutMs);
-
 /** @brief Command description for Bind
  *
  * Command: Bind
index d77da91..add8f83 100644 (file)
@@ -86,6 +86,9 @@
 // Definitions for cluster: General Commissioning
 #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030)
 
+// Definitions for cluster: Network Commissioning
+#define ZCL_NETWORK_COMMISSIONING_CLUSTER_ID (0x0031)
+
 // Definitions for cluster: Shade Configuration
 #define ZCL_SHADE_CONFIG_CLUSTER_ID (0x0100)
 
 // Definitions for cluster: ZLL Commissioning
 #define ZCL_ZLL_COMMISSIONING_CLUSTER_ID (0x1000)
 
-// Definitions for cluster: Network Commissioning
-#define ZCL_NETWORK_COMMISSIONING_CLUSTER_ID (0xAAAA)
-
 // Definitions for cluster: Binding
 #define ZCL_BINDING_CLUSTER_ID (0xF000)
 
index adc2b1c..864943b 100644 (file)
 #define ZCL_COMMISSIONING_COMPLETE_COMMAND_ID (0x06)
 #define ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID (0x07)
 
+// Commands for cluster: Network Commissioning
+#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00)
+#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01)
+#define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
+#define ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x03)
+#define ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x04)
+#define ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x05)
+#define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
+#define ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x07)
+#define ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID (0x08)
+#define ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x09)
+#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x0A)
+#define ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID (0x0B)
+#define ZCL_ENABLE_NETWORK_COMMAND_ID (0x0C)
+#define ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID (0x0D)
+#define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
+#define ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID (0x0F)
+#define ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID (0x10)
+
 // Commands for cluster: Door Lock
 #define ZCL_LOCK_DOOR_COMMAND_ID (0x00)
 #define ZCL_LOCK_DOOR_RESPONSE_COMMAND_ID (0x00)
 #define ZCL_GET_ENDPOINT_LIST_REQUEST_COMMAND_ID (0x42)
 #define ZCL_GET_ENDPOINT_LIST_RESPONSE_COMMAND_ID (0x42)
 
-// Commands for cluster: Network Commissioning
-#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00)
-#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01)
-#define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
-#define ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x03)
-#define ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x04)
-#define ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x05)
-#define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
-#define ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x07)
-#define ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID (0x08)
-#define ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x09)
-#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x0A)
-#define ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID (0x0B)
-#define ZCL_ENABLE_NETWORK_COMMAND_ID (0x0C)
-#define ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID (0x0D)
-#define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
-#define ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID (0x0F)
-#define ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID (0x10)
-
 // Commands for cluster: Binding
 #define ZCL_BIND_COMMAND_ID (0x00)
 #define ZCL_UNBIND_COMMAND_ID (0x01)
index bd08d38..8c737e9 100644 (file)
 #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER
 #endif
 
+#if defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_CLIENT)
+#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER { ZCL_NETWORK_COMMISSIONING_CLUSTER_ID, 49, "Network Commissioning" },
+#else
+#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER
+#endif
+
 #if defined(ZCL_USING_SHADE_CONFIG_CLUSTER_SERVER) || defined(ZCL_USING_SHADE_CONFIG_CLUSTER_CLIENT)
 #define CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER { ZCL_SHADE_CONFIG_CLUSTER_ID, 256, "Shade Configuration" },
 #else
 #define CHIP_PRINTCLUSTER_ZLL_COMMISSIONING_CLUSTER
 #endif
 
-#if defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_CLIENT)
-#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER { ZCL_NETWORK_COMMISSIONING_CLUSTER_ID, 43690, "Network Commissioning" },
-#else
-#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER
-#endif
-
 #if defined(ZCL_USING_BINDING_CLUSTER_SERVER) || defined(ZCL_USING_BINDING_CLUSTER_CLIENT)
 #define CHIP_PRINTCLUSTER_BINDING_CLUSTER { ZCL_BINDING_CLUSTER_ID, 61440, "Binding" },
 #else
     CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER                                                                                            \
     CHIP_PRINTCLUSTER_BASIC_CLUSTER                                                                                                \
     CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER                                                                                \
+    CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER                                                                                \
     CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER                                                                                         \
     CHIP_PRINTCLUSTER_DOOR_LOCK_CLUSTER                                                                                            \
     CHIP_PRINTCLUSTER_WINDOW_COVERING_CLUSTER                                                                                      \
     CHIP_PRINTCLUSTER_ELECTRICAL_MEASUREMENT_CLUSTER                                                                               \
     CHIP_PRINTCLUSTER_DIAGNOSTICS_CLUSTER                                                                                          \
     CHIP_PRINTCLUSTER_ZLL_COMMISSIONING_CLUSTER                                                                                    \
-    CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER                                                                                \
     CHIP_PRINTCLUSTER_BINDING_CLUSTER                                                                                              \
     CHIP_PRINTCLUSTER_MEDIA_PLAYBACK_CLUSTER                                                                                       \
     CHIP_PRINTCLUSTER_CONTENT_LAUNCH_CLUSTER                                                                                       \
index 8c1599e..212a349 100644 (file)
@@ -47,7 +47,7 @@
 
 #define FACTORY_RESET_TRIGGER_TIMEOUT 3000
 #define FACTORY_RESET_CANCEL_WINDOW_TIMEOUT 3000
-#define APP_TASK_STACK_SIZE (4096)
+#define APP_TASK_STACK_SIZE (2048)
 #define APP_TASK_PRIORITY 2
 #define APP_EVENT_QUEUE_SIZE 10
 #define EXAMPLE_VENDOR_ID 0xcafe
diff --git a/examples/lighting-app/k32w/.gn b/examples/lighting-app/k32w/.gn
new file mode 100644 (file)
index 0000000..3d48789
--- /dev/null
@@ -0,0 +1,28 @@
+# 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")
+
+# The location of the build configuration file.
+buildconfig = "${build_root}/config/BUILDCONFIG.gn"
+
+# CHIP uses angle bracket includes.
+check_system_includes = true
+
+default_args = {
+  target_cpu = "arm"
+  target_os = "freertos"
+
+  import("//args.gni")
+}
diff --git a/examples/lighting-app/k32w/BUILD.gn b/examples/lighting-app/k32w/BUILD.gn
new file mode 100644 (file)
index 0000000..53eb8fa
--- /dev/null
@@ -0,0 +1,95 @@
+# Copyright (c) 2021 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build_overrides/chip.gni")
+import("//build_overrides/k32w_sdk.gni")
+import("//build_overrides/openthread.gni")
+
+import("${k32w_sdk_build_root}/k32w_executable.gni")
+import("${k32w_sdk_build_root}/k32w_sdk.gni")
+
+assert(current_os == "freertos")
+
+k32w_platform_dir = "${chip_root}/examples/platform/k32w"
+
+k32w_sdk("sdk") {
+  include_dirs = [
+    "main/include",
+    "main",
+    "${k32w_platform_dir}/app/project_include",
+    "${k32w_platform_dir}/app/support",
+    "${chip_root}/examples/lighting-app/lighting-common",
+    "${chip_root}/src/app/util",
+    "${chip_root}/src/app/server",
+    "${k32w_platform_dir}/util/include",
+  ]
+
+  sources = [
+    "${k32w_platform_dir}/app/project_include/CHIPProjectConfig.h",
+    "${k32w_platform_dir}/app/project_include/FreeRTOSConfig.h",
+    "${k32w_platform_dir}/app/project_include/OpenThreadConfig.h",
+    "main/include/app_config.h",
+  ]
+
+  public_deps =
+      [ "${chip_root}/third_party/openthread/platforms:libopenthread-platform" ]
+
+  defines = []
+  if (is_debug) {
+    defines += [ "BUILD_RELEASE=0" ]
+  } else {
+    defines += [ "BUILD_RELEASE=1" ]
+  }
+}
+
+k32w_executable("light_app") {
+  output_name = "chip-k32w061-light-example"
+
+  sources = [
+    "${k32w_platform_dir}/util/LEDWidget.cpp",
+    "${k32w_platform_dir}/util/include/LEDWidget.h",
+    "main/AppTask.cpp",
+    "main/LightingManager.cpp",
+    "main/ZclCallbacks.cpp",
+    "main/include/AppEvent.h",
+    "main/include/AppTask.h",
+    "main/include/LightingManager.h",
+    "main/main.cpp",
+  ]
+
+  deps = [
+    ":sdk",
+    "${chip_root}/examples/common/QRCode",
+    "${chip_root}/examples/lighting-app/lighting-common",
+    "${chip_root}/src/lib",
+    "${chip_root}/third_party/mbedtls:mbedtls",
+    "${k32w_platform_dir}/app/support:freertos_mbedtls_utils",
+    "${openthread_root}:libopenthread-cli-ftd",
+    "${openthread_root}:libopenthread-ftd",
+  ]
+
+  output_dir = root_out_dir
+
+  ldscript = "${k32w_platform_dir}/app/ldscripts/chip-k32w061-linker.ld"
+
+  ldflags = [ "-T" + rebase_path(ldscript, root_build_dir) ]
+}
+
+group("k32w") {
+  deps = [ ":light_app" ]
+}
+
+group("default") {
+  deps = [ ":k32w" ]
+}
diff --git a/examples/lighting-app/k32w/README.md b/examples/lighting-app/k32w/README.md
new file mode 100644 (file)
index 0000000..a7ef3fa
--- /dev/null
@@ -0,0 +1,186 @@
+# CHIP K32W061 Lighting Example Application
+
+The Project CHIP K32W061 Lighting Example demonstrates how to remotely control a
+light bulb. The light bulb is simulated using one of the LEDs from the expansion
+board. It uses buttons to test turn on/turn off of the light bulb. You can use
+this example as a reference for creating your own application.
+
+The example is based on
+[Project CHIP](https://github.com/project-chip/connectedhomeip) and the NXP K32W
+SDK, and supports remote access and control of a light bulb over a low-power,
+802.15.4 Thread network.
+
+The example behaves as a Project CHIP accessory, that is a device that can be
+paired into an existing Project CHIP network and can be controlled by this
+network.
+
+<hr>
+
+-   [CHIP K32W Lighting Example Application](#chip-k32w-lighting-example-application) -
+-   [Introduction](#introduction)
+    -   [Bluetooth LE Advertising](#bluetooth-le-advertising)
+    -   [Bluetooth LE Rendezvous](#bluetooth-le-rendezvous)
+-   [Device UI](#device-ui)
+-   [Building](#building)
+-   [Flashing and debugging](#flashdebug)
+-   [Testing the example](#testing-the-example)
+
+<hr>
+
+<a name="intro"></a>
+
+## Introduction
+
+![K32W061 DK6](../../platform/k32w/doc/images/k32w-dk6.jpg)
+
+The K32W lighting example application provides a working demonstration of a
+light bulb device, built using the Project CHIP codebase and the NXP K32W061
+SDK. The example supports remote access (e.g.: using CHIP Tool from a mobile
+phone) and control of a light bulb over a low-power, 802.15.4 Thread network. It
+is capable of being paired into an existing Project CHIP network along with
+other Project CHIP-enabled devices.
+
+The example targets the
+[NXP K32W061 DK6](https://www.nxp.com/products/wireless/thread/k32w061-41-high-performance-secure-and-ultra-low-power-mcu-for-zigbeethread-and-bluetooth-le-5-0-with-built-in-nfc-option:K32W061_41)
+development kit, but is readily adaptable to other K32W-based hardware.
+
+The CHIP device that runs the lighting application is controlled by the CHIP
+controller device over the Thread protocol. By default, the CHIP device has
+Thread disabled, and it should be paired over Bluetooth LE with the CHIP
+controller and obtain configuration from it. The actions required before
+establishing full communication are described below.
+
+The example also comes with a test mode, which allows to start Thread with the
+default settings by pressing a button. However, this mode does not guarantee
+that the device will be able to communicate with the CHIP controller and other
+devices.
+
+### Bluetooth LE Advertising
+
+In this example, to commission the device onto a Project CHIP network, it must
+be discoverable over Bluetooth LE. Bluetooth LE advertising is started
+automatically when the device is powered up.
+
+### Bluetooth LE Rendezvous
+
+In this example, the commissioning procedure (called rendezvous) is done over
+Bluetooth LE between a CHIP device and the CHIP controller, where the controller
+has the commissioner role.
+
+To start the rendezvous, the controller must get the commissioning information
+from the CHIP device. The data payload is encoded within a QR code, printed to
+the UART console.
+
+### Thread Provisioning
+
+Last part of the rendezvous procedure, the provisioning operation involves
+sending the Thread network credentials from the CHIP controller to the CHIP
+device. As a result, device is able to join the Thread network and communicate
+with other Thread devices in the network.
+
+## Device UI
+
+The example application provides a simple UI that depicts the state of the
+device and offers basic user control. This UI is implemented via the
+general-purpose LEDs and buttons built in to the OM15082 Expansion board
+attached to the DK6 board.
+
+**LED D2** shows the overall state of the device and its connectivity. Four
+states are depicted:
+
+-   _Short Flash On (50ms on/950ms off)_ &mdash; The device is in an
+    unprovisioned (unpaired) state and is waiting for a commissioning
+    application to connect.
+
+*   _Rapid Even Flashing (100ms on/100ms off)_ &mdash; The device is in an
+    unprovisioned state and a commissioning application is connected via BLE.
+
+-   _Short Flash Off (950ms on/50ms off)_ &mdash; The device is full
+    provisioned, but does not yet have full network (Thread) or service
+    connectivity.
+
+*   _Solid On_ &mdash; The device is fully provisioned and has full network and
+    service connectivity.
+
+**LED D3** shows the state of the simulated light bulb. When the LED is lit the
+light bulb is on; when not lit, the light bulb is off.
+
+**Button SW2** can be used to change the state of the simulated light bulb. This
+can be used to mimic a user manually operating a switch. The button behaves as a
+toggle, swapping the state every time it is pressed.
+
+**Button SW3** can be used to reset the device to a default state. Pressing and
+holding Button SW3 for 6 seconds initiates a factory reset. After an initial
+period of 3 seconds, LED2 D2 and D3 will flash in unison to signal the pending
+reset. Holding the button past 6 seconds will cause the device to reset its
+persistent configuration and initiate a reboot. The reset action can be
+cancelled by releasing the button at any point before the 6 second limit.
+
+**Button SW4** can be used for joining a predefined Thread network advertised by
+a Border Router. Default parameters for a Thread network are hard-coded and are
+being used if this button is pressed.
+
+The remaining two LEDs (D1/D2) and button (SW1) are unused.
+
+<a name="building"></a>
+
+## Building
+
+In order to build the Project CHIP example, we recommend using a Linux
+distribution (the demo-application was compiled on Ubuntu 20.04).
+
+-   Download [K32W061 SDK 2.6.2 for Project CHIP](https://mcuxpresso.nxp.com/).
+    Creating an nxp.com account is required before being able to download the
+    SDK. Once the account is created, login and follow the steps for downloading
+    SDK_2.6.2_K32W061DK6. The SDK Builder UI selection should be similar with
+    the one from the image below.
+    ![MCUXpresso SDK Download](../../platform/k32w/doc/images/mcux-sdk-download.JPG)
+
+-   Start building the application
+
+```
+user@ubuntu:~/Desktop/git/connectedhomeip$ export K32W061_SDK_ROOT=/home/user/Desktop/SDK_2.6.2_K32W061DK6/
+user@ubuntu:~/Desktop/git/connectedhomeip$ ./third_party/k32w_sdk/mr2_fixes/patch_k32w_mr2_sdk.sh
+user@ubuntu:~/Desktop/git/connectedhomeip$ source ./scripts/activate.sh
+user@ubuntu:~/Desktop/git/connectedhomeip/third_party/openthread/repo$ cd examples/lighting-app/k32w/
+user@ubuntu:~/Desktop/git/connectedhomeip/examples/lighting-app/k32w$ gn gen out/debug --args="k32w_sdk_root=\"${K32W061_SDK_ROOT}\" is_debug=true"
+user@ubuntu:~/Desktop/git/connectedhomeip/examples/lightin-app/k32w$ ninja -C out/debug
+user@ubuntu:~/Desktop/git/connectedhomeip/examples/lighting-app/k32w$ $K32W061_SDK_ROOT/tools/imagetool/sign_images.sh out/debug/
+```
+
+Note that "patch_k32w_mr2_sdk.sh" script must be run for patching the K32W061
+SDK 2.6.2.
+
+In case signing errors are encountered when running the "sign_images.sh" script
+install the recommanded packages (python version > 3, pip3, pycrypto,
+pycryptodome):
+
+```
+user@ubuntu:~$ python3 --version
+Python 3.8.2
+user@ubuntu:~$ pip3 --version
+pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
+user@ubuntu:~$ pip3 list | grep -i pycrypto
+pycrypto               2.6.1
+pycryptodome           3.9.8
+```
+
+The resulting output file can be found in out/debug/chip-k32w061-light-example.
+
+<a name="flashdebug"></a>
+
+## Flashing and debugging
+
+Program the firmware using the official
+[OpenThread Flash Instructions](https://github.com/openthread/openthread/blob/master/examples/platforms/k32w/k32w061/README.md#flash-binaries).
+
+All you have to do is to replace the Openthread binaries from the above
+documentation with _out/debug/chip-k32w061-light-example.bin_ if DK6Programmer
+is used or with _out/debug/chip-k32w061-light-example_ if MCUXpresso is used.
+
+## Testing the example
+
+The app can be deployed against any generic OpenThread Border Router. See the
+guide
+[Commissioning NXP K32W using Android CHIPTool](../../../docs/guides/nxp_k32w_android_commissioning.md)
+for step-by-step instructions.
diff --git a/examples/lighting-app/k32w/args.gni b/examples/lighting-app/k32w/args.gni
new file mode 100644 (file)
index 0000000..0644c7a
--- /dev/null
@@ -0,0 +1,19 @@
+# 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/chip.gni")
+import("${chip_root}/examples/platform/k32w/args.gni")
+
+# SDK target. This is overriden to add our SDK app_config.h & defines.
+k32w_sdk_target = get_label_info(":sdk", "label_no_toolchain")
diff --git a/examples/lighting-app/k32w/build_overrides b/examples/lighting-app/k32w/build_overrides
new file mode 120000 (symlink)
index 0000000..194ee0b
--- /dev/null
@@ -0,0 +1 @@
+../../build_overrides/
\ No newline at end of file
diff --git a/examples/lighting-app/k32w/data.bin b/examples/lighting-app/k32w/data.bin
new file mode 100644 (file)
index 0000000..a7e5277
Binary files /dev/null and b/examples/lighting-app/k32w/data.bin differ
diff --git a/examples/lighting-app/k32w/main/AppTask.cpp b/examples/lighting-app/k32w/main/AppTask.cpp
new file mode 100644 (file)
index 0000000..5b73605
--- /dev/null
@@ -0,0 +1,561 @@
+/*
+ *
+ *    Copyright (c) 2021 Project CHIP Authors
+ *    Copyright (c) 2021 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.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+#include "AppTask.h"
+#include "AppEvent.h"
+#include "Server.h"
+#include "support/ErrorStr.h"
+
+#include "QRCodeUtil.h"
+#include <platform/CHIPDeviceLayer.h>
+#include <platform/internal/DeviceNetworkInfo.h>
+
+#include "attribute-storage.h"
+#include "gen/attribute-id.h"
+#include "gen/attribute-type.h"
+#include "gen/cluster-id.h"
+
+#include "Keyboard.h"
+#include "LED.h"
+#include "LEDWidget.h"
+#include "TimersManager.h"
+#include "app_config.h"
+
+#define FACTORY_RESET_TRIGGER_TIMEOUT 6000
+#define FACTORY_RESET_CANCEL_WINDOW_TIMEOUT 3000
+#define APP_TASK_STACK_SIZE (4096)
+#define APP_TASK_PRIORITY 2
+#define APP_EVENT_QUEUE_SIZE 10
+
+TimerHandle_t sFunctionTimer; // FreeRTOS app sw timer.
+
+static QueueHandle_t sAppEventQueue;
+
+static LEDWidget sStatusLED;
+static LEDWidget sLightLED;
+
+static bool sIsThreadProvisioned     = false;
+static bool sIsThreadEnabled         = false;
+static bool sHaveBLEConnections      = false;
+static bool sHaveServiceConnectivity = false;
+
+static uint32_t eventMask = 0;
+
+using namespace ::chip::DeviceLayer;
+
+AppTask AppTask::sAppTask;
+
+int AppTask::StartAppTask()
+{
+    int err = CHIP_NO_ERROR;
+
+    sAppEventQueue = xQueueCreate(APP_EVENT_QUEUE_SIZE, sizeof(AppEvent));
+    if (sAppEventQueue == NULL)
+    {
+        err = CHIP_ERROR_MAX;
+        K32W_LOG("Failed to allocate app event queue");
+        assert(err == CHIP_NO_ERROR);
+    }
+
+    return err;
+}
+
+int AppTask::Init()
+{
+    CHIP_ERROR err = CHIP_NO_ERROR;
+
+    // Init ZCL Data Model and start server
+    InitServer();
+
+    // QR code will be used with CHIP Tool
+    PrintQRCode(chip::RendezvousInformationFlags::kBLE);
+
+    TMR_Init();
+
+    /* HW init leds */
+    LED_Init();
+
+    /* start with all LEDS turnedd off */
+    sStatusLED.Init(SYSTEM_STATE_LED);
+
+    sLightLED.Init(LIGHT_STATE_LED);
+    sLightLED.Set(LightingMgr().IsTurnedOff());
+
+    /* intialize the Keyboard and button press calback */
+    KBD_Init(KBD_Callback);
+
+    // Create FreeRTOS sw timer for Function Selection.
+    sFunctionTimer = xTimerCreate("FnTmr",          // Just a text name, not used by the RTOS kernel
+                                  1,                // == default timer period (mS)
+                                  false,            // no timer reload (==one-shot)
+                                  (void *) this,    // init timer id = app task obj context
+                                  TimerEventHandler // timer callback handler
+    );
+    if (sFunctionTimer == NULL)
+    {
+        K32W_LOG("app_timer_create() failed");
+        assert(err == CHIP_NO_ERROR);
+    }
+
+    err = LightingMgr().Init();
+    if (err != CHIP_NO_ERROR)
+    {
+        K32W_LOG("LightingMgr().Init() failed");
+        assert(err == CHIP_NO_ERROR);
+    }
+
+    LightingMgr().SetCallbacks(ActionInitiated, ActionCompleted);
+
+    // Print the current software version
+    char currentFirmwareRev[ConfigurationManager::kMaxFirmwareRevisionLength + 1] = { 0 };
+    size_t currentFirmwareRevLen;
+    err = ConfigurationMgr().GetFirmwareRevision(currentFirmwareRev, sizeof(currentFirmwareRev), currentFirmwareRevLen);
+    if (err != CHIP_NO_ERROR)
+    {
+        K32W_LOG("Get version error");
+        assert(err == CHIP_NO_ERROR);
+    }
+
+    K32W_LOG("Current Firmware Version: %s", currentFirmwareRev);
+
+    return err;
+}
+
+void AppTask::AppTaskMain(void * pvParameter)
+{
+    int err;
+    AppEvent event;
+
+    err = sAppTask.Init();
+    if (err != CHIP_NO_ERROR)
+    {
+        K32W_LOG("AppTask.Init() failed");
+        assert(err == CHIP_NO_ERROR);
+    }
+
+    while (true)
+    {
+        BaseType_t eventReceived = xQueueReceive(sAppEventQueue, &event, pdMS_TO_TICKS(10));
+        while (eventReceived == pdTRUE)
+        {
+            sAppTask.DispatchEvent(&event);
+            eventReceived = xQueueReceive(sAppEventQueue, &event, 0);
+        }
+
+        // Collect connectivity and configuration state from the CHIP stack.  Because the
+        // CHIP event loop is being run in a separate task, the stack must be locked
+        // while these values are queried.  However we use a non-blocking lock request
+        // (TryLockChipStack()) to avoid blocking other UI activities when the CHIP
+        // task is busy (e.g. with a long crypto operation).
+        if (PlatformMgr().TryLockChipStack())
+        {
+            sIsThreadProvisioned     = ConnectivityMgr().IsThreadProvisioned();
+            sIsThreadEnabled         = ConnectivityMgr().IsThreadEnabled();
+            sHaveBLEConnections      = (ConnectivityMgr().NumBLEConnections() != 0);
+            sHaveServiceConnectivity = ConnectivityMgr().HaveServiceConnectivity();
+            PlatformMgr().UnlockChipStack();
+        }
+
+        // Update the status LED if factory reset has not been initiated.
+        //
+        // If system has "full connectivity", keep the LED On constantly.
+        //
+        // If thread and service provisioned, but not attached to the thread network yet OR no
+        // connectivity to the service OR subscriptions are not fully established
+        // THEN blink the LED Off for a short period of time.
+        //
+        // If the system has ble connection(s) uptill the stage above, THEN blink the LEDs at an even
+        // rate of 100ms.
+        //
+        // Otherwise, blink the LED ON for a very short time.
+        if (sAppTask.mFunction != kFunction_FactoryReset)
+        {
+            if (sHaveServiceConnectivity)
+            {
+                sStatusLED.Set(true);
+            }
+            else if (sIsThreadProvisioned && sIsThreadEnabled)
+            {
+                sStatusLED.Blink(950, 50);
+            }
+            else if (sHaveBLEConnections)
+            {
+                sStatusLED.Blink(100, 100);
+            }
+            else
+            {
+                sStatusLED.Blink(50, 950);
+            }
+        }
+
+        sStatusLED.Animate();
+        sLightLED.Animate();
+
+        HandleKeyboard();
+    }
+}
+
+void AppTask::ButtonEventHandler(uint8_t pin_no, uint8_t button_action)
+{
+    if ((pin_no != RESET_BUTTON) && (pin_no != LIGHT_BUTTON) && (pin_no != JOIN_BUTTON))
+    {
+        return;
+    }
+
+    AppEvent button_event;
+    button_event.Type               = AppEvent::kEventType_Button;
+    button_event.ButtonEvent.PinNo  = pin_no;
+    button_event.ButtonEvent.Action = button_action;
+
+    if (pin_no == RESET_BUTTON)
+    {
+        button_event.Handler = ResetActionEventHandler;
+    }
+    else if (pin_no == LIGHT_BUTTON)
+    {
+        button_event.Handler = LightActionEventHandler;
+    }
+    else if (pin_no == JOIN_BUTTON)
+    {
+        button_event.Handler = JoinHandler;
+    }
+
+    sAppTask.PostEvent(&button_event);
+}
+
+void AppTask::KBD_Callback(uint8_t events)
+{
+    eventMask = eventMask | (uint32_t)(1 << events);
+}
+
+void AppTask::HandleKeyboard(void)
+{
+    uint8_t keyEvent = 0xFF;
+    uint8_t pos      = 0;
+
+    while (eventMask)
+    {
+        for (pos = 0; pos < (8 * sizeof(eventMask)); pos++)
+        {
+            if (eventMask & (1 << pos))
+            {
+                keyEvent  = pos;
+                eventMask = eventMask & ~(1 << pos);
+                break;
+            }
+        }
+
+        switch (keyEvent)
+        {
+        case gKBD_EventPB1_c:
+            ButtonEventHandler(RESET_BUTTON, RESET_BUTTON_PUSH);
+            break;
+        case gKBD_EventPB2_c:
+            ButtonEventHandler(LIGHT_BUTTON, LIGHT_BUTTON_PUSH);
+            break;
+        case gKBD_EventPB3_c:
+            ButtonEventHandler(JOIN_BUTTON, JOIN_BUTTON_PUSH);
+            break;
+        default:
+            break;
+        }
+    }
+}
+
+void AppTask::TimerEventHandler(TimerHandle_t xTimer)
+{
+    AppEvent event;
+    event.Type               = AppEvent::kEventType_Timer;
+    event.TimerEvent.Context = (void *) xTimer;
+    event.Handler            = FunctionTimerEventHandler;
+    sAppTask.PostEvent(&event);
+}
+
+void AppTask::FunctionTimerEventHandler(AppEvent * aEvent)
+{
+    if (aEvent->Type != AppEvent::kEventType_Timer)
+        return;
+
+    K32W_LOG("Device will factory reset...");
+
+    // Actually trigger Factory Reset
+    ConfigurationMgr().InitiateFactoryReset();
+}
+
+void AppTask::ResetActionEventHandler(AppEvent * aEvent)
+{
+    if (aEvent->ButtonEvent.PinNo != RESET_BUTTON)
+        return;
+
+    if (sAppTask.mResetTimerActive)
+    {
+        sAppTask.CancelTimer();
+        sAppTask.mFunction = kFunction_NoneSelected;
+
+        /* restore initial state for the LED indicating Lighting state */
+        if (LightingMgr().IsTurnedOff())
+        {
+            sLightLED.Set(false);
+        }
+        else
+        {
+            sLightLED.Set(true);
+        }
+
+        K32W_LOG("Factory Reset was cancelled!");
+    }
+    else
+    {
+        uint32_t resetTimeout = FACTORY_RESET_TRIGGER_TIMEOUT;
+
+        if (sAppTask.mFunction != kFunction_NoneSelected)
+        {
+            K32W_LOG("Another function is scheduled. Could not initiate Factory Reset!");
+            return;
+        }
+
+        K32W_LOG("Factory Reset Triggered. Push the RESET button within %u ms to cancel!", resetTimeout);
+        sAppTask.mFunction = kFunction_FactoryReset;
+
+        /* LEDs will start blinking to signal that a Factory Reset was scheduled */
+        sStatusLED.Set(false);
+        sLightLED.Set(false);
+
+        sStatusLED.Blink(500);
+        sLightLED.Blink(500);
+
+        sAppTask.StartTimer(FACTORY_RESET_TRIGGER_TIMEOUT);
+    }
+}
+
+void AppTask::LightActionEventHandler(AppEvent * aEvent)
+{
+    LightingManager::Action_t action;
+    int err        = CHIP_NO_ERROR;
+    int32_t actor  = 0;
+    bool initiated = false;
+
+    if (sAppTask.mFunction != kFunction_NoneSelected)
+    {
+        K32W_LOG("Another function is scheduled. Could not initiate ON/OFF Light command!");
+        return;
+    }
+
+    if (aEvent->Type == AppEvent::kEventType_TurnOn)
+    {
+        action = static_cast<LightingManager::Action_t>(aEvent->LightEvent.Action);
+        actor  = aEvent->LightEvent.Actor;
+    }
+    else if (aEvent->Type == AppEvent::kEventType_Button)
+    {
+        if (LightingMgr().IsTurnedOff())
+        {
+            action = LightingManager::TURNON_ACTION;
+        }
+        else
+        {
+            action = LightingManager::TURNOFF_ACTION;
+        }
+    }
+    else
+    {
+        err = CHIP_ERROR_MAX;
+    }
+
+    if (err == CHIP_NO_ERROR)
+    {
+        initiated = LightingMgr().InitiateAction(actor, action);
+
+        if (!initiated)
+        {
+            K32W_LOG("Action is already in progress or active.");
+        }
+    }
+}
+
+void AppTask::ThreadStart()
+{
+    chip::DeviceLayer::Internal::DeviceNetworkInfo networkInfo;
+
+    memset(networkInfo.ThreadNetworkName, 0, chip::DeviceLayer::Internal::kMaxThreadNetworkNameLength + 1);
+    memcpy(networkInfo.ThreadNetworkName, "OpenThread", 10);
+
+    networkInfo.ThreadExtendedPANId[0] = 0xde;
+    networkInfo.ThreadExtendedPANId[1] = 0xad;
+    networkInfo.ThreadExtendedPANId[2] = 0x00;
+    networkInfo.ThreadExtendedPANId[3] = 0xbe;
+    networkInfo.ThreadExtendedPANId[4] = 0xef;
+    networkInfo.ThreadExtendedPANId[5] = 0x00;
+    networkInfo.ThreadExtendedPANId[6] = 0xca;
+    networkInfo.ThreadExtendedPANId[7] = 0xfe;
+
+    networkInfo.ThreadMasterKey[0]  = 0x00;
+    networkInfo.ThreadMasterKey[1]  = 0x11;
+    networkInfo.ThreadMasterKey[2]  = 0x22;
+    networkInfo.ThreadMasterKey[3]  = 0x33;
+    networkInfo.ThreadMasterKey[4]  = 0x44;
+    networkInfo.ThreadMasterKey[5]  = 0x55;
+    networkInfo.ThreadMasterKey[6]  = 0x66;
+    networkInfo.ThreadMasterKey[7]  = 0x77;
+    networkInfo.ThreadMasterKey[8]  = 0x88;
+    networkInfo.ThreadMasterKey[9]  = 0x99;
+    networkInfo.ThreadMasterKey[10] = 0xAA;
+    networkInfo.ThreadMasterKey[11] = 0xBB;
+    networkInfo.ThreadMasterKey[12] = 0xCC;
+    networkInfo.ThreadMasterKey[13] = 0xDD;
+    networkInfo.ThreadMasterKey[14] = 0xEE;
+    networkInfo.ThreadMasterKey[15] = 0xFF;
+
+    networkInfo.ThreadPANId   = 0xabcd;
+    networkInfo.ThreadChannel = 15;
+
+    networkInfo.FieldPresent.ThreadExtendedPANId = true;
+    networkInfo.FieldPresent.ThreadMeshPrefix    = false;
+    networkInfo.FieldPresent.ThreadPSKc          = false;
+    networkInfo.NetworkId                        = 0;
+    networkInfo.FieldPresent.NetworkId           = true;
+
+    ThreadStackMgr().SetThreadEnabled(false);
+    ThreadStackMgr().SetThreadProvision(networkInfo);
+    ThreadStackMgr().SetThreadEnabled(true);
+}
+
+void AppTask::JoinHandler(AppEvent * aEvent)
+{
+    if (aEvent->ButtonEvent.PinNo != JOIN_BUTTON)
+        return;
+
+    if (sAppTask.mFunction != kFunction_NoneSelected)
+    {
+        K32W_LOG("Another function is scheduled. Could not initiate Thread Join!");
+        return;
+    }
+
+    /* hard-code Thread Commissioning Parameters for the moment.
+     * In a future PR, these parameters will be sent via BLE.
+     */
+    ThreadStart();
+}
+
+void AppTask::CancelTimer()
+{
+    if (xTimerStop(sFunctionTimer, 0) == pdFAIL)
+    {
+        K32W_LOG("app timer stop() failed");
+    }
+
+    mResetTimerActive = false;
+}
+
+void AppTask::StartTimer(uint32_t aTimeoutInMs)
+{
+    if (xTimerIsTimerActive(sFunctionTimer))
+    {
+        K32W_LOG("app timer already started!");
+        CancelTimer();
+    }
+
+    // timer is not active, change its period to required value (== restart).
+    // FreeRTOS- Block for a maximum of 100 ticks if the change period command
+    // cannot immediately be sent to the timer command queue.
+    if (xTimerChangePeriod(sFunctionTimer, aTimeoutInMs / portTICK_PERIOD_MS, 100) != pdPASS)
+    {
+        K32W_LOG("app timer start() failed");
+    }
+
+    mResetTimerActive = true;
+}
+
+void AppTask::ActionInitiated(LightingManager::Action_t aAction, int32_t aActor)
+{
+    // start flashing the LEDs rapidly to indicate action initiation.
+    if (aAction == LightingManager::TURNON_ACTION)
+    {
+        K32W_LOG("Turn on Action has been initiated")
+    }
+    else if (aAction == LightingManager::TURNOFF_ACTION)
+    {
+        K32W_LOG("Turn off Action has been initiated")
+    }
+
+    sAppTask.mFunction = kFunctionTurnOnTurnOff;
+}
+
+void AppTask::ActionCompleted(LightingManager::Action_t aAction)
+{
+    // Turn on the light LED if in a TURNON state OR
+    // Turn off the light LED if in a TURNOFF state.
+    if (aAction == LightingManager::TURNON_ACTION)
+    {
+        K32W_LOG("Turn on action has been completed")
+        sLightLED.Set(true);
+    }
+    else if (aAction == LightingManager::TURNOFF_ACTION)
+    {
+        K32W_LOG("Turn off action has been completed")
+        sLightLED.Set(false);
+    }
+
+    sAppTask.mFunction = kFunction_NoneSelected;
+}
+
+void AppTask::PostTurnOnActionRequest(int32_t aActor, LightingManager::Action_t aAction)
+{
+    AppEvent event;
+    event.Type              = AppEvent::kEventType_TurnOn;
+    event.LightEvent.Actor  = aActor;
+    event.LightEvent.Action = aAction;
+    event.Handler           = LightActionEventHandler;
+    PostEvent(&event);
+}
+
+void AppTask::PostEvent(const AppEvent * aEvent)
+{
+    if (sAppEventQueue != NULL)
+    {
+        if (!xQueueSend(sAppEventQueue, aEvent, 1))
+        {
+            K32W_LOG("Failed to post event to app task event queue");
+        }
+    }
+}
+
+void AppTask::DispatchEvent(AppEvent * aEvent)
+{
+    if (aEvent->Handler)
+    {
+        aEvent->Handler(aEvent);
+    }
+    else
+    {
+        K32W_LOG("Event received with no handler. Dropping event.");
+    }
+}
+
+void AppTask::UpdateClusterState(void)
+{
+    uint8_t newValue = !LightingMgr().IsTurnedOff();
+
+    // write the new on/off value
+    EmberAfStatus status = emberAfWriteAttribute(1, ZCL_ON_OFF_CLUSTER_ID, ZCL_ON_OFF_ATTRIBUTE_ID, CLUSTER_MASK_SERVER,
+                                                 (uint8_t *) &newValue, ZCL_BOOLEAN_ATTRIBUTE_TYPE);
+    if (status != EMBER_ZCL_STATUS_SUCCESS)
+    {
+        ChipLogError(NotSpecified, "ERR: updating on/off %x", status);
+    }
+}
diff --git a/examples/lighting-app/k32w/main/LightingManager.cpp b/examples/lighting-app/k32w/main/LightingManager.cpp
new file mode 100644 (file)
index 0000000..5cfca55
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+ *
+ *    Copyright (c) 2021 Project CHIP Authors
+ *    Copyright (c) 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.
+ *    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 "LightingManager.h"
+
+#include "AppTask.h"
+#include "FreeRTOS.h"
+
+#include "app_config.h"
+
+LightingManager LightingManager::sLight;
+
+TimerHandle_t sLightTimer; // FreeRTOS app sw timer.
+
+int LightingManager::Init()
+{
+    int err = CHIP_NO_ERROR;
+
+    // Create FreeRTOS sw timer for light timer.
+
+    sLightTimer = xTimerCreate("LightTmr",       // Just a text name, not used by the RTOS kernel
+                               1,                // == default timer period (mS)
+                               false,            // no timer reload (==one-shot)
+                               (void *) this,    // init timer id = light obj context
+                               TimerEventHandler // timer callback handler
+    );
+
+    if (sLightTimer == NULL)
+    {
+        K32W_LOG("light timer create failed");
+        assert(0);
+    }
+
+    mState                = kState_TurnOffCompleted;
+    mAutoTurnOnTimerArmed = false;
+    mAutoTurnOn           = false;
+    mAutoTurnOnDuration   = 0;
+
+    return err;
+}
+
+void LightingManager::SetCallbacks(Callback_fn_initiated aActionInitiated_CB, Callback_fn_completed aActionCompleted_CB)
+{
+    mActionInitiated_CB = aActionInitiated_CB;
+    mActionCompleted_CB = aActionCompleted_CB;
+}
+
+bool LightingManager::IsActionInProgress()
+{
+    return (mState == kState_TurnOnInitiated || mState == kState_TurnOffInitiated) ? true : false;
+}
+
+bool LightingManager::IsTurnedOff()
+{
+    return (mState == kState_TurnOffCompleted) ? true : false;
+}
+
+void LightingManager::EnableAutoTurnOn(bool aOn)
+{
+    mAutoTurnOn = aOn;
+}
+
+void LightingManager::SetAutoTurnOnDuration(uint32_t aDurationInSecs)
+{
+    mAutoTurnOnDuration = aDurationInSecs;
+}
+
+bool LightingManager::InitiateAction(int32_t aActor, Action_t aAction)
+{
+    bool action_initiated = false;
+    State_t new_state;
+
+    // Initiate ON/OFF Action only when the previous one is complete.
+    if (mState == kState_TurnOnCompleted && aAction == TURNOFF_ACTION)
+    {
+        action_initiated = true;
+
+        new_state = kState_TurnOffInitiated;
+    }
+    else if (mState == kState_TurnOffCompleted && aAction == TURNON_ACTION)
+    {
+        action_initiated = true;
+
+        new_state = kState_TurnOnInitiated;
+    }
+
+    if (action_initiated)
+    {
+        if (mAutoTurnOnTimerArmed && new_state == kState_TurnOnInitiated)
+        {
+            // If auto turnon timer has been armed and someone initiates turn on the ligth,
+            // cancel the timer and continue as normal.
+            mAutoTurnOnTimerArmed = false;
+
+            CancelTimer();
+        }
+
+        StartTimer(ACTUATOR_MOVEMENT_PERIOS_MS);
+
+        // Since the timer started successfully, update the state and trigger callback
+        mState = new_state;
+
+        if (mActionInitiated_CB)
+        {
+            mActionInitiated_CB(aAction, aActor);
+        }
+    }
+
+    return action_initiated;
+}
+
+void LightingManager::StartTimer(uint32_t aTimeoutMs)
+{
+    if (xTimerIsTimerActive(sLightTimer))
+    {
+        K32W_LOG("light timer already started!");
+        // appError(err);
+        CancelTimer();
+    }
+
+    // timer is not active, change its period to required value.
+    // This also causes the timer to start.  FreeRTOS- Block for a maximum of
+    // 100 ticks if the  change period command cannot immediately be sent to the
+    // timer command queue.
+    if (xTimerChangePeriod(sLightTimer, aTimeoutMs / portTICK_PERIOD_MS, 100) != pdPASS)
+    {
+        K32W_LOG("light timer start() failed");
+        // appError(err);
+    }
+}
+
+void LightingManager::CancelTimer(void)
+{
+    if (xTimerStop(sLightTimer, 0) == pdFAIL)
+    {
+        K32W_LOG("light timer stop() failed");
+        // appError(err);
+    }
+}
+
+void LightingManager::TimerEventHandler(TimerHandle_t xTimer)
+{
+    // Get light obj context from timer id.
+    LightingManager * light = static_cast<LightingManager *>(pvTimerGetTimerID(xTimer));
+
+    // The timer event handler will be called in the context of the timer task
+    // once sLightTimer expires. Post an event to apptask queue with the actual handler
+    // so that the event can be handled in the context of the apptask.
+    AppEvent event;
+    event.Type               = AppEvent::kEventType_Timer;
+    event.TimerEvent.Context = light;
+
+    if (light->mAutoTurnOnTimerArmed)
+    {
+        event.Handler = AutoReTurnOnTimerEventHandler;
+        GetAppTask().PostEvent(&event);
+    }
+    else
+    {
+        event.Handler = ActuatorMovementTimerEventHandler;
+        GetAppTask().PostEvent(&event);
+    }
+}
+
+void LightingManager::AutoReTurnOnTimerEventHandler(AppEvent * aEvent)
+{
+    LightingManager * light = static_cast<LightingManager *>(aEvent->TimerEvent.Context);
+    int32_t actor           = 0;
+
+    // Make sure auto light timer is still armed.
+    if (!light->mAutoTurnOnTimerArmed)
+    {
+        return;
+    }
+
+    light->mAutoTurnOnTimerArmed = false;
+
+    K32W_LOG("Auto Turn On has been triggered!");
+
+    light->InitiateAction(actor, TURNON_ACTION);
+}
+
+void LightingManager::ActuatorMovementTimerEventHandler(AppEvent * aEvent)
+{
+    Action_t actionCompleted = INVALID_ACTION;
+
+    LightingManager * light = static_cast<LightingManager *>(aEvent->TimerEvent.Context);
+
+    if (light->mState == kState_TurnOnInitiated)
+    {
+        light->mState   = kState_TurnOnCompleted;
+        actionCompleted = TURNON_ACTION;
+    }
+    else if (light->mState == kState_TurnOffInitiated)
+    {
+        light->mState   = kState_TurnOffCompleted;
+        actionCompleted = TURNOFF_ACTION;
+    }
+
+    if (actionCompleted != INVALID_ACTION)
+    {
+        if (light->mActionCompleted_CB)
+        {
+            light->mActionCompleted_CB(actionCompleted);
+        }
+
+        if (light->mAutoTurnOn && actionCompleted == TURNOFF_ACTION)
+        {
+            // Start the timer for auto turn on
+            light->StartTimer(light->mAutoTurnOnDuration * 1000);
+
+            light->mAutoTurnOnTimerArmed = true;
+
+            K32W_LOG("Auto Turn On enabled. Will be triggered in %u seconds", light->mAutoTurnOnDuration);
+        }
+    }
+}
diff --git a/examples/lighting-app/k32w/main/ZclCallbacks.cpp b/examples/lighting-app/k32w/main/ZclCallbacks.cpp
new file mode 100644 (file)
index 0000000..a0896a6
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ *
+ *    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 <support/logging/CHIPLogging.h>
+
+#include "AppTask.h"
+#include "LightingManager.h"
+
+#include "af.h"
+#include "gen/attribute-id.h"
+#include "gen/cluster-id.h"
+#include <app/util/af-types.h>
+
+using namespace ::chip;
+
+void emberAfPostAttributeChangeCallback(EndpointId endpoint, ClusterId clusterId, AttributeId attributeId, uint8_t mask,
+                                        uint16_t manufacturerCode, uint8_t type, uint8_t size, uint8_t * value)
+{
+    if (clusterId != ZCL_ON_OFF_CLUSTER_ID)
+    {
+        ChipLogProgress(Zcl, "Unknown cluster ID: %d", clusterId);
+        return;
+    }
+
+    if (attributeId != ZCL_ON_OFF_ATTRIBUTE_ID)
+    {
+        ChipLogProgress(Zcl, "Unknown attribute ID: %d", attributeId);
+        return;
+    }
+
+    LightingMgr().InitiateAction(0, *value ? LightingManager::TURNON_ACTION : LightingManager::TURNOFF_ACTION);
+}
+
+/** @brief OnOff Cluster Init
+ *
+ * This function is called when a specific cluster is initialized. It gives the
+ * application an opportunity to take care of cluster initialization procedures.
+ * It is called exactly once for each endpoint where cluster is present.
+ *
+ * @param endpoint   Ver.: always
+ *
+ * TODO Issue #3841
+ * emberAfOnOffClusterInitCallback happens before the stack initialize the cluster
+ * attributes to the default value.
+ * The logic here expects something similar to the deprecated Plugins callback
+ * emberAfPluginOnOffClusterServerPostInitCallback.
+ *
+ */
+void emberAfOnOffClusterInitCallback(EndpointId endpoint)
+{
+    GetAppTask().UpdateClusterState();
+}
diff --git a/examples/lighting-app/k32w/main/include/AppEvent.h b/examples/lighting-app/k32w/main/include/AppEvent.h
new file mode 100644 (file)
index 0000000..820d44b
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ *
+ *    Copyright (c) 2021 Nest Labs, Inc.
+ *    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
+
+struct AppEvent;
+typedef void (*EventHandler)(AppEvent *);
+
+struct AppEvent
+{
+    enum AppEventTypes
+    {
+        kEventType_Button = 0,
+        kEventType_Timer,
+        kEventType_TurnOn,
+        kEventType_Install,
+    };
+
+    uint16_t Type;
+
+    union
+    {
+        struct
+        {
+            uint8_t PinNo;
+            uint8_t Action;
+        } ButtonEvent;
+        struct
+        {
+            void * Context;
+        } TimerEvent;
+        struct
+        {
+            uint8_t Action;
+            int32_t Actor;
+        } LightEvent;
+    };
+
+    EventHandler Handler;
+};
diff --git a/examples/lighting-app/k32w/main/include/AppTask.h b/examples/lighting-app/k32w/main/include/AppTask.h
new file mode 100644 (file)
index 0000000..98f2c12
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ *
+ *    Copyright (c) 2021 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.
+ *    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 <stdbool.h>
+#include <stdint.h>
+
+#include "AppEvent.h"
+#include "LightingManager.h"
+
+#include <platform/CHIPDeviceLayer.h>
+
+#include "FreeRTOS.h"
+#include "timers.h"
+
+class AppTask
+{
+public:
+    int StartAppTask();
+    static void AppTaskMain(void * pvParameter);
+
+    void PostTurnOnActionRequest(int32_t aActor, LightingManager::Action_t aAction);
+    void PostEvent(const AppEvent * event);
+
+    void UpdateClusterState(void);
+
+private:
+    friend AppTask & GetAppTask(void);
+
+    int Init();
+
+    static void ActionInitiated(LightingManager::Action_t aAction, int32_t aActor);
+    static void ActionCompleted(LightingManager::Action_t aAction);
+
+    void CancelTimer(void);
+
+    void DispatchEvent(AppEvent * event);
+
+    static void FunctionTimerEventHandler(AppEvent * aEvent);
+    static void KBD_Callback(uint8_t events);
+    static void HandleKeyboard(void);
+    static void JoinHandler(AppEvent * aEvent);
+    static void LightActionEventHandler(AppEvent * aEvent);
+    static void ResetActionEventHandler(AppEvent * aEvent);
+    static void InstallEventHandler(AppEvent * aEvent);
+
+    static void ButtonEventHandler(uint8_t pin_no, uint8_t button_action);
+    static void TimerEventHandler(TimerHandle_t xTimer);
+
+    static void ThreadStart();
+    void StartTimer(uint32_t aTimeoutInMs);
+
+    enum Function_t
+    {
+        kFunction_NoneSelected   = 0,
+        kFunction_SoftwareUpdate = 0,
+        kFunction_FactoryReset,
+        kFunctionTurnOnTurnOff,
+
+        kFunction_Invalid
+    } Function;
+
+    Function_t mFunction;
+    bool mResetTimerActive;
+
+    static AppTask sAppTask;
+};
+
+inline AppTask & GetAppTask(void)
+{
+    return AppTask::sAppTask;
+}
diff --git a/examples/lighting-app/k32w/main/include/LightingManager.h b/examples/lighting-app/k32w/main/include/LightingManager.h
new file mode 100644 (file)
index 0000000..19f6699
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ *
+ *    Copyright (c) 2021 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.
+ *    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 <stdbool.h>
+#include <stdint.h>
+
+#include "AppEvent.h"
+
+#include "FreeRTOS.h"
+#include "timers.h" // provides FreeRTOS timer support
+
+class LightingManager
+{
+public:
+    enum Action_t
+    {
+        TURNON_ACTION = 0,
+        TURNOFF_ACTION,
+
+        INVALID_ACTION
+    } Action;
+
+    enum State_t
+    {
+        kState_TurnOnInitiated = 0,
+        kState_TurnOnCompleted,
+        kState_TurnOffInitiated,
+        kState_TurnOffCompleted,
+    } State;
+
+    int Init();
+    bool IsTurnedOff();
+    void EnableAutoTurnOn(bool aOn);
+    void SetAutoTurnOnDuration(uint32_t aDurationInSecs);
+    bool IsActionInProgress();
+    bool InitiateAction(int32_t aActor, Action_t aAction);
+
+    typedef void (*Callback_fn_initiated)(Action_t, int32_t aActor);
+    typedef void (*Callback_fn_completed)(Action_t);
+    void SetCallbacks(Callback_fn_initiated aActionInitiated_CB, Callback_fn_completed aActionCompleted_CB);
+
+private:
+    friend LightingManager & LightingMgr(void);
+    State_t mState;
+
+    Callback_fn_initiated mActionInitiated_CB;
+    Callback_fn_completed mActionCompleted_CB;
+
+    bool mAutoTurnOn;
+    uint32_t mAutoTurnOnDuration;
+    bool mAutoTurnOnTimerArmed;
+
+    void CancelTimer(void);
+    void StartTimer(uint32_t aTimeoutMs);
+
+    static void TimerEventHandler(TimerHandle_t xTimer);
+    static void AutoReTurnOnTimerEventHandler(AppEvent * aEvent);
+    static void ActuatorMovementTimerEventHandler(AppEvent * aEvent);
+
+    static LightingManager sLight;
+};
+
+inline LightingManager & LightingMgr(void)
+{
+    return LightingManager::sLight;
+}
diff --git a/examples/lighting-app/k32w/main/include/app_config.h b/examples/lighting-app/k32w/main/include/app_config.h
new file mode 100644 (file)
index 0000000..abffcc9
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ *
+ *    Copyright (c) 2021 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.
+ *    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 "LED.h"
+
+#pragma once
+
+// ---- Light Example App Config ----
+
+#define RESET_BUTTON 1
+#define LIGHT_BUTTON 2
+#define JOIN_BUTTON 3
+
+#define RESET_BUTTON_PUSH 1
+#define LIGHT_BUTTON_PUSH 2
+#define JOIN_BUTTON_PUSH 3
+
+#define APP_BUTTON_PUSH 1
+
+#define SYSTEM_STATE_LED LED1
+#define LIGHT_STATE_LED LED2
+
+// Time it takes for the light to switch on/off
+#define ACTUATOR_MOVEMENT_PERIOS_MS 50
+
+// ---- Light Example SWU Config ----
+#define SWU_INTERVAl_WINDOW_MIN_MS (23 * 60 * 60 * 1000) // 23 hours
+#define SWU_INTERVAl_WINDOW_MAX_MS (24 * 60 * 60 * 1000) // 24 hours
+
+// ---- Thread Polling Config ----
+#define THREAD_ACTIVE_POLLING_INTERVAL_MS 100
+#define THREAD_INACTIVE_POLLING_INTERVAL_MS 1000
+
+#if K32W_LOG_ENABLED
+#define K32W_LOG(...) otPlatLog(OT_LOG_LEVEL_NONE, OT_LOG_REGION_API, ##__VA_ARGS__);
+#else
+#define K32W_LOG(...)
+#endif
diff --git a/examples/lighting-app/k32w/main/main.cpp b/examples/lighting-app/k32w/main/main.cpp
new file mode 100644 (file)
index 0000000..abdb042
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ *
+ *    Copyright (c) 2021 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.
+ *    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.
+ */
+
+// ================================================================================
+// Main Code
+// ================================================================================
+
+#include "openthread/platform/logging.h"
+#include "openthread/platform/uart.h"
+#include <mbedtls/platform.h>
+#include <openthread-system.h>
+#include <openthread/cli.h>
+#include <openthread/error.h>
+#include <openthread/heap.h>
+
+#include <core/CHIPError.h>
+#include <platform/CHIPDeviceLayer.h>
+#include <platform/ThreadStackManager.h>
+#include <support/CHIPMem.h>
+#include <support/logging/CHIPLogging.h>
+
+#include "FreeRtosMbedtlsUtils.h"
+#include "app_config.h"
+
+#include "radio.h"
+
+using namespace ::chip;
+using namespace ::chip::Inet;
+using namespace ::chip::DeviceLayer;
+using namespace ::chip::Logging;
+
+extern "C" void * pvPortCallocRtos(size_t num, size_t size);
+
+#include <AppTask.h>
+
+typedef void (*InitFunc)(void);
+extern InitFunc __init_array_start;
+extern InitFunc __init_array_end;
+
+/* needed for FreeRtos Heap 4 */
+uint8_t __attribute__((section(".heap"))) ucHeap[0xF000];
+
+extern "C" void main_task(void const * argument)
+{
+    CHIP_ERROR ret = CHIP_ERROR_MAX;
+
+    /* Call C++ constructors */
+    InitFunc * pFunc = &__init_array_start;
+    for (; pFunc < &__init_array_end; ++pFunc)
+    {
+        (*pFunc)();
+    }
+
+    mbedtls_platform_set_calloc_free(pvPortCallocRtos, vPortFree);
+
+    /* Used for HW initializations */
+    otSysInit(0, NULL);
+
+    /* UART needs to be enabled so early for getting the Weave Init Logs.
+     * Otherwise, some logs are lost because the UART gets enabled later
+     * during the initialization of the Thread stack */
+    otPlatUartEnable();
+
+    K32W_LOG("Welcome to NXP Lighting Demo App");
+
+    /* Mbedtls Threading support is needed because both
+     * Thread and Weave tasks are using it */
+    freertos_mbedtls_mutex_init();
+
+    // Init Chip memory management before the stack
+    chip::Platform::MemoryInit();
+
+    ret = PlatformMgr().InitChipStack();
+    if (ret != CHIP_NO_ERROR)
+    {
+        K32W_LOG("Error during PlatformMgr().InitWeaveStack()");
+        goto exit;
+    }
+
+    ret = ThreadStackMgr().InitThreadStack();
+    if (ret != CHIP_NO_ERROR)
+    {
+        K32W_LOG("Error during ThreadStackMgr().InitThreadStack()");
+        goto exit;
+    }
+
+    ret = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_SleepyEndDevice);
+    if (ret != CHIP_NO_ERROR)
+    {
+        goto exit;
+    }
+
+    // Configure the Thread polling behavior for the device.
+    {
+        ConnectivityManager::ThreadPollingConfig pollingConfig;
+        pollingConfig.Clear();
+        pollingConfig.ActivePollingIntervalMS   = THREAD_ACTIVE_POLLING_INTERVAL_MS;
+        pollingConfig.InactivePollingIntervalMS = THREAD_INACTIVE_POLLING_INTERVAL_MS;
+
+        ret = ConnectivityMgr().SetThreadPollingConfig(pollingConfig);
+        if (ret != CHIP_NO_ERROR)
+        {
+            K32W_LOG("Error during ConnectivityMgr().SetThreadPollingConfig(pollingConfig)");
+            goto exit;
+        }
+    }
+
+    ret = PlatformMgr().StartEventLoopTask();
+    if (ret != CHIP_NO_ERROR)
+    {
+        K32W_LOG("Error during PlatformMgr().StartEventLoopTask();");
+        goto exit;
+    }
+
+    // Start OpenThread task
+    ret = ThreadStackMgrImpl().StartThreadTask();
+    if (ret != CHIP_NO_ERROR)
+    {
+        K32W_LOG("Error during ThreadStackMgrImpl().StartThreadTask()");
+        goto exit;
+    }
+
+    ret = GetAppTask().StartAppTask();
+    if (ret != CHIP_NO_ERROR)
+    {
+        K32W_LOG("Error during GetAppTask().StartAppTask()");
+        goto exit;
+    }
+
+    GetAppTask().AppTaskMain(NULL);
+
+exit:
+    return;
+}
diff --git a/examples/lighting-app/k32w/third_party/connectedhomeip b/examples/lighting-app/k32w/third_party/connectedhomeip
new file mode 120000 (symlink)
index 0000000..c866b86
--- /dev/null
@@ -0,0 +1 @@
+../../../..
\ No newline at end of file
index d554b9b..6116b8d 100644 (file)
@@ -21,7 +21,7 @@
 
 #import "CHIPDevice.h"
 #import "CHIPDevice_Internal.h"
-#import "ChipError.h"
+#import "CHIPError.h"
 #import "gen/CHIPClientCallbacks.h"
 #import "gen/CHIPClustersObjc.h"
 
@@ -292,6 +292,38 @@ private:
     bool mKeepAlive;
 };
 
+class CHIPInt64uAttributeCallbackBridge : public Callback::Callback<Int64uAttributeCallback> {
+public:
+    CHIPInt64uAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
+        : Callback::Callback<Int64uAttributeCallback>(CallbackFn, this)
+        , mHandler(handler)
+        , mQueue(queue)
+        , mKeepAlive(keepAlive)
+    {
+    }
+
+    ~CHIPInt64uAttributeCallbackBridge() {};
+
+    static void CallbackFn(void * context, uint64_t value)
+    {
+        CHIPInt64uAttributeCallbackBridge * callback = reinterpret_cast<CHIPInt64uAttributeCallbackBridge *>(context);
+        if (callback && callback->mQueue) {
+            dispatch_async(callback->mQueue, ^{
+                callback->mHandler(nil, @ { @"value" : [NSNumber numberWithUnsignedLongLong:value] });
+                if (!callback->mKeepAlive) {
+                    callback->Cancel();
+                    delete callback;
+                }
+            });
+        }
+    };
+
+private:
+    ResponseHandler mHandler;
+    dispatch_queue_t mQueue;
+    bool mKeepAlive;
+};
+
 class CHIPInt16sAttributeCallbackBridge : public Callback::Callback<Int16sAttributeCallback> {
 public:
     CHIPInt16sAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
index 8c8757f..72a0198 100644 (file)
 #define ZCL_FABRIC_ID_ATTRIBUTE_ID (0x0000)
 #define ZCL_BREADCRUMB_ATTRIBUTE_ID (0x0001)
 
+// Attribute ids for cluster: Network Commissioning
+
+// Client attributes
+
+// Server attributes
+
 // Attribute ids for cluster: Shade Configuration
 
 // Client attributes
 
 // Server attributes
 
-// Attribute ids for cluster: Network Commissioning
-
-// Client attributes
-
-// Server attributes
-
 // Attribute ids for cluster: Binding
 
 // Client attributes
index f72c96f..79d1e15 100644 (file)
                                                                                                                                    \
                                   ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
 
+/** @brief Command description for ScanNetworks
+ *
+ * Command: ScanNetworks
+ * @param ssid OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterScanNetworks(ssid, breadcrumb, timeoutMs)                                                                  \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_SCAN_NETWORKS_COMMAND_ID, "uuu", ssid, breadcrumb, timeoutMs);
+
+/** @brief Command description for ScanNetworksResponse
+ *
+ * Command: ScanNetworksResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ * @param wifiScanResults WiFiInterfaceScanResult []
+ * @param wifiScanResultsLen int
+ * @param threadScanResults ThreadInterfaceScanResult []
+ * @param threadScanResultsLen int
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterScanNetworksResponse(errorCode, debugText, wifiScanResults, wifiScanResultsLen, threadScanResults,         \
+                                             threadScanResultsLen)                                                                 \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID, "uubb", errorCode, debugText, wifiScanResults,            \
+                                  wifiScanResultsLen, threadScanResults, threadScanResultsLen);
+
+/** @brief Command description for AddWiFiNetwork
+ *
+ * Command: AddWiFiNetwork
+ * @param ssid OCTET_STRING
+ * @param credentials OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                   \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
+
+/** @brief Command description for AddWiFiNetworkResponse
+ *
+ * Command: AddWiFiNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddWiFiNetworkResponse(errorCode, debugText)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for UpdateWiFiNetwork
+ *
+ * Command: UpdateWiFiNetwork
+ * @param ssid OCTET_STRING
+ * @param credentials OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
+
+/** @brief Command description for UpdateWiFiNetworkResponse
+ *
+ * Command: UpdateWiFiNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateWiFiNetworkResponse(errorCode, debugText)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for AddThreadNetwork
+ *
+ * Command: AddThreadNetwork
+ * @param operationalDataset OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
+
+/** @brief Command description for AddThreadNetworkResponse
+ *
+ * Command: AddThreadNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddThreadNetworkResponse(errorCode, debugText)                                                             \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for UpdateThreadNetwork
+ *
+ * Command: UpdateThreadNetwork
+ * @param operationalDataset OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                             \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
+
+/** @brief Command description for UpdateThreadNetworkResponse
+ *
+ * Command: UpdateThreadNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateThreadNetworkResponse(errorCode, debugText)                                                          \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for RemoveNetwork
+ *
+ * Command: RemoveNetwork
+ * @param NetworkID OCTET_STRING
+ * @param Breadcrumb INT64U
+ * @param TimeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterRemoveNetwork(NetworkID, Breadcrumb, TimeoutMs)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_REMOVE_NETWORK_COMMAND_ID, "uuu", NetworkID, Breadcrumb, TimeoutMs);
+
+/** @brief Command description for RemoveNetworkResponse
+ *
+ * Command: RemoveNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterRemoveNetworkResponse(errorCode, debugText)                                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for EnableNetwork
+ *
+ * Command: EnableNetwork
+ * @param networkID OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterEnableNetwork(networkID, breadcrumb, timeoutMs)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ENABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
+
+/** @brief Command description for EnableNetworkResponse
+ *
+ * Command: EnableNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterEnableNetworkResponse(errorCode, debugText)                                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for DisableNetwork
+ *
+ * Command: DisableNetwork
+ * @param networkID OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterDisableNetwork(networkID, breadcrumb, timeoutMs)                                                           \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_DISABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
+
+/** @brief Command description for DisableNetworkResponse
+ *
+ * Command: DisableNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterDisableNetworkResponse(errorCode, debugText)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for GetLastNetworkCommissioningResult
+ *
+ * Command: GetLastNetworkCommissioningResult
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterGetLastNetworkCommissioningResult(timeoutMs)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID, "u", timeoutMs);
+
 /** @brief Command description for LockDoor
  *
  * Command: LockDoor
                                   ZCL_GET_ENDPOINT_LIST_REQUEST_COMMAND_ID, "uuuub", startIndex, total, startIndex, count,         \
                                   endpointInformationRecordList, endpointInformationRecordListLen);
 
-/** @brief Command description for ScanNetworks
- *
- * Command: ScanNetworks
- * @param ssid OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterScanNetworks(ssid, breadcrumb, timeoutMs)                                                                  \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_SCAN_NETWORKS_COMMAND_ID, "uuu", ssid, breadcrumb, timeoutMs);
-
-/** @brief Command description for ScanNetworksResponse
- *
- * Command: ScanNetworksResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- * @param wifiScanResults WiFiInterfaceScanResult []
- * @param wifiScanResultsLen int
- * @param threadScanResults ThreadInterfaceScanResult []
- * @param threadScanResultsLen int
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterScanNetworksResponse(errorCode, debugText, wifiScanResults, wifiScanResultsLen, threadScanResults,         \
-                                             threadScanResultsLen)                                                                 \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID, "uubb", errorCode, debugText, wifiScanResults,            \
-                                  wifiScanResultsLen, threadScanResults, threadScanResultsLen);
-
-/** @brief Command description for AddWiFiNetwork
- *
- * Command: AddWiFiNetwork
- * @param ssid OCTET_STRING
- * @param credentials OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                   \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
-
-/** @brief Command description for AddWiFiNetworkResponse
- *
- * Command: AddWiFiNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddWiFiNetworkResponse(errorCode, debugText)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for UpdateWiFiNetwork
- *
- * Command: UpdateWiFiNetwork
- * @param ssid OCTET_STRING
- * @param credentials OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
-
-/** @brief Command description for UpdateWiFiNetworkResponse
- *
- * Command: UpdateWiFiNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateWiFiNetworkResponse(errorCode, debugText)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for AddThreadNetwork
- *
- * Command: AddThreadNetwork
- * @param operationalDataset OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
-
-/** @brief Command description for AddThreadNetworkResponse
- *
- * Command: AddThreadNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddThreadNetworkResponse(errorCode, debugText)                                                             \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for UpdateThreadNetwork
- *
- * Command: UpdateThreadNetwork
- * @param operationalDataset OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                             \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
-
-/** @brief Command description for UpdateThreadNetworkResponse
- *
- * Command: UpdateThreadNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateThreadNetworkResponse(errorCode, debugText)                                                          \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for RemoveNetwork
- *
- * Command: RemoveNetwork
- * @param NetworkID OCTET_STRING
- * @param Breadcrumb INT64U
- * @param TimeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterRemoveNetwork(NetworkID, Breadcrumb, TimeoutMs)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_REMOVE_NETWORK_COMMAND_ID, "uuu", NetworkID, Breadcrumb, TimeoutMs);
-
-/** @brief Command description for RemoveNetworkResponse
- *
- * Command: RemoveNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterRemoveNetworkResponse(errorCode, debugText)                                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for EnableNetwork
- *
- * Command: EnableNetwork
- * @param networkID OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterEnableNetwork(networkID, breadcrumb, timeoutMs)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ENABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
-
-/** @brief Command description for EnableNetworkResponse
- *
- * Command: EnableNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterEnableNetworkResponse(errorCode, debugText)                                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for DisableNetwork
- *
- * Command: DisableNetwork
- * @param networkID OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterDisableNetwork(networkID, breadcrumb, timeoutMs)                                                           \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_DISABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
-
-/** @brief Command description for DisableNetworkResponse
- *
- * Command: DisableNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterDisableNetworkResponse(errorCode, debugText)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for GetLastNetworkCommissioningResult
- *
- * Command: GetLastNetworkCommissioningResult
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterGetLastNetworkCommissioningResult(timeoutMs)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID, "u", timeoutMs);
-
 /** @brief Command description for Bind
  *
  * Command: Bind
index d77da91..add8f83 100644 (file)
@@ -86,6 +86,9 @@
 // Definitions for cluster: General Commissioning
 #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030)
 
+// Definitions for cluster: Network Commissioning
+#define ZCL_NETWORK_COMMISSIONING_CLUSTER_ID (0x0031)
+
 // Definitions for cluster: Shade Configuration
 #define ZCL_SHADE_CONFIG_CLUSTER_ID (0x0100)
 
 // Definitions for cluster: ZLL Commissioning
 #define ZCL_ZLL_COMMISSIONING_CLUSTER_ID (0x1000)
 
-// Definitions for cluster: Network Commissioning
-#define ZCL_NETWORK_COMMISSIONING_CLUSTER_ID (0xAAAA)
-
 // Definitions for cluster: Binding
 #define ZCL_BINDING_CLUSTER_ID (0xF000)
 
index adc2b1c..864943b 100644 (file)
 #define ZCL_COMMISSIONING_COMPLETE_COMMAND_ID (0x06)
 #define ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID (0x07)
 
+// Commands for cluster: Network Commissioning
+#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00)
+#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01)
+#define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
+#define ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x03)
+#define ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x04)
+#define ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x05)
+#define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
+#define ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x07)
+#define ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID (0x08)
+#define ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x09)
+#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x0A)
+#define ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID (0x0B)
+#define ZCL_ENABLE_NETWORK_COMMAND_ID (0x0C)
+#define ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID (0x0D)
+#define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
+#define ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID (0x0F)
+#define ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID (0x10)
+
 // Commands for cluster: Door Lock
 #define ZCL_LOCK_DOOR_COMMAND_ID (0x00)
 #define ZCL_LOCK_DOOR_RESPONSE_COMMAND_ID (0x00)
 #define ZCL_GET_ENDPOINT_LIST_REQUEST_COMMAND_ID (0x42)
 #define ZCL_GET_ENDPOINT_LIST_RESPONSE_COMMAND_ID (0x42)
 
-// Commands for cluster: Network Commissioning
-#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00)
-#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01)
-#define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
-#define ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x03)
-#define ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x04)
-#define ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x05)
-#define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
-#define ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x07)
-#define ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID (0x08)
-#define ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x09)
-#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x0A)
-#define ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID (0x0B)
-#define ZCL_ENABLE_NETWORK_COMMAND_ID (0x0C)
-#define ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID (0x0D)
-#define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
-#define ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID (0x0F)
-#define ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID (0x10)
-
 // Commands for cluster: Binding
 #define ZCL_BIND_COMMAND_ID (0x00)
 #define ZCL_UNBIND_COMMAND_ID (0x01)
index f82aab4..e4ee406 100644 (file)
                 0x0028, ZAP_ATTRIBUTE_INDEX(4), 12, 254, ZAP_CLUSTER_MASK(SERVER), NULL                                            \
             }, /* Endpoint: 1, Cluster: Basic (server) */                                                                          \
             {                                                                                                                      \
-                0xAAAA, ZAP_ATTRIBUTE_INDEX(16), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
+                0x0031, ZAP_ATTRIBUTE_INDEX(16), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
             }, /* Endpoint: 1, Cluster: Network Commissioning (server) */                                                          \
     }
 
             { 0x0028, 0x00, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): StartUp */                                     \
             { 0x0028, 0x01, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): ShutDown */                                    \
             { 0x0028, 0x02, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): Leave */                                       \
-            { 0xAAAA, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): ScanNetworks */                \
-            { 0xAAAA, 0x01, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): ScanNetworksResponse */        \
-            { 0xAAAA, 0x02, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): AddWiFiNetwork */              \
-            { 0xAAAA, 0x03, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): AddWiFiNetworkResponse */      \
-            { 0xAAAA, 0x04, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): UpdateWiFiNetwork */           \
-            { 0xAAAA, 0x05, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): UpdateWiFiNetworkResponse */   \
-            { 0xAAAA, 0x06, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): AddThreadNetwork */            \
-            { 0xAAAA, 0x07, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): AddThreadNetworkResponse */    \
-            { 0xAAAA, 0x08, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): UpdateThreadNetwork */         \
-            { 0xAAAA, 0x09, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): UpdateThreadNetworkResponse */ \
-            { 0xAAAA, 0x0A, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): RemoveNetwork */               \
-            { 0xAAAA, 0x0B, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): RemoveNetworkResponse */       \
-            { 0xAAAA, 0x0C, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): EnableNetwork */               \
-            { 0xAAAA, 0x0D, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): EnableNetworkResponse */       \
-            { 0xAAAA, 0x0E, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): DisableNetwork */              \
-            { 0xAAAA, 0x0F, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): DisableNetworkResponse */      \
-            { 0xAAAA, 0x10,                                                                                                        \
+            { 0x0031, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): ScanNetworks */                \
+            { 0x0031, 0x01, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): ScanNetworksResponse */        \
+            { 0x0031, 0x02, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): AddWiFiNetwork */              \
+            { 0x0031, 0x03, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): AddWiFiNetworkResponse */      \
+            { 0x0031, 0x04, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): UpdateWiFiNetwork */           \
+            { 0x0031, 0x05, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): UpdateWiFiNetworkResponse */   \
+            { 0x0031, 0x06, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): AddThreadNetwork */            \
+            { 0x0031, 0x07, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): AddThreadNetworkResponse */    \
+            { 0x0031, 0x08, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): UpdateThreadNetwork */         \
+            { 0x0031, 0x09, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): UpdateThreadNetworkResponse */ \
+            { 0x0031, 0x0A, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): RemoveNetwork */               \
+            { 0x0031, 0x0B, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): RemoveNetworkResponse */       \
+            { 0x0031, 0x0C, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): EnableNetwork */               \
+            { 0x0031, 0x0D, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): EnableNetworkResponse */       \
+            { 0x0031, 0x0E, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): DisableNetwork */              \
+            { 0x0031, 0x0F, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): DisableNetworkResponse */      \
+            { 0x0031, 0x10,                                                                                                        \
               ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): GetLastNetworkCommissioningResult */         \
     }
 
index bd08d38..8c737e9 100644 (file)
 #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER
 #endif
 
+#if defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_CLIENT)
+#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER { ZCL_NETWORK_COMMISSIONING_CLUSTER_ID, 49, "Network Commissioning" },
+#else
+#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER
+#endif
+
 #if defined(ZCL_USING_SHADE_CONFIG_CLUSTER_SERVER) || defined(ZCL_USING_SHADE_CONFIG_CLUSTER_CLIENT)
 #define CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER { ZCL_SHADE_CONFIG_CLUSTER_ID, 256, "Shade Configuration" },
 #else
 #define CHIP_PRINTCLUSTER_ZLL_COMMISSIONING_CLUSTER
 #endif
 
-#if defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_CLIENT)
-#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER { ZCL_NETWORK_COMMISSIONING_CLUSTER_ID, 43690, "Network Commissioning" },
-#else
-#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER
-#endif
-
 #if defined(ZCL_USING_BINDING_CLUSTER_SERVER) || defined(ZCL_USING_BINDING_CLUSTER_CLIENT)
 #define CHIP_PRINTCLUSTER_BINDING_CLUSTER { ZCL_BINDING_CLUSTER_ID, 61440, "Binding" },
 #else
     CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER                                                                                            \
     CHIP_PRINTCLUSTER_BASIC_CLUSTER                                                                                                \
     CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER                                                                                \
+    CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER                                                                                \
     CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER                                                                                         \
     CHIP_PRINTCLUSTER_DOOR_LOCK_CLUSTER                                                                                            \
     CHIP_PRINTCLUSTER_WINDOW_COVERING_CLUSTER                                                                                      \
     CHIP_PRINTCLUSTER_ELECTRICAL_MEASUREMENT_CLUSTER                                                                               \
     CHIP_PRINTCLUSTER_DIAGNOSTICS_CLUSTER                                                                                          \
     CHIP_PRINTCLUSTER_ZLL_COMMISSIONING_CLUSTER                                                                                    \
-    CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER                                                                                \
     CHIP_PRINTCLUSTER_BINDING_CLUSTER                                                                                              \
     CHIP_PRINTCLUSTER_MEDIA_PLAYBACK_CLUSTER                                                                                       \
     CHIP_PRINTCLUSTER_CONTENT_LAUNCH_CLUSTER                                                                                       \
index 79094c9..58535db 100644 (file)
@@ -1,5 +1,5 @@
 {
-  "writeTime": "Fri Feb 26 2021 15:33:11 GMT+0800 (China Standard Time)",
+  "writeTime": "Fri Mar 12 2021 15:18:57 GMT+0800 (China Standard Time)",
   "featureLevel": 11,
   "creator": "zap",
   "keyValuePairs": [
       "deviceTypeProfileId": 260,
       "clusters": [
         {
-          "name": "Basic",
-          "code": 40,
+          "name": "Identify",
+          "code": 3,
           "mfgCode": null,
-          "define": "BASIC_CLUSTER",
+          "define": "IDENTIFY_CLUSTER",
           "side": "client",
           "enabled": 0,
-          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "side": "client",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "3",
+              "defaultValue": "2",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ]
-        },
-        {
-          "name": "Basic",
-          "code": 40,
-          "mfgCode": null,
-          "define": "BASIC_CLUSTER",
-          "side": "server",
-          "enabled": 1,
+          ],
           "commands": [
             {
-              "name": "StartUp",
+              "name": "Identify",
               "code": 0,
               "mfgCode": null,
-              "source": "server",
+              "source": "client",
               "incoming": 1,
-              "outgoing": 1
+              "outgoing": 0
             },
             {
-              "name": "ShutDown",
+              "name": "IdentifyQuery",
               "code": 1,
               "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "Leave",
-              "code": 2,
-              "mfgCode": null,
-              "source": "server",
+              "source": "client",
               "incoming": 1,
-              "outgoing": 1
+              "outgoing": 0
             }
-          ],
+          ]
+        },
+        {
+          "name": "Identify",
+          "code": 3,
+          "mfgCode": null,
+          "define": "IDENTIFY_CLUSTER",
+          "side": "server",
+          "enabled": 0,
           "attributes": [
             {
               "name": "cluster revision",
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "3",
+              "defaultValue": "2",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "InteractionModelVersion",
+              "name": "identify time",
               "code": 0,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "0x0000",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
+            }
+          ],
+          "commands": [
+            {
+              "name": "IdentifyQueryResponse",
+              "code": 0,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            }
+          ]
+        },
+        {
+          "name": "Groups",
+          "code": 4,
+          "mfgCode": null,
+          "define": "GROUPS_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "commands": [
+            {
+              "name": "AddGroup",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
             },
             {
-              "name": "VendorName",
+              "name": "ViewGroup",
               "code": 1,
               "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
             },
             {
-              "name": "VendorID",
+              "name": "GetGroupMembership",
               "code": 2,
               "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
             },
             {
-              "name": "ProductName",
+              "name": "RemoveGroup",
               "code": 3,
               "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
             },
             {
-              "name": "ProductID",
+              "name": "RemoveAllGroups",
               "code": 4,
               "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
             },
             {
-              "name": "UserLabel",
+              "name": "AddGroupIfIdentifying",
               "code": 5,
               "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            },
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            }
+          ],
+          "attributes": [
             {
-              "name": "Location",
-              "code": 6,
+              "name": "cluster revision",
+              "code": 65533,
               "mfgCode": null,
-              "side": "server",
+              "side": "client",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "3",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Groups",
+          "code": 4,
+          "mfgCode": null,
+          "define": "GROUPS_CLUSTER",
+          "side": "server",
+          "enabled": 0,
+          "commands": [
+            {
+              "name": "AddGroupResponse",
+              "code": 0,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
             },
             {
-              "name": "HardwareVersion",
-              "code": 7,
+              "name": "ViewGroupResponse",
+              "code": 1,
               "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "0x00",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
             },
             {
-              "name": "HardwareVersionString",
-              "code": 8,
+              "name": "GetGroupMembershipResponse",
+              "code": 2,
               "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
             },
             {
-              "name": "SoftwareVersion",
-              "code": 9,
+              "name": "RemoveGroupResponse",
+              "code": 3,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0x00",
+              "defaultValue": "3",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "SoftwareVersionString",
-              "code": 10,
+              "name": "name support",
+              "code": 0,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
               "defaultValue": "",
               "reportable": 0,
           ]
         },
         {
-          "name": "Identify",
-          "code": 3,
+          "name": "Scenes",
+          "code": 5,
           "mfgCode": null,
-          "define": "IDENTIFY_CLUSTER",
+          "define": "SCENES_CLUSTER",
           "side": "client",
           "enabled": 0,
           "commands": [
             {
-              "name": "Identify",
+              "name": "AddScene",
               "code": 0,
               "mfgCode": null,
               "source": "client",
               "outgoing": 0
             },
             {
-              "name": "IdentifyQuery",
+              "name": "ViewScene",
               "code": 1,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
               "outgoing": 0
+            },
+            {
+              "name": "RemoveScene",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "RemoveAllScenes",
+              "code": 3,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "StoreScene",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "RecallScene",
+              "code": 5,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "GetSceneMembership",
+              "code": 6,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
             }
           ],
           "attributes": [
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "2",
+              "defaultValue": "3",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
           ]
         },
         {
-          "name": "Identify",
-          "code": 3,
+          "name": "Scenes",
+          "code": 5,
           "mfgCode": null,
-          "define": "IDENTIFY_CLUSTER",
+          "define": "SCENES_CLUSTER",
           "side": "server",
           "enabled": 0,
           "commands": [
             {
-              "name": "IdentifyQueryResponse",
+              "name": "AddSceneResponse",
               "code": 0,
               "mfgCode": null,
               "source": "server",
               "incoming": 0,
               "outgoing": 1
+            },
+            {
+              "name": "ViewSceneResponse",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveSceneResponse",
+              "code": 2,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveAllScenesResponse",
+              "code": 3,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "StoreSceneResponse",
+              "code": 4,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "GetSceneMembershipResponse",
+              "code": 6,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
             }
           ],
           "attributes": [
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "2",
+              "defaultValue": "3",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "identify time",
+              "name": "scene count",
               "code": 0,
               "mfgCode": null,
               "side": "server",
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0x0000",
+              "defaultValue": "0x00",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
-            }
-          ]
-        },
-        {
-          "name": "Groups",
-          "code": 4,
-          "mfgCode": null,
-          "define": "GROUPS_CLUSTER",
-          "side": "client",
-          "enabled": 0,
-          "commands": [
-            {
-              "name": "AddGroup",
-              "code": 0,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
             },
             {
-              "name": "ViewGroup",
+              "name": "current scene",
               "code": 1,
               "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x00",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
             },
             {
-              "name": "GetGroupMembership",
+              "name": "current group",
               "code": 2,
               "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x0000",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
             },
             {
-              "name": "RemoveGroup",
-              "code": 3,
+              "name": "scene valid",
+              "code": 3,
+              "mfgCode": null,
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x00",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            },
+            {
+              "name": "name support",
+              "code": 4,
+              "mfgCode": null,
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "On/off",
+          "code": 6,
+          "mfgCode": null,
+          "define": "ON_OFF_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "commands": [
+            {
+              "name": "Off",
+              "code": 0,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
               "outgoing": 0
             },
             {
-              "name": "RemoveAllGroups",
-              "code": 4,
+              "name": "On",
+              "code": 1,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
               "outgoing": 0
             },
             {
-              "name": "AddGroupIfIdentifying",
-              "code": 5,
+              "name": "Toggle",
+              "code": 2,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "3",
+              "defaultValue": "2",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
           ]
         },
         {
-          "name": "Groups",
-          "code": 4,
+          "name": "On/off",
+          "code": 6,
           "mfgCode": null,
-          "define": "GROUPS_CLUSTER",
+          "define": "ON_OFF_CLUSTER",
           "side": "server",
-          "enabled": 0,
-          "commands": [
-            {
-              "name": "AddGroupResponse",
-              "code": 0,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "ViewGroupResponse",
-              "code": 1,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "GetGroupMembershipResponse",
-              "code": 2,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "RemoveGroupResponse",
-              "code": 3,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            }
-          ],
+          "enabled": 1,
+          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "3",
+              "defaultValue": "2",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "name support",
+              "name": "on/off",
               "code": 0,
               "mfgCode": null,
               "side": "server",
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
-              "reportable": 0,
+              "defaultValue": "0x00",
+              "reportable": 1,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
           ]
         },
         {
-          "name": "Scenes",
-          "code": 5,
+          "name": "Level Control",
+          "code": 8,
           "mfgCode": null,
-          "define": "SCENES_CLUSTER",
+          "define": "LEVEL_CONTROL_CLUSTER",
           "side": "client",
           "enabled": 0,
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "3",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ],
           "commands": [
             {
-              "name": "AddScene",
+              "name": "MoveToLevel",
               "code": 0,
               "mfgCode": null,
               "source": "client",
               "outgoing": 0
             },
             {
-              "name": "ViewScene",
+              "name": "Move",
               "code": 1,
               "mfgCode": null,
               "source": "client",
               "outgoing": 0
             },
             {
-              "name": "RemoveScene",
+              "name": "Step",
               "code": 2,
               "mfgCode": null,
               "source": "client",
               "outgoing": 0
             },
             {
-              "name": "RemoveAllScenes",
+              "name": "Stop",
               "code": 3,
               "mfgCode": null,
               "source": "client",
               "outgoing": 0
             },
             {
-              "name": "StoreScene",
+              "name": "MoveToLevelWithOnOff",
               "code": 4,
               "mfgCode": null,
               "source": "client",
               "outgoing": 0
             },
             {
-              "name": "RecallScene",
+              "name": "MoveWithOnOff",
               "code": 5,
               "mfgCode": null,
               "source": "client",
               "outgoing": 0
             },
             {
-              "name": "GetSceneMembership",
+              "name": "StepWithOnOff",
               "code": 6,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
               "outgoing": 0
+            },
+            {
+              "name": "StopWithOnOff",
+              "code": 7,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
             }
-          ],
+          ]
+        },
+        {
+          "name": "Level Control",
+          "code": 8,
+          "mfgCode": null,
+          "define": "LEVEL_CONTROL_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "code": 65533,
               "mfgCode": null,
-              "side": "client",
+              "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
+            },
+            {
+              "name": "current level",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x00",
+              "reportable": 1,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
             }
           ]
         },
         {
-          "name": "Scenes",
-          "code": 5,
+          "name": "Basic",
+          "code": 40,
           "mfgCode": null,
-          "define": "SCENES_CLUSTER",
-          "side": "server",
+          "define": "BASIC_CLUSTER",
+          "side": "client",
           "enabled": 0,
-          "commands": [
-            {
-              "name": "AddSceneResponse",
-              "code": 0,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "ViewSceneResponse",
-              "code": 1,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "RemoveSceneResponse",
-              "code": 2,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "RemoveAllScenesResponse",
-              "code": 3,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "StoreSceneResponse",
-              "code": 4,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
+          "attributes": [
             {
-              "name": "GetSceneMembershipResponse",
-              "code": 6,
+              "name": "cluster revision",
+              "code": 65533,
               "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "3",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
             }
           ],
+          "commands": []
+        },
+        {
+          "name": "Basic",
+          "code": 40,
+          "mfgCode": null,
+          "define": "BASIC_CLUSTER",
+          "side": "server",
+          "enabled": 1,
           "attributes": [
             {
               "name": "cluster revision",
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
               "defaultValue": "3",
               "reportable": 0,
               "reportableChange": 0
             },
             {
-              "name": "scene count",
+              "name": "InteractionModelVersion",
               "code": 0,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "0x00",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "current scene",
+              "name": "VendorName",
               "code": 1,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "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": "0x00",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "current group",
-              "code": 2,
+              "name": "ProductID",
+              "code": 4,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "0x0000",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "scene valid",
-              "code": 3,
+              "name": "UserLabel",
+              "code": 5,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "0x00",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "name support",
-              "code": 4,
+              "name": "Location",
+              "code": 6,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
               "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
-            }
-          ]
-        },
-        {
-          "name": "On/off",
-          "code": 6,
-          "mfgCode": null,
-          "define": "ON_OFF_CLUSTER",
-          "side": "client",
-          "enabled": 0,
-          "commands": [
-            {
-              "name": "Off",
-              "code": 0,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "On",
-              "code": 1,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
             },
             {
-              "name": "Toggle",
-              "code": 2,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
+              "name": "HardwareVersion",
+              "code": 7,
               "mfgCode": null,
-              "side": "client",
+              "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "2",
+              "defaultValue": "0x00",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
-            }
-          ]
-        },
-        {
-          "name": "On/off",
-          "code": 6,
-          "mfgCode": null,
-          "define": "ON_OFF_CLUSTER",
-          "side": "server",
-          "enabled": 1,
-          "commands": [],
-          "attributes": [
+            },
             {
-              "name": "cluster revision",
-              "code": 65533,
+              "name": "HardwareVersionString",
+              "code": 8,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "2",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "on/off",
-              "code": 0,
+              "name": "SoftwareVersion",
+              "code": 9,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
               "defaultValue": "0x00",
-              "reportable": 1,
+              "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
-            }
-          ]
-        },
-        {
-          "name": "Level Control",
-          "code": 8,
-          "mfgCode": null,
-          "define": "LEVEL_CONTROL_CLUSTER",
-          "side": "client",
-          "enabled": 0,
-          "attributes": [
+            },
             {
-              "name": "cluster revision",
-              "code": 65533,
+              "name": "SoftwareVersionString",
+              "code": 10,
               "mfgCode": null,
-              "side": "client",
+              "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "3",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
           ],
           "commands": [
             {
-              "name": "MoveToLevel",
+              "name": "StartUp",
               "code": 0,
               "mfgCode": null,
-              "source": "client",
+              "source": "server",
               "incoming": 1,
-              "outgoing": 0
+              "outgoing": 1
             },
             {
-              "name": "Move",
+              "name": "ShutDown",
               "code": 1,
               "mfgCode": null,
-              "source": "client",
+              "source": "server",
               "incoming": 1,
-              "outgoing": 0
+              "outgoing": 1
             },
             {
-              "name": "Step",
+              "name": "Leave",
               "code": 2,
               "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "Stop",
-              "code": 3,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "MoveToLevelWithOnOff",
-              "code": 4,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "MoveWithOnOff",
-              "code": 5,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "StepWithOnOff",
-              "code": 6,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 0
-            },
-            {
-              "name": "StopWithOnOff",
-              "code": 7,
-              "mfgCode": null,
-              "source": "client",
+              "source": "server",
               "incoming": 1,
-              "outgoing": 0
-            }
-          ]
-        },
-        {
-          "name": "Level Control",
-          "code": 8,
-          "mfgCode": null,
-          "define": "LEVEL_CONTROL_CLUSTER",
-          "side": "server",
-          "enabled": 1,
-          "commands": [],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            },
-            {
-              "name": "current level",
-              "code": 0,
-              "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "0x00",
-              "reportable": 1,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
+              "outgoing": 1
             }
           ]
         },
         {
           "name": "Network Commissioning",
-          "code": 43690,
+          "code": 49,
           "mfgCode": null,
           "define": "NETWORK_COMMISSIONING_CLUSTER",
           "side": "client",
         },
         {
           "name": "Network Commissioning",
-          "code": 43690,
+          "code": 49,
           "mfgCode": null,
           "define": "NETWORK_COMMISSIONING_CLUSTER",
           "side": "server",
           "enabled": 1,
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "0x0001",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
-          ],
           "commands": [
             {
               "name": "ScanNetworksResponse",
               "incoming": 1,
               "outgoing": 1
             }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x0001",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
           ]
         }
       ]
index 6ca9152..a80c10e 100644 (file)
@@ -47,7 +47,7 @@
 
 #define FACTORY_RESET_TRIGGER_TIMEOUT 3000
 #define FACTORY_RESET_CANCEL_WINDOW_TIMEOUT 3000
-#define APP_TASK_STACK_SIZE (4096)
+#define APP_TASK_STACK_SIZE (2048)
 #define APP_TASK_PRIORITY 2
 #define APP_EVENT_QUEUE_SIZE 10
 
index f1f7498..c409787 100644 (file)
@@ -81,7 +81,7 @@ k32w_executable("lock_app") {
 
   output_dir = root_out_dir
 
-  ldscript = "${k32w_platform_dir}/app/ldscripts/chip-k32w061-lock-example.ld"
+  ldscript = "${k32w_platform_dir}/app/ldscripts/chip-k32w061-linker.ld"
 
   ldflags = [ "-T" + rebase_path(ldscript, root_build_dir) ]
 }
index 670dc3e..f5d1cfb 100644 (file)
 #include "TimersManager.h"
 #include "app_config.h"
 
-#define FACTORY_RESET_TRIGGER_TIMEOUT 6000
-#define FACTORY_RESET_CANCEL_WINDOW_TIMEOUT 3000
-#define APP_TASK_STACK_SIZE (4096)
-#define APP_TASK_PRIORITY 2
-#define APP_EVENT_QUEUE_SIZE 10
+constexpr uint32_t kFactoryResetTriggerTimeout = 6000;
+constexpr uint8_t kAppEventQueueSize           = 10;
 
 TimerHandle_t sFunctionTimer; // FreeRTOS app sw timer.
 
@@ -65,12 +62,11 @@ int AppTask::StartAppTask()
 {
     int err = CHIP_NO_ERROR;
 
-    sAppEventQueue = xQueueCreate(APP_EVENT_QUEUE_SIZE, sizeof(AppEvent));
+    sAppEventQueue = xQueueCreate(kAppEventQueueSize, sizeof(AppEvent));
     if (sAppEventQueue == NULL)
     {
-        err = CHIP_ERROR_MAX;
         K32W_LOG("Failed to allocate app event queue");
-        assert(err == CHIP_NO_ERROR);
+        assert(false);
     }
 
     return err;
@@ -329,7 +325,7 @@ void AppTask::ResetActionEventHandler(AppEvent * aEvent)
     }
     else
     {
-        uint32_t resetTimeout = FACTORY_RESET_TRIGGER_TIMEOUT;
+        uint32_t resetTimeout = kFactoryResetTriggerTimeout;
 
         if (sAppTask.mFunction != kFunction_NoneSelected)
         {
@@ -347,7 +343,7 @@ void AppTask::ResetActionEventHandler(AppEvent * aEvent)
         sStatusLED.Blink(500);
         sLockLED.Blink(500);
 
-        sAppTask.StartTimer(FACTORY_RESET_TRIGGER_TIMEOUT);
+        sAppTask.StartTimer(kFactoryResetTriggerTimeout);
     }
 }
 
index 932a186..e58c95d 100644 (file)
@@ -25,6 +25,8 @@ config("includes") {
 source_set("lock-common") {
   sources = [
     "${chip_root}/src/app/clusters/bindings/bindings.cpp",
+    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning-ember.cpp",
+    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning.cpp",
     "${chip_root}/src/app/clusters/on-off-server/on-off.cpp",
     "${chip_root}/src/app/reporting/reporting-default-configuration.cpp",
     "${chip_root}/src/app/reporting/reporting.cpp",
index acd8add..786c7dc 100644 (file)
@@ -66,6 +66,52 @@ NS_ASSUME_NONNULL_BEGIN
 @end
 
 /**
+ * Cluster Network Commissioning
+ *
+ */
+@interface CHIPNetworkCommissioning : CHIPCluster
+
+- (void)addThreadNetwork:(NSData *)operationalDataset
+              breadcrumb:(uint64_t)breadcrumb
+               timeoutMs:(uint32_t)timeoutMs
+       completionHandler:(ResponseHandler)completionHandler;
+- (void)addWiFiNetwork:(NSData *)ssid
+           credentials:(NSData *)credentials
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler;
+- (void)disableNetwork:(NSData *)networkID
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler;
+- (void)enableNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler;
+- (void)getLastNetworkCommissioningResult:(uint32_t)timeoutMs completionHandler:(ResponseHandler)completionHandler;
+- (void)removeNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler;
+- (void)scanNetworks:(NSData *)ssid
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler;
+- (void)updateThreadNetwork:(NSData *)operationalDataset
+                 breadcrumb:(uint64_t)breadcrumb
+                  timeoutMs:(uint32_t)timeoutMs
+          completionHandler:(ResponseHandler)completionHandler;
+- (void)updateWiFiNetwork:(NSData *)ssid
+              credentials:(NSData *)credentials
+               breadcrumb:(uint64_t)breadcrumb
+                timeoutMs:(uint32_t)timeoutMs
+        completionHandler:(ResponseHandler)completionHandler;
+
+- (void)readAttributeClusterRevision:(ResponseHandler)completionHandler;
+
+@end
+
+/**
  * Cluster On/off
  *
  */
index 2877d11..ce5be43 100644 (file)
@@ -21,7 +21,7 @@
 
 #import "CHIPDevice.h"
 #import "CHIPDevice_Internal.h"
-#import "ChipError.h"
+#import "CHIPError.h"
 #import "gen/CHIPClientCallbacks.h"
 #import "gen/CHIPClustersObjc.h"
 
@@ -292,6 +292,38 @@ private:
     bool mKeepAlive;
 };
 
+class CHIPInt64uAttributeCallbackBridge : public Callback::Callback<Int64uAttributeCallback> {
+public:
+    CHIPInt64uAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
+        : Callback::Callback<Int64uAttributeCallback>(CallbackFn, this)
+        , mHandler(handler)
+        , mQueue(queue)
+        , mKeepAlive(keepAlive)
+    {
+    }
+
+    ~CHIPInt64uAttributeCallbackBridge() {};
+
+    static void CallbackFn(void * context, uint64_t value)
+    {
+        CHIPInt64uAttributeCallbackBridge * callback = reinterpret_cast<CHIPInt64uAttributeCallbackBridge *>(context);
+        if (callback && callback->mQueue) {
+            dispatch_async(callback->mQueue, ^{
+                callback->mHandler(nil, @ { @"value" : [NSNumber numberWithUnsignedLongLong:value] });
+                if (!callback->mKeepAlive) {
+                    callback->Cancel();
+                    delete callback;
+                }
+            });
+        }
+    };
+
+private:
+    ResponseHandler mHandler;
+    dispatch_queue_t mQueue;
+    bool mKeepAlive;
+};
+
 class CHIPInt16sAttributeCallbackBridge : public Callback::Callback<Int16sAttributeCallback> {
 public:
     CHIPInt16sAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
@@ -699,6 +731,285 @@ private:
 
 @end
 
+@interface CHIPNetworkCommissioning ()
+@property (readonly) Controller::NetworkCommissioningCluster cppCluster;
+@end
+
+@implementation CHIPNetworkCommissioning
+
+- (Controller::ClusterBase *)getCluster
+{
+    return &_cppCluster;
+}
+
+- (void)addThreadNetwork:(NSData *)operationalDataset
+              breadcrumb:(uint64_t)breadcrumb
+               timeoutMs:(uint32_t)timeoutMs
+       completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterAddThreadNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterAddThreadNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.AddThreadNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) operationalDataset.bytes, operationalDataset.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)addWiFiNetwork:(NSData *)ssid
+           credentials:(NSData *)credentials
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterAddWiFiNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterAddWiFiNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.AddWiFiNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) ssid.bytes, ssid.length),
+        chip::ByteSpan((const uint8_t *) credentials.bytes, credentials.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)disableNetwork:(NSData *)networkID
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterDisableNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterDisableNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.DisableNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) networkID.bytes, networkID.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)enableNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterEnableNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterEnableNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.EnableNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) networkID.bytes, networkID.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)getLastNetworkCommissioningResult:(uint32_t)timeoutMs completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPDefaultSuccessCallbackBridge * onSuccess = new CHIPDefaultSuccessCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.GetLastNetworkCommissioningResult(onSuccess->Cancel(), onFailure->Cancel(), timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)removeNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterRemoveNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterRemoveNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.RemoveNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) networkID.bytes, networkID.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)scanNetworks:(NSData *)ssid
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterScanNetworksResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterScanNetworksResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.ScanNetworks(
+        onSuccess->Cancel(), onFailure->Cancel(), chip::ByteSpan((const uint8_t *) ssid.bytes, ssid.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)updateThreadNetwork:(NSData *)operationalDataset
+                 breadcrumb:(uint64_t)breadcrumb
+                  timeoutMs:(uint32_t)timeoutMs
+          completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterUpdateThreadNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterUpdateThreadNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.UpdateThreadNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) operationalDataset.bytes, operationalDataset.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)updateWiFiNetwork:(NSData *)ssid
+              credentials:(NSData *)credentials
+               breadcrumb:(uint64_t)breadcrumb
+                timeoutMs:(uint32_t)timeoutMs
+        completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterUpdateWiFiNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterUpdateWiFiNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.UpdateWiFiNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) ssid.bytes, ssid.length),
+        chip::ByteSpan((const uint8_t *) credentials.bytes, credentials.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+
+- (void)readAttributeClusterRevision:(ResponseHandler)completionHandler
+{
+    CHIPInt16uAttributeCallbackBridge * onSuccess = new CHIPInt16uAttributeCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.ReadAttributeClusterRevision(onSuccess->Cancel(), onFailure->Cancel());
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+
+@end
+
 @interface CHIPOnOff ()
 @property (readonly) Controller::OnOffCluster cppCluster;
 @end
index 72eaae7..a6156f9 100644 (file)
@@ -39,6 +39,335 @@ namespace app {
 
 namespace clusters {
 
+namespace NetworkCommissioning {
+
+void DispatchServerCommand(app::Command * command, CommandId commandId, EndpointId endpointId, TLV::TLVReader & dataTlv)
+{
+    {
+        switch (commandId)
+        {
+        case ZCL_ADD_THREAD_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(operationalDataset);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterAddThreadNetworkCallback(const_cast<uint8_t *>(operationalDataset), breadcrumb,
+                                                                       timeoutMs);
+            break;
+        }
+        case ZCL_ADD_WI_FI_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * ssid;
+            const uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(ssid);
+                    break;
+                case 1:
+                    TLVError = dataTlv.GetDataPtr(credentials);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 3:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(const_cast<uint8_t *>(ssid),
+                                                                     const_cast<uint8_t *>(credentials), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_DISABLE_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(networkID);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterDisableNetworkCallback(const_cast<uint8_t *>(networkID), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_ENABLE_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(networkID);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterEnableNetworkCallback(const_cast<uint8_t *>(networkID), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(timeoutMs);
+            break;
+        }
+        case ZCL_REMOVE_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * NetworkID;
+            uint64_t Breadcrumb;
+            uint32_t TimeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(NetworkID);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(Breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(TimeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterRemoveNetworkCallback(const_cast<uint8_t *>(NetworkID), Breadcrumb, TimeoutMs);
+            break;
+        }
+        case ZCL_SCAN_NETWORKS_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * ssid;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(ssid);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterScanNetworksCallback(const_cast<uint8_t *>(ssid), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(operationalDataset);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(const_cast<uint8_t *>(operationalDataset), breadcrumb,
+                                                                          timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * ssid;
+            const uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(ssid);
+                    break;
+                case 1:
+                    TLVError = dataTlv.GetDataPtr(credentials);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 3:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(const_cast<uint8_t *>(ssid),
+                                                                        const_cast<uint8_t *>(credentials), breadcrumb, timeoutMs);
+            break;
+        }
+        default: {
+            // Unrecognized command ID, error status will apply.
+            // TODO: Encode response for command not found
+            ChipLogError(Zcl, "Unknown command %" PRIx16 " for cluster %" PRIx16, commandId, ZCL_NETWORK_COMMISSIONING_CLUSTER_ID);
+            break;
+        }
+        }
+    }
+}
+
+} // namespace NetworkCommissioning
+
 namespace OnOff {
 
 void DispatchServerCommand(app::Command * command, CommandId commandId, EndpointId endpointId, TLV::TLVReader & dataTlv)
@@ -83,6 +412,9 @@ void DispatchSingleClusterCommand(chip::ClusterId aClusterId, chip::CommandId aC
     Compatibility::SetupEmberAfObjects(apCommandObj, aClusterId, aCommandId, aEndPointId);
     switch (aClusterId)
     {
+    case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
+        clusters::NetworkCommissioning::DispatchServerCommand(apCommandObj, aCommandId, aEndPointId, aReader);
+        break;
     case ZCL_ON_OFF_CLUSTER_ID:
         clusters::OnOff::DispatchServerCommand(apCommandObj, aCommandId, aEndPointId, aReader);
         break;
index 8c8757f..72a0198 100644 (file)
 #define ZCL_FABRIC_ID_ATTRIBUTE_ID (0x0000)
 #define ZCL_BREADCRUMB_ATTRIBUTE_ID (0x0001)
 
+// Attribute ids for cluster: Network Commissioning
+
+// Client attributes
+
+// Server attributes
+
 // Attribute ids for cluster: Shade Configuration
 
 // Client attributes
 
 // Server attributes
 
-// Attribute ids for cluster: Network Commissioning
-
-// Client attributes
-
-// Server attributes
-
 // Attribute ids for cluster: Binding
 
 // Client attributes
index 730d7b2..9da037e 100644 (file)
@@ -29,6 +29,7 @@
 using namespace chip;
 
 EmberAfStatus emberAfBasicClusterServerCommandParse(EmberAfClusterCommand * cmd);
+EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd);
 EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd);
 
 static EmberAfStatus status(bool wasHandled, bool clusterExists, bool mfgSpecific)
@@ -74,6 +75,9 @@ EmberAfStatus emberAfClusterSpecificCommandParse(EmberAfClusterCommand * cmd)
             // No commands are enabled for cluster Basic
             result = status(false, true, cmd->mfgSpecific);
             break;
+        case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
+            result = emberAfNetworkCommissioningClusterServerCommandParse(cmd);
+            break;
         case ZCL_ON_OFF_CLUSTER_ID:
             result = emberAfOnOffClusterServerCommandParse(cmd);
             break;
@@ -87,6 +91,265 @@ EmberAfStatus emberAfClusterSpecificCommandParse(EmberAfClusterCommand * cmd)
 
 // Cluster specific command parsing
 
+EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd)
+{
+    bool wasHandled = false;
+
+    if (!cmd->mfgSpecific)
+    {
+        switch (cmd->commandId)
+        {
+        case ZCL_ADD_THREAD_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            operationalDataset = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset      = static_cast<uint16_t>(payloadOffset + emberAfStringLength(operationalDataset) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterAddThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_ADD_WI_FI_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * ssid;
+            uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            ssid          = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            credentials   = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(credentials) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_DISABLE_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            networkID     = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(networkID) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterDisableNetworkCallback(networkID, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_ENABLE_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            networkID     = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(networkID) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterEnableNetworkCallback(networkID, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(timeoutMs);
+            break;
+        }
+        case ZCL_REMOVE_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * NetworkID;
+            uint64_t Breadcrumb;
+            uint32_t TimeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            NetworkID     = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(NetworkID) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            Breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            TimeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterRemoveNetworkCallback(NetworkID, Breadcrumb, TimeoutMs);
+            break;
+        }
+        case ZCL_SCAN_NETWORKS_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * ssid;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            ssid          = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterScanNetworksCallback(ssid, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            operationalDataset = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset      = static_cast<uint16_t>(payloadOffset + emberAfStringLength(operationalDataset) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * ssid;
+            uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            ssid          = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            credentials   = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(credentials) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
+            break;
+        }
+        default: {
+            // Unrecognized command ID, error status will apply.
+            break;
+        }
+        }
+    }
+    return status(wasHandled, true, cmd->mfgSpecific);
+}
 EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd)
 {
     bool wasHandled = false;
index 3c6022f..fad53a9 100644 (file)
@@ -30,6 +30,9 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId)
     case ZCL_BASIC_CLUSTER_ID:
         emberAfBasicClusterInitCallback(endpoint);
         break;
+    case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
+        emberAfNetworkCommissioningClusterInitCallback(endpoint);
+        break;
     case ZCL_ON_OFF_CLUSTER_ID:
         emberAfOnOffClusterInitCallback(endpoint);
         break;
@@ -44,6 +47,11 @@ void __attribute__((weak)) emberAfBasicClusterInitCallback(EndpointId endpoint)
     // To prevent warning
     (void) endpoint;
 }
+void __attribute__((weak)) emberAfNetworkCommissioningClusterInitCallback(EndpointId endpoint)
+{
+    // To prevent warning
+    (void) endpoint;
+}
 void __attribute__((weak)) emberAfOnOffClusterInitCallback(EndpointId endpoint)
 {
     // To prevent warning
index 367f192..4f0364b 100644 (file)
@@ -45,6 +45,14 @@ void emberAfClusterInitCallback(chip::EndpointId endpoint, chip::ClusterId clust
  */
 void emberAfBasicClusterInitCallback(chip::EndpointId endpoint);
 
+/** @brief Network Commissioning Cluster Init
+ *
+ * Cluster Init
+ *
+ * @param endpoint    Endpoint that is being initialized
+ */
+void emberAfNetworkCommissioningClusterInitCallback(chip::EndpointId endpoint);
+
 /** @brief On/off Cluster Init
  *
  * Cluster Init
@@ -124,6 +132,77 @@ EmberAfStatus emberAfBasicClusterServerPreAttributeChangedCallback(chip::Endpoin
 void emberAfBasicClusterServerTickCallback(chip::EndpointId endpoint);
 
 //
+// Network Commissioning Cluster server
+//
+
+/** @brief Network Commissioning Cluster Server Init
+ *
+ * Server Init
+ *
+ * @param endpoint    Endpoint that is being initialized
+ */
+void emberAfNetworkCommissioningClusterServerInitCallback(chip::EndpointId endpoint);
+
+/** @brief Network Commissioning Cluster Server Attribute Changed
+ *
+ * Server Attribute Changed
+ *
+ * @param endpoint    Endpoint that is being initialized
+ * @param attributeId Attribute that changed
+ */
+void emberAfNetworkCommissioningClusterServerAttributeChangedCallback(chip::EndpointId endpoint, chip::AttributeId attributeId);
+
+/** @brief Network Commissioning Cluster Server Manufacturer Specific Attribute Changed
+ *
+ * Server Manufacturer Specific Attribute Changed
+ *
+ * @param endpoint          Endpoint that is being initialized
+ * @param attributeId       Attribute that changed
+ * @param manufacturerCode  Manufacturer Code of the attribute that changed
+ */
+void emberAfNetworkCommissioningClusterServerManufacturerSpecificAttributeChangedCallback(chip::EndpointId endpoint,
+                                                                                          chip::AttributeId attributeId,
+                                                                                          uint16_t manufacturerCode);
+
+/** @brief Network Commissioning Cluster Server Message Sent
+ *
+ * Server Message Sent
+ *
+ * @param type               The type of message sent
+ * @param indexOrDestination The destination or address to which the message was sent
+ * @param apsFrame           The APS frame for the message
+ * @param msgLen             The length of the message
+ * @param message            The message that was sent
+ * @param status             The status of the sent message
+ */
+void emberAfNetworkCommissioningClusterServerMessageSentCallback(EmberOutgoingMessageType type, uint64_t indexOrDestination,
+                                                                 EmberApsFrame * apsFrame, uint16_t msgLen, uint8_t * message,
+                                                                 EmberStatus status);
+
+/** @brief Network Commissioning Cluster Server Pre Attribute Changed
+ *
+ * server Pre Attribute Changed
+ *
+ * @param endpoint      Endpoint that is being initialized
+ * @param attributeId   Attribute to be changed
+ * @param attributeType Attribute type
+ * @param size          Attribute size
+ * @param value         Attribute value
+ */
+EmberAfStatus emberAfNetworkCommissioningClusterServerPreAttributeChangedCallback(chip::EndpointId endpoint,
+                                                                                  chip::AttributeId attributeId,
+                                                                                  EmberAfAttributeType attributeType, uint8_t size,
+                                                                                  uint8_t * value);
+
+/** @brief Network Commissioning Cluster Server Tick
+ *
+ * server Tick
+ *
+ * @param endpoint  Endpoint that is being served
+ */
+void emberAfNetworkCommissioningClusterServerTickCallback(chip::EndpointId endpoint);
+
+//
 // On/off Cluster server
 //
 
@@ -194,6 +273,91 @@ void emberAfOnOffClusterServerTickCallback(chip::EndpointId endpoint);
 // Cluster Commands Callback
 
 /**
+ * @brief Network Commissioning Cluster AddThreadNetwork Command callback
+ * @param operationalDataset
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterAddThreadNetworkCallback(uint8_t * operationalDataset, uint64_t breadcrumb,
+                                                                uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster AddWiFiNetwork Command callback
+ * @param ssid
+ * @param credentials
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(uint8_t * ssid, uint8_t * credentials, uint64_t breadcrumb,
+                                                              uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster DisableNetwork Command callback
+ * @param networkID
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterDisableNetworkCallback(uint8_t * networkID, uint64_t breadcrumb, uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster EnableNetwork Command callback
+ * @param networkID
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterEnableNetworkCallback(uint8_t * networkID, uint64_t breadcrumb, uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster GetLastNetworkCommissioningResult Command callback
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster RemoveNetwork Command callback
+ * @param networkID
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterRemoveNetworkCallback(uint8_t * NetworkID, uint64_t Breadcrumb, uint32_t TimeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster ScanNetworks Command callback
+ * @param ssid
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterScanNetworksCallback(uint8_t * ssid, uint64_t breadcrumb, uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster UpdateThreadNetwork Command callback
+ * @param operationalDataset
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(uint8_t * operationalDataset, uint64_t breadcrumb,
+                                                                   uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster UpdateWiFiNetwork Command callback
+ * @param ssid
+ * @param credentials
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(uint8_t * ssid, uint8_t * credentials, uint64_t breadcrumb,
+                                                                 uint32_t timeoutMs);
+
+/**
  * @brief On/off Cluster Off Command callback
  */
 
index f72c96f..79d1e15 100644 (file)
                                                                                                                                    \
                                   ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
 
+/** @brief Command description for ScanNetworks
+ *
+ * Command: ScanNetworks
+ * @param ssid OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterScanNetworks(ssid, breadcrumb, timeoutMs)                                                                  \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_SCAN_NETWORKS_COMMAND_ID, "uuu", ssid, breadcrumb, timeoutMs);
+
+/** @brief Command description for ScanNetworksResponse
+ *
+ * Command: ScanNetworksResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ * @param wifiScanResults WiFiInterfaceScanResult []
+ * @param wifiScanResultsLen int
+ * @param threadScanResults ThreadInterfaceScanResult []
+ * @param threadScanResultsLen int
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterScanNetworksResponse(errorCode, debugText, wifiScanResults, wifiScanResultsLen, threadScanResults,         \
+                                             threadScanResultsLen)                                                                 \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID, "uubb", errorCode, debugText, wifiScanResults,            \
+                                  wifiScanResultsLen, threadScanResults, threadScanResultsLen);
+
+/** @brief Command description for AddWiFiNetwork
+ *
+ * Command: AddWiFiNetwork
+ * @param ssid OCTET_STRING
+ * @param credentials OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                   \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
+
+/** @brief Command description for AddWiFiNetworkResponse
+ *
+ * Command: AddWiFiNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddWiFiNetworkResponse(errorCode, debugText)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for UpdateWiFiNetwork
+ *
+ * Command: UpdateWiFiNetwork
+ * @param ssid OCTET_STRING
+ * @param credentials OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
+
+/** @brief Command description for UpdateWiFiNetworkResponse
+ *
+ * Command: UpdateWiFiNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateWiFiNetworkResponse(errorCode, debugText)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for AddThreadNetwork
+ *
+ * Command: AddThreadNetwork
+ * @param operationalDataset OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
+
+/** @brief Command description for AddThreadNetworkResponse
+ *
+ * Command: AddThreadNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddThreadNetworkResponse(errorCode, debugText)                                                             \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for UpdateThreadNetwork
+ *
+ * Command: UpdateThreadNetwork
+ * @param operationalDataset OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                             \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
+
+/** @brief Command description for UpdateThreadNetworkResponse
+ *
+ * Command: UpdateThreadNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateThreadNetworkResponse(errorCode, debugText)                                                          \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for RemoveNetwork
+ *
+ * Command: RemoveNetwork
+ * @param NetworkID OCTET_STRING
+ * @param Breadcrumb INT64U
+ * @param TimeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterRemoveNetwork(NetworkID, Breadcrumb, TimeoutMs)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_REMOVE_NETWORK_COMMAND_ID, "uuu", NetworkID, Breadcrumb, TimeoutMs);
+
+/** @brief Command description for RemoveNetworkResponse
+ *
+ * Command: RemoveNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterRemoveNetworkResponse(errorCode, debugText)                                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for EnableNetwork
+ *
+ * Command: EnableNetwork
+ * @param networkID OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterEnableNetwork(networkID, breadcrumb, timeoutMs)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ENABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
+
+/** @brief Command description for EnableNetworkResponse
+ *
+ * Command: EnableNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterEnableNetworkResponse(errorCode, debugText)                                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for DisableNetwork
+ *
+ * Command: DisableNetwork
+ * @param networkID OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterDisableNetwork(networkID, breadcrumb, timeoutMs)                                                           \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_DISABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
+
+/** @brief Command description for DisableNetworkResponse
+ *
+ * Command: DisableNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterDisableNetworkResponse(errorCode, debugText)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for GetLastNetworkCommissioningResult
+ *
+ * Command: GetLastNetworkCommissioningResult
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterGetLastNetworkCommissioningResult(timeoutMs)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID, "u", timeoutMs);
+
 /** @brief Command description for LockDoor
  *
  * Command: LockDoor
                                   ZCL_GET_ENDPOINT_LIST_REQUEST_COMMAND_ID, "uuuub", startIndex, total, startIndex, count,         \
                                   endpointInformationRecordList, endpointInformationRecordListLen);
 
-/** @brief Command description for ScanNetworks
- *
- * Command: ScanNetworks
- * @param ssid OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterScanNetworks(ssid, breadcrumb, timeoutMs)                                                                  \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_SCAN_NETWORKS_COMMAND_ID, "uuu", ssid, breadcrumb, timeoutMs);
-
-/** @brief Command description for ScanNetworksResponse
- *
- * Command: ScanNetworksResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- * @param wifiScanResults WiFiInterfaceScanResult []
- * @param wifiScanResultsLen int
- * @param threadScanResults ThreadInterfaceScanResult []
- * @param threadScanResultsLen int
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterScanNetworksResponse(errorCode, debugText, wifiScanResults, wifiScanResultsLen, threadScanResults,         \
-                                             threadScanResultsLen)                                                                 \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID, "uubb", errorCode, debugText, wifiScanResults,            \
-                                  wifiScanResultsLen, threadScanResults, threadScanResultsLen);
-
-/** @brief Command description for AddWiFiNetwork
- *
- * Command: AddWiFiNetwork
- * @param ssid OCTET_STRING
- * @param credentials OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                   \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
-
-/** @brief Command description for AddWiFiNetworkResponse
- *
- * Command: AddWiFiNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddWiFiNetworkResponse(errorCode, debugText)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for UpdateWiFiNetwork
- *
- * Command: UpdateWiFiNetwork
- * @param ssid OCTET_STRING
- * @param credentials OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
-
-/** @brief Command description for UpdateWiFiNetworkResponse
- *
- * Command: UpdateWiFiNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateWiFiNetworkResponse(errorCode, debugText)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for AddThreadNetwork
- *
- * Command: AddThreadNetwork
- * @param operationalDataset OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
-
-/** @brief Command description for AddThreadNetworkResponse
- *
- * Command: AddThreadNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddThreadNetworkResponse(errorCode, debugText)                                                             \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for UpdateThreadNetwork
- *
- * Command: UpdateThreadNetwork
- * @param operationalDataset OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                             \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
-
-/** @brief Command description for UpdateThreadNetworkResponse
- *
- * Command: UpdateThreadNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateThreadNetworkResponse(errorCode, debugText)                                                          \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for RemoveNetwork
- *
- * Command: RemoveNetwork
- * @param NetworkID OCTET_STRING
- * @param Breadcrumb INT64U
- * @param TimeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterRemoveNetwork(NetworkID, Breadcrumb, TimeoutMs)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_REMOVE_NETWORK_COMMAND_ID, "uuu", NetworkID, Breadcrumb, TimeoutMs);
-
-/** @brief Command description for RemoveNetworkResponse
- *
- * Command: RemoveNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterRemoveNetworkResponse(errorCode, debugText)                                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for EnableNetwork
- *
- * Command: EnableNetwork
- * @param networkID OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterEnableNetwork(networkID, breadcrumb, timeoutMs)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ENABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
-
-/** @brief Command description for EnableNetworkResponse
- *
- * Command: EnableNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterEnableNetworkResponse(errorCode, debugText)                                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for DisableNetwork
- *
- * Command: DisableNetwork
- * @param networkID OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterDisableNetwork(networkID, breadcrumb, timeoutMs)                                                           \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_DISABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
-
-/** @brief Command description for DisableNetworkResponse
- *
- * Command: DisableNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterDisableNetworkResponse(errorCode, debugText)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for GetLastNetworkCommissioningResult
- *
- * Command: GetLastNetworkCommissioningResult
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterGetLastNetworkCommissioningResult(timeoutMs)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID, "u", timeoutMs);
-
 /** @brief Command description for Bind
  *
  * Command: Bind
index d77da91..add8f83 100644 (file)
@@ -86,6 +86,9 @@
 // Definitions for cluster: General Commissioning
 #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030)
 
+// Definitions for cluster: Network Commissioning
+#define ZCL_NETWORK_COMMISSIONING_CLUSTER_ID (0x0031)
+
 // Definitions for cluster: Shade Configuration
 #define ZCL_SHADE_CONFIG_CLUSTER_ID (0x0100)
 
 // Definitions for cluster: ZLL Commissioning
 #define ZCL_ZLL_COMMISSIONING_CLUSTER_ID (0x1000)
 
-// Definitions for cluster: Network Commissioning
-#define ZCL_NETWORK_COMMISSIONING_CLUSTER_ID (0xAAAA)
-
 // Definitions for cluster: Binding
 #define ZCL_BINDING_CLUSTER_ID (0xF000)
 
index adc2b1c..864943b 100644 (file)
 #define ZCL_COMMISSIONING_COMPLETE_COMMAND_ID (0x06)
 #define ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID (0x07)
 
+// Commands for cluster: Network Commissioning
+#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00)
+#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01)
+#define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
+#define ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x03)
+#define ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x04)
+#define ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x05)
+#define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
+#define ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x07)
+#define ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID (0x08)
+#define ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x09)
+#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x0A)
+#define ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID (0x0B)
+#define ZCL_ENABLE_NETWORK_COMMAND_ID (0x0C)
+#define ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID (0x0D)
+#define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
+#define ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID (0x0F)
+#define ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID (0x10)
+
 // Commands for cluster: Door Lock
 #define ZCL_LOCK_DOOR_COMMAND_ID (0x00)
 #define ZCL_LOCK_DOOR_RESPONSE_COMMAND_ID (0x00)
 #define ZCL_GET_ENDPOINT_LIST_REQUEST_COMMAND_ID (0x42)
 #define ZCL_GET_ENDPOINT_LIST_RESPONSE_COMMAND_ID (0x42)
 
-// Commands for cluster: Network Commissioning
-#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00)
-#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01)
-#define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
-#define ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x03)
-#define ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x04)
-#define ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x05)
-#define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
-#define ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x07)
-#define ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID (0x08)
-#define ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x09)
-#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x0A)
-#define ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID (0x0B)
-#define ZCL_ENABLE_NETWORK_COMMAND_ID (0x0C)
-#define ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID (0x0D)
-#define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
-#define ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID (0x0F)
-#define ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID (0x10)
-
 // Commands for cluster: Binding
 #define ZCL_BIND_COMMAND_ID (0x00)
 #define ZCL_UNBIND_COMMAND_ID (0x01)
index 07daefd..ea49715 100644 (file)
 
 #define ZAP_ATTRIBUTE_MASK(mask) ATTRIBUTE_MASK_##mask
 // This is an array of EmberAfAttributeMetadata structures.
-#define GENERATED_ATTRIBUTE_COUNT 14
+#define GENERATED_ATTRIBUTE_COUNT 15
 #define GENERATED_ATTRIBUTES                                                                                                       \
     {                                                                                                                              \
         { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 2 } },         /* On/off (server): cluster revision */                     \
             }, /* Basic (server): SoftwareVersion */                                                                               \
             {                                                                                                                      \
                 0x000A, ZAP_TYPE(CHAR_STRING), 64, ZAP_ATTRIBUTE_MASK(SINGLETON), { (uint8_t *) ZAP_LONG_DEFAULTS_INDEX(180) }     \
-            }, /* Basic (server): SoftwareVersionString */                                                                         \
+            },                                                          /* Basic (server): SoftwareVersionString */                \
+            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Network Commissioning (server): cluster revision */     \
     }
 
 // This is an array of EmberAfCluster structures.
     };
 
 #define ZAP_CLUSTER_MASK(mask) CLUSTER_MASK_##mask
-#define GENERATED_CLUSTER_COUNT 2
+#define GENERATED_CLUSTER_COUNT 3
 #define GENERATED_CLUSTERS                                                                                                         \
     {                                                                                                                              \
         {                                                                                                                          \
             {                                                                                                                      \
                 0x0028, ZAP_ATTRIBUTE_INDEX(2), 12, 254, ZAP_CLUSTER_MASK(SERVER), NULL                                            \
             }, /* Endpoint: 1, Cluster: Basic (server) */                                                                          \
+            {                                                                                                                      \
+                0x0031, ZAP_ATTRIBUTE_INDEX(14), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
+            }, /* Endpoint: 1, Cluster: Network Commissioning (server) */                                                          \
     }
 
 #define ZAP_CLUSTER_INDEX(index) ((EmberAfCluster *) (&generatedClusters[index]))
 // This is an array of EmberAfEndpointType structures.
 #define GENERATED_ENDPOINT_TYPES                                                                                                   \
     {                                                                                                                              \
-        { ZAP_CLUSTER_INDEX(0), 2, 257 },                                                                                          \
+        { ZAP_CLUSTER_INDEX(0), 3, 259 },                                                                                          \
     }
 
 // Largest attribute size is needed for various buffers
 #define ATTRIBUTE_SINGLETONS_SIZE (254)
 
 // Total size of attribute storage
-#define ATTRIBUTE_MAX_SIZE (257)
+#define ATTRIBUTE_MAX_SIZE (259)
 
 // Number of fixed endpoints
 #define FIXED_ENDPOINT_COUNT (1)
 
 // Array of EmberAfCommandMetadata structs.
 #define ZAP_COMMAND_MASK(mask) COMMAND_MASK_##mask
-#define EMBER_AF_GENERATED_COMMAND_COUNT (6)
+#define EMBER_AF_GENERATED_COMMAND_COUNT (23)
 #define GENERATED_COMMANDS                                                                                                         \
     {                                                                                                                              \
         { 0x0006, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) },     /* On/off (server): Off */                                        \
             { 0x0028, 0x00, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): StartUp */                                     \
             { 0x0028, 0x01, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): ShutDown */                                    \
             { 0x0028, 0x02, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): Leave */                                       \
+            { 0x0031, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): ScanNetworks */                \
+            { 0x0031, 0x01, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): ScanNetworksResponse */        \
+            { 0x0031, 0x02, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): AddWiFiNetwork */              \
+            { 0x0031, 0x03, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): AddWiFiNetworkResponse */      \
+            { 0x0031, 0x04, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): UpdateWiFiNetwork */           \
+            { 0x0031, 0x05, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): UpdateWiFiNetworkResponse */   \
+            { 0x0031, 0x06, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): AddThreadNetwork */            \
+            { 0x0031, 0x07, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): AddThreadNetworkResponse */    \
+            { 0x0031, 0x08, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): UpdateThreadNetwork */         \
+            { 0x0031, 0x09, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): UpdateThreadNetworkResponse */ \
+            { 0x0031, 0x0A, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): RemoveNetwork */               \
+            { 0x0031, 0x0B, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): RemoveNetworkResponse */       \
+            { 0x0031, 0x0C, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): EnableNetwork */               \
+            { 0x0031, 0x0D, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): EnableNetworkResponse */       \
+            { 0x0031, 0x0E, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): DisableNetwork */              \
+            { 0x0031, 0x0F, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): DisableNetworkResponse */      \
+            { 0x0031, 0x10,                                                                                                        \
+              ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): GetLastNetworkCommissioningResult */         \
     }
 
 // Array of EmberAfManufacturerCodeEntry structures for commands.
index d4f918b..48ae4c3 100644 (file)
@@ -30,6 +30,7 @@
 
 /**** Cluster endpoint counts ****/
 #define EMBER_AF_BASIC_CLUSTER_SERVER_ENDPOINT_COUNT (1)
+#define EMBER_AF_NETWORK_COMMISSIONING_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_ON_OFF_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 
 /**** Cluster Plugins ****/
 #define EMBER_AF_PLUGIN_BASIC_SERVER
 #define EMBER_AF_PLUGIN_BASIC
 
+// Use this macro to check if the server side of the Network Commissioning cluster is included
+#define ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER
+#define EMBER_AF_PLUGIN_NETWORK_COMMISSIONING_SERVER
+#define EMBER_AF_PLUGIN_NETWORK_COMMISSIONING
+
 // Use this macro to check if the server side of the On/off cluster is included
 #define ZCL_USING_ON_OFF_CLUSTER_SERVER
 #define EMBER_AF_PLUGIN_ON_OFF_SERVER
index bd08d38..8c737e9 100644 (file)
 #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER
 #endif
 
+#if defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_CLIENT)
+#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER { ZCL_NETWORK_COMMISSIONING_CLUSTER_ID, 49, "Network Commissioning" },
+#else
+#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER
+#endif
+
 #if defined(ZCL_USING_SHADE_CONFIG_CLUSTER_SERVER) || defined(ZCL_USING_SHADE_CONFIG_CLUSTER_CLIENT)
 #define CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER { ZCL_SHADE_CONFIG_CLUSTER_ID, 256, "Shade Configuration" },
 #else
 #define CHIP_PRINTCLUSTER_ZLL_COMMISSIONING_CLUSTER
 #endif
 
-#if defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_CLIENT)
-#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER { ZCL_NETWORK_COMMISSIONING_CLUSTER_ID, 43690, "Network Commissioning" },
-#else
-#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER
-#endif
-
 #if defined(ZCL_USING_BINDING_CLUSTER_SERVER) || defined(ZCL_USING_BINDING_CLUSTER_CLIENT)
 #define CHIP_PRINTCLUSTER_BINDING_CLUSTER { ZCL_BINDING_CLUSTER_ID, 61440, "Binding" },
 #else
     CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER                                                                                            \
     CHIP_PRINTCLUSTER_BASIC_CLUSTER                                                                                                \
     CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER                                                                                \
+    CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER                                                                                \
     CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER                                                                                         \
     CHIP_PRINTCLUSTER_DOOR_LOCK_CLUSTER                                                                                            \
     CHIP_PRINTCLUSTER_WINDOW_COVERING_CLUSTER                                                                                      \
     CHIP_PRINTCLUSTER_ELECTRICAL_MEASUREMENT_CLUSTER                                                                               \
     CHIP_PRINTCLUSTER_DIAGNOSTICS_CLUSTER                                                                                          \
     CHIP_PRINTCLUSTER_ZLL_COMMISSIONING_CLUSTER                                                                                    \
-    CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER                                                                                \
     CHIP_PRINTCLUSTER_BINDING_CLUSTER                                                                                              \
     CHIP_PRINTCLUSTER_MEDIA_PLAYBACK_CLUSTER                                                                                       \
     CHIP_PRINTCLUSTER_CONTENT_LAUNCH_CLUSTER                                                                                       \
index 807263d..6b9c6e7 100644 (file)
@@ -1,5 +1,5 @@
 {
-  "writeTime": "Tue Mar 02 2021 13:36:08 GMT-0500 (Eastern Standard Time)",
+  "writeTime": "Fri Mar 12 2021 15:19:34 GMT+0800 (China Standard Time)",
   "featureLevel": 11,
   "creator": "zap",
   "keyValuePairs": [
           "define": "DEVICE_TEMP_CLUSTER",
           "side": "server",
           "enabled": 0,
+          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ],
-          "commands": []
+          ]
         },
         {
           "name": "Identify",
           "define": "IDENTIFY_CLUSTER",
           "side": "client",
           "enabled": 0,
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "2",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ],
           "commands": [
             {
               "name": "Identify",
               "incoming": 1,
               "outgoing": 0
             }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "2",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
           ]
         },
         {
           "define": "ON_OFF_CLUSTER",
           "side": "server",
           "enabled": 1,
+          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ],
-          "commands": []
+          ]
         },
         {
           "name": "Alarms",
           "define": "ALARM_CLUSTER",
           "side": "client",
           "enabled": 0,
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "0x0001",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
-          ],
           "commands": [
             {
               "name": "ResetAlarm",
               "incoming": 1,
               "outgoing": 0
             }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "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": "Network Commissioning",
+          "code": 49,
+          "mfgCode": null,
+          "define": "NETWORK_COMMISSIONING_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "commands": [
+            {
+              "name": "ScanNetworks",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "AddWiFiNetwork",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "UpdateWiFiNetwork",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "AddThreadNetwork",
+              "code": 6,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "UpdateThreadNetwork",
+              "code": 8,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "RemoveNetwork",
+              "code": 10,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "EnableNetwork",
+              "code": 12,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "DisableNetwork",
+              "code": 14,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "GetLastNetworkCommissioningResult",
+              "code": 16,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "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": "Network Commissioning",
+          "code": 49,
+          "mfgCode": null,
+          "define": "NETWORK_COMMISSIONING_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "ScanNetworksResponse",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "AddWiFiNetworkResponse",
+              "code": 3,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "UpdateWiFiNetworkResponse",
+              "code": 5,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "AddThreadNetworkResponse",
+              "code": 7,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "UpdateThreadNetworkResponse",
+              "code": 9,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveNetworkResponse",
+              "code": 11,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "EnableNetworkResponse",
+              "code": 13,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "DisableNetworkResponse",
+              "code": 15,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "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": "Occupancy Sensing",
           "code": 1030,
           "mfgCode": null,
           "define": "OCCUPANCY_SENSING_CLUSTER",
           "side": "server",
           "enabled": 0,
+          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ],
-          "commands": []
+          ]
         }
       ]
     }
index 3b51c83..57c8ea8 100644 (file)
@@ -32,6 +32,7 @@ project(chip-nrfconnect-lock-example)
 
 target_include_directories(app PRIVATE 
                            main/include 
+                           ${CHIP_ROOT}/src/app
                            ${LOCK_COMMON} 
                            ${NRFCONNECT_COMMON}/util/include 
                            ${NRFCONNECT_COMMON}/app/include)
@@ -64,4 +65,6 @@ target_sources(app PRIVATE
                ${CHIP_ROOT}/src/app/util/process-global-message.cpp
                ${CHIP_ROOT}/src/app/util/util.cpp
                ${CHIP_ROOT}/src/app/clusters/bindings/bindings.cpp
+               ${CHIP_ROOT}/src/app/clusters/network-commissioning/network-commissioning-ember.cpp
+               ${CHIP_ROOT}/src/app/clusters/network-commissioning/network-commissioning.cpp
                ${CHIP_ROOT}/src/app/clusters/on-off-server/on-off.cpp)
index ad373d4..80e19b3 100644 (file)
Binary files a/examples/platform/k32w/doc/images/nxp_hw_connectivity.JPG and b/examples/platform/k32w/doc/images/nxp_hw_connectivity.JPG differ
index bb0101c..f1a1ad0 100644 (file)
@@ -361,14 +361,15 @@ void PrintUsage(streamer_t * stream)
 {
     streamer_printf(stream, "Usage: ping [options] <destination>\n\nOptions:\n");
 
-    streamer_printf(stream,
-                    "  -h              print help information\n"
-                    "  -u              use UDP (default)\n"
-                    "  -t              use TCP\n"
-                    "  -p  <port>      echo server port\n"
-                    "  -i  <interval>  ping interval time in seconds\n"
-                    "  -c  <count>     stop after <count> replies\n"
-                    "  -r  <1|0>       enalbe/disable CRMP\n");
+    // Need to split the help info to prevent overflowing the streamer_printf
+    // buffer (CONSOLE_DEFAULT_MAX_LINE 256)
+    streamer_printf(stream, "  -h              print help information\n");
+    streamer_printf(stream, "  -u              use UDP (default)\n");
+    streamer_printf(stream, "  -t              use TCP\n");
+    streamer_printf(stream, "  -p  <port>      echo server port\n");
+    streamer_printf(stream, "  -i  <interval>  ping interval time in seconds\n");
+    streamer_printf(stream, "  -c  <count>     stop after <count> replies\n");
+    streamer_printf(stream, "  -r  <1|0>       enable or disable CRMP\n");
 }
 
 int cmd_ping(int argc, char ** argv)
index 5edc12f..58501eb 100644 (file)
@@ -29,6 +29,7 @@ COMPONENT_SRCDIRS :=
   ../third_party/connectedhomeip/src/app/reporting                                \
   ../third_party/connectedhomeip/src/app/clusters/basic                           \
   ../third_party/connectedhomeip/src/app/clusters/bindings                        \
+  ../third_party/connectedhomeip/src/app/clusters/network-commissioning           \
   ../third_party/connectedhomeip/src/app/clusters/temperature-measurement-server  \
 
 
index 29ae867..bde4d17 100644 (file)
@@ -66,6 +66,52 @@ NS_ASSUME_NONNULL_BEGIN
 @end
 
 /**
+ * Cluster Network Commissioning
+ *
+ */
+@interface CHIPNetworkCommissioning : CHIPCluster
+
+- (void)addThreadNetwork:(NSData *)operationalDataset
+              breadcrumb:(uint64_t)breadcrumb
+               timeoutMs:(uint32_t)timeoutMs
+       completionHandler:(ResponseHandler)completionHandler;
+- (void)addWiFiNetwork:(NSData *)ssid
+           credentials:(NSData *)credentials
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler;
+- (void)disableNetwork:(NSData *)networkID
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler;
+- (void)enableNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler;
+- (void)getLastNetworkCommissioningResult:(uint32_t)timeoutMs completionHandler:(ResponseHandler)completionHandler;
+- (void)removeNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler;
+- (void)scanNetworks:(NSData *)ssid
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler;
+- (void)updateThreadNetwork:(NSData *)operationalDataset
+                 breadcrumb:(uint64_t)breadcrumb
+                  timeoutMs:(uint32_t)timeoutMs
+          completionHandler:(ResponseHandler)completionHandler;
+- (void)updateWiFiNetwork:(NSData *)ssid
+              credentials:(NSData *)credentials
+               breadcrumb:(uint64_t)breadcrumb
+                timeoutMs:(uint32_t)timeoutMs
+        completionHandler:(ResponseHandler)completionHandler;
+
+- (void)readAttributeClusterRevision:(ResponseHandler)completionHandler;
+
+@end
+
+/**
  * Cluster Temperature Measurement
  *
  */
index 6329098..23ccc4a 100644 (file)
@@ -21,7 +21,7 @@
 
 #import "CHIPDevice.h"
 #import "CHIPDevice_Internal.h"
-#import "ChipError.h"
+#import "CHIPError.h"
 #import "gen/CHIPClientCallbacks.h"
 #import "gen/CHIPClustersObjc.h"
 
@@ -292,6 +292,38 @@ private:
     bool mKeepAlive;
 };
 
+class CHIPInt64uAttributeCallbackBridge : public Callback::Callback<Int64uAttributeCallback> {
+public:
+    CHIPInt64uAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
+        : Callback::Callback<Int64uAttributeCallback>(CallbackFn, this)
+        , mHandler(handler)
+        , mQueue(queue)
+        , mKeepAlive(keepAlive)
+    {
+    }
+
+    ~CHIPInt64uAttributeCallbackBridge() {};
+
+    static void CallbackFn(void * context, uint64_t value)
+    {
+        CHIPInt64uAttributeCallbackBridge * callback = reinterpret_cast<CHIPInt64uAttributeCallbackBridge *>(context);
+        if (callback && callback->mQueue) {
+            dispatch_async(callback->mQueue, ^{
+                callback->mHandler(nil, @ { @"value" : [NSNumber numberWithUnsignedLongLong:value] });
+                if (!callback->mKeepAlive) {
+                    callback->Cancel();
+                    delete callback;
+                }
+            });
+        }
+    };
+
+private:
+    ResponseHandler mHandler;
+    dispatch_queue_t mQueue;
+    bool mKeepAlive;
+};
+
 class CHIPInt16sAttributeCallbackBridge : public Callback::Callback<Int16sAttributeCallback> {
 public:
     CHIPInt16sAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
@@ -699,6 +731,285 @@ private:
 
 @end
 
+@interface CHIPNetworkCommissioning ()
+@property (readonly) Controller::NetworkCommissioningCluster cppCluster;
+@end
+
+@implementation CHIPNetworkCommissioning
+
+- (Controller::ClusterBase *)getCluster
+{
+    return &_cppCluster;
+}
+
+- (void)addThreadNetwork:(NSData *)operationalDataset
+              breadcrumb:(uint64_t)breadcrumb
+               timeoutMs:(uint32_t)timeoutMs
+       completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterAddThreadNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterAddThreadNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.AddThreadNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) operationalDataset.bytes, operationalDataset.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)addWiFiNetwork:(NSData *)ssid
+           credentials:(NSData *)credentials
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterAddWiFiNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterAddWiFiNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.AddWiFiNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) ssid.bytes, ssid.length),
+        chip::ByteSpan((const uint8_t *) credentials.bytes, credentials.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)disableNetwork:(NSData *)networkID
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterDisableNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterDisableNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.DisableNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) networkID.bytes, networkID.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)enableNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterEnableNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterEnableNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.EnableNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) networkID.bytes, networkID.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)getLastNetworkCommissioningResult:(uint32_t)timeoutMs completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPDefaultSuccessCallbackBridge * onSuccess = new CHIPDefaultSuccessCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.GetLastNetworkCommissioningResult(onSuccess->Cancel(), onFailure->Cancel(), timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)removeNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterRemoveNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterRemoveNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.RemoveNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) networkID.bytes, networkID.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)scanNetworks:(NSData *)ssid
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterScanNetworksResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterScanNetworksResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.ScanNetworks(
+        onSuccess->Cancel(), onFailure->Cancel(), chip::ByteSpan((const uint8_t *) ssid.bytes, ssid.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)updateThreadNetwork:(NSData *)operationalDataset
+                 breadcrumb:(uint64_t)breadcrumb
+                  timeoutMs:(uint32_t)timeoutMs
+          completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterUpdateThreadNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterUpdateThreadNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.UpdateThreadNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) operationalDataset.bytes, operationalDataset.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)updateWiFiNetwork:(NSData *)ssid
+              credentials:(NSData *)credentials
+               breadcrumb:(uint64_t)breadcrumb
+                timeoutMs:(uint32_t)timeoutMs
+        completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterUpdateWiFiNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterUpdateWiFiNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.UpdateWiFiNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) ssid.bytes, ssid.length),
+        chip::ByteSpan((const uint8_t *) credentials.bytes, credentials.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+
+- (void)readAttributeClusterRevision:(ResponseHandler)completionHandler
+{
+    CHIPInt16uAttributeCallbackBridge * onSuccess = new CHIPInt16uAttributeCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.ReadAttributeClusterRevision(onSuccess->Cancel(), onFailure->Cancel());
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+
+@end
+
 @interface CHIPTemperatureMeasurement ()
 @property (readonly) Controller::TemperatureMeasurementCluster cppCluster;
 @end
index c9e3366..f5fdc56 100644 (file)
@@ -39,6 +39,335 @@ namespace app {
 
 namespace clusters {
 
+namespace NetworkCommissioning {
+
+void DispatchServerCommand(app::Command * command, CommandId commandId, EndpointId endpointId, TLV::TLVReader & dataTlv)
+{
+    {
+        switch (commandId)
+        {
+        case ZCL_ADD_THREAD_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(operationalDataset);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterAddThreadNetworkCallback(const_cast<uint8_t *>(operationalDataset), breadcrumb,
+                                                                       timeoutMs);
+            break;
+        }
+        case ZCL_ADD_WI_FI_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * ssid;
+            const uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(ssid);
+                    break;
+                case 1:
+                    TLVError = dataTlv.GetDataPtr(credentials);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 3:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(const_cast<uint8_t *>(ssid),
+                                                                     const_cast<uint8_t *>(credentials), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_DISABLE_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(networkID);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterDisableNetworkCallback(const_cast<uint8_t *>(networkID), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_ENABLE_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(networkID);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterEnableNetworkCallback(const_cast<uint8_t *>(networkID), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(timeoutMs);
+            break;
+        }
+        case ZCL_REMOVE_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * NetworkID;
+            uint64_t Breadcrumb;
+            uint32_t TimeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(NetworkID);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(Breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(TimeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterRemoveNetworkCallback(const_cast<uint8_t *>(NetworkID), Breadcrumb, TimeoutMs);
+            break;
+        }
+        case ZCL_SCAN_NETWORKS_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * ssid;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(ssid);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterScanNetworksCallback(const_cast<uint8_t *>(ssid), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(operationalDataset);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(const_cast<uint8_t *>(operationalDataset), breadcrumb,
+                                                                          timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * ssid;
+            const uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(ssid);
+                    break;
+                case 1:
+                    TLVError = dataTlv.GetDataPtr(credentials);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 3:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(const_cast<uint8_t *>(ssid),
+                                                                        const_cast<uint8_t *>(credentials), breadcrumb, timeoutMs);
+            break;
+        }
+        default: {
+            // Unrecognized command ID, error status will apply.
+            // TODO: Encode response for command not found
+            ChipLogError(Zcl, "Unknown command %" PRIx16 " for cluster %" PRIx16, commandId, ZCL_NETWORK_COMMISSIONING_CLUSTER_ID);
+            break;
+        }
+        }
+    }
+}
+
+} // namespace NetworkCommissioning
+
 } // namespace clusters
 
 void DispatchSingleClusterCommand(chip::ClusterId aClusterId, chip::CommandId aCommandId, chip::EndpointId aEndPointId,
@@ -49,6 +378,9 @@ void DispatchSingleClusterCommand(chip::ClusterId aClusterId, chip::CommandId aC
     Compatibility::SetupEmberAfObjects(apCommandObj, aClusterId, aCommandId, aEndPointId);
     switch (aClusterId)
     {
+    case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
+        clusters::NetworkCommissioning::DispatchServerCommand(apCommandObj, aCommandId, aEndPointId, aReader);
+        break;
     default:
         // Unrecognized cluster ID, error status will apply.
         // TODO: Encode response for Cluster not found
index 8c8757f..72a0198 100644 (file)
 #define ZCL_FABRIC_ID_ATTRIBUTE_ID (0x0000)
 #define ZCL_BREADCRUMB_ATTRIBUTE_ID (0x0001)
 
+// Attribute ids for cluster: Network Commissioning
+
+// Client attributes
+
+// Server attributes
+
 // Attribute ids for cluster: Shade Configuration
 
 // Client attributes
 
 // Server attributes
 
-// Attribute ids for cluster: Network Commissioning
-
-// Client attributes
-
-// Server attributes
-
 // Attribute ids for cluster: Binding
 
 // Client attributes
index edceae4..84548ba 100644 (file)
@@ -29,6 +29,7 @@
 using namespace chip;
 
 EmberAfStatus emberAfBasicClusterServerCommandParse(EmberAfClusterCommand * cmd);
+EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd);
 EmberAfStatus emberAfTemperatureMeasurementClusterServerCommandParse(EmberAfClusterCommand * cmd);
 
 static EmberAfStatus status(bool wasHandled, bool clusterExists, bool mfgSpecific)
@@ -74,6 +75,9 @@ EmberAfStatus emberAfClusterSpecificCommandParse(EmberAfClusterCommand * cmd)
             // No commands are enabled for cluster Basic
             result = status(false, true, cmd->mfgSpecific);
             break;
+        case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
+            result = emberAfNetworkCommissioningClusterServerCommandParse(cmd);
+            break;
         case ZCL_TEMP_MEASUREMENT_CLUSTER_ID:
             // No commands are enabled for cluster Temperature Measurement
             result = status(false, true, cmd->mfgSpecific);
@@ -87,3 +91,263 @@ EmberAfStatus emberAfClusterSpecificCommandParse(EmberAfClusterCommand * cmd)
 }
 
 // Cluster specific command parsing
+
+EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd)
+{
+    bool wasHandled = false;
+
+    if (!cmd->mfgSpecific)
+    {
+        switch (cmd->commandId)
+        {
+        case ZCL_ADD_THREAD_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            operationalDataset = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset      = static_cast<uint16_t>(payloadOffset + emberAfStringLength(operationalDataset) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterAddThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_ADD_WI_FI_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * ssid;
+            uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            ssid          = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            credentials   = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(credentials) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_DISABLE_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            networkID     = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(networkID) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterDisableNetworkCallback(networkID, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_ENABLE_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            networkID     = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(networkID) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterEnableNetworkCallback(networkID, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(timeoutMs);
+            break;
+        }
+        case ZCL_REMOVE_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * NetworkID;
+            uint64_t Breadcrumb;
+            uint32_t TimeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            NetworkID     = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(NetworkID) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            Breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            TimeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterRemoveNetworkCallback(NetworkID, Breadcrumb, TimeoutMs);
+            break;
+        }
+        case ZCL_SCAN_NETWORKS_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * ssid;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            ssid          = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterScanNetworksCallback(ssid, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            operationalDataset = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset      = static_cast<uint16_t>(payloadOffset + emberAfStringLength(operationalDataset) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * ssid;
+            uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            ssid          = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            credentials   = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(credentials) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
+            break;
+        }
+        default: {
+            // Unrecognized command ID, error status will apply.
+            break;
+        }
+        }
+    }
+    return status(wasHandled, true, cmd->mfgSpecific);
+}
index f3b3fad..5f99758 100644 (file)
@@ -30,6 +30,9 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId)
     case ZCL_BASIC_CLUSTER_ID:
         emberAfBasicClusterInitCallback(endpoint);
         break;
+    case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
+        emberAfNetworkCommissioningClusterInitCallback(endpoint);
+        break;
     case ZCL_TEMP_MEASUREMENT_CLUSTER_ID:
         emberAfTemperatureMeasurementClusterInitCallback(endpoint);
         break;
@@ -44,6 +47,11 @@ void __attribute__((weak)) emberAfBasicClusterInitCallback(EndpointId endpoint)
     // To prevent warning
     (void) endpoint;
 }
+void __attribute__((weak)) emberAfNetworkCommissioningClusterInitCallback(EndpointId endpoint)
+{
+    // To prevent warning
+    (void) endpoint;
+}
 void __attribute__((weak)) emberAfTemperatureMeasurementClusterInitCallback(EndpointId endpoint)
 {
     // To prevent warning
index b999d83..99a199f 100644 (file)
@@ -45,6 +45,14 @@ void emberAfClusterInitCallback(chip::EndpointId endpoint, chip::ClusterId clust
  */
 void emberAfBasicClusterInitCallback(chip::EndpointId endpoint);
 
+/** @brief Network Commissioning Cluster Init
+ *
+ * Cluster Init
+ *
+ * @param endpoint    Endpoint that is being initialized
+ */
+void emberAfNetworkCommissioningClusterInitCallback(chip::EndpointId endpoint);
+
 /** @brief Temperature Measurement Cluster Init
  *
  * Cluster Init
@@ -124,6 +132,77 @@ EmberAfStatus emberAfBasicClusterServerPreAttributeChangedCallback(chip::Endpoin
 void emberAfBasicClusterServerTickCallback(chip::EndpointId endpoint);
 
 //
+// Network Commissioning Cluster server
+//
+
+/** @brief Network Commissioning Cluster Server Init
+ *
+ * Server Init
+ *
+ * @param endpoint    Endpoint that is being initialized
+ */
+void emberAfNetworkCommissioningClusterServerInitCallback(chip::EndpointId endpoint);
+
+/** @brief Network Commissioning Cluster Server Attribute Changed
+ *
+ * Server Attribute Changed
+ *
+ * @param endpoint    Endpoint that is being initialized
+ * @param attributeId Attribute that changed
+ */
+void emberAfNetworkCommissioningClusterServerAttributeChangedCallback(chip::EndpointId endpoint, chip::AttributeId attributeId);
+
+/** @brief Network Commissioning Cluster Server Manufacturer Specific Attribute Changed
+ *
+ * Server Manufacturer Specific Attribute Changed
+ *
+ * @param endpoint          Endpoint that is being initialized
+ * @param attributeId       Attribute that changed
+ * @param manufacturerCode  Manufacturer Code of the attribute that changed
+ */
+void emberAfNetworkCommissioningClusterServerManufacturerSpecificAttributeChangedCallback(chip::EndpointId endpoint,
+                                                                                          chip::AttributeId attributeId,
+                                                                                          uint16_t manufacturerCode);
+
+/** @brief Network Commissioning Cluster Server Message Sent
+ *
+ * Server Message Sent
+ *
+ * @param type               The type of message sent
+ * @param indexOrDestination The destination or address to which the message was sent
+ * @param apsFrame           The APS frame for the message
+ * @param msgLen             The length of the message
+ * @param message            The message that was sent
+ * @param status             The status of the sent message
+ */
+void emberAfNetworkCommissioningClusterServerMessageSentCallback(EmberOutgoingMessageType type, uint64_t indexOrDestination,
+                                                                 EmberApsFrame * apsFrame, uint16_t msgLen, uint8_t * message,
+                                                                 EmberStatus status);
+
+/** @brief Network Commissioning Cluster Server Pre Attribute Changed
+ *
+ * server Pre Attribute Changed
+ *
+ * @param endpoint      Endpoint that is being initialized
+ * @param attributeId   Attribute to be changed
+ * @param attributeType Attribute type
+ * @param size          Attribute size
+ * @param value         Attribute value
+ */
+EmberAfStatus emberAfNetworkCommissioningClusterServerPreAttributeChangedCallback(chip::EndpointId endpoint,
+                                                                                  chip::AttributeId attributeId,
+                                                                                  EmberAfAttributeType attributeType, uint8_t size,
+                                                                                  uint8_t * value);
+
+/** @brief Network Commissioning Cluster Server Tick
+ *
+ * server Tick
+ *
+ * @param endpoint  Endpoint that is being served
+ */
+void emberAfNetworkCommissioningClusterServerTickCallback(chip::EndpointId endpoint);
+
+//
 // Temperature Measurement Cluster server
 //
 
@@ -196,6 +275,91 @@ void emberAfTemperatureMeasurementClusterServerTickCallback(chip::EndpointId end
 
 // Cluster Commands Callback
 
+/**
+ * @brief Network Commissioning Cluster AddThreadNetwork Command callback
+ * @param operationalDataset
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterAddThreadNetworkCallback(uint8_t * operationalDataset, uint64_t breadcrumb,
+                                                                uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster AddWiFiNetwork Command callback
+ * @param ssid
+ * @param credentials
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(uint8_t * ssid, uint8_t * credentials, uint64_t breadcrumb,
+                                                              uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster DisableNetwork Command callback
+ * @param networkID
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterDisableNetworkCallback(uint8_t * networkID, uint64_t breadcrumb, uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster EnableNetwork Command callback
+ * @param networkID
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterEnableNetworkCallback(uint8_t * networkID, uint64_t breadcrumb, uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster GetLastNetworkCommissioningResult Command callback
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster RemoveNetwork Command callback
+ * @param networkID
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterRemoveNetworkCallback(uint8_t * NetworkID, uint64_t Breadcrumb, uint32_t TimeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster ScanNetworks Command callback
+ * @param ssid
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterScanNetworksCallback(uint8_t * ssid, uint64_t breadcrumb, uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster UpdateThreadNetwork Command callback
+ * @param operationalDataset
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(uint8_t * operationalDataset, uint64_t breadcrumb,
+                                                                   uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster UpdateWiFiNetwork Command callback
+ * @param ssid
+ * @param credentials
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(uint8_t * ssid, uint8_t * credentials, uint64_t breadcrumb,
+                                                                 uint32_t timeoutMs);
+
 //
 // Non-Cluster Related Callbacks
 //
index f72c96f..79d1e15 100644 (file)
                                                                                                                                    \
                                   ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
 
+/** @brief Command description for ScanNetworks
+ *
+ * Command: ScanNetworks
+ * @param ssid OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterScanNetworks(ssid, breadcrumb, timeoutMs)                                                                  \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_SCAN_NETWORKS_COMMAND_ID, "uuu", ssid, breadcrumb, timeoutMs);
+
+/** @brief Command description for ScanNetworksResponse
+ *
+ * Command: ScanNetworksResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ * @param wifiScanResults WiFiInterfaceScanResult []
+ * @param wifiScanResultsLen int
+ * @param threadScanResults ThreadInterfaceScanResult []
+ * @param threadScanResultsLen int
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterScanNetworksResponse(errorCode, debugText, wifiScanResults, wifiScanResultsLen, threadScanResults,         \
+                                             threadScanResultsLen)                                                                 \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID, "uubb", errorCode, debugText, wifiScanResults,            \
+                                  wifiScanResultsLen, threadScanResults, threadScanResultsLen);
+
+/** @brief Command description for AddWiFiNetwork
+ *
+ * Command: AddWiFiNetwork
+ * @param ssid OCTET_STRING
+ * @param credentials OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                   \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
+
+/** @brief Command description for AddWiFiNetworkResponse
+ *
+ * Command: AddWiFiNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddWiFiNetworkResponse(errorCode, debugText)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for UpdateWiFiNetwork
+ *
+ * Command: UpdateWiFiNetwork
+ * @param ssid OCTET_STRING
+ * @param credentials OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
+
+/** @brief Command description for UpdateWiFiNetworkResponse
+ *
+ * Command: UpdateWiFiNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateWiFiNetworkResponse(errorCode, debugText)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for AddThreadNetwork
+ *
+ * Command: AddThreadNetwork
+ * @param operationalDataset OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
+
+/** @brief Command description for AddThreadNetworkResponse
+ *
+ * Command: AddThreadNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddThreadNetworkResponse(errorCode, debugText)                                                             \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for UpdateThreadNetwork
+ *
+ * Command: UpdateThreadNetwork
+ * @param operationalDataset OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                             \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
+
+/** @brief Command description for UpdateThreadNetworkResponse
+ *
+ * Command: UpdateThreadNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateThreadNetworkResponse(errorCode, debugText)                                                          \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for RemoveNetwork
+ *
+ * Command: RemoveNetwork
+ * @param NetworkID OCTET_STRING
+ * @param Breadcrumb INT64U
+ * @param TimeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterRemoveNetwork(NetworkID, Breadcrumb, TimeoutMs)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_REMOVE_NETWORK_COMMAND_ID, "uuu", NetworkID, Breadcrumb, TimeoutMs);
+
+/** @brief Command description for RemoveNetworkResponse
+ *
+ * Command: RemoveNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterRemoveNetworkResponse(errorCode, debugText)                                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for EnableNetwork
+ *
+ * Command: EnableNetwork
+ * @param networkID OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterEnableNetwork(networkID, breadcrumb, timeoutMs)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ENABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
+
+/** @brief Command description for EnableNetworkResponse
+ *
+ * Command: EnableNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterEnableNetworkResponse(errorCode, debugText)                                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for DisableNetwork
+ *
+ * Command: DisableNetwork
+ * @param networkID OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterDisableNetwork(networkID, breadcrumb, timeoutMs)                                                           \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_DISABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
+
+/** @brief Command description for DisableNetworkResponse
+ *
+ * Command: DisableNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterDisableNetworkResponse(errorCode, debugText)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for GetLastNetworkCommissioningResult
+ *
+ * Command: GetLastNetworkCommissioningResult
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterGetLastNetworkCommissioningResult(timeoutMs)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID, "u", timeoutMs);
+
 /** @brief Command description for LockDoor
  *
  * Command: LockDoor
                                   ZCL_GET_ENDPOINT_LIST_REQUEST_COMMAND_ID, "uuuub", startIndex, total, startIndex, count,         \
                                   endpointInformationRecordList, endpointInformationRecordListLen);
 
-/** @brief Command description for ScanNetworks
- *
- * Command: ScanNetworks
- * @param ssid OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterScanNetworks(ssid, breadcrumb, timeoutMs)                                                                  \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_SCAN_NETWORKS_COMMAND_ID, "uuu", ssid, breadcrumb, timeoutMs);
-
-/** @brief Command description for ScanNetworksResponse
- *
- * Command: ScanNetworksResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- * @param wifiScanResults WiFiInterfaceScanResult []
- * @param wifiScanResultsLen int
- * @param threadScanResults ThreadInterfaceScanResult []
- * @param threadScanResultsLen int
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterScanNetworksResponse(errorCode, debugText, wifiScanResults, wifiScanResultsLen, threadScanResults,         \
-                                             threadScanResultsLen)                                                                 \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID, "uubb", errorCode, debugText, wifiScanResults,            \
-                                  wifiScanResultsLen, threadScanResults, threadScanResultsLen);
-
-/** @brief Command description for AddWiFiNetwork
- *
- * Command: AddWiFiNetwork
- * @param ssid OCTET_STRING
- * @param credentials OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                   \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
-
-/** @brief Command description for AddWiFiNetworkResponse
- *
- * Command: AddWiFiNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddWiFiNetworkResponse(errorCode, debugText)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for UpdateWiFiNetwork
- *
- * Command: UpdateWiFiNetwork
- * @param ssid OCTET_STRING
- * @param credentials OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
-
-/** @brief Command description for UpdateWiFiNetworkResponse
- *
- * Command: UpdateWiFiNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateWiFiNetworkResponse(errorCode, debugText)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for AddThreadNetwork
- *
- * Command: AddThreadNetwork
- * @param operationalDataset OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
-
-/** @brief Command description for AddThreadNetworkResponse
- *
- * Command: AddThreadNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddThreadNetworkResponse(errorCode, debugText)                                                             \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for UpdateThreadNetwork
- *
- * Command: UpdateThreadNetwork
- * @param operationalDataset OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                             \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
-
-/** @brief Command description for UpdateThreadNetworkResponse
- *
- * Command: UpdateThreadNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateThreadNetworkResponse(errorCode, debugText)                                                          \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for RemoveNetwork
- *
- * Command: RemoveNetwork
- * @param NetworkID OCTET_STRING
- * @param Breadcrumb INT64U
- * @param TimeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterRemoveNetwork(NetworkID, Breadcrumb, TimeoutMs)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_REMOVE_NETWORK_COMMAND_ID, "uuu", NetworkID, Breadcrumb, TimeoutMs);
-
-/** @brief Command description for RemoveNetworkResponse
- *
- * Command: RemoveNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterRemoveNetworkResponse(errorCode, debugText)                                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for EnableNetwork
- *
- * Command: EnableNetwork
- * @param networkID OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterEnableNetwork(networkID, breadcrumb, timeoutMs)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ENABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
-
-/** @brief Command description for EnableNetworkResponse
- *
- * Command: EnableNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterEnableNetworkResponse(errorCode, debugText)                                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for DisableNetwork
- *
- * Command: DisableNetwork
- * @param networkID OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterDisableNetwork(networkID, breadcrumb, timeoutMs)                                                           \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_DISABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
-
-/** @brief Command description for DisableNetworkResponse
- *
- * Command: DisableNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterDisableNetworkResponse(errorCode, debugText)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for GetLastNetworkCommissioningResult
- *
- * Command: GetLastNetworkCommissioningResult
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterGetLastNetworkCommissioningResult(timeoutMs)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID, "u", timeoutMs);
-
 /** @brief Command description for Bind
  *
  * Command: Bind
index d77da91..add8f83 100644 (file)
@@ -86,6 +86,9 @@
 // Definitions for cluster: General Commissioning
 #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030)
 
+// Definitions for cluster: Network Commissioning
+#define ZCL_NETWORK_COMMISSIONING_CLUSTER_ID (0x0031)
+
 // Definitions for cluster: Shade Configuration
 #define ZCL_SHADE_CONFIG_CLUSTER_ID (0x0100)
 
 // Definitions for cluster: ZLL Commissioning
 #define ZCL_ZLL_COMMISSIONING_CLUSTER_ID (0x1000)
 
-// Definitions for cluster: Network Commissioning
-#define ZCL_NETWORK_COMMISSIONING_CLUSTER_ID (0xAAAA)
-
 // Definitions for cluster: Binding
 #define ZCL_BINDING_CLUSTER_ID (0xF000)
 
index adc2b1c..864943b 100644 (file)
 #define ZCL_COMMISSIONING_COMPLETE_COMMAND_ID (0x06)
 #define ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID (0x07)
 
+// Commands for cluster: Network Commissioning
+#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00)
+#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01)
+#define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
+#define ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x03)
+#define ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x04)
+#define ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x05)
+#define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
+#define ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x07)
+#define ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID (0x08)
+#define ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x09)
+#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x0A)
+#define ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID (0x0B)
+#define ZCL_ENABLE_NETWORK_COMMAND_ID (0x0C)
+#define ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID (0x0D)
+#define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
+#define ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID (0x0F)
+#define ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID (0x10)
+
 // Commands for cluster: Door Lock
 #define ZCL_LOCK_DOOR_COMMAND_ID (0x00)
 #define ZCL_LOCK_DOOR_RESPONSE_COMMAND_ID (0x00)
 #define ZCL_GET_ENDPOINT_LIST_REQUEST_COMMAND_ID (0x42)
 #define ZCL_GET_ENDPOINT_LIST_RESPONSE_COMMAND_ID (0x42)
 
-// Commands for cluster: Network Commissioning
-#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00)
-#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01)
-#define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
-#define ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x03)
-#define ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x04)
-#define ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x05)
-#define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
-#define ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x07)
-#define ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID (0x08)
-#define ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x09)
-#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x0A)
-#define ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID (0x0B)
-#define ZCL_ENABLE_NETWORK_COMMAND_ID (0x0C)
-#define ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID (0x0D)
-#define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
-#define ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID (0x0F)
-#define ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID (0x10)
-
 // Commands for cluster: Binding
 #define ZCL_BIND_COMMAND_ID (0x00)
 #define ZCL_UNBIND_COMMAND_ID (0x01)
index f701c1c..aac33bc 100644 (file)
 
 #define ZAP_ATTRIBUTE_MASK(mask) ATTRIBUTE_MASK_##mask
 // This is an array of EmberAfAttributeMetadata structures.
-#define GENERATED_ATTRIBUTE_COUNT 16
+#define GENERATED_ATTRIBUTE_COUNT 17
 #define GENERATED_ATTRIBUTES                                                                                                       \
     {                                                                                                                              \
         { 0xFFFD, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(SINGLETON), { (uint8_t *) 3 } }, /* Basic (server): cluster revision */  \
             {                                                                                                                      \
                 0x000A, ZAP_TYPE(CHAR_STRING), 64, ZAP_ATTRIBUTE_MASK(SINGLETON), { (uint8_t *) ZAP_LONG_DEFAULTS_INDEX(180) }     \
             },                                                          /* Basic (server): SoftwareVersionString */                \
+            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Network Commissioning (server): cluster revision */     \
             { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 3 } },      /* Temperature Measurement (server): cluster revision */   \
             { 0x0000, ZAP_TYPE(INT16S), 2, 0, { (uint8_t *) 0x8000 } }, /* Temperature Measurement (server): measured value */     \
             { 0x0001, ZAP_TYPE(INT16S), 2, 0, { (uint8_t *) 0x8000 } }, /* Temperature Measurement (server): min measured value */ \
 #define GENERATED_FUNCTION_ARRAYS
 
 #define ZAP_CLUSTER_MASK(mask) CLUSTER_MASK_##mask
-#define GENERATED_CLUSTER_COUNT 2
+#define GENERATED_CLUSTER_COUNT 3
 #define GENERATED_CLUSTERS                                                                                                         \
     {                                                                                                                              \
         { 0x0028, ZAP_ATTRIBUTE_INDEX(0), 12, 254, ZAP_CLUSTER_MASK(SERVER), NULL }, /* Endpoint: 1, Cluster: Basic (server) */    \
             {                                                                                                                      \
-                0x0402, ZAP_ATTRIBUTE_INDEX(12), 4, 8, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
+                0x0031, ZAP_ATTRIBUTE_INDEX(12), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
+            }, /* Endpoint: 1, Cluster: Network Commissioning (server) */                                                          \
+            {                                                                                                                      \
+                0x0402, ZAP_ATTRIBUTE_INDEX(13), 4, 8, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
             }, /* Endpoint: 1, Cluster: Temperature Measurement (server) */                                                        \
     }
 
 // This is an array of EmberAfEndpointType structures.
 #define GENERATED_ENDPOINT_TYPES                                                                                                   \
     {                                                                                                                              \
-        { ZAP_CLUSTER_INDEX(0), 2, 262 },                                                                                          \
+        { ZAP_CLUSTER_INDEX(0), 3, 264 },                                                                                          \
     }
 
 // Largest attribute size is needed for various buffers
 #define ATTRIBUTE_SINGLETONS_SIZE (254)
 
 // Total size of attribute storage
-#define ATTRIBUTE_MAX_SIZE (262)
+#define ATTRIBUTE_MAX_SIZE (264)
 
 // Number of fixed endpoints
 #define FIXED_ENDPOINT_COUNT (1)
 
 // Array of EmberAfCommandMetadata structs.
 #define ZAP_COMMAND_MASK(mask) COMMAND_MASK_##mask
-#define EMBER_AF_GENERATED_COMMAND_COUNT (3)
+#define EMBER_AF_GENERATED_COMMAND_COUNT (20)
 #define GENERATED_COMMANDS                                                                                                         \
     {                                                                                                                              \
         { 0x0028, 0x00, ZAP_COMMAND_MASK(INCOMING_CLIENT) },     /* Basic (server): StartUp */                                     \
             { 0x0028, 0x01, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): ShutDown */                                    \
             { 0x0028, 0x02, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): Leave */                                       \
+            { 0x0031, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): ScanNetworks */                \
+            { 0x0031, 0x01, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): ScanNetworksResponse */        \
+            { 0x0031, 0x02, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): AddWiFiNetwork */              \
+            { 0x0031, 0x03, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): AddWiFiNetworkResponse */      \
+            { 0x0031, 0x04, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): UpdateWiFiNetwork */           \
+            { 0x0031, 0x05, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): UpdateWiFiNetworkResponse */   \
+            { 0x0031, 0x06, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): AddThreadNetwork */            \
+            { 0x0031, 0x07, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): AddThreadNetworkResponse */    \
+            { 0x0031, 0x08, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): UpdateThreadNetwork */         \
+            { 0x0031, 0x09, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): UpdateThreadNetworkResponse */ \
+            { 0x0031, 0x0A, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): RemoveNetwork */               \
+            { 0x0031, 0x0B, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): RemoveNetworkResponse */       \
+            { 0x0031, 0x0C, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): EnableNetwork */               \
+            { 0x0031, 0x0D, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): EnableNetworkResponse */       \
+            { 0x0031, 0x0E, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): DisableNetwork */              \
+            { 0x0031, 0x0F, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): DisableNetworkResponse */      \
+            { 0x0031, 0x10,                                                                                                        \
+              ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): GetLastNetworkCommissioningResult */         \
     }
 
 // Array of EmberAfManufacturerCodeEntry structures for commands.
index 5a04a8f..d6a95b4 100644 (file)
@@ -30,6 +30,7 @@
 
 /**** Cluster endpoint counts ****/
 #define EMBER_AF_BASIC_CLUSTER_SERVER_ENDPOINT_COUNT (1)
+#define EMBER_AF_NETWORK_COMMISSIONING_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_TEMP_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 
 /**** Cluster Plugins ****/
 #define EMBER_AF_PLUGIN_BASIC_SERVER
 #define EMBER_AF_PLUGIN_BASIC
 
+// Use this macro to check if the server side of the Network Commissioning cluster is included
+#define ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER
+#define EMBER_AF_PLUGIN_NETWORK_COMMISSIONING_SERVER
+#define EMBER_AF_PLUGIN_NETWORK_COMMISSIONING
+
 // Use this macro to check if the server side of the Temperature Measurement cluster is included
 #define ZCL_USING_TEMP_MEASUREMENT_CLUSTER_SERVER
 #define EMBER_AF_PLUGIN_TEMPERATURE_MEASUREMENT_SERVER
index bd08d38..8c737e9 100644 (file)
 #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER
 #endif
 
+#if defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_CLIENT)
+#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER { ZCL_NETWORK_COMMISSIONING_CLUSTER_ID, 49, "Network Commissioning" },
+#else
+#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER
+#endif
+
 #if defined(ZCL_USING_SHADE_CONFIG_CLUSTER_SERVER) || defined(ZCL_USING_SHADE_CONFIG_CLUSTER_CLIENT)
 #define CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER { ZCL_SHADE_CONFIG_CLUSTER_ID, 256, "Shade Configuration" },
 #else
 #define CHIP_PRINTCLUSTER_ZLL_COMMISSIONING_CLUSTER
 #endif
 
-#if defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_CLIENT)
-#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER { ZCL_NETWORK_COMMISSIONING_CLUSTER_ID, 43690, "Network Commissioning" },
-#else
-#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER
-#endif
-
 #if defined(ZCL_USING_BINDING_CLUSTER_SERVER) || defined(ZCL_USING_BINDING_CLUSTER_CLIENT)
 #define CHIP_PRINTCLUSTER_BINDING_CLUSTER { ZCL_BINDING_CLUSTER_ID, 61440, "Binding" },
 #else
     CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER                                                                                            \
     CHIP_PRINTCLUSTER_BASIC_CLUSTER                                                                                                \
     CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER                                                                                \
+    CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER                                                                                \
     CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER                                                                                         \
     CHIP_PRINTCLUSTER_DOOR_LOCK_CLUSTER                                                                                            \
     CHIP_PRINTCLUSTER_WINDOW_COVERING_CLUSTER                                                                                      \
     CHIP_PRINTCLUSTER_ELECTRICAL_MEASUREMENT_CLUSTER                                                                               \
     CHIP_PRINTCLUSTER_DIAGNOSTICS_CLUSTER                                                                                          \
     CHIP_PRINTCLUSTER_ZLL_COMMISSIONING_CLUSTER                                                                                    \
-    CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER                                                                                \
     CHIP_PRINTCLUSTER_BINDING_CLUSTER                                                                                              \
     CHIP_PRINTCLUSTER_MEDIA_PLAYBACK_CLUSTER                                                                                       \
     CHIP_PRINTCLUSTER_CONTENT_LAUNCH_CLUSTER                                                                                       \
index 2342fb2..8099386 100644 (file)
@@ -1,6 +1,6 @@
 {
-  "writeTime": "Tue Nov 17 2020 19:19:54 GMT+0100 (Central European Standard Time)",
-  "featureLevel": 4,
+  "writeTime": "Fri Mar 12 2021 15:20:19 GMT+0800 (China Standard Time)",
+  "featureLevel": 11,
   "creator": "zap",
   "keyValuePairs": [
     {
   "package": [
     {
       "pathRelativity": "relativeToZap",
-      "path": "../../../../src/app/zap-templates/zcl/zcl.json",
+      "path": "../../../../../src/app/zap-templates/zcl/zcl.json",
       "version": "ZCL Test Data",
       "type": "zcl-properties"
     },
     {
       "pathRelativity": "relativeToZap",
-      "path": "../../../../src/app/zap-templates/app-templates.json",
+      "path": "../../../../../src/app/zap-templates/app-templates.json",
       "version": "chip-v1",
       "type": "gen-templates-json"
     }
     {
       "name": "Anonymous Endpoint Type",
       "deviceTypeName": "CBA-tempsensor",
-      "deviceTypeCode": "0x0302",
-      "deviceTypeProfileId": "0x105",
+      "deviceTypeCode": 770,
+      "deviceTypeProfileId": 261,
       "clusters": [
         {
-          "name": "Basic",
-          "code": 40,
-          "mfgCode": null,
-          "define": "BASIC_CLUSTER",
-          "side": "client",
-          "enabled": 0,
-          "commands": [],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
-          ]
-        },
-        {
-          "name": "Basic",
-          "code": 40,
-          "mfgCode": null,
-          "define": "BASIC_CLUSTER",
-          "side": "server",
-          "enabled": 1,
-          "commands": [
-            {
-              "name": "StartUp",
-              "code": 0,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "ShutDown",
-              "code": 1,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "Leave",
-              "code": 2,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            },
-            {
-              "name": "InteractionModelVersion",
-              "code": 0,
-              "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            },
-            {
-              "name": "VendorName",
-              "code": 1,
-              "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 1,
-              "bounded": 0,
-              "defaultValue": "",
-              "reportable": 0,
-              "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": "ProductID",
-              "code": 4,
-              "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": "Location",
-              "code": 6,
-              "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": "Power Configuration",
           "code": 1,
           "mfgCode": null,
           "define": "POWER_CONFIG_CLUSTER",
           "side": "client",
           "enabled": 0,
+          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ],
-          "commands": []
+          ]
         },
         {
           "name": "Power Configuration",
           "define": "POWER_CONFIG_CLUSTER",
           "side": "server",
           "enabled": 0,
+          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ],
-          "commands": []
+          ]
         },
         {
           "name": "Device Temperature Configuration",
           "define": "DEVICE_TEMP_CLUSTER",
           "side": "client",
           "enabled": 0,
-          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ]
+          ],
+          "commands": []
         },
         {
           "name": "Device Temperature Configuration",
           ]
         },
         {
-          "name": "Temperature Measurement",
-          "code": 1026,
+          "name": "Basic",
+          "code": 40,
           "mfgCode": null,
-          "define": "TEMP_MEASUREMENT_CLUSTER",
+          "define": "BASIC_CLUSTER",
           "side": "client",
           "enabled": 0,
           "commands": [],
               "side": "client",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "3",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Basic",
+          "code": 40,
+          "mfgCode": null,
+          "define": "BASIC_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "StartUp",
+              "code": 0,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "ShutDown",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "Leave",
+              "code": 2,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 1,
               "bounded": 0,
               "defaultValue": "3",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
+            },
+            {
+              "name": "InteractionModelVersion",
+              "code": 0,
+              "mfgCode": null,
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            },
+            {
+              "name": "VendorName",
+              "code": 1,
+              "mfgCode": null,
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 1,
+              "bounded": 0,
+              "defaultValue": "",
+              "reportable": 0,
+              "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": "ProductID",
+              "code": 4,
+              "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": "Location",
+              "code": 6,
+              "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": "Network Commissioning",
+          "code": 49,
+          "mfgCode": null,
+          "define": "NETWORK_COMMISSIONING_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "commands": [
+            {
+              "name": "ScanNetworks",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "AddWiFiNetwork",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "UpdateWiFiNetwork",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "AddThreadNetwork",
+              "code": 6,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "UpdateThreadNetwork",
+              "code": 8,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "RemoveNetwork",
+              "code": 10,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "EnableNetwork",
+              "code": 12,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "DisableNetwork",
+              "code": 14,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "GetLastNetworkCommissioningResult",
+              "code": 16,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "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": "Network Commissioning",
+          "code": 49,
+          "mfgCode": null,
+          "define": "NETWORK_COMMISSIONING_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x0001",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ],
+          "commands": [
+            {
+              "name": "ScanNetworksResponse",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "AddWiFiNetworkResponse",
+              "code": 3,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "UpdateWiFiNetworkResponse",
+              "code": 5,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "AddThreadNetworkResponse",
+              "code": 7,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "UpdateThreadNetworkResponse",
+              "code": 9,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveNetworkResponse",
+              "code": 11,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "EnableNetworkResponse",
+              "code": 13,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "DisableNetworkResponse",
+              "code": 15,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
             }
           ]
         },
           "code": 1026,
           "mfgCode": null,
           "define": "TEMP_MEASUREMENT_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "3",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ],
+          "commands": []
+        },
+        {
+          "name": "Temperature Measurement",
+          "code": 1026,
+          "mfgCode": null,
+          "define": "TEMP_MEASUREMENT_CLUSTER",
           "side": "server",
           "enabled": 1,
-          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ]
+          ],
+          "commands": []
         }
       ]
     }
       "networkId": 0
     }
   ]
-}
+}
\ No newline at end of file
index 644a234..d9931ca 100644 (file)
@@ -41,6 +41,8 @@ source_set("tv-common") {
     "${chip_root}/src/app/clusters/level-control/level-control.cpp",
     "${chip_root}/src/app/clusters/low-power-server/low-power-server.cpp",
     "${chip_root}/src/app/clusters/media-playback-server/media-playback-server.cpp",
+    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning-ember.cpp",
+    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning.cpp",
     "${chip_root}/src/app/clusters/on-off-server/on-off.cpp",
     "${chip_root}/src/app/clusters/scenes-client/scenes-client.cpp",
     "${chip_root}/src/app/clusters/scenes/scenes.cpp",
index e4f190a..5e99fca 100644 (file)
@@ -742,6 +742,52 @@ NS_ASSUME_NONNULL_BEGIN
 @end
 
 /**
+ * Cluster Network Commissioning
+ *
+ */
+@interface CHIPNetworkCommissioning : CHIPCluster
+
+- (void)addThreadNetwork:(NSData *)operationalDataset
+              breadcrumb:(uint64_t)breadcrumb
+               timeoutMs:(uint32_t)timeoutMs
+       completionHandler:(ResponseHandler)completionHandler;
+- (void)addWiFiNetwork:(NSData *)ssid
+           credentials:(NSData *)credentials
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler;
+- (void)disableNetwork:(NSData *)networkID
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler;
+- (void)enableNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler;
+- (void)getLastNetworkCommissioningResult:(uint32_t)timeoutMs completionHandler:(ResponseHandler)completionHandler;
+- (void)removeNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler;
+- (void)scanNetworks:(NSData *)ssid
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler;
+- (void)updateThreadNetwork:(NSData *)operationalDataset
+                 breadcrumb:(uint64_t)breadcrumb
+                  timeoutMs:(uint32_t)timeoutMs
+          completionHandler:(ResponseHandler)completionHandler;
+- (void)updateWiFiNetwork:(NSData *)ssid
+              credentials:(NSData *)credentials
+               breadcrumb:(uint64_t)breadcrumb
+                timeoutMs:(uint32_t)timeoutMs
+        completionHandler:(ResponseHandler)completionHandler;
+
+- (void)readAttributeClusterRevision:(ResponseHandler)completionHandler;
+
+@end
+
+/**
  * Cluster On/off
  *
  */
index 6647078..00dc2fc 100644 (file)
@@ -21,7 +21,7 @@
 
 #import "CHIPDevice.h"
 #import "CHIPDevice_Internal.h"
-#import "ChipError.h"
+#import "CHIPError.h"
 #import "gen/CHIPClientCallbacks.h"
 #import "gen/CHIPClustersObjc.h"
 
@@ -292,6 +292,38 @@ private:
     bool mKeepAlive;
 };
 
+class CHIPInt64uAttributeCallbackBridge : public Callback::Callback<Int64uAttributeCallback> {
+public:
+    CHIPInt64uAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
+        : Callback::Callback<Int64uAttributeCallback>(CallbackFn, this)
+        , mHandler(handler)
+        , mQueue(queue)
+        , mKeepAlive(keepAlive)
+    {
+    }
+
+    ~CHIPInt64uAttributeCallbackBridge() {};
+
+    static void CallbackFn(void * context, uint64_t value)
+    {
+        CHIPInt64uAttributeCallbackBridge * callback = reinterpret_cast<CHIPInt64uAttributeCallbackBridge *>(context);
+        if (callback && callback->mQueue) {
+            dispatch_async(callback->mQueue, ^{
+                callback->mHandler(nil, @ { @"value" : [NSNumber numberWithUnsignedLongLong:value] });
+                if (!callback->mKeepAlive) {
+                    callback->Cancel();
+                    delete callback;
+                }
+            });
+        }
+    };
+
+private:
+    ResponseHandler mHandler;
+    dispatch_queue_t mQueue;
+    bool mKeepAlive;
+};
+
 class CHIPInt16sAttributeCallbackBridge : public Callback::Callback<Int16sAttributeCallback> {
 public:
     CHIPInt16sAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
@@ -8075,6 +8107,285 @@ private:
 
 @end
 
+@interface CHIPNetworkCommissioning ()
+@property (readonly) Controller::NetworkCommissioningCluster cppCluster;
+@end
+
+@implementation CHIPNetworkCommissioning
+
+- (Controller::ClusterBase *)getCluster
+{
+    return &_cppCluster;
+}
+
+- (void)addThreadNetwork:(NSData *)operationalDataset
+              breadcrumb:(uint64_t)breadcrumb
+               timeoutMs:(uint32_t)timeoutMs
+       completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterAddThreadNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterAddThreadNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.AddThreadNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) operationalDataset.bytes, operationalDataset.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)addWiFiNetwork:(NSData *)ssid
+           credentials:(NSData *)credentials
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterAddWiFiNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterAddWiFiNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.AddWiFiNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) ssid.bytes, ssid.length),
+        chip::ByteSpan((const uint8_t *) credentials.bytes, credentials.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)disableNetwork:(NSData *)networkID
+            breadcrumb:(uint64_t)breadcrumb
+             timeoutMs:(uint32_t)timeoutMs
+     completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterDisableNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterDisableNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.DisableNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) networkID.bytes, networkID.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)enableNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterEnableNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterEnableNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.EnableNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) networkID.bytes, networkID.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)getLastNetworkCommissioningResult:(uint32_t)timeoutMs completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPDefaultSuccessCallbackBridge * onSuccess = new CHIPDefaultSuccessCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.GetLastNetworkCommissioningResult(onSuccess->Cancel(), onFailure->Cancel(), timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)removeNetwork:(NSData *)networkID
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterRemoveNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterRemoveNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.RemoveNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) networkID.bytes, networkID.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)scanNetworks:(NSData *)ssid
+           breadcrumb:(uint64_t)breadcrumb
+            timeoutMs:(uint32_t)timeoutMs
+    completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterScanNetworksResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterScanNetworksResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.ScanNetworks(
+        onSuccess->Cancel(), onFailure->Cancel(), chip::ByteSpan((const uint8_t *) ssid.bytes, ssid.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)updateThreadNetwork:(NSData *)operationalDataset
+                 breadcrumb:(uint64_t)breadcrumb
+                  timeoutMs:(uint32_t)timeoutMs
+          completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterUpdateThreadNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterUpdateThreadNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.UpdateThreadNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) operationalDataset.bytes, operationalDataset.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+- (void)updateWiFiNetwork:(NSData *)ssid
+              credentials:(NSData *)credentials
+               breadcrumb:(uint64_t)breadcrumb
+                timeoutMs:(uint32_t)timeoutMs
+        completionHandler:(ResponseHandler)completionHandler
+{
+    CHIPNetworkCommissioningClusterUpdateWiFiNetworkResponseCallbackBridge * onSuccess
+        = new CHIPNetworkCommissioningClusterUpdateWiFiNetworkResponseCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.UpdateWiFiNetwork(onSuccess->Cancel(), onFailure->Cancel(),
+        chip::ByteSpan((const uint8_t *) ssid.bytes, ssid.length),
+        chip::ByteSpan((const uint8_t *) credentials.bytes, credentials.length), breadcrumb, timeoutMs);
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+
+- (void)readAttributeClusterRevision:(ResponseHandler)completionHandler
+{
+    CHIPInt16uAttributeCallbackBridge * onSuccess = new CHIPInt16uAttributeCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onSuccess) {
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIPDefaultFailureCallbackBridge * onFailure = new CHIPDefaultFailureCallbackBridge(completionHandler, [self callbackQueue]);
+    if (!onFailure) {
+        delete onSuccess;
+        completionHandler([CHIPError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE], nil);
+        return;
+    }
+
+    CHIP_ERROR err = self.cppCluster.ReadAttributeClusterRevision(onSuccess->Cancel(), onFailure->Cancel());
+    if (err != CHIP_NO_ERROR) {
+        delete onSuccess;
+        delete onFailure;
+        completionHandler([CHIPError errorForCHIPErrorCode:err], nil);
+    }
+}
+
+@end
+
 @interface CHIPOnOff ()
 @property (readonly) Controller::OnOffCluster cppCluster;
 @end
index ebe9a25..c8edddf 100644 (file)
@@ -2076,6 +2076,335 @@ void DispatchServerCommand(app::Command * command, CommandId commandId, Endpoint
 
 } // namespace MediaPlayback
 
+namespace NetworkCommissioning {
+
+void DispatchServerCommand(app::Command * command, CommandId commandId, EndpointId endpointId, TLV::TLVReader & dataTlv)
+{
+    {
+        switch (commandId)
+        {
+        case ZCL_ADD_THREAD_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(operationalDataset);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterAddThreadNetworkCallback(const_cast<uint8_t *>(operationalDataset), breadcrumb,
+                                                                       timeoutMs);
+            break;
+        }
+        case ZCL_ADD_WI_FI_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * ssid;
+            const uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(ssid);
+                    break;
+                case 1:
+                    TLVError = dataTlv.GetDataPtr(credentials);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 3:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(const_cast<uint8_t *>(ssid),
+                                                                     const_cast<uint8_t *>(credentials), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_DISABLE_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(networkID);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterDisableNetworkCallback(const_cast<uint8_t *>(networkID), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_ENABLE_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(networkID);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterEnableNetworkCallback(const_cast<uint8_t *>(networkID), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(timeoutMs);
+            break;
+        }
+        case ZCL_REMOVE_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * NetworkID;
+            uint64_t Breadcrumb;
+            uint32_t TimeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(NetworkID);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(Breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(TimeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterRemoveNetworkCallback(const_cast<uint8_t *>(NetworkID), Breadcrumb, TimeoutMs);
+            break;
+        }
+        case ZCL_SCAN_NETWORKS_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * ssid;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(ssid);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterScanNetworksCallback(const_cast<uint8_t *>(ssid), breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(operationalDataset);
+                    break;
+                case 1:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(const_cast<uint8_t *>(operationalDataset), breadcrumb,
+                                                                          timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID: {
+            CHIP_ERROR TLVError = CHIP_NO_ERROR;
+            const uint8_t * ssid;
+            const uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            while ((TLVError = dataTlv.Next()) == CHIP_NO_ERROR)
+            {
+                switch (TLV::TagNumFromTag(dataTlv.GetTag()))
+                {
+                case 0:
+                    TLVError = dataTlv.GetDataPtr(ssid);
+                    break;
+                case 1:
+                    TLVError = dataTlv.GetDataPtr(credentials);
+                    break;
+                case 2:
+                    TLVError = dataTlv.Get(breadcrumb);
+                    break;
+                case 3:
+                    TLVError = dataTlv.Get(timeoutMs);
+                    break;
+                default:
+                    // Unsupported tag, ignore it.
+                    ChipLogProgress(Zcl, "Unknown TLV tag during processing.");
+                    break;
+                }
+                if (TLVError != CHIP_NO_ERROR)
+                {
+                    ChipLogProgress(Zcl, "Failed to decode TLV data with tag %" PRIx32 ": %" PRId32,
+                                    TLV::TagNumFromTag(dataTlv.GetTag()), TLVError);
+                }
+            }
+            // TODO(#5098) We should pass the Command Object and EndpointId to the cluster callbacks.
+            emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(const_cast<uint8_t *>(ssid),
+                                                                        const_cast<uint8_t *>(credentials), breadcrumb, timeoutMs);
+            break;
+        }
+        default: {
+            // Unrecognized command ID, error status will apply.
+            // TODO: Encode response for command not found
+            ChipLogError(Zcl, "Unknown command %" PRIx16 " for cluster %" PRIx16, commandId, ZCL_NETWORK_COMMISSIONING_CLUSTER_ID);
+            break;
+        }
+        }
+    }
+}
+
+} // namespace NetworkCommissioning
+
 namespace OnOff {
 
 void DispatchServerCommand(app::Command * command, CommandId commandId, EndpointId endpointId, TLV::TLVReader & dataTlv)
@@ -2389,6 +2718,9 @@ void DispatchSingleClusterCommand(chip::ClusterId aClusterId, chip::CommandId aC
     case ZCL_MEDIA_PLAYBACK_CLUSTER_ID:
         clusters::MediaPlayback::DispatchServerCommand(apCommandObj, aCommandId, aEndPointId, aReader);
         break;
+    case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
+        clusters::NetworkCommissioning::DispatchServerCommand(apCommandObj, aCommandId, aEndPointId, aReader);
+        break;
     case ZCL_ON_OFF_CLUSTER_ID:
         clusters::OnOff::DispatchServerCommand(apCommandObj, aCommandId, aEndPointId, aReader);
         break;
index 8c8757f..72a0198 100644 (file)
 #define ZCL_FABRIC_ID_ATTRIBUTE_ID (0x0000)
 #define ZCL_BREADCRUMB_ATTRIBUTE_ID (0x0001)
 
+// Attribute ids for cluster: Network Commissioning
+
+// Client attributes
+
+// Server attributes
+
 // Attribute ids for cluster: Shade Configuration
 
 // Client attributes
 
 // Server attributes
 
-// Attribute ids for cluster: Network Commissioning
-
-// Client attributes
-
-// Server attributes
-
 // Attribute ids for cluster: Binding
 
 // Client attributes
index 3d35872..3c64fa5 100644 (file)
@@ -43,6 +43,7 @@ EmberAfStatus emberAfIdentifyClusterServerCommandParse(EmberAfClusterCommand * c
 EmberAfStatus emberAfLevelControlClusterServerCommandParse(EmberAfClusterCommand * cmd);
 EmberAfStatus emberAfLowPowerClusterServerCommandParse(EmberAfClusterCommand * cmd);
 EmberAfStatus emberAfMediaPlaybackClusterServerCommandParse(EmberAfClusterCommand * cmd);
+EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd);
 EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd);
 EmberAfStatus emberAfScenesClusterServerCommandParse(EmberAfClusterCommand * cmd);
 EmberAfStatus emberAfTemperatureMeasurementClusterServerCommandParse(EmberAfClusterCommand * cmd);
@@ -135,6 +136,9 @@ EmberAfStatus emberAfClusterSpecificCommandParse(EmberAfClusterCommand * cmd)
         case ZCL_MEDIA_PLAYBACK_CLUSTER_ID:
             result = emberAfMediaPlaybackClusterServerCommandParse(cmd);
             break;
+        case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
+            result = emberAfNetworkCommissioningClusterServerCommandParse(cmd);
+            break;
         case ZCL_ON_OFF_CLUSTER_ID:
             result = emberAfOnOffClusterServerCommandParse(cmd);
             break;
@@ -1747,6 +1751,265 @@ EmberAfStatus emberAfMediaPlaybackClusterServerCommandParse(EmberAfClusterComman
     }
     return status(wasHandled, true, cmd->mfgSpecific);
 }
+EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd)
+{
+    bool wasHandled = false;
+
+    if (!cmd->mfgSpecific)
+    {
+        switch (cmd->commandId)
+        {
+        case ZCL_ADD_THREAD_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            operationalDataset = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset      = static_cast<uint16_t>(payloadOffset + emberAfStringLength(operationalDataset) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterAddThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_ADD_WI_FI_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * ssid;
+            uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            ssid          = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            credentials   = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(credentials) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_DISABLE_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            networkID     = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(networkID) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterDisableNetworkCallback(networkID, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_ENABLE_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * networkID;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            networkID     = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(networkID) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterEnableNetworkCallback(networkID, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(timeoutMs);
+            break;
+        }
+        case ZCL_REMOVE_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * NetworkID;
+            uint64_t Breadcrumb;
+            uint32_t TimeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            NetworkID     = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(NetworkID) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            Breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            TimeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterRemoveNetworkCallback(NetworkID, Breadcrumb, TimeoutMs);
+            break;
+        }
+        case ZCL_SCAN_NETWORKS_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * ssid;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            ssid          = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterScanNetworksCallback(ssid, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * operationalDataset;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            operationalDataset = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset      = static_cast<uint16_t>(payloadOffset + emberAfStringLength(operationalDataset) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
+            break;
+        }
+        case ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID: {
+            uint16_t payloadOffset = cmd->payloadStartIndex;
+            uint8_t * ssid;
+            uint8_t * credentials;
+            uint64_t breadcrumb;
+            uint32_t timeoutMs;
+
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            ssid          = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
+            if (cmd->bufLen < payloadOffset + 1u)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            credentials   = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(credentials) + 1u);
+            if (cmd->bufLen < payloadOffset + 8)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            breadcrumb    = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
+            payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
+            if (cmd->bufLen < payloadOffset + 4)
+            {
+                return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
+            }
+            timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
+
+            wasHandled = emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
+            break;
+        }
+        default: {
+            // Unrecognized command ID, error status will apply.
+            break;
+        }
+        }
+    }
+    return status(wasHandled, true, cmd->mfgSpecific);
+}
 EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd)
 {
     bool wasHandled = false;
index 565ae32..3e35321 100644 (file)
@@ -63,6 +63,9 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId)
     case ZCL_MEDIA_PLAYBACK_CLUSTER_ID:
         emberAfMediaPlaybackClusterInitCallback(endpoint);
         break;
+    case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
+        emberAfNetworkCommissioningClusterInitCallback(endpoint);
+        break;
     case ZCL_ON_OFF_CLUSTER_ID:
         emberAfOnOffClusterInitCallback(endpoint);
         break;
@@ -138,6 +141,11 @@ void __attribute__((weak)) emberAfMediaPlaybackClusterInitCallback(EndpointId en
     // To prevent warning
     (void) endpoint;
 }
+void __attribute__((weak)) emberAfNetworkCommissioningClusterInitCallback(EndpointId endpoint)
+{
+    // To prevent warning
+    (void) endpoint;
+}
 void __attribute__((weak)) emberAfOnOffClusterInitCallback(EndpointId endpoint)
 {
     // To prevent warning
index 887dabe..1f41150 100644 (file)
@@ -133,6 +133,14 @@ void emberAfLowPowerClusterInitCallback(chip::EndpointId endpoint);
  */
 void emberAfMediaPlaybackClusterInitCallback(chip::EndpointId endpoint);
 
+/** @brief Network Commissioning Cluster Init
+ *
+ * Cluster Init
+ *
+ * @param endpoint    Endpoint that is being initialized
+ */
+void emberAfNetworkCommissioningClusterInitCallback(chip::EndpointId endpoint);
+
 /** @brief On/off Cluster Init
  *
  * Cluster Init
@@ -1211,6 +1219,77 @@ EmberAfStatus emberAfMediaPlaybackClusterServerPreAttributeChangedCallback(chip:
 void emberAfMediaPlaybackClusterServerTickCallback(chip::EndpointId endpoint);
 
 //
+// Network Commissioning Cluster server
+//
+
+/** @brief Network Commissioning Cluster Server Init
+ *
+ * Server Init
+ *
+ * @param endpoint    Endpoint that is being initialized
+ */
+void emberAfNetworkCommissioningClusterServerInitCallback(chip::EndpointId endpoint);
+
+/** @brief Network Commissioning Cluster Server Attribute Changed
+ *
+ * Server Attribute Changed
+ *
+ * @param endpoint    Endpoint that is being initialized
+ * @param attributeId Attribute that changed
+ */
+void emberAfNetworkCommissioningClusterServerAttributeChangedCallback(chip::EndpointId endpoint, chip::AttributeId attributeId);
+
+/** @brief Network Commissioning Cluster Server Manufacturer Specific Attribute Changed
+ *
+ * Server Manufacturer Specific Attribute Changed
+ *
+ * @param endpoint          Endpoint that is being initialized
+ * @param attributeId       Attribute that changed
+ * @param manufacturerCode  Manufacturer Code of the attribute that changed
+ */
+void emberAfNetworkCommissioningClusterServerManufacturerSpecificAttributeChangedCallback(chip::EndpointId endpoint,
+                                                                                          chip::AttributeId attributeId,
+                                                                                          uint16_t manufacturerCode);
+
+/** @brief Network Commissioning Cluster Server Message Sent
+ *
+ * Server Message Sent
+ *
+ * @param type               The type of message sent
+ * @param indexOrDestination The destination or address to which the message was sent
+ * @param apsFrame           The APS frame for the message
+ * @param msgLen             The length of the message
+ * @param message            The message that was sent
+ * @param status             The status of the sent message
+ */
+void emberAfNetworkCommissioningClusterServerMessageSentCallback(EmberOutgoingMessageType type, uint64_t indexOrDestination,
+                                                                 EmberApsFrame * apsFrame, uint16_t msgLen, uint8_t * message,
+                                                                 EmberStatus status);
+
+/** @brief Network Commissioning Cluster Server Pre Attribute Changed
+ *
+ * server Pre Attribute Changed
+ *
+ * @param endpoint      Endpoint that is being initialized
+ * @param attributeId   Attribute to be changed
+ * @param attributeType Attribute type
+ * @param size          Attribute size
+ * @param value         Attribute value
+ */
+EmberAfStatus emberAfNetworkCommissioningClusterServerPreAttributeChangedCallback(chip::EndpointId endpoint,
+                                                                                  chip::AttributeId attributeId,
+                                                                                  EmberAfAttributeType attributeType, uint8_t size,
+                                                                                  uint8_t * value);
+
+/** @brief Network Commissioning Cluster Server Tick
+ *
+ * server Tick
+ *
+ * @param endpoint  Endpoint that is being served
+ */
+void emberAfNetworkCommissioningClusterServerTickCallback(chip::EndpointId endpoint);
+
+//
 // On/off Cluster server
 //
 
@@ -2012,6 +2091,91 @@ bool emberAfMediaPlaybackClusterStartOverRequestCallback();
 bool emberAfMediaPlaybackClusterStopRequestCallback();
 
 /**
+ * @brief Network Commissioning Cluster AddThreadNetwork Command callback
+ * @param operationalDataset
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterAddThreadNetworkCallback(uint8_t * operationalDataset, uint64_t breadcrumb,
+                                                                uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster AddWiFiNetwork Command callback
+ * @param ssid
+ * @param credentials
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(uint8_t * ssid, uint8_t * credentials, uint64_t breadcrumb,
+                                                              uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster DisableNetwork Command callback
+ * @param networkID
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterDisableNetworkCallback(uint8_t * networkID, uint64_t breadcrumb, uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster EnableNetwork Command callback
+ * @param networkID
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterEnableNetworkCallback(uint8_t * networkID, uint64_t breadcrumb, uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster GetLastNetworkCommissioningResult Command callback
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster RemoveNetwork Command callback
+ * @param networkID
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterRemoveNetworkCallback(uint8_t * NetworkID, uint64_t Breadcrumb, uint32_t TimeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster ScanNetworks Command callback
+ * @param ssid
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterScanNetworksCallback(uint8_t * ssid, uint64_t breadcrumb, uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster UpdateThreadNetwork Command callback
+ * @param operationalDataset
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(uint8_t * operationalDataset, uint64_t breadcrumb,
+                                                                   uint32_t timeoutMs);
+
+/**
+ * @brief Network Commissioning Cluster UpdateWiFiNetwork Command callback
+ * @param ssid
+ * @param credentials
+ * @param breadcrumb
+ * @param timeoutMs
+ */
+
+bool emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(uint8_t * ssid, uint8_t * credentials, uint64_t breadcrumb,
+                                                                 uint32_t timeoutMs);
+
+/**
  * @brief On/off Cluster Off Command callback
  */
 
index f72c96f..79d1e15 100644 (file)
                                                                                                                                    \
                                   ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
 
+/** @brief Command description for ScanNetworks
+ *
+ * Command: ScanNetworks
+ * @param ssid OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterScanNetworks(ssid, breadcrumb, timeoutMs)                                                                  \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_SCAN_NETWORKS_COMMAND_ID, "uuu", ssid, breadcrumb, timeoutMs);
+
+/** @brief Command description for ScanNetworksResponse
+ *
+ * Command: ScanNetworksResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ * @param wifiScanResults WiFiInterfaceScanResult []
+ * @param wifiScanResultsLen int
+ * @param threadScanResults ThreadInterfaceScanResult []
+ * @param threadScanResultsLen int
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterScanNetworksResponse(errorCode, debugText, wifiScanResults, wifiScanResultsLen, threadScanResults,         \
+                                             threadScanResultsLen)                                                                 \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID, "uubb", errorCode, debugText, wifiScanResults,            \
+                                  wifiScanResultsLen, threadScanResults, threadScanResultsLen);
+
+/** @brief Command description for AddWiFiNetwork
+ *
+ * Command: AddWiFiNetwork
+ * @param ssid OCTET_STRING
+ * @param credentials OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                   \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
+
+/** @brief Command description for AddWiFiNetworkResponse
+ *
+ * Command: AddWiFiNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddWiFiNetworkResponse(errorCode, debugText)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for UpdateWiFiNetwork
+ *
+ * Command: UpdateWiFiNetwork
+ * @param ssid OCTET_STRING
+ * @param credentials OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
+
+/** @brief Command description for UpdateWiFiNetworkResponse
+ *
+ * Command: UpdateWiFiNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateWiFiNetworkResponse(errorCode, debugText)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for AddThreadNetwork
+ *
+ * Command: AddThreadNetwork
+ * @param operationalDataset OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
+
+/** @brief Command description for AddThreadNetworkResponse
+ *
+ * Command: AddThreadNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddThreadNetworkResponse(errorCode, debugText)                                                             \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for UpdateThreadNetwork
+ *
+ * Command: UpdateThreadNetwork
+ * @param operationalDataset OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                             \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
+
+/** @brief Command description for UpdateThreadNetworkResponse
+ *
+ * Command: UpdateThreadNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateThreadNetworkResponse(errorCode, debugText)                                                          \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for RemoveNetwork
+ *
+ * Command: RemoveNetwork
+ * @param NetworkID OCTET_STRING
+ * @param Breadcrumb INT64U
+ * @param TimeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterRemoveNetwork(NetworkID, Breadcrumb, TimeoutMs)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_REMOVE_NETWORK_COMMAND_ID, "uuu", NetworkID, Breadcrumb, TimeoutMs);
+
+/** @brief Command description for RemoveNetworkResponse
+ *
+ * Command: RemoveNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterRemoveNetworkResponse(errorCode, debugText)                                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for EnableNetwork
+ *
+ * Command: EnableNetwork
+ * @param networkID OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterEnableNetwork(networkID, breadcrumb, timeoutMs)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ENABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
+
+/** @brief Command description for EnableNetworkResponse
+ *
+ * Command: EnableNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterEnableNetworkResponse(errorCode, debugText)                                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for DisableNetwork
+ *
+ * Command: DisableNetwork
+ * @param networkID OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterDisableNetwork(networkID, breadcrumb, timeoutMs)                                                           \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_DISABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
+
+/** @brief Command description for DisableNetworkResponse
+ *
+ * Command: DisableNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterDisableNetworkResponse(errorCode, debugText)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for GetLastNetworkCommissioningResult
+ *
+ * Command: GetLastNetworkCommissioningResult
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterGetLastNetworkCommissioningResult(timeoutMs)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID, "u", timeoutMs);
+
 /** @brief Command description for LockDoor
  *
  * Command: LockDoor
                                   ZCL_GET_ENDPOINT_LIST_REQUEST_COMMAND_ID, "uuuub", startIndex, total, startIndex, count,         \
                                   endpointInformationRecordList, endpointInformationRecordListLen);
 
-/** @brief Command description for ScanNetworks
- *
- * Command: ScanNetworks
- * @param ssid OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterScanNetworks(ssid, breadcrumb, timeoutMs)                                                                  \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_SCAN_NETWORKS_COMMAND_ID, "uuu", ssid, breadcrumb, timeoutMs);
-
-/** @brief Command description for ScanNetworksResponse
- *
- * Command: ScanNetworksResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- * @param wifiScanResults WiFiInterfaceScanResult []
- * @param wifiScanResultsLen int
- * @param threadScanResults ThreadInterfaceScanResult []
- * @param threadScanResultsLen int
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterScanNetworksResponse(errorCode, debugText, wifiScanResults, wifiScanResultsLen, threadScanResults,         \
-                                             threadScanResultsLen)                                                                 \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID, "uubb", errorCode, debugText, wifiScanResults,            \
-                                  wifiScanResultsLen, threadScanResults, threadScanResultsLen);
-
-/** @brief Command description for AddWiFiNetwork
- *
- * Command: AddWiFiNetwork
- * @param ssid OCTET_STRING
- * @param credentials OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                   \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
-
-/** @brief Command description for AddWiFiNetworkResponse
- *
- * Command: AddWiFiNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddWiFiNetworkResponse(errorCode, debugText)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for UpdateWiFiNetwork
- *
- * Command: UpdateWiFiNetwork
- * @param ssid OCTET_STRING
- * @param credentials OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
-
-/** @brief Command description for UpdateWiFiNetworkResponse
- *
- * Command: UpdateWiFiNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateWiFiNetworkResponse(errorCode, debugText)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for AddThreadNetwork
- *
- * Command: AddThreadNetwork
- * @param operationalDataset OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
-
-/** @brief Command description for AddThreadNetworkResponse
- *
- * Command: AddThreadNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddThreadNetworkResponse(errorCode, debugText)                                                             \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for UpdateThreadNetwork
- *
- * Command: UpdateThreadNetwork
- * @param operationalDataset OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                             \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
-
-/** @brief Command description for UpdateThreadNetworkResponse
- *
- * Command: UpdateThreadNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateThreadNetworkResponse(errorCode, debugText)                                                          \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for RemoveNetwork
- *
- * Command: RemoveNetwork
- * @param NetworkID OCTET_STRING
- * @param Breadcrumb INT64U
- * @param TimeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterRemoveNetwork(NetworkID, Breadcrumb, TimeoutMs)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_REMOVE_NETWORK_COMMAND_ID, "uuu", NetworkID, Breadcrumb, TimeoutMs);
-
-/** @brief Command description for RemoveNetworkResponse
- *
- * Command: RemoveNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterRemoveNetworkResponse(errorCode, debugText)                                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for EnableNetwork
- *
- * Command: EnableNetwork
- * @param networkID OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterEnableNetwork(networkID, breadcrumb, timeoutMs)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ENABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
-
-/** @brief Command description for EnableNetworkResponse
- *
- * Command: EnableNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterEnableNetworkResponse(errorCode, debugText)                                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for DisableNetwork
- *
- * Command: DisableNetwork
- * @param networkID OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterDisableNetwork(networkID, breadcrumb, timeoutMs)                                                           \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_DISABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
-
-/** @brief Command description for DisableNetworkResponse
- *
- * Command: DisableNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterDisableNetworkResponse(errorCode, debugText)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for GetLastNetworkCommissioningResult
- *
- * Command: GetLastNetworkCommissioningResult
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterGetLastNetworkCommissioningResult(timeoutMs)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID, "u", timeoutMs);
-
 /** @brief Command description for Bind
  *
  * Command: Bind
index d77da91..add8f83 100644 (file)
@@ -86,6 +86,9 @@
 // Definitions for cluster: General Commissioning
 #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030)
 
+// Definitions for cluster: Network Commissioning
+#define ZCL_NETWORK_COMMISSIONING_CLUSTER_ID (0x0031)
+
 // Definitions for cluster: Shade Configuration
 #define ZCL_SHADE_CONFIG_CLUSTER_ID (0x0100)
 
 // Definitions for cluster: ZLL Commissioning
 #define ZCL_ZLL_COMMISSIONING_CLUSTER_ID (0x1000)
 
-// Definitions for cluster: Network Commissioning
-#define ZCL_NETWORK_COMMISSIONING_CLUSTER_ID (0xAAAA)
-
 // Definitions for cluster: Binding
 #define ZCL_BINDING_CLUSTER_ID (0xF000)
 
index adc2b1c..864943b 100644 (file)
 #define ZCL_COMMISSIONING_COMPLETE_COMMAND_ID (0x06)
 #define ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID (0x07)
 
+// Commands for cluster: Network Commissioning
+#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00)
+#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01)
+#define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
+#define ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x03)
+#define ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x04)
+#define ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x05)
+#define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
+#define ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x07)
+#define ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID (0x08)
+#define ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x09)
+#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x0A)
+#define ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID (0x0B)
+#define ZCL_ENABLE_NETWORK_COMMAND_ID (0x0C)
+#define ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID (0x0D)
+#define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
+#define ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID (0x0F)
+#define ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID (0x10)
+
 // Commands for cluster: Door Lock
 #define ZCL_LOCK_DOOR_COMMAND_ID (0x00)
 #define ZCL_LOCK_DOOR_RESPONSE_COMMAND_ID (0x00)
 #define ZCL_GET_ENDPOINT_LIST_REQUEST_COMMAND_ID (0x42)
 #define ZCL_GET_ENDPOINT_LIST_RESPONSE_COMMAND_ID (0x42)
 
-// Commands for cluster: Network Commissioning
-#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00)
-#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01)
-#define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
-#define ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x03)
-#define ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x04)
-#define ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x05)
-#define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
-#define ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x07)
-#define ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID (0x08)
-#define ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x09)
-#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x0A)
-#define ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID (0x0B)
-#define ZCL_ENABLE_NETWORK_COMMAND_ID (0x0C)
-#define ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID (0x0D)
-#define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
-#define ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID (0x0F)
-#define ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID (0x10)
-
 // Commands for cluster: Binding
 #define ZCL_BIND_COMMAND_ID (0x00)
 #define ZCL_UNBIND_COMMAND_ID (0x01)
index 5e0cee0..ed2ac08 100644 (file)
 
 #define ZAP_ATTRIBUTE_MASK(mask) ATTRIBUTE_MASK_##mask
 // This is an array of EmberAfAttributeMetadata structures.
-#define GENERATED_ATTRIBUTE_COUNT 111
+#define GENERATED_ATTRIBUTE_COUNT 112
 #define GENERATED_ATTRIBUTES                                                                                                       \
     {                                                                                                                              \
         { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 2 } }, /* Identify (server): cluster revision */                           \
             }, /* Basic (server): SoftwareVersion */                                                                               \
             {                                                                                                                      \
                 0x000A, ZAP_TYPE(CHAR_STRING), 64, ZAP_ATTRIBUTE_MASK(SINGLETON), { (uint8_t *) ZAP_LONG_DEFAULTS_INDEX(180) }     \
-            }, /* Basic (server): SoftwareVersionString */                                                                         \
+            },                                                          /* Basic (server): SoftwareVersionString */                \
+            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Network Commissioning (server): cluster revision */     \
             {                                                                                                                      \
                 0xFFFD, ZAP_TYPE(INT16U), 2, ZAP_ATTRIBUTE_MASK(CLIENT), { (uint8_t *) 3 }                                         \
             },                                                      /* Door Lock (client): cluster revision */                     \
             },                                                          /* IAS Zone (server): IAS CIE address */                   \
             { 0x0011, ZAP_TYPE(INT8U), 1, 0, { (uint8_t *) 0xff } },    /* IAS Zone (server): Zone ID */                           \
             { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Low Power (server): cluster revision */                 \
-            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Application Basic (server): cluster revision */         \
             {                                                                                                                      \
                 0x0000, ZAP_TYPE(OCTET_STRING), 32, 0, { (uint8_t *) ZAP_LONG_DEFAULTS_INDEX(506) }                                \
             },                                                     /* Application Basic (server): vendor name */                   \
             { 0x0001, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0 } }, /* Application Basic (server): vendor id */                     \
             {                                                                                                                      \
                 0x0002, ZAP_TYPE(OCTET_STRING), 32, 0, { (uint8_t *) ZAP_LONG_DEFAULTS_INDEX(538) }                                \
-            },                                                     /* Application Basic (server): application name */              \
-            { 0x0003, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0 } }, /* Application Basic (server): product id */                    \
+            },                                                          /* Application Basic (server): application name */         \
+            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Application Basic (server): cluster revision */         \
+            { 0x0003, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0 } },      /* Application Basic (server): product id */               \
             {                                                                                                                      \
                 0x0005, ZAP_TYPE(OCTET_STRING), 32, 0, { (uint8_t *) ZAP_LONG_DEFAULTS_INDEX(570) }                                \
             },                                                          /* Application Basic (server): application id */           \
             { 0x0006, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0 } },      /* Application Basic (server): catalog vendor id */        \
             { 0x0007, ZAP_TYPE(ENUM8), 1, 0, { (uint8_t *) 0x01 } },    /* Application Basic (server): application satus */        \
-            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Media Playback (server): cluster revision */            \
             { 0x0000, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0 } },      /* Media Playback (server): current state */               \
+            { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Media Playback (server): cluster revision */            \
             { 0xFFFD, ZAP_TYPE(INT16U), 2, 0, { (uint8_t *) 0x0001 } }, /* Content Launch (server): cluster revision */            \
     }
 
     };
 
 #define ZAP_CLUSTER_MASK(mask) CLUSTER_MASK_##mask
-#define GENERATED_CLUSTER_COUNT 18
+#define GENERATED_CLUSTER_COUNT 19
 #define GENERATED_CLUSTERS                                                                                                         \
     {                                                                                                                              \
         { 0x0003,                                                                                                                  \
                 0x0028, ZAP_ATTRIBUTE_INDEX(14), 12, 254, ZAP_CLUSTER_MASK(SERVER), NULL                                           \
             }, /* Endpoint: 1, Cluster: Basic (server) */                                                                          \
             {                                                                                                                      \
-                0x0101, ZAP_ATTRIBUTE_INDEX(26), 1, 2, ZAP_CLUSTER_MASK(CLIENT), NULL                                              \
+                0x0031, ZAP_ATTRIBUTE_INDEX(26), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
+            }, /* Endpoint: 1, Cluster: Network Commissioning (server) */                                                          \
+            {                                                                                                                      \
+                0x0101, ZAP_ATTRIBUTE_INDEX(27), 1, 2, ZAP_CLUSTER_MASK(CLIENT), NULL                                              \
             }, /* Endpoint: 1, Cluster: Door Lock (client) */                                                                      \
             { 0x0101,                                                                                                              \
-              ZAP_ATTRIBUTE_INDEX(27),                                                                                             \
+              ZAP_ATTRIBUTE_INDEX(28),                                                                                             \
               4,                                                                                                                   \
               5,                                                                                                                   \
               ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(ATTRIBUTE_CHANGED_FUNCTION),                                             \
               chipFuncArrayDoorLockServer }, /* Endpoint: 1, Cluster: Door Lock (server) */                                        \
             {                                                                                                                      \
-                0x0103, ZAP_ATTRIBUTE_INDEX(31), 1, 2, ZAP_CLUSTER_MASK(CLIENT), NULL                                              \
+                0x0103, ZAP_ATTRIBUTE_INDEX(32), 1, 2, ZAP_CLUSTER_MASK(CLIENT), NULL                                              \
             }, /* Endpoint: 1, Cluster: Barrier Control (client) */                                                                \
             {                                                                                                                      \
-                0x0103, ZAP_ATTRIBUTE_INDEX(32), 5, 7, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
+                0x0103, ZAP_ATTRIBUTE_INDEX(33), 5, 7, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
             }, /* Endpoint: 1, Cluster: Barrier Control (server) */                                                                \
             {                                                                                                                      \
-                0x0300, ZAP_ATTRIBUTE_INDEX(37), 1, 2, ZAP_CLUSTER_MASK(CLIENT), NULL                                              \
+                0x0300, ZAP_ATTRIBUTE_INDEX(38), 1, 2, ZAP_CLUSTER_MASK(CLIENT), NULL                                              \
             }, /* Endpoint: 1, Cluster: Color Control (client) */                                                                  \
             { 0x0300,                                                                                                              \
-              ZAP_ATTRIBUTE_INDEX(38),                                                                                             \
+              ZAP_ATTRIBUTE_INDEX(39),                                                                                             \
               51,                                                                                                                  \
               336,                                                                                                                 \
               ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION),                                                          \
               chipFuncArrayColorControlServer }, /* Endpoint: 1, Cluster: Color Control (server) */                                \
             {                                                                                                                      \
-                0x0402, ZAP_ATTRIBUTE_INDEX(89), 4, 8, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
+                0x0402, ZAP_ATTRIBUTE_INDEX(90), 4, 8, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
             }, /* Endpoint: 1, Cluster: Temperature Measurement (server) */                                                        \
             { 0x0500,                                                                                                              \
-              ZAP_ATTRIBUTE_INDEX(93),                                                                                             \
+              ZAP_ATTRIBUTE_INDEX(94),                                                                                             \
               6,                                                                                                                   \
               16,                                                                                                                  \
               ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION) | ZAP_CLUSTER_MASK(PRE_ATTRIBUTE_CHANGED_FUNCTION) |      \
                   ZAP_CLUSTER_MASK(MESSAGE_SENT_FUNCTION),                                                                         \
               chipFuncArrayIasZoneServer }, /* Endpoint: 1, Cluster: IAS Zone (server) */                                          \
             {                                                                                                                      \
-                0x0508, ZAP_ATTRIBUTE_INDEX(99), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
+                0x0508, ZAP_ATTRIBUTE_INDEX(100), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
             }, /* Endpoint: 1, Cluster: Low Power (server) */                                                                      \
             {                                                                                                                      \
-                0x050D, ZAP_ATTRIBUTE_INDEX(100), 8, 105, ZAP_CLUSTER_MASK(SERVER), NULL                                           \
+                0x050D, ZAP_ATTRIBUTE_INDEX(101), 8, 105, ZAP_CLUSTER_MASK(SERVER), NULL                                           \
             }, /* Endpoint: 1, Cluster: Application Basic (server) */                                                              \
             {                                                                                                                      \
-                0xF001, ZAP_ATTRIBUTE_INDEX(108), 2, 4, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
+                0xF001, ZAP_ATTRIBUTE_INDEX(109), 2, 4, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
             }, /* Endpoint: 1, Cluster: Media Playback (server) */                                                                 \
             {                                                                                                                      \
-                0xF002, ZAP_ATTRIBUTE_INDEX(110), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
+                0xF002, ZAP_ATTRIBUTE_INDEX(111), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
             }, /* Endpoint: 1, Cluster: Content Launch (server) */                                                                 \
     }
 
 // This is an array of EmberAfEndpointType structures.
 #define GENERATED_ENDPOINT_TYPES                                                                                                   \
     {                                                                                                                              \
-        { ZAP_CLUSTER_INDEX(0), 18, 766 },                                                                                         \
+        { ZAP_CLUSTER_INDEX(0), 19, 768 },                                                                                         \
     }
 
 // Largest attribute size is needed for various buffers
 #define ATTRIBUTE_SINGLETONS_SIZE (254)
 
 // Total size of attribute storage
-#define ATTRIBUTE_MAX_SIZE (766)
+#define ATTRIBUTE_MAX_SIZE (768)
 
 // Number of fixed endpoints
 #define FIXED_ENDPOINT_COUNT (1)
 
 // Array of EmberAfCommandMetadata structs.
 #define ZAP_COMMAND_MASK(mask) COMMAND_MASK_##mask
-#define EMBER_AF_GENERATED_COMMAND_COUNT (141)
+#define EMBER_AF_GENERATED_COMMAND_COUNT (158)
 #define GENERATED_COMMANDS                                                                                                         \
     {                                                                                                                              \
         { 0x0003, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) },     /* Identify (server): Identify */                                 \
             { 0x0028, 0x00, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): StartUp */                                     \
             { 0x0028, 0x01, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): ShutDown */                                    \
             { 0x0028, 0x02, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Basic (server): Leave */                                       \
+            { 0x0031, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): ScanNetworks */                \
+            { 0x0031, 0x01, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): ScanNetworksResponse */        \
+            { 0x0031, 0x02, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): AddWiFiNetwork */              \
+            { 0x0031, 0x03, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): AddWiFiNetworkResponse */      \
+            { 0x0031, 0x04, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): UpdateWiFiNetwork */           \
+            { 0x0031, 0x05, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): UpdateWiFiNetworkResponse */   \
+            { 0x0031, 0x06, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): AddThreadNetwork */            \
+            { 0x0031, 0x07, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): AddThreadNetworkResponse */    \
+            { 0x0031, 0x08, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): UpdateThreadNetwork */         \
+            { 0x0031, 0x09, ZAP_COMMAND_MASK(OUTGOING_SERVER) }, /* Network Commissioning (server): UpdateThreadNetworkResponse */ \
+            { 0x0031, 0x0A, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): RemoveNetwork */               \
+            { 0x0031, 0x0B, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): RemoveNetworkResponse */       \
+            { 0x0031, 0x0C, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): EnableNetwork */               \
+            { 0x0031, 0x0D, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): EnableNetworkResponse */       \
+            { 0x0031, 0x0E, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): DisableNetwork */              \
+            { 0x0031, 0x0F, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Network Commissioning (server): DisableNetworkResponse */      \
+            { 0x0031, 0x10,                                                                                                        \
+              ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Network Commissioning (server): GetLastNetworkCommissioningResult */         \
             { 0x0101, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Door Lock (client): LockDoor */                                \
             { 0x0101, 0x00, ZAP_COMMAND_MASK(INCOMING_CLIENT) }, /* Door Lock (client): LockDoorResponse */                        \
             { 0x0101, 0x00, ZAP_COMMAND_MASK(INCOMING_SERVER) }, /* Door Lock (server): LockDoor */                                \
index fe38703..341731e 100644 (file)
@@ -44,6 +44,7 @@
 #define EMBER_AF_LEVEL_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_LOW_POWER_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_MEDIA_PLAYBACK_CLUSTER_SERVER_ENDPOINT_COUNT (1)
+#define EMBER_AF_NETWORK_COMMISSIONING_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_ON_OFF_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_SCENES_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_TEMP_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (1)
 #define EMBER_AF_PLUGIN_MEDIA_PLAYBACK_SERVER
 #define EMBER_AF_PLUGIN_MEDIA_PLAYBACK
 
+// Use this macro to check if the server side of the Network Commissioning cluster is included
+#define ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER
+#define EMBER_AF_PLUGIN_NETWORK_COMMISSIONING_SERVER
+#define EMBER_AF_PLUGIN_NETWORK_COMMISSIONING
+
 // Use this macro to check if the server side of the On/off cluster is included
 #define ZCL_USING_ON_OFF_CLUSTER_SERVER
 #define EMBER_AF_PLUGIN_ON_OFF_SERVER
index bd08d38..8c737e9 100644 (file)
 #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER
 #endif
 
+#if defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_CLIENT)
+#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER { ZCL_NETWORK_COMMISSIONING_CLUSTER_ID, 49, "Network Commissioning" },
+#else
+#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER
+#endif
+
 #if defined(ZCL_USING_SHADE_CONFIG_CLUSTER_SERVER) || defined(ZCL_USING_SHADE_CONFIG_CLUSTER_CLIENT)
 #define CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER { ZCL_SHADE_CONFIG_CLUSTER_ID, 256, "Shade Configuration" },
 #else
 #define CHIP_PRINTCLUSTER_ZLL_COMMISSIONING_CLUSTER
 #endif
 
-#if defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_CLIENT)
-#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER { ZCL_NETWORK_COMMISSIONING_CLUSTER_ID, 43690, "Network Commissioning" },
-#else
-#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER
-#endif
-
 #if defined(ZCL_USING_BINDING_CLUSTER_SERVER) || defined(ZCL_USING_BINDING_CLUSTER_CLIENT)
 #define CHIP_PRINTCLUSTER_BINDING_CLUSTER { ZCL_BINDING_CLUSTER_ID, 61440, "Binding" },
 #else
     CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER                                                                                            \
     CHIP_PRINTCLUSTER_BASIC_CLUSTER                                                                                                \
     CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER                                                                                \
+    CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER                                                                                \
     CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER                                                                                         \
     CHIP_PRINTCLUSTER_DOOR_LOCK_CLUSTER                                                                                            \
     CHIP_PRINTCLUSTER_WINDOW_COVERING_CLUSTER                                                                                      \
     CHIP_PRINTCLUSTER_ELECTRICAL_MEASUREMENT_CLUSTER                                                                               \
     CHIP_PRINTCLUSTER_DIAGNOSTICS_CLUSTER                                                                                          \
     CHIP_PRINTCLUSTER_ZLL_COMMISSIONING_CLUSTER                                                                                    \
-    CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER                                                                                \
     CHIP_PRINTCLUSTER_BINDING_CLUSTER                                                                                              \
     CHIP_PRINTCLUSTER_MEDIA_PLAYBACK_CLUSTER                                                                                       \
     CHIP_PRINTCLUSTER_CONTENT_LAUNCH_CLUSTER                                                                                       \
index af07b1a..4c7ff52 100644 (file)
@@ -1,5 +1,5 @@
 {
-  "writeTime": "Mon Mar 08 2021 19:19:58 GMT+0100 (Central European Standard Time)",
+  "writeTime": "Fri Mar 12 2021 15:20:50 GMT+0800 (China Standard Time)",
   "featureLevel": 11,
   "creator": "zap",
   "keyValuePairs": [
       "deviceTypeProfileId": 259,
       "clusters": [
         {
-          "name": "Basic",
-          "code": 40,
+          "name": "Identify",
+          "code": 3,
           "mfgCode": null,
-          "define": "BASIC_CLUSTER",
+          "define": "IDENTIFY_CLUSTER",
           "side": "client",
           "enabled": 0,
-          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "side": "client",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "3",
+              "defaultValue": "2",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ]
-        },
-        {
-          "name": "Basic",
-          "code": 40,
-          "mfgCode": null,
-          "define": "BASIC_CLUSTER",
-          "side": "server",
-          "enabled": 1,
+          ],
           "commands": [
             {
-              "name": "StartUp",
+              "name": "Identify",
               "code": 0,
               "mfgCode": null,
-              "source": "server",
+              "source": "client",
               "incoming": 1,
               "outgoing": 1
             },
             {
-              "name": "ShutDown",
+              "name": "IdentifyQuery",
               "code": 1,
               "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "Leave",
-              "code": 2,
-              "mfgCode": null,
-              "source": "server",
+              "source": "client",
               "incoming": 1,
               "outgoing": 1
             }
-          ],
+          ]
+        },
+        {
+          "name": "Identify",
+          "code": 3,
+          "mfgCode": null,
+          "define": "IDENTIFY_CLUSTER",
+          "side": "server",
+          "enabled": 1,
           "attributes": [
             {
               "name": "cluster revision",
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "3",
+              "defaultValue": "2",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "InteractionModelVersion",
+              "name": "identify time",
               "code": 0,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "0x0000",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
-            },
+            }
+          ],
+          "commands": [
             {
-              "name": "VendorName",
-              "code": 1,
+              "name": "IdentifyQueryResponse",
+              "code": 0,
               "mfgCode": null,
-              "side": "server",
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ]
+        },
+        {
+          "name": "Groups",
+          "code": 4,
+          "mfgCode": null,
+          "define": "GROUPS_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "3",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
+            }
+          ],
+          "commands": [
+            {
+              "name": "AddGroup",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
             },
             {
-              "name": "VendorID",
+              "name": "ViewGroup",
+              "code": 1,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "GetGroupMembership",
               "code": 2,
               "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveGroup",
+              "code": 3,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveAllGroups",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "AddGroupIfIdentifying",
+              "code": 5,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ]
+        },
+        {
+          "name": "Groups",
+          "code": 4,
+          "mfgCode": null,
+          "define": "GROUPS_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "AddGroupResponse",
+              "code": 0,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "ViewGroupResponse",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "GetGroupMembershipResponse",
+              "code": 2,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveGroupResponse",
+              "code": 3,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "3",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "ProductName",
-              "code": 3,
+              "name": "name support",
+              "code": 0,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
               "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Scenes",
+          "code": 5,
+          "mfgCode": null,
+          "define": "SCENES_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "commands": [
+            {
+              "name": "AddScene",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
             },
             {
-              "name": "ProductID",
+              "name": "ViewScene",
+              "code": 1,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveScene",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveAllScenes",
+              "code": 3,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "StoreScene",
               "code": 4,
               "mfgCode": null,
-              "side": "server",
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "RecallScene",
+              "code": 5,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "GetSceneMembership",
+              "code": 6,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "3",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Scenes",
+          "code": 5,
+          "mfgCode": null,
+          "define": "SCENES_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
+            {
+              "name": "AddSceneResponse",
+              "code": 0,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "ViewSceneResponse",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveSceneResponse",
+              "code": 2,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "RemoveAllScenesResponse",
+              "code": 3,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
             },
             {
-              "name": "UserLabel",
-              "code": 5,
+              "name": "StoreSceneResponse",
+              "code": 4,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "GetSceneMembershipResponse",
+              "code": 6,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "3",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "Location",
-              "code": 6,
+              "name": "scene count",
+              "code": 0,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "0x00",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "HardwareVersion",
-              "code": 7,
+              "name": "current scene",
+              "code": 1,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
               "defaultValue": "0x00",
               "reportable": 0,
               "reportableChange": 0
             },
             {
-              "name": "HardwareVersionString",
-              "code": 8,
+              "name": "current group",
+              "code": 2,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
-              "defaultValue": "",
+              "defaultValue": "0x0000",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "SoftwareVersion",
-              "code": 9,
+              "name": "scene valid",
+              "code": 3,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
               "defaultValue": "0x00",
               "reportable": 0,
               "reportableChange": 0
             },
             {
-              "name": "SoftwareVersionString",
-              "code": 10,
+              "name": "name support",
+              "code": 4,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 1,
+              "singleton": 0,
               "bounded": 0,
               "defaultValue": "",
               "reportable": 0,
           ]
         },
         {
-          "name": "Identify",
-          "code": 3,
+          "name": "On/off",
+          "code": 6,
           "mfgCode": null,
-          "define": "IDENTIFY_CLUSTER",
+          "define": "ON_OFF_CLUSTER",
           "side": "client",
           "enabled": 0,
           "commands": [
             {
-              "name": "Identify",
+              "name": "Off",
               "code": 0,
               "mfgCode": null,
               "source": "client",
               "outgoing": 1
             },
             {
-              "name": "IdentifyQuery",
+              "name": "On",
               "code": 1,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
               "outgoing": 1
+            },
+            {
+              "name": "Toggle",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
             }
           ],
           "attributes": [
           ]
         },
         {
-          "name": "Identify",
-          "code": 3,
+          "name": "On/off",
+          "code": 6,
           "mfgCode": null,
-          "define": "IDENTIFY_CLUSTER",
+          "define": "ON_OFF_CLUSTER",
           "side": "server",
           "enabled": 1,
+          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "reportableChange": 0
             },
             {
-              "name": "identify time",
+              "name": "on/off",
               "code": 0,
               "mfgCode": null,
               "side": "server",
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "0x0000",
-              "reportable": 0,
+              "defaultValue": "0x00",
+              "reportable": 1,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ],
-          "commands": [
-            {
-              "name": "IdentifyQueryResponse",
-              "code": 0,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            }
           ]
         },
         {
-          "name": "Groups",
-          "code": 4,
+          "name": "Level Control",
+          "code": 8,
           "mfgCode": null,
-          "define": "GROUPS_CLUSTER",
+          "define": "LEVEL_CONTROL_CLUSTER",
           "side": "client",
           "enabled": 0,
           "commands": [
             {
-              "name": "AddGroup",
+              "name": "MoveToLevel",
               "code": 0,
               "mfgCode": null,
               "source": "client",
               "outgoing": 1
             },
             {
-              "name": "ViewGroup",
+              "name": "Move",
               "code": 1,
               "mfgCode": null,
               "source": "client",
               "outgoing": 1
             },
             {
-              "name": "GetGroupMembership",
+              "name": "Step",
               "code": 2,
               "mfgCode": null,
               "source": "client",
               "outgoing": 1
             },
             {
-              "name": "RemoveGroup",
+              "name": "Stop",
               "code": 3,
               "mfgCode": null,
               "source": "client",
               "outgoing": 1
             },
             {
-              "name": "RemoveAllGroups",
+              "name": "MoveToLevelWithOnOff",
               "code": 4,
               "mfgCode": null,
               "source": "client",
               "outgoing": 1
             },
             {
-              "name": "AddGroupIfIdentifying",
+              "name": "MoveWithOnOff",
               "code": 5,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
               "outgoing": 1
+            },
+            {
+              "name": "StepWithOnOff",
+              "code": 6,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "StopWithOnOff",
+              "code": 7,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
             }
           ],
           "attributes": [
           ]
         },
         {
-          "name": "Groups",
-          "code": 4,
+          "name": "Level Control",
+          "code": 8,
           "mfgCode": null,
-          "define": "GROUPS_CLUSTER",
+          "define": "LEVEL_CONTROL_CLUSTER",
           "side": "server",
           "enabled": 1,
-          "commands": [
-            {
-              "name": "AddGroupResponse",
-              "code": 0,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "ViewGroupResponse",
-              "code": 1,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "GetGroupMembershipResponse",
-              "code": 2,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "RemoveGroupResponse",
-              "code": 3,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            }
-          ],
+          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            },
-            {
-              "name": "name support",
-              "code": 0,
-              "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
-          ]
-        },
-        {
-          "name": "Scenes",
-          "code": 5,
-          "mfgCode": null,
-          "define": "SCENES_CLUSTER",
-          "side": "client",
-          "enabled": 0,
-          "commands": [
-            {
-              "name": "AddScene",
-              "code": 0,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "ViewScene",
-              "code": 1,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "RemoveScene",
-              "code": 2,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "RemoveAllScenes",
-              "code": 3,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "StoreScene",
-              "code": 4,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "RecallScene",
-              "code": 5,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
+              "defaultValue": "3",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
             },
             {
-              "name": "GetSceneMembership",
-              "code": 6,
+              "name": "current level",
+              "code": 0,
               "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
+              "side": "server",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x00",
+              "reportable": 1,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
             }
-          ],
+          ]
+        },
+        {
+          "name": "Basic",
+          "code": 40,
+          "mfgCode": null,
+          "define": "BASIC_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "side": "client",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
               "defaultValue": "3",
               "reportable": 0,
           ]
         },
         {
-          "name": "Scenes",
-          "code": 5,
+          "name": "Basic",
+          "code": 40,
           "mfgCode": null,
-          "define": "SCENES_CLUSTER",
+          "define": "BASIC_CLUSTER",
           "side": "server",
           "enabled": 1,
           "commands": [
             {
-              "name": "AddSceneResponse",
+              "name": "StartUp",
               "code": 0,
               "mfgCode": null,
               "source": "server",
               "outgoing": 1
             },
             {
-              "name": "ViewSceneResponse",
+              "name": "ShutDown",
               "code": 1,
               "mfgCode": null,
               "source": "server",
               "outgoing": 1
             },
             {
-              "name": "RemoveSceneResponse",
+              "name": "Leave",
               "code": 2,
               "mfgCode": null,
               "source": "server",
               "incoming": 1,
               "outgoing": 1
-            },
-            {
-              "name": "RemoveAllScenesResponse",
-              "code": 3,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "StoreSceneResponse",
-              "code": 4,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "GetSceneMembershipResponse",
-              "code": 6,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
             }
           ],
           "attributes": [
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
               "defaultValue": "3",
               "reportable": 0,
               "reportableChange": 0
             },
             {
-              "name": "scene count",
+              "name": "InteractionModelVersion",
               "code": 0,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "0x00",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "current scene",
+              "name": "VendorName",
               "code": 1,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "0x00",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "current group",
+              "name": "VendorID",
               "code": 2,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "0x0000",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "scene valid",
+              "name": "ProductName",
               "code": 3,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "singleton": 1,
               "bounded": 0,
-              "defaultValue": "0x00",
+              "defaultValue": "",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
             },
             {
-              "name": "name support",
+              "name": "ProductID",
               "code": 4,
               "mfgCode": null,
               "side": "server",
               "included": 1,
               "storageOption": "RAM",
-              "singleton": 0,
+              "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": "Location",
+              "code": 6,
+              "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,
           ]
         },
         {
-          "name": "On/off",
-          "code": 6,
+          "name": "Network Commissioning",
+          "code": 49,
           "mfgCode": null,
-          "define": "ON_OFF_CLUSTER",
+          "define": "NETWORK_COMMISSIONING_CLUSTER",
           "side": "client",
           "enabled": 0,
           "commands": [
             {
-              "name": "Off",
+              "name": "ScanNetworks",
               "code": 0,
               "mfgCode": null,
               "source": "client",
               "outgoing": 1
             },
             {
-              "name": "On",
-              "code": 1,
+              "name": "AddWiFiNetwork",
+              "code": 2,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "UpdateWiFiNetwork",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "AddThreadNetwork",
+              "code": 6,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "UpdateThreadNetwork",
+              "code": 8,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 0
+            },
+            {
+              "name": "RemoveNetwork",
+              "code": 10,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
               "outgoing": 1
             },
             {
-              "name": "Toggle",
-              "code": 2,
+              "name": "EnableNetwork",
+              "code": 12,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
               "outgoing": 1
-            }
-          ],
-          "attributes": [
+            },
             {
-              "name": "cluster revision",
-              "code": 65533,
+              "name": "DisableNetwork",
+              "code": 14,
               "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "2",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "GetLastNetworkCommissioningResult",
+              "code": 16,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
             }
-          ]
-        },
-        {
-          "name": "On/off",
-          "code": 6,
-          "mfgCode": null,
-          "define": "ON_OFF_CLUSTER",
-          "side": "server",
-          "enabled": 1,
-          "commands": [],
+          ],
           "attributes": [
             {
               "name": "cluster revision",
               "code": 65533,
               "mfgCode": null,
-              "side": "server",
+              "side": "client",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "2",
+              "defaultValue": "0x0001",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
-            },
-            {
-              "name": "on/off",
-              "code": 0,
-              "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "0x00",
-              "reportable": 1,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
             }
           ]
         },
         {
-          "name": "Level Control",
-          "code": 8,
+          "name": "Network Commissioning",
+          "code": 49,
           "mfgCode": null,
-          "define": "LEVEL_CONTROL_CLUSTER",
-          "side": "client",
-          "enabled": 0,
+          "define": "NETWORK_COMMISSIONING_CLUSTER",
+          "side": "server",
+          "enabled": 1,
           "commands": [
             {
-              "name": "MoveToLevel",
-              "code": 0,
+              "name": "ScanNetworksResponse",
+              "code": 1,
               "mfgCode": null,
-              "source": "client",
+              "source": "server",
               "incoming": 1,
               "outgoing": 1
             },
             {
-              "name": "Move",
-              "code": 1,
+              "name": "AddWiFiNetworkResponse",
+              "code": 3,
               "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
+              "source": "server",
+              "incoming": 0,
               "outgoing": 1
             },
             {
-              "name": "Step",
-              "code": 2,
+              "name": "UpdateWiFiNetworkResponse",
+              "code": 5,
               "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
+              "source": "server",
+              "incoming": 0,
               "outgoing": 1
             },
             {
-              "name": "Stop",
-              "code": 3,
+              "name": "AddThreadNetworkResponse",
+              "code": 7,
               "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
+              "source": "server",
+              "incoming": 0,
               "outgoing": 1
             },
             {
-              "name": "MoveToLevelWithOnOff",
-              "code": 4,
+              "name": "UpdateThreadNetworkResponse",
+              "code": 9,
               "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
+              "source": "server",
+              "incoming": 0,
               "outgoing": 1
             },
             {
-              "name": "MoveWithOnOff",
-              "code": 5,
+              "name": "RemoveNetworkResponse",
+              "code": 11,
               "mfgCode": null,
-              "source": "client",
+              "source": "server",
               "incoming": 1,
               "outgoing": 1
             },
             {
-              "name": "StepWithOnOff",
-              "code": 6,
+              "name": "EnableNetworkResponse",
+              "code": 13,
               "mfgCode": null,
-              "source": "client",
+              "source": "server",
               "incoming": 1,
               "outgoing": 1
             },
             {
-              "name": "StopWithOnOff",
-              "code": 7,
+              "name": "DisableNetworkResponse",
+              "code": 15,
               "mfgCode": null,
-              "source": "client",
+              "source": "server",
               "incoming": 1,
               "outgoing": 1
             }
               "name": "cluster revision",
               "code": 65533,
               "mfgCode": null,
-              "side": "client",
+              "side": "server",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "bounded": 0,
-              "defaultValue": "3",
+              "defaultValue": "0x0001",
               "reportable": 0,
               "minInterval": 0,
               "maxInterval": 65344,
           ]
         },
         {
-          "name": "Level Control",
-          "code": 8,
+          "name": "Door Lock",
+          "code": 257,
           "mfgCode": null,
-          "define": "LEVEL_CONTROL_CLUSTER",
-          "side": "server",
+          "define": "DOOR_LOCK_CLUSTER",
+          "side": "client",
           "enabled": 1,
           "attributes": [
             {
               "name": "cluster revision",
               "code": 65533,
               "mfgCode": null,
-              "side": "server",
+              "side": "client",
               "included": 1,
               "storageOption": "RAM",
               "singleton": 0,
               "minInterval": 0,
               "maxInterval": 65344,
               "reportableChange": 0
-            },
-            {
-              "name": "current level",
-              "code": 0,
-              "mfgCode": null,
-              "side": "server",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "0x00",
-              "reportable": 1,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
             }
           ],
-          "commands": []
-        },
-        {
-          "name": "Door Lock",
-          "code": 257,
-          "mfgCode": null,
-          "define": "DOOR_LOCK_CLUSTER",
-          "side": "client",
-          "enabled": 1,
           "commands": [
             {
               "name": "LockDoor",
               "incoming": 1,
               "outgoing": 1
             }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
           ]
         },
         {
           "define": "COLOR_CONTROL_CLUSTER",
           "side": "client",
           "enabled": 1,
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "3",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ],
           "commands": [
             {
               "name": "MoveToHue",
               "incoming": 1,
               "outgoing": 1
             }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
           ]
         },
         {
           "define": "COLOR_CONTROL_CLUSTER",
           "side": "server",
           "enabled": 1,
+          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ],
-          "commands": []
+          ]
         },
         {
           "name": "Temperature Measurement",
           "define": "TEMP_MEASUREMENT_CLUSTER",
           "side": "client",
           "enabled": 0,
-          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ]
+          ],
+          "commands": []
         },
         {
           "name": "Temperature Measurement",
           "define": "IAS_ZONE_CLUSTER",
           "side": "server",
           "enabled": 1,
-          "commands": [
-            {
-              "name": "ZoneStatusChangeNotification",
-              "code": 0,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            },
-            {
-              "name": "ZoneEnrollRequest",
-              "code": 1,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 0,
-              "outgoing": 1
-            }
-          ],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
+          ],
+          "commands": [
+            {
+              "name": "ZoneStatusChangeNotification",
+              "code": 0,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            },
+            {
+              "name": "ZoneEnrollRequest",
+              "code": 1,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 0,
+              "outgoing": 1
+            }
           ]
         },
         {
           "define": "APPLICATION_BASIC_CLUSTER",
           "side": "client",
           "enabled": 0,
-          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ]
+          ],
+          "commands": []
         },
         {
           "name": "Application Basic",
           "define": "CONTENT_LAUNCH_CLUSTER",
           "side": "client",
           "enabled": 0,
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x0001",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ],
           "commands": [
             {
               "name": "LaunchContent",
               "incoming": 1,
               "outgoing": 1
             }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "0x0001",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
           ]
         },
         {
       "networkId": 1
     }
   ]
-}
+}
\ No newline at end of file
diff --git a/integrations/docker/images/chip-build-k32w/Dockerfile b/integrations/docker/images/chip-build-k32w/Dockerfile
new file mode 100644 (file)
index 0000000..911bb40
--- /dev/null
@@ -0,0 +1,19 @@
+ARG VERSION=latest
+FROM connectedhomeip/chip-build:${VERSION}
+
+# Setup the K32W SDK
+RUN set -x \
+    && apt-get update \
+    && DEBIAN_FRONTEND=noninteractive apt-get install -y wget unzip \
+    && rm -rf /var/lib/apt/lists/ \
+    && mkdir -p /opt/sdk \
+    && cd /opt/sdk \
+    && wget https://mcuxpresso.nxp.com/eclipse/sdk/2.6.2/plugins/com.nxp.mcuxpresso.sdk.sdk_2.x_k32w061dk6_2.6.2.201911251446.jar \
+    && unzip com.nxp.mcuxpresso.sdk.sdk_2.x_k32w061dk6_2.6.2.201911251446.jar \
+    && rm -rf com.nxp.mcuxpresso.sdk.sdk_2.x_k32w061dk6_2.6.2.201911251446.jar \
+    && cd sdks \
+    && unzip bea4b051e4c58da8d3bff93011a97d1d.zip \
+    && rm -rf bea4b051e4c58da8d3bff93011a97d1d.zip \
+    && : # last line
+
+ENV K32W061_SDK_ROOT=/opt/sdk/sdks
diff --git a/integrations/docker/images/chip-build-k32w/build.sh b/integrations/docker/images/chip-build-k32w/build.sh
new file mode 120000 (symlink)
index 0000000..fcb4d4e
--- /dev/null
@@ -0,0 +1 @@
+../../build.sh
\ No newline at end of file
diff --git a/integrations/docker/images/chip-build-k32w/run.sh b/integrations/docker/images/chip-build-k32w/run.sh
new file mode 120000 (symlink)
index 0000000..ccbd350
--- /dev/null
@@ -0,0 +1 @@
+../../run.sh
\ No newline at end of file
diff --git a/integrations/docker/images/chip-build-k32w/version b/integrations/docker/images/chip-build-k32w/version
new file mode 120000 (symlink)
index 0000000..a4280ac
--- /dev/null
@@ -0,0 +1 @@
+../chip-build/version
\ No newline at end of file
index 993623c..6d4a048 100755 (executable)
@@ -39,7 +39,9 @@ apt-get install -fy \
     unzip \
     wget \
     libdbus-1-dev \
-    libmbedtls-dev
+    libmbedtls-dev \
+    python3.8-dev \
+    python3.8-venv
 
 if [[ ! -f 'ci-cache-persistent/openssl/open_ssl_1.1.1f_installed' ]]; then
     mkdir -p ci-cache-persistent/openssl
index 437fd96..e6c1435 100644 (file)
@@ -42,7 +42,7 @@
 | LevelControl                                                        | 0x0008 |
 | LowPower                                                            | 0x0508 |
 | MediaPlayback                                                       | 0xF001 |
-| NetworkCommissioning                                                | 0xAAAA |
+| NetworkCommissioning                                                | 0x0031 |
 | OnOff                                                               | 0x0006 |
 | Scenes                                                              | 0x0005 |
 | TemperatureMeasurement                                              | 0x0402 |
@@ -1858,7 +1858,7 @@ chip::System::PacketBufferHandle encodeMediaPlaybackClusterReadClusterRevisionAt
                                                                                         chip::EndpointId destinationEndpoint);
 
 /*----------------------------------------------------------------------------*\
-| Cluster NetworkCommissioning                                        | 0xAAAA |
+| Cluster NetworkCommissioning                                        | 0x0031 |
 |------------------------------------------------------------------------------|
 | Commands:                                                           |        |
 | * AddThreadNetwork                                                  |   0x06 |
index ae0d400..52d8219 100644 (file)
@@ -220,6 +220,7 @@ CHIP_ERROR DoEnableNetwork(NetworkInfo * network)
     {
     case NetworkType::kThread:
 #if CHIP_DEVICE_CONFIG_ENABLE_THREAD
+        ReturnErrorOnFailure(DeviceLayer::ThreadStackMgr().SetThreadEnabled(false));
         ReturnErrorOnFailure(
             DeviceLayer::ThreadStackMgr().SetThreadProvision(network->mData.mThread.mDataset, network->mData.mThread.mDatasetLen));
         ReturnErrorOnFailure(DeviceLayer::ThreadStackMgr().SetThreadEnabled(true));
index bee0afe..88f4730 100644 (file)
@@ -113,7 +113,7 @@ uint16_t encodeApsFrame(uint8_t * buffer, uint16_t buf_length, EmberApsFrame * a
 | LevelControl                                                        | 0x0008 |
 | LowPower                                                            | 0x0508 |
 | MediaPlayback                                                       | 0xF001 |
-| NetworkCommissioning                                                | 0xAAAA |
+| NetworkCommissioning                                                | 0x0031 |
 | OnOff                                                               | 0x0006 |
 | Scenes                                                              | 0x0005 |
 | TemperatureMeasurement                                              | 0x0402 |
@@ -247,7 +247,7 @@ uint16_t encodeApsFrame(uint8_t * buffer, uint16_t buf_length, EmberApsFrame * a
 #define ZCL_START_OVER_REQUEST_COMMAND_ID (0x03)
 #define ZCL_STOP_REQUEST_COMMAND_ID (0x02)
 
-#define NETWORK_COMMISSIONING_CLUSTER_ID 0xAAAA
+#define NETWORK_COMMISSIONING_CLUSTER_ID 0x0031
 #define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
 #define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
 #define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
@@ -3182,7 +3182,7 @@ PacketBufferHandle encodeMediaPlaybackClusterReadClusterRevisionAttribute(uint8_
 }
 
 /*----------------------------------------------------------------------------*\
-| Cluster NetworkCommissioning                                        | 0xAAAA |
+| Cluster NetworkCommissioning                                        | 0x0031 |
 |------------------------------------------------------------------------------|
 | Commands:                                                           |        |
 | * AddThreadNetwork                                                  |   0x06 |
index f8b8ff9..2e7fd5a 100644 (file)
@@ -74,7 +74,7 @@ void RendezvousServer::OnRendezvousComplete()
                    ChipLogError(AppServer, "Failed to store the connection state"));
 
     uint16_t nextKeyId = mRendezvousSession.GetNextKeyId();
-    mStorage->SetKeyValue(kStorablePeerConnectionCountKey, &nextKeyId, sizeof(nextKeyId));
+    mStorage->SyncSetKeyValue(kStorablePeerConnectionCountKey, &nextKeyId, sizeof(nextKeyId));
 }
 
 void RendezvousServer::OnRendezvousStatusUpdate(Status status, CHIP_ERROR err)
index fa10c54..b34bd60 100644 (file)
@@ -72,35 +72,35 @@ constexpr bool useTestPairing()
 
 class ServerStorageDelegate : public PersistentStorageDelegate
 {
-    void SetDelegate(PersistentStorageResultDelegate * delegate) override
+    void SetStorageDelegate(PersistentStorageResultDelegate * delegate) override
     {
         ChipLogError(AppServer, "ServerStorageDelegate does not support async operations");
         chipDie();
     }
 
-    void GetKeyValue(const char * key) override
+    void AsyncGetKeyValue(const char * key) override
     {
         ChipLogError(AppServer, "ServerStorageDelegate does not support async operations");
         chipDie();
     }
 
-    void SetKeyValue(const char * key, const char * value) override
+    void AsyncSetKeyValue(const char * key, const char * value) override
     {
         ChipLogError(AppServer, "ServerStorageDelegate does not support async operations");
         chipDie();
     }
 
-    CHIP_ERROR GetKeyValue(const char * key, void * buffer, uint16_t & size) override
+    CHIP_ERROR SyncGetKeyValue(const char * key, void * buffer, uint16_t & size) override
     {
         return PersistedStorage::KeyValueStoreMgr().Get(key, buffer, size);
     }
 
-    CHIP_ERROR SetKeyValue(const char * key, const void * value, uint16_t size) override
+    CHIP_ERROR SyncSetKeyValue(const char * key, const void * value, uint16_t size) override
     {
         return PersistedStorage::KeyValueStoreMgr().Put(key, value, size);
     }
 
-    void DeleteKeyValue(const char * key) override { PersistedStorage::KeyValueStoreMgr().Delete(key); }
+    void AsyncDeleteKeyValue(const char * key) override { PersistedStorage::KeyValueStoreMgr().Delete(key); }
 };
 
 ServerStorageDelegate gServerStorage;
index ca59e2b..01ab9eb 100644 (file)
             "output": "IMClusterCommandHandler.cpp"
         },
         {
-            "path": "templates/chip/CHIPClustersObjc.zapt",
+            "path": "templates/app/CHIPClustersObjc.zapt",
             "name": "Objc ZCL API Header",
             "output": "CHIPClustersObjc.h"
         },
         {
-            "path": "templates/chip/CHIPClustersObjc-src.zapt",
+            "path": "templates/app/CHIPClustersObjc-src.zapt",
             "name": "Objc ZCL API",
             "output": "CHIPClustersObjc.mm"
         }
@@ -4,7 +4,7 @@
 
 #import "CHIPDevice.h"
 #import "CHIPDevice_Internal.h"
-#import "ChipError.h"
+#import "CHIPError.h"
 #import "gen/CHIPClustersObjc.h"
 #import "gen/CHIPClientCallbacks.h"
 
@@ -280,6 +280,39 @@ private:
     bool mKeepAlive;
 };
 
+class CHIPInt64uAttributeCallbackBridge : public Callback::Callback<Int64uAttributeCallback> {
+public:
+    CHIPInt64uAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
+        : Callback::Callback<Int64uAttributeCallback>(CallbackFn, this)
+        , mHandler(handler)
+        , mQueue(queue)
+        , mKeepAlive(keepAlive)
+    {
+    }
+
+    ~CHIPInt64uAttributeCallbackBridge() {};
+
+    static void CallbackFn(void * context, uint64_t value)
+    {
+        CHIPInt64uAttributeCallbackBridge * callback = reinterpret_cast<CHIPInt64uAttributeCallbackBridge *>(context);
+        if (callback && callback->mQueue) {
+            dispatch_async(callback->mQueue, ^{
+                callback->mHandler(nil, @{ @"value": [NSNumber numberWithUnsignedLongLong:value] });
+                if (!callback->mKeepAlive)
+                {
+                    callback->Cancel();
+                    delete callback;
+                }
+            });
+        }
+    };
+
+private:
+    ResponseHandler mHandler;
+    dispatch_queue_t mQueue;
+    bool mKeepAlive;
+};
+
 class CHIPInt16sAttributeCallbackBridge : public Callback::Callback<Int16sAttributeCallback> {
 public:
     CHIPInt16sAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
index 8e8a35b..97b417b 100644 (file)
@@ -59,7 +59,7 @@ limitations under the License.
         <name>Network Commissioning</name>
         <domain>CHIP</domain>
         <description>TODO</description>
-        <code>0xaaaa</code>
+        <code>0x0031</code>
         <define>NETWORK_COMMISSIONING_CLUSTER</define>
         <client tick="false" init="false">true</client>
         <server tick="false" init="false">true</server>
index 455cb2b..88a835a 100644 (file)
@@ -29,8 +29,6 @@ static_library("controller") {
     "CHIPDevice.h",
     "CHIPDeviceController.cpp",
     "CHIPDeviceController.h",
-    "CHIPDeviceController_deprecated.cpp",
-    "CHIPDeviceController_deprecated.h",
     "DeviceAddressUpdater.cpp",
     "DeviceAddressUpdater.h",
   ]
index 751dd90..5e6c39f 100644 (file)
@@ -41,7 +41,7 @@ constexpr ClusterId kIdentifyClusterId               = 0x0003;
 constexpr ClusterId kLevelControlClusterId           = 0x0008;
 constexpr ClusterId kLowPowerClusterId               = 0x0508;
 constexpr ClusterId kMediaPlaybackClusterId          = 0xF001;
-constexpr ClusterId kNetworkCommissioningClusterId   = 0xAAAA;
+constexpr ClusterId kNetworkCommissioningClusterId   = 0x0031;
 constexpr ClusterId kOnOffClusterId                  = 0x0006;
 constexpr ClusterId kScenesClusterId                 = 0x0005;
 constexpr ClusterId kTemperatureMeasurementClusterId = 0x0402;
index d9117da..92b954f 100644 (file)
@@ -126,7 +126,7 @@ CHIP_ERROR DeviceController::Init(NodeId localDeviceId, PersistentStorageDelegat
 
     if (mStorageDelegate != nullptr)
     {
-        mStorageDelegate->SetDelegate(this);
+        mStorageDelegate->SetStorageDelegate(this);
     }
 
     mTransportMgr   = chip::Platform::New<DeviceTransportMgr>();
@@ -193,7 +193,7 @@ CHIP_ERROR DeviceController::Shutdown()
 
     if (mStorageDelegate != nullptr)
     {
-        mStorageDelegate->SetDelegate(nullptr);
+        mStorageDelegate->SetStorageDelegate(nullptr);
         mStorageDelegate = nullptr;
     }
 
@@ -287,7 +287,7 @@ CHIP_ERROR DeviceController::GetDevice(NodeId deviceId, Device ** out_device)
             VerifyOrExit(buffer != nullptr, err = CHIP_ERROR_INVALID_ARGUMENT);
 
             PERSISTENT_KEY_OP(static_cast<uint64_t>(0), kPairedDeviceListKeyPrefix, key,
-                              err = mStorageDelegate->GetKeyValue(key, buffer, size));
+                              err = mStorageDelegate->SyncGetKeyValue(key, buffer, size));
             SuccessOrExit(err);
             VerifyOrExit(size <= max_size, err = CHIP_ERROR_INVALID_DEVICE_DESCRIPTOR);
 
@@ -306,7 +306,7 @@ CHIP_ERROR DeviceController::GetDevice(NodeId deviceId, Device ** out_device)
             uint16_t size = sizeof(deviceInfo.inner);
 
             PERSISTENT_KEY_OP(deviceId, kPairedDeviceKeyPrefix, key,
-                              err = mStorageDelegate->GetKeyValue(key, Uint8::to_char(deviceInfo.inner), size));
+                              err = mStorageDelegate->SyncGetKeyValue(key, Uint8::to_char(deviceInfo.inner), size));
             SuccessOrExit(err);
             VerifyOrExit(size <= sizeof(deviceInfo.inner), err = CHIP_ERROR_INVALID_DEVICE_DESCRIPTOR);
 
@@ -485,9 +485,9 @@ exit:
     return err;
 }
 
-void DeviceController::OnValue(const char * key, const char * value) {}
+void DeviceController::OnPersistentStorageValue(const char * key, const char * value) {}
 
-void DeviceController::OnStatus(const char * key, Operation op, CHIP_ERROR err) {}
+void DeviceController::OnPersistentStorageStatus(const char * key, Operation op, CHIP_ERROR err) {}
 
 DeviceCommissioner::DeviceCommissioner()
 {
@@ -671,7 +671,7 @@ CHIP_ERROR DeviceCommissioner::UnpairDevice(NodeId remoteDeviceId)
 
     if (mStorageDelegate != nullptr)
     {
-        PERSISTENT_KEY_OP(remoteDeviceId, kPairedDeviceKeyPrefix, key, mStorageDelegate->DeleteKeyValue(key));
+        PERSISTENT_KEY_OP(remoteDeviceId, kPairedDeviceKeyPrefix, key, mStorageDelegate->AsyncDeleteKeyValue(key));
     }
 
     mPairedDevices.Remove(remoteDeviceId);
@@ -733,7 +733,7 @@ void DeviceCommissioner::OnRendezvousComplete()
         SerializedDevice serialized;
         device->Serialize(serialized);
         PERSISTENT_KEY_OP(device->GetDeviceId(), kPairedDeviceKeyPrefix, key,
-                          mStorageDelegate->SetKeyValue(key, Uint8::to_const_char(serialized.inner)));
+                          mStorageDelegate->AsyncSetKeyValue(key, Uint8::to_const_char(serialized.inner)));
     }
 
     RendezvousCleanup(CHIP_NO_ERROR);
@@ -796,7 +796,7 @@ void DeviceCommissioner::PersistDeviceList()
             if (value != nullptr && requiredSize <= size)
             {
                 PERSISTENT_KEY_OP(static_cast<uint64_t>(0), kPairedDeviceListKeyPrefix, key,
-                                  mStorageDelegate->SetKeyValue(key, value));
+                                  mStorageDelegate->AsyncSetKeyValue(key, value));
                 mPairedDevicesUpdated = false;
             }
             chip::Platform::MemoryFree(serialized);
index 1e9c75c..98cf139 100644 (file)
@@ -213,8 +213,8 @@ private:
     void OnConnectionExpired(SecureSessionHandle session, SecureSessionMgr * mgr) override;
 
     //////////// PersistentStorageResultDelegate Implementation ///////////////
-    void OnValue(const char * key, const char * value) override;
-    void OnStatus(const char * key, Operation op, CHIP_ERROR err) override;
+    void OnPersistentStorageValue(const char * key, const char * value) override;
+    void OnPersistentStorageStatus(const char * key, Operation op, CHIP_ERROR err) override;
 
     void ReleaseAllDevices();
 
diff --git a/src/controller/CHIPDeviceController_deprecated.cpp b/src/controller/CHIPDeviceController_deprecated.cpp
deleted file mode 100644 (file)
index c1368d9..0000000
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- *
- *    Copyright (c) 2020 Project CHIP Authors
- *    Copyright (c) 2013-2017 Nest Labs, Inc.
- *    All rights reserved.
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- */
-
-/**
- *    @file
- *      Implementation of CHIP Device Controller, a common class
- *      that implements discovery, pairing and provisioning of CHIP
- *      devices.
- *
- */
-
-#ifndef __STDC_LIMIT_MACROS
-#define __STDC_LIMIT_MACROS
-#endif
-#ifndef __STDC_FORMAT_MACROS
-#define __STDC_FORMAT_MACROS
-#endif
-
-// module header, comes first
-#include <controller/CHIPDeviceController_deprecated.h>
-
-#if CONFIG_DEVICE_LAYER
-#include <platform/CHIPDeviceLayer.h>
-#endif
-
-#include <core/CHIPCore.h>
-#include <core/CHIPEncoding.h>
-#include <core/CHIPSafeCasts.h>
-#include <support/Base64.h>
-#include <support/CHIPMem.h>
-#include <support/CodeUtils.h>
-#include <support/ErrorStr.h>
-#include <support/TimeUtils.h>
-#include <support/logging/CHIPLogging.h>
-
-#include <errno.h>
-#include <inttypes.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <time.h>
-
-using namespace chip::Inet;
-using namespace chip::System;
-using namespace chip::Controller;
-
-namespace chip {
-namespace DeviceController {
-
-using namespace chip::Encoding;
-
-ChipDeviceController::ChipDeviceController()
-{
-    mState                  = kState_NotInitialized;
-    AppState                = nullptr;
-    mCurReqMsg              = nullptr;
-    mOnError                = nullptr;
-    mOnNewConnection        = nullptr;
-    mListenPort             = CHIP_PORT;
-    mLocalDeviceId          = kUndefinedNodeId;
-    mRemoteDeviceId         = kUndefinedNodeId;
-    mDevice                 = nullptr;
-    mPairingWithoutSecurity = false;
-    CHIP_ZERO_AT(mOnComplete);
-}
-
-ChipDeviceController::~ChipDeviceController() {}
-
-CHIP_ERROR ChipDeviceController::Init(NodeId localNodeId, DevicePairingDelegate * pairingDelegate,
-                                      PersistentStorageDelegate * storageDelegate)
-{
-    return mCommissioner.Init(localNodeId, storageDelegate, pairingDelegate);
-}
-
-CHIP_ERROR ChipDeviceController::Init(NodeId localNodeId, System::Layer * systemLayer, InetLayer * inetLayer,
-                                      DevicePairingDelegate * pairingDelegate, PersistentStorageDelegate * storageDelegate)
-{
-    return mCommissioner.Init(localNodeId, storageDelegate, pairingDelegate, systemLayer, inetLayer);
-}
-
-CHIP_ERROR ChipDeviceController::Shutdown()
-{
-    return mCommissioner.Shutdown();
-}
-
-CHIP_ERROR ChipDeviceController::ConnectDevice(NodeId remoteDeviceId, RendezvousParameters & params, void * appReqState,
-                                               NewConnectionHandler onConnected, MessageReceiveHandler onMessageReceived,
-                                               ErrorHandler onError)
-{
-    CHIP_ERROR err = mCommissioner.PairDevice(remoteDeviceId, params);
-    SuccessOrExit(err);
-
-    mState           = kState_Initialized;
-    mRemoteDeviceId  = remoteDeviceId;
-    mAppReqState     = appReqState;
-    mOnNewConnection = onConnected;
-
-    mOnComplete.Response = onMessageReceived;
-    mOnError             = onError;
-
-    // TODO: Should call mOnNewConnected when rendezvous completed
-    mOnNewConnection(this, nullptr, mAppReqState);
-
-exit:
-    return err;
-}
-
-CHIP_ERROR ChipDeviceController::ConnectDeviceWithoutSecurePairing(NodeId remoteDeviceId, const Transport::PeerAddress & deviceAddr,
-                                                                   void * appReqState, NewConnectionHandler onConnected,
-                                                                   MessageReceiveHandler onMessageReceived, ErrorHandler onError)
-{
-    CHIP_ERROR err = mCommissioner.PairTestDeviceWithoutSecurity(remoteDeviceId, deviceAddr, mSerializedTestDevice);
-    SuccessOrExit(err);
-
-    mPairingWithoutSecurity = true;
-
-    mState           = kState_Initialized;
-    mRemoteDeviceId  = remoteDeviceId;
-    mAppReqState     = appReqState;
-    mOnNewConnection = onConnected;
-
-    mOnComplete.Response = onMessageReceived;
-    mOnError             = onError;
-
-    if (mOnNewConnection)
-    {
-        mOnNewConnection(this, nullptr, mAppReqState);
-    }
-
-exit:
-    return err;
-}
-
-CHIP_ERROR ChipDeviceController::SetUdpListenPort(uint16_t listenPort)
-{
-    if (mState != kState_Initialized)
-        return CHIP_ERROR_INCORRECT_STATE;
-    mListenPort = listenPort;
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR ChipDeviceController::ServiceEvents()
-{
-    return mCommissioner.ServiceEvents();
-}
-
-CHIP_ERROR ChipDeviceController::ServiceEventSignal()
-{
-    return mCommissioner.ServiceEventSignal();
-}
-
-bool ChipDeviceController::IsConnected() const
-{
-    return mState == kState_Initialized;
-}
-
-bool ChipDeviceController::GetIpAddress(Inet::IPAddress & addr)
-{
-    if (!IsConnected())
-        return false;
-
-    if (mDevice == nullptr)
-        InitDevice();
-
-    uint16_t port;
-    return mDevice != nullptr && mDevice->GetAddress(addr, port);
-}
-
-CHIP_ERROR ChipDeviceController::DisconnectDevice()
-{
-    if (mDevice != nullptr)
-    {
-        mCommissioner.ReleaseDevice(mDevice);
-        mDevice = nullptr;
-    }
-
-    return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR ChipDeviceController::SendMessage(void * appReqState, PacketBufferHandle buffer, NodeId peerDevice)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-
-    VerifyOrExit(!buffer.IsNull(), err = CHIP_ERROR_INVALID_ARGUMENT);
-
-    mAppReqState = appReqState;
-
-    if (peerDevice != kUndefinedNodeId)
-    {
-        mRemoteDeviceId = peerDevice;
-    }
-    VerifyOrExit(mRemoteDeviceId != kUndefinedNodeId, err = CHIP_ERROR_INCORRECT_STATE);
-
-    if (mDevice == nullptr)
-    {
-        SuccessOrExit(InitDevice());
-    }
-
-    VerifyOrExit(mDevice != nullptr, err = CHIP_ERROR_INVALID_ARGUMENT);
-    mDevice->SetDelegate(this);
-
-    err = mDevice->SendMessage(std::move(buffer));
-
-exit:
-
-    return err;
-}
-
-CHIP_ERROR ChipDeviceController::SetDevicePairingDelegate(DevicePairingDelegate * pairingDelegate)
-{
-    mCommissioner.SetDevicePairingDelegate(pairingDelegate);
-    return CHIP_NO_ERROR;
-}
-
-void ChipDeviceController::OnMessage(System::PacketBufferHandle msgBuf)
-{
-    if (mOnComplete.Response != nullptr)
-    {
-        mOnComplete.Response(this, mAppReqState, std::move(msgBuf));
-    }
-}
-
-CHIP_ERROR ChipDeviceController::InitDevice()
-{
-    return mPairingWithoutSecurity ? mCommissioner.GetDevice(mRemoteDeviceId, mSerializedTestDevice, &mDevice)
-                                   : mCommissioner.GetDevice(mRemoteDeviceId, &mDevice);
-}
-
-} // namespace DeviceController
-} // namespace chip
diff --git a/src/controller/CHIPDeviceController_deprecated.h b/src/controller/CHIPDeviceController_deprecated.h
deleted file mode 100644 (file)
index 2542c49..0000000
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- *
- *    Copyright (c) 2020 Project CHIP Authors
- *    Copyright (c) 2013-2017 Nest Labs, Inc.
- *    All rights reserved.
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- */
-
-/**
- *    @file
- *      Declaration of CHIP Device Controller, a common class
- *      that implements connecting and messaging and will later
- *      be expanded to support discovery, pairing and
- *      provisioning of CHIP  devices.
- *
- */
-
-#pragma once
-
-#include <controller/CHIPDeviceController.h>
-#include <core/CHIPCore.h>
-#include <core/CHIPPersistentStorageDelegate.h>
-#include <core/CHIPTLV.h>
-#include <support/DLLUtil.h>
-#include <transport/RendezvousSession.h>
-#include <transport/RendezvousSessionDelegate.h>
-#include <transport/SecureSessionMgr.h>
-#include <transport/raw/UDP.h>
-
-namespace chip {
-namespace DeviceController {
-
-constexpr uint16_t kPacketCacheMaxSize = 16;
-
-class ChipDeviceController;
-
-typedef void (*NewConnectionHandler)(ChipDeviceController * deviceController, const Transport::PeerConnectionState * state,
-                                     void * appReqState);
-typedef void (*CompleteHandler)(ChipDeviceController * deviceController, void * appReqState);
-typedef void (*ErrorHandler)(ChipDeviceController * deviceController, void * appReqState, CHIP_ERROR err,
-                             const Inet::IPPacketInfo * pktInfo);
-typedef void (*MessageReceiveHandler)(ChipDeviceController * deviceController, void * appReqState,
-                                      System::PacketBufferHandle payload);
-
-class DLL_EXPORT ChipDeviceController : public Controller::DeviceStatusDelegate
-{
-    friend class ChipDeviceControllerCallback;
-
-public:
-    ChipDeviceController();
-    ~ChipDeviceController();
-
-    void * AppState;
-
-    /**
-     * Init function to be used when there exists a device layer that takes care of initializing
-     * System::Layer and InetLayer.
-     */
-    CHIP_ERROR Init(NodeId localDeviceId, Controller::DevicePairingDelegate * pairingDelegate = nullptr,
-                    PersistentStorageDelegate * storageDelegate = nullptr);
-    /**
-     * Init function to be used when already-initialized System::Layer and InetLayer are available.
-     */
-    CHIP_ERROR Init(NodeId localDeviceId, System::Layer * systemLayer, Inet::InetLayer * inetLayer,
-                    Controller::DevicePairingDelegate * pairingDelegate = nullptr,
-                    PersistentStorageDelegate * storageDelegate         = nullptr);
-    CHIP_ERROR Shutdown();
-
-    CHIP_ERROR SetUdpListenPort(uint16_t listenPort);
-
-    chip::Controller::DeviceController * GetDeviceController() { return &mCommissioner; }
-
-    // ----- Connection Management -----
-    /**
-     * @brief
-     *   Connect to a CHIP device with the provided Rendezvous connection parameters
-     *
-     * @param[in] remoteDeviceId        The remote device Id.
-     * @param[in] params                The Rendezvous connection parameters
-     * @param[in] appReqState           Application specific context to be passed back when a message is received or on error
-     * @param[in] onConnected           Callback for when the connection is established
-     * @param[in] onMessageReceived     Callback for when a message is received
-     * @param[in] onError               Callback for when an error occurs
-     *
-     * @return CHIP_ERROR               The connection status
-     */
-    [[deprecated("Available until controller apps move to DeviceController/DeviceCommissioner API")]] CHIP_ERROR
-    ConnectDevice(NodeId remoteDeviceId, RendezvousParameters & params, void * appReqState, NewConnectionHandler onConnected,
-                  MessageReceiveHandler onMessageReceived, ErrorHandler onError);
-
-    /**
-     * @brief
-     *   Connect to a CHIP device at a given address and an optional port. This is a test only API
-     *   that bypasses Rendezvous and Secure Pairing process.
-     *
-     * @param[in] remoteDeviceId        The remote device Id.
-     * @param[in] deviceAddr            The address of the requested Device
-     * @param[in] appReqState           Application specific context to be passed back when a message is received or on error
-     * @param[in] onConnected           Callback for when the connection is established
-     * @param[in] onMessageReceived     Callback for when a message is received
-     * @param[in] onError               Callback for when an error occurs
-     * @return CHIP_ERROR           The connection status
-     */
-    [[deprecated("Available until Rendezvous is implemented")]] CHIP_ERROR
-    ConnectDeviceWithoutSecurePairing(NodeId remoteDeviceId, const Transport::PeerAddress & deviceAddr, void * appReqState,
-                                      NewConnectionHandler onConnected, MessageReceiveHandler onMessageReceived,
-                                      ErrorHandler onError);
-
-    /**
-     * @brief
-     *   Disconnect from a connected device
-     *
-     * @return CHIP_ERROR   If the device was disconnected successfully
-     */
-    CHIP_ERROR DisconnectDevice();
-
-    /**
-     * @brief
-     *   Check if there's an active connection
-     *
-     * @return bool   If there is an active connection
-     */
-    bool IsConnected() const;
-
-    /**
-     * @brief
-     *   Get IP Address of the peer if the connection is active
-     *
-     * @return bool   If IP Address was returned
-     */
-    bool GetIpAddress(Inet::IPAddress & addr);
-
-    // ----- Messaging -----
-    /**
-     * @brief
-     *   Send a message to a connected CHIP device
-     *
-     * @param[in] appReqState   Application specific context to be passed back when a message is received or on error
-     * @param[in] buffer        The Data Buffer to trasmit to the device
-     * @param[in] peerDevice    Device ID of the peer device
-     * @return CHIP_ERROR   The return status
-     */
-    CHIP_ERROR SendMessage(void * appReqState, System::PacketBufferHandle buffer, NodeId peerDevice = kUndefinedNodeId);
-
-    // ----- IO -----
-    /**
-     * @brief
-     * Start the event loop task within the CHIP stack
-     * @return CHIP_ERROR   The return status
-     */
-    CHIP_ERROR ServiceEvents();
-
-    /**
-     * @brief
-     *   Allow the CHIP Stack to process any pending events
-     *   This can be called in an event handler loop to tigger callbacks within the CHIP stack
-     * @return CHIP_ERROR   The return status
-     */
-    CHIP_ERROR ServiceEventSignal();
-
-    // ----- Pairing -----
-    /**
-     * @brief
-     * Set device pairing delegate after init, pass nullptr remove device delegate.
-     * @return CHIP_ERROR   The return status
-     */
-    CHIP_ERROR SetDevicePairingDelegate(Controller::DevicePairingDelegate * pairingDelegate);
-
-    //////////// DeviceStatusDelegate Implementation ///////////////
-    void OnMessage(System::PacketBufferHandle msg) override;
-
-private:
-    CHIP_ERROR InitDevice();
-
-    enum
-    {
-        kState_NotInitialized = 0,
-        kState_Initialized    = 1
-    } mState;
-
-    Controller::DeviceCommissioner mCommissioner;
-    Controller::Device * mDevice;
-
-    void * mAppReqState;
-
-    union
-    {
-        CompleteHandler General;
-        MessageReceiveHandler Response;
-    } mOnComplete;
-
-    ErrorHandler mOnError;
-    NewConnectionHandler mOnNewConnection;
-    System::PacketBuffer * mCurReqMsg;
-
-    NodeId mLocalDeviceId;
-    NodeId mRemoteDeviceId;
-    uint16_t mListenPort;
-
-    Controller::SerializedDevice mSerializedTestDevice;
-    bool mPairingWithoutSecurity;
-
-    void ClearRequestState();
-    void ClearOpState();
-};
-
-} // namespace DeviceController
-} // namespace chip
index 6ee591f..52bf3b0 100644 (file)
@@ -1,5 +1,5 @@
 {
-  "writeTime": "Thu Mar 11 2021 17:28:29 GMT+0100 (Central European Standard Time)",
+  "writeTime": "Fri Mar 12 2021 15:15:13 GMT+0800 (China Standard Time)",
   "featureLevel": 11,
   "creator": "zap",
   "keyValuePairs": [
           "define": "GROUPS_CLUSTER",
           "side": "client",
           "enabled": 0,
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
-          ],
           "commands": [
             {
               "name": "AddGroup",
               "incoming": 1,
               "outgoing": 1
             }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "3",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
           ]
         },
         {
           "define": "SCENES_CLUSTER",
           "side": "client",
           "enabled": 0,
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "3",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ],
           "commands": [
             {
               "name": "AddScene",
               "incoming": 1,
               "outgoing": 1
             }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
           ]
         },
         {
           "define": "DOOR_LOCK_CLUSTER",
           "side": "client",
           "enabled": 0,
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "3",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ],
           "commands": [
             {
               "name": "LockDoor",
               "incoming": 1,
               "outgoing": 1
             }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
           ]
         },
         {
           "define": "IDENTIFY_CLUSTER",
           "side": "server",
           "enabled": 1,
+          "commands": [
+            {
+              "name": "IdentifyQueryResponse",
+              "code": 0,
+              "mfgCode": null,
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ],
-          "commands": [
-            {
-              "name": "IdentifyQueryResponse",
-              "code": 0,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            }
           ]
         },
         {
           ]
         },
         {
-          "name": "Door Lock",
-          "code": 257,
+          "name": "Network Commissioning",
+          "code": 49,
           "mfgCode": null,
-          "define": "DOOR_LOCK_CLUSTER",
+          "define": "NETWORK_COMMISSIONING_CLUSTER",
           "side": "client",
           "enabled": 0,
           "commands": [
             {
-              "name": "LockDoor",
+              "name": "ScanNetworks",
               "code": 0,
               "mfgCode": null,
               "source": "client",
               "outgoing": 1
             },
             {
-              "name": "UnlockDoor",
-              "code": 1,
+              "name": "AddWiFiNetwork",
+              "code": 2,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
-              "outgoing": 1
+              "outgoing": 0
             },
             {
-              "name": "UnlockWithTimeout",
-              "code": 3,
+              "name": "UpdateWiFiNetwork",
+              "code": 4,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
-              "outgoing": 1
+              "outgoing": 0
             },
             {
-              "name": "GetLogRecord",
-              "code": 4,
+              "name": "AddThreadNetwork",
+              "code": 6,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
-              "outgoing": 1
+              "outgoing": 0
             },
             {
-              "name": "SetPin",
-              "code": 5,
+              "name": "UpdateThreadNetwork",
+              "code": 8,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
-              "outgoing": 1
+              "outgoing": 0
             },
             {
-              "name": "GetPin",
-              "code": 6,
+              "name": "RemoveNetwork",
+              "code": 10,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
               "outgoing": 1
             },
             {
-              "name": "ClearPin",
-              "code": 7,
+              "name": "EnableNetwork",
+              "code": 12,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
               "outgoing": 1
             },
             {
-              "name": "ClearAllPins",
-              "code": 8,
+              "name": "DisableNetwork",
+              "code": 14,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
               "outgoing": 1
             },
             {
-              "name": "SetWeekdaySchedule",
-              "code": 11,
+              "name": "GetLastNetworkCommissioningResult",
+              "code": 16,
               "mfgCode": null,
               "source": "client",
               "incoming": 1,
               "outgoing": 1
-            },
+            }
+          ],
+          "attributes": [
             {
-              "name": "GetWeekdaySchedule",
-              "code": 12,
+              "name": "cluster revision",
+              "code": 65533,
               "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
-            },
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "0x0001",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ]
+        },
+        {
+          "name": "Network Commissioning",
+          "code": 49,
+          "mfgCode": null,
+          "define": "NETWORK_COMMISSIONING_CLUSTER",
+          "side": "server",
+          "enabled": 1,
+          "commands": [
             {
-              "name": "ClearWeekdaySchedule",
-              "code": 13,
+              "name": "ScanNetworksResponse",
+              "code": 1,
               "mfgCode": null,
-              "source": "client",
+              "source": "server",
               "incoming": 1,
               "outgoing": 1
             },
             {
-              "name": "SetYeardaySchedule",
-              "code": 14,
+              "name": "AddWiFiNetworkResponse",
+              "code": 3,
               "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
+              "source": "server",
+              "incoming": 0,
               "outgoing": 1
             },
             {
-              "name": "GetYeardaySchedule",
-              "code": 15,
+              "name": "UpdateWiFiNetworkResponse",
+              "code": 5,
               "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
+              "source": "server",
+              "incoming": 0,
               "outgoing": 1
             },
             {
-              "name": "ClearYeardaySchedule",
-              "code": 16,
+              "name": "AddThreadNetworkResponse",
+              "code": 7,
               "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
+              "source": "server",
+              "incoming": 0,
               "outgoing": 1
             },
             {
-              "name": "SetHolidaySchedule",
-              "code": 17,
+              "name": "UpdateThreadNetworkResponse",
+              "code": 9,
               "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
+              "source": "server",
+              "incoming": 0,
               "outgoing": 1
             },
             {
-              "name": "GetHolidaySchedule",
-              "code": 18,
+              "name": "RemoveNetworkResponse",
+              "code": 11,
               "mfgCode": null,
-              "source": "client",
+              "source": "server",
               "incoming": 1,
               "outgoing": 1
             },
             {
-              "name": "ClearHolidaySchedule",
-              "code": 19,
+              "name": "EnableNetworkResponse",
+              "code": 13,
               "mfgCode": null,
-              "source": "client",
+              "source": "server",
               "incoming": 1,
               "outgoing": 1
             },
             {
-              "name": "SetUserType",
-              "code": 20,
+              "name": "DisableNetworkResponse",
+              "code": 15,
               "mfgCode": null,
-              "source": "client",
+              "source": "server",
+              "incoming": 1,
+              "outgoing": 1
+            }
+          ],
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "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": "Door Lock",
+          "code": 257,
+          "mfgCode": null,
+          "define": "DOOR_LOCK_CLUSTER",
+          "side": "client",
+          "enabled": 0,
+          "commands": [
+            {
+              "name": "LockDoor",
+              "code": 0,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "UnlockDoor",
+              "code": 1,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "UnlockWithTimeout",
+              "code": 3,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "GetLogRecord",
+              "code": 4,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "SetPin",
+              "code": 5,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "GetPin",
+              "code": 6,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "ClearPin",
+              "code": 7,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "ClearAllPins",
+              "code": 8,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "SetWeekdaySchedule",
+              "code": 11,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "GetWeekdaySchedule",
+              "code": 12,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "ClearWeekdaySchedule",
+              "code": 13,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "SetYeardaySchedule",
+              "code": 14,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "GetYeardaySchedule",
+              "code": 15,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "ClearYeardaySchedule",
+              "code": 16,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "SetHolidaySchedule",
+              "code": 17,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "GetHolidaySchedule",
+              "code": 18,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "ClearHolidaySchedule",
+              "code": 19,
+              "mfgCode": null,
+              "source": "client",
+              "incoming": 1,
+              "outgoing": 1
+            },
+            {
+              "name": "SetUserType",
+              "code": 20,
+              "mfgCode": null,
+              "source": "client",
               "incoming": 1,
               "outgoing": 1
             },
           "define": "DOOR_LOCK_CLUSTER",
           "side": "server",
           "enabled": 1,
-          "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
-            }
-          ],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 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
+            }
           ]
         },
         {
           "define": "BARRIER_CONTROL_CLUSTER",
           "side": "server",
           "enabled": 1,
+          "commands": [],
           "attributes": [
             {
               "name": "cluster revision",
               "maxInterval": 65344,
               "reportableChange": 0
             }
-          ],
-          "commands": []
+          ]
         },
         {
           "name": "Color Control",
           "define": "COLOR_CONTROL_CLUSTER",
           "side": "client",
           "enabled": 0,
+          "attributes": [
+            {
+              "name": "cluster revision",
+              "code": 65533,
+              "mfgCode": null,
+              "side": "client",
+              "included": 1,
+              "storageOption": "RAM",
+              "singleton": 0,
+              "bounded": 0,
+              "defaultValue": "3",
+              "reportable": 0,
+              "minInterval": 0,
+              "maxInterval": 65344,
+              "reportableChange": 0
+            }
+          ],
           "commands": [
             {
               "name": "MoveToHue",
               "incoming": 1,
               "outgoing": 1
             }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "code": 65533,
-              "mfgCode": null,
-              "side": "client",
-              "included": 1,
-              "storageOption": "RAM",
-              "singleton": 0,
-              "bounded": 0,
-              "defaultValue": "3",
-              "reportable": 0,
-              "minInterval": 0,
-              "maxInterval": 65344,
-              "reportableChange": 0
-            }
           ]
         },
         {
           ]
         },
         {
-          "name": "Network Commissioning",
-          "code": 43690,
-          "mfgCode": null,
-          "define": "NETWORK_COMMISSIONING_CLUSTER",
-          "side": "client",
-          "enabled": 0,
-          "commands": [
-            {
-              "name": "ScanNetworks",
-              "code": 0,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "AddWiFiNetwork",
-              "code": 2,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "UpdateWiFiNetwork",
-              "code": 4,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "AddThreadNetwork",
-              "code": 6,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "UpdateThreadNetwork",
-              "code": 8,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "RemoveNetwork",
-              "code": 10,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "EnableNetwork",
-              "code": 12,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "DisableNetwork",
-              "code": 14,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "GetLastNetworkCommissioningResult",
-              "code": 16,
-              "mfgCode": null,
-              "source": "client",
-              "incoming": 1,
-              "outgoing": 1
-            }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "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": "Network Commissioning",
-          "code": 43690,
-          "mfgCode": null,
-          "define": "NETWORK_COMMISSIONING_CLUSTER",
-          "side": "server",
-          "enabled": 1,
-          "commands": [
-            {
-              "name": "ScanNetworksResponse",
-              "code": 1,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "AddWiFiNetworkResponse",
-              "code": 3,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "UpdateWiFiNetworkResponse",
-              "code": 5,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "AddThreadNetworkResponse",
-              "code": 7,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "UpdateThreadNetworkResponse",
-              "code": 9,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "RemoveNetworkResponse",
-              "code": 11,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "EnableNetworkResponse",
-              "code": 13,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            },
-            {
-              "name": "DisableNetworkResponse",
-              "code": 15,
-              "mfgCode": null,
-              "source": "server",
-              "incoming": 1,
-              "outgoing": 1
-            }
-          ],
-          "attributes": [
-            {
-              "name": "cluster revision",
-              "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,
index 0ea3b10..e9b2d26 100644 (file)
@@ -284,19 +284,19 @@ void AndroidDeviceControllerWrapper::OnMessage(chip::System::PacketBufferHandle
 
 void AndroidDeviceControllerWrapper::OnStatusChange(void) {}
 
-void AndroidDeviceControllerWrapper::SetDelegate(PersistentStorageResultDelegate * delegate)
+void AndroidDeviceControllerWrapper::SetStorageDelegate(PersistentStorageResultDelegate * delegate)
 {
     mStorageResultDelegate = delegate;
 }
 
-void AndroidDeviceControllerWrapper::GetKeyValue(const char * key)
+void AndroidDeviceControllerWrapper::AsyncGetKeyValue(const char * key)
 {
-    jstring keyString   = NULL;
-    jstring valueString = NULL;
-    const char * valueChars   = nullptr;
-    CHIP_ERROR err      = CHIP_NO_ERROR;
-    jclass storageCls   = GetPersistentStorageClass();
-    jmethodID method    = GetJavaEnv()->GetStaticMethodID(storageCls, "getKeyValue", "(Ljava/lang/String;)Ljava/lang/String;");
+    jstring keyString       = NULL;
+    jstring valueString     = NULL;
+    const char * valueChars = nullptr;
+    CHIP_ERROR err          = CHIP_NO_ERROR;
+    jclass storageCls       = GetPersistentStorageClass();
+    jmethodID method        = GetJavaEnv()->GetStaticMethodID(storageCls, "getKeyValue", "(Ljava/lang/String;)Ljava/lang/String;");
 
     GetJavaEnv()->ExceptionClear();
 
@@ -308,26 +308,27 @@ void AndroidDeviceControllerWrapper::GetKeyValue(const char * key)
     if (mStorageResultDelegate)
     {
         valueChars = GetJavaEnv()->GetStringUTFChars(valueString, 0);
-        mStorageResultDelegate->OnValue(key, valueChars);
+        mStorageResultDelegate->OnPersistentStorageValue(key, valueChars);
     }
 
 exit:
     GetJavaEnv()->ExceptionClear();
-    if (valueChars != nullptr) {
+    if (valueChars != nullptr)
+    {
         GetJavaEnv()->ReleaseStringUTFChars(valueString, valueChars);
     }
     GetJavaEnv()->DeleteLocalRef(keyString);
     GetJavaEnv()->DeleteLocalRef(valueString);
 }
 
-CHIP_ERROR AndroidDeviceControllerWrapper::GetKeyValue(const char * key, char * value, uint16_t & size)
+CHIP_ERROR AndroidDeviceControllerWrapper::SyncGetKeyValue(const char * key, char * value, uint16_t & size)
 {
-    jstring keyString   = NULL;
-    jstring valueString = NULL;
-    const char * valueChars   = nullptr;
-    CHIP_ERROR err      = CHIP_NO_ERROR;
-    jclass storageCls   = GetPersistentStorageClass();
-    jmethodID method    = GetJavaEnv()->GetStaticMethodID(storageCls, "getKeyValue", "(Ljava/lang/String;)Ljava/lang/String;");
+    jstring keyString       = NULL;
+    jstring valueString     = NULL;
+    const char * valueChars = nullptr;
+    CHIP_ERROR err          = CHIP_NO_ERROR;
+    jclass storageCls       = GetPersistentStorageClass();
+    jmethodID method        = GetJavaEnv()->GetStaticMethodID(storageCls, "getKeyValue", "(Ljava/lang/String;)Ljava/lang/String;");
 
     GetJavaEnv()->ExceptionClear();
 
@@ -341,7 +342,7 @@ CHIP_ERROR AndroidDeviceControllerWrapper::GetKeyValue(const char * key, char *
         if (value != nullptr)
         {
             valueChars = GetJavaEnv()->GetStringUTFChars(valueString, 0);
-            size = strlcpy(value, GetJavaEnv()->GetStringUTFChars(valueString, 0), size);
+            size       = strlcpy(value, GetJavaEnv()->GetStringUTFChars(valueString, 0), size);
         }
         else
         {
@@ -357,7 +358,8 @@ CHIP_ERROR AndroidDeviceControllerWrapper::GetKeyValue(const char * key, char *
 
 exit:
     GetJavaEnv()->ExceptionClear();
-    if (valueChars != nullptr) {
+    if (valueChars != nullptr)
+    {
         GetJavaEnv()->ReleaseStringUTFChars(valueString, valueChars);
     }
     GetJavaEnv()->DeleteLocalRef(keyString);
@@ -365,7 +367,7 @@ exit:
     return err;
 }
 
-void AndroidDeviceControllerWrapper::SetKeyValue(const char * key, const char * value)
+void AndroidDeviceControllerWrapper::AsyncSetKeyValue(const char * key, const char * value)
 {
     jclass storageCls = GetPersistentStorageClass();
     jmethodID method  = GetJavaEnv()->GetStaticMethodID(storageCls, "setKeyValue", "(Ljava/lang/String;Ljava/lang/String;)V");
@@ -385,7 +387,7 @@ void AndroidDeviceControllerWrapper::SetKeyValue(const char * key, const char *
 
     if (mStorageResultDelegate)
     {
-        mStorageResultDelegate->OnStatus(key, PersistentStorageResultDelegate::Operation::kSET, CHIP_NO_ERROR);
+        mStorageResultDelegate->OnPersistentStorageStatus(key, PersistentStorageResultDelegate::Operation::kSET, CHIP_NO_ERROR);
     }
 
 exit:
@@ -394,7 +396,7 @@ exit:
     GetJavaEnv()->DeleteLocalRef(valueString);
 }
 
-void AndroidDeviceControllerWrapper::DeleteKeyValue(const char * key)
+void AndroidDeviceControllerWrapper::AsyncDeleteKeyValue(const char * key)
 {
     jclass storageCls = GetPersistentStorageClass();
     jmethodID method  = GetJavaEnv()->GetStaticMethodID(storageCls, "deleteKeyValue", "(Ljava/lang/String;)V");
@@ -411,7 +413,7 @@ void AndroidDeviceControllerWrapper::DeleteKeyValue(const char * key)
 
     if (mStorageResultDelegate)
     {
-        mStorageResultDelegate->OnStatus(key, PersistentStorageResultDelegate::Operation::kDELETE, CHIP_NO_ERROR);
+        mStorageResultDelegate->OnPersistentStorageStatus(key, PersistentStorageResultDelegate::Operation::kDELETE, CHIP_NO_ERROR);
     }
 
 exit:
index 5d5b2a1..7f8f7ff 100644 (file)
@@ -56,11 +56,11 @@ public:
     void OnStatusChange(void) override;
 
     // PersistentStorageDelegate implementation
-    void SetDelegate(chip::PersistentStorageResultDelegate * delegate) override;
-    void GetKeyValue(const char * key) override;
-    CHIP_ERROR GetKeyValue(const char * key, char * value, uint16_t & size) override;
-    void SetKeyValue(const char * key, const char * value) override;
-    void DeleteKeyValue(const char * key) override;
+    void SetStorageDelegate(chip::PersistentStorageResultDelegate * delegate) override;
+    void AsyncGetKeyValue(const char * key) override;
+    CHIP_ERROR SyncGetKeyValue(const char * key, char * value, uint16_t & size) override;
+    void AsyncSetKeyValue(const char * key, const char * value) override;
+    void AsyncDeleteKeyValue(const char * key) override;
 
     jlong ToJNIHandle()
     {
index 3f48333..f621c16 100644 (file)
@@ -30,11 +30,6 @@ config("controller_wno_deprecate") {
   cflags = [ "-Wno-deprecated-declarations" ]
 }
 
-config("includes") {
-  include_dirs =
-      [ "${chip_root}/src/controller/CHIPDeviceController_deprecated.h" ]
-}
-
 shared_library("ChipDeviceCtrl") {
   output_name = "_ChipDeviceCtrl"
   output_dir = "${target_out_dir}/chip"
index d71d199..9873263 100644 (file)
 namespace chip {
 namespace Controller {
 
-void PythonPersistentStorageDelegate::SetDelegate(PersistentStorageResultDelegate * delegate)
+void PythonPersistentStorageDelegate::SetStorageDelegate(PersistentStorageResultDelegate * delegate)
 {
     mDelegate = delegate;
 }
 
-void PythonPersistentStorageDelegate::GetKeyValue(const char * key)
+void PythonPersistentStorageDelegate::AsyncGetKeyValue(const char * key)
 {
     auto val = mStorage.find(key);
     if (val == mStorage.end())
     {
-        mDelegate->OnStatus(key, PersistentStorageResultDelegate::Operation::kGET, CHIP_ERROR_KEY_NOT_FOUND);
+        mDelegate->OnPersistentStorageStatus(key, PersistentStorageResultDelegate::Operation::kGET, CHIP_ERROR_KEY_NOT_FOUND);
         return;
     }
 
-    mDelegate->OnValue(key, val->second.c_str());
+    mDelegate->OnPersistentStorageValue(key, val->second.c_str());
 }
 
-CHIP_ERROR PythonPersistentStorageDelegate::GetKeyValue(const char * key, char * value, uint16_t & size)
+CHIP_ERROR PythonPersistentStorageDelegate::SyncGetKeyValue(const char * key, char * value, uint16_t & size)
 {
     auto val = mStorage.find(key);
     if (val == mStorage.end())
@@ -79,17 +79,17 @@ CHIP_ERROR PythonPersistentStorageDelegate::GetKeyValue(const char * key, char *
     return CHIP_NO_ERROR;
 }
 
-void PythonPersistentStorageDelegate::SetKeyValue(const char * key, const char * value)
+void PythonPersistentStorageDelegate::AsyncSetKeyValue(const char * key, const char * value)
 {
     mStorage[key] = value;
-    ChipLogDetail(Controller, "SetKeyValue: %s=%s", key, value);
-    mDelegate->OnStatus(key, PersistentStorageResultDelegate::Operation::kSET, CHIP_NO_ERROR);
+    ChipLogDetail(Controller, "AsyncSetKeyValue: %s=%s", key, value);
+    mDelegate->OnPersistentStorageStatus(key, PersistentStorageResultDelegate::Operation::kSET, CHIP_NO_ERROR);
 }
 
-void PythonPersistentStorageDelegate::DeleteKeyValue(const char * key)
+void PythonPersistentStorageDelegate::AsyncDeleteKeyValue(const char * key)
 {
     mStorage.erase(key);
-    mDelegate->OnStatus(key, PersistentStorageResultDelegate::Operation::kDELETE, CHIP_NO_ERROR);
+    mDelegate->OnPersistentStorageStatus(key, PersistentStorageResultDelegate::Operation::kDELETE, CHIP_NO_ERROR);
 }
 
 } // namespace Controller
index ee4a5a0..9a1da8a 100644 (file)
@@ -36,11 +36,11 @@ class PythonPersistentStorageDelegate : public PersistentStorageDelegate
 {
 public:
     PythonPersistentStorageDelegate() {}
-    void SetDelegate(PersistentStorageResultDelegate * delegate) override;
-    void GetKeyValue(const char * key) override;
-    CHIP_ERROR GetKeyValue(const char * key, char * value, uint16_t & size) override;
-    void SetKeyValue(const char * key, const char * value) override;
-    void DeleteKeyValue(const char * key) override;
+    void SetStorageDelegate(PersistentStorageResultDelegate * delegate) override;
+    void AsyncGetKeyValue(const char * key) override;
+    CHIP_ERROR SyncGetKeyValue(const char * key, char * value, uint16_t & size) override;
+    void AsyncSetKeyValue(const char * key, const char * value) override;
+    void AsyncDeleteKeyValue(const char * key) override;
 
 private:
     PersistentStorageResultDelegate * mDelegate;
index 2838607..a4b6542 100644 (file)
@@ -163,21 +163,25 @@ chip-device-ctrl > set-pairing-wifi-credential TestAP TestPassword
 chip-device-ctrl > connect -ble 1383 12345678
 ```
 
-## Thread Secure Session provisioning
+## Thread provisioning
 
-1. Run CHIP Device Controller
+1. Configure Thread border router. For example, follow
+   [Configuring Thread network on a Linux machine](../../../docs/guides/linux_thread_connectivity.md)
+   instruction to configure OpenThread Border Router on a Linux workstation.
+
+2. Run CHIP Device Controller
 
 ```
 sudo chip-device-ctrl
 ```
 
-2. Set Thread credentials
+3. Set Thread credentials
 
 ```
 set-pairing-thread-credential <channel> <pan id[HEX]> <master_key>
 ```
 
-3. BLE Connect to the device
+4. BLE Connect to the device
 
 ```
 connect -ble <discriminator> <setup pin code> [<nodeid>]
index e03594b..071ab7e 100644 (file)
@@ -28,51 +28,51 @@ namespace {
 class ServerStorageDelegate : public chip::PersistentStorageDelegate
 {
 public:
-    void SetDelegate(chip::PersistentStorageResultDelegate * delegate) override { mAsyncDelegate = delegate; }
+    void SetStorageDelegate(chip::PersistentStorageResultDelegate * delegate) override { mAsyncDelegate = delegate; }
 
-    void GetKeyValue(const char * key) override
+    void AsyncGetKeyValue(const char * key) override
     {
         // TODO: Async Get/Set are implemented synchronously here.
         // We need to figure out a standard way to implement this - this implementation
         // was based on an example that just returned and that seemed even less useful.
         uint8_t buffer[kMaxKeyValueSize];
         uint16_t bufferSize = sizeof(buffer) - 1;
-        CHIP_ERROR err      = GetKeyValue(key, buffer, bufferSize);
+        CHIP_ERROR err      = SyncGetKeyValue(key, buffer, bufferSize);
 
         if (err == CHIP_NO_ERROR)
         {
             buffer[bufferSize] = 0;
-            mAsyncDelegate->OnValue(key, reinterpret_cast<const char *>(buffer));
+            mAsyncDelegate->OnPersistentStorageValue(key, reinterpret_cast<const char *>(buffer));
         }
         else
         {
-            mAsyncDelegate->OnStatus(key, chip::PersistentStorageResultDelegate::Operation::kGET, err);
+            mAsyncDelegate->OnPersistentStorageStatus(key, chip::PersistentStorageResultDelegate::Operation::kGET, err);
         }
     }
 
-    void SetKeyValue(const char * key, const char * value) override
+    void AsyncSetKeyValue(const char * key, const char * value) override
     {
 
-        CHIP_ERROR err = SetKeyValue(key, value, strlen(value));
+        CHIP_ERROR err = SyncSetKeyValue(key, value, strlen(value));
 
         if (err != CHIP_NO_ERROR)
         {
-            mAsyncDelegate->OnStatus(key, chip::PersistentStorageResultDelegate::Operation::kSET, err);
+            mAsyncDelegate->OnPersistentStorageStatus(key, chip::PersistentStorageResultDelegate::Operation::kSET, err);
         }
     }
 
     CHIP_ERROR
-    GetKeyValue(const char * key, void * buffer, uint16_t & size) override
+    SyncGetKeyValue(const char * key, void * buffer, uint16_t & size) override
     {
         return chip::DeviceLayer::PersistedStorage::KeyValueStoreMgr().Get(key, buffer, size);
     }
 
-    CHIP_ERROR SetKeyValue(const char * key, const void * value, uint16_t size) override
+    CHIP_ERROR SyncSetKeyValue(const char * key, const void * value, uint16_t size) override
     {
         return chip::DeviceLayer::PersistedStorage::KeyValueStoreMgr().Put(key, value, size);
     }
 
-    void DeleteKeyValue(const char * key) override { chip::DeviceLayer::PersistedStorage::KeyValueStoreMgr().Delete(key); }
+    void AsyncDeleteKeyValue(const char * key) override { chip::DeviceLayer::PersistedStorage::KeyValueStoreMgr().Delete(key); }
 
 private:
     static constexpr size_t kMaxKeyValueSize = 1024;
index 40aad36..67b1a47 100644 (file)
@@ -28,6 +28,7 @@
                1EC4CE6025CC26E900D7304F /* CHIPClientCallbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1EC4CE5C25CC26E900D7304F /* CHIPClientCallbacks.cpp */; };
                1EC4CE6225CC271B00D7304F /* af-event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1EC4CE6125CC271B00D7304F /* af-event.cpp */; };
                1EC4CE6425CC276600D7304F /* CHIPClustersObjc.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EC4CE6325CC276600D7304F /* CHIPClustersObjc.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               1ED0B8CC260125E100D19DB5 /* media-playback-client.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1ED0B8CB260125E100D19DB5 /* media-playback-client.cpp */; };
                2C222AD0255C620600E446B9 /* CHIPDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C222ACE255C620600E446B9 /* CHIPDevice.h */; settings = {ATTRIBUTES = (Public, ); }; };
                2C222AD1255C620600E446B9 /* CHIPDevice.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2C222ACF255C620600E446B9 /* CHIPDevice.mm */; };
                2C222ADF255C811800E446B9 /* CHIPDevice_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C222ADE255C811800E446B9 /* CHIPDevice_Internal.h */; };
@@ -87,6 +88,7 @@
                1EC4CE5C25CC26E900D7304F /* CHIPClientCallbacks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CHIPClientCallbacks.cpp; path = gen/CHIPClientCallbacks.cpp; sourceTree = "<group>"; };
                1EC4CE6125CC271B00D7304F /* af-event.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "af-event.cpp"; path = "../../../app/util/af-event.cpp"; sourceTree = "<group>"; };
                1EC4CE6325CC276600D7304F /* CHIPClustersObjc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CHIPClustersObjc.h; path = gen/CHIPClustersObjc.h; sourceTree = "<group>"; };
+               1ED0B8CB260125E100D19DB5 /* media-playback-client.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "media-playback-client.cpp"; path = "../../../app/clusters/media-playback-client/media-playback-client.cpp"; sourceTree = "<group>"; };
                2C222ACE255C620600E446B9 /* CHIPDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CHIPDevice.h; sourceTree = "<group>"; };
                2C222ACF255C620600E446B9 /* CHIPDevice.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CHIPDevice.mm; sourceTree = "<group>"; };
                2C222ADE255C811800E446B9 /* CHIPDevice_Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CHIPDevice_Internal.h; sourceTree = "<group>"; };
                1EC4CE3525CC259700D7304F /* CHIPApp */ = {
                        isa = PBXGroup;
                        children = (
+                               1ED0B8CB260125E100D19DB5 /* media-playback-client.cpp */,
                                1EC4CE6125CC271B00D7304F /* af-event.cpp */,
                                1EC4CE4925CC267700D7304F /* af-main-common.cpp */,
                                1EC4CE4125CC267600D7304F /* attribute-size.cpp */,
                                1EC4CE6225CC271B00D7304F /* af-event.cpp in Sources */,
                                1EC4CE4E25CC267700D7304F /* attribute-size.cpp in Sources */,
                                1EC4CE4D25CC267700D7304F /* process-global-message.cpp in Sources */,
+                               1ED0B8CC260125E100D19DB5 /* media-playback-client.cpp in Sources */,
                                1EC4CE5125CC267700D7304F /* message.cpp in Sources */,
                                1EC4CE5D25CC26E900D7304F /* CHIPClustersObjc.mm in Sources */,
                                B2E0D7B3245B0B5C003C5B48 /* CHIPError.mm in Sources */,
index 3513217..469d7b4 100644 (file)
@@ -167,11 +167,11 @@ static NSString * const kInfoStackShutdown = @"Shutting down the CHIP Stack";
     uint16_t idStringLen = 32;
     char deviceIdString[idStringLen];
     if (CHIP_NO_ERROR
-        != _persistentStorageDelegateBridge->GetKeyValue(CHIP_COMMISSIONER_DEVICE_ID_KEY, deviceIdString, idStringLen)) {
+        != _persistentStorageDelegateBridge->SyncGetKeyValue(CHIP_COMMISSIONER_DEVICE_ID_KEY, deviceIdString, idStringLen)) {
         _localDeviceId = arc4random();
         _localDeviceId = _localDeviceId << 32 | arc4random();
         CHIP_LOG_ERROR("Assigned %llx node ID to the controller", _localDeviceId);
-        _persistentStorageDelegateBridge->SetKeyValue(
+        _persistentStorageDelegateBridge->AsyncSetKeyValue(
             CHIP_COMMISSIONER_DEVICE_ID_KEY, [[NSString stringWithFormat:@"%llx", _localDeviceId] UTF8String]);
     } else {
         NSScanner * scanner = [NSScanner scannerWithString:[NSString stringWithUTF8String:deviceIdString]];
index 5894144..144ff0a 100644 (file)
@@ -30,15 +30,15 @@ public:
 
     void setFrameworkDelegate(id<CHIPPersistentStorageDelegate> delegate, dispatch_queue_t queue);
 
-    void SetDelegate(chip::PersistentStorageResultDelegate * delegate) override;
+    void SetStorageDelegate(chip::PersistentStorageResultDelegate * delegate) override;
 
-    void GetKeyValue(const char * key) override;
+    void AsyncGetKeyValue(const char * key) override;
 
-    CHIP_ERROR GetKeyValue(const char * key, char * value, uint16_t & size) override;
+    CHIP_ERROR SyncGetKeyValue(const char * key, char * value, uint16_t & size) override;
 
-    void SetKeyValue(const char * key, const char * value) override;
+    void AsyncSetKeyValue(const char * key, const char * value) override;
 
-    void DeleteKeyValue(const char * key) override;
+    void AsyncDeleteKeyValue(const char * key) override;
 
 private:
     id<CHIPPersistentStorageDelegate> mDelegate;
index dcbe4a3..aa23592 100644 (file)
@@ -39,7 +39,7 @@ void CHIPPersistentStorageDelegateBridge::setFrameworkDelegate(id<CHIPPersistent
     });
 }
 
-void CHIPPersistentStorageDelegateBridge::SetDelegate(chip::PersistentStorageResultDelegate * delegate)
+void CHIPPersistentStorageDelegateBridge::SetStorageDelegate(chip::PersistentStorageResultDelegate * delegate)
 {
     dispatch_async(mWorkQueue, ^{
         if (delegate) {
@@ -49,7 +49,7 @@ void CHIPPersistentStorageDelegateBridge::SetDelegate(chip::PersistentStorageRes
                 chip::PersistentStorageResultDelegate * callback = mCallback;
                 if (callback) {
                     dispatch_async(mWorkQueue, ^{
-                        callback->OnValue([key UTF8String], [value UTF8String]);
+                        callback->OnPersistentStorageValue([key UTF8String], [value UTF8String]);
                     });
                 }
             };
@@ -58,8 +58,8 @@ void CHIPPersistentStorageDelegateBridge::SetDelegate(chip::PersistentStorageRes
                 chip::PersistentStorageResultDelegate * callback = mCallback;
                 if (callback) {
                     dispatch_async(mWorkQueue, ^{
-                        callback->OnStatus([key UTF8String], chip::PersistentStorageResultDelegate::Operation::kSET,
-                            [CHIPError errorToCHIPErrorCode:status]);
+                        callback->OnPersistentStorageStatus([key UTF8String],
+                            chip::PersistentStorageResultDelegate::Operation::kSET, [CHIPError errorToCHIPErrorCode:status]);
                     });
                 }
             };
@@ -68,8 +68,8 @@ void CHIPPersistentStorageDelegateBridge::SetDelegate(chip::PersistentStorageRes
                 chip::PersistentStorageResultDelegate * callback = mCallback;
                 if (callback) {
                     dispatch_async(mWorkQueue, ^{
-                        callback->OnStatus([key UTF8String], chip::PersistentStorageResultDelegate::Operation::kDELETE,
-                            [CHIPError errorToCHIPErrorCode:status]);
+                        callback->OnPersistentStorageStatus([key UTF8String],
+                            chip::PersistentStorageResultDelegate::Operation::kDELETE, [CHIPError errorToCHIPErrorCode:status]);
                     });
                 }
             };
@@ -82,7 +82,7 @@ void CHIPPersistentStorageDelegateBridge::SetDelegate(chip::PersistentStorageRes
     });
 }
 
-void CHIPPersistentStorageDelegateBridge::GetKeyValue(const char * key)
+void CHIPPersistentStorageDelegateBridge::AsyncGetKeyValue(const char * key)
 {
     NSString * keyString = [NSString stringWithUTF8String:key];
     dispatch_async(mWorkQueue, ^{
@@ -103,7 +103,7 @@ void CHIPPersistentStorageDelegateBridge::GetKeyValue(const char * key)
     });
 }
 
-CHIP_ERROR CHIPPersistentStorageDelegateBridge::GetKeyValue(const char * key, char * value, uint16_t & size)
+CHIP_ERROR CHIPPersistentStorageDelegateBridge::SyncGetKeyValue(const char * key, char * value, uint16_t & size)
 {
     __block CHIP_ERROR error = CHIP_NO_ERROR;
     NSString * keyString = [NSString stringWithUTF8String:key];
@@ -138,7 +138,7 @@ CHIP_ERROR CHIPPersistentStorageDelegateBridge::GetKeyValue(const char * key, ch
     return error;
 }
 
-void CHIPPersistentStorageDelegateBridge::SetKeyValue(const char * key, const char * value)
+void CHIPPersistentStorageDelegateBridge::AsyncSetKeyValue(const char * key, const char * value)
 {
     NSString * keyString = [NSString stringWithUTF8String:key];
     NSString * valueString = [NSString stringWithUTF8String:value];
@@ -159,7 +159,7 @@ void CHIPPersistentStorageDelegateBridge::SetKeyValue(const char * key, const ch
     });
 }
 
-void CHIPPersistentStorageDelegateBridge::DeleteKeyValue(const char * key)
+void CHIPPersistentStorageDelegateBridge::AsyncDeleteKeyValue(const char * key)
 {
     NSString * keyString = [NSString stringWithUTF8String:key];
     dispatch_async(mWorkQueue, ^{
index cd60722..f256509 100644 (file)
@@ -21,7 +21,7 @@
 
 #import "CHIPDevice.h"
 #import "CHIPDevice_Internal.h"
-#import "ChipError.h"
+#import "CHIPError.h"
 #import "gen/CHIPClientCallbacks.h"
 #import "gen/CHIPClustersObjc.h"
 
@@ -292,6 +292,38 @@ private:
     bool mKeepAlive;
 };
 
+class CHIPInt64uAttributeCallbackBridge : public Callback::Callback<Int64uAttributeCallback> {
+public:
+    CHIPInt64uAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
+        : Callback::Callback<Int64uAttributeCallback>(CallbackFn, this)
+        , mHandler(handler)
+        , mQueue(queue)
+        , mKeepAlive(keepAlive)
+    {
+    }
+
+    ~CHIPInt64uAttributeCallbackBridge() {};
+
+    static void CallbackFn(void * context, uint64_t value)
+    {
+        CHIPInt64uAttributeCallbackBridge * callback = reinterpret_cast<CHIPInt64uAttributeCallbackBridge *>(context);
+        if (callback && callback->mQueue) {
+            dispatch_async(callback->mQueue, ^{
+                callback->mHandler(nil, @ { @"value" : [NSNumber numberWithUnsignedLongLong:value] });
+                if (!callback->mKeepAlive) {
+                    callback->Cancel();
+                    delete callback;
+                }
+            });
+        }
+    };
+
+private:
+    ResponseHandler mHandler;
+    dispatch_queue_t mQueue;
+    bool mKeepAlive;
+};
+
 class CHIPInt16sAttributeCallbackBridge : public Callback::Callback<Int16sAttributeCallback> {
 public:
     CHIPInt16sAttributeCallbackBridge(ResponseHandler handler, dispatch_queue_t queue, bool keepAlive = false)
index 8c8757f..72a0198 100644 (file)
 #define ZCL_FABRIC_ID_ATTRIBUTE_ID (0x0000)
 #define ZCL_BREADCRUMB_ATTRIBUTE_ID (0x0001)
 
+// Attribute ids for cluster: Network Commissioning
+
+// Client attributes
+
+// Server attributes
+
 // Attribute ids for cluster: Shade Configuration
 
 // Client attributes
 
 // Server attributes
 
-// Attribute ids for cluster: Network Commissioning
-
-// Client attributes
-
-// Server attributes
-
 // Attribute ids for cluster: Binding
 
 // Client attributes
index f72c96f..79d1e15 100644 (file)
                                                                                                                                    \
                                   ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
 
+/** @brief Command description for ScanNetworks
+ *
+ * Command: ScanNetworks
+ * @param ssid OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterScanNetworks(ssid, breadcrumb, timeoutMs)                                                                  \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_SCAN_NETWORKS_COMMAND_ID, "uuu", ssid, breadcrumb, timeoutMs);
+
+/** @brief Command description for ScanNetworksResponse
+ *
+ * Command: ScanNetworksResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ * @param wifiScanResults WiFiInterfaceScanResult []
+ * @param wifiScanResultsLen int
+ * @param threadScanResults ThreadInterfaceScanResult []
+ * @param threadScanResultsLen int
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterScanNetworksResponse(errorCode, debugText, wifiScanResults, wifiScanResultsLen, threadScanResults,         \
+                                             threadScanResultsLen)                                                                 \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID, "uubb", errorCode, debugText, wifiScanResults,            \
+                                  wifiScanResultsLen, threadScanResults, threadScanResultsLen);
+
+/** @brief Command description for AddWiFiNetwork
+ *
+ * Command: AddWiFiNetwork
+ * @param ssid OCTET_STRING
+ * @param credentials OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                   \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
+
+/** @brief Command description for AddWiFiNetworkResponse
+ *
+ * Command: AddWiFiNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddWiFiNetworkResponse(errorCode, debugText)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for UpdateWiFiNetwork
+ *
+ * Command: UpdateWiFiNetwork
+ * @param ssid OCTET_STRING
+ * @param credentials OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
+
+/** @brief Command description for UpdateWiFiNetworkResponse
+ *
+ * Command: UpdateWiFiNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateWiFiNetworkResponse(errorCode, debugText)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for AddThreadNetwork
+ *
+ * Command: AddThreadNetwork
+ * @param operationalDataset OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
+
+/** @brief Command description for AddThreadNetworkResponse
+ *
+ * Command: AddThreadNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterAddThreadNetworkResponse(errorCode, debugText)                                                             \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for UpdateThreadNetwork
+ *
+ * Command: UpdateThreadNetwork
+ * @param operationalDataset OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                             \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
+
+/** @brief Command description for UpdateThreadNetworkResponse
+ *
+ * Command: UpdateThreadNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterUpdateThreadNetworkResponse(errorCode, debugText)                                                          \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for RemoveNetwork
+ *
+ * Command: RemoveNetwork
+ * @param NetworkID OCTET_STRING
+ * @param Breadcrumb INT64U
+ * @param TimeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterRemoveNetwork(NetworkID, Breadcrumb, TimeoutMs)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_REMOVE_NETWORK_COMMAND_ID, "uuu", NetworkID, Breadcrumb, TimeoutMs);
+
+/** @brief Command description for RemoveNetworkResponse
+ *
+ * Command: RemoveNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterRemoveNetworkResponse(errorCode, debugText)                                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for EnableNetwork
+ *
+ * Command: EnableNetwork
+ * @param networkID OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterEnableNetwork(networkID, breadcrumb, timeoutMs)                                                            \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ENABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
+
+/** @brief Command description for EnableNetworkResponse
+ *
+ * Command: EnableNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterEnableNetworkResponse(errorCode, debugText)                                                                \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for DisableNetwork
+ *
+ * Command: DisableNetwork
+ * @param networkID OCTET_STRING
+ * @param breadcrumb INT64U
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterDisableNetwork(networkID, breadcrumb, timeoutMs)                                                           \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_DISABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
+
+/** @brief Command description for DisableNetworkResponse
+ *
+ * Command: DisableNetworkResponse
+ * @param errorCode INT8U
+ * @param debugText CHAR_STRING
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterDisableNetworkResponse(errorCode, debugText)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
+
+/** @brief Command description for GetLastNetworkCommissioningResult
+ *
+ * Command: GetLastNetworkCommissioningResult
+ * @param timeoutMs INT32U
+ */
+#define emberAfFillCommandNetwork                                                                                                  \
+    CommissioningClusterGetLastNetworkCommissioningResult(timeoutMs)                                                               \
+        emberAfFillExternalBuffer(mask,                                                                                            \
+                                                                                                                                   \
+                                  ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID, "u", timeoutMs);
+
 /** @brief Command description for LockDoor
  *
  * Command: LockDoor
                                   ZCL_GET_ENDPOINT_LIST_REQUEST_COMMAND_ID, "uuuub", startIndex, total, startIndex, count,         \
                                   endpointInformationRecordList, endpointInformationRecordListLen);
 
-/** @brief Command description for ScanNetworks
- *
- * Command: ScanNetworks
- * @param ssid OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterScanNetworks(ssid, breadcrumb, timeoutMs)                                                                  \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_SCAN_NETWORKS_COMMAND_ID, "uuu", ssid, breadcrumb, timeoutMs);
-
-/** @brief Command description for ScanNetworksResponse
- *
- * Command: ScanNetworksResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- * @param wifiScanResults WiFiInterfaceScanResult []
- * @param wifiScanResultsLen int
- * @param threadScanResults ThreadInterfaceScanResult []
- * @param threadScanResultsLen int
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterScanNetworksResponse(errorCode, debugText, wifiScanResults, wifiScanResultsLen, threadScanResults,         \
-                                             threadScanResultsLen)                                                                 \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID, "uubb", errorCode, debugText, wifiScanResults,            \
-                                  wifiScanResultsLen, threadScanResults, threadScanResultsLen);
-
-/** @brief Command description for AddWiFiNetwork
- *
- * Command: AddWiFiNetwork
- * @param ssid OCTET_STRING
- * @param credentials OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                   \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
-
-/** @brief Command description for AddWiFiNetworkResponse
- *
- * Command: AddWiFiNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddWiFiNetworkResponse(errorCode, debugText)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for UpdateWiFiNetwork
- *
- * Command: UpdateWiFiNetwork
- * @param ssid OCTET_STRING
- * @param credentials OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateWiFiNetwork(ssid, credentials, breadcrumb, timeoutMs)                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID, "uuuu", ssid, credentials, breadcrumb, timeoutMs);
-
-/** @brief Command description for UpdateWiFiNetworkResponse
- *
- * Command: UpdateWiFiNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateWiFiNetworkResponse(errorCode, debugText)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for AddThreadNetwork
- *
- * Command: AddThreadNetwork
- * @param operationalDataset OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
-
-/** @brief Command description for AddThreadNetworkResponse
- *
- * Command: AddThreadNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterAddThreadNetworkResponse(errorCode, debugText)                                                             \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for UpdateThreadNetwork
- *
- * Command: UpdateThreadNetwork
- * @param operationalDataset OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateThreadNetwork(operationalDataset, breadcrumb, timeoutMs)                                             \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID, "uuu", operationalDataset, breadcrumb, timeoutMs);
-
-/** @brief Command description for UpdateThreadNetworkResponse
- *
- * Command: UpdateThreadNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterUpdateThreadNetworkResponse(errorCode, debugText)                                                          \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for RemoveNetwork
- *
- * Command: RemoveNetwork
- * @param NetworkID OCTET_STRING
- * @param Breadcrumb INT64U
- * @param TimeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterRemoveNetwork(NetworkID, Breadcrumb, TimeoutMs)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_REMOVE_NETWORK_COMMAND_ID, "uuu", NetworkID, Breadcrumb, TimeoutMs);
-
-/** @brief Command description for RemoveNetworkResponse
- *
- * Command: RemoveNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterRemoveNetworkResponse(errorCode, debugText)                                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for EnableNetwork
- *
- * Command: EnableNetwork
- * @param networkID OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterEnableNetwork(networkID, breadcrumb, timeoutMs)                                                            \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ENABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
-
-/** @brief Command description for EnableNetworkResponse
- *
- * Command: EnableNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterEnableNetworkResponse(errorCode, debugText)                                                                \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for DisableNetwork
- *
- * Command: DisableNetwork
- * @param networkID OCTET_STRING
- * @param breadcrumb INT64U
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterDisableNetwork(networkID, breadcrumb, timeoutMs)                                                           \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_DISABLE_NETWORK_COMMAND_ID, "uuu", networkID, breadcrumb, timeoutMs);
-
-/** @brief Command description for DisableNetworkResponse
- *
- * Command: DisableNetworkResponse
- * @param errorCode INT8U
- * @param debugText CHAR_STRING
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterDisableNetworkResponse(errorCode, debugText)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID, "uu", errorCode, debugText);
-
-/** @brief Command description for GetLastNetworkCommissioningResult
- *
- * Command: GetLastNetworkCommissioningResult
- * @param timeoutMs INT32U
- */
-#define emberAfFillCommandNetwork                                                                                                  \
-    CommissioningClusterGetLastNetworkCommissioningResult(timeoutMs)                                                               \
-        emberAfFillExternalBuffer(mask,                                                                                            \
-                                                                                                                                   \
-                                  ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID, "u", timeoutMs);
-
 /** @brief Command description for Bind
  *
  * Command: Bind
index d77da91..add8f83 100644 (file)
@@ -86,6 +86,9 @@
 // Definitions for cluster: General Commissioning
 #define ZCL_GENERAL_COMMISSIONING_CLUSTER_ID (0x0030)
 
+// Definitions for cluster: Network Commissioning
+#define ZCL_NETWORK_COMMISSIONING_CLUSTER_ID (0x0031)
+
 // Definitions for cluster: Shade Configuration
 #define ZCL_SHADE_CONFIG_CLUSTER_ID (0x0100)
 
 // Definitions for cluster: ZLL Commissioning
 #define ZCL_ZLL_COMMISSIONING_CLUSTER_ID (0x1000)
 
-// Definitions for cluster: Network Commissioning
-#define ZCL_NETWORK_COMMISSIONING_CLUSTER_ID (0xAAAA)
-
 // Definitions for cluster: Binding
 #define ZCL_BINDING_CLUSTER_ID (0xF000)
 
index adc2b1c..864943b 100644 (file)
 #define ZCL_COMMISSIONING_COMPLETE_COMMAND_ID (0x06)
 #define ZCL_COMMISSIONING_COMPLETE_RESPONSE_COMMAND_ID (0x07)
 
+// Commands for cluster: Network Commissioning
+#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00)
+#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01)
+#define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
+#define ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x03)
+#define ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x04)
+#define ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x05)
+#define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
+#define ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x07)
+#define ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID (0x08)
+#define ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x09)
+#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x0A)
+#define ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID (0x0B)
+#define ZCL_ENABLE_NETWORK_COMMAND_ID (0x0C)
+#define ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID (0x0D)
+#define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
+#define ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID (0x0F)
+#define ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID (0x10)
+
 // Commands for cluster: Door Lock
 #define ZCL_LOCK_DOOR_COMMAND_ID (0x00)
 #define ZCL_LOCK_DOOR_RESPONSE_COMMAND_ID (0x00)
 #define ZCL_GET_ENDPOINT_LIST_REQUEST_COMMAND_ID (0x42)
 #define ZCL_GET_ENDPOINT_LIST_RESPONSE_COMMAND_ID (0x42)
 
-// Commands for cluster: Network Commissioning
-#define ZCL_SCAN_NETWORKS_COMMAND_ID (0x00)
-#define ZCL_SCAN_NETWORKS_RESPONSE_COMMAND_ID (0x01)
-#define ZCL_ADD_WI_FI_NETWORK_COMMAND_ID (0x02)
-#define ZCL_ADD_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x03)
-#define ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID (0x04)
-#define ZCL_UPDATE_WI_FI_NETWORK_RESPONSE_COMMAND_ID (0x05)
-#define ZCL_ADD_THREAD_NETWORK_COMMAND_ID (0x06)
-#define ZCL_ADD_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x07)
-#define ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID (0x08)
-#define ZCL_UPDATE_THREAD_NETWORK_RESPONSE_COMMAND_ID (0x09)
-#define ZCL_REMOVE_NETWORK_COMMAND_ID (0x0A)
-#define ZCL_REMOVE_NETWORK_RESPONSE_COMMAND_ID (0x0B)
-#define ZCL_ENABLE_NETWORK_COMMAND_ID (0x0C)
-#define ZCL_ENABLE_NETWORK_RESPONSE_COMMAND_ID (0x0D)
-#define ZCL_DISABLE_NETWORK_COMMAND_ID (0x0E)
-#define ZCL_DISABLE_NETWORK_RESPONSE_COMMAND_ID (0x0F)
-#define ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID (0x10)
-
 // Commands for cluster: Binding
 #define ZCL_BIND_COMMAND_ID (0x00)
 #define ZCL_UNBIND_COMMAND_ID (0x01)
index bd08d38..8c737e9 100644 (file)
 #define CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER
 #endif
 
+#if defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_CLIENT)
+#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER { ZCL_NETWORK_COMMISSIONING_CLUSTER_ID, 49, "Network Commissioning" },
+#else
+#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER
+#endif
+
 #if defined(ZCL_USING_SHADE_CONFIG_CLUSTER_SERVER) || defined(ZCL_USING_SHADE_CONFIG_CLUSTER_CLIENT)
 #define CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER { ZCL_SHADE_CONFIG_CLUSTER_ID, 256, "Shade Configuration" },
 #else
 #define CHIP_PRINTCLUSTER_ZLL_COMMISSIONING_CLUSTER
 #endif
 
-#if defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_SERVER) || defined(ZCL_USING_NETWORK_COMMISSIONING_CLUSTER_CLIENT)
-#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER { ZCL_NETWORK_COMMISSIONING_CLUSTER_ID, 43690, "Network Commissioning" },
-#else
-#define CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER
-#endif
-
 #if defined(ZCL_USING_BINDING_CLUSTER_SERVER) || defined(ZCL_USING_BINDING_CLUSTER_CLIENT)
 #define CHIP_PRINTCLUSTER_BINDING_CLUSTER { ZCL_BINDING_CLUSTER_ID, 61440, "Binding" },
 #else
     CHIP_PRINTCLUSTER_KEEPALIVE_CLUSTER                                                                                            \
     CHIP_PRINTCLUSTER_BASIC_CLUSTER                                                                                                \
     CHIP_PRINTCLUSTER_GENERAL_COMMISSIONING_CLUSTER                                                                                \
+    CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER                                                                                \
     CHIP_PRINTCLUSTER_SHADE_CONFIG_CLUSTER                                                                                         \
     CHIP_PRINTCLUSTER_DOOR_LOCK_CLUSTER                                                                                            \
     CHIP_PRINTCLUSTER_WINDOW_COVERING_CLUSTER                                                                                      \
     CHIP_PRINTCLUSTER_ELECTRICAL_MEASUREMENT_CLUSTER                                                                               \
     CHIP_PRINTCLUSTER_DIAGNOSTICS_CLUSTER                                                                                          \
     CHIP_PRINTCLUSTER_ZLL_COMMISSIONING_CLUSTER                                                                                    \
-    CHIP_PRINTCLUSTER_NETWORK_COMMISSIONING_CLUSTER                                                                                \
     CHIP_PRINTCLUSTER_BINDING_CLUSTER                                                                                              \
     CHIP_PRINTCLUSTER_MEDIA_PLAYBACK_CLUSTER                                                                                       \
     CHIP_PRINTCLUSTER_CONTENT_LAUNCH_CLUSTER                                                                                       \
index 1a78567..2d8a5c1 100644 (file)
@@ -35,9 +35,6 @@ class BLEEndPoint;
 namespace DeviceLayer {
 
 namespace Internal {
-class NetworkProvisioningServerImpl;
-template <class>
-class GenericNetworkProvisioningServerImpl;
 template <class>
 class GenericPlatformManagerImpl;
 template <class>
@@ -200,9 +197,6 @@ private:
     friend class Internal::GenericPlatformManagerImpl_FreeRTOS;
     template <class>
     friend class Internal::GenericPlatformManagerImpl_POSIX;
-    friend class Internal::NetworkProvisioningServerImpl;
-    template <class>
-    friend class Internal::GenericNetworkProvisioningServerImpl;
 
     CHIP_ERROR Init();
     void OnPlatformEvent(const ChipDeviceEvent * event);
index 45b1651..16596fa 100644 (file)
@@ -53,8 +53,6 @@ template <class>
 class GenericThreadStackManagerImpl_OpenThread_LwIP;
 template <class>
 class GenericThreadStackManagerImpl_FreeRTOS;
-template <class>
-class GenericNetworkProvisioningServerImpl;
 } // namespace Internal
 
 /**
@@ -117,8 +115,6 @@ private:
     friend class Internal::GenericThreadStackManagerImpl_OpenThread_LwIP;
     template <class>
     friend class Internal::GenericThreadStackManagerImpl_FreeRTOS;
-    template <class>
-    friend class Internal::GenericNetworkProvisioningServerImpl;
 
     void OnPlatformEvent(const ChipDeviceEvent * event);
     bool IsThreadEnabled();
diff --git a/src/include/platform/internal/GenericNetworkProvisioningServerImpl.cpp b/src/include/platform/internal/GenericNetworkProvisioningServerImpl.cpp
deleted file mode 100644 (file)
index 9b85f79..0000000
+++ /dev/null
@@ -1,1103 +0,0 @@
-/*
- *
- *    Copyright (c) 2020-2021 Project CHIP Authors
- *    Copyright (c) 2018 Nest Labs, Inc.
- *    All rights reserved.
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- */
-
-/**
- *    @file
- *          Contains non-inline method definitions for the
- *          GenericNetworkProvisioningServerImpl<> template.
- */
-
-#ifndef GENERIC_NETWORK_PROVISIONING_SERVER_IMPL_CPP
-#define GENERIC_NETWORK_PROVISIONING_SERVER_IMPL_CPP
-
-#include <platform/internal/CHIPDeviceLayerInternal.h>
-#include <platform/internal/GenericNetworkProvisioningServerImpl.h>
-#include <platform/internal/NetworkProvisioningServer.h>
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-#include <platform/ThreadStackManager.h>
-#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-using namespace ::chip::TLV;
-
-using Profiles::kChipProfile_Common;
-using Profiles::kChipProfile_NetworkProvisioning;
-
-namespace {
-
-const char sLogPrefix[] = "NetworkProvisioningServer: ";
-
-} // unnamed namespace
-
-// Fully instantiate the generic implementation class in whatever compilation unit includes this file.
-template class GenericNetworkProvisioningServerImpl<NetworkProvisioningServerImpl>;
-
-template <class ImplClass>
-void GenericNetworkProvisioningServerImpl<ImplClass>::_StartPendingScan()
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-
-    // Do nothing if there's no pending ScanNetworks request outstanding, or if a scan is already in progress.
-    if (mState != kState_ScanNetworks_Pending)
-    {
-        ExitNow();
-    }
-
-    switch (mScanNetworkType)
-    {
-#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-    case kNetworkType_WiFi:
-
-        // Defer the scan if the Connection Manager says the system is in a state
-        // where a WiFi scan cannot be started (e.g. if the system is connecting to
-        // an AP and can't scan and connect at the same time). The Connection Manager
-        // is responsible for calling this method again when the system is read to scan.
-        if (!ConnectivityMgr().CanStartWiFiScan())
-        {
-            ExitNow();
-        }
-
-        mState = kState_ScanNetworks_InProgress;
-
-        // Delegate to the implementation subclass to initiate the WiFi scan operation.
-        err = Impl()->InitiateWiFiScan();
-        SuccessOrExit(err);
-
-        break;
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    case kNetworkType_Thread:
-
-        // TODO: implement this
-        ExitNow(err = CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE);
-
-        break;
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    default:
-        ExitNow(err = CHIP_ERROR_INCORRECT_STATE);
-    }
-
-exit:
-    // If an error occurred, send a Internal Error back to the requestor.
-    if (err != CHIP_NO_ERROR)
-    {
-        SendStatusReport(kChipProfile_Common, kStatus_InternalError, err);
-        mState = kState_Idle;
-    }
-}
-
-template <class ImplClass>
-void GenericNetworkProvisioningServerImpl<ImplClass>::_OnPlatformEvent(const ChipDeviceEvent * event)
-{
-#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-    // Handle a change in Internet connectivity...
-    if (event->Type == DeviceEventType::kInternetConnectivityChange)
-    {
-        // If a TestConnectivity operation is in progress for WiFi, re-evaluate the state
-        // connectivity now.
-        ContinueWiFiConnectivityTest();
-    }
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    // Define some short-hands for various interesting event conditions.
-    const bool threadConnChanged = (event->Type == DeviceEventType::kThreadConnectivityChange &&
-                                    event->ThreadConnectivityChange.Result != kConnectivity_NoChange);
-    const bool threadRoleChanged = (event->Type == DeviceEventType::kThreadStateChange && event->ThreadStateChange.RoleChanged);
-    const bool threadChildrenChanged =
-        (event->Type == DeviceEventType::kThreadStateChange && event->ThreadStateChange.ChildNodesChanged);
-
-    // If the state of the Thread interface changed, OR if the Thread role changed, OR
-    // if there was a change to the set of child nodes...
-    if (threadConnChanged || threadRoleChanged || threadChildrenChanged)
-    {
-        // If a TestConnectivity operation is in progress for Thread, re-evaluate the state
-        // connectivity now.
-        ContinueThreadConnectivityTest();
-    }
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD
-}
-
-template <class ImplClass>
-CHIP_ERROR GenericNetworkProvisioningServerImpl<ImplClass>::HandleScanNetworks(uint8_t networkType)
-{
-    CHIP_ERROR err       = CHIP_NO_ERROR;
-    bool isAppControlled = false;
-
-    VerifyOrExit(mState == kState_Idle, err = CHIP_ERROR_INCORRECT_STATE);
-
-    switch (networkType)
-    {
-#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-    case kNetworkType_WiFi:
-        isAppControlled = ConnectivityMgr().IsWiFiStationApplicationControlled();
-        break;
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    case kNetworkType_Thread:
-        isAppControlled = ConnectivityMgr().IsThreadApplicationControlled();
-        break;
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    default:
-        err = SendStatusReport(kChipProfile_NetworkProvisioning, kStatusCode_UnsupportedNetworkType);
-        ExitNow();
-    }
-
-    // Reject the request if the application is currently in control of the requested network.
-    if (isAppControlled)
-    {
-        err = SendStatusReport(kChipProfile_Common, kStatus_NotAvailable);
-        ExitNow();
-    }
-
-    // Enter the ScanNetworks Pending state and delegate to the implementation class to start the scan.
-    mState           = kState_ScanNetworks_Pending;
-    mScanNetworkType = networkType;
-    Impl()->StartPendingScan();
-
-exit:
-    return err;
-}
-
-template <class ImplClass>
-CHIP_ERROR GenericNetworkProvisioningServerImpl<ImplClass>::DoInit()
-{
-    CHIP_ERROR err;
-
-    // Call init on the server base class.
-    err = ServerBaseClass::Init(&::chip::DeviceLayer::ExchangeMgr);
-    SuccessOrExit(err);
-
-    // Set the pointer to the delegate object.
-    SetDelegate(this);
-
-    mState           = kState_Idle;
-    mScanNetworkType = kNetworkType_NotSpecified;
-
-exit:
-    return err;
-}
-
-template <class ImplClass>
-CHIP_ERROR GenericNetworkProvisioningServerImpl<ImplClass>::HandleAddNetwork(PacketBuffer * networkInfoTLV)
-{
-    return HandleAddUpdateNetwork(networkInfoTLV, false);
-}
-
-template <class ImplClass>
-CHIP_ERROR GenericNetworkProvisioningServerImpl<ImplClass>::HandleUpdateNetwork(PacketBuffer * networkInfoTLV)
-{
-    return HandleAddUpdateNetwork(networkInfoTLV, true);
-}
-
-template <class ImplClass>
-CHIP_ERROR GenericNetworkProvisioningServerImpl<ImplClass>::HandleAddUpdateNetwork(PacketBuffer * networkInfoTLV, bool isUpdate)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-    DeviceNetworkInfo netInfo;
-    uint32_t netId;
-
-    VerifyOrExit(mState == kState_Idle, err = CHIP_ERROR_INCORRECT_STATE);
-
-    // Parse the supplied network configuration info.
-    {
-        TLV::TLVReader reader;
-        reader.Init(networkInfoTLV);
-        err = netInfo.Decode(reader);
-        SuccessOrExit(err);
-    }
-
-    // Discard the request buffer.
-    PacketBuffer::Free(networkInfoTLV);
-    networkInfoTLV = NULL;
-
-    switch (netInfo.NetworkType)
-    {
-#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-    case kNetworkType_WiFi:
-
-        // If updating the provision, verify that the specified network is provisioned.
-        if (isUpdate && !ConnectivityMgr().IsWiFiStationProvisioned())
-        {
-            err = SendStatusReport(kChipProfile_NetworkProvisioning, kStatusCode_UnknownNetwork);
-            ExitNow();
-        }
-
-        // Reject the request if the application is currently in control of the WiFi station.
-        if (ConnectivityMgr().IsWiFiStationApplicationControlled())
-        {
-            err = SendStatusReport(kChipProfile_Common, kStatus_NotAvailable);
-            ExitNow();
-        }
-
-        // If updating the provision...
-        if (isUpdate)
-        {
-            DeviceNetworkInfo existingNetInfo;
-
-            // Delegate to the implementation subclass to get the existing station provision.
-            err = Impl()->GetWiFiStationProvision(existingNetInfo, true);
-            SuccessOrExit(err);
-
-            // Override the existing provision with values specified in the update.
-            err = netInfo.MergeTo(existingNetInfo);
-            SuccessOrExit(err);
-            memcpy(&netInfo, &existingNetInfo, sizeof(existingNetInfo));
-        }
-
-        // Check the validity of the new provision. If not acceptable, respond to the requestor
-        // with an appropriate StatusReport.
-        {
-            uint32_t statusProfileId;
-            uint16_t statusCode;
-            err = Impl()->ValidateWiFiStationProvision(netInfo, statusProfileId, statusCode);
-            if (err != CHIP_NO_ERROR)
-            {
-                err = SendStatusReport(statusProfileId, statusCode, err);
-                ExitNow();
-            }
-        }
-
-        // If the WiFi station is not already configured, disable the station interface.  This
-        // ensures that the device will not automatically connect to the new network until an
-        // EnableNetwork request is received.
-        if (!ConnectivityMgr().IsWiFiStationProvisioned())
-        {
-            err = ConnectivityMgr().SetWiFiStationMode(ConnectivityManager::kWiFiStationMode_Disabled);
-            SuccessOrExit(err);
-        }
-
-        // Delegate to the implementation subclass to set the WiFi station provision.
-        err = Impl()->SetWiFiStationProvision(netInfo);
-        SuccessOrExit(err);
-
-        // Tell the ConnectivityManager there's been a change to the station provision.
-        ConnectivityMgr().OnWiFiStationProvisionChange();
-
-        netId = kWiFiStationNetworkId;
-
-        break;
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    case kNetworkType_Thread:
-
-        // If updating the provision, verify that the Thread network is provisioned.
-        if (isUpdate && !ThreadStackMgr().IsThreadProvisioned())
-        {
-            err = SendStatusReport(kChipProfile_NetworkProvisioning, kStatusCode_UnknownNetwork);
-            ExitNow();
-        }
-
-        // Reject the request if the application is currently in control of the Thread network.
-        if (ConnectivityMgr().IsThreadApplicationControlled())
-        {
-            err = SendStatusReport(kChipProfile_Common, kStatus_NotAvailable);
-            ExitNow();
-        }
-
-        // Check the validity of the supplied Thread parameters. If not acceptable, respond to
-        // the requestor with an appropriate StatusReport.
-        {
-            uint32_t statusProfileId;
-            uint16_t statusCode;
-            err = Impl()->ValidateThreadProvision(isUpdate, netInfo, statusProfileId, statusCode);
-            if (err != CHIP_NO_ERROR)
-            {
-                err = SendStatusReport(statusProfileId, statusCode, err);
-                ExitNow();
-            }
-        }
-
-        // Apply suitable defaults for any parameters not supplied by the client.
-        err = Impl()->SetThreadProvisionDefaults(isUpdate, netInfo);
-        SuccessOrExit(err);
-
-        // Store the Thread provision.
-        err = ThreadStackMgr().SetThreadProvision(netInfo);
-        SuccessOrExit(err);
-
-        netId = kThreadNetworkId;
-
-        break;
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    default:
-
-        ChipLogProgress(DeviceLayer, "%sUnsupported network type: %d", sLogPrefix, netInfo.NetworkType);
-        err = SendStatusReport(kChipProfile_NetworkProvisioning, kStatusCode_UnsupportedNetworkType, CHIP_ERROR_INVALID_ARGUMENT);
-        ExitNow();
-    }
-
-    // Send an AddNetworkComplete message back to the requestor.
-    SendAddNetworkComplete(netId);
-
-exit:
-    PacketBuffer::Free(networkInfoTLV);
-    return err;
-}
-
-template <class ImplClass>
-CHIP_ERROR GenericNetworkProvisioningServerImpl<ImplClass>::HandleRemoveNetwork(uint32_t networkId)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-
-    VerifyOrExit(mState == kState_Idle, err = CHIP_ERROR_INCORRECT_STATE);
-
-    switch (networkId)
-    {
-#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-    case kWiFiStationNetworkId:
-
-        // Verify that the specified network exists.
-        if (!ConnectivityMgr().IsWiFiStationProvisioned())
-        {
-            goto sendUnknownNetworkResp;
-        }
-
-        // Reject the request if the application is currently in control of the WiFi station.
-        if (ConnectivityMgr().IsWiFiStationApplicationControlled())
-        {
-            err = SendStatusReport(kChipProfile_Common, kStatus_NotAvailable);
-            ExitNow();
-        }
-
-        // Delegate to the implementation subclass to clear the WiFi station provision.
-        err = Impl()->ClearWiFiStationProvision();
-        SuccessOrExit(err);
-
-        // Tell the ConnectivityManager there's been a change to the station provision.
-        ConnectivityMgr().OnWiFiStationProvisionChange();
-
-        break;
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    case kThreadNetworkId:
-
-        // Verify that the specified network exists.
-        if (!ThreadStackMgr().IsThreadProvisioned())
-        {
-            goto sendUnknownNetworkResp;
-        }
-
-        // Reject the request if the application is currently in control of the Thread network.
-        if (ConnectivityMgr().IsThreadApplicationControlled())
-        {
-            err = SendStatusReport(kChipProfile_Common, kStatus_NotAvailable);
-            ExitNow();
-        }
-
-        // Clear the Thread provision.
-        ThreadStackMgr().ErasePersistentInfo();
-
-        break;
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    default:
-    sendUnknownNetworkResp:
-
-        err = SendStatusReport(kChipProfile_NetworkProvisioning, kStatusCode_UnknownNetwork);
-        ExitNow();
-    }
-
-    // Respond with a Success response.
-    err = SendSuccessResponse();
-    SuccessOrExit(err);
-
-exit:
-    return err;
-}
-
-template <class ImplClass>
-CHIP_ERROR GenericNetworkProvisioningServerImpl<ImplClass>::HandleGetNetworks(uint8_t flags)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-    DeviceNetworkInfo netInfo[2];
-    PacketBuffer * respBuf        = NULL;
-    uint8_t resultCount           = 0;
-    const bool includeCredentials = (flags & kGetNetwork_IncludeCredentials) != 0;
-
-    VerifyOrExit(mState == kState_Idle, err = CHIP_ERROR_INCORRECT_STATE);
-
-#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-    // Delegate to the implementation subclass to get the WiFi station provision.
-    err = Impl()->GetWiFiStationProvision(netInfo[resultCount], includeCredentials);
-    if (err == CHIP_NO_ERROR)
-    {
-        resultCount++;
-    }
-    else if (err != CHIP_ERROR_INCORRECT_STATE)
-    {
-        ExitNow();
-    }
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    // Delegate to the implementation subclass to get the Thread provision.
-    err = ThreadStackMgr().GetThreadProvision(netInfo[resultCount], includeCredentials);
-    if (err == CHIP_NO_ERROR)
-    {
-        resultCount++;
-    }
-    else if (err != CHIP_ERROR_INCORRECT_STATE)
-    {
-        ExitNow();
-    }
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    // Allocate a buffer to hold the response.
-    respBuf = PacketBufferHandle::New(PacketBuffer::kMaxSize);
-    VerifyOrExit(respBuf != NULL, err = CHIP_ERROR_NO_MEMORY);
-
-    // Encode the GetNetworks response data.
-    {
-        TLVWriter writer;
-
-        writer.Init(respBuf);
-
-        err = DeviceNetworkInfo::EncodeArray(writer, netInfo, resultCount);
-        SuccessOrExit(err);
-
-        err = writer.Finalize();
-        SuccessOrExit(err);
-    }
-
-    // Send the response.
-    err     = SendGetNetworksComplete(resultCount, respBuf);
-    respBuf = NULL;
-    SuccessOrExit(err);
-
-exit:
-    PacketBuffer::Free(respBuf);
-    return err;
-}
-
-template <class ImplClass>
-CHIP_ERROR GenericNetworkProvisioningServerImpl<ImplClass>::HandleEnableNetwork(uint32_t networkId)
-{
-    return HandleEnableDisableNetwork(networkId, true);
-}
-
-template <class ImplClass>
-CHIP_ERROR GenericNetworkProvisioningServerImpl<ImplClass>::HandleDisableNetwork(uint32_t networkId)
-{
-    return HandleEnableDisableNetwork(networkId, false);
-}
-
-template <class ImplClass>
-CHIP_ERROR GenericNetworkProvisioningServerImpl<ImplClass>::HandleEnableDisableNetwork(uint32_t networkId, bool enable)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-
-    VerifyOrExit(mState == kState_Idle, err = CHIP_ERROR_INCORRECT_STATE);
-
-    switch (networkId)
-    {
-#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-    case kWiFiStationNetworkId:
-
-        // Verify that the specified network exists.
-        if (!ConnectivityMgr().IsWiFiStationProvisioned())
-        {
-            goto sendUnknownNetworkResp;
-        }
-
-        // Reject the request if the application is currently in control of the WiFi station.
-        if (ConnectivityMgr().IsWiFiStationApplicationControlled())
-        {
-            err = SendStatusReport(kChipProfile_Common, kStatus_NotAvailable);
-            ExitNow();
-        }
-
-        // Tell the ConnectivityManager to enable/disable the WiFi station interface.
-        // Note that any effects of chaning the WiFi station mode happen asynchronously with this call.
-        err = ConnectivityMgr().SetWiFiStationMode((enable) ? ConnectivityManager::kWiFiStationMode_Enabled
-                                                            : ConnectivityManager::kWiFiStationMode_Disabled);
-        SuccessOrExit(err);
-
-        break;
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    case kThreadNetworkId:
-
-        // Verify that the specified network exists.
-        if (!ThreadStackMgr().IsThreadProvisioned())
-        {
-            goto sendUnknownNetworkResp;
-        }
-
-        // Reject the request if the application is currently in control of the Thread network.
-        if (ConnectivityMgr().IsThreadApplicationControlled())
-        {
-            err = SendStatusReport(kChipProfile_Common, kStatus_NotAvailable);
-            ExitNow();
-        }
-
-        // Tell the ConnectivityManager to enable/disable the Thread network interface.
-        // Note that any effects of changing the Thread mode happen asynchronously with this call.
-        err = ThreadStackMgr().SetThreadEnabled(enable);
-        SuccessOrExit(err);
-
-        break;
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    default:
-    sendUnknownNetworkResp:
-
-        err = SendStatusReport(kChipProfile_NetworkProvisioning, kStatusCode_UnknownNetwork);
-        ExitNow();
-    }
-
-    // Respond with a Success response.
-    err = SendSuccessResponse();
-    SuccessOrExit(err);
-
-exit:
-    return err;
-}
-
-template <class ImplClass>
-CHIP_ERROR GenericNetworkProvisioningServerImpl<ImplClass>::HandleTestConnectivity(uint32_t networkId)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-
-    VerifyOrExit(mState == kState_Idle, err = CHIP_ERROR_INCORRECT_STATE);
-
-    switch (networkId)
-    {
-#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-    case kWiFiStationNetworkId:
-
-        // Verify that the specified network exists.
-        if (!ConnectivityMgr().IsWiFiStationProvisioned())
-        {
-            goto sendUnknownNetworkResp;
-        }
-
-        // Reject the request if the application is currently in control of the WiFi station.
-        if (ConnectivityMgr().IsWiFiStationApplicationControlled())
-        {
-            err = SendStatusReport(kChipProfile_Common, kStatus_NotAvailable);
-            ExitNow();
-        }
-
-        // Tell the ConnectivityManager to enable the WiFi station interface if it hasn't been done already.
-        // Note that any effects of enabling the WiFi station interface (e.g. connecting to an AP) happen
-        // asynchronously with this call.
-        err = ConnectivityMgr().SetWiFiStationMode(ConnectivityManager::kWiFiStationMode_Enabled);
-        SuccessOrExit(err);
-
-        // Record that we're waiting for the WiFi station interface to establish connectivity
-        // with the Internet and arm a timer that will generate an error if connectivity isn't established
-        // within a certain amount of time.
-        mState = kState_TestConnectivity_WaitWiFiConnectivity;
-        SystemLayer.StartTimer(CHIP_DEVICE_CONFIG_WIFI_CONNECTIVITY_TIMEOUT, HandleConnectivityTestTimeOut, NULL);
-
-        // Go check for connectivity now.
-        Impl()->ContinueWiFiConnectivityTest();
-
-        break;
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    case kThreadNetworkId:
-
-        // Verify that the specified network exists.
-        if (!ThreadStackMgr().IsThreadProvisioned())
-        {
-            goto sendUnknownNetworkResp;
-        }
-
-        // If the Thread interface is NOT already enabled...
-        if (!ThreadStackMgr().IsThreadEnabled())
-        {
-            // Reject the request if the application is currently in control of the Thread network.
-            if (ConnectivityMgr().IsThreadApplicationControlled())
-            {
-                err = SendStatusReport(kChipProfile_Common, kStatus_NotAvailable);
-                ExitNow();
-            }
-
-            // Enable the Thread interface.
-            err = ThreadStackMgr().SetThreadEnabled(true);
-            SuccessOrExit(err);
-        }
-
-        // Record that we're waiting to establish Thread connectivity and arm a timer that will
-        // generate an error if connectivity isn't established within a certain amount of time.
-        mState = kState_TestConnectivity_WaitThreadConnectivity;
-        SystemLayer.StartTimer(CHIP_DEVICE_CONFIG_THREAD_CONNECTIVITY_TIMEOUT, HandleConnectivityTestTimeOut, NULL);
-
-        // Go check for connectivity now.
-        Impl()->ContinueThreadConnectivityTest();
-
-        break;
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    default:
-    sendUnknownNetworkResp:
-
-        err = SendStatusReport(kChipProfile_NetworkProvisioning, kStatusCode_UnknownNetwork);
-        ExitNow();
-    }
-
-exit:
-    return err;
-}
-
-template <class ImplClass>
-CHIP_ERROR GenericNetworkProvisioningServerImpl<ImplClass>::HandleSetRendezvousMode(uint16_t rendezvousMode)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-
-    VerifyOrExit(mState == kState_Idle, err = CHIP_ERROR_INCORRECT_STATE);
-
-    // Fail with Common:UnsupportedMessage if any unsupported modes were specified.
-    {
-        const uint16_t kSupportedModes = 0
-#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_AP
-            | kRendezvousMode_EnableWiFiRendezvousNetwork
-#endif
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-            | kRendezvousMode_EnableThreadRendezvous
-#endif
-            ;
-
-        if ((rendezvousMode & ~kSupportedModes) != 0)
-        {
-            err = SendStatusReport(kChipProfile_Common, kStatus_UnsupportedMessage);
-            ExitNow();
-        }
-    }
-
-#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_AP
-
-    // If the request is to start the WiFi "rendezvous network" (a.k.a. the WiFi AP interface)...
-    if ((rendezvousMode & kRendezvousMode_EnableWiFiRendezvousNetwork) != 0)
-    {
-        // Reject the request if the application is currently in control of the WiFi AP
-        // OR if the AP interface has been expressly disabled by the application.
-        const ConnectivityManager::WiFiAPMode apMode = ConnectivityMgr().GetWiFiAPMode();
-        if (apMode == ConnectivityManager::kWiFiAPMode_ApplicationControlled || apMode == ConnectivityManager::kWiFiAPMode_Disabled)
-        {
-            err = SendStatusReport(kChipProfile_Common, kStatus_NotAvailable);
-            ExitNow();
-        }
-
-        // Otherwise, request the ConnectivityManager to demand start the WiFi AP interface.
-        // If the interface is already active this will have no immediate effect, except if the
-        // interface is in the "demand" mode, in which case this will serve to extend the
-        // active time.
-        ConnectivityMgr().DemandStartWiFiAP();
-    }
-
-    // Otherwise the request is to stop the WiFi rendezvous network, so request the ConnectivityManager
-    // to stop the AP interface if it has been demand started.  This will have no effect if the
-    // interface is already stopped, or if the application has expressly enabled the interface.
-    else
-    {
-        ConnectivityMgr().StopOnDemandWiFiAP();
-    }
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI_AP
-
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    // If the request is to enable Thread "rendezvous"--i.e. enable Thread joinable mode...
-    if ((rendezvousMode & kRendezvousMode_EnableWiFiRendezvousNetwork) != 0)
-    {
-        // Reject the request if the application is currently in control of the Thread Network
-        // OR if the Thread interface has been expressly disabled by the application
-        // OR if the Thread network has not been provisioned.
-        const ConnectivityManager::ThreadMode threadMode = ConnectivityMgr().GetThreadMode();
-        if (threadMode == ConnectivityManager::kThreadMode_ApplicationControlled ||
-            threadMode == ConnectivityManager::kThreadMode_Disabled || !ThreadStackMgr().IsThreadProvisioned())
-        {
-            err = SendStatusReport(kChipProfile_Common, kStatus_NotAvailable);
-            ExitNow();
-        }
-
-        // TODO: implement this
-        ExitNow(err = CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE);
-    }
-
-    // Otherwise the request is to stop the Thread rendezvous...
-    else
-    {
-
-        // TODO: implement this
-        ExitNow(err = CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE);
-    }
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-    // Respond with a Success response.
-    err = SendSuccessResponse();
-    SuccessOrExit(err);
-
-exit:
-    return err;
-}
-
-template <class ImplClass>
-bool GenericNetworkProvisioningServerImpl<ImplClass>::IsPairedToAccount() const
-{
-    return ConfigurationMgr().IsServiceProvisioned() && ConfigurationMgr().IsPairedToAccount();
-}
-
-#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-template <class ImplClass>
-CHIP_ERROR GenericNetworkProvisioningServerImpl<ImplClass>::ValidateWiFiStationProvision(const DeviceNetworkInfo & netInfo,
-                                                                                         uint32_t & statusProfileId,
-                                                                                         uint16_t & statusCode)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-
-    if (netInfo.NetworkType != kNetworkType_WiFi)
-    {
-        ChipLogProgress(DeviceLayer, "%sUnsupported WiFi station network type: %d", sLogPrefix, netInfo.NetworkType);
-        statusProfileId = kChipProfile_NetworkProvisioning;
-        statusCode      = kStatusCode_UnsupportedNetworkType;
-        ExitNow(err = CHIP_ERROR_INVALID_ARGUMENT);
-    }
-
-    if (netInfo.WiFiSSID[0] == 0)
-    {
-        ChipLogProgress(DeviceLayer, "%sMissing WiFi station SSID", sLogPrefix);
-        statusProfileId = kChipProfile_NetworkProvisioning;
-        statusCode      = kStatusCode_InvalidNetworkConfiguration;
-        ExitNow(err = CHIP_ERROR_INVALID_ARGUMENT);
-    }
-
-    if (netInfo.WiFiMode != kWiFiMode_Managed)
-    {
-        if (netInfo.WiFiMode == kWiFiMode_NotSpecified)
-        {
-            ChipLogProgress(DeviceLayer, "%sMissing WiFi station mode", sLogPrefix);
-        }
-        else
-        {
-            ChipLogProgress(DeviceLayer, "%sUnsupported WiFi station mode: %d", sLogPrefix, netInfo.WiFiMode);
-        }
-        statusProfileId = kChipProfile_NetworkProvisioning;
-        statusCode      = kStatusCode_InvalidNetworkConfiguration;
-        ExitNow(err = CHIP_ERROR_INVALID_ARGUMENT);
-    }
-
-    if (netInfo.WiFiRole != kWiFiRole_Station)
-    {
-        if (netInfo.WiFiRole == kWiFiRole_NotSpecified)
-        {
-            ChipLogProgress(DeviceLayer, "%sMissing WiFi station role", sLogPrefix);
-        }
-        else
-        {
-            ChipLogProgress(DeviceLayer, "%sUnsupported WiFi station role: %d", sLogPrefix, netInfo.WiFiRole);
-        }
-        statusProfileId = kChipProfile_NetworkProvisioning;
-        statusCode      = kStatusCode_InvalidNetworkConfiguration;
-        ExitNow(err = CHIP_ERROR_INVALID_ARGUMENT);
-    }
-
-    // Defer to the implementation class to determine if the proposed security type is supported.
-    if (!ImplClass::IsSupportedWiFiSecurityType(netInfo.WiFiSecurityType))
-    {
-        ChipLogProgress(DeviceLayer, "%sUnsupported WiFi station security type: %d", sLogPrefix, netInfo.WiFiSecurityType);
-        statusProfileId = kChipProfile_NetworkProvisioning;
-        statusCode      = kStatusCode_UnsupportedWiFiSecurityType;
-        ExitNow(err = CHIP_ERROR_INVALID_ARGUMENT);
-    }
-
-    if (netInfo.WiFiSecurityType != kWiFiSecurityType_None && netInfo.WiFiKeyLen == 0)
-    {
-        ChipLogProgress(DeviceLayer, "%sMissing WiFi Key", sLogPrefix);
-        statusProfileId = kChipProfile_NetworkProvisioning;
-        statusCode      = kStatusCode_InvalidNetworkConfiguration;
-        ExitNow(err = CHIP_ERROR_INVALID_ARGUMENT);
-    }
-
-exit:
-    return err;
-}
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-template <class ImplClass>
-CHIP_ERROR
-GenericNetworkProvisioningServerImpl<ImplClass>::ValidateThreadProvision(bool isUpdate, const DeviceNetworkInfo & netInfo,
-                                                                         uint32_t & statusProfileId, uint16_t & statusCode)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-
-    // Verify a valid Thread channel was specified.
-    if (netInfo.ThreadChannel != kThreadChannel_NotSpecified)
-    {
-        if (netInfo.ThreadChannel < 11 && netInfo.ThreadChannel > 26)
-        {
-            statusProfileId = kChipProfile_NetworkProvisioning;
-            statusCode      = kStatusCode_InvalidNetworkConfiguration;
-            ExitNow(err = CHIP_ERROR_INVALID_ARGUMENT);
-        }
-    }
-
-exit:
-    return err;
-}
-
-template <class ImplClass>
-CHIP_ERROR GenericNetworkProvisioningServerImpl<ImplClass>::SetThreadProvisionDefaults(bool isUpdate, DeviceNetworkInfo & netInfo)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-
-    // Generate unique values for any Thread parameters not supplied by the client.
-
-    // If extended PAN id was not specified, generate a random one.
-    if (!netInfo.FieldPresent.ThreadExtendedPANId)
-    {
-        err = Platform::Security::GetSecureRandomData(netInfo.ThreadExtendedPANId, NetworkInfo::kThreadExtendedPANIdLength);
-        SuccessOrExit(err);
-        netInfo.FieldPresent.ThreadExtendedPANId = true;
-    }
-
-    // If network name was not specified, generate a default one.  If the device is a member of a
-    // Chip fabric, base part of the name on the fabric id.
-    if (netInfo.ThreadNetworkName[0] == 0)
-    {
-        uint16_t nameSuffix = (::chip::DeviceLayer::FabricState.FabricId != kFabricIdNotSpecified)
-            ? (uint16_t)::chip::DeviceLayer::FabricState.FabricId
-            : Encoding::BigEndian::Get16(&netInfo.ThreadExtendedPANId[6]);
-        snprintf(netInfo.ThreadNetworkName, sizeof(netInfo.ThreadNetworkName), "%s%04X",
-                 CHIP_DEVICE_CONFIG_DEFAULT_THREAD_NETWORK_NAME_PREFIX, nameSuffix);
-    }
-
-    // If a mesh prefix was not specified, generate one based on the extended PAN id.
-    if (!netInfo.FieldPresent.ThreadMeshPrefix)
-    {
-        memset(netInfo.ThreadMeshPrefix, 0, sizeof(netInfo.ThreadMeshPrefix));
-        netInfo.ThreadMeshPrefix[0] = 0xFD; // IPv6 ULA prefix
-        memcpy(&netInfo.ThreadMeshPrefix[1], netInfo.ThreadExtendedPANId, 5);
-        netInfo.FieldPresent.ThreadMeshPrefix = true;
-    }
-
-    // If the master key was not specified, generate a random key.
-    if (!netInfo.FieldPresent.ThreadMasterKey)
-    {
-        err = Platform::Security::GetSecureRandomData(netInfo.ThreadMasterKey, NetworkInfo::kThreadMasterKeyLength);
-        SuccessOrExit(err);
-        netInfo.FieldPresent.ThreadMasterKey = true;
-    }
-
-    // If a PSKc was not specified, generate a random PSKc.
-    if (!netInfo.FieldPresent.ThreadPSKc)
-    {
-        err = Platform::Security::GetSecureRandomData(netInfo.ThreadPSKc, NetworkInfo::kThreadPSKcLength);
-        SuccessOrExit(err);
-        netInfo.FieldPresent.ThreadPSKc = true;
-    }
-
-    // If a PAN Id was not specified, generate a random Id.
-    if (netInfo.ThreadPANId == kThreadPANId_NotSpecified)
-    {
-        uint16_t randPANId;
-        err = Platform::Security::GetSecureRandomData((uint8_t *) &randPANId, sizeof(randPANId));
-        SuccessOrExit(err);
-        netInfo.ThreadPANId = randPANId;
-    }
-
-    // If Thread channel not present, choose a random one.
-    if (netInfo.ThreadChannel == kThreadChannel_NotSpecified)
-    {
-        err = Platform::Security::GetSecureRandomData((uint8_t *) &netInfo.ThreadChannel, sizeof(netInfo.ThreadChannel));
-        SuccessOrExit(err);
-        netInfo.ThreadChannel = (netInfo.ThreadChannel % 0xF) + 11; // Convert value to 11 thru 26
-    }
-
-exit:
-    return err;
-}
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-template <class ImplClass>
-void GenericNetworkProvisioningServerImpl<ImplClass>::ContinueWiFiConnectivityTest(void)
-{
-    // If waiting for Internet connectivity to be established ...
-    if (mState == kState_TestConnectivity_WaitWiFiConnectivity)
-    {
-        // Check for IPv4 Internet connectivity.  If available...
-        if (ConnectivityMgr().HaveIPv4InternetConnectivity())
-        {
-            // TODO: perform positive test of connectivity to the Internet by pinging/connecting to
-            // a well-known external server.
-
-            // Send a Success result to the client.
-            HandleConnectivityTestSuccess();
-        }
-
-        // Otherwise, arrange to return an appropriate error when the connectivity test times out.
-        else
-        {
-            // TODO: Elaborate on the nature of the connectivity failure.  Ideally the status
-            // code would distinguish the following types of failures:
-            //     - Inability to connect to the local WiFi AP
-            //     - Lack of a suitable local address (RFC1918 for IPv4; Global address for IPv6)
-            //     - Lack of a default router
-            //     - Lack of a DNS server
-            //     - Inability to contact an external server.
-            mTestConnectivityResult.mStatusProfileId = kChipProfile_NetworkProvisioning;
-            mTestConnectivityResult.mStatusCode      = kStatusCode_TestNetworkFailed;
-        }
-    }
-}
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
-
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-template <class ImplClass>
-void GenericNetworkProvisioningServerImpl<ImplClass>::ContinueThreadConnectivityTest(void)
-{
-    // If waiting for Thread connectivity to be established...
-    if (mState == kState_TestConnectivity_WaitThreadConnectivity)
-    {
-        // Check for connectivity to the Thread mesh.  In this context, connectivity means
-        // that this node knows of (i.e. has in its Thread neighbor table) another node
-        // which is acting as a Thread router. If connectivity exists, send a Success
-        // result to the client.
-        if (ThreadStackMgr().HaveMeshConnectivity())
-        {
-            // TODO: perform positive test of connectivity to peer router node.
-
-            // Send a Success result to the client.
-            HandleConnectivityTestSuccess();
-        }
-
-        // If connectivity doesn't exist arrange to return an appropriate error when the
-        // connectivity test times out.
-        else
-        {
-            // TODO: Elaborate on the nature of the connectivity failure.  Ideally the status
-            // code would distinguish the following types of failures:
-            //     - Lack of a peer router detected in the Mesh (for end nodes, this means
-            //       lack of a parent router).
-            //     - Inability to contact/ping the peer router.
-            mTestConnectivityResult.mStatusProfileId = kChipProfile_NetworkProvisioning;
-            mTestConnectivityResult.mStatusCode      = kStatusCode_NoRouterAvailable;
-        }
-    }
-}
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION || CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-template <class ImplClass>
-void GenericNetworkProvisioningServerImpl<ImplClass>::HandleConnectivityTestSuccess(void)
-{
-    // Reset the state.
-    mState = kState_Idle;
-    SystemLayer.CancelTimer(HandleConnectivityTestTimeOut, NULL);
-
-    // Verify that the TestConnectivity request is still outstanding and if so,
-    // send a Success response to the client
-    if (GetCurrentOp() == kMsgType_TestConnectivity)
-    {
-        SendSuccessResponse();
-    }
-}
-
-template <class ImplClass>
-void GenericNetworkProvisioningServerImpl<ImplClass>::HandleConnectivityTestTimeOut(::chip::System::Layer * aLayer,
-                                                                                    void * aAppState, ::chip::System::Error aError)
-{
-    GenericNetworkProvisioningServerImpl<ImplClass> * self = &NetworkProvisioningSvrImpl();
-
-    if (self->mState == kState_TestConnectivity_WaitWiFiConnectivity ||
-        self->mState == kState_TestConnectivity_WaitThreadConnectivity)
-    {
-        const bool testingWiFi = (self->mState == kState_TestConnectivity_WaitWiFiConnectivity);
-
-        ChipLogProgress(DeviceLayer, "%sTime out waiting for %s connectivity", sLogPrefix, (testingWiFi) ? "Internet" : "Thread");
-
-        // Reset the state.
-        self->mState = kState_Idle;
-        SystemLayer.CancelTimer(HandleConnectivityTestTimeOut, NULL);
-
-        // Verify that the TestConnectivity request is still outstanding; if so, send a StatusReport
-        // to the client contain an appropriate error.
-        if (self->GetCurrentOp() == kMsgType_TestConnectivity)
-        {
-            self->SendStatusReport(self->mTestConnectivityResult.mStatusProfileId, self->mTestConnectivityResult.mStatusCode);
-        }
-    }
-}
-
-#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION || CHIP_DEVICE_CONFIG_ENABLE_THREAD
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
-
-#endif // GENERIC_NETWORK_PROVISIONING_SERVER_IMPL_CPP
diff --git a/src/include/platform/internal/GenericNetworkProvisioningServerImpl.h b/src/include/platform/internal/GenericNetworkProvisioningServerImpl.h
deleted file mode 100644 (file)
index 9478063..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *
- *    Copyright (c) 2020 Project CHIP Authors
- *    Copyright (c) 2018 Nest Labs, Inc.
- *    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 <platform/internal/CHIPDeviceLayerInternal.h>
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-class NetworkProvisioningServerImpl;
-class DeviceNetworkInfo;
-
-template <class ImplClass>
-class GenericNetworkProvisioningServerImpl : public ::chip::Profiles::NetworkProvisioning::NetworkProvisioningServer,
-                                             public ::chip::Profiles::NetworkProvisioning::NetworkProvisioningDelegate
-{
-protected:
-    using ServerBaseClass    = ::chip::Profiles::NetworkProvisioning::NetworkProvisioningServer;
-    using NetworkInfo        = ::chip::DeviceLayer::Internal::DeviceNetworkInfo;
-    using NetworkType_t      = ::chip::Profiles::NetworkProvisioning::NetworkType;
-    using PacketBuffer       = ::chip::System::PacketBuffer;
-    using WiFiSecurityType_t = ::chip::Profiles::NetworkProvisioning::WiFiSecurityType;
-
-    // ===== Members that implement the NetworkProvisioningServer abstract interface
-
-    NetworkProvisioningDelegate * _GetDelegate(void);
-    void _StartPendingScan(void);
-    bool _ScanInProgress(void);
-    void _OnPlatformEvent(const ChipDeviceEvent * event);
-
-    // ===== Members that override virtual methods on NetworkProvisioningDelegate
-
-    CHIP_ERROR HandleScanNetworks(uint8_t networkType) override;
-    CHIP_ERROR HandleAddNetwork(PacketBuffer * networkInfoTLV) override;
-    CHIP_ERROR HandleUpdateNetwork(PacketBuffer * networkInfoTLV) override;
-    CHIP_ERROR HandleRemoveNetwork(uint32_t networkId) override;
-    CHIP_ERROR HandleGetNetworks(uint8_t flags) override;
-    CHIP_ERROR HandleEnableNetwork(uint32_t networkId) override;
-    CHIP_ERROR HandleDisableNetwork(uint32_t networkId) override;
-    CHIP_ERROR HandleTestConnectivity(uint32_t networkId) override;
-    CHIP_ERROR HandleSetRendezvousMode(uint16_t rendezvousMode) override;
-
-    // ===== Members that override virtual methods on NetworkProvisioningServer
-
-    bool IsPairedToAccount(void) const override;
-
-    // ===== Members for use by the NetworkProvisioningServer implementation
-    //       (both generic and platform-specific).
-
-    enum State
-    {
-        kState_Idle                                    = 0x00,
-        kState_ScanNetworks_Pending                    = 0x01,
-        kState_ScanNetworks_InProgress                 = 0x02,
-        kState_TestConnectivity_WaitWiFiConnectivity   = 0x03,
-        kState_TestConnectivity_WaitThreadConnectivity = 0x03,
-    };
-
-    uint8_t mState;
-    uint8_t mScanNetworkType;
-    struct
-    {
-        uint32_t mStatusProfileId;
-        uint16_t mStatusCode;
-    } mTestConnectivityResult;
-
-    CHIP_ERROR DoInit(void);
-    int16_t GetCurrentOp(void) const;
-    CHIP_ERROR HandleAddUpdateNetwork(PacketBuffer * networkInfoTLV, bool add);
-    CHIP_ERROR HandleEnableDisableNetwork(uint32_t networkId, bool enable);
-    CHIP_ERROR ValidateWiFiStationProvision(const DeviceNetworkInfo & netInfo, uint32_t & statusProfileId, uint16_t & statusCode);
-    CHIP_ERROR ValidateThreadProvision(bool isUpdate, const DeviceNetworkInfo & netInfo, uint32_t & statusProfileId,
-                                       uint16_t & statusCode);
-    CHIP_ERROR SetThreadProvisionDefaults(bool isUpdate, DeviceNetworkInfo & netInfo);
-    void ContinueWiFiConnectivityTest(void);
-    void ContinueThreadConnectivityTest(void);
-    void HandleConnectivityTestSuccess(void);
-    static void HandleConnectivityTestTimeOut(::chip::System::Layer * aLayer, void * aAppState, ::chip::System::Error aError);
-
-private:
-    ImplClass * Impl() { return static_cast<ImplClass *>(this); }
-};
-
-// Instruct the compiler to instantiate the template only when explicitly told to do so.
-extern template class GenericNetworkProvisioningServerImpl<NetworkProvisioningServerImpl>;
-
-template <class ImplClass>
-inline ::chip::Profiles::NetworkProvisioning::NetworkProvisioningDelegate *
-GenericNetworkProvisioningServerImpl<ImplClass>::_GetDelegate(void)
-{
-    return this;
-}
-
-template <class ImplClass>
-inline int16_t GenericNetworkProvisioningServerImpl<ImplClass>::GetCurrentOp() const
-{
-    return (mCurOp != NULL) ? mCurOpType : -1;
-}
-
-template <class ImplClass>
-inline bool GenericNetworkProvisioningServerImpl<ImplClass>::_ScanInProgress(void)
-{
-    return mState == kState_ScanNetworks_InProgress;
-}
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
diff --git a/src/include/platform/internal/NetworkProvisioningServer.h b/src/include/platform/internal/NetworkProvisioningServer.h
deleted file mode 100644 (file)
index f5135a8..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *
- *    Copyright (c) 2020 Project CHIP Authors
- *    Copyright (c) 2018 Nest Labs, Inc.
- *    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 <platform/internal/CHIPDeviceLayerInternal.h>
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-class NetworkProvisioningServerImpl;
-
-/**
- * Provides network provisioning services for a CHIP Device.
- */
-class NetworkProvisioningServer
-{
-    using ImplClass = NetworkProvisioningServerImpl;
-
-public:
-    // Members for internal use by components within the CHIP Device Layer.
-
-    CHIP_ERROR Init(void);
-    // NetworkProvisioningDelegate * GetDelegate(void);
-    void StartPendingScan(void);
-    bool ScanInProgress(void);
-    void OnPlatformEvent(const CHIPDeviceEvent * event);
-
-protected:
-    // Construction/destruction limited to subclasses.
-    NetworkProvisioningServer()  = default;
-    ~NetworkProvisioningServer() = default;
-
-    // No copy, move or assignment.
-    NetworkProvisioningServer(const NetworkProvisioningServer &)  = delete;
-    NetworkProvisioningServer(const NetworkProvisioningServer &&) = delete;
-    NetworkProvisioningServer & operator=(const NetworkProvisioningServer &) = delete;
-};
-
-/**
- * Returns a reference to the public interface of the NetworkProvisioningServer singleton object.
- *
- * Internal components should use this to access features of the NetworkProvisioningServer object
- * that are common to all platforms.
- */
-extern NetworkProvisioningServer & NetworkProvisioningSvr();
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
-
-/* Include a header file containing the implementation of the NetworkProvisioningServer
- * object for the selected platform.
- */
-#ifdef EXTERNAL_NETWORKPROVISIONINGSERVERIMPL_HEADER
-#include EXTERNAL_NETWORKPROVISIONINGSERVERIMPL_HEADER
-#elif defined(CHIP_DEVICE_LAYER_TARGET)
-#define NETWORKPROVISIONINGSERVERIMPL_HEADER <platform/CHIP_DEVICE_LAYER_TARGET/NetworkProvisioningServerImpl.h>
-#include NETWORKPROVISIONINGSERVERIMPL_HEADER
-#endif // defined(CHIP_DEVICE_LAYER_TARGET)
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-inline CHIP_ERROR NetworkProvisioningServer::Init(void)
-{
-    return static_cast<ImplClass *>(this)->_Init();
-}
-
-inline void NetworkProvisioningServer::StartPendingScan(void)
-{
-    static_cast<ImplClass *>(this)->_StartPendingScan();
-}
-
-inline bool NetworkProvisioningServer::ScanInProgress(void)
-{
-    return static_cast<ImplClass *>(this)->_ScanInProgress();
-}
-
-inline void NetworkProvisioningServer::OnPlatformEvent(const CHIPDeviceEvent * event)
-{
-    static_cast<ImplClass *>(this)->_OnPlatformEvent(event);
-}
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
index e874ffb..c2b3c81 100644 (file)
@@ -543,6 +543,17 @@ INET_ERROR UDPEndPoint::SendMsg(const IPPacketInfo * pktInfo, System::PacketBuff
 
 #if CHIP_SYSTEM_CONFIG_USE_LWIP
 
+    if (!msg.HasSoleOwnership())
+    {
+        // when retaining a buffer, the caller expects the msg to be unmodified.
+        // LwIP stack will normally prepend the packet headers as the packet traverses
+        // the UDP/IP/netif layers, which normally modifies the packet. We need to clone
+        // msg into a fresh object in this case, and queues that for transmission, leaving
+        // the original msg available after return.
+        msg = msg.CloneData();
+        VerifyOrExit(!msg.IsNull(), res = INET_ERROR_NO_MEMORY);
+    }
+
     // Lock LwIP stack
     LOCK_TCPIP_CORE();
 
index 4e922ac..f94b9f1 100644 (file)
@@ -38,12 +38,12 @@ public:
     /**
      * @brief
      *   Called when a value is returned from the storage.
-     *   This is useful for GetKeyValue() API call.
+     *   This is useful for AsyncGetKeyValue() API call.
      *
      * @param[in] key Key for which the value is being returned
      * @param[in] value Value or nullptr if not found.
      */
-    virtual void OnValue(const char * key, const char * value) = 0;
+    virtual void OnPersistentStorageValue(const char * key, const char * value) = 0;
 
     /**
      * @brief
@@ -53,7 +53,7 @@ public:
      * @param[in] op Operation that was being performed on the key
      * @param[in] result CHIP_NO_ERROR or corresponding error code
      */
-    virtual void OnStatus(const char * key, Operation op, CHIP_ERROR result) = 0;
+    virtual void OnPersistentStorageStatus(const char * key, Operation op, CHIP_ERROR result) = 0;
 };
 
 class DLL_EXPORT PersistentStorageDelegate
@@ -68,7 +68,7 @@ public:
      *
      * @param[in] delegate The callback object
      */
-    virtual void SetDelegate(PersistentStorageResultDelegate * delegate) = 0;
+    virtual void SetStorageDelegate(PersistentStorageResultDelegate * delegate) = 0;
 
     /**
      * @brief
@@ -76,7 +76,7 @@ public:
      *
      * @param[in] key Key to lookup
      */
-    virtual void GetKeyValue(const char * key) = 0;
+    virtual void AsyncGetKeyValue(const char * key) = 0;
 
     /**
      * @brief
@@ -95,7 +95,7 @@ public:
      *                 The output size could be larger than input value. In
      *                 such cases, the user should allocate the buffer large
      *                 enough (>= output size), and call the API again.  In this
-     *                 case GetKeyValue will place as many bytes as it can in
+     *                 case SyncGetKeyValue will place as many bytes as it can in
      *                 the buffer and return CHIP_ERROR_NO_MEMORY.
      *
      *                 If value is null, the input size is treated as 0.
@@ -104,7 +104,7 @@ public:
      * @return CHIP_ERROR_NO_MEMORY if the input buffer is not big enough for
      *                              the value.
      */
-    virtual CHIP_ERROR GetKeyValue(const char * key, char * value, uint16_t & size) { return CHIP_ERROR_NOT_IMPLEMENTED; }
+    virtual CHIP_ERROR SyncGetKeyValue(const char * key, char * value, uint16_t & size) { return CHIP_ERROR_NOT_IMPLEMENTED; }
 
     /**
      * @brief
@@ -121,7 +121,7 @@ public:
      *                 such cases, the user should allocate the buffer large
      *                 enough (>= output length), and call the API again.
      */
-    virtual CHIP_ERROR GetKeyValue(const char * key, void * buffer, uint16_t & size) { return CHIP_ERROR_NOT_IMPLEMENTED; }
+    virtual CHIP_ERROR SyncGetKeyValue(const char * key, void * buffer, uint16_t & size) { return CHIP_ERROR_NOT_IMPLEMENTED; }
 
     /**
      * @brief
@@ -130,7 +130,7 @@ public:
      * @param[in] key Key to be set
      * @param[in] value Value to be set
      */
-    virtual void SetKeyValue(const char * key, const char * value) = 0;
+    virtual void AsyncSetKeyValue(const char * key, const char * value) = 0;
 
     /**
      * @brief
@@ -140,7 +140,7 @@ public:
      * @param[in] value Value to be set
      * @param[in] size Size of the Value
      */
-    virtual CHIP_ERROR SetKeyValue(const char * key, const void * value, uint16_t size) { return CHIP_ERROR_NOT_IMPLEMENTED; }
+    virtual CHIP_ERROR SyncSetKeyValue(const char * key, const void * value, uint16_t size) { return CHIP_ERROR_NOT_IMPLEMENTED; }
 
     /**
      * @brief
@@ -148,7 +148,7 @@ public:
      *
      * @param[in] key Key to be deleted
      */
-    virtual void DeleteKeyValue(const char * key) = 0;
+    virtual void AsyncDeleteKeyValue(const char * key) = 0;
 };
 
 } // namespace chip
index ba544d1..bec3eb9 100644 (file)
@@ -233,7 +233,7 @@ void ExchangeManager::OnMessageReceived(const PacketHeader & packetHeader, const
     UnsolicitedMessageHandler * matchingUMH = nullptr;
     bool sendAckAndCloseExchange            = false;
 
-    if (!IsMsgCounterSyncMessage(payloadHeader) && packetHeader.IsPeerGroupMsgIdNotSynchronized())
+    if (!IsMsgCounterSyncMessage(payloadHeader) && session.IsPeerGroupMsgIdNotSynchronized())
     {
         Transport::PeerConnectionState * state = mSessionMgr->GetPeerConnectionState(session);
         VerifyOrReturn(state != nullptr);
index e5451ad..784e7fd 100644 (file)
@@ -206,13 +206,11 @@ if (chip_device_platform != "none" && chip_device_platform != "external") {
       "../include/platform/internal/GenericConnectivityManagerImpl_NoWiFi.h",
       "../include/platform/internal/GenericConnectivityManagerImpl_Thread.h",
       "../include/platform/internal/GenericConnectivityManagerImpl_WiFi.h",
-      "../include/platform/internal/GenericNetworkProvisioningServerImpl.h",
       "../include/platform/internal/GenericPlatformManagerImpl.h",
       "../include/platform/internal/GenericPlatformManagerImpl_FreeRTOS.h",
       "../include/platform/internal/GenericPlatformManagerImpl_POSIX.h",
       "../include/platform/internal/GenericSoftwareUpdateManagerImpl.h",
       "../include/platform/internal/GenericSoftwareUpdateManagerImpl_BDX.h",
-      "../include/platform/internal/NetworkProvisioningServer.h",
       "../include/platform/internal/testing/ConfigUnitTest.h",
       "GeneralUtils.cpp",
       "Globals.cpp",
@@ -406,7 +404,6 @@ if (chip_device_platform != "none" && chip_device_platform != "external") {
         "ESP32/Logging.cpp",
         "ESP32/LwIPCoreLock.cpp",
         "ESP32/MdnsImpl.cpp",
-        "ESP32/NetworkProvisioningServerImpl.h",
         "ESP32/PlatformManagerImpl.cpp",
         "ESP32/PlatformManagerImpl.h",
         "ESP32/ServiceProvisioning.cpp",
@@ -437,7 +434,6 @@ if (chip_device_platform != "none" && chip_device_platform != "external") {
         "K32W/KeyValueStoreManagerImpl.cpp",
         "K32W/KeyValueStoreManagerImpl.h",
         "K32W/Logging.cpp",
-        "K32W/NetworkProvisioningServerImpl.h",
         "K32W/PlatformManagerImpl.cpp",
         "K32W/PlatformManagerImpl.h",
         "K32W/SoftwareUpdateManagerImpl.h",
index 3d1df68..a185e1b 100644 (file)
@@ -36,7 +36,7 @@ namespace Internal {
 using namespace chip::Ble;
 
 /**
- * Concrete implementation of the NetworkProvisioningServer singleton object for the EFR32 platforms.
+ * Concrete implementation of the BLEManager singleton object for the EFR32 platforms.
  */
 class BLEManagerImpl final : public BLEManager, private BleLayer, private BlePlatformDelegate, private BleApplicationDelegate
 {
index f28e9a2..f40246a 100644 (file)
 namespace chip {
 namespace DeviceLayer {
 
-namespace Internal {
-class NetworkProvisioningServerImpl;
-}
-
 /**
  * Concrete implementation of the ConfigurationManager singleton object for the EFR32 platform.
  */
@@ -66,7 +62,6 @@ private:
 
     // ===== Members for internal use by the following friends.
 
-    friend class Internal::NetworkProvisioningServerImpl;
     friend ConfigurationManager & ConfigurationMgr(void);
     friend ConfigurationManagerImpl & ConfigurationMgrImpl(void);
 
diff --git a/src/platform/EFR32/NetworkProvisioningServerImpl.cpp b/src/platform/EFR32/NetworkProvisioningServerImpl.cpp
deleted file mode 100644 (file)
index db311ec..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *
- *    Copyright (c) 2020 Project CHIP Authors
- *    Copyright (c) 2019 Nest Labs, Inc.
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- */
-/* this file behaves like a config.h, comes first */
-#include <platform/internal/CHIPDeviceLayerInternal.h>
-
-#include <platform/internal/NetworkProvisioningServer.h>
-
-#include <core/CHIPTLV.h>
-#include <platform/internal/DeviceNetworkInfo.h>
-#include <platform/internal/GenericNetworkProvisioningServerImpl.cpp>
-#include <protocols/Protocols.h>
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-NetworkProvisioningServerImpl NetworkProvisioningServerImpl::sInstance;
-
-CHIP_ERROR NetworkProvisioningServerImpl::_Init(void)
-{
-    return GenericNetworkProvisioningServerImpl<NetworkProvisioningServerImpl>::DoInit();
-}
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
diff --git a/src/platform/EFR32/NetworkProvisioningServerImpl.h b/src/platform/EFR32/NetworkProvisioningServerImpl.h
deleted file mode 100644 (file)
index 19f71ed..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *
- *    Copyright (c) 2020 Project CHIP Authors
- *    Copyright (c) 2019 Nest Labs, Inc.
- *
- *    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 <platform/internal/GenericNetworkProvisioningServerImpl.h>
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-/**
- * Concrete implementation of the NetworkProvisioningServer singleton object for the
- * Silicon Labs EFR32 platforms.
- */
-class NetworkProvisioningServerImpl final : public NetworkProvisioningServer,
-                                            public Internal::GenericNetworkProvisioningServerImpl<NetworkProvisioningServerImpl>
-{
-    // Allow the NetworkProvisioningServer interface class to delegate method calls to
-    // the implementation methods provided by this class.
-    friend class Internal::NetworkProvisioningServer;
-
-    // Allow the GenericNetworkProvisioningServerImpl base class to access helper methods
-    // and types defined on this class.
-    friend class Internal::GenericNetworkProvisioningServerImpl<NetworkProvisioningServerImpl>;
-
-private:
-    // ===== Members that implement the NetworkProvisioningServer public interface.
-
-    CHIP_ERROR _Init(void);
-
-    // ===== Members for internal use by the following friends.
-
-    friend ::chip::DeviceLayer::Internal::NetworkProvisioningServer & NetworkProvisioningSvr(void);
-    friend NetworkProvisioningServerImpl & NetworkProvisioningSvrImpl(void);
-
-    static NetworkProvisioningServerImpl sInstance;
-};
-
-/**
- * Returns a reference to the public interface of the NetworkProvisioningServer singleton object.
- *
- * Internal components should use this to access features of the NetworkProvisioningServer object
- * that are common to all platforms.
- */
-inline NetworkProvisioningServer & NetworkProvisioningSvr(void)
-{
-    return NetworkProvisioningServerImpl::sInstance;
-}
-
-/**
- * Returns the platform-specific implementation of the NetworkProvisioningServer singleton object.
- *
- * Internal components can use this to gain access to features of the NetworkProvisioningServer
- * that are specific to the ESP32 platform.
- */
-inline NetworkProvisioningServerImpl & NetworkProvisioningSvrImpl(void)
-{
-    return NetworkProvisioningServerImpl::sInstance;
-}
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
index 501f811..4ddebce 100644 (file)
@@ -34,6 +34,7 @@
 
 #include "em_device.h"
 #include "em_se.h"
+#include "sl_malloc.h"
 
 /**
  * Enable FreeRTOS threading support
 #define MBEDTLS_CIPHER_MODE_CTR
 #define MBEDTLS_TRNG_C
 
-/**
- * \def MBEDTLS_AES_ALT
- *
- * Enable hardware acceleration for the AES block cipher
- *
- * Module:  sl_crypto/src/crypto_aes.c for devices with CRYPTO
- *          sl_crypto/src/aes_aes.c for devices with AES
- *
- * See MBEDTLS_AES_C for more information.
- */
-#define MBEDTLS_AES_ALT
-
-#if defined(EFR32MG12)
-#define MBEDTLS_SHA1_C
-#define TRNG_PRESENT
-
-#if defined(CRYPTO_COUNT) && (CRYPTO_COUNT > 0)
-/**
- * \def MBEDTLS_ECP_INTERNAL_ALT
- * \def ECP_SHORTWEIERSTRASS
- * \def MBEDTLS_ECP_ADD_MIXED_ALT
- * \def MBEDTLS_ECP_DOUBLE_JAC_ALT
- * \def MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT
- * \def MBEDTLS_ECP_NORMALIZE_JAC_ALT
- *
- * Enable hardware acceleration for the elliptic curve over GF(p) library.
- *
- * Module:  sl_crypto/src/crypto_ecp.c
- * Caller:  library/ecp.c
- *
- * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_ECP_C and at least one
- * MBEDTLS_ECP_DP_XXX_ENABLED and (CRYPTO_COUNT > 0)
- */
-#define MBEDTLS_ECP_INTERNAL_ALT
-#define ECP_SHORTWEIERSTRASS
-#define MBEDTLS_ECP_ADD_MIXED_ALT
-#define MBEDTLS_ECP_DOUBLE_JAC_ALT
-#define MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT
-#define MBEDTLS_ECP_NORMALIZE_JAC_ALT
-#define MBEDTLS_ECP_RANDOMIZE_JAC_ALT
-
-/**
- * \def MBEDTLS_SHA1_ALT
- *
- * Enable hardware acceleration for the SHA-224 and SHA-256 cryptographic
- * hash algorithms.
- * Module: sl_crypto/src/crypto_sha.c
- * Caller: library/mbedtls_md.c
- *         library/ssl_cli.c
- *         library/ssl_srv.c
- *         library/ssl_tls.c
- *         library/x509write_crt.c
- *
- * Requires: MBEDTLS_SHA1_C and (CRYPTO_COUNT > 0)
- * See MBEDTLS_SHA1_C for more information.
- */
-#define MBEDTLS_SHA1_ALT
-
-/**
- * \def MBEDTLS_SHA256_ALT
- *
- * Enable hardware acceleration for the SHA-224 and SHA-256 cryptographic
- * hash algorithms.
- *
- * Module:  sl_crypto/src/crypto_sha.c
- * Caller:  library/entropy.c
- *          library/mbedtls_md.c
- *          library/ssl_cli.c
- *          library/ssl_srv.c
- *          library/ssl_tls.c
- *
- * Requires: MBEDTLS_SHA256_C and (CRYPTO_COUNT > 0)
- * See MBEDTLS_SHA256_C for more information.
- */
-#define MBEDTLS_SHA256_ALT
-#endif
-
-#elif defined(EFR32MG21)
-#define MBEDTLS_SHA1_ALT
-#define MBEDTLS_SHA1_PROCESS_ALT
-#define MBEDTLS_SHA256_ALT
-#define MBEDTLS_SHA256_PROCESS_ALT
-#define MBEDTLS_SHA512_ALT
-#define MBEDTLS_SHA512_PROCESS_ALT
-
-#define MBEDTLS_CCM_ALT
-#define MBEDTLS_CMAC_ALT
-
-/* Turning on ECC acceleration is dependant on not requiring curve25519 when
- * running on EFR32xG21A devices */
-#if (defined(_SILICON_LABS_SECURITY_FEATURE) && (_SILICON_LABS_SECURITY_FEATURE == _SILICON_LABS_SECURITY_FEATURE_VAULT)) ||       \
-    !defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
-#define MBEDTLS_ECDH_GEN_PUBLIC_ALT
-#define MBEDTLS_ECDSA_GENKEY_ALT
-#define MBEDTLS_ECDH_COMPUTE_SHARED_ALT
-#define MBEDTLS_ECDSA_SIGN_ALT
-#define MBEDTLS_ECDSA_VERIFY_ALT
-#endif /* EFR32xG21B or curve25519 not enabled */
-#endif // Familiy Selection
-
 #if defined(MBEDTLS_ECP_ALT) && !defined(MBEDTLS_ECP_RESTARTABLE)
 typedef void mbedtls_ecp_restart_ctx;
 #endif
@@ -164,71 +65,74 @@ typedef void mbedtls_ecp_restart_ctx;
 #define MBEDTLS_AES_ROM_TABLES
 #define MBEDTLS_ASN1_PARSE_C
 #define MBEDTLS_ASN1_WRITE_C
+#define MBEDTLS_BASE64_C
 #define MBEDTLS_BIGNUM_C
 #define MBEDTLS_CCM_C
 #define MBEDTLS_CIPHER_C
+#define MBEDTLS_CIPHER_MODE_CBC
+#define MBEDTLS_CIPHER_MODE_CFB
 #define MBEDTLS_CMAC_C
 #define MBEDTLS_CTR_DRBG_C
+#define MBEDTLS_ECDH_LEGACY_CONTEXT
+#define MBEDTLS_ECDSA_C
 #define MBEDTLS_ECJPAKE_C
 #define MBEDTLS_ECP_DP_SECP256R1_ENABLED
 #define MBEDTLS_ECP_NIST_OPTIM
+#define MBEDTLS_ENTROPY_FORCE_SHA256
 #define MBEDTLS_ENTROPY_HARDWARE_ALT
+#define MBEDTLS_ERROR_STRERROR_DUMMY
 #define MBEDTLS_HAVE_ASM
+#define MBEDTLS_HKDF_C
 #define MBEDTLS_HMAC_DRBG_C
+#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
 #define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
+#define MBEDTLS_KEY_EXCHANGE_PSK_ENABLED
 #define MBEDTLS_MD_C
 #define MBEDTLS_NO_PLATFORM_ENTROPY
+#define MBEDTLS_OID_C
+#define MBEDTLS_PEM_PARSE_C
+#define MBEDTLS_PEM_WRITE_C
 #define MBEDTLS_PK_C
 #define MBEDTLS_PK_PARSE_C
 #define MBEDTLS_PK_WRITE_C
+#define MBEDTLS_PKCS5_C
 #define MBEDTLS_PLATFORM_C
 #define MBEDTLS_PLATFORM_MEMORY
 #define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
+#define MBEDTLS_PSA_CRYPTO_C
+#define MBEDTLS_PSA_CRYPTO_CONFIG
+#define MBEDTLS_PSA_CRYPTO_DRIVERS
+#define MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS
+#define MBEDTLS_PSA_CRYPTO_STORAGE_C
 #define MBEDTLS_SHA256_SMALLER
+#define MBEDTLS_SHA512_C
 #define MBEDTLS_SSL_CLI_C
+#define MBEDTLS_SSL_COOKIE_C
 #define MBEDTLS_SSL_DTLS_ANTI_REPLAY
 #define MBEDTLS_SSL_DTLS_HELLO_VERIFY
 #define MBEDTLS_SSL_EXPORT_KEYS
+#define MBEDTLS_SSL_KEEP_PEER_CERTIFICATE
 #define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
 #define MBEDTLS_SSL_PROTO_TLS1_2
 #define MBEDTLS_SSL_PROTO_DTLS
+#define MBEDTLS_SSL_SRV_C
 #define MBEDTLS_SSL_TLS_C
-#define MBEDTLS_ERROR_STRERROR_DUMMY
-#define MBEDTLS_HKDF_C
 #define MBEDTLS_X509_CREATE_C
 #define MBEDTLS_X509_CSR_WRITE_C
-#define MBEDTLS_BASE64_C
-#define MBEDTLS_PEM_WRITE_C
-#define MBEDTLS_PKCS5_C
-
-#if OPENTHREAD_CONFIG_BORDER_AGENT_ENABLE || OPENTHREAD_CONFIG_COMMISSIONER_ENABLE || OPENTHREAD_CONFIG_COAP_SECURE_API_ENABLE
-#define MBEDTLS_SSL_COOKIE_C
-#define MBEDTLS_SSL_SRV_C
-#endif
-
-#if OPENTHREAD_CONFIG_COAP_SECURE_API_ENABLE
-#define MBEDTLS_KEY_EXCHANGE_PSK_ENABLED
-#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
-#endif
-
-#ifdef MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
-#define MBEDTLS_BASE64_C
-#define MBEDTLS_ECDSA_C
-#define MBEDTLS_OID_C
-#define MBEDTLS_PEM_PARSE_C
-#define MBEDTLS_X509_USE_C
+#define MBEDTLS_X509_CRL_PARSE_C
 #define MBEDTLS_X509_CRT_PARSE_C
-#endif
+#define MBEDTLS_X509_CSR_PARSE_C
+#define MBEDTLS_X509_USE_C
 
 #define MBEDTLS_MPI_WINDOW_SIZE 1       /**< Maximum windows size used. */
 #define MBEDTLS_MPI_MAX_SIZE 32         /**< Maximum number of bytes for usable MPIs. */
 #define MBEDTLS_ECP_MAX_BITS 256        /**< Maximum bit size of groups */
 #define MBEDTLS_ECP_WINDOW_SIZE 2       /**< Maximum window size used */
 #define MBEDTLS_ECP_FIXED_POINT_OPTIM 0 /**< Enable fixed-point speed-up */
-#define MBEDTLS_ENTROPY_MAX_SOURCES 1   /**< Maximum number of sources supported */
+#define MBEDTLS_ENTROPY_MAX_SOURCES 2   /**< Maximum number of sources supported */
 
-#define MBEDTLS_PLATFORM_STD_CALLOC calloc /**< Default allocator to use, can be undefined */
-#define MBEDTLS_PLATFORM_STD_FREE free     /**< Default free to use, can be undefined */
+#define MBEDTLS_PLATFORM_STD_CALLOC sl_calloc /**< Default allocator to use, can be undefined */
+#define MBEDTLS_PLATFORM_STD_FREE sl_free     /**< Default free to use, can be undefined */
 
 #if OPENTHREAD_CONFIG_COAP_SECURE_API_ENABLE
 #define MBEDTLS_SSL_MAX_CONTENT_LEN 900 /**< Maxium fragment length in bytes */
@@ -238,6 +142,5 @@ typedef void mbedtls_ecp_restart_ctx;
 
 #define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8
 
-#if defined(MBEDTLS_USER_CONFIG_FILE)
-#include MBEDTLS_USER_CONFIG_FILE
-#endif
+#include "config-device-acceleration.h"
+#include "mbedtls/check_config.h"
index 4fdc470..9d6c5be 100644 (file)
@@ -42,7 +42,7 @@ static volatile sl_bgapi_handler command_handler_func = NULL;
 
 // Bluetooth task
 #ifndef BLUETOOTH_STACK_SIZE
-#define BLUETOOTH_STACK_SIZE (2048)
+#define BLUETOOTH_STACK_SIZE (1024)
 #endif
 static void BluetoothTask(void * p_arg);
 static TaskHandle_t BluetoothTaskHandle = NULL;
@@ -53,7 +53,7 @@ extern uint32_t sli_bt_can_sleep_ticks();
 
 // Linklayer task
 #ifndef LINKLAYER_STACK_SIZE
-#define LINKLAYER_STACK_SIZE (2048)
+#define LINKLAYER_STACK_SIZE (1024)
 #endif
 static void LinklayerTask(void * p_arg);
 static TaskHandle_t LinklayerTaskHandle = NULL;
index 702a0ac..317daff 100644 (file)
@@ -60,7 +60,7 @@ namespace DeviceLayer {
 namespace Internal {
 
 /**
- * Concrete implementation of the NetworkProvisioningServer singleton object for the ESP32 platform.
+ * Concrete implementation of the BLEManager singleton object for the ESP32 platform.
  */
 class BLEManagerImpl final : public BLEManager,
                              private Ble::BleLayer,
index 162ff0b..71c30b8 100644 (file)
 namespace chip {
 namespace DeviceLayer {
 
-namespace Internal {
-class NetworkProvisioningServerImpl;
-}
-
 /**
  * Concrete implementation of the ConfigurationManager singleton object for the ESP32 platform.
  */
@@ -78,7 +74,6 @@ private:
 
     // ===== Members for internal use by the following friends.
 
-    friend class Internal::NetworkProvisioningServerImpl;
     friend ConfigurationManager & ConfigurationMgr(void);
     friend ConfigurationManagerImpl & ConfigurationMgrImpl(void);
 
index f698f38..9e41eb9 100644 (file)
@@ -41,14 +41,6 @@ namespace DeviceLayer {
 
 class PlatformManagerImpl;
 
-namespace Internal {
-
-class NetworkProvisioningServerImpl;
-template <class ImplClass>
-class GenericNetworkProvisioningServerImpl;
-
-} // namespace Internal
-
 /**
  * Concrete implementation of the ConnectivityManager singleton object for the ESP32 platform.
  */
diff --git a/src/platform/ESP32/NetworkProvisioningServerImpl.cpp b/src/platform/ESP32/NetworkProvisioningServerImpl.cpp
deleted file mode 100644 (file)
index 62ef89d..0000000
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- *
- *    Copyright (c) 2020-2021 Project CHIP Authors
- *    Copyright (c) 2018 Nest Labs, Inc.
- *    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.
- */
-/* this file behaves like a config.h, comes first */
-#include <platform/internal/CHIPDeviceLayerInternal.h>
-
-#include <platform/internal/GenericNetworkProvisioningServerImpl.cpp>
-#include <platform/internal/NetworkProvisioningServer.h>
-
-#include <core/CHIPTLV.h>
-#include <platform/ESP32/ESP32Utils.h>
-#include <platform/internal/DeviceNetworkInfo.h>
-#include <system/TLVPacketBufferBackingStore.h>
-
-#include "esp_event.h"
-#include "esp_wifi.h"
-
-using namespace ::chip;
-using namespace ::chip::TLV;
-
-using Profiles::kChipProfile_Common;
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-NetworkProvisioningServerImpl NetworkProvisioningServerImpl::sInstance;
-
-CHIP_ERROR NetworkProvisioningServerImpl::_Init(void)
-{
-    return GenericNetworkProvisioningServerImpl<NetworkProvisioningServerImpl>::DoInit();
-}
-
-void NetworkProvisioningServerImpl::_OnPlatformEvent(const ChipDeviceEvent * event)
-{
-    CHIP_ERROR err;
-
-    // Handle ESP system events...
-    if (event->Type == DeviceEventType::kESPSystemEvent)
-    {
-        switch (event->Platform.ESPSystemEvent.event_id)
-        {
-        case SYSTEM_EVENT_SCAN_DONE:
-            ChipLogProgress(DeviceLayer, "SYSTEM_EVENT_SCAN_DONE");
-            HandleScanDone();
-            break;
-        default:
-            break;
-        }
-    }
-
-    // Handle a change in WiFi connectivity...
-    else if (event->Type == DeviceEventType::kWiFiConnectivityChange)
-    {
-        // Whenever WiFi connectivity is established, update the persisted WiFi
-        // station security type to match that used by the connected AP.
-        if (event->WiFiConnectivityChange.Result == kConnectivity_Established)
-        {
-            wifi_ap_record_t ap_info;
-
-            err = esp_wifi_sta_get_ap_info(&ap_info);
-            SuccessOrExit(err);
-
-            WiFiSecurityType secType = ESP32Utils::WiFiAuthModeToChipWiFiSecurityType(ap_info.authmode);
-
-            err = ConfigurationMgrImpl().UpdateWiFiStationSecurityType(secType);
-            SuccessOrExit(err);
-        }
-    }
-
-    // Propagate the event to the GenericNetworkProvisioningServerImpl<> base class so
-    // that it can take action on specific events.
-    GenericImplClass::_OnPlatformEvent(event);
-
-exit:
-    return;
-}
-
-CHIP_ERROR NetworkProvisioningServerImpl::GetWiFiStationProvision(NetworkInfo & netInfo, bool includeCredentials)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-    wifi_config_t stationConfig;
-
-    netInfo.Reset();
-
-    err = esp_wifi_get_config(WIFI_IF_STA, &stationConfig);
-    SuccessOrExit(err);
-
-    VerifyOrExit(stationConfig.sta.ssid[0] != 0, err = CHIP_ERROR_INCORRECT_STATE);
-
-    netInfo.NetworkId              = kWiFiStationNetworkId;
-    netInfo.FieldPresent.NetworkId = true;
-    netInfo.NetworkType            = kNetworkType_WiFi;
-    memcpy(netInfo.WiFiSSID, stationConfig.sta.ssid, min(strlen((char *) stationConfig.sta.ssid) + 1, sizeof(netInfo.WiFiSSID)));
-    netInfo.WiFiMode = kWiFiMode_Managed;
-    netInfo.WiFiRole = kWiFiRole_Station;
-
-    err = ConfigurationMgrImpl().GetWiFiStationSecurityType(netInfo.WiFiSecurityType);
-    if (err == CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND)
-    {
-        err = CHIP_NO_ERROR;
-    }
-    SuccessOrExit(err);
-
-    if (includeCredentials)
-    {
-        netInfo.WiFiKeyLen = min(strlen((char *) stationConfig.sta.password), sizeof(netInfo.WiFiKey));
-        memcpy(netInfo.WiFiKey, stationConfig.sta.password, netInfo.WiFiKeyLen);
-    }
-
-exit:
-    return err;
-}
-
-CHIP_ERROR NetworkProvisioningServerImpl::SetWiFiStationProvision(const NetworkInfo & netInfo)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-    wifi_config_t wifiConfig;
-
-    // Ensure that ESP station mode is enabled.  This is required before esp_wifi_set_config(ESP_IF_WIFI_STA,...)
-    // can be called.
-    err = ESP32Utils::EnableStationMode();
-    SuccessOrExit(err);
-
-    // Initialize an ESP wifi_config_t structure based on the new provision information.
-    memset(&wifiConfig, 0, sizeof(wifiConfig));
-    memcpy(wifiConfig.sta.ssid, netInfo.WiFiSSID, min(strlen(netInfo.WiFiSSID) + 1, sizeof(wifiConfig.sta.ssid)));
-    memcpy(wifiConfig.sta.password, netInfo.WiFiKey, min((size_t) netInfo.WiFiKeyLen, sizeof(wifiConfig.sta.password)));
-    if (netInfo.WiFiSecurityType == kWiFiSecurityType_NotSpecified)
-    {
-        wifiConfig.sta.scan_method = WIFI_ALL_CHANNEL_SCAN;
-    }
-    else
-    {
-        wifiConfig.sta.scan_method    = WIFI_FAST_SCAN;
-        wifiConfig.sta.threshold.rssi = 0;
-        switch (netInfo.WiFiSecurityType)
-        {
-        case kWiFiSecurityType_None:
-            wifiConfig.sta.threshold.authmode = WIFI_AUTH_OPEN;
-            break;
-        case kWiFiSecurityType_WEP:
-            wifiConfig.sta.threshold.authmode = WIFI_AUTH_WEP;
-            break;
-        case kWiFiSecurityType_WPAPersonal:
-            wifiConfig.sta.threshold.authmode = WIFI_AUTH_WPA_PSK;
-            break;
-        case kWiFiSecurityType_WPA2Personal:
-            wifiConfig.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK;
-            break;
-        case kWiFiSecurityType_WPA2Enterprise:
-            wifiConfig.sta.threshold.authmode = WIFI_AUTH_WPA2_ENTERPRISE;
-            break;
-        default:
-            ExitNow(err = CHIP_ERROR_INVALID_ARGUMENT);
-        }
-    }
-    wifiConfig.sta.sort_method = WIFI_CONNECT_AP_BY_SIGNAL;
-
-    // Configure the ESP WiFi interface.
-    err = esp_wifi_set_config(WIFI_IF_STA, &wifiConfig);
-    if (err != ESP_OK)
-    {
-        ChipLogError(DeviceLayer, "esp_wifi_set_config() failed: %s", chip::ErrorStr(err));
-    }
-    SuccessOrExit(err);
-
-    // Store the WiFi Station security type separately in NVS.  This is necessary because the ESP wifi API
-    // does not provide a way to query the configured WiFi auth mode.
-    err = ConfigurationMgrImpl().UpdateWiFiStationSecurityType(netInfo.WiFiSecurityType);
-    SuccessOrExit(err);
-
-    ChipLogProgress(DeviceLayer, "WiFi station provision set (SSID: %s)", netInfo.WiFiSSID);
-
-exit:
-    return err;
-}
-
-CHIP_ERROR NetworkProvisioningServerImpl::ClearWiFiStationProvision(void)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-    wifi_config_t stationConfig;
-
-    // Clear the ESP WiFi station configuration.
-    memset(&stationConfig, 0, sizeof(stationConfig));
-    esp_wifi_set_config(WIFI_IF_STA, &stationConfig);
-
-    // Clear the persisted WiFi station security type.
-    ConfigurationMgrImpl().UpdateWiFiStationSecurityType(kWiFiSecurityType_NotSpecified);
-
-    return err;
-}
-
-CHIP_ERROR NetworkProvisioningServerImpl::InitiateWiFiScan(void)
-{
-    CHIP_ERROR err = CHIP_NO_ERROR;
-    wifi_scan_config_t scanConfig;
-
-    // Initiate an active scan using the default dwell times.  Configure the scan to return hidden networks.
-    memset(&scanConfig, 0, sizeof(scanConfig));
-    scanConfig.show_hidden = 1;
-    scanConfig.scan_type   = WIFI_SCAN_TYPE_ACTIVE;
-    err                    = esp_wifi_scan_start(&scanConfig, false);
-    SuccessOrExit(err);
-
-#if CHIP_DEVICE_CONFIG_WIFI_SCAN_COMPLETION_TIMEOUT
-    // Arm timer in case we never get the scan done event.
-    SystemLayer.StartTimer(CHIP_DEVICE_CONFIG_WIFI_SCAN_COMPLETION_TIMEOUT, HandleScanTimeOut, NULL);
-#endif // CHIP_DEVICE_CONFIG_WIFI_SCAN_COMPLETION_TIMEOUT
-
-exit:
-    return err;
-}
-
-void NetworkProvisioningServerImpl::HandleScanDone()
-{
-    CHIP_ERROR err;
-    wifi_ap_record_t * scanResults = NULL;
-    uint16_t scanResultCount;
-    uint16_t encodedResultCount;
-
-    // If we receive a SCAN DONE event for a scan that we didn't initiate, simply ignore it.
-    VerifyOrExit(mState == kState_ScanNetworks_InProgress, err = CHIP_NO_ERROR);
-
-    mState = kState_Idle;
-
-#if CHIP_DEVICE_CONFIG_WIFI_SCAN_COMPLETION_TIMEOUT
-    // Cancel the scan timeout timer.
-    SystemLayer.CancelTimer(HandleScanTimeOut, NULL);
-#endif // CHIP_DEVICE_CONFIG_WIFI_SCAN_COMPLETION_TIMEOUT
-
-    // Determine the number of scan results found.
-    err = esp_wifi_scan_get_ap_num(&scanResultCount);
-    SuccessOrExit(err);
-
-    // Only return up to CHIP_DEVICE_CONFIG_MAX_SCAN_NETWORKS_RESULTS.
-    scanResultCount = min(scanResultCount, (uint16_t) CHIP_DEVICE_CONFIG_MAX_SCAN_NETWORKS_RESULTS);
-
-    // Allocate a buffer to hold the scan results array.
-    scanResults = (wifi_ap_record_t *) chip::Platform::MemoryAlloc(scanResultCount * sizeof(wifi_ap_record_t));
-    VerifyOrExit(scanResults != NULL, err = CHIP_ERROR_NO_MEMORY);
-
-    // Collect the scan results from the ESP WiFi driver.  Note that this also *frees*
-    // the internal copy of the results.
-    err = esp_wifi_scan_get_ap_records(&scanResultCount, scanResults);
-    SuccessOrExit(err);
-
-    // If the ScanNetworks request is still outstanding...
-    if (GetCurrentOp() == kMsgType_ScanNetworks)
-    {
-        System::PacketBufferTLVWriter writer;
-        TLVType outerContainerType;
-
-        // Sort results by rssi.
-        qsort(scanResults, scanResultCount, sizeof(*scanResults), ESP32Utils::OrderScanResultsByRSSI);
-
-        // Allocate a packet buffer to hold the encoded scan results.
-        PacketBufferHandle respBuf =
-            System::PacketBufferHandle::New(PacketBuffer::kMaxSize - 1, System::PacketBuffer::kDefaultHeaderReserve + 1);
-        VerifyOrExit(!respBuf.IsNull(), err = CHIP_ERROR_NO_MEMORY);
-
-        // Encode the list of scan results into the response buffer.  If the encoded size of all
-        // the results exceeds the size of the buffer, encode only what will fit.
-        writer.Init(std::move(respBuf));
-        err = writer.StartContainer(AnonymousTag, kTLVType_Array, outerContainerType);
-        SuccessOrExit(err);
-        for (encodedResultCount = 0; encodedResultCount < scanResultCount; encodedResultCount++)
-        {
-            NetworkInfo netInfo;
-            const wifi_ap_record_t & scanResult = scanResults[encodedResultCount];
-
-            netInfo.Reset();
-            netInfo.NetworkType = kNetworkType_WiFi;
-            memcpy(netInfo.WiFiSSID, scanResult.ssid,
-                   min(strlen((char *) scanResult.ssid) + 1, (size_t) NetworkInfo::kMaxWiFiSSIDLength));
-            netInfo.WiFiSSID[NetworkInfo::kMaxWiFiSSIDLength] = 0;
-            netInfo.WiFiMode                                  = kWiFiMode_Managed;
-            netInfo.WiFiRole                                  = kWiFiRole_Station;
-            netInfo.WiFiSecurityType                          = ESP32Utils::WiFiAuthModeToChipWiFiSecurityType(scanResult.authmode);
-            netInfo.WirelessSignalStrength                    = scanResult.rssi;
-
-            {
-                chip::TLV::TLVWriter savePoint = writer;
-                err                            = netInfo.Encode(writer);
-                if (err == CHIP_ERROR_BUFFER_TOO_SMALL)
-                {
-                    writer = savePoint;
-                    break;
-                }
-            }
-            SuccessOrExit(err);
-        }
-        err = writer.EndContainer(outerContainerType);
-        SuccessOrExit(err);
-        err = writer.Finalize(&respBuf);
-        SuccessOrExit(err);
-
-        // Send the scan results to the requestor.  Note that this method takes ownership of the
-        // buffer, success or fail.
-        err = SendNetworkScanComplete(encodedResultCount, std::move(respBuf));
-        SuccessOrExit(err);
-    }
-
-exit:
-    // If an error occurred and we haven't yet responded, send a Internal Error back to the
-    // requestor.
-    if (err != CHIP_NO_ERROR && GetCurrentOp() == kMsgType_ScanNetworks)
-    {
-        SendStatusReport(kChipProfile_Common, kStatus_InternalError, err);
-    }
-
-    // Tell the ConnectivityManager that the WiFi scan is now done.  This allows it to continue
-    // any activities that were deferred while the scan was in progress.
-    ConnectivityMgr().OnWiFiScanDone();
-}
-
-#if CHIP_DEVICE_CONFIG_WIFI_SCAN_COMPLETION_TIMEOUT
-
-void NetworkProvisioningServerImpl::HandleScanTimeOut(::chip::System::Layer * aLayer, void * aAppState,
-                                                      ::chip::System::Error aError)
-{
-    ChipLogError(DeviceLayer, "WiFi scan timed out");
-
-    // Reset the state.
-    sInstance.mState = kState_Idle;
-
-    // Verify that the ScanNetworks request is still outstanding; if so, send a
-    // Common:InternalError StatusReport to the client.
-    if (sInstance.GetCurrentOp() == kMsgType_ScanNetworks)
-    {
-        sInstance.SendStatusReport(kChipProfile_Common, kStatus_InternalError, CHIP_ERROR_TIMEOUT);
-    }
-
-    // Tell the ConnectivityManager that the WiFi scan is now done.
-    ConnectivityMgr().OnWiFiScanDone();
-}
-
-#endif // CHIP_DEVICE_CONFIG_WIFI_SCAN_COMPLETION_TIMEOUT
-
-bool NetworkProvisioningServerImpl::IsSupportedWiFiSecurityType(WiFiSecurityType_t wifiSecType)
-{
-    return (wifiSecType == kWiFiSecurityType_None || wifiSecType == kWiFiSecurityType_WEP ||
-            wifiSecType == kWiFiSecurityType_WPAPersonal || wifiSecType == kWiFiSecurityType_WPA2Personal ||
-            wifiSecType == kWiFiSecurityType_WPA2Enterprise);
-}
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
diff --git a/src/platform/ESP32/NetworkProvisioningServerImpl.h b/src/platform/ESP32/NetworkProvisioningServerImpl.h
deleted file mode 100644 (file)
index 179be49..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *
- *    Copyright (c) 2020 Project CHIP Authors
- *    Copyright (c) 2018 Nest Labs, Inc.
- *    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 <platform/internal/GenericNetworkProvisioningServerImpl.h>
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-/**
- * Concrete implementation of the NetworkProvisioningServer singleton object for the ESP32 platform.
- */
-class NetworkProvisioningServerImpl final : public NetworkProvisioningServer,
-                                            public GenericNetworkProvisioningServerImpl<NetworkProvisioningServerImpl>
-{
-private:
-    using GenericImplClass = GenericNetworkProvisioningServerImpl<NetworkProvisioningServerImpl>;
-
-    // Allow the NetworkProvisioningServer interface class to delegate method calls to
-    // the implementation methods provided by this class.
-    friend class ::chip::DeviceLayer::Internal::NetworkProvisioningServer;
-
-    // Allow the GenericNetworkProvisioningServerImpl base class to access helper methods
-    // and types defined on this class.
-    friend class GenericNetworkProvisioningServerImpl<NetworkProvisioningServerImpl>;
-
-    // ===== Members that implement the NetworkProvisioningServer public interface.
-
-    CHIP_ERROR _Init(void);
-    void _OnPlatformEvent(const ChipDeviceEvent * event);
-
-    // NOTE: Other public interface methods are implemented by GenericNetworkProvisioningServerImpl<>.
-
-    // ===== Members used by GenericNetworkProvisioningServerImpl<> to invoke platform-specific
-    //       operations.
-
-    CHIP_ERROR GetWiFiStationProvision(NetworkInfo & netInfo, bool includeCredentials);
-    CHIP_ERROR SetWiFiStationProvision(const NetworkInfo & netInfo);
-    CHIP_ERROR ClearWiFiStationProvision(void);
-    CHIP_ERROR InitiateWiFiScan(void);
-    void HandleScanDone(void);
-    static NetworkProvisioningServerImpl & Instance(void);
-    static void HandleScanTimeOut(::chip::System::Layer * aLayer, void * aAppState, ::chip::System::Error aError);
-    static bool IsSupportedWiFiSecurityType(WiFiSecurityType_t wifiSecType);
-
-    // ===== Members for internal use by the following friends.
-
-    friend ::chip::DeviceLayer::Internal::NetworkProvisioningServer & NetworkProvisioningSvr(void);
-    friend NetworkProvisioningServerImpl & NetworkProvisioningSvrImpl(void);
-
-    static NetworkProvisioningServerImpl sInstance;
-};
-
-/**
- * Returns a reference to the public interface of the NetworkProvisioningServer singleton object.
- *
- * Internal components should use this to access features of the NetworkProvisioningServer object
- * that are common to all platforms.
- */
-inline NetworkProvisioningServer & NetworkProvisioningSvr(void)
-{
-    return NetworkProvisioningServerImpl::sInstance;
-}
-
-/**
- * Returns the platform-specific implementation of the NetworkProvisioningServer singleton object.
- *
- * Internal components can use this to gain access to features of the NetworkProvisioningServer
- * that are specific to the ESP32 platform.
- */
-inline NetworkProvisioningServerImpl & NetworkProvisioningSvrImpl(void)
-{
-    return NetworkProvisioningServerImpl::sInstance;
-}
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
index c31b9fb..7ae4e60 100644 (file)
@@ -52,7 +52,7 @@ namespace Internal {
 using namespace chip::Ble;
 
 /**
- * Concrete implementation of the NetworkProvisioningServer singleton object for the K32W platforms.
+ * Concrete implementation of the BLEManager singleton object for the K32W platforms.
  */
 class BLEManagerImpl final : public BLEManager, private BleLayer, private BlePlatformDelegate, private BleApplicationDelegate
 {
index 220581e..eb0f1c1 100644 (file)
 namespace chip {
 namespace DeviceLayer {
 
-namespace Internal {
-class NetworkProvisioningServerImpl;
-}
-
 /**
  * Concrete implementation of the ConfigurationManager singleton object for the K32W platform.
  */
@@ -66,7 +62,6 @@ private:
 
     // ===== Members for internal use by the following friends.
 
-    friend class Internal::NetworkProvisioningServerImpl;
     friend ConfigurationManager & ConfigurationMgr(void);
     friend ConfigurationManagerImpl & ConfigurationMgrImpl(void);
 
diff --git a/src/platform/K32W/NetworkProvisioningServerImpl.cpp b/src/platform/K32W/NetworkProvisioningServerImpl.cpp
deleted file mode 100644 (file)
index 936dad3..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *
- *    Copyright (c) 2020 Project CHIP Authors
- *    Copyright (c) 2020 Nest Labs, Inc.
- *    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.
- */
-/* this file behaves like a config.h, comes first */
-#include <platform/internal/CHIPDeviceLayerInternal.h>
-
-#include <platform/internal/GenericNetworkProvisioningServerImpl.cpp>
-#include <platform/internal/NetworkProvisioningServer.h>
-
-#include <core/CHIPTLV.h>
-#include <platform/internal/DeviceNetworkInfo.h>
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-NetworkProvisioningServerImpl NetworkProvisioningServerImpl::sInstance;
-
-CHIP_ERROR NetworkProvisioningServerImpl::_Init(void)
-{
-    return GenericNetworkProvisioningServerImpl<NetworkProvisioningServerImpl>::DoInit();
-}
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
diff --git a/src/platform/K32W/NetworkProvisioningServerImpl.h b/src/platform/K32W/NetworkProvisioningServerImpl.h
deleted file mode 100644 (file)
index 2e17e45..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *
- *    Copyright (c) 2020 Project CHIP Authors
- *    Copyright (c) 2020 Nest Labs, Inc.
- *    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 <platform/internal/GenericNetworkProvisioningServerImpl.h>
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-/**
- * Concrete implementation of the NetworkProvisioningServer singleton object for the
- * NXP K32W platforms.
- */
-class NetworkProvisioningServerImpl final : public NetworkProvisioningServer,
-                                            public Internal::GenericNetworkProvisioningServerImpl<NetworkProvisioningServerImpl>
-{
-    // Allow the NetworkProvisioningServer interface class to delegate method calls to
-    // the implementation methods provided by this class.
-    friend class ::chip::DeviceLayer::Internal::NetworkProvisioningServer;
-
-    // Allow the GenericNetworkProvisioningServerImpl base class to access helper methods
-    // and types defined on this class.
-    friend class GenericNetworkProvisioningServerImpl<NetworkProvisioningServerImpl>;
-
-private:
-    // ===== Members that implement the NetworkProvisioningServer public interface.
-
-    CHIP_ERROR _Init(void);
-
-    // ===== Members for internal use by the following friends.
-
-    friend ::chip::DeviceLayer::Internal::NetworkProvisioningServer & NetworkProvisioningSvr(void);
-    friend NetworkProvisioningServerImpl & NetworkProvisioningSvrImpl(void);
-
-    static NetworkProvisioningServerImpl sInstance;
-};
-
-/**
- * Returns a reference to the public interface of the NetworkProvisioningServer singleton object.
- *
- * Internal components should use this to access features of the NetworkProvisioningServer object
- * that are common to all platforms.
- */
-inline NetworkProvisioningServer & NetworkProvisioningSvr(void)
-{
-    return NetworkProvisioningServerImpl::sInstance;
-}
-
-/**
- * Returns the platform-specific implementation of the NetworkProvisioningServer singleton object.
- *
- * Internal components can use this to gain access to features of the NetworkProvisioningServer
- * that are specific to the K32W platform.
- */
-inline NetworkProvisioningServerImpl & NetworkProvisioningSvrImpl(void)
-{
-    return NetworkProvisioningServerImpl::sInstance;
-}
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
index 0f452ec..bb61299 100644 (file)
@@ -1705,7 +1705,7 @@ static gboolean UnsubscribeCharacteristicImpl(BluezConnection * connection)
     VerifyOrExit(connection != nullptr, ChipLogError(DeviceLayer, "BluezConnection is NULL in %s", __func__));
     VerifyOrExit(connection->mpC2 != nullptr, ChipLogError(DeviceLayer, "C2 is NULL in %s", __func__));
 
-    bluez_gatt_characteristic1_call_start_notify(connection->mpC2, nullptr, UnsubscribeCharacteristicDone, connection);
+    bluez_gatt_characteristic1_call_stop_notify(connection->mpC2, nullptr, UnsubscribeCharacteristicDone, connection);
 
 exit:
     return G_SOURCE_REMOVE;
index 8de51c4..483e85a 100644 (file)
@@ -34,7 +34,7 @@ namespace Internal {
 using namespace chip::Ble;
 
 /**
- * Concrete implementation of the NetworkProvisioningServer singleton object for the platform.
+ * Concrete implementation of the BLEManager singleton object for the platform.
  */
 class BLEManagerImpl final : public BLEManager, private BleLayer, private BlePlatformDelegate, private BleApplicationDelegate
 {
index e02c3aa..ab9a56d 100644 (file)
@@ -605,14 +605,34 @@ PacketBufferHandle PacketBufferHandle::PopHead()
     return PacketBufferHandle(head);
 }
 
-PacketBufferHandle PacketBufferHandle::CloneData(uint16_t aAdditionalSize, uint16_t aReservedSize)
+PacketBufferHandle PacketBufferHandle::CloneData()
 {
-    if (!mBuffer->Next().IsNull())
+    PacketBufferHandle cloneHead;
+
+    for (PacketBuffer * original = mBuffer; original != nullptr; original = static_cast<PacketBuffer *>(original->next))
     {
-        // We do not clone an entire chain.
-        return PacketBufferHandle();
+        uint16_t originalDataSize     = original->MaxDataLength();
+        uint16_t originalReservedSize = original->ReservedSize();
+        PacketBufferHandle clone      = PacketBufferHandle::New(originalDataSize, originalReservedSize);
+        if (clone.IsNull())
+        {
+            return PacketBufferHandle();
+        }
+        clone.mBuffer->tot_len = clone.mBuffer->len = original->len;
+        memcpy(reinterpret_cast<uint8_t *>(clone.mBuffer) + PacketBuffer::kStructureSize,
+               reinterpret_cast<uint8_t *>(original) + PacketBuffer::kStructureSize, originalDataSize + originalReservedSize);
+
+        if (cloneHead.IsNull())
+        {
+            cloneHead = std::move(clone);
+        }
+        else
+        {
+            cloneHead->AddToEnd(std::move(clone));
+        }
     }
-    return NewWithData(mBuffer->Start(), mBuffer->DataLength(), aAdditionalSize, aReservedSize);
+
+    return cloneHead;
 }
 
 } // namespace System
index 4847e11..f65b3cc 100644 (file)
@@ -380,6 +380,7 @@ private:
 #endif
 
     void AddRef();
+    bool HasSoleOwnership() const { return (this->ref == 1); }
     static void Free(PacketBuffer * aPacket);
     static PacketBuffer * FreeHead(PacketBuffer * aPacket);
 
@@ -475,6 +476,14 @@ public:
     bool IsNull() const { return mBuffer == nullptr; }
 
     /**
+     * Test whether the PacketBuffer owned by this PacketBufferHandle has unique ownership.
+     *
+     * @return \c true if the PacketBuffer owned by this PacketBufferHandle is solely owned; return \c false if
+     * it has more than one ownership.
+     */
+    bool HasSoleOwnership() const { return mBuffer->HasSoleOwnership(); }
+
+    /**
      *  Detach and return the head of a buffer chain while updating this handle to point to the remaining buffers.
      *  The current buffer must be the head of the chain.
      *
@@ -598,16 +607,11 @@ public:
                                           uint16_t aReservedSize = PacketBuffer::kDefaultHeaderReserve);
 
     /**
-     * Creates a copy of the data in this packet.
-     *
-     * Does NOT support chained buffers.
-     *
-     *  @param[in]  aAdditionalSize Size of additional application data space after the initial contents.
-     *  @param[in]  aReservedSize   Number of octets to reserve for protocol headers.
+     * Creates a copy of a packet buffer (or chain).
      *
-     * @returns empty handle on allocation failure.
+     * @returns empty handle on allocation failure. Otherwise, the returned buffer has the same sizes and contents as the original.
      */
-    PacketBufferHandle CloneData(uint16_t aAdditionalSize = 0, uint16_t aReservedSize = PacketBuffer::kDefaultHeaderReserve);
+    PacketBufferHandle CloneData();
 
     /**
      * Perform an implementation-defined check on the validity of a PacketBufferHandle.
index 2dbe1ec..cf39fd1 100644 (file)
@@ -67,6 +67,14 @@ using ::chip::System::pbuf;
 #define TO_LWIP_PBUF(x) (reinterpret_cast<struct pbuf *>(reinterpret_cast<void *>(x)))
 #define OF_LWIP_PBUF(x) (reinterpret_cast<PacketBuffer *>(reinterpret_cast<void *>(x)))
 
+namespace {
+void ScrambleData(uint8_t * start, uint16_t length)
+{
+    for (uint16_t i = 0; i < length; ++i)
+        ++start[i];
+}
+} // namespace
+
 /*
  * An instance of this class created for the test suite.
  * It is a friend class of `PacketBuffer` and `PacketBufferHandle` because some tests
@@ -120,6 +128,7 @@ public:
     static void CheckHandleHold(nlTestSuite * inSuite, void * inContext);
     static void CheckHandleAdvance(nlTestSuite * inSuite, void * inContext);
     static void CheckHandleRightSize(nlTestSuite * inSuite, void * inContext);
+    static void CheckHandleCloneData(nlTestSuite * inSuite, void * inContext);
     static void CheckPacketBufferWriter(nlTestSuite * inSuite, void * inContext);
     static void CheckBuildFreeList(nlTestSuite * inSuite, void * inContext);
 
@@ -1707,6 +1716,82 @@ void PacketBufferTest::CheckHandleRightSize(nlTestSuite * inSuite, void * inCont
 #endif // CHIP_SYSTEM_PACKETBUFFER_HAS_RIGHT_SIZE
 }
 
+void PacketBufferTest::CheckHandleCloneData(nlTestSuite * inSuite, void * inContext)
+{
+    struct TestContext * const theContext = static_cast<struct TestContext *>(inContext);
+    PacketBufferTest * const test         = theContext->test;
+    NL_TEST_ASSERT(inSuite, test->mContext == theContext);
+
+    uint8_t lPayload[2 * PacketBuffer::kMaxSizeWithoutReserve];
+    for (size_t i = 0; i < sizeof(lPayload); ++i)
+    {
+        lPayload[i] = static_cast<uint8_t>(random());
+    }
+
+    for (auto & config_1 : test->configurations)
+    {
+        for (auto & config_2 : test->configurations)
+        {
+            if (&config_1 == &config_2)
+            {
+                continue;
+            }
+
+            test->PrepareTestBuffer(&config_1);
+            test->PrepareTestBuffer(&config_2);
+
+            const uint8_t * payload_1 = lPayload;
+            memcpy(config_1.handle->Start(), payload_1, config_1.handle->MaxDataLength());
+            config_1.handle->SetDataLength(config_1.handle->MaxDataLength());
+
+            const uint8_t * payload_2 = lPayload + config_1.handle->MaxDataLength();
+            memcpy(config_2.handle->Start(), payload_2, config_2.handle->MaxDataLength());
+            config_2.handle->SetDataLength(config_2.handle->MaxDataLength());
+
+            // Clone single buffer.
+            PacketBufferHandle clone_1 = config_1.handle.CloneData();
+            NL_TEST_ASSERT(inSuite, !clone_1.IsNull());
+            NL_TEST_ASSERT(inSuite, clone_1->DataLength() == config_1.handle->DataLength());
+            NL_TEST_ASSERT(inSuite, memcmp(clone_1->Start(), payload_1, clone_1->DataLength()) == 0);
+            if (clone_1->DataLength())
+            {
+                // Verify that modifying the clone does not affect the original.
+                ScrambleData(clone_1->Start(), clone_1->DataLength());
+                NL_TEST_ASSERT(inSuite, memcmp(clone_1->Start(), payload_1, clone_1->DataLength()) != 0);
+                NL_TEST_ASSERT(inSuite, memcmp(config_1.handle->Start(), payload_1, config_1.handle->DataLength()) == 0);
+            }
+
+            // Clone buffer chain.
+            config_1.handle->AddToEnd(config_2.handle.Retain());
+            NL_TEST_ASSERT(inSuite, config_1.handle->HasChainedBuffer());
+            clone_1                         = config_1.handle.CloneData();
+            PacketBufferHandle clone_1_next = clone_1->Next();
+            NL_TEST_ASSERT(inSuite, !clone_1.IsNull());
+            NL_TEST_ASSERT(inSuite, clone_1->HasChainedBuffer());
+            NL_TEST_ASSERT(inSuite, clone_1->DataLength() == config_1.handle->DataLength());
+            NL_TEST_ASSERT(inSuite, clone_1->TotalLength() == config_1.handle->TotalLength());
+            NL_TEST_ASSERT(inSuite, clone_1_next->DataLength() == config_2.handle->DataLength());
+            NL_TEST_ASSERT(inSuite, memcmp(clone_1->Start(), payload_1, clone_1->DataLength()) == 0);
+            NL_TEST_ASSERT(inSuite, memcmp(clone_1_next->Start(), payload_2, clone_1_next->DataLength()) == 0);
+            if (clone_1->DataLength())
+            {
+                ScrambleData(clone_1->Start(), clone_1->DataLength());
+                NL_TEST_ASSERT(inSuite, memcmp(clone_1->Start(), payload_1, clone_1->DataLength()) != 0);
+                NL_TEST_ASSERT(inSuite, memcmp(config_1.handle->Start(), payload_1, config_1.handle->DataLength()) == 0);
+            }
+            if (clone_1_next->DataLength())
+            {
+                ScrambleData(clone_1_next->Start(), clone_1_next->DataLength());
+                NL_TEST_ASSERT(inSuite, memcmp(clone_1_next->Start(), payload_2, clone_1_next->DataLength()) != 0);
+                NL_TEST_ASSERT(inSuite, memcmp(config_2.handle->Start(), payload_2, config_2.handle->DataLength()) == 0);
+            }
+
+            config_1.handle = nullptr;
+            config_2.handle = nullptr;
+        }
+    }
+}
+
 void PacketBufferTest::CheckPacketBufferWriter(nlTestSuite * inSuite, void * inContext)
 {
     struct TestContext * const theContext = static_cast<struct TestContext *>(inContext);
@@ -1773,6 +1858,7 @@ const nlTest sTests[] =
     NL_TEST_DEF("PacketBuffer::HandleHold",             PacketBufferTest::CheckHandleHold),
     NL_TEST_DEF("PacketBuffer::HandleAdvance",          PacketBufferTest::CheckHandleAdvance),
     NL_TEST_DEF("PacketBuffer::HandleRightSize",        PacketBufferTest::CheckHandleRightSize),
+    NL_TEST_DEF("PacketBuffer::HandleCloneData",        PacketBufferTest::CheckHandleCloneData),
     NL_TEST_DEF("PacketBuffer::PacketBufferWriter",     PacketBufferTest::CheckPacketBufferWriter),
 
     NL_TEST_SENTINEL()
index 50fefd0..e3a7de9 100644 (file)
@@ -37,7 +37,7 @@ CHIP_ERROR AdminPairingInfo::StoreIntoKVS(PersistentStorageDelegate & kvs)
     info.mNodeId = Encoding::LittleEndian::HostSwap64(mNodeId);
     info.mAdmin  = Encoding::LittleEndian::HostSwap16(mAdmin);
 
-    return kvs.SetKeyValue(key, &info, sizeof(info));
+    return kvs.SyncSetKeyValue(key, &info, sizeof(info));
 }
 
 CHIP_ERROR AdminPairingInfo::FetchFromKVS(PersistentStorageDelegate & kvs)
@@ -48,7 +48,7 @@ CHIP_ERROR AdminPairingInfo::FetchFromKVS(PersistentStorageDelegate & kvs)
     StorableAdminPairingInfo info;
 
     uint16_t size = sizeof(info);
-    ReturnErrorOnFailure(kvs.GetKeyValue(key, &info, size));
+    ReturnErrorOnFailure(kvs.SyncGetKeyValue(key, &info, size));
 
     mNodeId    = Encoding::LittleEndian::HostSwap64(info.mNodeId);
     AdminId id = Encoding::LittleEndian::HostSwap16(info.mAdmin);
@@ -62,7 +62,7 @@ CHIP_ERROR AdminPairingInfo::DeleteFromKVS(PersistentStorageDelegate & kvs, Admi
     char key[KeySize()];
     ReturnErrorOnFailure(GenerateKey(id, key, sizeof(key)));
 
-    kvs.DeleteKeyValue(key);
+    kvs.AsyncDeleteKeyValue(key);
     return CHIP_NO_ERROR;
 }
 
index 8c4cad6..d8d749f 100644 (file)
@@ -87,6 +87,8 @@ CHIP_ERROR SecureSessionMgr::Init(NodeId localNodeId, System::Layer * systemLaye
 
 void SecureSessionMgr::Shutdown()
 {
+    CancelExpiryTimer();
+
     mState        = State::kNotReady;
     mLocalNodeId  = kUndefinedNodeId;
     mSystemLayer  = nullptr;
@@ -327,6 +329,7 @@ void SecureSessionMgr::OnMessageReceived(const PacketHeader & packetHeader, cons
     PacketBufferHandle origMsg;
     PayloadHeader payloadHeader;
 
+    bool peerGroupMsgIdNotSynchronized  = false;
     Transport::AdminPairingInfo * admin = nullptr;
 
     VerifyOrExit(!msg.IsNull(), ChipLogError(Inet, "Secure transport received NULL packet, discarding"));
@@ -375,14 +378,17 @@ void SecureSessionMgr::OnMessageReceived(const PacketHeader & packetHeader, cons
         // For all group messages, Set flag if peer group key message counter is not synchronized.
         if (ChipKeyId::IsAppGroupKey(packetHeader.GetEncryptionKeyID()))
         {
-            const_cast<PacketHeader &>(packetHeader).SetPeerGroupMsgIdNotSynchronized(true);
+            peerGroupMsgIdNotSynchronized = true;
         }
     }
 
     if (mCB != nullptr)
     {
-        mCB->OnMessageReceived(packetHeader, payloadHeader, { state->GetPeerNodeId(), state->GetPeerKeyID(), state->GetAdminId() },
-                               std::move(msg), this);
+        SecureSessionHandle session(state->GetPeerNodeId(), state->GetPeerKeyID(), state->GetAdminId());
+
+        session.SetPeerGroupMsgIdNotSynchronized(peerGroupMsgIdNotSynchronized);
+
+        mCB->OnMessageReceived(packetHeader, payloadHeader, session, std::move(msg), this);
     }
 
 exit:
index eeef685..64d4e57 100644 (file)
@@ -57,6 +57,9 @@ public:
     Transport::AdminId GetAdminId() const { return mAdmin; }
     void SetAdminId(Transport::AdminId adminId) { mAdmin = adminId; }
 
+    bool IsPeerGroupMsgIdNotSynchronized() const { return mPeerGroupMsgIdNotSynchronized; }
+    void SetPeerGroupMsgIdNotSynchronized(bool value) { mPeerGroupMsgIdNotSynchronized = value; }
+
     bool operator==(const SecureSessionHandle & that) const
     {
         return mPeerNodeId == that.mPeerNodeId && mPeerKeyId == that.mPeerKeyId && mAdmin == that.mAdmin;
@@ -74,6 +77,8 @@ private:
     //       to identify an approach that'll allow looking up the corresponding information for
     //       such sessions.
     Transport::AdminId mAdmin;
+
+    bool mPeerGroupMsgIdNotSynchronized = false;
 };
 
 /**
index f5ba0a7..5d5feb8 100644 (file)
@@ -34,7 +34,7 @@ CHIP_ERROR StorablePeerConnection::StoreIntoKVS(PersistentStorageDelegate & kvs)
     char key[KeySize()];
     ReturnErrorOnFailure(GenerateKey(mKeyId, key, sizeof(key)));
 
-    return kvs.SetKeyValue(key, &mSession, sizeof(mSession));
+    return kvs.SyncSetKeyValue(key, &mSession, sizeof(mSession));
 }
 
 CHIP_ERROR StorablePeerConnection::FetchFromKVS(PersistentStorageDelegate & kvs, uint16_t keyId)
@@ -43,7 +43,7 @@ CHIP_ERROR StorablePeerConnection::FetchFromKVS(PersistentStorageDelegate & kvs,
     ReturnErrorOnFailure(GenerateKey(keyId, key, sizeof(key)));
 
     uint16_t size = sizeof(mSession);
-    return kvs.GetKeyValue(key, &mSession, size);
+    return kvs.SyncGetKeyValue(key, &mSession, size);
 }
 
 CHIP_ERROR StorablePeerConnection::DeleteFromKVS(PersistentStorageDelegate & kvs, uint16_t keyId)
@@ -51,7 +51,7 @@ CHIP_ERROR StorablePeerConnection::DeleteFromKVS(PersistentStorageDelegate & kvs
     char key[KeySize()];
     ReturnErrorOnFailure(GenerateKey(keyId, key, sizeof(key)));
 
-    kvs.DeleteKeyValue(key);
+    kvs.AsyncDeleteKeyValue(key);
     return CHIP_NO_ERROR;
 }
 
index dfe8d8c..f6d93a1 100644 (file)
@@ -73,12 +73,6 @@ enum class ExFlagValues : uint8_t
     kExchangeFlag_VendorIdPresent = 0x10,
 };
 
-enum class InternalFlagValues : uint8_t
-{
-    // Header flag indicates that the peer's group key message counter is not synchronized.
-    kPeerGroupMsgIdNotSynchronized = 0x01,
-};
-
 enum class FlagValues : uint16_t
 {
     /// Header flag specifying that a destination node id is included in the header.
@@ -95,9 +89,8 @@ enum class FlagValues : uint16_t
 
 };
 
-using Flags         = BitFlags<FlagValues>;
-using ExFlags       = BitFlags<ExFlagValues>;
-using InternalFlags = BitFlags<InternalFlagValues>;
+using Flags   = BitFlags<FlagValues>;
+using ExFlags = BitFlags<ExFlagValues>;
 
 // Header is a 16-bit value of the form
 //  |  4 bit  | 4 bit |8 bit Security Flags|
@@ -149,12 +142,6 @@ public:
     /** Check if it's a secure session control message. */
     bool IsSecureSessionControlMsg() const { return mFlags.Has(Header::FlagValues::kSecureSessionControlMessage); }
 
-    /** Check if the peer's group key message counter is not synchronized. */
-    bool IsPeerGroupMsgIdNotSynchronized() const
-    {
-        return mInternalFlags.Has(Header::InternalFlagValues::kPeerGroupMsgIdNotSynchronized);
-    }
-
     Header::EncryptionType GetEncryptionType() const { return mEncryptionType; }
 
     PacketHeader & SetSecureSessionControlMsg(bool value)
@@ -163,12 +150,6 @@ public:
         return *this;
     }
 
-    PacketHeader & SetPeerGroupMsgIdNotSynchronized(bool value)
-    {
-        mInternalFlags.Set(Header::InternalFlagValues::kPeerGroupMsgIdNotSynchronized, value);
-        return *this;
-    }
-
     PacketHeader & SetSourceNodeId(NodeId id)
     {
         mSourceNodeId.SetValue(id);
@@ -328,9 +309,6 @@ private:
     /// Message flags read from the message.
     Header::Flags mFlags;
 
-    /// Message flags not encoded into the packet sent over wire.
-    Header::InternalFlags mInternalFlags;
-
     /// Represents encryption type used for encrypting current packet
     Header::EncryptionType mEncryptionType = Header::EncryptionType::kAESCCMTagLen16;
 };