Compare commits

...

3 commits

Author SHA1 Message Date
mark9064 167382d3bc Unify touch panel handling 2024-09-28 00:43:03 +01:00
mark9064 5209aff159 Process touch events only when awake 2024-09-28 00:43:03 +01:00
mark9064 99e5fab060 Clear ongoing taps when going to sleep 2024-09-28 00:43:03 +01:00
5 changed files with 32 additions and 25 deletions

View file

@ -314,6 +314,10 @@ void DisplayApp::Refresh() {
} else { } else {
lcd.Sleep(); lcd.Sleep();
} }
// Clear any ongoing touch pressed events
// Without this LVGL gets stuck in the pressed state and will keep refreshing the
// display activity timer causing the screen to never sleep after timeout
lvgl.ClearTouchState();
PushMessageToSystemTask(Pinetime::System::Messages::OnDisplayTaskSleeping); PushMessageToSystemTask(Pinetime::System::Messages::OnDisplayTaskSleeping);
state = States::Idle; state = States::Idle;
break; break;
@ -459,7 +463,7 @@ void DisplayApp::Refresh() {
} }
} }
if (touchHandler.IsTouching()) { if (state == States::Running && touchHandler.IsTouching()) {
currentScreen->OnTouchEvent(touchHandler.GetX(), touchHandler.GetY()); currentScreen->OnTouchEvent(touchHandler.GetX(), touchHandler.GetY());
} }

View file

@ -248,6 +248,8 @@ void LittleVgl::SetNewTouchPoint(int16_t x, int16_t y, bool contact) {
} }
} }
// Cancel an ongoing tap
// Signifies that LVGL should not handle the current tap
void LittleVgl::CancelTap() { void LittleVgl::CancelTap() {
if (tapped) { if (tapped) {
isCancelled = true; isCancelled = true;
@ -255,6 +257,13 @@ void LittleVgl::CancelTap() {
} }
} }
// Clear the current tapped state
// Signifies that touch input processing is suspended
void LittleVgl::ClearTouchState() {
touchPoint = {-1, -1};
tapped = false;
}
bool LittleVgl::GetTouchPadInfo(lv_indev_data_t* ptr) { bool LittleVgl::GetTouchPadInfo(lv_indev_data_t* ptr) {
ptr->point.x = touchPoint.x; ptr->point.x = touchPoint.x;
ptr->point.y = touchPoint.y; ptr->point.y = touchPoint.y;

View file

@ -26,6 +26,7 @@ namespace Pinetime {
void SetFullRefresh(FullRefreshDirections direction); void SetFullRefresh(FullRefreshDirections direction);
void SetNewTouchPoint(int16_t x, int16_t y, bool contact); void SetNewTouchPoint(int16_t x, int16_t y, bool contact);
void CancelTap(); void CancelTap();
void ClearTouchState();
bool GetFullRefresh() { bool GetFullRefresh() {
bool returnValue = fullRefresh; bool returnValue = fullRefresh;

View file

@ -6,7 +6,6 @@ namespace Pinetime {
enum class Messages : uint8_t { enum class Messages : uint8_t {
GoToSleep, GoToSleep,
GoToRunning, GoToRunning,
TouchWakeUp,
OnNewTime, OnNewTime,
OnNewNotification, OnNewNotification,
OnNewCall, OnNewCall,

View file

@ -198,20 +198,6 @@ void SystemTask::Work() {
case Messages::GoToRunning: case Messages::GoToRunning:
GoToRunning(); GoToRunning();
break; break;
case Messages::TouchWakeUp: {
if (touchHandler.ProcessTouchInfo(touchPanel.GetTouchInfo())) {
auto gesture = touchHandler.GestureGet();
if (settingsController.GetNotificationStatus() != Controllers::Settings::Notification::Sleep &&
gesture != Pinetime::Applications::TouchEvents::None &&
((gesture == Pinetime::Applications::TouchEvents::DoubleTap &&
settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) ||
(gesture == Pinetime::Applications::TouchEvents::Tap &&
settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::SingleTap)))) {
GoToRunning();
}
}
break;
}
case Messages::GoToSleep: case Messages::GoToSleep:
GoToSleep(); GoToSleep();
break; break;
@ -260,8 +246,23 @@ void SystemTask::Work() {
// TODO add intent of fs access icon or something // TODO add intent of fs access icon or something
break; break;
case Messages::OnTouchEvent: case Messages::OnTouchEvent:
if (touchHandler.ProcessTouchInfo(touchPanel.GetTouchInfo())) { // Finish immediately if no new events
if (!touchHandler.ProcessTouchInfo(touchPanel.GetTouchInfo())) {
break;
}
if (state == SystemTaskState::Running) {
displayApp.PushMessage(Pinetime::Applications::Display::Messages::TouchEvent); displayApp.PushMessage(Pinetime::Applications::Display::Messages::TouchEvent);
} else {
// If asleep, check for touch panel wake triggers
auto gesture = touchHandler.GestureGet();
if (settingsController.GetNotificationStatus() != Controllers::Settings::Notification::Sleep &&
gesture != Pinetime::Applications::TouchEvents::None &&
((gesture == Pinetime::Applications::TouchEvents::DoubleTap &&
settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) ||
(gesture == Pinetime::Applications::TouchEvents::Tap &&
settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::SingleTap)))) {
GoToRunning();
}
} }
break; break;
case Messages::HandleButtonEvent: { case Messages::HandleButtonEvent: {
@ -482,14 +483,7 @@ void SystemTask::HandleButtonAction(Controllers::ButtonActions action) {
} }
void SystemTask::OnTouchEvent() { void SystemTask::OnTouchEvent() {
if (state == SystemTaskState::Running) {
PushMessage(Messages::OnTouchEvent); PushMessage(Messages::OnTouchEvent);
} else {
if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::SingleTap) or
settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) {
PushMessage(Messages::TouchWakeUp);
}
}
} }
void SystemTask::PushMessage(System::Messages msg) { void SystemTask::PushMessage(System::Messages msg) {