33using namespace Pinetime ::Controllers;
44
55void ButtonTimerCallback (TimerHandle_t xTimer) {
6- auto * buttonHandler = static_cast <ButtonHandler *>(pvTimerGetTimerID (xTimer));
7- buttonHandler-> HandleEvent (ButtonHandler::Events::Timer );
6+ auto * sysTask = static_cast <Pinetime::System::SystemTask *>(pvTimerGetTimerID (xTimer));
7+ sysTask-> PushMessage (Pinetime::System::Messages::HandleButtonTimerEvent );
88}
99
1010void ButtonHandler::Init (Pinetime::System::SystemTask* systemTask) {
11- this ->systemTask = systemTask;
12- buttonTimer = xTimerCreate (" buttonTimer" , 0 , pdFALSE, this , ButtonTimerCallback);
11+ buttonTimer = xTimerCreate (" buttonTimer" , 0 , pdFALSE, systemTask, ButtonTimerCallback);
1312}
1413
15- void ButtonHandler::HandleEvent (Events event) {
14+ ButtonActions ButtonHandler::HandleEvent (Events event) {
1615 static constexpr TickType_t doubleClickTime = pdMS_TO_TICKS (200 );
1716 static constexpr TickType_t longPressTime = pdMS_TO_TICKS (400 );
1817 static constexpr TickType_t longerPressTime = pdMS_TO_TICKS (2000 );
1918
20- if (systemTask->IsSleeping ()) {
21- // This is for faster wakeup, sacrificing special longpress and doubleclick handling while sleeping
22- systemTask->PushMessage (System::Messages::GoToRunning);
23- } else {
24- systemTask->PushMessage (System::Messages::ReloadIdleTimer);
25- }
26-
2719 if (event == Events::Press) {
2820 buttonPressed = true ;
2921 } else if (event == Events::Release) {
@@ -42,9 +34,9 @@ void ButtonHandler::HandleEvent(Events event) {
4234 case States::Pressed:
4335 if (event == Events::Press) {
4436 if (xTaskGetTickCount () - releaseTime < doubleClickTime) {
45- systemTask->PushMessage (System::Messages::OnButtonDoubleClicked);
4637 xTimerStop (buttonTimer, 0 );
4738 state = States::Idle;
39+ return ButtonActions::DoubleClick;
4840 }
4941 } else if (event == Events::Release) {
5042 xTimerChangePeriod (buttonTimer, doubleClickTime, 0 );
@@ -55,31 +47,32 @@ void ButtonHandler::HandleEvent(Events event) {
5547 xTimerStart (buttonTimer, 0 );
5648 state = States::Holding;
5749 } else {
58- systemTask->PushMessage (System::Messages::OnButtonPushed);
5950 state = States::Idle;
51+ return ButtonActions::Click;
6052 }
6153 }
6254 break ;
6355 case States::Holding:
6456 if (event == Events::Release) {
65- systemTask->PushMessage (System::Messages::OnButtonPushed);
6657 xTimerStop (buttonTimer, 0 );
6758 state = States::Idle;
59+ return ButtonActions::Click;
6860 } else if (event == Events::Timer) {
6961 xTimerChangePeriod (buttonTimer, longerPressTime - longPressTime - doubleClickTime, 0 );
7062 xTimerStart (buttonTimer, 0 );
71- systemTask->PushMessage (System::Messages::OnButtonLongPressed);
7263 state = States::LongHeld;
64+ return ButtonActions::LongPress;
7365 }
7466 break ;
7567 case States::LongHeld:
7668 if (event == Events::Release) {
7769 xTimerStop (buttonTimer, 0 );
7870 state = States::Idle;
7971 } else if (event == Events::Timer) {
80- systemTask->PushMessage (System::Messages::OnButtonLongerPressed);
8172 state = States::Idle;
73+ return ButtonActions::LongerPress;
8274 }
8375 break ;
8476 }
77+ return ButtonActions::None;
8578}
0 commit comments