From 26bc3c8ed7aedc604b4decc1c9f4a440474eec1e Mon Sep 17 00:00:00 2001 From: Sid Hsu <sid.hsu@infineon.com> Date: Thu, 9 May 2024 11:34:17 +0800 Subject: [PATCH 1/3] [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. --- examples/platform/infineon/cyw30739/BUILD.gn | 2 + .../infineon/cyw30739/SoftwareDiagnostics.cpp | 62 ++++++++++++++ .../infineon/cyw30739/SoftwareDiagnostics.h | 29 +++++++ .../cyw30739/TestEventTriggerHandler.cpp | 80 +++++++++++++++++++ .../cyw30739/TestEventTriggerHandler.h | 42 ++++++++++ .../infineon/cyw30739/cyw30739_example.gni | 2 + .../infineon/cyw30739/matter_config.cpp | 3 + 7 files changed, 220 insertions(+) create mode 100644 examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp create mode 100644 examples/platform/infineon/cyw30739/SoftwareDiagnostics.h create mode 100644 examples/platform/infineon/cyw30739/TestEventTriggerHandler.cpp create mode 100644 examples/platform/infineon/cyw30739/TestEventTriggerHandler.h diff --git a/examples/platform/infineon/cyw30739/BUILD.gn b/examples/platform/infineon/cyw30739/BUILD.gn index 0673c55c351de3..43d412b04fbf56 100644 --- a/examples/platform/infineon/cyw30739/BUILD.gn +++ b/examples/platform/infineon/cyw30739/BUILD.gn @@ -22,6 +22,8 @@ static_library("platform") { sources = [ "LEDWidget.h", "OTAConfig.h", + "SoftwareDiagnostics.h", + "TestEventTriggerHandler.h", "main.cpp", ] diff --git a/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp new file mode 100644 index 00000000000000..a73bffee7abb90 --- /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(CharSpan::fromCharString("Matter")); + } + else if (DeviceLayer::ThreadStackMgrImpl().IsCurrentTask()) + { + softwareFault.name.SetValue(CharSpan::fromCharString("Thread")); + } + else + { + softwareFault.name.SetValue(CharSpan::fromCharString("App")); + } + + 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 00000000000000..b076d6e1bfe44c --- /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/TestEventTriggerHandler.cpp b/examples/platform/infineon/cyw30739/TestEventTriggerHandler.cpp new file mode 100644 index 00000000000000..7cf5321ee78d91 --- /dev/null +++ b/examples/platform/infineon/cyw30739/TestEventTriggerHandler.cpp @@ -0,0 +1,80 @@ +/* + * + * 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 "TestEventTriggerHandler.h" + +#include "SoftwareDiagnostics.h" + +#include <app/clusters/general-diagnostics-server/general-diagnostics-server.h> +#include <platform/CHIPDeviceLayer.h> + +namespace chip { +namespace DeviceLayer { +namespace Infineon { +namespace CYW30739 { + +using namespace chip::app::Clusters; + +CHIP_ERROR TestEventTriggerHandler::HandleEventTrigger(uint64_t eventTrigger) +{ + switch (eventTrigger) + { + case kFillUpEventLoggingBuffer: + return HandleFillUpEventLoggingBufferEventTriger(); + default: + return CHIP_ERROR_INVALID_ARGUMENT; + } +} + +CHIP_ERROR TestEventTriggerHandler::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); + } + + /* Create a fake fault message. */ + constexpr uint64_t kEncodingOverhead = 0x40; + constexpr uint64_t kMaxEventLoggingInfoSize = CHIP_DEVICE_CONFIG_EVENT_LOGGING_INFO_BUFFER_SIZE - kEncodingOverhead; + static char recordString[kMaxEventLoggingInfoSize + 1]; + memset(recordString, 0x55, kMaxEventLoggingInfoSize); + recordString[kMaxEventLoggingInfoSize] = '\0'; + + /* Fill up the info logging buffer by a software fault. */ + OnSoftwareFaultEventHandler(recordString); + + /* Fill up the debug logging buffer by a software fault. */ + OnSoftwareFaultEventHandler(recordString); + + return CHIP_NO_ERROR; +} + +} // namespace CYW30739 +} // namespace Infineon +} // namespace DeviceLayer +} // namespace chip diff --git a/examples/platform/infineon/cyw30739/TestEventTriggerHandler.h b/examples/platform/infineon/cyw30739/TestEventTriggerHandler.h new file mode 100644 index 00000000000000..67bddd9815e661 --- /dev/null +++ b/examples/platform/infineon/cyw30739/TestEventTriggerHandler.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/TestEventTriggerDelegate.h> + +namespace chip { +namespace DeviceLayer { +namespace Infineon { +namespace CYW30739 { + +class TestEventTriggerHandler : public chip::TestEventTriggerHandler +{ +public: + static constexpr uint64_t kFillUpEventLoggingBuffer = 0xffff'ffff'0000'0000; + + CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override; + +private: + CHIP_ERROR HandleFillUpEventLoggingBufferEventTriger(); +}; + +} // 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 df8e50ee68bf2f..c336e7407d7d07 100644 --- a/examples/platform/infineon/cyw30739/cyw30739_example.gni +++ b/examples/platform/infineon/cyw30739/cyw30739_example.gni @@ -26,6 +26,8 @@ template("cyw30739_example") { sources = [ "${cyw30739_example_dir}/LEDWidget.cpp", "${cyw30739_example_dir}/OTAConfig.cpp", + "${cyw30739_example_dir}/SoftwareDiagnostics.cpp", + "${cyw30739_example_dir}/TestEventTriggerHandler.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 6b0b56730edecd..0b3bbf5a85df81 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 "TestEventTriggerHandler.h" #ifdef BOARD_ENABLE_DISPLAY #include "GUI.h" #endif @@ -191,8 +192,10 @@ void CYW30739MatterConfig::InitApp(void) /* Start CHIP datamodel server */ static chip::SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; static chip::OTATestEventTriggerHandler sOtaTestEventTriggerHandler{}; + static Infineon::CYW30739::TestEventTriggerHandler sCYW30739TestEventTriggerHandler{}; VerifyOrDie(sTestEventTriggerDelegate.Init(chip::ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR); VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sCYW30739TestEventTriggerHandler) == CHIP_NO_ERROR); // Create initParams with SDK example defaults here static chip::CommonCaseDeviceServerInitParams initParams; (void) initParams.InitializeStaticResourcesBeforeServerInit(); From 22b6a366849ead3aaede7ec271c775e3efaa6180 Mon Sep 17 00:00:00 2001 From: Sid Hsu <sid.hsu@infineon.com> Date: Fri, 10 May 2024 18:16:32 +0800 Subject: [PATCH 2/3] Fix string literals and the vendor event trigger value. Change the vendor trigger kFillUpEventLoggingBuffer from 0xffffffff00000000 (-4294967296) to 0xffffffff13880000 (-3967287296). --- examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp | 6 +++--- .../platform/infineon/cyw30739/TestEventTriggerHandler.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp index a73bffee7abb90..ae41f82d14d526 100644 --- a/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp +++ b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp @@ -39,15 +39,15 @@ void OnSoftwareFaultEventHandler(const char * faultRecordString) if (DeviceLayer::PlatformMgrImpl().IsCurrentTask()) { - softwareFault.name.SetValue(CharSpan::fromCharString("Matter")); + softwareFault.name.SetValue("Matter"_span); } else if (DeviceLayer::ThreadStackMgrImpl().IsCurrentTask()) { - softwareFault.name.SetValue(CharSpan::fromCharString("Thread")); + softwareFault.name.SetValue("Thread"_span); } else { - softwareFault.name.SetValue(CharSpan::fromCharString("App")); + softwareFault.name.SetValue("App"_span); } softwareFault.faultRecording.SetValue(ByteSpan(Uint8::from_const_char(faultRecordString), strlen(faultRecordString))); diff --git a/examples/platform/infineon/cyw30739/TestEventTriggerHandler.h b/examples/platform/infineon/cyw30739/TestEventTriggerHandler.h index 67bddd9815e661..f83af762976640 100644 --- a/examples/platform/infineon/cyw30739/TestEventTriggerHandler.h +++ b/examples/platform/infineon/cyw30739/TestEventTriggerHandler.h @@ -28,7 +28,7 @@ namespace CYW30739 { class TestEventTriggerHandler : public chip::TestEventTriggerHandler { public: - static constexpr uint64_t kFillUpEventLoggingBuffer = 0xffff'ffff'0000'0000; + static constexpr uint64_t kFillUpEventLoggingBuffer = 0xffff'ffff'1388'0000; CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override; From 3336ccb754a8beecff04688ecd10e92646a6be70 Mon Sep 17 00:00:00 2001 From: Sid Hsu <sid.hsu@infineon.com> Date: Wed, 22 May 2024 18:07:34 +0800 Subject: [PATCH 3/3] Move common trigger logics to GenericEventManagementTestEventTriggerHandler class. --- examples/platform/infineon/cyw30739/BUILD.gn | 2 +- ...EventManagementTestEventTriggerHandler.cpp | 47 +++++++++++++++ ... EventManagementTestEventTriggerHandler.h} | 6 +- .../infineon/cyw30739/cyw30739_example.gni | 2 +- .../infineon/cyw30739/matter_config.cpp | 6 +- src/app/BUILD.gn | 2 + ...EventManagementTestEventTriggerHandler.cpp | 58 ++++++++----------- ...icEventManagementTestEventTriggerHandler.h | 37 ++++++++++++ 8 files changed, 119 insertions(+), 41 deletions(-) create mode 100644 examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.cpp rename examples/platform/infineon/cyw30739/{TestEventTriggerHandler.h => EventManagementTestEventTriggerHandler.h} (80%) rename examples/platform/infineon/cyw30739/TestEventTriggerHandler.cpp => src/app/GenericEventManagementTestEventTriggerHandler.cpp (55%) create mode 100644 src/app/GenericEventManagementTestEventTriggerHandler.h diff --git a/examples/platform/infineon/cyw30739/BUILD.gn b/examples/platform/infineon/cyw30739/BUILD.gn index 43d412b04fbf56..8ec7003633cd40 100644 --- a/examples/platform/infineon/cyw30739/BUILD.gn +++ b/examples/platform/infineon/cyw30739/BUILD.gn @@ -20,10 +20,10 @@ import("${cyw30739_sdk_build_root}/cyw30739_sdk.gni") static_library("platform") { sources = [ + "EventManagementTestEventTriggerHandler.h", "LEDWidget.h", "OTAConfig.h", "SoftwareDiagnostics.h", - "TestEventTriggerHandler.h", "main.cpp", ] diff --git a/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.cpp b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.cpp new file mode 100644 index 00000000000000..c5320f17f64bc4 --- /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/TestEventTriggerHandler.h b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.h similarity index 80% rename from examples/platform/infineon/cyw30739/TestEventTriggerHandler.h rename to examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.h index f83af762976640..b93109dae03dfa 100644 --- a/examples/platform/infineon/cyw30739/TestEventTriggerHandler.h +++ b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.h @@ -18,14 +18,14 @@ #pragma once -#include <app/TestEventTriggerDelegate.h> +#include <app/GenericEventManagementTestEventTriggerHandler.h> namespace chip { namespace DeviceLayer { namespace Infineon { namespace CYW30739 { -class TestEventTriggerHandler : public chip::TestEventTriggerHandler +class EventManagementTestEventTriggerHandler : public app::GenericEventManagementTestEventTriggerHandler { public: static constexpr uint64_t kFillUpEventLoggingBuffer = 0xffff'ffff'1388'0000; @@ -33,7 +33,7 @@ class TestEventTriggerHandler : public chip::TestEventTriggerHandler CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override; private: - CHIP_ERROR HandleFillUpEventLoggingBufferEventTriger(); + virtual void TriggerSoftwareFaultEvent(const char * faultRecordString) override; }; } // namespace CYW30739 diff --git a/examples/platform/infineon/cyw30739/cyw30739_example.gni b/examples/platform/infineon/cyw30739/cyw30739_example.gni index c336e7407d7d07..ff07ff6eb28633 100644 --- a/examples/platform/infineon/cyw30739/cyw30739_example.gni +++ b/examples/platform/infineon/cyw30739/cyw30739_example.gni @@ -24,10 +24,10 @@ template("cyw30739_example") { 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}/TestEventTriggerHandler.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 0b3bbf5a85df81..7f8edcdfe25392 100644 --- a/examples/platform/infineon/cyw30739/matter_config.cpp +++ b/examples/platform/infineon/cyw30739/matter_config.cpp @@ -19,7 +19,7 @@ #include "matter_config.h" #include "AppTask.h" -#include "TestEventTriggerHandler.h" +#include "EventManagementTestEventTriggerHandler.h" #ifdef BOARD_ENABLE_DISPLAY #include "GUI.h" #endif @@ -192,10 +192,10 @@ void CYW30739MatterConfig::InitApp(void) /* Start CHIP datamodel server */ static chip::SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; static chip::OTATestEventTriggerHandler sOtaTestEventTriggerHandler{}; - static Infineon::CYW30739::TestEventTriggerHandler sCYW30739TestEventTriggerHandler{}; + static Infineon::CYW30739::EventManagementTestEventTriggerHandler sEventManagementTestEventTriggerHandler{}; VerifyOrDie(sTestEventTriggerDelegate.Init(chip::ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR); VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR); - VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sCYW30739TestEventTriggerHandler) == 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 e40847403cd01f..25a5775874f52f 100644 --- a/src/app/BUILD.gn +++ b/src/app/BUILD.gn @@ -324,6 +324,8 @@ static_library("app") { "EventManagement.h", "FailSafeContext.cpp", "FailSafeContext.h", + "GenericEventManagementTestEventTriggerHandler.cpp", + "GenericEventManagementTestEventTriggerHandler.h", "OTAUserConsentCommon.h", "ReadHandler.cpp", "SafeAttributePersistenceProvider.h", diff --git a/examples/platform/infineon/cyw30739/TestEventTriggerHandler.cpp b/src/app/GenericEventManagementTestEventTriggerHandler.cpp similarity index 55% rename from examples/platform/infineon/cyw30739/TestEventTriggerHandler.cpp rename to src/app/GenericEventManagementTestEventTriggerHandler.cpp index 7cf5321ee78d91..9c4cc11c8851a9 100644 --- a/examples/platform/infineon/cyw30739/TestEventTriggerHandler.cpp +++ b/src/app/GenericEventManagementTestEventTriggerHandler.cpp @@ -16,32 +16,18 @@ * limitations under the License. */ -#include "TestEventTriggerHandler.h" - -#include "SoftwareDiagnostics.h" +#include "GenericEventManagementTestEventTriggerHandler.h" #include <app/clusters/general-diagnostics-server/general-diagnostics-server.h> -#include <platform/CHIPDeviceLayer.h> +#include <platform/GeneralFaults.h> namespace chip { -namespace DeviceLayer { -namespace Infineon { -namespace CYW30739 { +namespace app { +using namespace chip::DeviceLayer; using namespace chip::app::Clusters; -CHIP_ERROR TestEventTriggerHandler::HandleEventTrigger(uint64_t eventTrigger) -{ - switch (eventTrigger) - { - case kFillUpEventLoggingBuffer: - return HandleFillUpEventLoggingBufferEventTriger(); - default: - return CHIP_ERROR_INVALID_ARGUMENT; - } -} - -CHIP_ERROR TestEventTriggerHandler::HandleFillUpEventLoggingBufferEventTriger() +CHIP_ERROR GenericEventManagementTestEventTriggerHandler::HandleFillUpEventLoggingBufferEventTriger() { /* Create a fake hardware fault list. */ GeneralFaults<kMaxHardwareFaults> hardwareFaults; @@ -58,23 +44,29 @@ CHIP_ERROR TestEventTriggerHandler::HandleFillUpEventLoggingBufferEventTriger() GeneralDiagnosticsServer::Instance().OnHardwareFaultsDetect(hardwareFaults, hardwareFaults); } - /* Create a fake fault message. */ - constexpr uint64_t kEncodingOverhead = 0x40; - constexpr uint64_t kMaxEventLoggingInfoSize = CHIP_DEVICE_CONFIG_EVENT_LOGGING_INFO_BUFFER_SIZE - kEncodingOverhead; - static char recordString[kMaxEventLoggingInfoSize + 1]; - memset(recordString, 0x55, kMaxEventLoggingInfoSize); - recordString[kMaxEventLoggingInfoSize] = '\0'; + /* Fill up the info logging buffer. */ + FillUpEventLoggingBufferWithFakeSoftwareFault(CHIP_DEVICE_CONFIG_EVENT_LOGGING_INFO_BUFFER_SIZE); - /* Fill up the info logging buffer by a software fault. */ - OnSoftwareFaultEventHandler(recordString); - - /* Fill up the debug logging buffer by a software fault. */ - OnSoftwareFaultEventHandler(recordString); + /* Fill up the debug logging buffer. */ + FillUpEventLoggingBufferWithFakeSoftwareFault(CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE); return CHIP_NO_ERROR; } -} // namespace CYW30739 -} // namespace Infineon -} // namespace DeviceLayer +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 00000000000000..da205a420bfaf3 --- /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