KT24-1110_65E-HA-651B/apps/soundbox/smartbox/smartbox_setting/adv_key_setting.c
2024-11-10 18:44:17 +08:00

264 lines
6.4 KiB
C

#include "app_config.h"
#include "syscfg_id.h"
#include "key_event_deal.h"
#include "le_smartbox_module.h"
#include "smartbox_setting_sync.h"
#include "smartbox_setting_opt.h"
//#if (SMART_BOX_EN && RCSP_SMARTBOX_ADV_EN)
#if (SMART_BOX_EN)
#if RCSP_ADV_KEY_SET_ENABLE
extern int get_bt_tws_connect_status();
static u8 rcsp_adv_key_event_flag = 0x0;
static u8 g_key_setting[12] = {
0x01, 0x01, 0x05, \
0x02, 0x01, 0x05, \
0x01, 0x02, 0x08, \
0x02, 0x02, 0x08
};
static void enable_adv_key_event(void)
{
rcsp_adv_key_event_flag = 1;
}
static u8 get_adv_key_event_status(void)
{
return rcsp_adv_key_event_flag;
}
static void disable_adv_key_event(void)
{
rcsp_adv_key_event_flag = 0;
}
static void set_key_setting(u8 *key_setting_info)
{
g_key_setting[3 * 0 + 2] = key_setting_info[0];
g_key_setting[3 * 2 + 2] = key_setting_info[1];
g_key_setting[3 * 1 + 2] = key_setting_info[2];
g_key_setting[3 * 3 + 2] = key_setting_info[3];
}
static int get_key_setting(u8 *key_setting_info)
{
key_setting_info[0] = g_key_setting[3 * 0 + 2];
key_setting_info[1] = g_key_setting[3 * 2 + 2];
key_setting_info[2] = g_key_setting[3 * 1 + 2];
key_setting_info[3] = g_key_setting[3 * 3 + 2];
return 0;
}
static void update_key_setting_vm_value(u8 *key_setting_info)
{
syscfg_write(CFG_RCSP_ADV_KEY_SETTING, key_setting_info, 4);
}
static void key_setting_sync(u8 *key_setting_info)
{
#if TCFG_USER_TWS_ENABLE
if (get_bt_tws_connect_status()) {
update_smartbox_setting(ATTR_TYPE_KEY_SETTING);
}
#endif
}
static void deal_key_setting(u8 *key_setting_info, u8 write_vm, u8 tws_sync)
{
u8 key_setting[4];
if (!key_setting_info) {
get_key_setting(key_setting);
} else {
memcpy(key_setting, key_setting_info, 4);
}
// 1、写入VM
if (write_vm) {
update_key_setting_vm_value(key_setting);
}
// 2、同步对端
if (tws_sync) {
key_setting_sync(key_setting);
}
// 3、更新状态
enable_adv_key_event();
}
#define ADV_POWER_ON_OFF 0
enum ADV_KEY_TYPE {
ADV_KEY_TYPE_NULL = 0x0,
#if ADV_POWER_ON_OFF
ADV_KEY_TYPE_POWER_ON,
ADV_KEY_TYPE_POWER_OFF,
#endif
ADV_KEY_TYPE_PREV = 0x3,
ADV_KEY_TYPE_NEXT,
ADV_KEY_TYPE_PP,
ADV_KEY_TYPE_ANSWER_CALL,
ADV_KEY_TYPE_HANG_UP,
ADV_KEY_TYPE_CALL_BACK,
ADV_KEY_TYPE_INC_VOICE,
ADV_KEY_TYPE_DESC_VOICE,
ADV_KEY_TYPE_TAKE_PHOTO,
};
static u8 get_adv_key_opt(u8 key_action, u8 channel)
{
u8 opt;
for (opt = 0; opt < sizeof(g_key_setting); opt += 3) {
if (g_key_setting[opt] == channel &&
g_key_setting[opt + 1] == key_action) {
break;
}
}
if (sizeof(g_key_setting) == opt) {
return -1;
}
switch (g_key_setting[opt + 2]) {
case ADV_KEY_TYPE_NULL:
//opt = KEY_NULL;
opt = ADV_KEY_TYPE_NULL;
break;
#if ADV_POWER_ON_OFF
case ADV_KEY_TYPE_POWER_ON:
opt = KEY_POWER_ON;
break;
case ADV_KEY_TYPE_POWER_OFF:
opt = KEY_RCSP_POWEROFF;
break;
#endif
case ADV_KEY_TYPE_PREV:
opt = KEY_MUSIC_PREV;
break;
case ADV_KEY_TYPE_NEXT:
opt = KEY_MUSIC_NEXT;
break;
case ADV_KEY_TYPE_PP:
opt = KEY_MUSIC_PP;
break;
case ADV_KEY_TYPE_ANSWER_CALL:
opt = KEY_CALL_ANSWER;
break;
case ADV_KEY_TYPE_HANG_UP:
opt = KEY_CALL_HANG_UP;
break;
case ADV_KEY_TYPE_CALL_BACK:
opt = KEY_CALL_LAST_NO;
break;
case ADV_KEY_TYPE_INC_VOICE:
opt = KEY_VOL_UP;
break;
case ADV_KEY_TYPE_DESC_VOICE:
opt = KEY_VOL_DOWN;
break;
case ADV_KEY_TYPE_TAKE_PHOTO:
opt = KEY_HID_CONTROL;
break;
}
return opt;
}
void set_key_event_by_rcsp_info(struct sys_event *event, u8 *key_event)
{
if (0 == get_adv_key_event_status()) {
return;
}
u8 key_action = 0;
struct key_event *key = &event->u.key;
switch (key->event) {
case 0:
// 单击
key_action = 0x1;
break;
case 4:
// 双击
key_action = 0x2;
break;
default:
return;
}
#if (TCFG_CHARGESTORE_ENABLE && TCFG_USER_TWS_ENABLE)
u8 channel = tws_api_get_local_channel();
if (get_bt_tws_connect_status()) {
channel = tws_api_get_local_channel();
}
#else
u8 channel = 'U';
#endif
switch (channel) {
case 'U':
case 'L':
channel = (u32) event->arg == KEY_EVENT_FROM_TWS ? 2 : 1;
break;
case 'R':
channel = (u32) event->arg == KEY_EVENT_FROM_TWS ? 1 : 2;
break;
default:
return;
}
key_action = get_adv_key_opt(key_action, channel);
if ((u8) - 1 != key_action) {
*key_event = key_action ? key_action : KEY_NULL;
}
}
static int key_set_setting_extra_handle(void *setting_data, void *param)
{
u8 dlen = *((u8 *)param);
u8 *key_setting_data = (u8 *) setting_data;
while (dlen >= 3) {
if (key_setting_data[0] == 0x01) {
if (key_setting_data[1] == 0x01) {
g_key_setting[2] = key_setting_data[2];
} else if (key_setting_data[1] == 0x02) {
g_key_setting[8] = key_setting_data[2];
}
} else if (key_setting_data[0] == 0x02) {
if (key_setting_data[1] == 0x01) {
g_key_setting[5] = key_setting_data[2];
} else if (key_setting_data[1] == 0x02) {
g_key_setting[11] = key_setting_data[2];
}
}
dlen -= 3;
key_setting_data += 3;
}
return 0;
}
static int key_get_setting_extra_handle(void *setting_data, void *param)
{
int **setting_data_ptr = (int **)setting_data;
*setting_data_ptr = g_key_setting;
return sizeof(g_key_setting);
}
static SMARTBOX_SETTING_OPT adv_key_opt = {
.data_len = 4,
.setting_type = ATTR_TYPE_KEY_SETTING,
.syscfg_id = CFG_RCSP_ADV_KEY_SETTING,
.deal_opt_setting = deal_key_setting,
.set_setting = set_key_setting,
.get_setting = get_key_setting,
.custom_setting_init = NULL,
.custom_vm_info_update = NULL,
.custom_setting_update = NULL,
.custom_sibling_setting_deal = NULL,
.custom_setting_release = NULL,
.set_setting_extra_handle = key_set_setting_extra_handle,
.get_setting_extra_handle = key_get_setting_extra_handle,
};
REGISTER_APP_SETTING_OPT(adv_key_opt);
#endif
#endif