[Ameba] Add clusters and modifications (#32220)

* [Ameba] Add devices, observers, and modified ConfigurationManagerImpl.cpp and AmebaTestEventTriggerDelegate.h/cpp

* [Ameba] restyle-diff.sh

* [Ameba] Fix build for Ameba D with cmake

* [Ameba] Added Manual Operation for Oven Cavity Operational State
diff --git a/examples/all-clusters-app/ameba/chip_main.cmake b/examples/all-clusters-app/ameba/chip_main.cmake
index c457206..2afdd4e 100755
--- a/examples/all-clusters-app/ameba/chip_main.cmake
+++ b/examples/all-clusters-app/ameba/chip_main.cmake
@@ -153,6 +153,8 @@
 list(
     APPEND ${list_chip_main_sources}
 
+    ${chip_dir}/src/app/clusters/microwave-oven-control-server/microwave-oven-control-server.cpp
+
     ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/bridged-actions-stub.cpp
     ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/air-quality-instance.cpp
     ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/concentration-measurement-instances.cpp
@@ -161,6 +163,7 @@
     ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/energy-preference-delegate.cpp
     ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/fan-stub.cpp
     ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/oven-modes.cpp
+    ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/laundry-dryer-controls-delegate-impl.cpp
     ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/laundry-washer-controls-delegate-impl.cpp
     ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/resource-monitoring-delegates.cpp
     ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/rvc-modes.cpp
@@ -169,6 +172,10 @@
     ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/static-supported-temperature-levels.cpp
     ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/operational-state-delegate-impl.cpp
     ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/rvc-operational-state-delegate-impl.cpp
+    ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/microwave-oven-mode.cpp
+    ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/oven-modes.cpp
+    ${chip_dir}/examples/all-clusters-app/all-clusters-common/src/oven-operational-state-delegate.cpp
+
     ${chip_dir}/examples/all-clusters-app/ameba/main/chipinterface.cpp
     ${chip_dir}/examples/all-clusters-app/ameba/main/BindingHandler.cpp
     ${chip_dir}/examples/all-clusters-app/ameba/main/DeviceCallbacks.cpp
@@ -178,6 +185,8 @@
     ${chip_dir}/examples/all-clusters-app/ameba/main/ManualOperationCommand.cpp
     ${chip_dir}/examples/all-clusters-app/ameba/main/SmokeCOAlarmManager.cpp
 
+    ${chip_dir}/examples/microwave-oven-app/microwave-oven-common/src/microwave-oven-device.cpp
+
     ${chip_dir}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp
     ${chip_dir}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementManager.cpp
     ${chip_dir}/examples/energy-management-app/energy-management-common/src/ElectricalPowerMeasurementDelegate.cpp
@@ -228,6 +237,8 @@
     ${chip_dir}/zzz_generated/app-common
     ${chip_dir}/examples/all-clusters-app/all-clusters-common
     ${chip_dir}/examples/all-clusters-app/all-clusters-common/include
+    ${chip_dir}/examples/microwave-oven-app/microwave-oven-common
+    ${chip_dir}/examples/microwave-oven-app/microwave-oven-common/include
     ${chip_dir}/examples/energy-management-app/energy-management-common/include
     ${chip_dir}/examples/all-clusters-app/ameba/main/include
     ${chip_dir}/examples/platform/ameba
diff --git a/examples/all-clusters-app/ameba/main/ManualOperationCommand.cpp b/examples/all-clusters-app/ameba/main/ManualOperationCommand.cpp
index feb346b..d03dbcd 100644
--- a/examples/all-clusters-app/ameba/main/ManualOperationCommand.cpp
+++ b/examples/all-clusters-app/ameba/main/ManualOperationCommand.cpp
@@ -79,6 +79,7 @@
         { &ManualRVCCommandHandler, "rvc", " Usage: manual rvc <subcommand>" },
         { &ManualRefrigeratorAlarmCommandHandler, "refalm", " Usage: manual refalm <subcommand>" },
         { &ManualDishWasherAlarmCommandHandler, "dishalm", " Usage: manual dishalm <subcommand>" },
+        { &ManualOvenCavityOperationalStateCommandHandler, "oven-opstate", " Usage: manual dishalm <subcommand>" },
     };
 
     static const shell_command_t sManualOperationalStateSubCommands[] = {
@@ -123,6 +124,14 @@
         { &ManualDishWasherAlarmSetLowerCommandHandler, "lower", "lower Usage: manual dishalm lower" },
     };
 
+    static const shell_command_t sManualOvenCavityOperationalStateSubCommands[] = {
+        { &ManualOvenCavityOperationalStateCommandHelpHandler, "help", "Usage: manual oven-opstate <subcommand>" },
+        { &ManualOvenCavityOperationalStateSetStateCommandHandler, "set-state",
+          "set-state Usage: manual oven-opstate set-state <state>" },
+        { &ManualOvenCavityOperationalStateSetErrorCommandHandler, "set-error",
+          "set-error Usage: manual oven-opstate set-error <error>" },
+    };
+
     static const shell_command_t sManualOperationCommand = { &ManualOperationCommandHandler, "manual",
                                                              "Manual Operation commands. Usage: manual <subcommand>" };
 
@@ -139,6 +148,8 @@
                                                                    ArraySize(sManualRefrigeratorAlarmStateSubCommands));
     sShellManualDishWasherAlarmStateSubCommands.RegisterCommands(sManualDishWasherAlarmSubCommands,
                                                                  ArraySize(sManualDishWasherAlarmSubCommands));
