From 2802b79fa15743b938d8af9f4847412536e46f9b Mon Sep 17 00:00:00 2001 From: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> Date: Wed, 15 May 2024 09:49:47 -0400 Subject: [PATCH 1/3] Make changes to the window manager class so its static constructor do not call a dynamic allocation before code entry. Limitation with sl memory manager --- examples/window-app/silabs/include/WindowManager.h | 2 +- examples/window-app/silabs/src/WindowManager.cpp | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/examples/window-app/silabs/include/WindowManager.h b/examples/window-app/silabs/include/WindowManager.h index 8ae75e8ed48c94..c34f1ed4340a50 100644 --- a/examples/window-app/silabs/include/WindowManager.h +++ b/examples/window-app/silabs/include/WindowManager.h @@ -155,7 +155,7 @@ class WindowManager LEDWidget mActionLED; #ifdef DISPLAY_ENABLED - Timer mIconTimer; + Timer * mIconTimer = nullptr; LcdIcon mIcon = LcdIcon::None; #endif }; diff --git a/examples/window-app/silabs/src/WindowManager.cpp b/examples/window-app/silabs/src/WindowManager.cpp index 0b8639dc04e93b..95e00f5f69df3e 100644 --- a/examples/window-app/silabs/src/WindowManager.cpp +++ b/examples/window-app/silabs/src/WindowManager.cpp @@ -538,11 +538,7 @@ WindowManager & WindowManager::Instance() return WindowManager::sWindow; } -#ifdef DISPLAY_ENABLED -WindowManager::WindowManager() : mIconTimer(LCD_ICON_TIMEOUT, OnIconTimeout, this) {} -#else WindowManager::WindowManager() {} -#endif void WindowManager::OnIconTimeout(WindowManager::Timer & timer) { @@ -556,6 +552,9 @@ CHIP_ERROR WindowManager::Init() { chip::DeviceLayer::PlatformMgr().LockChipStack(); +#ifdef DISPLAY_ENABLED + mIconTimer = new Timer(LCD_ICON_TIMEOUT, OnIconTimeout, this); +#endif // Timers mLongPressTimer = new Timer(LONG_PRESS_TIMEOUT, OnLongPressTimeout, this); @@ -768,13 +767,13 @@ void WindowManager::GeneralEventHandler(AppEvent * aEvent) window->UpdateLCD(); break; case AppEvent::kEventType_CoverChange: - window->mIconTimer.Start(); + if (window->mIconTimer != nullptr) { window->mIconTimer->Start(); } window->mIcon = (window->GetCover().mEndpoint == 1) ? LcdIcon::One : LcdIcon::Two; window->UpdateLCD(); break; case AppEvent::kEventType_TiltModeChange: ChipLogDetail(AppServer, "App control mode changed to %s", window->mTiltMode ? "Tilt" : "Lift"); - window->mIconTimer.Start(); + if (window->mIconTimer != nullptr) { window->mIconTimer->Start(); } window->mIcon = window->mTiltMode ? LcdIcon::Tilt : LcdIcon::Lift; window->UpdateLCD(); break; From 5bbcd9a7b00d16421469b89e86374acf4857d687 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Wed, 15 May 2024 14:35:11 +0000 Subject: [PATCH 2/3] Restyled by clang-format --- examples/window-app/silabs/include/WindowManager.h | 2 +- examples/window-app/silabs/src/WindowManager.cpp | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/examples/window-app/silabs/include/WindowManager.h b/examples/window-app/silabs/include/WindowManager.h index c34f1ed4340a50..f4d17fcb27a01c 100644 --- a/examples/window-app/silabs/include/WindowManager.h +++ b/examples/window-app/silabs/include/WindowManager.h @@ -156,6 +156,6 @@ class WindowManager LEDWidget mActionLED; #ifdef DISPLAY_ENABLED Timer * mIconTimer = nullptr; - LcdIcon mIcon = LcdIcon::None; + LcdIcon mIcon = LcdIcon::None; #endif }; diff --git a/examples/window-app/silabs/src/WindowManager.cpp b/examples/window-app/silabs/src/WindowManager.cpp index 95e00f5f69df3e..4d557294b6616a 100644 --- a/examples/window-app/silabs/src/WindowManager.cpp +++ b/examples/window-app/silabs/src/WindowManager.cpp @@ -767,13 +767,19 @@ void WindowManager::GeneralEventHandler(AppEvent * aEvent) window->UpdateLCD(); break; case AppEvent::kEventType_CoverChange: - if (window->mIconTimer != nullptr) { window->mIconTimer->Start(); } + if (window->mIconTimer != nullptr) + { + window->mIconTimer->Start(); + } window->mIcon = (window->GetCover().mEndpoint == 1) ? LcdIcon::One : LcdIcon::Two; window->UpdateLCD(); break; case AppEvent::kEventType_TiltModeChange: ChipLogDetail(AppServer, "App control mode changed to %s", window->mTiltMode ? "Tilt" : "Lift"); - if (window->mIconTimer != nullptr) { window->mIconTimer->Start(); } + if (window->mIconTimer != nullptr) + { + window->mIconTimer->Start(); + } window->mIcon = window->mTiltMode ? LcdIcon::Tilt : LcdIcon::Lift; window->UpdateLCD(); break; From cf9db91c7896d85519d30c3373bb88ea8446844f Mon Sep 17 00:00:00 2001 From: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> Date: Wed, 15 May 2024 12:53:37 -0400 Subject: [PATCH 3/3] implement a destructor for the Timer object to delete the allocated timer --- examples/window-app/silabs/include/WindowManager.h | 1 + examples/window-app/silabs/src/WindowManager.cpp | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/examples/window-app/silabs/include/WindowManager.h b/examples/window-app/silabs/include/WindowManager.h index f4d17fcb27a01c..7578396c8f67f6 100644 --- a/examples/window-app/silabs/include/WindowManager.h +++ b/examples/window-app/silabs/include/WindowManager.h @@ -40,6 +40,7 @@ class WindowManager typedef void (*Callback)(Timer & timer); Timer(uint32_t timeoutInMs, Callback callback, void * context); + ~Timer(); void Start(); void Stop(); diff --git a/examples/window-app/silabs/src/WindowManager.cpp b/examples/window-app/silabs/src/WindowManager.cpp index 4d557294b6616a..8ae78b3d2e99b8 100644 --- a/examples/window-app/silabs/src/WindowManager.cpp +++ b/examples/window-app/silabs/src/WindowManager.cpp @@ -514,6 +514,15 @@ WindowManager::Timer::Timer(uint32_t timeoutInMs, Callback callback, void * cont } } +WindowManager::Timer::~Timer() +{ + if (mHandler) + { + osTimerDelete(mHandler); + mHandler = nullptr; + } +} + void WindowManager::Timer::Stop() { mIsActive = false;