Initial commit: TXW82x FPV v2.7.0.7-42229 SDK + project sources
This commit is contained in:
13
sdk/lib/lvgl/demos/keypad_encoder/README.md
Normal file
13
sdk/lib/lvgl/demos/keypad_encoder/README.md
Normal file
@@ -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).
|
||||
|
||||

|
||||
|
||||
## 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()`
|
||||
220
sdk/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.c
Normal file
220
sdk/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.c
Normal file
@@ -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
|
||||
39
sdk/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.h
Normal file
39
sdk/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.h
Normal file
@@ -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*/
|
||||
156
sdk/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.py
Normal file
156
sdk/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.py
Normal file
@@ -0,0 +1,156 @@
|
||||
class KeyboardEncoder:
|
||||
def __init__(self):
|
||||
self.LV_VER_RES = lv.scr_act().get_disp().driver.ver_res
|
||||
print("vertial size: ",self.LV_VER_RES)
|
||||
self.g = lv.group_create()
|
||||
self.g.set_default()
|
||||
|
||||
cur_drv = lv.indev_t.__cast__(None)
|
||||
while True:
|
||||
cur_drv = cur_drv.get_next()
|
||||
|
||||
if not cur_drv :
|
||||
break
|
||||
if cur_drv.driver.type == lv.INDEV_TYPE.KEYPAD:
|
||||
print("Found keypad")
|
||||
cur_drv.set_group(self.g)
|
||||
if cur_drv.driver.type == lv.INDEV_TYPE.ENCODER:
|
||||
print("Found encoder")
|
||||
cur_drv.set_group(self.g)
|
||||
|
||||
self.tv = lv.tabview(lv.scr_act(), lv.DIR.TOP, lv.DPI_DEF // 3)
|
||||
|
||||
self.t1 = self.tv.add_tab("Selectors")
|
||||
self.t2 = self.tv.add_tab("Text input")
|
||||
|
||||
self.selectors_create(self.t1)
|
||||
self.text_input_create(self.t2)
|
||||
|
||||
self.msgbox_create()
|
||||
|
||||
def selectors_create(self,parent):
|
||||
parent.set_flex_flow(lv.FLEX_FLOW.COLUMN)
|
||||
parent.set_flex_align(lv.FLEX_ALIGN.START, lv.FLEX_ALIGN.CENTER, lv.FLEX_ALIGN.CENTER)
|
||||
|
||||
obj = lv.table(parent)
|
||||
obj.set_cell_value(0, 0, "00")
|
||||
obj.set_cell_value(0, 1, "01")
|
||||
obj.set_cell_value(1, 0, "10")
|
||||
obj.set_cell_value(1, 1, "11")
|
||||
obj.set_cell_value(2, 0, "20")
|
||||
obj.set_cell_value(2, 1, "21")
|
||||
obj.set_cell_value(3, 0, "30")
|
||||
obj.set_cell_value(3, 1, "31")
|
||||
obj.add_flag(lv.obj.FLAG.SCROLL_ON_FOCUS)
|
||||
|
||||
obj = lv.calendar(parent)
|
||||
obj.add_flag(lv.obj.FLAG.SCROLL_ON_FOCUS)
|
||||
|
||||
obj = lv.btnmatrix(parent)
|
||||
obj.add_flag(lv.obj.FLAG.SCROLL_ON_FOCUS)
|
||||
obj = lv.checkbox(parent)
|
||||
obj.add_flag(lv.obj.FLAG.SCROLL_ON_FOCUS);
|
||||
|
||||
obj = lv.slider(parent)
|
||||
obj.set_range(0, 10)
|
||||
obj.add_flag(lv.obj.FLAG.SCROLL_ON_FOCUS)
|
||||
|
||||
obj = lv.switch(parent)
|
||||
obj.add_flag(lv.obj.FLAG.SCROLL_ON_FOCUS)
|
||||
|
||||
obj = lv.spinbox(parent)
|
||||
obj.add_flag(lv.obj.FLAG.SCROLL_ON_FOCUS)
|
||||
|
||||
obj = lv.dropdown(parent)
|
||||
obj.add_flag(lv.obj.FLAG.SCROLL_ON_FOCUS)
|
||||
|
||||
obj = lv.roller(parent)
|
||||
obj.add_flag(lv.obj.FLAG.SCROLL_ON_FOCUS)
|
||||
|
||||
list = lv.list(parent)
|
||||
list.update_layout()
|
||||
if list.get_height() > parent.get_content_height() :
|
||||
list.set_height(parent.get_content_height())
|
||||
|
||||
list.add_btn(lv.SYMBOL.OK, "Apply")
|
||||
list.add_btn(lv.SYMBOL.CLOSE, "Close")
|
||||
list.add_btn(lv.SYMBOL.EYE_OPEN, "Show")
|
||||
list.add_btn(lv.SYMBOL.EYE_CLOSE, "Hide")
|
||||
list.add_btn(lv.SYMBOL.TRASH, "Delete")
|
||||
list.add_btn(lv.SYMBOL.COPY, "Copy")
|
||||
list.add_btn(lv.SYMBOL.PASTE, "Paste")
|
||||
|
||||
def text_input_create(self,parent) :
|
||||
|
||||
parent.set_flex_flow(lv.FLEX_FLOW.COLUMN)
|
||||
|
||||
ta1 = lv.textarea(parent)
|
||||
ta1.set_width(lv.pct(100))
|
||||
ta1.set_one_line(True)
|
||||
ta1.set_placeholder_text("Click with an encoder to show a keyboard")
|
||||
|
||||
ta2 = lv.textarea(parent)
|
||||
ta2.set_width(lv.pct(100))
|
||||
ta2.set_one_line(True)
|
||||
ta2.set_placeholder_text("Type something")
|
||||
|
||||
self.kb = lv.keyboard(lv.scr_act())
|
||||
self.kb.add_flag(lv.obj.FLAG.HIDDEN)
|
||||
|
||||
ta1.add_event_cb(self.ta_event_cb, lv.EVENT.ALL, None)
|
||||
ta2.add_event_cb(self.ta_event_cb, lv.EVENT.ALL, None)
|
||||
|
||||
|
||||
def msgbox_create(self):
|
||||
|
||||
btns = ["Ok", "Cancel", ""]
|
||||
mbox = lv.msgbox(None, "Hi", "Welcome to the keyboard and encoder demo", btns, False)
|
||||
mbox.add_event_cb(self.msgbox_event_cb, lv.EVENT.ALL, None)
|
||||
lv.group_focus_obj(mbox.get_btns())
|
||||
mbox.get_btns().add_state(lv.STATE.FOCUS_KEY)
|
||||
self.g.focus_freeze(True)
|
||||
|
||||
mbox.align(lv.ALIGN.CENTER, 0, 0)
|
||||
|
||||
bg = mbox.get_parent()
|
||||
bg.set_style_bg_opa(lv.OPA._70, 0)
|
||||
bg.set_style_bg_color(lv.palette_main(lv.PALETTE.GREY), 0)
|
||||
|
||||
|
||||
def msgbox_event_cb(self,e):
|
||||
|
||||
code = e.get_code();
|
||||
msgbox = e.get_current_target()
|
||||
|
||||
if code == lv.EVENT.VALUE_CHANGED:
|
||||
txt = msgbox.get_active_btn_text()
|
||||
if txt:
|
||||
msgbox.close()
|
||||
self.g.focus_freeze(False)
|
||||
lv.group_focus_obj(self.t1.get_child(0))
|
||||
self.t1.scroll_to(0, 0, lv.ANIM.OFF)
|
||||
|
||||
def ta_event_cb(self,e) :
|
||||
|
||||
indev = lv.indev_get_act()
|
||||
if indev == None :
|
||||
return
|
||||
indev_type = indev.get_type()
|
||||
|
||||
code = e.get_code()
|
||||
ta = e.get_target()
|
||||
|
||||
if code == lv.EVENT.CLICKED and indev_type == lv.INDEV_TYPE.ENCODER:
|
||||
self.kb.set_textarea(ta)
|
||||
self.kb.clear_flag(lv.obj.FLAG.HIDDEN)
|
||||
self.kb.group_focus_obj()
|
||||
self.kb.get_group().set_editing()
|
||||
self.tv.set_height(LV_VER_RES // 2)
|
||||
lv_obj_align(kb, LV_ALIGN_BOTTOM_MID, 0, 0);
|
||||
|
||||
if code == lv.EVENT.READY or code == lv.EVENT.CANCEL:
|
||||
self.kb.add_flag(lv.obj.FLAG.HIDDEN)
|
||||
self.tv.set_height(self.LV_VER_RES)
|
||||
|
||||
|
||||
keyboard_encoder = KeyboardEncoder()
|
||||
BIN
sdk/lib/lvgl/demos/keypad_encoder/screenshot1.gif
Normal file
BIN
sdk/lib/lvgl/demos/keypad_encoder/screenshot1.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 127 KiB |
BIN
sdk/lib/lvgl/demos/keypad_encoder/screenshot1.png
Normal file
BIN
sdk/lib/lvgl/demos/keypad_encoder/screenshot1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
Reference in New Issue
Block a user