+    sShellManualOvenCavityOperationalStateSubCommands.RegisterCommands(sManualOvenCavityOperationalStateSubCommands,
+                                                                       ArraySize(sManualOvenCavityOperationalStateSubCommands));
 
     Engine::Root().RegisterCommands(&sManualOperationCommand, 1);
 }
diff --git a/examples/all-clusters-app/ameba/main/chipinterface.cpp b/examples/all-clusters-app/ameba/main/chipinterface.cpp
index 20de9cd..c954713 100644
--- a/examples/all-clusters-app/ameba/main/chipinterface.cpp
+++ b/examples/all-clusters-app/ameba/main/chipinterface.cpp
@@ -17,6 +17,7 @@
 
 #include <platform_stdlib.h>
 
+#include "AmebaObserver.h"
 #include "BindingHandler.h"
 #include "CHIPDeviceManager.h"
 #include "DeviceCallbacks.h"
@@ -28,13 +29,16 @@
 #include <lwip_netconf.h>
 
 #include <app/clusters/identify-server/identify-server.h>
+#include <app/clusters/laundry-dryer-controls-server/laundry-dryer-controls-server.h>
 #include <app/clusters/laundry-washer-controls-server/laundry-washer-controls-server.h>
 #include <app/clusters/network-commissioning/network-commissioning.h>
 #include <app/server/OnboardingCodesUtil.h>
 #include <app/server/Server.h>
 #include <app/util/af.h>
+#include <laundry-dryer-controls-delegate-impl.h>
 #include <laundry-washer-controls-delegate-impl.h>
 #include <lib/core/ErrorStr.h>
+#include <microwave-oven-device.h>
 #include <platform/Ameba/AmebaConfig.h>
 #include <platform/Ameba/NetworkCommissioningDriver.h>
 #include <platform/CHIPDeviceLayer.h>
@@ -43,6 +47,7 @@
 #include <static-supported-temperature-levels.h>
 #include <support/CHIPMem.h>
 #if CONFIG_ENABLE_AMEBA_TEST_EVENT_TRIGGER
+#include <app/clusters/smoke-co-alarm-server/SmokeCOTestEventTriggerHandler.h>
 #include <test_event_trigger/AmebaTestEventTriggerDelegate.h>
 #endif
 
@@ -140,11 +145,11 @@
     static chip::CommonCaseDeviceServerInitParams initParams;
 
 #if CONFIG_ENABLE_AMEBA_TEST_EVENT_TRIGGER
-    // TODO(#31723): Show to customers that they can do `Server::GetInstance().GetTestEventTriggerDelegate().AddHandler(xxx)`
-    // to add custom handlers during their app init, after InitServer.
     static AmebaTestEventTriggerDelegate sTestEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) };
     initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate;
 #endif
+    static AmebaObserver sAmebaObserver;
+    initParams.appDelegate = &sAmebaObserver;
 
     initParams.InitializeStaticResourcesBeforeServerInit();
 
@@ -166,6 +171,12 @@
     InitManualOperation();
 #endif
     app::Clusters::TemperatureControl::SetInstance(&sAppSupportedTemperatureLevelsDelegate);
+    MatterMicrowaveOvenServerInit();
+#if CONFIG_ENABLE_AMEBA_TEST_EVENT_TRIGGER
+    static SmokeCOTestEventTriggerHandler sSmokeCOTestEventTriggerHandler;
+    Server::GetInstance().GetTestEventTriggerDelegate()->AddHandler(&sSmokeCOTestEventTriggerHandler);
+#endif
+    chip::Server::GetInstance().GetFabricTable().AddFabricDelegate(&sAmebaObserver);
 }
 
 extern "C" void ChipTest(void)
