[feature]Add dishwasher-app example for ASR platform (#28207)

* Add dishwasher-app example for ASR platform

* Restyled by clang-format

* Restyled by gn

* remove unuseful macro

* update document

* fix CI build error

* delete unuseful code

* remove chip:: prefixed

* Restyled by whitespace

* Restyled by clang-format

---------

Co-authored-by: Restyled.io <commits@restyled.io>
diff --git a/examples/dishwasher-app/asr/.gn b/examples/dishwasher-app/asr/.gn
new file mode 100755
index 0000000..8d75f1e
--- /dev/null
+++ b/examples/dishwasher-app/asr/.gn
@@ -0,0 +1,29 @@
+# Copyright (c) 2023 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build_overrides/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/dishwasher-app/asr/BUILD.gn b/examples/dishwasher-app/asr/BUILD.gn
new file mode 100755
index 0000000..2b0cc1e
--- /dev/null
+++ b/examples/dishwasher-app/asr/BUILD.gn
@@ -0,0 +1,131 @@
+# Copyright (c) 2023 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build_overrides/asr.gni")
+import("//build_overrides/build.gni")
+import("//build_overrides/chip.gni")
+import("${asr_sdk_build_root}/asr_sdk.gni")
+import("${build_root}/config/defaults.gni")
+import("${chip_root}/src/lib/lib.gni")
+import("${chip_root}/src/platform/device.gni")
+import("${chip_root}/third_party/asr/asr_executable.gni")
+
+import("cfg.gni")
+
+assert(current_os == "freertos")
+
+asr_project_dir = "${chip_root}/examples/dishwasher-app/asr"
+examples_plat_dir = "${chip_root}/examples/platform/asr"
+
+declare_args() {
+  # Dump memory usage at link time.
+  chip_print_memory_usage = false
+}
+
+asr_sdk_sources("dishwasher_app_sdk_sources") {
+  include_dirs = [
+    "${chip_root}/src/platform/ASR",
+    "${asr_project_dir}/include",
+    "${examples_plat_dir}",
+  ]
+
+  defines = [
+    "ASR_LOG_ENABLED=1",
+    "CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE=${setupPinCode}",
+    "CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR=${setupDiscriminator}",
+  ]
+
+  if (chip_enable_factory_data) {
+    defines += [
+      "CONFIG_ENABLE_ASR_FACTORY_DATA_PROVIDER=1",
+      "CONFIG_ENABLE_ASR_FACTORY_DEVICE_INFO_PROVIDER=1",
+    ]
+  }
+
+  if (chip_lwip_ip6_hook) {
+    defines += [
+      "CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT",
+      "CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT",
+    ]
+  }
+
+  sources = [ "${asr_project_dir}/include/CHIPProjectConfig.h" ]
+
+  public_configs = [ "${asr_sdk_build_root}:asr_sdk_config" ]
+}
+
+asr_executable("dishwasher_app") {
+  include_dirs = []
+  defines = []
+  output_name = "chip-asr-dishwasher-example.out"
+
+  sources = [
+    "${chip_root}/examples/dishwasher-app/dishwasher-common/src/operational-state-delegate-impl.cpp",
+    "${chip_root}/examples/dishwasher-app/dishwasher-common/src/operational-state-delegates.cpp",
+    "${examples_plat_dir}/CHIPDeviceManager.cpp",
+    "${examples_plat_dir}/LEDWidget.cpp",
+    "${examples_plat_dir}/init_Matter.cpp",
+    "${examples_plat_dir}/init_asrPlatform.cpp",
+    "${examples_plat_dir}/shell/matter_shell.cpp",
+    "src/AppTask.cpp",
+    "src/DeviceCallbacks.cpp",
+    "src/main.cpp",
+  ]
+
+  if (chip_enable_ota_requestor) {
+    sources += [ "${examples_plat_dir}/init_OTARequestor.cpp" ]
+  }
+
+  deps = [
+    ":dishwasher_app_sdk_sources",
+    "${chip_root}/examples/common/QRCode",
+    "${chip_root}/examples/dishwasher-app/dishwasher-common",
+    "${chip_root}/examples/providers:device_info_provider",
+    "${chip_root}/src/lib",
+    "${chip_root}/src/setup_payload",
+  ]
+
+  include_dirs += [
+    "include",
+    "${examples_plat_dir}",
+    "${asr_project_dir}/include",
+    "${chip_root}/src/lib",
+    "${chip_root}/examples/dishwasher-app/dishwasher-common/include",
+  ]
+
+  defines = [ "ASR_NETWORK_LAYER_BLE=${chip_config_network_layer_ble}" ]
+
+  if (chip_build_libshell) {
+    defines += [ "CONFIG_ENABLE_CHIP_SHELL=1" ]
+    sources += [ "${examples_plat_dir}/shell/launch_shell.cpp" ]
+    include_dirs += [ "${examples_plat_dir}/shell" ]
+  }
+
+  if (chip_print_memory_usage) {
+    ldflags += [
+      "-Wl,--print-memory-usage",
+      "-fstack-usage",
+    ]
+  }
+
+  output_dir = root_out_dir
+}
+
+group("asr") {
+  deps = [ ":dishwasher_app" ]
+}
+
+group("default") {
+  deps = [ ":asr" ]
+}
diff --git a/examples/dishwasher-app/asr/args.gni b/examples/dishwasher-app/asr/args.gni
new file mode 100755
index 0000000..b7599ea
--- /dev/null
+++ b/examples/dishwasher-app/asr/args.gni
@@ -0,0 +1,27 @@
+# Copyright (c) 2023 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build_overrides/chip.gni")
+import("//build_overrides/pigweed.gni")
+import("//cfg.gni")
+import("${chip_root}/src/platform/ASR/args.gni")
+
+asr_target_project =
+    get_label_info(":dishwasher_app_sdk_sources", "label_no_toolchain")
+
+declare_args() {
+  # Disable lock tracking, since our FreeRTOS configuration does not set
+  # INCLUDE_xSemaphoreGetMutexHolder
+  chip_stack_lock_tracking = "none"
+}
diff --git a/examples/dishwasher-app/asr/build_overrides b/examples/dishwasher-app/asr/build_overrides
new file mode 120000
index 0000000..194ee0b
--- /dev/null
+++ b/examples/dishwasher-app/asr/build_overrides
@@ -0,0 +1 @@
+../../build_overrides/
\ No newline at end of file
diff --git a/examples/dishwasher-app/asr/cfg.gni b/examples/dishwasher-app/asr/cfg.gni
new file mode 100755
index 0000000..15fe50e
--- /dev/null
+++ b/examples/dishwasher-app/asr/cfg.gni
@@ -0,0 +1,23 @@
+# Copyright (c) 2023 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+declare_args() {
+  chip_enable_factory_data = false
+
+  chip_lwip_ip6_hook = false
+
+  setupPinCode = 20202021
+
+  setupDiscriminator = 3840
+}
diff --git a/examples/dishwasher-app/asr/include/AppConfig.h b/examples/dishwasher-app/asr/include/AppConfig.h
new file mode 100644
index 0000000..d475e4c
--- /dev/null
+++ b/examples/dishwasher-app/asr/include/AppConfig.h
@@ -0,0 +1,45 @@
+/*
+ *
+ *    Copyright (c) 2023 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#pragma once
+
+// ---- Dishwasher Example App Config ----
+
+#if (CFG_EASY_LOG_ENABLE == 1)
+#include "elog.h"
+#endif
+
+#define APP_TASK_NAME "APP"
+
+#define APP_TASK_STACK_SIZE (1024 * 4)
+
+#define MATTER_DEVICE_NAME "Dishwasher"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void appError(int err);
+void ASR_LOG(const char * aFormat, ...);
+
+#ifdef __cplusplus
+}
+
+#include <lib/core/CHIPError.h>
+void appError(CHIP_ERROR error);
+#endif
diff --git a/examples/dishwasher-app/asr/include/AppTask.h b/examples/dishwasher-app/asr/include/AppTask.h
new file mode 100644
index 0000000..138c1b7
--- /dev/null
+++ b/examples/dishwasher-app/asr/include/AppTask.h
@@ -0,0 +1,43 @@
+/*
+ *
+ *    Copyright (c) 2023 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#pragma once
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#include <lega_rtos_api.h>
+#include <platform/CHIPDeviceLayer.h>
+
+class AppTask
+{
+
+public:
+    CHIP_ERROR StartAppTask();
+    static void AppTaskMain(void * pvParameter);
+
+private:
+    friend AppTask & GetAppTask(void);
+
+    static AppTask sAppTask;
+};
+
+inline AppTask & GetAppTask(void)
+{
+    return AppTask::sAppTask;
+}
diff --git a/examples/dishwasher-app/asr/include/CHIPProjectConfig.h b/examples/dishwasher-app/asr/include/CHIPProjectConfig.h
new file mode 100755
index 0000000..38ba84f
--- /dev/null
+++ b/examples/dishwasher-app/asr/include/CHIPProjectConfig.h
@@ -0,0 +1,111 @@
+/*
+ *
+ *    Copyright (c) 2023 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+/**
+ *    @file
+ *          Example project configuration file for CHIP.
+ *
+ *          This is a place to put application or project-specific overrides
+ *          to the default configuration values for general CHIP features.
+ *
+ */
+
+#pragma once
+
+/**
+ * CHIP_DEVICE_CONFIG_ENABLE_TEST_DEVICE_IDENTITY
+ *
+ * Enables the use of a hard-coded default Chip device id and credentials if no device id
+ * is found in Chip NV storage.
+ *
+ * This option is for testing only and should be disabled in production releases.
+ */
+#define CHIP_DEVICE_CONFIG_ENABLE_TEST_DEVICE_IDENTITY 34
+
+// Use a default pairing code if one hasn't been provisioned in flash.
+#ifndef CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE
+#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE 20202021
+#endif
+
+#ifndef CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR
+#define CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR 0xF00
+#endif
+
+// define Device type based on the application
+#define CHIP_DEVICE_CONFIG_DEVICE_TYPE 117 // 0x0075 Dishwasher
+
+// For convenience, Chip Security Test Mode can be enabled and the
+// requirement for authentication in various protocols can be disabled.
+//
+//    WARNING: These options make it possible to circumvent basic Chip security functionality,
+//    including message encryption. Because of this they MUST NEVER BE ENABLED IN PRODUCTION BUILDS.
+//
+#define CHIP_CONFIG_SECURITY_TEST_MODE 0
+
+/**
+ * CHIP_DEVICE_CONFIG_DEVICE_HARDWARE_VERSION
+ *
+ * The hardware version number assigned to device or product by the device vendor.  This
+ * number is scoped to the device product id, and typically corresponds to a revision of the
+ * physical device, a change to its packaging, and/or a change to its marketing presentation.
+ * This value is generally *not* incremented for device software versions.
+ */
+#define CHIP_DEVICE_CONFIG_DEVICE_HARDWARE_VERSION 1
+
+/**
+ * CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING
+ *
+ * A string identifying the software version running on the device.
+ * CHIP service currently expects the software version to be in the format
+ * {MAJOR_VERSION}.0d{MINOR_VERSION}
+ */
+#ifndef CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING
+#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING "1.0"
+#endif
+
+/**
+ * CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION
+ *
+ * A uint32_t identifying the software version running on the device.
+ */
+/* The SoftwareVersion attribute of the Basic cluster. */
+#ifndef CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION
+#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION 1
+#endif
+
+/**
+ * CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER
+ *
+ * Enables the use of a hard-coded default serial number if none
+ * is found in Chip NV storage.
+ */
+#define CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER "TEST_SN"
+
+/**
+ * CHIP_CONFIG_EVENT_LOGGING_UTC_TIMESTAMPS
+ *
+ * Enable recording UTC timestamps.
+ */
+#define CHIP_CONFIG_EVENT_LOGGING_UTC_TIMESTAMPS 1
+
+/**
+ * CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE
+ *
+ * A size, in bytes, of the individual debug event logging buffer.
+ */
+#define CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE (512)
diff --git a/examples/dishwasher-app/asr/include/DeviceCallbacks.h b/examples/dishwasher-app/asr/include/DeviceCallbacks.h
new file mode 100644
index 0000000..dcd7180
--- /dev/null
+++ b/examples/dishwasher-app/asr/include/DeviceCallbacks.h
@@ -0,0 +1,40 @@
+/*
+ *
+ *    Copyright (c) 2023 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+/**
+ * @file DeviceCallbacks.h
+ *
+ * Implementations for the DeviceManager callbacks for this application
+ *
+ **/
+
+#pragma once
+
+#include "CHIPDeviceManager.h"
+#include <app/util/af-types.h>
+#include <app/util/basic-types.h>
+#include <platform/CHIPDeviceLayer.h>
+
+class DeviceCallbacks : public chip::DeviceManager::CHIPDeviceManagerCallbacks
+{
+public:
+    virtual void DeviceEventCallback(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg) override;
+
+private:
+    void OnInternetConnectivityChange(const chip::DeviceLayer::ChipDeviceEvent * event);
+};
diff --git a/examples/dishwasher-app/asr/src/AppTask.cpp b/examples/dishwasher-app/asr/src/AppTask.cpp
new file mode 100644
index 0000000..d2d8d0c
--- /dev/null
+++ b/examples/dishwasher-app/asr/src/AppTask.cpp
@@ -0,0 +1,112 @@
+/*
+ *
+ *    Copyright (c) 2023 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#include "AppTask.h"
+#include "AppConfig.h"
+#include "CHIPDeviceManager.h"
+#include "DeviceCallbacks.h"
+#include "operational-state-delegates.h"
+#include "qrcodegen.h"
+#include <app/server/OnboardingCodesUtil.h>
+#include <app/util/attribute-storage.h>
+#include <assert.h>
+#include <platform/CHIPDeviceLayer.h>
+#include <setup_payload/QRCodeSetupPayloadGenerator.h>
+#include <setup_payload/SetupPayload.h>
+
+#include <app/clusters/network-commissioning/network-commissioning.h>
+#include <platform/ASR/NetworkCommissioningDriver.h>
+
+#include "init_Matter.h"
+#if CONFIG_ENABLE_CHIP_SHELL
+#include "matter_shell.h"
+#endif
+#include <app-common/zap-generated/attributes/Accessors.h>
+
+namespace {
+lega_thread_t sAppTaskHandle;
+} // namespace
+
+using namespace ::chip;
+using namespace ::chip::Credentials;
+using namespace ::chip::DeviceManager;
+using namespace ::chip::DeviceLayer;
+using namespace ::chip::System;
+
+AppTask AppTask::sAppTask;
+
+namespace {
+constexpr EndpointId kNetworkCommissioningEndpointMain      = 0;
+constexpr EndpointId kNetworkCommissioningEndpointSecondary = 0xFFFE;
+
+app::Clusters::NetworkCommissioning::Instance
+    sWiFiNetworkCommissioningInstance(kNetworkCommissioningEndpointMain /* Endpoint Id */,
+                                      &(NetworkCommissioning::ASRWiFiDriver::GetInstance()));
+} // namespace
+
+void NetWorkCommissioningInstInit()
+{
+    sWiFiNetworkCommissioningInstance.Init();
+
+    // We only have network commissioning on endpoint 0.
+    emberAfEndpointEnableDisable(kNetworkCommissioningEndpointSecondary, false);
+}
+
+static DeviceCallbacks EchoCallbacks;
+
+CHIP_ERROR AppTask::StartAppTask()
+{
+    // Start App task.
+    OSStatus result = lega_rtos_create_thread(&sAppTaskHandle, 2, APP_TASK_NAME, (lega_thread_function_t) AppTaskMain,
+                                              APP_TASK_STACK_SIZE, (lega_thread_arg_t) this);
+    return (result == kNoErr) ? CHIP_NO_ERROR : CHIP_APPLICATION_ERROR(0x02);
+}
+
+void AppTask::AppTaskMain(void * pvParameter)
+{
+    ASR_LOG("App Task started");
+
+    if (MatterInitializer::Init_Matter_Stack(MATTER_DEVICE_NAME) != CHIP_NO_ERROR)
+        appError(CHIP_ERROR_INTERNAL);
+
+    CHIPDeviceManager & deviceMgr = CHIPDeviceManager::GetInstance();
+
+    if (deviceMgr.Init(&EchoCallbacks) != CHIP_NO_ERROR)
+        appError(CHIP_ERROR_INTERNAL);
+
+    if (MatterInitializer::Init_Matter_Server() != CHIP_NO_ERROR)
+        appError(CHIP_ERROR_INTERNAL);
+
+    NetWorkCommissioningInstInit();
+
+    ASR_LOG("Current Firmware Version: %s", CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING);
+
+    ConfigurationMgr().LogDeviceConfig();
+
+    // Print setup info
+#if CONFIG_NETWORK_LAYER_BLE
+    PrintOnboardingCodes(RendezvousInformationFlag(RendezvousInformationFlag::kBLE));
+#else
+    PrintOnboardingCodes(RendezvousInformationFlag(RendezvousInformationFlag::kOnNetwork));
+#endif /* CONFIG_NETWORK_LAYER_BLE */
+
+    /*Operational State Server Init*/
+    MatterOperationalStateServerInit();
+    /* Delete task */
+    lega_rtos_delete_thread(NULL);
+}
diff --git a/examples/dishwasher-app/asr/src/DeviceCallbacks.cpp b/examples/dishwasher-app/asr/src/DeviceCallbacks.cpp
new file mode 100644
index 0000000..23e6de9
--- /dev/null
+++ b/examples/dishwasher-app/asr/src/DeviceCallbacks.cpp
@@ -0,0 +1,122 @@
+/*
+ *
+ *    Copyright (c) 2020 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+/**
+ * @file DeviceCallbacks.cpp
+ *
+ * Implements all the callbacks to the application from the CHIP Stack
+ *
+ **/
+#include "DeviceCallbacks.h"
+#include "AppConfig.h"
+#include "CHIPDeviceManager.h"
+#include "init_OTARequestor.h"
+#include <app-common/zap-generated/attributes/Accessors.h>
+#include <app-common/zap-generated/ids/Attributes.h>
+#include <app-common/zap-generated/ids/Clusters.h>
+#include <app/CommandHandler.h>
+#include <app/server/Dnssd.h>
+#include <app/util/af.h>
+#include <app/util/basic-types.h>
+#include <app/util/util.h>
+#include <lib/dnssd/Advertiser.h>
+#include <support/CodeUtils.h>
+#include <support/logging/CHIPLogging.h>
+#include <support/logging/Constants.h>
+#if defined CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT || defined CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT
+#include "route_hook/asr_route_hook.h"
+#endif
+
+using namespace ::chip;
+using namespace ::chip::Inet;
+using namespace ::chip::System;
+using namespace ::chip::DeviceLayer;
+using namespace ::chip::DeviceManager;
+using namespace ::chip::Logging;
+
+#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR
+constexpr uint32_t kInitOTARequestorDelaySec = 3;
+
+void InitOTARequestorHandler(System::Layer * systemLayer, void * appState)
+{
+    OTAInitializer::Instance().InitOTARequestor();
+}
+#endif
+void DeviceCallbacks::DeviceEventCallback(const ChipDeviceEvent * event, intptr_t arg)
+{
+    switch (event->Type)
+    {
+    case DeviceEventType::kInternetConnectivityChange:
+        OnInternetConnectivityChange(event);
+        break;
+
+    case DeviceEventType::kInterfaceIpAddressChanged:
+        if ((event->InterfaceIpAddressChanged.Type == InterfaceIpChangeType::kIpV4_Assigned) ||
+            (event->InterfaceIpAddressChanged.Type == InterfaceIpChangeType::kIpV6_Assigned))
+        {
+            // MDNS server restart on any ip assignment: if link local ipv6 is configured, that
+            // will not trigger a 'internet connectivity change' as there is no internet
+            // connectivity. MDNS still wants to refresh its listening interfaces to include the
+            // newly selected address.
+            app::DnssdServer::Instance().StartServer();
+
+            if (event->InterfaceIpAddressChanged.Type == InterfaceIpChangeType::kIpV6_Assigned)
+            {
+#if defined CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT || defined CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT
+                ChipLogProgress(NotSpecified, "Initializing route hook...");
+                asr_route_hook_init();
+#endif
+            }
+        }
+        break;
+    }
+}
+
+void DeviceCallbacks::OnInternetConnectivityChange(const ChipDeviceEvent * event)
+{
+#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR
+    static bool isOTAInitialized = false;
+#endif
+    if (event->InternetConnectivityChange.IPv4 == kConnectivity_Established)
+    {
+        ASR_LOG("IPv4 Server ready...");
+        app::DnssdServer::Instance().StartServer();
+    }
+    else if (event->InternetConnectivityChange.IPv4 == kConnectivity_Lost)
+    {
+        ASR_LOG("Lost IPv4 connectivity...");
+    }
+    if (event->InternetConnectivityChange.IPv6 == kConnectivity_Established)
+    {
+        ASR_LOG("IPv6 Server ready...");
+        app::DnssdServer::Instance().StartServer();
+#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR
+        // Init OTA requestor only when we have gotten IPv6 address
+        if (!isOTAInitialized)
+        {
+            DeviceLayer::SystemLayer().StartTimer(System::Clock::Seconds32(kInitOTARequestorDelaySec), InitOTARequestorHandler,
+                                                  nullptr);
+            isOTAInitialized = true;
+        }
+#endif
+    }
+    else if (event->InternetConnectivityChange.IPv6 == kConnectivity_Lost)
+    {
+        ASR_LOG("Lost IPv6 connectivity...");
+    }
+}
diff --git a/examples/dishwasher-app/asr/src/main.cpp b/examples/dishwasher-app/asr/src/main.cpp
new file mode 100644
index 0000000..31c3543
--- /dev/null
+++ b/examples/dishwasher-app/asr/src/main.cpp
@@ -0,0 +1,92 @@
+/*
+ *
+ *    Copyright (c) 2023 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+#include <FreeRTOS.h>
+#include <lib/support/CHIPMem.h>
+#include <lib/support/CHIPPlatformMemory.h>
+#include <platform/CHIPDeviceLayer.h>
+#include <platform/KeyValueStoreManager.h>
+#include <task.h>
+
+#include <AppTask.h>
+
+#include "AppConfig.h"
+#include "init_asrPlatform.h"
+#include <app/server/Server.h>
+
+using namespace ::chip;
+using namespace ::chip::Inet;
+using namespace ::chip::DeviceLayer;
+
+volatile int apperror_cnt;
+// ================================================================================
+// App Error
+//=================================================================================
+void appError(int err)
+{
+    ASR_LOG("!!!!!!!!!!!! App Critical Error: %d !!!!!!!!!!!", err);
+    lega_rtos_declare_critical();
+    lega_rtos_enter_critical();
+    while (1)
+        ;
+}
+
+void appError(CHIP_ERROR error)
+{
+    appError(static_cast<int>(error.AsInteger()));
+}
+
+// ================================================================================
+// FreeRTOS Callbacks
+// ================================================================================
+extern "C" void vApplicationIdleHook(void)
+{
+    // FreeRTOS Idle callback
+}
+
+// ================================================================================
+// Main Code
+// ================================================================================
+int main(void)
+{
+    init_asrPlatform();
+
+    CHIP_ERROR ret = GetAppTask().StartAppTask();
+    if (ret != CHIP_NO_ERROR)
+    {
+        ASR_LOG("GetAppTask().Init() failed");
+        appError(ret);
+    }
+    /* Start the FreeRTOS scheduler */
+    vTaskStartScheduler();
+
+    chip::Platform::MemoryShutdown();
+    PlatformMgr().StopEventLoopTask();
+    PlatformMgr().Shutdown();
+
+    // Should never get here.
+    ASR_LOG("vTaskStartScheduler() failed");
+    appError(ret);
+}
diff --git a/examples/dishwasher-app/asr/third_party/connectedhomeip b/examples/dishwasher-app/asr/third_party/connectedhomeip
new file mode 120000
index 0000000..11a54ed
--- /dev/null
+++ b/examples/dishwasher-app/asr/third_party/connectedhomeip
@@ -0,0 +1 @@
+../../../../
\ No newline at end of file
diff --git a/scripts/build/build/targets.py b/scripts/build/build/targets.py
index 6be42b1..b6bb80b 100755
--- a/scripts/build/build/targets.py
+++ b/scripts/build/build/targets.py
@@ -433,6 +433,7 @@
         TargetPart('temperature-measurement', app=ASRApp.TEMPERATURE_MEASUREMENT),
         TargetPart('thermostat', app=ASRApp.THERMOSTAT),
         TargetPart('ota-requestor', app=ASRApp.OTA_REQUESTOR),
