From dd27c3530432ea0b09f01e604bf577f31d8ef841 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 1 Jun 2023 15:41:47 +1000 Subject: convert lvgl from submodule to a plain old directory --- lib/lvgl | 1 - lib/lvgl/demos/keypad_encoder/README.md | 13 ++ .../demos/keypad_encoder/lv_demo_keypad_encoder.c | 220 +++++++++++++++++++++ .../demos/keypad_encoder/lv_demo_keypad_encoder.h | 39 ++++ lib/lvgl/demos/keypad_encoder/screenshot1.gif | Bin 0 -> 130172 bytes lib/lvgl/demos/keypad_encoder/screenshot1.png | Bin 0 -> 14215 bytes 6 files changed, 272 insertions(+), 1 deletion(-) delete mode 160000 lib/lvgl create mode 100644 lib/lvgl/demos/keypad_encoder/README.md create mode 100644 lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.c create mode 100644 lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.h create mode 100644 lib/lvgl/demos/keypad_encoder/screenshot1.gif create mode 100644 lib/lvgl/demos/keypad_encoder/screenshot1.png (limited to 'lib/lvgl/demos/keypad_encoder') diff --git a/lib/lvgl b/lib/lvgl deleted file mode 160000 index 0732400e..00000000 --- a/lib/lvgl +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0732400e7b564dd0e7dc4a924619d8e19c5b23a0 diff --git a/lib/lvgl/demos/keypad_encoder/README.md b/lib/lvgl/demos/keypad_encoder/README.md new file mode 100644 index 00000000..9fa792a7 --- /dev/null +++ b/lib/lvgl/demos/keypad_encoder/README.md @@ -0,0 +1,13 @@ +# Keypad and Encoder demo + +## Overview + +LVGL allows you to control the widgets with keypad and/or encoder without touchpad. +This demo shows how to handle buttons, drop-down lists, rollers, sliders, switches and text inputs without touchpad. +Learn more about the touchpad-less usage of LVGL [here](https://docs.lvgl.io/master/overview/indev.html#keypad-and-encoder). + +![Keypad and encoder navigation in LVGL embedded GUI library](screenshot1.gif) + +## Run the demo +- In `lv_conf.h` or equivalent places set `LV_USE_DEMO_KEYPAD_AND_ENCODER 1` +- After `lv_init()` and initializing the drivers call `lv_demo_keypad_encoder()` diff --git a/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.c b/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.c new file mode 100644 index 00000000..fdb9b94f --- /dev/null +++ b/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.c @@ -0,0 +1,220 @@ +/** + * @file lv_demo_keypad_encoder.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_demo_keypad_encoder.h" + +#if LV_USE_DEMO_KEYPAD_AND_ENCODER + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void selectors_create(lv_obj_t * parent); +static void text_input_create(lv_obj_t * parent); +static void msgbox_create(void); + +static void msgbox_event_cb(lv_event_t * e); +static void ta_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +static lv_group_t * g; +static lv_obj_t * tv; +static lv_obj_t * t1; +static lv_obj_t * t2; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_demo_keypad_encoder(void) +{ + g = lv_group_create(); + lv_group_set_default(g); + + lv_indev_t * cur_drv = NULL; + for(;;) { + cur_drv = lv_indev_get_next(cur_drv); + if(!cur_drv) { + break; + } + + if(cur_drv->driver->type == LV_INDEV_TYPE_KEYPAD) { + lv_indev_set_group(cur_drv, g); + } + + if(cur_drv->driver->type == LV_INDEV_TYPE_ENCODER) { + lv_indev_set_group(cur_drv, g); + } + } + + tv = lv_tabview_create(lv_scr_act(), LV_DIR_TOP, LV_DPI_DEF / 3); + + t1 = lv_tabview_add_tab(tv, "Selectors"); + t2 = lv_tabview_add_tab(tv, "Text input"); + + selectors_create(t1); + text_input_create(t2); + + msgbox_create(); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void selectors_create(lv_obj_t * parent) +{ + lv_obj_set_flex_flow(parent, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(parent, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + + lv_obj_t * obj; + + obj = lv_table_create(parent); + lv_table_set_cell_value(obj, 0, 0, "00"); + lv_table_set_cell_value(obj, 0, 1, "01"); + lv_table_set_cell_value(obj, 1, 0, "10"); + lv_table_set_cell_value(obj, 1, 1, "11"); + lv_table_set_cell_value(obj, 2, 0, "20"); + lv_table_set_cell_value(obj, 2, 1, "21"); + lv_table_set_cell_value(obj, 3, 0, "30"); + lv_table_set_cell_value(obj, 3, 1, "31"); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + obj = lv_calendar_create(parent); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + obj = lv_btnmatrix_create(parent); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + obj = lv_checkbox_create(parent); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + obj = lv_slider_create(parent); + lv_slider_set_range(obj, 0, 10); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + obj = lv_switch_create(parent); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + obj = lv_spinbox_create(parent); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + obj = lv_dropdown_create(parent); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + obj = lv_roller_create(parent); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + lv_obj_t * list = lv_list_create(parent); + lv_obj_update_layout(list); + if(lv_obj_get_height(list) > lv_obj_get_content_height(parent)) { + lv_obj_set_height(list, lv_obj_get_content_height(parent)); + } + + lv_list_add_btn(list, LV_SYMBOL_OK, "Apply"); + lv_list_add_btn(list, LV_SYMBOL_CLOSE, "Close"); + lv_list_add_btn(list, LV_SYMBOL_EYE_OPEN, "Show"); + lv_list_add_btn(list, LV_SYMBOL_EYE_CLOSE, "Hide"); + lv_list_add_btn(list, LV_SYMBOL_TRASH, "Delete"); + lv_list_add_btn(list, LV_SYMBOL_COPY, "Copy"); + lv_list_add_btn(list, LV_SYMBOL_PASTE, "Paste"); +} + +static void text_input_create(lv_obj_t * parent) +{ + lv_obj_set_flex_flow(parent, LV_FLEX_FLOW_COLUMN); + + lv_obj_t * ta1 = lv_textarea_create(parent); + lv_obj_set_width(ta1, LV_PCT(100)); + lv_textarea_set_one_line(ta1, true); + lv_textarea_set_placeholder_text(ta1, "Click with an encoder to show a keyboard"); + + lv_obj_t * ta2 = lv_textarea_create(parent); + lv_obj_set_width(ta2, LV_PCT(100)); + lv_textarea_set_one_line(ta2, true); + lv_textarea_set_placeholder_text(ta2, "Type something"); + + lv_obj_t * kb = lv_keyboard_create(lv_scr_act()); + lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN); + + lv_obj_add_event_cb(ta1, ta_event_cb, LV_EVENT_ALL, kb); + lv_obj_add_event_cb(ta2, ta_event_cb, LV_EVENT_ALL, kb); +} + +static void msgbox_create(void) +{ + static const char * btns[] = {"Ok", "Cancel", ""}; + lv_obj_t * mbox = lv_msgbox_create(NULL, "Hi", "Welcome to the keyboard and encoder demo", btns, false); + lv_obj_add_event_cb(mbox, msgbox_event_cb, LV_EVENT_ALL, NULL); + lv_group_focus_obj(lv_msgbox_get_btns(mbox)); + lv_obj_add_state(lv_msgbox_get_btns(mbox), LV_STATE_FOCUS_KEY); + lv_group_focus_freeze(g, true); + + lv_obj_align(mbox, LV_ALIGN_CENTER, 0, 0); + + lv_obj_t * bg = lv_obj_get_parent(mbox); + lv_obj_set_style_bg_opa(bg, LV_OPA_70, 0); + lv_obj_set_style_bg_color(bg, lv_palette_main(LV_PALETTE_GREY), 0); +} + +static void msgbox_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * msgbox = lv_event_get_current_target(e); + + if(code == LV_EVENT_VALUE_CHANGED) { + const char * txt = lv_msgbox_get_active_btn_text(msgbox); + if(txt) { + lv_msgbox_close(msgbox); + lv_group_focus_freeze(g, false); + lv_group_focus_obj(lv_obj_get_child(t1, 0)); + lv_obj_scroll_to(t1, 0, 0, LV_ANIM_OFF); + + } + } +} + +static void ta_event_cb(lv_event_t * e) +{ + lv_indev_t * indev = lv_indev_get_act(); + if(indev == NULL) return; + lv_indev_type_t indev_type = lv_indev_get_type(indev); + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * ta = lv_event_get_target(e); + lv_obj_t * kb = lv_event_get_user_data(e); + + if(code == LV_EVENT_CLICKED && indev_type == LV_INDEV_TYPE_ENCODER) { + lv_keyboard_set_textarea(kb, ta); + lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN); + lv_group_focus_obj(kb); + lv_group_set_editing(lv_obj_get_group(kb), kb); + lv_obj_set_height(tv, LV_VER_RES / 2); + lv_obj_align(kb, LV_ALIGN_BOTTOM_MID, 0, 0); + } + + if(code == LV_EVENT_READY || code == LV_EVENT_CANCEL) { + lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN); + lv_obj_set_height(tv, LV_VER_RES); + } +} + +#endif diff --git a/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.h b/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.h new file mode 100644 index 00000000..c509d662 --- /dev/null +++ b/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.h @@ -0,0 +1,39 @@ +/** + * @file lv_demo_keypad_encoder.h + * + */ + +#ifndef LV_DEMO_KEYPAD_ENCODER_H +#define LV_DEMO_KEYPAD_ENCODER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_demos.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_demo_keypad_encoder(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_DEMO_KEYPAD_ENCODER_H*/ diff --git a/lib/lvgl/demos/keypad_encoder/screenshot1.gif b/lib/lvgl/demos/keypad_encoder/screenshot1.gif new file mode 100644 index 00000000..67222ad3 Binary files /dev/null and b/lib/lvgl/demos/keypad_encoder/screenshot1.gif differ diff --git a/lib/lvgl/demos/keypad_encoder/screenshot1.png b/lib/lvgl/demos/keypad_encoder/screenshot1.png new file mode 100644 index 00000000..4b54ed58 Binary files /dev/null and b/lib/lvgl/demos/keypad_encoder/screenshot1.png differ -- cgit v1.2.3