Skip to content

Commit 2fb04c1

Browse files
authored
Merge pull request #61 from arduino-libraries/fix-lvgl-crash-on-startup
Fix lvgl crash on startup with ArduinoCore-mbed >= 2.7.2
2 parents 43dd0fd + 85daef7 commit 2fb04c1

File tree

6 files changed

+49
-12
lines changed

6 files changed

+49
-12
lines changed

examples/Braccio_Basic/Braccio_Basic.ino

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ bool move_joint = false;
3333

3434
static void event_handler(lv_event_t * e)
3535
{
36+
Braccio.lvgl_lock();
3637
lv_event_code_t code = lv_event_get_code(e);
3738
lv_obj_t * obj = lv_event_get_target(e);
3839
if (code == LV_EVENT_CLICKED)
@@ -46,15 +47,19 @@ static void event_handler(lv_event_t * e)
4647
if (strcmp(txt, "Move") == 0)
4748
move_joint = !move_joint;
4849
}
50+
Braccio.lvgl_unlock();
4951
}
5052

5153
void customMenu()
5254
{
55+
Braccio.lvgl_lock();
5356
lv_obj_t * btnm1 = lv_btnmatrix_create(lv_scr_act());
5457
lv_btnmatrix_set_map(btnm1, btnm_map);
5558
lv_btnmatrix_set_btn_ctrl(btnm1, 0, LV_BTNMATRIX_CTRL_CHECKABLE);
5659
lv_obj_align(btnm1, LV_ALIGN_CENTER, 0, 0);
5760
lv_obj_add_event_cb(btnm1, event_handler, LV_EVENT_ALL, NULL);
61+
Braccio.lvgl_unlock();
62+
5863
Braccio.connectJoystickTo(btnm1);
5964
}
6065

