From e1557d823246ee9ee63e5b46a6da56ab140ce6cf Mon Sep 17 00:00:00 2001 From: Arun Padakanti Date: Thu, 20 Mar 2025 16:06:21 +0530 Subject: [PATCH 1/6] Fixed button handling in dimmer-switch app --- .../light-switch-app/silabs/include/AppTask.h | 52 +++++ .../silabs/include/LightSwitchMgr.h | 65 +----- .../light-switch-app/silabs/src/AppTask.cpp | 205 +++++++++++++++- .../silabs/src/LightSwitchMgr.cpp | 218 +----------------- 4 files changed, 273 insertions(+), 267 deletions(-) diff --git a/examples/light-switch-app/silabs/include/AppTask.h b/examples/light-switch-app/silabs/include/AppTask.h index 541e9aa37f..45839acd25 100644 --- a/examples/light-switch-app/silabs/include/AppTask.h +++ b/examples/light-switch-app/silabs/include/AppTask.h @@ -57,6 +57,29 @@ class AppTask : public BaseApplication static AppTask & GetAppTask() { return sAppTask; } + struct Timer + { + typedef void (*Callback)(Timer & timer); + + Timer(uint32_t timeoutInMs, Callback callback, void * context); + ~Timer(); + + void Start(); + void Stop(); + void Timeout(); + + Callback mCallback = nullptr; + void * mContext = nullptr; + bool mIsActive = false; + + osTimerId_t mHandler = nullptr; + + private: + static void TimerCallback(void * timerCbArg); + }; + + Timer * longPressTimer = nullptr; + /** * @brief AppTask task main loop function * @@ -65,6 +88,19 @@ class AppTask : public BaseApplication static void AppTaskMain(void * pvParameter); CHIP_ERROR StartAppTask(); + /** + * @brief Event handler when a button is pressed + * Function posts an event for button processing + * + * @param buttonHandle BTN0 or BTN1 + * @param btnAction button action - SL_SIMPLE_BUTTON_PRESSED, + * SL_SIMPLE_BUTTON_RELEASED or SL_SIMPLE_BUTTON_DISABLED + */ + static void ButtonEventHandler(uint8_t button, uint8_t btnAction); + + AppEvent CreateNewEvent(AppEvent::AppEventTypes type); + + static void AppEventHandler(AppEvent * aEvent); private: static AppTask sAppTask; @@ -75,4 +111,20 @@ class AppTask : public BaseApplication * @return CHIP_ERROR */ CHIP_ERROR Init(); + + /** + * @brief PB1 Button event processing function + * Function triggers a switch action sent to the CHIP task + * + * @param aEvent button event being processed + */ + static void SwitchActionEventHandler(AppEvent * aEvent); + + static void OnLongPressTimeout(Timer & timer); + + /** + * @brief This function will be called when PB1 is + * long-pressed to trigger the level-control action + */ + void HandleLongPress(); }; diff --git a/examples/light-switch-app/silabs/include/LightSwitchMgr.h b/examples/light-switch-app/silabs/include/LightSwitchMgr.h index e5bf3b33db..6830c06736 100644 --- a/examples/light-switch-app/silabs/include/LightSwitchMgr.h +++ b/examples/light-switch-app/silabs/include/LightSwitchMgr.h @@ -52,84 +52,37 @@ class LightSwitchMgr .stepSize = 1, .transitionTime = 0, .optionsMask = 0, .optionsOverride = 0 }; - struct Timer - { - typedef void (*Callback)(Timer & timer); - - Timer(uint32_t timeoutInMs, Callback callback, void * context); - ~Timer(); - - void Start(); - void Stop(); - void Timeout(); - - Callback mCallback = nullptr; - void * mContext = nullptr; - bool mIsActive = false; - - osTimerId_t mHandler = nullptr; - - private: - static void TimerCallback(void * timerCbArg); - }; - CHIP_ERROR Init(chip::EndpointId lightSwitchEndpoint, chip::EndpointId genericSwitchEndpoint); void GenericSwitchOnInitialPress(); void GenericSwitchOnShortRelease(); + /** + * @brief Button event processing function + * Function triggers a switch action sent to the CHIP task + * + * @param aEvent button event being processed + */ + static void SwitchActionEventHandler(AppEvent * aEvent); + void TriggerLightSwitchAction(LightSwitchAction action, bool isGroupCommand = false); void TriggerLevelControlAction(StepModeEnum stepMode, bool isGroupCommand = false); StepModeEnum getStepMode(); - - AppEvent CreateNewEvent(AppEvent::AppEventTypes type); + void changeStepMode(); static LightSwitchMgr & GetInstance() { return sSwitch; } - /** - * @brief Event handler when a button is pressed - * Function posts an event for button processing - * - * @param button BUTTON0 or BUTTON1 - * @param btnAction button action - SL_SIMPLE_BUTTON_PRESSED, - * SL_SIMPLE_BUTTON_RELEASED - */ - static void ButtonEventHandler(uint8_t button, uint8_t btnAction); - - static void AppEventHandler(AppEvent * aEvent); - private: static LightSwitchMgr sSwitch; - Timer * mLongPressTimer = nullptr; - bool mFunctionButtonPressed = false; // True when button0 is pressed, used to trigger factory reset - bool mActionButtonPressed = false; // True when button1 is pressed, used to initiate toggle or level-up/down - bool mActionButtonSuppressed = false; // True when both button0 and button1 are pressed, used to switch step direction - bool mResetWarning = false; - // Default Step direction for Level control StepModeEnum stepDirection = StepModeEnum::kUp; - - static void OnLongPressTimeout(Timer & timer); LightSwitchMgr() = default; - /** - * @brief This function will be called when PB0 is - * long-pressed to trigger the factory-reset - */ - void HandleLongPress(); - static void GenericSwitchWorkerFunction(intptr_t context); chip::EndpointId mLightSwitchEndpoint = chip::kInvalidEndpointId; chip::EndpointId mGenericSwitchEndpoint = chip::kInvalidEndpointId; - /** - * @brief Button event processing function - * Function triggers a switch action sent to the CHIP task - * - * @param aEvent button event being processed - */ - static void SwitchActionEventHandler(AppEvent * aEvent); }; diff --git a/examples/light-switch-app/silabs/src/AppTask.cpp b/examples/light-switch-app/silabs/src/AppTask.cpp index c3a32415ab..114904d25f 100644 --- a/examples/light-switch-app/silabs/src/AppTask.cpp +++ b/examples/light-switch-app/silabs/src/AppTask.cpp @@ -49,6 +49,8 @@ #define SYSTEM_STATE_LED &sl_led_led0 +#define APP_FUNCTION_BUTTON 0 +#define APP_LIGHT_SWITCH 1 namespace { constexpr chip::EndpointId kLightSwitchEndpoint = 1; constexpr chip::EndpointId kGenericSwitchEndpoint = 2; @@ -67,11 +69,15 @@ using namespace ::chip::DeviceLayer; *********************************************************/ AppTask AppTask::sAppTask; +bool sFunctionButtonPressed = false; // True when button0 is pressed, used to trigger factory reset +bool sActionButtonPressed = false; // True when button1 is pressed, used to initiate toggle or level-up/down +bool sActionButtonSuppressed = false; // True when both button0 and button1 are pressed, used to switch step direction +bool sFunctionButtonSuppressed = false; // True when both button0 and button1 are pressed CHIP_ERROR AppTask::Init() { CHIP_ERROR err = CHIP_NO_ERROR; - chip::DeviceLayer::Silabs::GetPlatform().SetButtonsCb(LightSwitchMgr::ButtonEventHandler); + chip::DeviceLayer::Silabs::GetPlatform().SetButtonsCb(AppTask::ButtonEventHandler); #ifdef DISPLAY_ENABLED GetLCD().Init((uint8_t *) "Light Switch"); @@ -91,9 +97,98 @@ CHIP_ERROR AppTask::Init() appError(err); } + longPressTimer = new Timer(LONG_PRESS_TIMEOUT, OnLongPressTimeout, this); + return err; } +void AppTask::Timer::Start() +{ + // Starts or restarts the function timer + if (osTimerStart(mHandler, pdMS_TO_TICKS(LONG_PRESS_TIMEOUT)) != osOK) + { + SILABS_LOG("Timer start() failed"); + appError(CHIP_ERROR_INTERNAL); + } + + mIsActive = true; +} + +void AppTask::Timer::Timeout() +{ + mIsActive = false; + if (mCallback) + { + mCallback(*this); + } +} + +void AppTask::HandleLongPress() +{ + AppEvent event; + event.Handler = AppTask::AppEventHandler; + + if (sActionButtonPressed) + { + sActionButtonSuppressed = true; + // Long press button up : Trigger Level Control Action + event.Type = AppEvent::kEventType_TriggerLevelControlAction; + AppTask::GetAppTask().PostEvent(&event); + } +} + +void AppTask::OnLongPressTimeout(AppTask::Timer & timer) +{ + AppTask * app = static_cast(timer.mContext); + if (app) + { + app->HandleLongPress(); + } +} + +AppTask::Timer::Timer(uint32_t timeoutInMs, Callback callback, void * context) : mCallback(callback), mContext(context) +{ + mHandler = osTimerNew(TimerCallback, // timer callback handler + osTimerOnce, // no timer reload (one-shot timer) + this, // pass the app task obj context + NULL // No osTimerAttr_t to provide. + ); + + if (mHandler == NULL) + { + SILABS_LOG("Timer create failed"); + appError(CHIP_ERROR_INTERNAL); + } +} + +AppTask::Timer::~Timer() +{ + if (mHandler) + { + osTimerDelete(mHandler); + mHandler = nullptr; + } +} + +void AppTask::Timer::Stop() +{ + mIsActive = false; + if (osTimerStop(mHandler) == osError) + { + SILABS_LOG("Timer stop() failed"); + appError(CHIP_ERROR_INTERNAL); + } +} + +void AppTask::Timer::TimerCallback(void * timerCbArg) +{ + Timer * timer = reinterpret_cast(timerCbArg); + if (timer) + { + timer->Timeout(); + } +} + CHIP_ERROR AppTask::StartAppTask() { return BaseApplication::StartAppTask(AppTaskMain); @@ -126,3 +221,111 @@ void AppTask::AppTaskMain(void * pvParameter) } } } + +AppEvent AppTask::CreateNewEvent(AppEvent::AppEventTypes type) +{ + AppEvent aEvent; + aEvent.Type = type; + aEvent.Handler = AppTask::AppEventHandler; + return aEvent; +} + +void AppTask::ButtonEventHandler(uint8_t button, uint8_t btnAction) +{ + AppEvent event = {}; + if (btnAction == to_underlying(SilabsPlatform::ButtonAction::ButtonPressed)) + { + event = AppTask::GetAppTask().CreateNewEvent(button ? AppEvent::kEventType_ActionButtonPressed + : AppEvent::kEventType_FunctionButtonPressed); + } + else + { + event = AppTask::GetAppTask().CreateNewEvent(button ? AppEvent::kEventType_ActionButtonReleased + : AppEvent::kEventType_FunctionButtonReleased); + } + AppTask::GetAppTask().PostEvent(&event); +} + +void AppTask::AppEventHandler(AppEvent * aEvent) +{ + switch (aEvent->Type) + { + case AppEvent::kEventType_FunctionButtonPressed: + sFunctionButtonPressed = true; + if (sActionButtonPressed) + { + sActionButtonSuppressed = true; + sFunctionButtonSuppressed = true; + LightSwitchMgr::GetInstance().changeStepMode(); + ChipLogProgress(AppServer, "Step direction changed. Current Step Direction : %s", + ((LightSwitchMgr::GetInstance().getStepMode() == StepModeEnum::kUp) ? "kUp" : "kDown")); + } + else + { + // Post button press event to BaseApplication + AppEvent button_event = {}; + button_event.Type = AppEvent::kEventType_Button; + button_event.ButtonEvent.Action = static_cast(SilabsPlatform::ButtonAction::ButtonPressed); + button_event.Handler = BaseApplication::ButtonHandler; + AppTask::GetAppTask().PostEvent(&button_event); + } + break; + case AppEvent::kEventType_FunctionButtonReleased: + { + sFunctionButtonPressed = false; + if (sFunctionButtonSuppressed) + { + sFunctionButtonSuppressed = false; + } + // Post button release event to BaseApplication + AppEvent button_event = {}; + button_event.Type = AppEvent::kEventType_Button; + button_event.ButtonEvent.Action = static_cast(SilabsPlatform::ButtonAction::ButtonReleased); + button_event.Handler = BaseApplication::ButtonHandler; + AppTask::GetAppTask().PostEvent(&button_event); + break; + } + case AppEvent::kEventType_ActionButtonPressed: + sActionButtonPressed = true; + aEvent->Handler = LightSwitchMgr::SwitchActionEventHandler; + AppTask::GetAppTask().PostEvent(aEvent); + if (sFunctionButtonPressed) + { + sActionButtonSuppressed = true; + sFunctionButtonSuppressed = true; + LightSwitchMgr::GetInstance().changeStepMode(); + ChipLogProgress(AppServer, "Step direction changed. Current Step Direction : %s", + ((LightSwitchMgr::GetInstance().getStepMode() == StepModeEnum::kUp) ? "kUp" : "kDown")); + } + else if (sAppTask.longPressTimer) + { + sAppTask.longPressTimer->Start(); + } + break; + case AppEvent::kEventType_ActionButtonReleased: + sActionButtonPressed = false; + if (sAppTask.longPressTimer) + { + sAppTask.longPressTimer->Stop(); + } + if (sActionButtonSuppressed) + { + sActionButtonSuppressed = false; + } + else + { + aEvent->Type = AppEvent::kEventType_TriggerToggle; + aEvent->Handler = LightSwitchMgr::SwitchActionEventHandler; + AppTask::GetAppTask().PostEvent(aEvent); + } + aEvent->Type = AppEvent::kEventType_ActionButtonReleased; + aEvent->Handler = LightSwitchMgr::SwitchActionEventHandler; + AppTask::GetAppTask().PostEvent(aEvent); + break; + case AppEvent::kEventType_TriggerLevelControlAction: + aEvent->Handler = LightSwitchMgr::SwitchActionEventHandler; + AppTask::GetAppTask().PostEvent(aEvent); + default: + break; + } +} \ No newline at end of file diff --git a/examples/light-switch-app/silabs/src/LightSwitchMgr.cpp b/examples/light-switch-app/silabs/src/LightSwitchMgr.cpp index 4c0ee0cad6..5fff985961 100644 --- a/examples/light-switch-app/silabs/src/LightSwitchMgr.cpp +++ b/examples/light-switch-app/silabs/src/LightSwitchMgr.cpp @@ -43,113 +43,6 @@ using namespace chip::DeviceLayer::Silabs; LightSwitchMgr LightSwitchMgr::sSwitch; -AppEvent LightSwitchMgr::CreateNewEvent(AppEvent::AppEventTypes type) -{ - AppEvent aEvent; - aEvent.Type = type; - aEvent.Handler = LightSwitchMgr::AppEventHandler; - LightSwitchMgr * lightSwitch = &LightSwitchMgr::GetInstance(); - aEvent.LightSwitchEvent.Context = lightSwitch; - return aEvent; -} - -void LightSwitchMgr::Timer::Start() -{ - // Starts or restarts the function timer - if (osTimerStart(mHandler, pdMS_TO_TICKS(LONG_PRESS_TIMEOUT)) != osOK) - { - SILABS_LOG("Timer start() failed"); - appError(CHIP_ERROR_INTERNAL); - } - - mIsActive = true; -} - -void LightSwitchMgr::Timer::Timeout() -{ - mIsActive = false; - if (mCallback) - { - mCallback(*this); - } -} - -void LightSwitchMgr::HandleLongPress() -{ - AppEvent event; - event.Handler = AppEventHandler; - LightSwitchMgr * lightSwitch = &LightSwitchMgr::GetInstance(); - event.LightSwitchEvent.Context = lightSwitch; - if (mFunctionButtonPressed) - { - if (!mResetWarning) - { - // Long press button down: Reset warning! - event.Type = AppEvent::kEventType_ResetWarning; - AppTask::GetAppTask().PostEvent(&event); - } - } - else if (mActionButtonPressed) - { - mActionButtonSuppressed = true; - // Long press button up : Trigger Level Control Action - event.Type = AppEvent::kEventType_TriggerLevelControlAction; - AppTask::GetAppTask().PostEvent(&event); - } -} - -void LightSwitchMgr::OnLongPressTimeout(LightSwitchMgr::Timer & timer) -{ - LightSwitchMgr * app = static_cast(timer.mContext); - if (app) - { - app->HandleLongPress(); - } -} - -LightSwitchMgr::Timer::Timer(uint32_t timeoutInMs, Callback callback, void * context) : mCallback(callback), mContext(context) -{ - mHandler = osTimerNew(TimerCallback, // timer callback handler - osTimerOnce, // no timer reload (one-shot timer) - this, // pass the app task obj context - NULL // No osTimerAttr_t to provide. - ); - - if (mHandler == NULL) - { - SILABS_LOG("Timer create failed"); - appError(CHIP_ERROR_INTERNAL); - } -} - -LightSwitchMgr::Timer::~Timer() -{ - if (mHandler) - { - osTimerDelete(mHandler); - mHandler = nullptr; - } -} - -void LightSwitchMgr::Timer::Stop() -{ - mIsActive = false; - if (osTimerStop(mHandler) == osError) - { - SILABS_LOG("Timer stop() failed"); - appError(CHIP_ERROR_INTERNAL); - } -} - -void LightSwitchMgr::Timer::TimerCallback(void * timerCbArg) -{ - Timer * timer = reinterpret_cast(timerCbArg); - if (timer) - { - timer->Timeout(); - } -} - /** * @brief Configures LightSwitchMgr * This function needs to be call before using the LightSwitchMgr @@ -165,8 +58,6 @@ CHIP_ERROR LightSwitchMgr::Init(EndpointId lightSwitchEndpoint, chip::EndpointId mLightSwitchEndpoint = lightSwitchEndpoint; mGenericSwitchEndpoint = genericSwitchEndpoint; - mLongPressTimer = new Timer(LONG_PRESS_TIMEOUT, OnLongPressTimeout, this); - // Configure Bindings CHIP_ERROR error = InitBindingHandler(); if (error != CHIP_NO_ERROR) @@ -213,8 +104,14 @@ StepModeEnum LightSwitchMgr::getStepMode() return stepDirection; } +void LightSwitchMgr::changeStepMode() +{ + stepDirection = (stepDirection==StepModeEnum::kUp) ? StepModeEnum::kDown : StepModeEnum::kUp; +} + void LightSwitchMgr::TriggerLightSwitchAction(LightSwitchAction action, bool isGroupCommand) { + ChipLogProgress(AppServer, "1"); BindingCommandData * data = Platform::New(); data->clusterId = chip::app::Clusters::OnOff::Id; @@ -246,6 +143,7 @@ void LightSwitchMgr::TriggerLightSwitchAction(LightSwitchAction action, bool isG void LightSwitchMgr::TriggerLevelControlAction(LevelControl::StepModeEnum stepMode, bool isGroupCommand) { + ChipLogProgress(AppServer, "2"); BindingCommandData * data = Platform::New(); data->clusterId = chip::app::Clusters::LevelControl::Id; @@ -295,109 +193,9 @@ void LightSwitchMgr::GenericSwitchWorkerFunction(intptr_t context) Platform::Delete(data); } -void LightSwitchMgr::ButtonEventHandler(uint8_t button, uint8_t btnAction) -{ - AppEvent event = {}; - if (btnAction == to_underlying(SilabsPlatform::ButtonAction::ButtonPressed)) - { - event = LightSwitchMgr::GetInstance().CreateNewEvent(button ? AppEvent::kEventType_ActionButtonPressed - : AppEvent::kEventType_FunctionButtonPressed); - } - else - { - event = LightSwitchMgr::GetInstance().CreateNewEvent(button ? AppEvent::kEventType_ActionButtonReleased - : AppEvent::kEventType_FunctionButtonReleased); - } - AppTask::GetAppTask().PostEvent(&event); -} - -void LightSwitchMgr::AppEventHandler(AppEvent * aEvent) -{ - LightSwitchMgr * lightSwitch = static_cast(aEvent->LightSwitchEvent.Context); - switch (aEvent->Type) - { - case AppEvent::kEventType_ResetWarning: - lightSwitch->mResetWarning = true; - AppTask::GetAppTask().StartFactoryResetSequence(); - break; - case AppEvent::kEventType_ResetCanceled: - lightSwitch->mResetWarning = false; - AppTask::GetAppTask().CancelFactoryResetSequence(); - break; - case AppEvent::kEventType_FunctionButtonPressed: - lightSwitch->mFunctionButtonPressed = true; - if (lightSwitch->mLongPressTimer) - { - lightSwitch->mLongPressTimer->Start(); - } - if (lightSwitch->mActionButtonPressed) - { - lightSwitch->mActionButtonSuppressed = true; - lightSwitch->stepDirection = - (lightSwitch->stepDirection == StepModeEnum::kUp) ? StepModeEnum::kDown : StepModeEnum::kUp; - ChipLogProgress(AppServer, "Step direction changed. Current Step Direction : %s", - ((lightSwitch->stepDirection == StepModeEnum::kUp) ? "kUp" : "kDown")); - } - break; - case AppEvent::kEventType_FunctionButtonReleased: - lightSwitch->mFunctionButtonPressed = false; - if (lightSwitch->mLongPressTimer) - { - lightSwitch->mLongPressTimer->Stop(); - } - if (lightSwitch->mResetWarning) - { - aEvent->Type = AppEvent::kEventType_ResetCanceled; - AppTask::GetAppTask().PostEvent(aEvent); - } - break; - case AppEvent::kEventType_ActionButtonPressed: - lightSwitch->mActionButtonPressed = true; - aEvent->Handler = LightSwitchMgr::SwitchActionEventHandler; - AppTask::GetAppTask().PostEvent(aEvent); - if (lightSwitch->mLongPressTimer) - { - lightSwitch->mLongPressTimer->Start(); - } - if (lightSwitch->mFunctionButtonPressed) - { - lightSwitch->mActionButtonSuppressed = true; - lightSwitch->stepDirection = - (lightSwitch->stepDirection == StepModeEnum::kUp) ? StepModeEnum::kDown : StepModeEnum::kUp; - ChipLogProgress(AppServer, "Step direction changed. Current Step Direction : %s", - ((lightSwitch->stepDirection == StepModeEnum::kUp) ? "kUp" : "kDown")); - } - break; - case AppEvent::kEventType_ActionButtonReleased: - lightSwitch->mActionButtonPressed = false; - if (lightSwitch->mLongPressTimer) - { - lightSwitch->mLongPressTimer->Stop(); - } - if (lightSwitch->mActionButtonSuppressed) - { - lightSwitch->mActionButtonSuppressed = false; - } - else - { - aEvent->Type = AppEvent::kEventType_TriggerToggle; - aEvent->Handler = LightSwitchMgr::SwitchActionEventHandler; - AppTask::GetAppTask().PostEvent(aEvent); - } - aEvent->Type = AppEvent::kEventType_ActionButtonReleased; - aEvent->Handler = LightSwitchMgr::SwitchActionEventHandler; - AppTask::GetAppTask().PostEvent(aEvent); - break; - case AppEvent::kEventType_TriggerLevelControlAction: - aEvent->Handler = LightSwitchMgr::SwitchActionEventHandler; - AppTask::GetAppTask().PostEvent(aEvent); - default: - break; - } -} - void LightSwitchMgr::SwitchActionEventHandler(AppEvent * aEvent) { + ChipLogProgress(AppServer, "0"); switch (aEvent->Type) { case AppEvent::kEventType_ActionButtonPressed: From 4c4737ce82583e5f9bbc3da1ef8621d4ecda0fd5 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Thu, 20 Mar 2025 10:51:37 +0000 Subject: [PATCH 2/6] Restyled by whitespace --- examples/light-switch-app/silabs/src/AppTask.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/light-switch-app/silabs/src/AppTask.cpp b/examples/light-switch-app/silabs/src/AppTask.cpp index 114904d25f..1b4d0b7242 100644 --- a/examples/light-switch-app/silabs/src/AppTask.cpp +++ b/examples/light-switch-app/silabs/src/AppTask.cpp @@ -328,4 +328,4 @@ void AppTask::AppEventHandler(AppEvent * aEvent) default: break; } -} \ No newline at end of file +} From 21f3029c25c2bad4b339cc1523bfe12e0391ab45 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Thu, 20 Mar 2025 10:51:41 +0000 Subject: [PATCH 3/6] Restyled by clang-format --- .../light-switch-app/silabs/include/AppTask.h | 2 +- .../silabs/include/LightSwitchMgr.h | 3 +- .../light-switch-app/silabs/src/AppTask.cpp | 29 +++++++++---------- .../silabs/src/LightSwitchMgr.cpp | 2 +- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/examples/light-switch-app/silabs/include/AppTask.h b/examples/light-switch-app/silabs/include/AppTask.h index 45839acd25..45079a0132 100644 --- a/examples/light-switch-app/silabs/include/AppTask.h +++ b/examples/light-switch-app/silabs/include/AppTask.h @@ -78,7 +78,7 @@ class AppTask : public BaseApplication static void TimerCallback(void * timerCbArg); }; - Timer * longPressTimer = nullptr; + Timer * longPressTimer = nullptr; /** * @brief AppTask task main loop function diff --git a/examples/light-switch-app/silabs/include/LightSwitchMgr.h b/examples/light-switch-app/silabs/include/LightSwitchMgr.h index 6830c06736..26e7af5af1 100644 --- a/examples/light-switch-app/silabs/include/LightSwitchMgr.h +++ b/examples/light-switch-app/silabs/include/LightSwitchMgr.h @@ -78,11 +78,10 @@ class LightSwitchMgr // Default Step direction for Level control StepModeEnum stepDirection = StepModeEnum::kUp; - LightSwitchMgr() = default; + LightSwitchMgr() = default; static void GenericSwitchWorkerFunction(intptr_t context); chip::EndpointId mLightSwitchEndpoint = chip::kInvalidEndpointId; chip::EndpointId mGenericSwitchEndpoint = chip::kInvalidEndpointId; - }; diff --git a/examples/light-switch-app/silabs/src/AppTask.cpp b/examples/light-switch-app/silabs/src/AppTask.cpp index 1b4d0b7242..e9835e2bcb 100644 --- a/examples/light-switch-app/silabs/src/AppTask.cpp +++ b/examples/light-switch-app/silabs/src/AppTask.cpp @@ -69,10 +69,10 @@ using namespace ::chip::DeviceLayer; *********************************************************/ AppTask AppTask::sAppTask; -bool sFunctionButtonPressed = false; // True when button0 is pressed, used to trigger factory reset -bool sActionButtonPressed = false; // True when button1 is pressed, used to initiate toggle or level-up/down -bool sActionButtonSuppressed = false; // True when both button0 and button1 are pressed, used to switch step direction -bool sFunctionButtonSuppressed = false; // True when both button0 and button1 are pressed +bool sFunctionButtonPressed = false; // True when button0 is pressed, used to trigger factory reset +bool sActionButtonPressed = false; // True when button1 is pressed, used to initiate toggle or level-up/down +bool sActionButtonSuppressed = false; // True when both button0 and button1 are pressed, used to switch step direction +bool sFunctionButtonSuppressed = false; // True when both button0 and button1 are pressed CHIP_ERROR AppTask::Init() { @@ -126,7 +126,7 @@ void AppTask::Timer::Timeout() void AppTask::HandleLongPress() { AppEvent event; - event.Handler = AppTask::AppEventHandler; + event.Handler = AppTask::AppEventHandler; if (sActionButtonPressed) { @@ -225,8 +225,8 @@ void AppTask::AppTaskMain(void * pvParameter) AppEvent AppTask::CreateNewEvent(AppEvent::AppEventTypes type) { AppEvent aEvent; - aEvent.Type = type; - aEvent.Handler = AppTask::AppEventHandler; + aEvent.Type = type; + aEvent.Handler = AppTask::AppEventHandler; return aEvent; } @@ -236,12 +236,12 @@ void AppTask::ButtonEventHandler(uint8_t button, uint8_t btnAction) if (btnAction == to_underlying(SilabsPlatform::ButtonAction::ButtonPressed)) { event = AppTask::GetAppTask().CreateNewEvent(button ? AppEvent::kEventType_ActionButtonPressed - : AppEvent::kEventType_FunctionButtonPressed); + : AppEvent::kEventType_FunctionButtonPressed); } else { event = AppTask::GetAppTask().CreateNewEvent(button ? AppEvent::kEventType_ActionButtonReleased - : AppEvent::kEventType_FunctionButtonReleased); + : AppEvent::kEventType_FunctionButtonReleased); } AppTask::GetAppTask().PostEvent(&event); } @@ -250,11 +250,11 @@ void AppTask::AppEventHandler(AppEvent * aEvent) { switch (aEvent->Type) { - case AppEvent::kEventType_FunctionButtonPressed: + case AppEvent::kEventType_FunctionButtonPressed: sFunctionButtonPressed = true; if (sActionButtonPressed) { - sActionButtonSuppressed = true; + sActionButtonSuppressed = true; sFunctionButtonSuppressed = true; LightSwitchMgr::GetInstance().changeStepMode(); ChipLogProgress(AppServer, "Step direction changed. Current Step Direction : %s", @@ -270,8 +270,7 @@ void AppTask::AppEventHandler(AppEvent * aEvent) AppTask::GetAppTask().PostEvent(&button_event); } break; - case AppEvent::kEventType_FunctionButtonReleased: - { + case AppEvent::kEventType_FunctionButtonReleased: { sFunctionButtonPressed = false; if (sFunctionButtonSuppressed) { @@ -287,11 +286,11 @@ void AppTask::AppEventHandler(AppEvent * aEvent) } case AppEvent::kEventType_ActionButtonPressed: sActionButtonPressed = true; - aEvent->Handler = LightSwitchMgr::SwitchActionEventHandler; + aEvent->Handler = LightSwitchMgr::SwitchActionEventHandler; AppTask::GetAppTask().PostEvent(aEvent); if (sFunctionButtonPressed) { - sActionButtonSuppressed = true; + sActionButtonSuppressed = true; sFunctionButtonSuppressed = true; LightSwitchMgr::GetInstance().changeStepMode(); ChipLogProgress(AppServer, "Step direction changed. Current Step Direction : %s", diff --git a/examples/light-switch-app/silabs/src/LightSwitchMgr.cpp b/examples/light-switch-app/silabs/src/LightSwitchMgr.cpp index 5fff985961..b1d8df6a1f 100644 --- a/examples/light-switch-app/silabs/src/LightSwitchMgr.cpp +++ b/examples/light-switch-app/silabs/src/LightSwitchMgr.cpp @@ -106,7 +106,7 @@ StepModeEnum LightSwitchMgr::getStepMode() void LightSwitchMgr::changeStepMode() { - stepDirection = (stepDirection==StepModeEnum::kUp) ? StepModeEnum::kDown : StepModeEnum::kUp; + stepDirection = (stepDirection == StepModeEnum::kUp) ? StepModeEnum::kDown : StepModeEnum::kUp; } void LightSwitchMgr::TriggerLightSwitchAction(LightSwitchAction action, bool isGroupCommand) From 5f00d3a0b3ee500d6d0a71324c3a36166ee962f7 Mon Sep 17 00:00:00 2001 From: Arun Padakanti Date: Thu, 20 Mar 2025 16:27:27 +0530 Subject: [PATCH 4/6] Code clean-up --- examples/light-switch-app/silabs/src/AppTask.cpp | 2 -- examples/light-switch-app/silabs/src/LightSwitchMgr.cpp | 3 --- 2 files changed, 5 deletions(-) diff --git a/examples/light-switch-app/silabs/src/AppTask.cpp b/examples/light-switch-app/silabs/src/AppTask.cpp index e9835e2bcb..b9cdb51c95 100644 --- a/examples/light-switch-app/silabs/src/AppTask.cpp +++ b/examples/light-switch-app/silabs/src/AppTask.cpp @@ -49,8 +49,6 @@ #define SYSTEM_STATE_LED &sl_led_led0 -#define APP_FUNCTION_BUTTON 0 -#define APP_LIGHT_SWITCH 1 namespace { constexpr chip::EndpointId kLightSwitchEndpoint = 1; constexpr chip::EndpointId kGenericSwitchEndpoint = 2; diff --git a/examples/light-switch-app/silabs/src/LightSwitchMgr.cpp b/examples/light-switch-app/silabs/src/LightSwitchMgr.cpp index b1d8df6a1f..85b8a1ce1e 100644 --- a/examples/light-switch-app/silabs/src/LightSwitchMgr.cpp +++ b/examples/light-switch-app/silabs/src/LightSwitchMgr.cpp @@ -111,7 +111,6 @@ void LightSwitchMgr::changeStepMode() void LightSwitchMgr::TriggerLightSwitchAction(LightSwitchAction action, bool isGroupCommand) { - ChipLogProgress(AppServer, "1"); BindingCommandData * data = Platform::New(); data->clusterId = chip::app::Clusters::OnOff::Id; @@ -143,7 +142,6 @@ void LightSwitchMgr::TriggerLightSwitchAction(LightSwitchAction action, bool isG void LightSwitchMgr::TriggerLevelControlAction(LevelControl::StepModeEnum stepMode, bool isGroupCommand) { - ChipLogProgress(AppServer, "2"); BindingCommandData * data = Platform::New(); data->clusterId = chip::app::Clusters::LevelControl::Id; @@ -195,7 +193,6 @@ void LightSwitchMgr::GenericSwitchWorkerFunction(intptr_t context) void LightSwitchMgr::SwitchActionEventHandler(AppEvent * aEvent) { - ChipLogProgress(AppServer, "0"); switch (aEvent->Type) { case AppEvent::kEventType_ActionButtonPressed: From ce58433c09236a57bd28d882a150b499a5e30354 Mon Sep 17 00:00:00 2001 From: Arun Padakanti Date: Fri, 21 Mar 2025 10:40:45 +0530 Subject: [PATCH 5/6] Button0 press and release sync added. --- .../light-switch-app/silabs/src/AppTask.cpp | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/examples/light-switch-app/silabs/src/AppTask.cpp b/examples/light-switch-app/silabs/src/AppTask.cpp index b9cdb51c95..b753aafecd 100644 --- a/examples/light-switch-app/silabs/src/AppTask.cpp +++ b/examples/light-switch-app/silabs/src/AppTask.cpp @@ -70,7 +70,7 @@ AppTask AppTask::sAppTask; bool sFunctionButtonPressed = false; // True when button0 is pressed, used to trigger factory reset bool sActionButtonPressed = false; // True when button1 is pressed, used to initiate toggle or level-up/down bool sActionButtonSuppressed = false; // True when both button0 and button1 are pressed, used to switch step direction -bool sFunctionButtonSuppressed = false; // True when both button0 and button1 are pressed +bool sIsButtonEventTriggered = false; // True when button0 press event is posted to BaseApplication CHIP_ERROR AppTask::Init() { @@ -253,13 +253,13 @@ void AppTask::AppEventHandler(AppEvent * aEvent) if (sActionButtonPressed) { sActionButtonSuppressed = true; - sFunctionButtonSuppressed = true; LightSwitchMgr::GetInstance().changeStepMode(); ChipLogProgress(AppServer, "Step direction changed. Current Step Direction : %s", ((LightSwitchMgr::GetInstance().getStepMode() == StepModeEnum::kUp) ? "kUp" : "kDown")); } else { + sIsButtonEventTriggered = true; // Post button press event to BaseApplication AppEvent button_event = {}; button_event.Type = AppEvent::kEventType_Button; @@ -270,16 +270,16 @@ void AppTask::AppEventHandler(AppEvent * aEvent) break; case AppEvent::kEventType_FunctionButtonReleased: { sFunctionButtonPressed = false; - if (sFunctionButtonSuppressed) + if (sIsButtonEventTriggered) { - sFunctionButtonSuppressed = false; + sIsButtonEventTriggered = false; + // Post button release event to BaseApplication + AppEvent button_event = {}; + button_event.Type = AppEvent::kEventType_Button; + button_event.ButtonEvent.Action = static_cast(SilabsPlatform::ButtonAction::ButtonReleased); + button_event.Handler = BaseApplication::ButtonHandler; + AppTask::GetAppTask().PostEvent(&button_event); } - // Post button release event to BaseApplication - AppEvent button_event = {}; - button_event.Type = AppEvent::kEventType_Button; - button_event.ButtonEvent.Action = static_cast(SilabsPlatform::ButtonAction::ButtonReleased); - button_event.Handler = BaseApplication::ButtonHandler; - AppTask::GetAppTask().PostEvent(&button_event); break; } case AppEvent::kEventType_ActionButtonPressed: @@ -289,7 +289,6 @@ void AppTask::AppEventHandler(AppEvent * aEvent) if (sFunctionButtonPressed) { sActionButtonSuppressed = true; - sFunctionButtonSuppressed = true; LightSwitchMgr::GetInstance().changeStepMode(); ChipLogProgress(AppServer, "Step direction changed. Current Step Direction : %s", ((LightSwitchMgr::GetInstance().getStepMode() == StepModeEnum::kUp) ? "kUp" : "kDown")); From 50ee6bd32d94497bc9e6ebe9ff310d011f572fcc Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Fri, 21 Mar 2025 05:11:33 +0000 Subject: [PATCH 6/6] Restyled by clang-format --- examples/light-switch-app/silabs/src/AppTask.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/light-switch-app/silabs/src/AppTask.cpp b/examples/light-switch-app/silabs/src/AppTask.cpp index b753aafecd..3a3b285c80 100644 --- a/examples/light-switch-app/silabs/src/AppTask.cpp +++ b/examples/light-switch-app/silabs/src/AppTask.cpp @@ -67,10 +67,10 @@ using namespace ::chip::DeviceLayer; *********************************************************/ AppTask AppTask::sAppTask; -bool sFunctionButtonPressed = false; // True when button0 is pressed, used to trigger factory reset -bool sActionButtonPressed = false; // True when button1 is pressed, used to initiate toggle or level-up/down -bool sActionButtonSuppressed = false; // True when both button0 and button1 are pressed, used to switch step direction -bool sIsButtonEventTriggered = false; // True when button0 press event is posted to BaseApplication +bool sFunctionButtonPressed = false; // True when button0 is pressed, used to trigger factory reset +bool sActionButtonPressed = false; // True when button1 is pressed, used to initiate toggle or level-up/down +bool sActionButtonSuppressed = false; // True when both button0 and button1 are pressed, used to switch step direction +bool sIsButtonEventTriggered = false; // True when button0 press event is posted to BaseApplication CHIP_ERROR AppTask::Init() { @@ -252,14 +252,14 @@ void AppTask::AppEventHandler(AppEvent * aEvent) sFunctionButtonPressed = true; if (sActionButtonPressed) { - sActionButtonSuppressed = true; + sActionButtonSuppressed = true; LightSwitchMgr::GetInstance().changeStepMode(); ChipLogProgress(AppServer, "Step direction changed. Current Step Direction : %s", ((LightSwitchMgr::GetInstance().getStepMode() == StepModeEnum::kUp) ? "kUp" : "kDown")); } else { - sIsButtonEventTriggered = true; + sIsButtonEventTriggered = true; // Post button press event to BaseApplication AppEvent button_event = {}; button_event.Type = AppEvent::kEventType_Button; @@ -272,7 +272,7 @@ void AppTask::AppEventHandler(AppEvent * aEvent) sFunctionButtonPressed = false; if (sIsButtonEventTriggered) { - sIsButtonEventTriggered = false; + sIsButtonEventTriggered = false; // Post button release event to BaseApplication AppEvent button_event = {}; button_event.Type = AppEvent::kEventType_Button; @@ -288,7 +288,7 @@ void AppTask::AppEventHandler(AppEvent * aEvent) AppTask::GetAppTask().PostEvent(aEvent); if (sFunctionButtonPressed) { - sActionButtonSuppressed = true; + sActionButtonSuppressed = true; LightSwitchMgr::GetInstance().changeStepMode(); ChipLogProgress(AppServer, "Step direction changed. Current Step Direction : %s", ((LightSwitchMgr::GetInstance().getStepMode() == StepModeEnum::kUp) ? "kUp" : "kDown"));