@@ -213,3 +224,9 @@
 {
     LaundryWasherControlsServer::SetDefaultDelegate(endpoint, &LaundryWasherControlDelegate::getLaundryWasherControlDelegate());
 }
+
+using namespace chip::app::Clusters::LaundryDryerControls;
+void emberAfLaundryDryerControlsClusterInitCallback(EndpointId endpoint)
+{
+    LaundryDryerControlsServer::SetDefaultDelegate(endpoint, &LaundryDryerControlDelegate::getLaundryDryerControlDelegate());
+}
diff --git a/examples/all-clusters-app/ameba/main/include/AmebaObserver.h b/examples/all-clusters-app/ameba/main/include/AmebaObserver.h
new file mode 100644
index 0000000..a19c9c9
--- /dev/null
+++ b/examples/all-clusters-app/ameba/main/include/AmebaObserver.h
@@ -0,0 +1,47 @@
+/*
+ *
+ *    Copyright (c) 2022 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#pragma once
+
+#include <app/server/AppDelegate.h>
+#include <app/server/Server.h>
+#include <credentials/FabricTable.h>
+
+namespace chip {
+
+class AmebaObserver : public AppDelegate, public FabricTable::Delegate
+{
+public:
+    // Commissioning Observer
+    void OnCommissioningSessionEstablishmentError(CHIP_ERROR err) override
+    {
+        ChipLogProgress(DeviceLayer, "Ameba Observer: Commissioning error (0x%x)", err);
+        // Handle commissioning errror here
+    }
+    // Fabric Observer
+    void OnFabricRemoved(const FabricTable & fabricTable, FabricIndex fabricIndex) override
+    {
+        ChipLogProgress(DeviceLayer, "Ameba Observer: Fabric 0x%x has been Removed", fabricIndex);
+        if (chip::Server::GetInstance().GetFabricTable().FabricCount() == 0)
+        {
+            // Customer code
+        }
+    }
+};
+
+} // namespace chip
diff --git a/examples/all-clusters-app/ameba/main/include/ManualOperationalStateCommand.h b/examples/all-clusters-app/ameba/main/include/ManualOperationalStateCommand.h
index fc28255..31e186a 100644
--- a/examples/all-clusters-app/ameba/main/include/ManualOperationalStateCommand.h
+++ b/examples/all-clusters-app/ameba/main/include/ManualOperationalStateCommand.h
@@ -19,6 +19,7 @@
 #include "controller/InvokeInteraction.h"
 #include "controller/ReadInteraction.h"
 #include "operational-state-delegate-impl.h"
+#include "oven-operational-state-delegate.h"
 #include "rvc-operational-state-delegate-impl.h"
 
 #if CONFIG_ENABLE_CHIP_SHELL
@@ -39,6 +40,7 @@
 
 Engine sShellManualOperationalStateSubCommands;
 Engine sShellManualRVCOperationalStateSubCommands;
+Engine sShellManualOvenCavityOperationalStateSubCommands;
 #endif // defined(ENABLE_CHIP_SHELL)
 
 #if CONFIG_ENABLE_CHIP_SHELL
@@ -183,4 +185,71 @@
 
     return CHIP_NO_ERROR;
 }
+
+/********************************************************
+ * Oven Cavity Operational State Functions
+ *********************************************************/
+
+CHIP_ERROR ManualOvenCavityOperationalStateCommandHelpHandler(int argc, char ** argv)
+{
+    sShellManualOvenCavityOperationalStateSubCommands.ForEachCommand(Shell::PrintCommandHelp, nullptr);
+    return CHIP_NO_ERROR;
+}
+
+CHIP_ERROR ManualOvenCavityOperationalStateCommandHandler(int argc, char ** argv)
+{
+    if (argc == 0)
+    {
+        return ManualOvenCavityOperationalStateCommandHelpHandler(argc, argv);
+    }
+
+    return sShellManualOvenCavityOperationalStateSubCommands.ExecCommand(argc, argv);
+}
+
+CHIP_ERROR ManualOvenCavityOperationalStateSetStateCommandHandler(int argc, char ** argv)
+{
+    if (argc != 1)
+    {
+        return ManualOvenCavityOperationalStateCommandHelpHandler(argc, argv);
+    }
+    uint32_t state = atoi(argv[0]);
+
+    CHIP_ERROR err;
+    err = OvenCavityOperationalState::GetOperationalStateInstance()->SetOperationalState(state);
+
+    if (err != CHIP_NO_ERROR)
+    {
+        ChipLogError(DeviceLayer, "ManualOvenCavityOperationalStateSetStateCommandHandler Failed!\r\n");
+    }
+
+    return err;
+}
+
+CHIP_ERROR ManualOvenCavityOperationalStateSetErrorCommandHandler(int argc, char ** argv)
+{
+    if (argc != 1)
+    {
+        return ManualOvenCavityOperationalStateCommandHelpHandler(argc, argv);
+    }
+
+    GenericOperationalError err(to_underlying(ErrorStateEnum::kNoError));
+    uint32_t error = atoi(argv[0]);
+
+    switch (error)
+    {
+    case to_underlying(OvenCavityOperationalState::ErrorStateEnum::kNoError):                   // 0x00, 0
+    case to_underlying(OvenCavityOperationalState::ErrorStateEnum::kUnableToStartOrResume):     // 0x01, 1
+    case to_underlying(OvenCavityOperationalState::ErrorStateEnum::kUnableToCompleteOperation): // 0x02, 2
+    case to_underlying(OvenCavityOperationalState::ErrorStateEnum::kCommandInvalidInState):     // 0x03, 3
+        err.errorStateID = error;
+        break;
+    default:
+        err.errorStateID = to_underlying(OvenCavityOperationalState::ErrorStateEnum::kUnknownEnumValue); // 0x04, 4
+        break;
+    }
+
+    OvenCavityOperationalState::GetOperationalStateInstance()->OnOperationalErrorDetected(err);
+
+    return CHIP_NO_ERROR;
+}
 #endif // CONFIG_ENABLE_CHIP_SHELL