examples/LCD_Custom_Menu/LCD_Custom_Menu.ino

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,13 @@ static const char * btnm_map[] = {"Option 1", "\n",
2828
* FUNCTIONS
2929
**************************************************************************************/
3030

31-
void customMenu(){
31+
void customMenu()
32+
{
33+
Braccio.lvgl_lock();
3234
lv_obj_t * btnm1 = lv_btnmatrix_create(lv_scr_act());
3335
lv_btnmatrix_set_map(btnm1, btnm_map);
3436
lv_obj_align(btnm1, LV_ALIGN_CENTER, MARGIN_LEFT, MARGIN_TOP);
37+
Braccio.lvgl_unlock();
3538
}
3639

3740
/**************************************************************************************

examples/LCD_Menu_Joystick/LCD_Menu_Joystick.ino

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ static const char * btnm_map[] = {"Option 1", "Option 2", "\n",
3030
* FUNCTIONS
3131
**************************************************************************************/
3232

33-
static void event_handler(lv_event_t * e){
33+
static void event_handler(lv_event_t * e)
34+
{
35+
Braccio.lvgl_lock();
3436
lv_event_code_t code = lv_event_get_code(e);
3537
lv_obj_t * obj = lv_event_get_target(e);
3638
if (code == LV_EVENT_CLICKED) {
@@ -40,9 +42,12 @@ static void event_handler(lv_event_t * e){
4042
LV_LOG_USER("%s was pressed\n", txt);
4143
Serial.println(String(txt) + " was pressed.");
4244
}
45+
Braccio.lvgl_unlock();
4346
}
4447

45-
void customMenu(){
48+
void customMenu()
49+
{
50+
Braccio.lvgl_lock();
4651
lv_obj_t * btnm1 = lv_btnmatrix_create(lv_scr_act());
4752
lv_btnmatrix_set_map(btnm1, btnm_map);
4853
lv_btnmatrix_set_btn_ctrl(btnm1, 0, LV_BTNMATRIX_CTRL_CHECKABLE);
@@ -53,6 +58,8 @@ void customMenu(){
5358
lv_btnmatrix_set_btn_ctrl(btnm1, 5, LV_BTNMATRIX_CTRL_CHECKABLE);
5459
lv_obj_align(btnm1, LV_ALIGN_CENTER, MARGIN_LEFT, MARGIN_TOP);
5560
lv_obj_add_event_cb(btnm1, event_handler, LV_EVENT_ALL, NULL);
61+
Braccio.lvgl_unlock();
62+
5663
Braccio.connectJoystickTo(btnm1);
5764
}
5865

examples/LCD_Motors/LCD_Motors.ino

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ static const char * btnm_map[] = {"Motor 1", "Motor 2", "\n",
3232

3333
static void event_handler(lv_event_t * e)
3434
{
35+
Braccio.lvgl_lock();
3536
lv_event_code_t code = lv_event_get_code(e);
3637
lv_obj_t * obj = lv_event_get_target(e);
3738
if (code == LV_EVENT_CLICKED) {
@@ -63,9 +64,12 @@ static void event_handler(lv_event_t * e)
6364
selected_motor = 0;
6465
}
6566
}
67+
Braccio.lvgl_unlock();
6668
}
6769

68-
void customMenu() {
70+
void customMenu()
71+
{
72+
Braccio.lvgl_lock();
6973
lv_obj_t * btnm1 = lv_btnmatrix_create(lv_scr_act());
7074
lv_btnmatrix_set_map(btnm1, btnm_map);
7175
lv_btnmatrix_set_btn_ctrl(btnm1, 0, LV_BTNMATRIX_CTRL_CHECKABLE);
@@ -76,6 +80,8 @@ void customMenu() {
7680
lv_btnmatrix_set_btn_ctrl(btnm1, 5, LV_BTNMATRIX_CTRL_CHECKABLE);
7781
lv_obj_align(btnm1, LV_ALIGN_CENTER, 0, 0);
7882
lv_obj_add_event_cb(btnm1, event_handler, LV_EVENT_ALL, NULL);
83+
Braccio.lvgl_unlock();
84+
7985
Braccio.connectJoystickTo(btnm1);
8086
}
8187

src/Braccio++.cpp

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ BraccioClass::BraccioClass()
8181
, _lvgl_draw_buf{}
8282
, _lvgl_p_obj_group{nullptr}
8383
, _lvgl_kb_indev{nullptr}
84+
, _display_mtx{}
8485
, _display_thd{}
8586
, _pd_events{}
8687
, _pd_timer{}
@@ -238,6 +239,7 @@ int BraccioClass::getKey() {
238239

239240
void BraccioClass::connectJoystickTo(lv_obj_t* obj)
240241
{
242+
mbed::ScopedLock<rtos::Mutex> lock(_display_mtx);
241243
lv_group_add_obj(_lvgl_p_obj_group, obj);
242244
lv_indev_set_group(_lvgl_kb_indev, _lvgl_p_obj_group);
243245
}
@@ -409,31 +411,40 @@ void BraccioClass::lvgl_init()
409411

410412
void BraccioClass::display_thread_func()
411413
{
412-
for(;;)
414+
for(;; delay(LV_DISP_DEF_REFR_PERIOD))
413415
{
416+
mbed::ScopedLock<rtos::Mutex> lock(_display_mtx);
414417
lv_task_handler();
415418
lv_tick_inc(LV_DISP_DEF_REFR_PERIOD);
416-
delay(LV_DISP_DEF_REFR_PERIOD);
417419
}
418420
}
419421

420422
void BraccioClass::lvgl_splashScreen(unsigned long const duration_ms)
421423
{
422424
extern const lv_img_dsc_t img_bulb_gif;
425+
lv_obj_t * img = nullptr;
423426

424-
LV_IMG_DECLARE(img_bulb_gif);
425-
lv_obj_t* img = lv_gif_create(lv_scr_act());
426-
lv_gif_set_src(img, &img_bulb_gif);
427-
lv_obj_align(img, LV_ALIGN_CENTER, 0, 0);
427+
{
428+
mbed::ScopedLock<rtos::Mutex> lock(_display_mtx);
429+
LV_IMG_DECLARE(img_bulb_gif);
430+
img = lv_gif_create(lv_scr_act());
431+
lv_gif_set_src(img, &img_bulb_gif);
432+
lv_obj_align(img, LV_ALIGN_CENTER, 0, 0);
433+
}
428434

429435
/* Wait until the splash screen duration is over. */
430436
for (unsigned long const start = millis(); millis() - start < duration_ms; delay(10)) { }
431437

432-
lv_obj_del(img);
438+
{
439+
mbed::ScopedLock<rtos::Mutex> lock(_display_mtx);
440+
lv_obj_del(img);
441+
}
433442
}
434443

435444
void BraccioClass::lvgl_pleaseConnectPower()
436445
{
446+
mbed::ScopedLock<rtos::Mutex> lock(_display_mtx);
447+
437448
lv_style_set_text_font(&_lv_style, &lv_font_montserrat_32);
438449
lv_obj_t * label1 = lv_label_create(lv_scr_act());
439450
lv_obj_add_style(label1, &_lv_style, 0);
@@ -445,7 +456,8 @@ void BraccioClass::lvgl_pleaseConnectPower()
445456

446457
void BraccioClass::lvgl_defaultMenu()
447458
{
448-
// TODO: create a meaningful default menu
459+
mbed::ScopedLock<rtos::Mutex> lock(_display_mtx);
460+
449461
lv_style_set_text_font(&_lv_style, &lv_font_montserrat_32);
450462
lv_obj_t * label1 = lv_label_create(lv_scr_act());
451463
lv_obj_add_style(label1, &_lv_style, 0);

src/Braccio++.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ class BraccioClass
9696
inline bool isJoystickPressed_DOWN() { return (digitalRead(BTN_DOWN) == LOW); }
9797
inline bool isButtonPressed_ENTER() { return (digitalRead(BTN_ENTER) == LOW); }
9898

99+
inline void lvgl_lock () { _display_mtx.lock(); }
100+
inline void lvgl_unlock() { _display_mtx.unlock(); }
101+
99102
static BraccioClass& get_default_instance() {
100103
static BraccioClass dev;
101104
return dev;
@@ -151,6 +154,7 @@ class BraccioClass
151154
lv_group_t * _lvgl_p_obj_group;
152155
lv_indev_t * _lvgl_kb_indev;
153156
lv_style_t _lv_style;
157+
rtos::Mutex _display_mtx;
154158
rtos::Thread _display_thd;
155159
bool backlight_init();
156160
void display_init();

0 commit comments

Comments
 (0)