diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 725caaf4..6a3ca163 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -222,6 +222,7 @@ void DisplayApp::Refresh() { if (state != States::Running) { break; } + lvgl.SetNewTouchPoint(touchHandler.GetX(), touchHandler.GetY(), touchHandler.IsTouching()); auto gesture = touchHandler.GestureGet(); if (gesture == TouchEvents::None) { break; @@ -261,7 +262,7 @@ void DisplayApp::Refresh() { LoadPreviousScreen(); } } else { - touchHandler.CancelTap(); + lvgl.CancelTap(); } } break; case Messages::ButtonPushed: @@ -339,7 +340,7 @@ void DisplayApp::LoadNewScreen(Apps app, DisplayApp::FullRefreshDirections direc } void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections direction) { - touchHandler.CancelTap(); + lvgl.CancelTap(); ApplyBrightness(); currentScreen.reset(nullptr); diff --git a/src/displayapp/LittleVgl.cpp b/src/displayapp/LittleVgl.cpp index cc1223fb..1326c566 100644 --- a/src/displayapp/LittleVgl.cpp +++ b/src/displayapp/LittleVgl.cpp @@ -179,15 +179,34 @@ void LittleVgl::FlushDisplay(const lv_area_t* area, lv_color_t* color_p) { lv_disp_flush_ready(&disp_drv); } -void LittleVgl::SetNewTouchPoint(uint16_t x, uint16_t y, bool contact) { - tap_x = x; - tap_y = y; - tapped = contact; +void LittleVgl::SetNewTouchPoint(int16_t x, int16_t y, bool contact) { + if (contact) { + if (!isCancelled) { + touchPoint = {x, y}; + tapped = true; + } + } else { + if (isCancelled) { + touchPoint = {-1, -1}; + tapped = false; + isCancelled = false; + } else { + touchPoint = {x, y}; + tapped = false; + } + } +} + +void LittleVgl::CancelTap() { + if (tapped) { + isCancelled = true; + touchPoint = {-1, -1}; + } } bool LittleVgl::GetTouchPadInfo(lv_indev_data_t* ptr) { - ptr->point.x = tap_x; - ptr->point.y = tap_y; + ptr->point.x = touchPoint.x; + ptr->point.y = touchPoint.y; if (tapped) { ptr->state = LV_INDEV_STATE_PR; } else { diff --git a/src/displayapp/LittleVgl.h b/src/displayapp/LittleVgl.h index 0a45b438..e36d1545 100644 --- a/src/displayapp/LittleVgl.h +++ b/src/displayapp/LittleVgl.h @@ -23,7 +23,8 @@ namespace Pinetime { void FlushDisplay(const lv_area_t* area, lv_color_t* color_p); bool GetTouchPadInfo(lv_indev_data_t* ptr); void SetFullRefresh(FullRefreshDirections direction); - void SetNewTouchPoint(uint16_t x, uint16_t y, bool contact); + void SetNewTouchPoint(int16_t x, int16_t y, bool contact); + void CancelTap(); bool GetFullRefresh() { bool returnValue = fullRefresh; @@ -58,9 +59,9 @@ namespace Pinetime { uint16_t writeOffset = 0; uint16_t scrollOffset = 0; - uint16_t tap_x = 0; - uint16_t tap_y = 0; + lv_point_t touchPoint = {0}; bool tapped = false; + bool isCancelled = false; }; } } diff --git a/src/main.cpp b/src/main.cpp index 95708531..4204842d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -111,7 +111,7 @@ Pinetime::Controllers::NotificationManager notificationManager; Pinetime::Controllers::MotionController motionController; Pinetime::Controllers::TimerController timerController; Pinetime::Controllers::AlarmController alarmController {dateTimeController}; -Pinetime::Controllers::TouchHandler touchHandler(touchPanel, lvgl); +Pinetime::Controllers::TouchHandler touchHandler(touchPanel); Pinetime::Controllers::ButtonHandler buttonHandler; Pinetime::Controllers::BrightnessController brightnessController {}; diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 73f573fa..38bba1a5 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -343,10 +343,9 @@ void SystemTask::Work() { break; case Messages::OnTouchEvent: if (touchHandler.GetNewTouchInfo()) { - touchHandler.UpdateLvglTouchPoint(); + ReloadIdleTimer(); + displayApp.PushMessage(Pinetime::Applications::Display::Messages::TouchEvent); } - ReloadIdleTimer(); - displayApp.PushMessage(Pinetime::Applications::Display::Messages::TouchEvent); break; case Messages::HandleButtonEvent: { Controllers::ButtonActions action = Controllers::ButtonActions::None; diff --git a/src/touchhandler/TouchHandler.cpp b/src/touchhandler/TouchHandler.cpp index 0e4fb541..d98d2577 100644 --- a/src/touchhandler/TouchHandler.cpp +++ b/src/touchhandler/TouchHandler.cpp @@ -1,9 +1,4 @@ #include "touchhandler/TouchHandler.h" -#ifdef PINETIME_IS_RECOVERY - #include "displayapp/DummyLittleVgl.h" -#else - #include "displayapp/LittleVgl.h" -#endif using namespace Pinetime::Controllers; using namespace Pinetime::Applications; @@ -32,14 +27,7 @@ namespace { } } -TouchHandler::TouchHandler(Drivers::Cst816S& touchPanel, Components::LittleVgl& lvgl) : touchPanel {touchPanel}, lvgl {lvgl} { -} - -void TouchHandler::CancelTap() { - if (info.touching) { - isCancelled = true; - lvgl.SetNewTouchPoint(-1, -1, true); - } +TouchHandler::TouchHandler(Drivers::Cst816S& touchPanel) : touchPanel {touchPanel} { } Pinetime::Applications::TouchEvents TouchHandler::GestureGet() { @@ -55,6 +43,7 @@ bool TouchHandler::GetNewTouchInfo() { return false; } + // Only a single gesture per touch if (info.gesture != Pinetime::Drivers::Cst816S::Gestures::None) { if (gestureReleased) { if (info.gesture == Pinetime::Drivers::Cst816S::Gestures::SlideDown || @@ -78,18 +67,3 @@ bool TouchHandler::GetNewTouchInfo() { return true; } - -void TouchHandler::UpdateLvglTouchPoint() { - if (info.touching) { - if (!isCancelled) { - lvgl.SetNewTouchPoint(info.x, info.y, true); - } - } else { - if (isCancelled) { - lvgl.SetNewTouchPoint(-1, -1, false); - isCancelled = false; - } else { - lvgl.SetNewTouchPoint(info.x, info.y, false); - } - } -} diff --git a/src/touchhandler/TouchHandler.h b/src/touchhandler/TouchHandler.h index afce2844..9afaa247 100644 --- a/src/touchhandler/TouchHandler.h +++ b/src/touchhandler/TouchHandler.h @@ -3,10 +3,6 @@ #include "displayapp/TouchEvents.h" namespace Pinetime { - namespace Components { - class LittleVgl; - } - namespace Drivers { class Cst816S; } @@ -14,10 +10,9 @@ namespace Pinetime { namespace Controllers { class TouchHandler { public: - explicit TouchHandler(Drivers::Cst816S&, Components::LittleVgl&); - void CancelTap(); + explicit TouchHandler(Drivers::Cst816S&); + bool GetNewTouchInfo(); - void UpdateLvglTouchPoint(); bool IsTouching() const { return info.touching; @@ -36,7 +31,6 @@ namespace Pinetime { private: Pinetime::Drivers::Cst816S::TouchInfos info; Pinetime::Drivers::Cst816S& touchPanel; - Pinetime::Components::LittleVgl& lvgl; Pinetime::Applications::TouchEvents gesture; bool isCancelled = false; bool gestureReleased = true;