diff --git a/examples/Braccio_Basic/Braccio_Basic.ino b/examples/Braccio_Basic/Braccio_Basic.ino index f275daa..ebc00c7 100644 --- a/examples/Braccio_Basic/Braccio_Basic.ino +++ b/examples/Braccio_Basic/Braccio_Basic.ino @@ -33,6 +33,7 @@ bool move_joint = false; static void event_handler(lv_event_t * e) { + Braccio.lvgl_lock(); lv_event_code_t code = lv_event_get_code(e); lv_obj_t * obj = lv_event_get_target(e); if (code == LV_EVENT_CLICKED) @@ -46,15 +47,19 @@ static void event_handler(lv_event_t * e) if (strcmp(txt, "Move") == 0) move_joint = !move_joint; } + Braccio.lvgl_unlock(); } void customMenu() { + Braccio.lvgl_lock(); lv_obj_t * btnm1 = lv_btnmatrix_create(lv_scr_act()); lv_btnmatrix_set_map(btnm1, btnm_map); lv_btnmatrix_set_btn_ctrl(btnm1, 0, LV_BTNMATRIX_CTRL_CHECKABLE); lv_obj_align(btnm1, LV_ALIGN_CENTER, 0, 0); lv_obj_add_event_cb(btnm1, event_handler, LV_EVENT_ALL, NULL); + Braccio.lvgl_unlock(); + Braccio.connectJoystickTo(btnm1); } diff --git a/examples/LCD_Custom_Menu/LCD_Custom_Menu.ino b/examples/LCD_Custom_Menu/LCD_Custom_Menu.ino index 18af02c..86c159f 100644 --- a/examples/LCD_Custom_Menu/LCD_Custom_Menu.ino +++ b/examples/LCD_Custom_Menu/LCD_Custom_Menu.ino @@ -28,10 +28,13 @@ static const char * btnm_map[] = {"Option 1", "\n", * FUNCTIONS **************************************************************************************/ -void customMenu(){ +void customMenu() +{ + Braccio.lvgl_lock(); lv_obj_t * btnm1 = lv_btnmatrix_create(lv_scr_act()); lv_btnmatrix_set_map(btnm1, btnm_map); lv_obj_align(btnm1, LV_ALIGN_CENTER, MARGIN_LEFT, MARGIN_TOP); + Braccio.lvgl_unlock(); } /************************************************************************************** diff --git a/examples/LCD_Menu_Joystick/LCD_Menu_Joystick.ino b/examples/LCD_Menu_Joystick/LCD_Menu_Joystick.ino index 9a962ed..36fdfa6 100644 --- a/examples/LCD_Menu_Joystick/LCD_Menu_Joystick.ino +++ b/examples/LCD_Menu_Joystick/LCD_Menu_Joystick.ino @@ -30,7 +30,9 @@ static const char * btnm_map[] = {"Option 1", "Option 2", "\n", * FUNCTIONS **************************************************************************************/ -static void event_handler(lv_event_t * e){ +static void event_handler(lv_event_t * e) +{ + Braccio.lvgl_lock(); lv_event_code_t code = lv_event_get_code(e); lv_obj_t * obj = lv_event_get_target(e); if (code == LV_EVENT_CLICKED) { @@ -40,9 +42,12 @@ static void event_handler(lv_event_t * e){ LV_LOG_USER("%s was pressed\n", txt); Serial.println(String(txt) + " was pressed."); } + Braccio.lvgl_unlock(); } -void customMenu(){ +void customMenu() +{ + Braccio.lvgl_lock(); lv_obj_t * btnm1 = lv_btnmatrix_create(lv_scr_act()); lv_btnmatrix_set_map(btnm1, btnm_map); lv_btnmatrix_set_btn_ctrl(btnm1, 0, LV_BTNMATRIX_CTRL_CHECKABLE); @@ -53,6 +58,8 @@ void customMenu(){ lv_btnmatrix_set_btn_ctrl(btnm1, 5, LV_BTNMATRIX_CTRL_CHECKABLE); lv_obj_align(btnm1, LV_ALIGN_CENTER, MARGIN_LEFT, MARGIN_TOP); lv_obj_add_event_cb(btnm1, event_handler, LV_EVENT_ALL, NULL); + Braccio.lvgl_unlock(); + Braccio.connectJoystickTo(btnm1); } diff --git a/examples/LCD_Motors/LCD_Motors.ino b/examples/LCD_Motors/LCD_Motors.ino index f3a0395..80e5fd7 100644 --- a/examples/LCD_Motors/LCD_Motors.ino +++ b/examples/LCD_Motors/LCD_Motors.ino @@ -32,6 +32,7 @@ static const char * btnm_map[] = {"Motor 1", "Motor 2", "\n", static void event_handler(lv_event_t * e) { + Braccio.lvgl_lock(); lv_event_code_t code = lv_event_get_code(e); lv_obj_t * obj = lv_event_get_target(e); if (code == LV_EVENT_CLICKED) { @@ -63,9 +64,12 @@ static void event_handler(lv_event_t * e) selected_motor = 0; } } + Braccio.lvgl_unlock(); } -void customMenu() { +void customMenu() +{ + Braccio.lvgl_lock(); lv_obj_t * btnm1 = lv_btnmatrix_create(lv_scr_act()); lv_btnmatrix_set_map(btnm1, btnm_map); lv_btnmatrix_set_btn_ctrl(btnm1, 0, LV_BTNMATRIX_CTRL_CHECKABLE); @@ -76,6 +80,8 @@ void customMenu() { lv_btnmatrix_set_btn_ctrl(btnm1, 5, LV_BTNMATRIX_CTRL_CHECKABLE); lv_obj_align(btnm1, LV_ALIGN_CENTER, 0, 0); lv_obj_add_event_cb(btnm1, event_handler, LV_EVENT_ALL, NULL); + Braccio.lvgl_unlock(); + Braccio.connectJoystickTo(btnm1); } diff --git a/src/Braccio++.cpp b/src/Braccio++.cpp index fa11655..d81f682 100644 --- a/src/Braccio++.cpp +++ b/src/Braccio++.cpp @@ -81,6 +81,7 @@ BraccioClass::BraccioClass() , _lvgl_draw_buf{} , _lvgl_p_obj_group{nullptr} , _lvgl_kb_indev{nullptr} +, _display_mtx{} , _display_thd{} , _pd_events{} , _pd_timer{} @@ -238,6 +239,7 @@ int BraccioClass::getKey() { void BraccioClass::connectJoystickTo(lv_obj_t* obj) { + mbed::ScopedLock lock(_display_mtx); lv_group_add_obj(_lvgl_p_obj_group, obj); lv_indev_set_group(_lvgl_kb_indev, _lvgl_p_obj_group); } @@ -409,31 +411,40 @@ void BraccioClass::lvgl_init() void BraccioClass::display_thread_func() { - for(;;) + for(;; delay(LV_DISP_DEF_REFR_PERIOD)) { + mbed::ScopedLock lock(_display_mtx); lv_task_handler(); lv_tick_inc(LV_DISP_DEF_REFR_PERIOD); - delay(LV_DISP_DEF_REFR_PERIOD); } } void BraccioClass::lvgl_splashScreen(unsigned long const duration_ms) { extern const lv_img_dsc_t img_bulb_gif; + lv_obj_t * img = nullptr; - LV_IMG_DECLARE(img_bulb_gif); - lv_obj_t* img = lv_gif_create(lv_scr_act()); - lv_gif_set_src(img, &img_bulb_gif); - lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); + { + mbed::ScopedLock lock(_display_mtx); + LV_IMG_DECLARE(img_bulb_gif); + img = lv_gif_create(lv_scr_act()); + lv_gif_set_src(img, &img_bulb_gif); + lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); + } /* Wait until the splash screen duration is over. */ for (unsigned long const start = millis(); millis() - start < duration_ms; delay(10)) { } - lv_obj_del(img); + { + mbed::ScopedLock lock(_display_mtx); + lv_obj_del(img); + } } void BraccioClass::lvgl_pleaseConnectPower() { + mbed::ScopedLock lock(_display_mtx); + lv_style_set_text_font(&_lv_style, &lv_font_montserrat_32); lv_obj_t * label1 = lv_label_create(lv_scr_act()); lv_obj_add_style(label1, &_lv_style, 0); @@ -445,7 +456,8 @@ void BraccioClass::lvgl_pleaseConnectPower() void BraccioClass::lvgl_defaultMenu() { - // TODO: create a meaningful default menu + mbed::ScopedLock lock(_display_mtx); + lv_style_set_text_font(&_lv_style, &lv_font_montserrat_32); lv_obj_t * label1 = lv_label_create(lv_scr_act()); lv_obj_add_style(label1, &_lv_style, 0); diff --git a/src/Braccio++.h b/src/Braccio++.h index 4dd1a9f..4e5ecf9 100644 --- a/src/Braccio++.h +++ b/src/Braccio++.h @@ -96,6 +96,9 @@ class BraccioClass inline bool isJoystickPressed_DOWN() { return (digitalRead(BTN_DOWN) == LOW); } inline bool isButtonPressed_ENTER() { return (digitalRead(BTN_ENTER) == LOW); } + inline void lvgl_lock () { _display_mtx.lock(); } + inline void lvgl_unlock() { _display_mtx.unlock(); } + static BraccioClass& get_default_instance() { static BraccioClass dev; return dev; @@ -151,6 +154,7 @@ class BraccioClass lv_group_t * _lvgl_p_obj_group; lv_indev_t * _lvgl_kb_indev; lv_style_t _lv_style; + rtos::Mutex _display_mtx; rtos::Thread _display_thd; bool backlight_init(); void display_init();