+        TargetPart('dishwasher', app=ASRApp.DISHWASHER),
     ])
 
     # modifiers
diff --git a/scripts/build/builders/asr.py b/scripts/build/builders/asr.py
index bf85686..98062b3 100644
--- a/scripts/build/builders/asr.py
+++ b/scripts/build/builders/asr.py
@@ -28,6 +28,7 @@
     TEMPERATURE_MEASUREMENT = auto()
     THERMOSTAT = auto()
     OTA_REQUESTOR = auto()
+    DISHWASHER = auto()
 
     def ExampleName(self):
         if self == ASRApp.ALL_CLUSTERS:
@@ -48,6 +49,8 @@
             return 'thermostat'
         elif self == ASRApp.OTA_REQUESTOR:
             return 'ota-requestor-app'
+        elif self == ASRApp.DISHWASHER:
+            return 'dishwasher-app'
         else:
             raise Exception('Unknown app type: %r' % self)
 
@@ -70,6 +73,8 @@
             return 'chip-asr-thermostat-example'
         elif self == ASRApp.OTA_REQUESTOR:
             return 'chip-asr-ota-requestor-example'
+        elif self == ASRApp.DISHWASHER:
+            return 'chip-asr-dishwasher-example'
         else:
             raise Exception('Unknown app type: %r' % self)
 
