From aa356e7eb4169173ae6472dfd109b44f7d0df0cf Mon Sep 17 00:00:00 2001 From: Rohan Sahay Date: Mon, 29 Jul 2024 14:46:49 +0530 Subject: [PATCH 1/5] feat: Add support for turning on and off the display --- examples/platform/silabs/display/lcd.cpp | 26 +++++++++++++++++++++++- examples/platform/silabs/display/lcd.h | 3 +++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/examples/platform/silabs/display/lcd.cpp b/examples/platform/silabs/display/lcd.cpp index 434dedf4f21b76..0f5d9b36eb8ecc 100644 --- a/examples/platform/silabs/display/lcd.cpp +++ b/examples/platform/silabs/display/lcd.cpp @@ -75,7 +75,7 @@ CHIP_ERROR SilabsLCD::Init(uint8_t * name, bool initialState) SILABS_LOG("Board Display enable fail %d", status); err = CHIP_ERROR_INTERNAL; } -#endif +#endif // SLI_SI91X_MCU_INTERFACE /* Initialize the DMD module for the DISPLAY device driver. */ status = DMD_init(0); @@ -257,6 +257,30 @@ void SilabsLCD::SetStatus(DisplayStatus_t & status) mStatus = status; } +CHIP_ERROR SilabsLCD::TurnOn(void) +{ + CHIP_ERROR err = CHIP_NO_ERROR; + EMSTATUS status; +#if (SLI_SI91X_MCU_INTERFACE) + sl_memlcd_display_enable(); +#else + status = sl_board_enable_display(); + if (status != SL_STATUS_OK) + { + SILABS_LOG("Board Display enable fail %d", status); + err = CHIP_ERROR_INTERNAL; + } +#endif // SLI_SI91X_MCU_INTERFACE + return err; +} + +CHIP_ERROR SilabsLCD::TurnOff(void) +{ + CHIP_ERROR err = CHIP_NO_ERROR; + Clear(); + sl_board_disable_display(); +} + #ifdef QR_CODE_ENABLED void SilabsLCD::WriteQRCode() { diff --git a/examples/platform/silabs/display/lcd.h b/examples/platform/silabs/display/lcd.h index 61fa816743f644..98d1600e37e14a 100644 --- a/examples/platform/silabs/display/lcd.h +++ b/examples/platform/silabs/display/lcd.h @@ -74,6 +74,9 @@ class SilabsLCD void SetStatus(DisplayStatus_t & status); void WriteStatus(); + CHIP_ERROR TurnOn(void); + CHIP_ERROR TurnOff(void); + #ifdef QR_CODE_ENABLED void SetQRCode(uint8_t * str, uint32_t size); void ShowQRCode(bool show); From 95f2ca6527e4527041b573eb848abb1734b9b17c Mon Sep 17 00:00:00 2001 From: Rohan Sahay Date: Wed, 31 Jul 2024 00:14:32 +0530 Subject: [PATCH 2/5] feat: Add support LCD timeouts for ICD applications. --- examples/platform/silabs/BaseApplication.cpp | 2 +- examples/platform/silabs/display/lcd.cpp | 68 ++++++++++++++++---- examples/platform/silabs/display/lcd.h | 18 ++++++ 3 files changed, 76 insertions(+), 12 deletions(-) diff --git a/examples/platform/silabs/BaseApplication.cpp b/examples/platform/silabs/BaseApplication.cpp index 9ceef7fc7dab75..1b72d6cd0e7a29 100644 --- a/examples/platform/silabs/BaseApplication.cpp +++ b/examples/platform/silabs/BaseApplication.cpp @@ -576,7 +576,7 @@ void BaseApplication::UpdateDisplay() #ifdef DISPLAY_ENABLED UpdateLCDStatusScreen(); slLCD.CycleScreens(); -#endif +#endif // DISPLAY_ENABLED } void BaseApplication::CancelFunctionTimer() diff --git a/examples/platform/silabs/display/lcd.cpp b/examples/platform/silabs/display/lcd.cpp index 0f5d9b36eb8ecc..b32853d7b652a7 100644 --- a/examples/platform/silabs/display/lcd.cpp +++ b/examples/platform/silabs/display/lcd.cpp @@ -35,6 +35,8 @@ #include "sl_board_control.h" +#include + #define LCD_SIZE 128 #define QR_CODE_VERSION 4 #define QR_CODE_MODULE_SIZE 3 @@ -214,18 +216,29 @@ void SilabsLCD::SetScreen(Screen_e screen) { return; } - +#ifdef SL_ENABLE_ICD_LCD + TurnOn(); +#endif // SL_ENABLE_ICD_LCD switch (screen) { case DemoScreen: WriteDemoUI(); +#ifdef SL_ENABLE_ICD_LCD + TurnOff(kActivityLCDTimeout); +#endif // SL_ENABLE_ICD_LCD break; case StatusScreen: WriteStatus(); +#ifdef SL_ENABLE_ICD_LCD + TurnOff(kActivityLCDTimeout); +#endif // SL_ENABLE_ICD_LCD break; #ifdef QR_CODE_ENABLED case QRCodeScreen: WriteQRCode(); +#ifdef SL_ENABLE_ICD_LCD + TurnOff(kQRCodeScreenTimeout); +#endif // SL_ENABLE_ICD_LCD break; #endif default: @@ -259,27 +272,60 @@ void SilabsLCD::SetStatus(DisplayStatus_t & status) CHIP_ERROR SilabsLCD::TurnOn(void) { - CHIP_ERROR err = CHIP_NO_ERROR; - EMSTATUS status; + sl_status_t status = SL_STATUS_OK; #if (SLI_SI91X_MCU_INTERFACE) - sl_memlcd_display_enable(); + status = sl_memlcd_power_on(sl_memlcd_get(), true); #else status = sl_board_enable_display(); +#endif // SLI_SI91X_MCU_INTERFACE if (status != SL_STATUS_OK) { - SILABS_LOG("Board Display enable fail %d", status); - err = CHIP_ERROR_INTERNAL; + ChipLogError(DeviceLayer, "sl_board_enable_display failed: %ld", status); + return CHIP_ERROR_INTERNAL; } -#endif // SLI_SI91X_MCU_INTERFACE - return err; + return CHIP_NO_ERROR; } CHIP_ERROR SilabsLCD::TurnOff(void) { - CHIP_ERROR err = CHIP_NO_ERROR; - Clear(); - sl_board_disable_display(); + sl_status_t status = SL_STATUS_OK; + status = SilabsLCD::Clear(); + if (status != SL_STATUS_OK) + { + ChipLogError(DeviceLayer, "LCD clear failed: %ld", status); + return CHIP_ERROR_INTERNAL; + } +#if (SLI_SI91X_MCU_INTERFACE) + status = sl_memlcd_power_on(sl_memlcd_get(), false); +#else + status = sl_board_disable_display(); +#endif // SLI_SI91X_MCU_INTERFACE + if (status != SL_STATUS_OK) + { + ChipLogError(DeviceLayer, "sl_board_disable_display failed: %ld", status); + return CHIP_ERROR_INTERNAL; + } + ChipLogDetail(DeviceLayer, "SilabsLCD::TurnOff completed"); + return CHIP_NO_ERROR; +} + +#ifdef SL_ENABLE_ICD_LCD +CHIP_ERROR SilabsLCD::TurnOff(uint32_t delayInMs) +{ + ChipLogDetail(DeviceLayer, "start LCD timeout timer"); + sl_sleeptimer_restart_timer(&lcdTimerHandle, sl_sleeptimer_ms_to_tick(delayInMs), LcdTimeoutCallback, this, 0, + SL_SLEEPTIMER_NO_HIGH_PRECISION_HF_CLOCKS_REQUIRED_FLAG); + return CHIP_NO_ERROR; +} + +void SilabsLCD::LcdTimeoutCallback(sl_sleeptimer_timer_handle_t * handle, void * data) +{ + // Perform the desired task when the timer expires + (void) handle; + SilabsLCD * sLCD = reinterpret_cast(data); + sLCD->TurnOff(); } +#endif // SL_ENABLE_ICD_LCD #ifdef QR_CODE_ENABLED void SilabsLCD::WriteQRCode() diff --git a/examples/platform/silabs/display/lcd.h b/examples/platform/silabs/display/lcd.h index 98d1600e37e14a..bb87b98854dc3f 100644 --- a/examples/platform/silabs/display/lcd.h +++ b/examples/platform/silabs/display/lcd.h @@ -26,6 +26,11 @@ #endif // QR_CODE_ENABLED #include "demo-ui.h" +#ifdef SL_ENABLE_ICD_LCD +#include +#endif // SL_ENABLE_ICD_LCD + +#include #include class SilabsLCD @@ -58,6 +63,12 @@ class SilabsLCD ICDMode_e icdMode = NotICD; } DisplayStatus_t; +#ifdef SL_ENABLE_ICD_LCD + static const uint32_t kDefaultLCDTimeout = 3000; + const uint32_t kActivityLCDTimeout = 5000; + const uint32_t kQRCodeScreenTimeout = 10000; +#endif // SL_ENABLE_ICD_LCD + typedef void (*customUICB)(GLIB_Context_t * context); CHIP_ERROR Init(uint8_t * name = nullptr, bool initialState = false); void * Context(); @@ -76,6 +87,9 @@ class SilabsLCD CHIP_ERROR TurnOn(void); CHIP_ERROR TurnOff(void); +#ifdef SL_ENABLE_ICD_LCD + CHIP_ERROR TurnOff(uint32_t delayInMs); +#endif // SL_ENABLE_ICD_LCD #ifdef QR_CODE_ENABLED void SetQRCode(uint8_t * str, uint32_t size); @@ -107,4 +121,8 @@ class SilabsLCD DisplayStatus_t mStatus; uint8_t mCurrentScreen = DemoScreen; +#ifdef SL_ENABLE_ICD_LCD + sl_sleeptimer_timer_handle_t lcdTimerHandle; + static void LcdTimeoutCallback(sl_sleeptimer_timer_handle_t * handle, void * data); +#endif // SL_ENABLE_ICD_LCD }; From be25f807f13412e94794323c117df5455906cdca Mon Sep 17 00:00:00 2001 From: Rohan Sahay Date: Thu, 1 Aug 2024 16:07:13 +0530 Subject: [PATCH 3/5] feat: Add support for turning off the display timeout in ICD applications --- examples/lock-app/silabs/src/AppTask.cpp | 11 ++++++++++- examples/platform/silabs/display/lcd.cpp | 4 +--- examples/platform/silabs/display/lcd.h | 6 +++--- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/examples/lock-app/silabs/src/AppTask.cpp b/examples/lock-app/silabs/src/AppTask.cpp index 4e4d05a810acb8..cda1fbe8985868 100644 --- a/examples/lock-app/silabs/src/AppTask.cpp +++ b/examples/lock-app/silabs/src/AppTask.cpp @@ -234,7 +234,10 @@ CHIP_ERROR AppTask::Init() GetLCD().ShowQRCode(true); } #endif // QR_CODE_ENABLED -#endif +#ifdef SL_ENABLE_ICD_LCD + GetLCD().TurnOff(SilabsLCD::kDefaultLCDTimeout); +#endif // SL_ENABLE_ICD_LCD +#endif // DISPLAY_ENABLED chip::DeviceLayer::PlatformMgr().ScheduleWork(UpdateClusterState, reinterpret_cast(nullptr)); @@ -347,7 +350,13 @@ void AppTask::ActionInitiated(LockManager::Action_t aAction, int32_t aActor) sLockLED.Set(!locked); #ifdef DISPLAY_ENABLED +#ifdef SL_ENABLE_ICD_LCD + sAppTask.GetLCD().TurnOn(); +#endif // SL_ENABLE_ICD_LCD sAppTask.GetLCD().WriteDemoUI(locked); +#ifdef SL_ENABLE_ICD_LCD + sAppTask.GetLCD().TurnOff(SilabsLCD::kActivityLCDTimeout); +#endif // SL_ENABLE_ICD_LCD #endif // DISPLAY_ENABLED } else if (aAction == LockManager::UNLATCH_ACTION) diff --git a/examples/platform/silabs/display/lcd.cpp b/examples/platform/silabs/display/lcd.cpp index b32853d7b652a7..b273504593901d 100644 --- a/examples/platform/silabs/display/lcd.cpp +++ b/examples/platform/silabs/display/lcd.cpp @@ -292,7 +292,7 @@ CHIP_ERROR SilabsLCD::TurnOff(void) status = SilabsLCD::Clear(); if (status != SL_STATUS_OK) { - ChipLogError(DeviceLayer, "LCD clear failed: %ld", status); + ChipLogError(DeviceLayer, "SilabsLCD::Clear failed: %ld", status); return CHIP_ERROR_INTERNAL; } #if (SLI_SI91X_MCU_INTERFACE) @@ -305,14 +305,12 @@ CHIP_ERROR SilabsLCD::TurnOff(void) ChipLogError(DeviceLayer, "sl_board_disable_display failed: %ld", status); return CHIP_ERROR_INTERNAL; } - ChipLogDetail(DeviceLayer, "SilabsLCD::TurnOff completed"); return CHIP_NO_ERROR; } #ifdef SL_ENABLE_ICD_LCD CHIP_ERROR SilabsLCD::TurnOff(uint32_t delayInMs) { - ChipLogDetail(DeviceLayer, "start LCD timeout timer"); sl_sleeptimer_restart_timer(&lcdTimerHandle, sl_sleeptimer_ms_to_tick(delayInMs), LcdTimeoutCallback, this, 0, SL_SLEEPTIMER_NO_HIGH_PRECISION_HF_CLOCKS_REQUIRED_FLAG); return CHIP_NO_ERROR; diff --git a/examples/platform/silabs/display/lcd.h b/examples/platform/silabs/display/lcd.h index bb87b98854dc3f..4360752fddbf24 100644 --- a/examples/platform/silabs/display/lcd.h +++ b/examples/platform/silabs/display/lcd.h @@ -64,9 +64,9 @@ class SilabsLCD } DisplayStatus_t; #ifdef SL_ENABLE_ICD_LCD - static const uint32_t kDefaultLCDTimeout = 3000; - const uint32_t kActivityLCDTimeout = 5000; - const uint32_t kQRCodeScreenTimeout = 10000; + static const uint32_t kDefaultLCDTimeout = 3000; + static const uint32_t kActivityLCDTimeout = 5000; + static const uint32_t kQRCodeScreenTimeout = 10000; #endif // SL_ENABLE_ICD_LCD typedef void (*customUICB)(GLIB_Context_t * context); From 505387e0e7a5b490e1e905e054a3bc7200101551 Mon Sep 17 00:00:00 2001 From: Rohan Sahay Date: Wed, 7 Aug 2024 12:48:26 +0530 Subject: [PATCH 4/5] chore: Update SilabsLCD::TurnOn and SilabsLCD::TurnOff functions --- examples/platform/silabs/display/lcd.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/platform/silabs/display/lcd.cpp b/examples/platform/silabs/display/lcd.cpp index b273504593901d..197f14695eeb0b 100644 --- a/examples/platform/silabs/display/lcd.cpp +++ b/examples/platform/silabs/display/lcd.cpp @@ -274,7 +274,9 @@ CHIP_ERROR SilabsLCD::TurnOn(void) { sl_status_t status = SL_STATUS_OK; #if (SLI_SI91X_MCU_INTERFACE) - status = sl_memlcd_power_on(sl_memlcd_get(), true); + sl_memlcd_display_enable(); + sl_memlcd_power_on(sl_memlcd_get(), true); + sl_memlcd_clear(sl_memlcd_get()); #else status = sl_board_enable_display(); #endif // SLI_SI91X_MCU_INTERFACE @@ -296,7 +298,8 @@ CHIP_ERROR SilabsLCD::TurnOff(void) return CHIP_ERROR_INTERNAL; } #if (SLI_SI91X_MCU_INTERFACE) - status = sl_memlcd_power_on(sl_memlcd_get(), false); + sl_memlcd_power_on(sl_memlcd_get(), false); + sl_memlcd_display_disable(); #else status = sl_board_disable_display(); #endif // SLI_SI91X_MCU_INTERFACE From 989df6693318525fa966d237f3328ebadd4f57e0 Mon Sep 17 00:00:00 2001 From: Rohan Sahay Date: Tue, 13 Aug 2024 14:33:27 +0530 Subject: [PATCH 5/5] chore: Update SilabsLCD::TurnOn and SilabsLCD::TurnOff functions --- examples/lock-app/silabs/src/AppTask.cpp | 9 ------ examples/platform/silabs/display/lcd.cpp | 40 +++++++++++++++--------- examples/platform/silabs/display/lcd.h | 5 +-- 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/examples/lock-app/silabs/src/AppTask.cpp b/examples/lock-app/silabs/src/AppTask.cpp index cda1fbe8985868..f3c65ffc1878f1 100644 --- a/examples/lock-app/silabs/src/AppTask.cpp +++ b/examples/lock-app/silabs/src/AppTask.cpp @@ -234,9 +234,6 @@ CHIP_ERROR AppTask::Init() GetLCD().ShowQRCode(true); } #endif // QR_CODE_ENABLED -#ifdef SL_ENABLE_ICD_LCD - GetLCD().TurnOff(SilabsLCD::kDefaultLCDTimeout); -#endif // SL_ENABLE_ICD_LCD #endif // DISPLAY_ENABLED chip::DeviceLayer::PlatformMgr().ScheduleWork(UpdateClusterState, reinterpret_cast(nullptr)); @@ -350,13 +347,7 @@ void AppTask::ActionInitiated(LockManager::Action_t aAction, int32_t aActor) sLockLED.Set(!locked); #ifdef DISPLAY_ENABLED -#ifdef SL_ENABLE_ICD_LCD - sAppTask.GetLCD().TurnOn(); -#endif // SL_ENABLE_ICD_LCD sAppTask.GetLCD().WriteDemoUI(locked); -#ifdef SL_ENABLE_ICD_LCD - sAppTask.GetLCD().TurnOff(SilabsLCD::kActivityLCDTimeout); -#endif // SL_ENABLE_ICD_LCD #endif // DISPLAY_ENABLED } else if (aAction == LockManager::UNLATCH_ACTION) diff --git a/examples/platform/silabs/display/lcd.cpp b/examples/platform/silabs/display/lcd.cpp index 197f14695eeb0b..e78f5f0b50f974 100644 --- a/examples/platform/silabs/display/lcd.cpp +++ b/examples/platform/silabs/display/lcd.cpp @@ -128,7 +128,30 @@ int SilabsLCD::DrawPixel(void * pContext, int32_t x, int32_t y) int SilabsLCD::Update(void) { - return updateDisplay(); + int status = 0; +#ifdef SL_ENABLE_ICD_LCD + SilabsLCD::TurnOn(); +#endif // SL_ENABLE_ICD_LCD + status = updateDisplay(); +#ifdef SL_ENABLE_ICD_LCD + switch (mCurrentScreen) + { + case DemoScreen: + SilabsLCD::TurnOff(kActivityLCDTimeout); + break; + case StatusScreen: + SilabsLCD::TurnOff(kActivityLCDTimeout); + break; +#ifdef QR_CODE_ENABLED + case QRCodeScreen: + SilabsLCD::TurnOff(kQRCodeScreenTimeout); + break; +#endif // QR_CODE_ENABLED + default: + break; + } +#endif // SL_ENABLE_ICD_LCD + return status; } void SilabsLCD::WriteDemoUI(bool state) @@ -153,6 +176,7 @@ void SilabsLCD::WriteDemoUI() demoUIClearMainScreen(mName); demoUIDisplayApp(dState.mainState); } + SilabsLCD::Update(); } void SilabsLCD::WriteStatus() @@ -197,7 +221,7 @@ void SilabsLCD::WriteStatus() GLIB_drawStringOnLine(&glibContext, str, lineNb++, GLIB_ALIGN_LEFT, 0, 0, true); } - updateDisplay(); + SilabsLCD::Update(); } void SilabsLCD::SetCustomUI(customUICB cb) @@ -216,29 +240,17 @@ void SilabsLCD::SetScreen(Screen_e screen) { return; } -#ifdef SL_ENABLE_ICD_LCD - TurnOn(); -#endif // SL_ENABLE_ICD_LCD switch (screen) { case DemoScreen: WriteDemoUI(); -#ifdef SL_ENABLE_ICD_LCD - TurnOff(kActivityLCDTimeout); -#endif // SL_ENABLE_ICD_LCD break; case StatusScreen: WriteStatus(); -#ifdef SL_ENABLE_ICD_LCD - TurnOff(kActivityLCDTimeout); -#endif // SL_ENABLE_ICD_LCD break; #ifdef QR_CODE_ENABLED case QRCodeScreen: WriteQRCode(); -#ifdef SL_ENABLE_ICD_LCD - TurnOff(kQRCodeScreenTimeout); -#endif // SL_ENABLE_ICD_LCD break; #endif default: diff --git a/examples/platform/silabs/display/lcd.h b/examples/platform/silabs/display/lcd.h index 4360752fddbf24..c925d64667bb0e 100644 --- a/examples/platform/silabs/display/lcd.h +++ b/examples/platform/silabs/display/lcd.h @@ -112,15 +112,16 @@ class SilabsLCD GLIB_Context_t glibContext; #ifdef SL_DEMO_NAME - uint8_t mName[] = SL_DEMO_NAME + uint8_t mName[] = SL_DEMO_NAME; #else uint8_t mName[APP_NAME_MAX_LENGTH + 1]; #endif - customUICB customUI = nullptr; + customUICB customUI = nullptr; DemoState_t dState; DisplayStatus_t mStatus; uint8_t mCurrentScreen = DemoScreen; + #ifdef SL_ENABLE_ICD_LCD sl_sleeptimer_timer_handle_t lcdTimerHandle; static void LcdTimeoutCallback(sl_sleeptimer_timer_handle_t * handle, void * data);