Skip to content

Commit d2d9731

Browse files
committed
Merge branch 'develop' into update_touch_driver
2 parents 780a811 + fab49f8 commit d2d9731

30 files changed

Lines changed: 273 additions & 209 deletions

src/CMakeLists.txt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,8 @@ list(APPEND SOURCE_FILES
496496
components/heartrate/Biquad.cpp
497497
components/heartrate/Ptagc.cpp
498498
components/heartrate/HeartRateController.cpp
499+
500+
touchhandler/TouchHandler.cpp
499501
)
500502

501503
list(APPEND RECOVERY_SOURCE_FILES
@@ -553,6 +555,7 @@ list(APPEND RECOVERY_SOURCE_FILES
553555
components/heartrate/Ptagc.cpp
554556
components/motor/MotorController.cpp
555557
components/fs/FS.cpp
558+
touchhandler/TouchHandler.cpp
556559
)
557560

558561
list(APPEND RECOVERYLOADER_SOURCE_FILES
@@ -661,6 +664,7 @@ set(INCLUDE_FILES
661664
components/heartrate/Ptagc.h
662665
components/heartrate/HeartRateController.h
663666
components/motor/MotorController.h
667+
touchhandler/TouchHandler.h
664668
)
665669

666670
include_directories(
@@ -840,7 +844,7 @@ target_compile_options(${EXECUTABLE_NAME} PUBLIC
840844

841845
set_target_properties(${EXECUTABLE_NAME} PROPERTIES
842846
SUFFIX ".out"
843-
LINK_FLAGS "-mthumb -mabi=aapcs -L ${NRF5_SDK_PATH}/modules/nrfx/mdk -T${NRF5_LINKER_SCRIPT} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wl,--gc-sections --specs=nano.specs -lc -lnosys -lm -Wl,-Map=${EXECUTABLE_FILE_NAME}.map"
847+
LINK_FLAGS "-mthumb -mabi=aapcs -L ${NRF5_SDK_PATH}/modules/nrfx/mdk -T${NRF5_LINKER_SCRIPT} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wl,--gc-sections -Wl,--print-memory-usage --specs=nano.specs -lc -lnosys -lm -Wl,-Map=${EXECUTABLE_FILE_NAME}.map"
844848
)
845849

846850
add_custom_command(TARGET ${EXECUTABLE_NAME}
@@ -870,7 +874,7 @@ target_compile_options(${EXECUTABLE_MCUBOOT_NAME} PUBLIC
870874

871875
set_target_properties(${EXECUTABLE_MCUBOOT_NAME} PROPERTIES
872876
SUFFIX ".out"
873-
LINK_FLAGS "-mthumb -mabi=aapcs -L ${NRF5_SDK_PATH}/modules/nrfx/mdk -T${NRF5_LINKER_SCRIPT_MCUBOOT} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wl,--gc-sections --specs=nano.specs -lc -lnosys -lm -Wl,-Map=${EXECUTABLE_MCUBOOT_FILE_NAME}.map"
877+
LINK_FLAGS "-mthumb -mabi=aapcs -L ${NRF5_SDK_PATH}/modules/nrfx/mdk -T${NRF5_LINKER_SCRIPT_MCUBOOT} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wl,--gc-sections -Wl,--print-memory-usage --specs=nano.specs -lc -lnosys -lm -Wl,-Map=${EXECUTABLE_MCUBOOT_FILE_NAME}.map"
874878
)
875879

876880
add_custom_command(TARGET ${EXECUTABLE_MCUBOOT_NAME}
@@ -907,7 +911,7 @@ target_compile_options(${EXECUTABLE_RECOVERY_NAME} PUBLIC
907911

908912
set_target_properties(${EXECUTABLE_RECOVERY_NAME} PROPERTIES
909913
SUFFIX ".out"
910-
LINK_FLAGS "-mthumb -mabi=aapcs -L ${NRF5_SDK_PATH}/modules/nrfx/mdk -T${NRF5_LINKER_SCRIPT} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wl,--gc-sections --specs=nano.specs -lc -lnosys -lm -Wl,-Map=${EXECUTABLE_RECOVERY_FILE_NAME}.map"
914+
LINK_FLAGS "-mthumb -mabi=aapcs -L ${NRF5_SDK_PATH}/modules/nrfx/mdk -T${NRF5_LINKER_SCRIPT} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wl,--gc-sections -Wl,--print-memory-usage --specs=nano.specs -lc -lnosys -lm -Wl,-Map=${EXECUTABLE_RECOVERY_FILE_NAME}.map"
911915
)
912916

913917
add_custom_command(TARGET ${EXECUTABLE_RECOVERY_NAME}
@@ -937,7 +941,7 @@ target_compile_options(${EXECUTABLE_RECOVERY_MCUBOOT_NAME} PUBLIC
937941

938942
set_target_properties(${EXECUTABLE_RECOVERY_MCUBOOT_NAME} PROPERTIES
939943
SUFFIX ".out"
940-
LINK_FLAGS "-mthumb -mabi=aapcs -L ${NRF5_SDK_PATH}/modules/nrfx/mdk -T${NRF5_LINKER_SCRIPT} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wl,--gc-sections --specs=nano.specs -lc -lnosys -lm -Wl,-Map=${EXECUTABLE_GRAPHICS_FILE_NAME}.map"
944+
LINK_FLAGS "-mthumb -mabi=aapcs -L ${NRF5_SDK_PATH}/modules/nrfx/mdk -T${NRF5_LINKER_SCRIPT} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wl,--gc-sections -Wl,--print-memory-usage --specs=nano.specs -lc -lnosys -lm -Wl,-Map=${EXECUTABLE_GRAPHICS_FILE_NAME}.map"
941945
)
942946

943947
add_custom_command(TARGET ${EXECUTABLE_RECOVERY_MCUBOOT_NAME}
@@ -978,7 +982,7 @@ add_dependencies(${EXECUTABLE_RECOVERYLOADER_NAME} ${EXECUTABLE_RECOVERY_MCUBOOT
978982

979983
set_target_properties(${EXECUTABLE_RECOVERYLOADER_NAME} PROPERTIES
980984
SUFFIX ".out"
981-
LINK_FLAGS "-mthumb -mabi=aapcs -L ${NRF5_SDK_PATH}/modules/nrfx/mdk -T${NRF5_LINKER_SCRIPT} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wl,--gc-sections --specs=nano.specs -lc -lnosys -lm -Wl,-Map=${EXECUTABLE_RECOVERYLOADER_FILE_NAME}.map"
985+
LINK_FLAGS "-mthumb -mabi=aapcs -L ${NRF5_SDK_PATH}/modules/nrfx/mdk -T${NRF5_LINKER_SCRIPT} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wl,--gc-sections -Wl,--print-memory-usage --specs=nano.specs -lc -lnosys -lm -Wl,-Map=${EXECUTABLE_RECOVERYLOADER_FILE_NAME}.map"
982986
)
983987

984988
add_custom_command(TARGET ${EXECUTABLE_RECOVERYLOADER_NAME}
@@ -1011,7 +1015,7 @@ add_dependencies(${EXECUTABLE_MCUBOOT_RECOVERYLOADER_NAME} ${EXECUTABLE_RECOVERY
10111015

10121016
set_target_properties(${EXECUTABLE_MCUBOOT_RECOVERYLOADER_NAME} PROPERTIES
10131017
SUFFIX ".out"
1014-
LINK_FLAGS "-mthumb -mabi=aapcs -std=gnu++98 -std=c99 -L ${NRF5_SDK_PATH}/modules/nrfx/mdk -T${NRF5_LINKER_SCRIPT_MCUBOOT} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wl,--gc-sections --specs=nano.specs -lc -lnosys -lm -Wl,-Map=${EXECUTABLE_MCUBOOT_RECOVERYLOADER_FILE_NAME}.map"
1018+
LINK_FLAGS "-mthumb -mabi=aapcs -std=gnu++98 -std=c99 -L ${NRF5_SDK_PATH}/modules/nrfx/mdk -T${NRF5_LINKER_SCRIPT_MCUBOOT} -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wl,--gc-sections -Wl,--print-memory-usage --specs=nano.specs -lc -lnosys -lm -Wl,-Map=${EXECUTABLE_MCUBOOT_RECOVERYLOADER_FILE_NAME}.map"
10151019
)
10161020

10171021
add_custom_command(TARGET ${EXECUTABLE_MCUBOOT_RECOVERYLOADER_NAME}

src/displayapp/DisplayApp.cpp

Lines changed: 29 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -54,29 +54,26 @@ namespace {
5454
return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0;
5555
}
5656

57-
TouchEvents Convert(Pinetime::Drivers::Cst816S::TouchInfos info) {
58-
if (info.isValid) {
59-
switch (info.gesture) {
60-
case Pinetime::Drivers::Cst816S::Gestures::SingleTap:
61-
return TouchEvents::Tap;
62-
case Pinetime::Drivers::Cst816S::Gestures::LongPress:
63-
return TouchEvents::LongTap;
64-
case Pinetime::Drivers::Cst816S::Gestures::DoubleTap:
65-
return TouchEvents::DoubleTap;
66-
case Pinetime::Drivers::Cst816S::Gestures::SlideRight:
67-
return TouchEvents::SwipeRight;
68-
case Pinetime::Drivers::Cst816S::Gestures::SlideLeft:
69-
return TouchEvents::SwipeLeft;
70-
case Pinetime::Drivers::Cst816S::Gestures::SlideDown:
71-
return TouchEvents::SwipeDown;
72-
case Pinetime::Drivers::Cst816S::Gestures::SlideUp:
73-
return TouchEvents::SwipeUp;
74-
case Pinetime::Drivers::Cst816S::Gestures::None:
75-
default:
76-
return TouchEvents::None;
77-
}
57+
TouchEvents ConvertGesture(Pinetime::Drivers::Cst816S::Gestures gesture) {
58+
switch (gesture) {
59+
case Pinetime::Drivers::Cst816S::Gestures::SingleTap:
60+
return TouchEvents::Tap;
61+
case Pinetime::Drivers::Cst816S::Gestures::LongPress:
62+
return TouchEvents::LongTap;
63+
case Pinetime::Drivers::Cst816S::Gestures::DoubleTap:
64+
return TouchEvents::DoubleTap;
65+
case Pinetime::Drivers::Cst816S::Gestures::SlideRight:
66+
return TouchEvents::SwipeRight;
67+
case Pinetime::Drivers::Cst816S::Gestures::SlideLeft:
68+
return TouchEvents::SwipeLeft;
69+
case Pinetime::Drivers::Cst816S::Gestures::SlideDown:
70+
return TouchEvents::SwipeDown;
71+
case Pinetime::Drivers::Cst816S::Gestures::SlideUp:
72+
return TouchEvents::SwipeUp;
73+
case Pinetime::Drivers::Cst816S::Gestures::None:
74+
default:
75+
return TouchEvents::None;
7876
}
79-
return TouchEvents::None;
8077
}
8178
}
8279

@@ -92,7 +89,8 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
9289
Controllers::Settings& settingsController,
9390
Pinetime::Controllers::MotorController& motorController,
9491
Pinetime::Controllers::MotionController& motionController,
95-
Pinetime::Controllers::TimerController& timerController)
92+
Pinetime::Controllers::TimerController& timerController,
93+
Pinetime::Controllers::TouchHandler& touchHandler)
9694
: lcd {lcd},
9795
lvgl {lvgl},
9896
touchPanel {touchPanel},
@@ -105,7 +103,8 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
105103
settingsController {settingsController},
106104
motorController {motorController},
107105
motionController {motionController},
108-
timerController {timerController} {
106+
timerController {timerController},
107+
touchHandler {touchHandler} {
109108
}
110109

111110
void DisplayApp::Start(System::BootErrors error) {
@@ -218,8 +217,7 @@ void DisplayApp::Refresh() {
218217
if (state != States::Running) {
219218
break;
220219
}
221-
auto info = touchPanel.GetTouchInfo();
222-
auto gesture = Convert(info);
220+
auto gesture = ConvertGesture(touchHandler.GestureGet());
223221
if (gesture == TouchEvents::None) {
224222
break;
225223
}
@@ -245,11 +243,9 @@ void DisplayApp::Refresh() {
245243
LoadApp(returnToApp, returnDirection);
246244
brightnessController.Set(settingsController.GetBrightness());
247245
brightnessController.Backup();
248-
} else if (touchMode == TouchModes::Gestures) {
249-
if (gesture == TouchEvents::Tap) {
250-
lvgl.SetNewTapEvent(info.x, info.y);
251-
}
252246
}
247+
} else {
248+
touchHandler.CancelTap();
253249
}
254250
} break;
255251
case Messages::ButtonPushed:
@@ -279,13 +275,8 @@ void DisplayApp::Refresh() {
279275
nextApp = Apps::None;
280276
}
281277

282-
if (state != States::Idle && touchMode == TouchModes::Polling) {
283-
auto info = touchPanel.GetTouchInfo();
284-
if (info.action == 2) { // 2 = contact
285-
if (!currentScreen->OnTouchEvent(info.x, info.y)) {
286-
lvgl.SetNewTapEvent(info.x, info.y);
287-
}
288-
}
278+
if (touchHandler.IsTouching()) {
279+
currentScreen->OnTouchEvent(touchHandler.GetX(), touchHandler.GetY());
289280
}
290281
}
291282

@@ -308,6 +299,7 @@ void DisplayApp::ReturnApp(Apps app, DisplayApp::FullRefreshDirections direction
308299
}
309300

310301
void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) {
302+
touchHandler.CancelTap();
311303
currentScreen.reset(nullptr);
312304
SetFullRefresh(direction);
313305

@@ -478,10 +470,6 @@ void DisplayApp::SetFullRefresh(DisplayApp::FullRefreshDirections direction) {
478470
}
479471
}
480472

481-
void DisplayApp::SetTouchMode(DisplayApp::TouchModes mode) {
482-
touchMode = mode;
483-
}
484-
485473
void DisplayApp::PushMessageToSystemTask(Pinetime::System::Messages message) {
486474
if (systemTask != nullptr)
487475
systemTask->PushMessage(message);

src/displayapp/DisplayApp.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "components/settings/Settings.h"
1515
#include "displayapp/screens/Screen.h"
1616
#include "components/timer/TimerController.h"
17+
#include "touchhandler/TouchHandler.h"
1718
#include "Messages.h"
1819
#include "BootErrors.h"
1920

@@ -32,6 +33,7 @@ namespace Pinetime {
3233
class NotificationManager;
3334
class HeartRateController;
3435
class MotionController;
36+
class TouchHandler;
3537
}
3638

3739
namespace System {
@@ -42,7 +44,6 @@ namespace Pinetime {
4244
public:
4345
enum class States { Idle, Running };
4446
enum class FullRefreshDirections { None, Up, Down, Left, Right, LeftAnim, RightAnim };
45-
enum class TouchModes { Gestures, Polling };
4647

4748
DisplayApp(Drivers::St7789& lcd,
4849
Components::LittleVgl& lvgl,
@@ -56,14 +57,14 @@ namespace Pinetime {
5657
Controllers::Settings& settingsController,
5758
Pinetime::Controllers::MotorController& motorController,
5859
Pinetime::Controllers::MotionController& motionController,
59-
Pinetime::Controllers::TimerController& timerController);
60+
Pinetime::Controllers::TimerController& timerController,
61+
Pinetime::Controllers::TouchHandler& touchHandler);
6062
void Start(System::BootErrors error);
6163
void PushMessage(Display::Messages msg);
6264

6365
void StartApp(Apps app, DisplayApp::FullRefreshDirections direction);
6466

6567
void SetFullRefresh(FullRefreshDirections direction);
66-
void SetTouchMode(TouchModes mode);
6768

6869
void Register(Pinetime::System::SystemTask* systemTask);
6970

@@ -82,6 +83,7 @@ namespace Pinetime {
8283
Pinetime::Controllers::MotorController& motorController;
8384
Pinetime::Controllers::MotionController& motionController;
8485
Pinetime::Controllers::TimerController& timerController;
86+
Pinetime::Controllers::TouchHandler& touchHandler;
8587

8688
Pinetime::Controllers::FirmwareValidator validator;
8789
Controllers::BrightnessController brightnessController;
@@ -101,8 +103,7 @@ namespace Pinetime {
101103
FullRefreshDirections returnDirection = FullRefreshDirections::None;
102104
TouchEvents returnTouchEvent = TouchEvents::None;
103105

104-
TouchModes touchMode = TouchModes::Gestures;
105-
106+
TouchEvents GetGesture();
106107
void RunningState();
107108
void IdleState();
108109
static void Process(void* instance);

src/displayapp/DisplayAppRecovery.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <task.h>
44
#include <libraries/log/nrf_log.h>
55
#include <components/rle/RleDecoder.h>
6+
#include <touchhandler/TouchHandler.h>
67
#include "displayapp/icons/infinitime/infinitime-nb.c"
78

89
using namespace Pinetime::Applications;
@@ -19,7 +20,8 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
1920
Controllers::Settings& settingsController,
2021
Pinetime::Controllers::MotorController& motorController,
2122
Pinetime::Controllers::MotionController& motionController,
22-
Pinetime::Controllers::TimerController& timerController)
23+
Pinetime::Controllers::TimerController& timerController,
24+
Pinetime::Controllers::TouchHandler& touchHandler)
2325
: lcd {lcd}, bleController {bleController} {
2426

2527
}

src/displayapp/DisplayAppRecovery.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ namespace Pinetime {
2929
namespace System {
3030
class SystemTask;
3131
};
32+
namespace Controllers {
33+
class TouchHandler;
34+
}
3235
namespace Applications {
3336
class DisplayApp {
3437
public:
@@ -44,7 +47,8 @@ namespace Pinetime {
4447
Controllers::Settings& settingsController,
4548
Pinetime::Controllers::MotorController& motorController,
4649
Pinetime::Controllers::MotionController& motionController,
47-
Pinetime::Controllers::TimerController& timerController);
50+
Pinetime::Controllers::TimerController& timerController,
51+
Pinetime::Controllers::TouchHandler& touchHandler);
4852
void Start();
4953
void PushMessage(Pinetime::Applications::Display::Messages msg);
5054
void Register(Pinetime::System::SystemTask* systemTask);

src/displayapp/DummyLittleVgl.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ namespace Pinetime {
3232
}
3333
void SetNewTapEvent(uint16_t x, uint16_t y) {
3434
}
35+
void SetNewTouchPoint(uint16_t x, uint16_t y, bool contact) {
36+
37+
}
3538
};
3639
}
3740
}

src/displayapp/LittleVgl.cpp

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -166,43 +166,21 @@ void LittleVgl::FlushDisplay(const lv_area_t* area, lv_color_t* color_p) {
166166
lv_disp_flush_ready(&disp_drv);
167167
}
168168

169-
void LittleVgl::SetNewTapEvent(uint16_t x, uint16_t y) {
169+
void LittleVgl::SetNewTouchPoint(uint16_t x, uint16_t y, bool contact) {
170170
tap_x = x;
171171
tap_y = y;
172-
tapped = true;
172+
tapped = contact;
173173
}
174174

175175
bool LittleVgl::GetTouchPadInfo(lv_indev_data_t* ptr) {
176+
ptr->point.x = tap_x;
177+
ptr->point.y = tap_y;
176178
if (tapped) {
177-
ptr->point.x = tap_x;
178-
ptr->point.y = tap_y;
179179
ptr->state = LV_INDEV_STATE_PR;
180-
tapped = false;
181180
} else {
182181
ptr->state = LV_INDEV_STATE_REL;
183182
}
184183
return false;
185-
/*
186-
auto info = touchPanel.GetTouchInfo();
187-
188-
if((previousClick.x != info.x || previousClick.y != info.y) &&
189-
(info.gesture == Drivers::Cst816S::Gestures::SingleTap)) {
190-
// TODO For an unknown reason, the first touch is taken twice into account.
191-
// 'firstTouch' is a quite'n'dirty workaound until I find a better solution
192-
if(firstTouch) ptr->state = LV_INDEV_STATE_REL;
193-
else ptr->state = LV_INDEV_STATE_PR;
194-
firstTouch = false;
195-
previousClick.x = info.x;
196-
previousClick.y = info.y;
197-
}
198-
else {
199-
ptr->state = LV_INDEV_STATE_REL;
200-
}
201-
202-
ptr->point.x = info.x;
203-
ptr->point.y = info.y;
204-
return false;
205-
*/
206184
}
207185

208186
void LittleVgl::InitTheme() {

src/displayapp/LittleVgl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace Pinetime {
2424
void FlushDisplay(const lv_area_t* area, lv_color_t* color_p);
2525
bool GetTouchPadInfo(lv_indev_data_t* ptr);
2626
void SetFullRefresh(FullRefreshDirections direction);
27-
void SetNewTapEvent(uint16_t x, uint16_t y);
27+
void SetNewTouchPoint(uint16_t x, uint16_t y, bool contact);
2828

2929
private:
3030
void InitDisplay();

src/displayapp/screens/FirmwareValidation.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,10 @@ bool FirmwareValidation::Refresh() {
6868
}
6969

7070
void FirmwareValidation::OnButtonEvent(lv_obj_t* object, lv_event_t event) {
71-
if (object == buttonValidate && event == LV_EVENT_PRESSED) {
71+
if (object == buttonValidate && event == LV_EVENT_CLICKED) {
7272
validator.Validate();
7373
running = false;
74-
} else if (object == buttonReset && event == LV_EVENT_PRESSED) {
74+
} else if (object == buttonReset && event == LV_EVENT_CLICKED) {
7575
validator.Reset();
7676
}
7777
}

src/displayapp/screens/InfiniPaint.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,10 @@
55
using namespace Pinetime::Applications::Screens;
66

77
InfiniPaint::InfiniPaint(Pinetime::Applications::DisplayApp* app, Pinetime::Components::LittleVgl& lvgl) : Screen(app), lvgl {lvgl} {
8-
app->SetTouchMode(DisplayApp::TouchModes::Polling);
98
std::fill(b, b + bufferSize, selectColor);
109
}
1110

1211
InfiniPaint::~InfiniPaint() {
13-
// Reset the touchmode
14-
app->SetTouchMode(DisplayApp::TouchModes::Gestures);
1512
lv_obj_clean(lv_scr_act());
1613
}
1714

0 commit comments

Comments
 (0)