264 lines
6.8 KiB
C
264 lines
6.8 KiB
C
#include "smartbox/config.h"
|
|
#include "smartbox_setting_opt.h"
|
|
#include "smartbox_setting_sync.h"
|
|
#include "smartbox_rcsp_manage.h"
|
|
#include "btstack/avctp_user.h"
|
|
#include "bt_tws.h"
|
|
|
|
|
|
#if (SMART_BOX_EN)
|
|
|
|
static SMARTBOX_SETTING_OPT *g_opt_link_head = NULL;
|
|
static u32 g_opt_total_size = 0;
|
|
|
|
int register_smartbox_setting_opt_setting(void *opt_param)
|
|
{
|
|
SMARTBOX_SETTING_OPT *opt = g_opt_link_head;
|
|
SMARTBOX_SETTING_OPT *item = (SMARTBOX_SETTING_OPT *)opt_param;
|
|
while (opt && item) {
|
|
if (opt->setting_type == item->setting_type) {
|
|
return 0;
|
|
}
|
|
opt = opt->next;
|
|
}
|
|
|
|
if (item) {
|
|
item->next = g_opt_link_head;
|
|
g_opt_link_head = item;
|
|
return 0;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
static u8 deal_setting_string_item(u8 *des, u8 *src, u8 src_len, u8 type)
|
|
{
|
|
u8 offset = 0;
|
|
if (src_len) {
|
|
des[offset++] = type;
|
|
memcpy(des + offset, src, src_len);
|
|
offset += src_len;
|
|
}
|
|
return offset;
|
|
}
|
|
|
|
u8 smartbox_read_data_from_vm(u8 syscfg_id, u8 *buf, u8 buf_len)
|
|
{
|
|
int len = 0;
|
|
u8 i = 0;
|
|
|
|
len = syscfg_read(syscfg_id, buf, buf_len);
|
|
|
|
if (len > 0) {
|
|
for (i = 0; i < buf_len; i++) {
|
|
if (buf[i] != 0xff) {
|
|
return (buf_len == len);
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void smart_setting_init(void)
|
|
{
|
|
SMARTBOX_SETTING_OPT *opt = g_opt_link_head;
|
|
u32 opt_total_size = 0;
|
|
while (opt) {
|
|
u8 *data = NULL;
|
|
if (opt->data_len) {
|
|
data = zalloc(opt->data_len);
|
|
}
|
|
if (opt->custom_setting_init) {
|
|
opt->custom_setting_init();
|
|
} else if (smartbox_read_data_from_vm(opt->syscfg_id, data, opt->data_len)) {
|
|
if (opt->set_setting && opt->deal_opt_setting) {
|
|
opt->set_setting(data);
|
|
opt->deal_opt_setting(NULL, 0, 0);
|
|
}
|
|
}
|
|
|
|
if (data) {
|
|
free(data);
|
|
}
|
|
if (opt->data_len) {
|
|
opt_total_size += (opt->data_len + 1);
|
|
}
|
|
opt = opt->next;
|
|
}
|
|
|
|
if (opt_total_size) {
|
|
g_opt_total_size = opt_total_size + 1;
|
|
}
|
|
}
|
|
|
|
void update_smartbox_setting(u8 type)
|
|
{
|
|
u16 offset = sizeof(u16);
|
|
u8 *setting_to_sync = NULL;
|
|
if (g_opt_total_size) {
|
|
setting_to_sync = zalloc(g_opt_total_size);
|
|
} else {
|
|
return;
|
|
}
|
|
SMARTBOX_SETTING_OPT *opt = g_opt_link_head;
|
|
|
|
while (opt) {
|
|
if (((u8) - 1 == type) || (type == opt->setting_type)) {
|
|
u8 *data = NULL;
|
|
if (opt->data_len) {
|
|
data = zalloc(opt->data_len);
|
|
}
|
|
if (opt->custom_setting_update) {
|
|
opt->custom_setting_update(data);
|
|
} else if (opt->get_setting) {
|
|
opt->get_setting(data);
|
|
}
|
|
offset += deal_setting_string_item(setting_to_sync + offset, data, opt->data_len, opt->setting_type);
|
|
if (data) {
|
|
free(data);
|
|
}
|
|
}
|
|
opt = opt->next;
|
|
}
|
|
|
|
if (offset > sizeof(u16)) {
|
|
memcpy(setting_to_sync, &offset, sizeof(offset));
|
|
if (((u8) - 1) == type) {
|
|
tws_api_send_data_to_sibling(setting_to_sync, offset, TWS_FUNC_ID_ADV_SETTING_SYNC);
|
|
tws_api_sync_call_by_uuid(TWS_FUNC_APP_OPT_UUID, APP_OPT_SYNC_CMD_APP_RESET_LED_UI, 300);
|
|
} else {
|
|
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
|
tws_api_send_data_to_sibling(setting_to_sync, offset, TWS_FUNC_ID_ADV_SETTING_SYNC);
|
|
tws_api_sync_call_by_uuid(TWS_FUNC_APP_OPT_UUID, APP_OPT_SYNC_CMD_APP_RESET_LED_UI, 300);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (setting_to_sync) {
|
|
free(setting_to_sync);
|
|
}
|
|
}
|
|
|
|
void deal_sibling_setting(u8 *buf)
|
|
{
|
|
u8 type;
|
|
u16 len = 0;
|
|
memcpy(&len, buf, sizeof(len));
|
|
u16 offset = sizeof(len);
|
|
u8 *data;
|
|
while (offset < len) {
|
|
type = buf[offset++];
|
|
data = buf + offset;
|
|
SMARTBOX_SETTING_OPT *opt = g_opt_link_head;
|
|
while (opt) {
|
|
if (type == opt->setting_type) {
|
|
if (opt->custom_sibling_setting_deal) {
|
|
opt->custom_sibling_setting_deal(data);
|
|
} else if (opt->set_setting) {
|
|
opt->set_setting(data);
|
|
}
|
|
offset += opt->data_len;
|
|
opt->need_opt = true;
|
|
break;
|
|
}
|
|
opt = opt->next;
|
|
}
|
|
}
|
|
// 发送事件
|
|
JL_rcsp_event_to_user(DEVICE_EVENT_FROM_RCSP, MSG_JL_ADV_SETTING_UPDATE, NULL, 0);
|
|
}
|
|
|
|
void update_info_from_vm_info(void)
|
|
{
|
|
SMARTBOX_SETTING_OPT *opt = g_opt_link_head;
|
|
while (opt) {
|
|
if (opt->need_opt) {
|
|
if (opt->custom_vm_info_update) {
|
|
opt->custom_vm_info_update();
|
|
} else if (opt->deal_opt_setting) {
|
|
opt->deal_opt_setting(NULL, 1, 0);
|
|
}
|
|
opt->need_opt = false;
|
|
}
|
|
opt = opt->next;
|
|
}
|
|
}
|
|
|
|
SMARTBOX_SETTING_OPT *get_smartbox_setting_opt_hdl(u16 setting_type)
|
|
{
|
|
SMARTBOX_SETTING_OPT *opt = g_opt_link_head;
|
|
while (opt) {
|
|
if (opt->setting_type == setting_type) {
|
|
return opt;
|
|
}
|
|
opt = opt->next;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void set_smartbox_opt_setting(SMARTBOX_SETTING_OPT *setting_opt_hdl, u8 *data)
|
|
{
|
|
if (setting_opt_hdl && setting_opt_hdl->deal_opt_setting) {
|
|
setting_opt_hdl->deal_opt_setting(data, 1, 1);
|
|
}
|
|
}
|
|
|
|
int get_smartbox_opt_setting(SMARTBOX_SETTING_OPT *setting_opt_hdl, u8 *data)
|
|
{
|
|
if (setting_opt_hdl && setting_opt_hdl->get_setting) {
|
|
return setting_opt_hdl->get_setting(data);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int set_setting_extra_handle(SMARTBOX_SETTING_OPT *setting_opt_hdl, void *setting_data, void *param)
|
|
{
|
|
if (setting_opt_hdl && setting_opt_hdl->set_setting_extra_handle) {
|
|
return setting_opt_hdl->set_setting_extra_handle(setting_data, param);
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
int get_setting_extra_handle(SMARTBOX_SETTING_OPT *setting_opt_hdl, void *setting_data, void *param)
|
|
{
|
|
if (setting_opt_hdl && setting_opt_hdl->get_setting_extra_handle) {
|
|
return setting_opt_hdl->get_setting_extra_handle(setting_data, param);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void smartbox_opt_release(void)
|
|
{
|
|
SMARTBOX_SETTING_OPT *opt = g_opt_link_head;
|
|
while (opt) {
|
|
if (opt->custom_setting_release) {
|
|
opt->custom_setting_release();
|
|
}
|
|
opt = opt->next;
|
|
}
|
|
}
|
|
|
|
int smartbox_opt_key_event_update(int event, void *param)
|
|
{
|
|
SMARTBOX_SETTING_OPT *opt = g_opt_link_head;
|
|
while (opt) {
|
|
if (opt->custom_setting_key_event_update) {
|
|
if (opt->custom_setting_key_event_update(event, param)) {
|
|
return true;
|
|
}
|
|
}
|
|
opt = opt->next;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
#if 1//RCSP_SMARTBOX_ADV_EN
|
|
void modify_bt_name_and_reset(u32 msec)
|
|
{
|
|
tws_api_sync_call_by_uuid(TWS_FUNC_ID_ADV_RESET_SYNC, 0, msec);
|
|
}
|
|
#endif
|
|
|
|
#endif
|