summaryrefslogtreecommitdiff
path: root/src/touchhandler
diff options
context:
space:
mode:
Diffstat (limited to 'src/touchhandler')
-rw-r--r--src/touchhandler/TouchHandler.cpp70
-rw-r--r--src/touchhandler/TouchHandler.h45
2 files changed, 115 insertions, 0 deletions
diff --git a/src/touchhandler/TouchHandler.cpp b/src/touchhandler/TouchHandler.cpp
new file mode 100644
index 00000000..a13d1af3
--- /dev/null
+++ b/src/touchhandler/TouchHandler.cpp
@@ -0,0 +1,70 @@
+#include "TouchHandler.h"
+
+using namespace Pinetime::Controllers;
+
+TouchHandler::TouchHandler(Drivers::Cst816S& touchPanel, Components::LittleVgl& lvgl)
+ : touchPanel {touchPanel},
+ lvgl {lvgl} {
+}
+
+void TouchHandler::CancelTap() {
+ isCancelled = true;
+ lvgl.SetNewTapEvent(-1, -1, false);
+}
+
+Pinetime::Drivers::Cst816S::Gestures TouchHandler::GestureGet() {
+ auto returnGesture = gesture;
+ gesture = Drivers::Cst816S::Gestures::None;
+ return returnGesture;
+}
+
+void TouchHandler::Start() {
+ if (pdPASS != xTaskCreate(TouchHandler::Process, "Touch", 80, this, 0, &taskHandle)) {
+ APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
+ }
+}
+
+void TouchHandler::Process(void* instance) {
+ auto* app = static_cast<TouchHandler*>(instance);
+ app->Work();
+}
+
+void TouchHandler::Work() {
+ Pinetime::Drivers::Cst816S::TouchInfos info;
+ while (true) {
+ vTaskSuspend(taskHandle);
+ info = touchPanel.GetTouchInfo();
+ if (systemTask->IsSleeping()) {
+ systemTask->PushMessage(System::Messages::TouchWakeUp);
+ } else {
+ x = info.x;
+ y = info.y;
+ if (info.action == 0) {
+ lvgl.SetNewTapEvent(info.x, info.y, true);
+ } else if (info.action == 1) {
+ lvgl.SetNewTapEvent(info.x, info.y, false);
+ prevGesture = Pinetime::Drivers::Cst816S::Gestures::None;
+ isCancelled = false;
+ } else if (info.action == 2) {
+ if (!isCancelled) {
+ lvgl.SetNewTapEvent(info.x, info.y, true);
+ }
+ if (info.gesture != Pinetime::Drivers::Cst816S::Gestures::None) {
+ if (prevGesture != info.gesture) {
+ prevGesture = info.gesture;
+ gesture = info.gesture;
+ }
+ }
+ }
+ systemTask->OnTouchEvent();
+ }
+ }
+}
+
+void TouchHandler::Register(Pinetime::System::SystemTask* systemTask) {
+ this->systemTask = systemTask;
+}
+
+void TouchHandler::WakeUp() {
+ vTaskResume(taskHandle);
+}
diff --git a/src/touchhandler/TouchHandler.h b/src/touchhandler/TouchHandler.h
new file mode 100644
index 00000000..7999e00a
--- /dev/null
+++ b/src/touchhandler/TouchHandler.h
@@ -0,0 +1,45 @@
+#pragma once
+#include "drivers/Cst816s.h"
+#include "systemtask/SystemTask.h"
+#include <FreeRTOS.h>
+#include <task.h>
+
+namespace Pinetime {
+ namespace Components {
+ class LittleVgl;
+ }
+ namespace Drivers {
+ class Cst816S;
+ }
+ namespace System {
+ class SystemTask;
+ }
+ namespace Controllers {
+ class TouchHandler {
+ public:
+ explicit TouchHandler(Drivers::Cst816S&, Components::LittleVgl&);
+ void CancelTap();
+ void Register(Pinetime::System::SystemTask* systemTask);
+ void Start();
+ void WakeUp();
+ uint8_t GetX() const {
+ return x;
+ }
+ uint8_t GetY() const {
+ return y;
+ }
+ Drivers::Cst816S::Gestures GestureGet();
+ private:
+ static void Process(void* instance);
+ void Work();
+ Pinetime::System::SystemTask* systemTask = nullptr;
+ TaskHandle_t taskHandle;
+ Pinetime::Drivers::Cst816S& touchPanel;
+ Pinetime::Components::LittleVgl& lvgl;
+ Pinetime::Drivers::Cst816S::Gestures gesture;
+ Pinetime::Drivers::Cst816S::Gestures prevGesture;
+ bool isCancelled = false;
+ uint8_t x, y;
+ };
+ }
+}