Skip to content

Commit 351c60a

Browse files
committed
Return button action instead of pushing messages
1 parent b19a2a7 commit 351c60a

6 files changed

Lines changed: 66 additions & 50 deletions

File tree

src/buttonhandler/ButtonActions.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#pragma once
2+
3+
namespace Pinetime {
4+
namespace Controllers {
5+
enum class ButtonActions { None, Click, DoubleClick, LongPress, LongerPress };
6+
}
7+
}

src/buttonhandler/ButtonHandler.cpp

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,19 @@
33
using namespace Pinetime::Controllers;
44

55
void 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

1010
void 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
}

src/buttonhandler/ButtonHandler.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include "ButtonActions.h"
34
#include "systemtask/SystemTask.h"
45
#include <FreeRTOS.h>
56
#include <timers.h>
@@ -10,11 +11,10 @@ namespace Pinetime {
1011
public:
1112
enum class Events : uint8_t { Press, Release, Timer };
1213
void Init(Pinetime::System::SystemTask* systemTask);
13-
void HandleEvent(Events event);
14+
ButtonActions HandleEvent(Events event);
1415

1516
private:
1617
enum class States : uint8_t { Idle, Pressed, Holding, LongHeld };
17-
Pinetime::System::SystemTask* systemTask = nullptr;
1818
TickType_t releaseTime = 0;
1919
TimerHandle_t buttonTimer;
2020
bool buttonPressed = false;

src/systemtask/Messages.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,13 @@ namespace Pinetime {
1515
BleFirmwareUpdateStarted,
1616
BleFirmwareUpdateFinished,
1717
OnTouchEvent,
18-
OnButtonPushed,
19-
OnButtonLongPressed,
20-
OnButtonLongerPressed,
21-
OnButtonDoubleClicked,
2218
HandleButtonEvent,
19+
HandleButtonTimerEvent,
2320
OnDisplayTaskSleeping,
2421
EnableSleeping,
2522
DisableSleeping,
2623
OnNewDay,
2724
OnChargingEvent,
28-
ReloadIdleTimer,
2925
SetOffAlarm,
3026
StopRinging,
3127
MeasureBatteryTimerExpired,

src/systemtask/SystemTask.cpp

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -335,33 +335,25 @@ void SystemTask::Work() {
335335
ReloadIdleTimer();
336336
displayApp.PushMessage(Pinetime::Applications::Display::Messages::TouchEvent);
337337
break;
338-
case Messages::OnButtonPushed:
339-
if (!isSleeping && !isGoingToSleep) {
340-
displayApp.PushMessage(Pinetime::Applications::Display::Messages::ButtonPushed);
341-
}
342-
break;
343-
case Messages::OnButtonLongPressed:
344-
if (!isSleeping) {
345-
displayApp.PushMessage(Pinetime::Applications::Display::Messages::ButtonLongPressed);
346-
}
347-
break;
348-
case Messages::OnButtonLongerPressed:
349-
if (!isSleeping) {
350-
displayApp.PushMessage(Pinetime::Applications::Display::Messages::ButtonLongerPressed);
351-
}
352-
break;
353-
case Messages::OnButtonDoubleClicked:
354-
if (!isSleeping) {
355-
displayApp.PushMessage(Pinetime::Applications::Display::Messages::ButtonDoubleClicked);
338+
case Messages::HandleButtonEvent: {
339+
// This is for faster wakeup, sacrificing special longpress and doubleclick handling while sleeping
340+
if (IsSleeping()) {
341+
GoToRunning();
342+
break;
356343
}
357-
break;
358-
case Messages::HandleButtonEvent:
344+
345+
Controllers::ButtonActions action;
359346
if (nrf_gpio_pin_read(Pinetime::PinMap::Button) == 0) {
360-
buttonHandler.HandleEvent(Pinetime::Controllers::ButtonHandler::Events::Release);
347+
action = buttonHandler.HandleEvent(Controllers::ButtonHandler::Events::Release);
361348
} else {
362-
buttonHandler.HandleEvent(Pinetime::Controllers::ButtonHandler::Events::Press);
349+
action = buttonHandler.HandleEvent(Controllers::ButtonHandler::Events::Press);
363350
}
364-
break;
351+
HandleButtonAction(action);
352+
} break;
353+
case Messages::HandleButtonTimerEvent: {
354+
auto action = buttonHandler.HandleEvent(Controllers::ButtonHandler::Events::Timer);
355+
HandleButtonAction(action);
356+
} break;
365357
case Messages::OnDisplayTaskSleeping:
366358
if (BootloaderVersion::IsValid()) {
367359
// First versions of the bootloader do not expose their version and cannot initialize the SPI NOR FLASH
@@ -398,9 +390,6 @@ void SystemTask::Work() {
398390
case Messages::BatteryPercentageUpdated:
399391
nimbleController.NotifyBatteryLevel(batteryController.PercentRemaining());
400392
break;
401-
case Messages::ReloadIdleTimer:
402-
ReloadIdleTimer();
403-
break;
404393

405394
default:
406395
break;
@@ -449,6 +438,35 @@ void SystemTask::UpdateMotion() {
449438
}
450439
}
451440

441+
void SystemTask::HandleButtonAction(Controllers::ButtonActions action) {
442+
if (IsSleeping()) {
443+
return;
444+
}
445+
446+
ReloadIdleTimer();
447+
448+
using Actions = Controllers::ButtonActions;
449+
450+
switch (action) {
451+
case Actions::Click:
452+
if (!isGoingToSleep) {
453+
displayApp.PushMessage(Applications::Display::Messages::ButtonPushed);
454+
}
455+
break;
456+
case Actions::DoubleClick:
457+
displayApp.PushMessage(Applications::Display::Messages::ButtonDoubleClicked);
458+
break;
459+
case Actions::LongPress:
460+
displayApp.PushMessage(Applications::Display::Messages::ButtonLongPressed);
461+
break;
462+
case Actions::LongerPress:
463+
displayApp.PushMessage(Applications::Display::Messages::ButtonLongerPressed);
464+
break;
465+
default:
466+
break;
467+
}
468+
}
469+
452470
void SystemTask::GoToRunning() {
453471
if (isGoingToSleep or (not isSleeping) or isWakingUp)
454472
return;

src/systemtask/SystemTask.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "components/fs/FS.h"
2222
#include "touchhandler/TouchHandler.h"
2323
#include "buttonhandler/ButtonHandler.h"
24+
#include "buttonhandler/ButtonActions.h"
2425

2526
#ifdef PINETIME_IS_RECOVERY
2627
#include "displayapp/DisplayAppRecovery.h"
@@ -138,6 +139,7 @@ namespace Pinetime {
138139
TimerHandle_t measureBatteryTimer;
139140
bool doNotGoToSleep = false;
140141

142+
void HandleButtonAction(Controllers::ButtonActions action);
141143
void GoToRunning();
142144
void UpdateMotion();
143145
bool stepCounterMustBeReset = false;

0 commit comments

Comments
 (0)