diff --git a/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.cpp b/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.cpp
index 8bbae5e..22b0050 100644
--- a/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.cpp
+++ b/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.cpp
@@ -21,6 +21,13 @@
 
 using namespace ::chip::DeviceLayer;
 
+bool AmebaHandleGlobalTestEventTrigger(uint64_t eventTrigger)
+{
+    // Customer can trigger action on the Ameba layer based on the eventTrigger
+    ChipLogProgress(Support, "[AmebaHandleGlobalTestEventTrigger] Received Event Trigger: 0x%016llx", eventTrigger);
+    return false;
+}
+
 namespace chip {
 
 bool AmebaTestEventTriggerDelegate::DoesEnableKeyMatch(const ByteSpan & enableKey) const
diff --git a/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.h b/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.h
index 9e77040..44103c7 100644
--- a/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.h
+++ b/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.h
@@ -34,12 +34,10 @@
  *
  * @warning *** DO NOT USE FOR STANDARD CLUSTER EVENT TRIGGERS ***
  *
- * TODO(#31723): Rename `emberAfHandleEventTrigger` to `AmebaHandleGlobalTestEventTrigger`
- *
  * @retval true on success
  * @retval false if error happened
  */
-bool emberAfHandleEventTrigger(uint64_t eventTrigger);
+bool AmebaHandleGlobalTestEventTrigger(uint64_t eventTrigger);
 
 namespace chip {
 
@@ -61,7 +59,7 @@
     CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override
     {
         // WARNING: LEGACY SUPPORT ONLY, DO NOT EXTEND FOR STANDARD CLUSTERS
-        return (emberAfHandleEventTrigger(eventTrigger)) ? CHIP_NO_ERROR : CHIP_ERROR_INVALID_ARGUMENT;
+        return (AmebaHandleGlobalTestEventTrigger(eventTrigger)) ? CHIP_NO_ERROR : CHIP_ERROR_INVALID_ARGUMENT;
     }
 
 private:
diff --git a/src/platform/Ameba/ConfigurationManagerImpl.cpp b/src/platform/Ameba/ConfigurationManagerImpl.cpp
index b3c6cbf..a1dc4a3 100644
--- a/src/platform/Ameba/ConfigurationManagerImpl.cpp
+++ b/src/platform/Ameba/ConfigurationManagerImpl.cpp
@@ -158,8 +158,8 @@
 
     char temp[32];
     uint32_t mac[ETH_ALEN];
-    char * token = strtok(temp, ":");
-    int i        = 0;
+    char * token;
+    int i = 0;
 
     error = matter_wifi_get_mac_address(temp);
     err   = AmebaUtils::MapError(error, AmebaErrorType::kWiFiError);
@@ -169,6 +169,7 @@
         goto exit;
     }
 
+    token = strtok(temp, ":");
     while (token != NULL)
     {
         mac[i] = (uint32_t) strtol(token, NULL, 16);