diff --git a/scripts/build/testdata/all_targets_linux_x64.txt b/scripts/build/testdata/all_targets_linux_x64.txt
index 61daa46..db0d31e 100644
--- a/scripts/build/testdata/all_targets_linux_x64.txt
+++ b/scripts/build/testdata/all_targets_linux_x64.txt
@@ -1,5 +1,5 @@
 ameba-amebad-{all-clusters,all-clusters-minimal,light,light-switch,pigweed}
-asr-{asr582x,asr595x,asr550x}-{all-clusters,all-clusters-minimal,lighting,light-switch,lock,bridge,temperature-measurement,thermostat,ota-requestor}[-ota][-shell][-no_logging][-factory][-rotating_id][-rio]
+asr-{asr582x,asr595x,asr550x}-{all-clusters,all-clusters-minimal,lighting,light-switch,lock,bridge,temperature-measurement,thermostat,ota-requestor,dishwasher}[-ota][-shell][-no_logging][-factory][-rotating_id][-rio]
 android-{arm,arm64,x86,x64,androidstudio-arm,androidstudio-arm64,androidstudio-x86,androidstudio-x64}-{chip-tool,chip-test,tv-server,tv-casting-app,java-matter-controller,virtual-device-app}[-no-debug]
 bouffalolab-{bl602-iot-matter-v1,bl602-night-light,xt-zb6-devkit,bl706-night-light,bl706-eth,bl704l-dvk}-light[-shell][-115200][-rpc][-cdc][-resetcnt][-rotating_device_id]
 cc32xx-lock