[Infineon] Add a test trigger for CYW30739 to fill up event logging buffers. (#33382)
* [Infineon] Add a test trigger for CYW30739 to fill up event logging buffers.
* Implement the TestEventTriggerDelegate class to provide a vendor
trigger kFillUpEventLoggingBuffer as 0xffffffff00000000 (-4294967296)
to fill up event logging buffers with HardwareFaultChange and
SoftwareFault events.
* Implement the OnSoftwareFaultEventHandler method to build and log a
SoftwareFault event.
* Fix string literals and the vendor event trigger value.
Change the vendor trigger kFillUpEventLoggingBuffer from
0xffffffff00000000 (-4294967296) to 0xffffffff13880000 (-3967287296).
* Move common trigger logics to GenericEventManagementTestEventTriggerHandler class.
diff --git a/examples/platform/infineon/cyw30739/BUILD.gn b/examples/platform/infineon/cyw30739/BUILD.gn
index 0673c55..8ec7003 100644
--- a/examples/platform/infineon/cyw30739/BUILD.gn
+++ b/examples/platform/infineon/cyw30739/BUILD.gn
@@ -20,8 +20,10 @@
static_library("platform") {
sources = [
+ "EventManagementTestEventTriggerHandler.h",
"LEDWidget.h",
"OTAConfig.h",
+ "SoftwareDiagnostics.h",
"main.cpp",
]
diff --git a/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.cpp b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.cpp
new file mode 100644
index 0000000..c5320f1
--- /dev/null
+++ b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.cpp
@@ -0,0 +1,47 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "EventManagementTestEventTriggerHandler.h"
+
+#include "SoftwareDiagnostics.h"
+
+namespace chip {
+namespace DeviceLayer {
+namespace Infineon {
+namespace CYW30739 {
+
+CHIP_ERROR EventManagementTestEventTriggerHandler::HandleEventTrigger(uint64_t eventTrigger)
+{
+ switch (eventTrigger)
+ {
+ case kFillUpEventLoggingBuffer:
+ return HandleFillUpEventLoggingBufferEventTriger();
+ default:
+ return CHIP_ERROR_INVALID_ARGUMENT;
+ }
+}
+
+void EventManagementTestEventTriggerHandler::TriggerSoftwareFaultEvent(const char * faultRecordString)
+{
+ OnSoftwareFaultEventHandler(faultRecordString);
+}
+
+} // namespace CYW30739
+} // namespace Infineon
+} // namespace DeviceLayer
+} // namespace chip
diff --git a/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.h b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.h
new file mode 100644
index 0000000..b93109d
--- /dev/null
+++ b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.h
@@ -0,0 +1,42 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <app/GenericEventManagementTestEventTriggerHandler.h>
+
+namespace chip {
+namespace DeviceLayer {
+namespace Infineon {
+namespace CYW30739 {
+
+class EventManagementTestEventTriggerHandler : public app::GenericEventManagementTestEventTriggerHandler
+{
+public:
+ static constexpr uint64_t kFillUpEventLoggingBuffer = 0xffff'ffff'1388'0000;
+
+ CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override;
+
+private:
+ virtual void TriggerSoftwareFaultEvent(const char * faultRecordString) override;
+};
+
+} // namespace CYW30739
+} // namespace Infineon
+} // namespace DeviceLayer
+} // namespace chip
diff --git a/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp
new file mode 100644
index 0000000..ae41f82
--- /dev/null
+++ b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp
@@ -0,0 +1,62 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "SoftwareDiagnostics.h"
+
+#include <app/clusters/software-diagnostics-server/software-diagnostics-server.h>
+#include <app/util/config.h>
+#include <platform/CHIPDeviceLayer.h>
+
+namespace chip {
+namespace DeviceLayer {
+namespace Infineon {
+namespace CYW30739 {
+
+using namespace chip::app::Clusters;
+
+void OnSoftwareFaultEventHandler(const char * faultRecordString)
+{
+#ifdef MATTER_DM_PLUGIN_SOFTWARE_DIAGNOSTICS_SERVER
+ SoftwareDiagnostics::Events::SoftwareFault::Type softwareFault;
+
+ /* Unable to access thread ID in the application layer. */
+ softwareFault.id = 0;
+
+ if (DeviceLayer::PlatformMgrImpl().IsCurrentTask())
+ {
+ softwareFault.name.SetValue("Matter"_span);
+ }
+ else if (DeviceLayer::ThreadStackMgrImpl().IsCurrentTask())
+ {
+ softwareFault.name.SetValue("Thread"_span);
+ }
+ else
+ {
+ softwareFault.name.SetValue("App"_span);
+ }
+
+ softwareFault.faultRecording.SetValue(ByteSpan(Uint8::from_const_char(faultRecordString), strlen(faultRecordString)));
+
+ SoftwareDiagnosticsServer::Instance().OnSoftwareFaultDetect(softwareFault);
+#endif // MATTER_DM_PLUGIN_SOFTWARE_DIAGNOSTICS_SERVER
+}
+
+} // namespace CYW30739
+} // namespace Infineon
+} // namespace DeviceLayer
+} // namespace chip
diff --git a/examples/platform/infineon/cyw30739/SoftwareDiagnostics.h b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.h
new file mode 100644
index 0000000..b076d6e
--- /dev/null
+++ b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.h
@@ -0,0 +1,29 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace chip {
+namespace DeviceLayer {
+namespace Infineon {
+namespace CYW30739 {
+
+void OnSoftwareFaultEventHandler(const char * faultRecordString);
+
+} // namespace CYW30739
+} // namespace Infineon
+} // namespace DeviceLayer
+} // namespace chip
diff --git a/examples/platform/infineon/cyw30739/cyw30739_example.gni b/examples/platform/infineon/cyw30739/cyw30739_example.gni
index df8e50e..ff07ff6 100644
--- a/examples/platform/infineon/cyw30739/cyw30739_example.gni
+++ b/examples/platform/infineon/cyw30739/cyw30739_example.gni
@@ -24,8 +24,10 @@
static_library(target_name) {
sources = [
+ "${cyw30739_example_dir}/EventManagementTestEventTriggerHandler.cpp",
"${cyw30739_example_dir}/LEDWidget.cpp",
"${cyw30739_example_dir}/OTAConfig.cpp",
+ "${cyw30739_example_dir}/SoftwareDiagnostics.cpp",
"${cyw30739_example_dir}/matter_config.cpp",
]
diff --git a/examples/platform/infineon/cyw30739/matter_config.cpp b/examples/platform/infineon/cyw30739/matter_config.cpp
index 16d2517..c30d55e 100644
--- a/examples/platform/infineon/cyw30739/matter_config.cpp
+++ b/examples/platform/infineon/cyw30739/matter_config.cpp
@@ -19,6 +19,7 @@
#include "matter_config.h"
#include "AppTask.h"
+#include "EventManagementTestEventTriggerHandler.h"
#ifdef BOARD_ENABLE_DISPLAY
#include "GUI.h"
#endif
@@ -208,8 +209,10 @@
/* Start CHIP datamodel server */
static chip::SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{};
static chip::OTATestEventTriggerHandler sOtaTestEventTriggerHandler{};
+ static Infineon::CYW30739::EventManagementTestEventTriggerHandler sEventManagementTestEventTriggerHandler{};
VerifyOrDie(sTestEventTriggerDelegate.Init(chip::ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR);
VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR);
+ VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sEventManagementTestEventTriggerHandler) == CHIP_NO_ERROR);
// Create initParams with SDK example defaults here
static chip::CommonCaseDeviceServerInitParams initParams;
(void) initParams.InitializeStaticResourcesBeforeServerInit();
diff --git a/src/app/BUILD.gn b/src/app/BUILD.gn
index 0eb7e14..4bb4a05 100644
--- a/src/app/BUILD.gn
+++ b/src/app/BUILD.gn
@@ -325,6 +325,8 @@
"EventManagement.h",
"FailSafeContext.cpp",
"FailSafeContext.h",
+ "GenericEventManagementTestEventTriggerHandler.cpp",
+ "GenericEventManagementTestEventTriggerHandler.h",
"OTAUserConsentCommon.h",
"ReadHandler.cpp",
"SafeAttributePersistenceProvider.h",
diff --git a/src/app/GenericEventManagementTestEventTriggerHandler.cpp b/src/app/GenericEventManagementTestEventTriggerHandler.cpp
new file mode 100644
index 0000000..9c4cc11
--- /dev/null
+++ b/src/app/GenericEventManagementTestEventTriggerHandler.cpp
@@ -0,0 +1,72 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "GenericEventManagementTestEventTriggerHandler.h"
+
+#include <app/clusters/general-diagnostics-server/general-diagnostics-server.h>
+#include <platform/GeneralFaults.h>
+
+namespace chip {
+namespace app {
+
+using namespace chip::DeviceLayer;
+using namespace chip::app::Clusters;
+
+CHIP_ERROR GenericEventManagementTestEventTriggerHandler::HandleFillUpEventLoggingBufferEventTriger()
+{
+ /* Create a fake hardware fault list. */
+ GeneralFaults<kMaxHardwareFaults> hardwareFaults;
+ for (uint8_t hardwareFault = to_underlying(GeneralDiagnostics::HardwareFaultEnum::kUnspecified);
+ hardwareFault < kMaxHardwareFaults; hardwareFault++)
+ {
+ hardwareFaults.add(hardwareFault);
+ }
+
+ /* Fill up the critical logging buffer by 10 hardware faults. */
+ constexpr uint8_t kHardwareFaultCountForCriticalBuffer = 10;
+ for (uint8_t i = 0; i < kHardwareFaultCountForCriticalBuffer; i++)
+ {
+ GeneralDiagnosticsServer::Instance().OnHardwareFaultsDetect(hardwareFaults, hardwareFaults);
+ }
+
+ /* Fill up the info logging buffer. */
+ FillUpEventLoggingBufferWithFakeSoftwareFault(CHIP_DEVICE_CONFIG_EVENT_LOGGING_INFO_BUFFER_SIZE);
+
+ /* Fill up the debug logging buffer. */
+ FillUpEventLoggingBufferWithFakeSoftwareFault(CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE);
+
+ return CHIP_NO_ERROR;
+}
+
+void GenericEventManagementTestEventTriggerHandler::FillUpEventLoggingBufferWithFakeSoftwareFault(size_t bufferSize)
+{
+ /* Create a fake fault message. */
+ constexpr size_t kEncodingOverhead = 0x40;
+ const size_t recordSize = bufferSize - kEncodingOverhead;
+ char * recordBuffer = static_cast<char *>(Platform::MemoryAlloc(recordSize));
+ VerifyOrReturn(recordBuffer != nullptr);
+ std::unique_ptr<char, decltype(&Platform::MemoryFree)> recordString(recordBuffer, &Platform::MemoryFree);
+ memset(recordString.get(), 0x55, recordSize);
+ recordString.get()[recordSize - 1] = '\0';
+
+ /* Fill up the logging buffer by a software fault. */
+ TriggerSoftwareFaultEvent(recordString.get());
+}
+
+} // namespace app
+} // namespace chip
diff --git a/src/app/GenericEventManagementTestEventTriggerHandler.h b/src/app/GenericEventManagementTestEventTriggerHandler.h
new file mode 100644
index 0000000..da205a4
--- /dev/null
+++ b/src/app/GenericEventManagementTestEventTriggerHandler.h
@@ -0,0 +1,37 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <app/TestEventTriggerDelegate.h>
+
+namespace chip {
+namespace app {
+
+class GenericEventManagementTestEventTriggerHandler : public TestEventTriggerHandler
+{
+protected:
+ CHIP_ERROR HandleFillUpEventLoggingBufferEventTriger();
+
+private:
+ void FillUpEventLoggingBufferWithFakeSoftwareFault(size_t bufferSize);
+ virtual void TriggerSoftwareFaultEvent(const char * faultRecordString) = 0;
+};
+
+} // namespace app
+} // namespace chip