初版
This commit is contained in:
@@ -0,0 +1,252 @@
|
||||
#include "app_config.h"
|
||||
#include "system/includes.h"
|
||||
#include "app_msg.h"
|
||||
#include "app_mode.h"
|
||||
#include "app_main.h"
|
||||
#include "key_driver.h"
|
||||
#include "ui_key_remap.h"
|
||||
#include "ui_api.h"
|
||||
#include "jlui_app/ui_style.h"
|
||||
|
||||
#define LOG_TAG_CONST UI
|
||||
#define LOG_TAG "[UI_KEY]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_DEBUG_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
/***********************************************************************************
|
||||
JL框架
|
||||
***********************************************************************************/
|
||||
#if (defined(CONFIG_UI_STYLE_JL_PUBLIC_MODLS_ENABLE)) ||(defined(CONFIG_UI_STYLE_JL_CSC_PUBLIC_MODLS_ENABLE))
|
||||
struct ui_key_remap_handler {
|
||||
void (*send_event_cb)(int key_event);
|
||||
};
|
||||
struct ui_jlui_key_remap_table {
|
||||
u8 key_value;
|
||||
const int *remap_table;
|
||||
};
|
||||
static struct ui_key_remap_handler hdl;
|
||||
#define __this (&hdl)
|
||||
|
||||
|
||||
/*lvgl只需要down up事件*/
|
||||
#ifdef CONFIG_UI_STYLE_JL_CSC_PUBLIC_MODLS_ENABLE
|
||||
#define JLUI_KEY_EVENT_MAX 4
|
||||
#else
|
||||
#define JLUI_KEY_EVENT_MAX 3
|
||||
#endif
|
||||
#define JLUI_KEY_EVENT_TABLE_MAX 6
|
||||
|
||||
static const int key_io_num0_event_table[JLUI_KEY_EVENT_MAX] = {
|
||||
KEY_UI_HOME, KEY_UI_POWEROFF, KEY_UI_MENU_LIST,
|
||||
};
|
||||
|
||||
static const int key_ad_num0_event_table[JLUI_KEY_EVENT_MAX] = {
|
||||
#ifdef CONFIG_UI_STYLE_JL_CSC_PUBLIC_MODLS_ENABLE
|
||||
KEY_UI_HOME, KEY_UI_POWEROFF, KEY_UI_MENU_LIST, KEY_UI_TRIPLE_CLICK,
|
||||
#else
|
||||
KEY_UI_HOME, KEY_UI_POWEROFF, KEY_UI_MENU_LIST,
|
||||
#endif
|
||||
};
|
||||
|
||||
static const int key_ad_num1_event_table[JLUI_KEY_EVENT_MAX] = {
|
||||
KEY_UI_SHORTCUT,
|
||||
};
|
||||
|
||||
const struct ui_jlui_key_remap_table jlui_key_watch_event_table[JLUI_KEY_EVENT_TABLE_MAX ] = {
|
||||
{ .key_value = KEY_IO_NUM0, .remap_table = key_io_num0_event_table },
|
||||
{ .key_value = KEY_AD_NUM0, .remap_table = key_ad_num0_event_table },
|
||||
{ .key_value = KEY_AD_NUM1, .remap_table = key_ad_num1_event_table },
|
||||
{ .key_value = 0xff }
|
||||
};
|
||||
|
||||
|
||||
/*将key_event进行映射成具体的按键事件*/
|
||||
u16 jlui_key_event_remap(struct key_event *key, const struct ui_jlui_key_remap_table *table)
|
||||
{
|
||||
u16 key_event = -1;
|
||||
int key_value;
|
||||
|
||||
if (key->event == KEY_ACTION_RDEC_ROTATE) { // 旋转编码器
|
||||
key_value = key->value;
|
||||
if (key_value > 0) {
|
||||
key_event = KEY_UI_PLUS; // 正转
|
||||
} else if (key_value < 0) {
|
||||
key_event = KEY_UI_MINUS; // 反转
|
||||
}
|
||||
return key_event;
|
||||
}
|
||||
|
||||
for (int i = 0; table[i].key_value != 0xff; i++) {
|
||||
if (jlui_key_watch_event_table[i].key_value == key->value) {
|
||||
if (table[i].remap_table) {
|
||||
if (key->event == KEY_ACTION_CLICK) {
|
||||
key_event = table[i].remap_table[0];
|
||||
} else if (key->event == KEY_ACTION_HOLD) {
|
||||
key_event = table[i].remap_table[1];
|
||||
} else if (key->event == KEY_ACTION_DOUBLE_CLICK) {
|
||||
key_event = table[i].remap_table[2];
|
||||
} else if (key->event == KEY_ACTION_TRIPLE_CLICK) {
|
||||
key_event = table[i].remap_table[3];
|
||||
} else {
|
||||
key_event = KEY_WATCH_NO_KEY;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return key_event;
|
||||
}
|
||||
|
||||
void ui_key_set_send_event_cb(void (*cb)(int key_event))
|
||||
{
|
||||
if (cb) {
|
||||
__this->send_event_cb = cb;
|
||||
}
|
||||
}
|
||||
|
||||
static int ui_key_event_prob_handle(void *arg)
|
||||
{
|
||||
struct key_event *key = (struct key_event *)arg;
|
||||
u16 key_event;
|
||||
log_debug("[%s] key->event:%d, key->value:%d", __func__, key->event, key->value);
|
||||
key_event = jlui_key_event_remap(key, jlui_key_watch_event_table);
|
||||
|
||||
if (__this->send_event_cb) {
|
||||
__this->send_event_cb(key_event);
|
||||
return 1; /*接管事件*/
|
||||
}
|
||||
|
||||
return 0; /*不接管事件*/
|
||||
}
|
||||
/*拦截key_driver产生的key_event*/
|
||||
REGISTER_KEY_DET_CALLBACK(jlui_key) = {
|
||||
.name = NULL,
|
||||
.arg = NULL,
|
||||
.cb_deal = ui_key_event_prob_handle,
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
/***********************************************************************************
|
||||
lvgl
|
||||
***********************************************************************************/
|
||||
|
||||
//LVGL框架
|
||||
struct lvgl_key_remap_handler {
|
||||
int (*send_event_cb)(struct key_event *event);
|
||||
};
|
||||
|
||||
static struct lvgl_key_remap_handler lv_hdl;
|
||||
#define __lv_this (&lv_hdl)
|
||||
|
||||
void lvgl_ui_key_set_send_event_cb(int (*cb)(struct key_event *key))
|
||||
{
|
||||
if (cb) {
|
||||
__lv_this->send_event_cb = cb;
|
||||
}
|
||||
}
|
||||
|
||||
#if ((defined CONFIG_LVGL_UI_ENABLE) && (CONFIG_LVGL_UI_ENABLE))
|
||||
|
||||
enum {
|
||||
KEY_IO_NUM0_DOWN,
|
||||
KEY_IO_NUM0_UP,
|
||||
KEY_AD_NUM0_DOWN,
|
||||
KEY_AD_NUM0_UP,
|
||||
KEY_AD_NUM1_DOWN,
|
||||
KEY_AD_NUM1_UP,
|
||||
};
|
||||
enum {
|
||||
LV_KEY_UI_MINUS,
|
||||
LV_KEY_UI_PLUS,
|
||||
};
|
||||
|
||||
|
||||
/*lvgl只需要down up事件*/
|
||||
#define LVGL_KEY_EVENT_MAX 2
|
||||
#define LVGL_KEY_EVENT_TABLE_MAX 6
|
||||
|
||||
static const int key_io_num0_event_table[LVGL_KEY_EVENT_MAX] = {
|
||||
KEY_IO_NUM0_DOWN, KEY_IO_NUM0_UP,
|
||||
};
|
||||
|
||||
static const int key_ad_num0_event_table[LVGL_KEY_EVENT_MAX] = {
|
||||
KEY_AD_NUM0_DOWN, KEY_IO_NUM0_UP,
|
||||
};
|
||||
|
||||
static const int key_ad_num1_event_table[LVGL_KEY_EVENT_MAX] = {
|
||||
KEY_AD_NUM1_DOWN, KEY_AD_NUM1_UP,
|
||||
};
|
||||
|
||||
const struct ui_lvgl_key_remap_table lvgl_key_watch_event_table[LVGL_KEY_EVENT_TABLE_MAX] = {
|
||||
{ .key_value = KEY_IO_NUM0, .remap_table = key_io_num0_event_table },
|
||||
{ .key_value = KEY_AD_NUM0, .remap_table = key_ad_num0_event_table },
|
||||
{ .key_value = KEY_AD_NUM1, .remap_table = key_ad_num1_event_table },
|
||||
{ .key_value = 0xff }
|
||||
};
|
||||
|
||||
|
||||
/*将key_event进行映射成具体的按键事件*/
|
||||
u16 ui_lvgl_key_event_remap(struct key_event *key, const struct ui_lvgl_key_remap_table *table)
|
||||
{
|
||||
u16 key_event = -1;
|
||||
int key_value;
|
||||
|
||||
if (key->event == KEY_ACTION_RDEC_ROTATE) {// 旋转编码器
|
||||
key_value = key->value;
|
||||
if (key_value > 0) {
|
||||
key_event = LV_KEY_UI_PLUS; // 正转
|
||||
} else if (key_value < 0) {
|
||||
key_event = LV_KEY_UI_MINUS; // 反转
|
||||
}
|
||||
return key_event;
|
||||
}
|
||||
|
||||
for (int i = 0; table[i].key_value != 0xff; i++) {
|
||||
if (lvgl_key_watch_event_table[i].key_value == key->value) {
|
||||
if (table[i].remap_table) {
|
||||
if (key->event == KEY_ACTION_LVGL_DOWN) {
|
||||
key_event = table[i].remap_table[0];
|
||||
} else if (key->event == KEY_ACTION_UP) {
|
||||
key_event = table[i].remap_table[1];
|
||||
} else {
|
||||
key_event = KEY_WATCH_NO_KEY;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return key_event;
|
||||
}
|
||||
|
||||
u16 lvgl_key_event_remap_default(struct key_event *key)
|
||||
{
|
||||
|
||||
return ui_lvgl_key_event_remap(key, lvgl_key_watch_event_table);
|
||||
}
|
||||
|
||||
|
||||
static int ui_key_event_prob_handle(void *arg)
|
||||
{
|
||||
struct key_event *key = (struct key_event *)arg;
|
||||
log_debug("[%s] key->event:%d, key->value:%d", __func__, key->event, key->value);
|
||||
|
||||
if (__lv_this->send_event_cb) {
|
||||
return (__lv_this->send_event_cb(key));
|
||||
//return 1; /*接管事件*/
|
||||
}
|
||||
return 0; /*不接管事件*/
|
||||
}
|
||||
/*拦截key_driver产生的key_event*/
|
||||
REGISTER_KEY_DET_CALLBACK(lvgl_key) = {
|
||||
.name = NULL,
|
||||
.arg = NULL,
|
||||
.cb_deal = ui_key_event_prob_handle,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user