Skip to content

Commit c2fae47

Browse files
committed
Merge branch 'develop' into refresh_rework
2 parents 3cef05b + fab49f8 commit c2fae47

29 files changed

Lines changed: 292 additions & 234 deletions

src/CMakeLists.txt

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

500502
list(APPEND RECOVERY_SOURCE_FILES
@@ -552,6 +554,7 @@ list(APPEND RECOVERY_SOURCE_FILES
552554
components/heartrate/Ptagc.cpp
553555
components/motor/MotorController.cpp
554556
components/fs/FS.cpp
557+
touchhandler/TouchHandler.cpp
555558
)
556559

557560
list(APPEND RECOVERYLOADER_SOURCE_FILES
@@ -660,6 +663,7 @@ set(INCLUDE_FILES
660663
components/heartrate/Ptagc.h
661664
components/heartrate/HeartRateController.h
662665
components/motor/MotorController.h
666+
touchhandler/TouchHandler.h
663667
)
664668

665669
include_directories(
@@ -839,7 +843,7 @@ target_compile_options(${EXECUTABLE_NAME} PUBLIC
839843

840844
set_target_properties(${EXECUTABLE_NAME} PROPERTIES
841845
SUFFIX ".out"
842-
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"
846+
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"
843847
)
844848

845849
add_custom_command(TARGET ${EXECUTABLE_NAME}
@@ -869,7 +873,7 @@ target_compile_options(${EXECUTABLE_MCUBOOT_NAME} PUBLIC
869873

870874
set_target_properties(${EXECUTABLE_MCUBOOT_NAME} PROPERTIES
871875
SUFFIX ".out"
872-
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"
876+
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"
873877
)
874878

875879
add_custom_command(TARGET ${EXECUTABLE_MCUBOOT_NAME}
@@ -906,7 +910,7 @@ target_compile_options(${EXECUTABLE_RECOVERY_NAME} PUBLIC
906910

907911
set_target_properties(${EXECUTABLE_RECOVERY_NAME} PROPERTIES
908912
SUFFIX ".out"
909-
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"
913+
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"
910914
)
911915

912916
add_custom_command(TARGET ${EXECUTABLE_RECOVERY_NAME}
@@ -936,7 +940,7 @@ target_compile_options(${EXECUTABLE_RECOVERY_MCUBOOT_NAME} PUBLIC
936940

937941
set_target_properties(${EXECUTABLE_RECOVERY_MCUBOOT_NAME} PROPERTIES
938942
SUFFIX ".out"
939-
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"
943+
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"
940944
)
941945

942946
add_custom_command(TARGET ${EXECUTABLE_RECOVERY_MCUBOOT_NAME}
@@ -977,7 +981,7 @@ add_dependencies(${EXECUTABLE_RECOVERYLOADER_NAME} ${EXECUTABLE_RECOVERY_MCUBOOT
977981

978982
set_target_properties(${EXECUTABLE_RECOVERYLOADER_NAME} PROPERTIES
979983
SUFFIX ".out"
980-
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"
984+
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"
981985
)
982986

983987
add_custom_command(TARGET ${EXECUTABLE_RECOVERYLOADER_NAME}
@@ -1010,7 +1014,7 @@ add_dependencies(${EXECUTABLE_MCUBOOT_RECOVERYLOADER_NAME} ${EXECUTABLE_RECOVERY
10101014

10111015
set_target_properties(${EXECUTABLE_MCUBOOT_RECOVERYLOADER_NAME} PROPERTIES
10121016
SUFFIX ".out"
1013-
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"
1017+
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"
10141018
)
10151019

10161020
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
@@ -53,29 +53,26 @@ namespace {
5353
return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0;
5454
}
5555

56-
TouchEvents Convert(Pinetime::Drivers::Cst816S::TouchInfos info) {
57-
if (info.isTouch) {
58-
switch (info.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;
76-
}
56+
TouchEvents ConvertGesture(Pinetime::Drivers::Cst816S::Gestures gesture) {
57+
switch (gesture) {
58+
case Pinetime::Drivers::Cst816S::Gestures::SingleTap:
59+
return TouchEvents::Tap;
60+
case Pinetime::Drivers::Cst816S::Gestures::LongPress:
61+
return TouchEvents::LongTap;
62+
case Pinetime::Drivers::Cst816S::Gestures::DoubleTap:
63+
return TouchEvents::DoubleTap;
64+
case Pinetime::Drivers::Cst816S::Gestures::SlideRight:
65+
return TouchEvents::SwipeRight;
66+
case Pinetime::Drivers::Cst816S::Gestures::SlideLeft:
67+
return TouchEvents::SwipeLeft;
68+
case Pinetime::Drivers::Cst816S::Gestures::SlideDown:
69+
return TouchEvents::SwipeDown;
70+
case Pinetime::Drivers::Cst816S::Gestures::SlideUp:
71+
return TouchEvents::SwipeUp;
72+
case Pinetime::Drivers::Cst816S::Gestures::None:
73+
default:
74+
return TouchEvents::None;
7775
}
78-
return TouchEvents::None;
7976
}
8077
}
8178

@@ -91,7 +88,8 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
9188
Controllers::Settings& settingsController,
9289
Pinetime::Controllers::MotorController& motorController,
9390
Pinetime::Controllers::MotionController& motionController,
94-
Pinetime::Controllers::TimerController& timerController)
91+
Pinetime::Controllers::TimerController& timerController,
92+
Pinetime::Controllers::TouchHandler& touchHandler)
9593
: lcd {lcd},
9694
lvgl {lvgl},
9795
touchPanel {touchPanel},
@@ -104,7 +102,8 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
104102
settingsController {settingsController},
105103
motorController {motorController},
106104
motionController {motionController},
107-
timerController {timerController} {
105+
timerController {timerController},
106+
touchHandler {touchHandler} {
108107
}
109108

110109
void DisplayApp::Start() {
@@ -212,8 +211,7 @@ void DisplayApp::Refresh() {
212211
if (state != States::Running) {
213212
break;
214213
}
215-
auto info = touchPanel.GetTouchInfo();
216-
auto gesture = Convert(info);
214+
auto gesture = ConvertGesture(touchHandler.GestureGet());
217215
if (gesture == TouchEvents::None) {
218216
break;
219217
}
@@ -239,11 +237,9 @@ void DisplayApp::Refresh() {
239237
LoadApp(returnToApp, returnDirection);
240238
brightnessController.Set(settingsController.GetBrightness());
241239
brightnessController.Backup();
242-
} else if (touchMode == TouchModes::Gestures) {
243-
if (gesture == TouchEvents::Tap) {
244-
lvgl.SetNewTapEvent(info.x, info.y);
245-
}
246240
}
241+
} else {
242+
touchHandler.CancelTap();
247243
}
248244
} break;
249245
case Messages::ButtonPushed:
@@ -273,13 +269,8 @@ void DisplayApp::Refresh() {
273269
nextApp = Apps::None;
274270
}
275271

276-
if (state != States::Idle && touchMode == TouchModes::Polling) {
277-
auto info = touchPanel.GetTouchInfo();
278-
if (info.action == 2) { // 2 = contact
279-
if (!currentScreen->OnTouchEvent(info.x, info.y)) {
280-
lvgl.SetNewTapEvent(info.x, info.y);
281-
}
282-
}
272+
if (touchHandler.IsTouching()) {
273+
currentScreen->OnTouchEvent(touchHandler.GetX(), touchHandler.GetY());
283274
}
284275
}
285276

@@ -302,6 +293,7 @@ void DisplayApp::ReturnApp(Apps app, DisplayApp::FullRefreshDirections direction
302293
}
303294

304295
void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) {
296+
touchHandler.CancelTap();
305297
currentScreen.reset(nullptr);
306298
SetFullRefresh(direction);
307299

@@ -467,10 +459,6 @@ void DisplayApp::SetFullRefresh(DisplayApp::FullRefreshDirections direction) {
467459
}
468460
}
469461

470-
void DisplayApp::SetTouchMode(DisplayApp::TouchModes mode) {
471-
touchMode = mode;
472-
}
473-
474462
void DisplayApp::PushMessageToSystemTask(Pinetime::System::Messages message) {
475463
if (systemTask != nullptr)
476464
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

1920
namespace Pinetime {
@@ -31,6 +32,7 @@ namespace Pinetime {
3132
class NotificationManager;
3233
class HeartRateController;
3334
class MotionController;
35+
class TouchHandler;
3436
}
3537

3638
namespace System {
@@ -41,7 +43,6 @@ namespace Pinetime {
4143
public:
4244
enum class States { Idle, Running };
4345
enum class FullRefreshDirections { None, Up, Down, Left, Right, LeftAnim, RightAnim };
44-
enum class TouchModes { Gestures, Polling };
4546

4647
DisplayApp(Drivers::St7789& lcd,
4748
Components::LittleVgl& lvgl,
@@ -55,14 +56,14 @@ namespace Pinetime {
5556
Controllers::Settings& settingsController,
5657
Pinetime::Controllers::MotorController& motorController,
5758
Pinetime::Controllers::MotionController& motionController,
58-
Pinetime::Controllers::TimerController& timerController);
59+
Pinetime::Controllers::TimerController& timerController,
60+
Pinetime::Controllers::TouchHandler& touchHandler);
5961
void Start();
6062
void PushMessage(Display::Messages msg);
6163

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

6466
void SetFullRefresh(FullRefreshDirections direction);
65-
void SetTouchMode(TouchModes mode);
6667

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

@@ -81,6 +82,7 @@ namespace Pinetime {
8182
Pinetime::Controllers::MotorController& motorController;
8283
Pinetime::Controllers::MotionController& motionController;
8384
Pinetime::Controllers::TimerController& timerController;
85+
Pinetime::Controllers::TouchHandler& touchHandler;
8486

8587
Pinetime::Controllers::FirmwareValidator validator;
8688
Controllers::BrightnessController brightnessController;
@@ -100,8 +102,7 @@ namespace Pinetime {
100102
FullRefreshDirections returnDirection = FullRefreshDirections::None;
101103
TouchEvents returnTouchEvent = TouchEvents::None;
102104

103-
TouchModes touchMode = TouchModes::Gestures;
104-
105+
TouchEvents GetGesture();
105106
void RunningState();
106107
void IdleState();
107108
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
@@ -64,10 +64,10 @@ FirmwareValidation::~FirmwareValidation() {
6464
}
6565

6666
void FirmwareValidation::OnButtonEvent(lv_obj_t* object, lv_event_t event) {
67-
if (object == buttonValidate && event == LV_EVENT_PRESSED) {
67+
if (object == buttonValidate && event == LV_EVENT_CLICKED) {
6868
validator.Validate();
6969
running = false;
70-
} else if (object == buttonReset && event == LV_EVENT_PRESSED) {
70+
} else if (object == buttonReset && event == LV_EVENT_CLICKED) {
7171
validator.Reset();
7272
}
7373
}

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)