Files
huxi dc11ee3fc4 1、添加virfat备份与恢复;
2、修复sensorhub低功耗越界问题;
3、修复rcsp传输相关问题;
4、更新flash_params_v3.bin;
5、修复摄像头、科大讯飞相关问题;
2025-12-26 15:26:30 +08:00

258 lines
7.3 KiB
C

#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);
if (app_get_current_mode_name() == APP_MODE_UPDATE ||
app_get_current_mode_name() == APP_MODE_RCSP) {
log_info("%s return", __func__);
return 0; // 传输的时候不处理
}
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