320 lines
9.0 KiB
C
320 lines
9.0 KiB
C
#include "smartbox/config.h"
|
|
#include "le_smartbox_module.h"
|
|
#include "smartbox_adv_bluetooth.h"
|
|
#include "smartbox_setting_opt.h"
|
|
#include "smartbox_setting_sync.h"
|
|
#include "custom_cfg.h"
|
|
#include "btstack/avctp_user.h"
|
|
#include "smartbox_rcsp_manage.h"
|
|
#include "smartbox_music_info_setting.h"
|
|
|
|
//#if (SMART_BOX_EN && RCSP_SMARTBOX_ADV_EN)
|
|
#if (SMART_BOX_EN)
|
|
|
|
#define RCSP_DEBUG_EN
|
|
#ifdef RCSP_DEBUG_EN
|
|
#define rcsp_putchar(x) putchar(x)
|
|
#define rcsp_printf printf
|
|
#define rcsp_printf_buf(x,len) put_buf(x,len)
|
|
#else
|
|
#define rcsp_putchar(...)
|
|
#define rcsp_printf(...)
|
|
#define rcsp_printf_buf(...)
|
|
#endif
|
|
|
|
#define JL_OPCODE_SET_DEVICE_REBOOT 0xE7
|
|
|
|
extern int get_bt_tws_connect_status();
|
|
|
|
static u8 adv_setting_result = 0;
|
|
static u8 adv_set_deal_one_attr(u8 *buf, u8 size, u8 offset)
|
|
{
|
|
u8 rlen = buf[offset];
|
|
if ((offset + rlen + 1) > (size - offset)) {
|
|
rcsp_printf("\n\ndeal attr end!\n\n");
|
|
return rlen;
|
|
}
|
|
u8 type = buf[offset + 1];
|
|
u8 *pbuf = &buf[offset + 2];
|
|
u8 dlen = rlen - 1;
|
|
adv_setting_result = 0;
|
|
|
|
SMARTBOX_SETTING_OPT *setting_opt_hdl = get_smartbox_setting_opt_hdl(type);
|
|
if (setting_opt_hdl) {
|
|
adv_setting_result = set_setting_extra_handle(setting_opt_hdl, pbuf, &dlen);
|
|
}
|
|
if (!adv_setting_result) {
|
|
set_smartbox_opt_setting(setting_opt_hdl, NULL);
|
|
}
|
|
|
|
return rlen + 1;
|
|
}
|
|
|
|
static u32 JL_opcode_set_adv_info(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
|
|
{
|
|
rcsp_printf("JL_opcode_set_adv_info:\n");
|
|
rcsp_printf_buf(data, len);
|
|
u8 offset = 0;
|
|
while (offset < len) {
|
|
offset += adv_set_deal_one_attr(data, len, offset);
|
|
}
|
|
u8 ret = 0;
|
|
if (adv_setting_result) {
|
|
ret = adv_setting_result;
|
|
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, &ret, 1);
|
|
} else {
|
|
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, &ret, 1);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static u8 smartbox_adv_get_and_fill_adv_info(u8 *buf, u16 max_len, u8 offset, u8 type)
|
|
{
|
|
u8 *adv_data = NULL;
|
|
SMARTBOX_SETTING_OPT *setting_opt_hdl = get_smartbox_setting_opt_hdl(type);
|
|
u8 size = get_setting_extra_handle(setting_opt_hdl, &adv_data, NULL);
|
|
if (size && adv_data) {
|
|
size = add_one_attr(buf, max_len, offset, type, (void *)adv_data, size);
|
|
}
|
|
return size;
|
|
}
|
|
|
|
extern void bt_adv_get_bat(u8 *buf);
|
|
static u32 JL_opcode_get_adv_info(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
|
|
{
|
|
u8 buf[256];
|
|
u8 offset = 0;
|
|
|
|
u32 ret = 0;
|
|
u32 mask = READ_BIG_U32(data);
|
|
rcsp_printf("FEATURE MASK : %x\n", mask);
|
|
/* #define ATTR_TYPE_BAT_VALUE (0) */
|
|
/* #define ATTR_TYPE_EDR_NAME (1) */
|
|
//get version
|
|
if (mask & BIT(ATTR_TYPE_BAT_VALUE)) {
|
|
rcsp_printf("ATTR_TYPE_BAT_VALUE\n");
|
|
u8 bat[3];
|
|
bt_adv_get_bat(bat);
|
|
offset += add_one_attr(buf, sizeof(buf), offset, ATTR_TYPE_BAT_VALUE, bat, 3);
|
|
}
|
|
|
|
if (mask & BIT(ATTR_TYPE_EDR_NAME)) {
|
|
rcsp_printf("ATTR_TYPE_EDR_NAME\n");
|
|
offset += smartbox_adv_get_and_fill_adv_info(buf, sizeof(buf), offset, ATTR_TYPE_EDR_NAME);
|
|
}
|
|
|
|
if (mask & BIT(ATTR_TYPE_KEY_SETTING)) {
|
|
rcsp_printf("ATTR_TYPE_KEY_SETTING\n");
|
|
offset += smartbox_adv_get_and_fill_adv_info(buf, sizeof(buf), offset, ATTR_TYPE_KEY_SETTING);
|
|
}
|
|
|
|
if (mask & BIT(ATTR_TYPE_LED_SETTING)) {
|
|
rcsp_printf("ATTR_TYPE_LED_SETTING\n");
|
|
offset += smartbox_adv_get_and_fill_adv_info(buf, sizeof(buf), offset, ATTR_TYPE_LED_SETTING);
|
|
}
|
|
|
|
|
|
if (mask & BIT(ATTR_TYPE_MIC_SETTING)) {
|
|
rcsp_printf("ATTR_TYPE_MIC_SETTING\n");
|
|
offset += smartbox_adv_get_and_fill_adv_info(buf, sizeof(buf), offset, ATTR_TYPE_MIC_SETTING);
|
|
}
|
|
|
|
if (mask & BIT(ATTR_TYPE_WORK_MODE)) {
|
|
rcsp_printf("ATTR_TYPE_WORK_MODE\n");
|
|
offset += smartbox_adv_get_and_fill_adv_info(buf, sizeof(buf), offset, ATTR_TYPE_WORK_MODE);
|
|
}
|
|
|
|
#if RCSP_ADV_PRODUCT_MSG_ENABLE
|
|
if (mask & BIT(ATTR_TYPE_PRODUCT_MESSAGE)) {
|
|
rcsp_printf("ATTR_TYPE_PRODUCT_MESSAGE\n");
|
|
u16 vid = get_vid_pid_ver_from_cfg_file(GET_VID_FROM_EX_CFG);
|
|
u16 pid = get_vid_pid_ver_from_cfg_file(GET_PID_FROM_EX_CFG);
|
|
u8 tversion[6];
|
|
tversion[0] = 0x05;
|
|
tversion[1] = 0xD6;
|
|
tversion[3] = vid & 0xFF;
|
|
tversion[2] = vid >> 8;
|
|
tversion[5] = pid & 0xFF;
|
|
tversion[4] = pid >> 8;
|
|
offset += add_one_attr(buf, sizeof(buf), offset, ATTR_TYPE_PRODUCT_MESSAGE, (void *)tversion, 6);
|
|
|
|
}
|
|
#endif
|
|
rcsp_printf_buf(buf, offset);
|
|
|
|
ret = JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, buf, offset);
|
|
|
|
return ret;
|
|
}
|
|
|
|
u8 adv_info_notify(u8 *buf, u16 len)
|
|
{
|
|
return JL_CMD_send(JL_OPCODE_ADV_DEVICE_NOTIFY, buf, len, JL_NOT_NEED_RESPOND);
|
|
}
|
|
|
|
u8 adv_info_device_request(u8 *buf, u16 len)
|
|
{
|
|
printf("JL_OPCODE_ADV_DEVICE_REQUEST\n");
|
|
return JL_CMD_send(JL_OPCODE_ADV_DEVICE_REQUEST, buf, len, JL_NEED_RESPOND);
|
|
}
|
|
|
|
int JL_smartbox_adv_cmd_resp(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
|
|
{
|
|
rcsp_printf("JL_rcsp_adv_cmd_resp\n");
|
|
switch (OpCode) {
|
|
case JL_OPCODE_SET_ADV:
|
|
rcsp_printf(" JL_OPCODE_SET_ADV\n");
|
|
JL_opcode_set_adv_info(priv, OpCode, OpCode_SN, data, len);
|
|
break;
|
|
case JL_OPCODE_GET_ADV:
|
|
rcsp_printf(" JL_OPCODE_GET_ADV\n");
|
|
JL_opcode_get_adv_info(priv, OpCode, OpCode_SN, data, len);
|
|
break;
|
|
case JL_OPCODE_ADV_NOTIFY_SETTING:
|
|
rcsp_printf(" JL_OPCODE_ADV_NOTIFY_SETTING\n");
|
|
bt_ble_adv_ioctl(BT_ADV_SET_NOTIFY_EN, *((u8 *)data), 1);
|
|
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, NULL, 0);
|
|
break;
|
|
case JL_OPCODE_ADV_DEVICE_REQUEST:
|
|
rcsp_printf("JL_OPCODE_ADV_DEVICE_REQUEST\n");
|
|
break;
|
|
case JL_OPCODE_SET_DEVICE_REBOOT:
|
|
rcsp_printf("JL_OPCODE_SET_DEVICE_REBOOT\n");
|
|
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, NULL, 0);
|
|
JL_rcsp_event_to_user(DEVICE_EVENT_FROM_RCSP, MSG_JL_REBOOT_DEV, NULL, 0);
|
|
break;
|
|
default:
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static void smartbox_wait_reboot_dev(void *priv)
|
|
{
|
|
if (NULL == priv && !rcsp_send_list_is_empty()) {
|
|
return;
|
|
}
|
|
user_send_cmd_prepare(USER_CTRL_POWER_OFF, 0, NULL);
|
|
extern void ble_module_enable(u8 en);
|
|
ble_module_enable(0);
|
|
cpu_reset();
|
|
}
|
|
|
|
static void smartbox_rcsp_reboot_dev(void)
|
|
{
|
|
extern void adv_edr_name_change_now(void);
|
|
adv_edr_name_change_now();
|
|
#if TCFG_USER_TWS_ENABLE
|
|
if (get_bt_tws_connect_status()) {
|
|
modify_bt_name_and_reset(500);
|
|
} else {
|
|
if (sys_timer_add(NULL, smartbox_wait_reboot_dev, 500) == 0) {
|
|
smartbox_wait_reboot_dev((void *)1);
|
|
}
|
|
}
|
|
#else
|
|
if (sys_timer_add(NULL, smartbox_wait_reboot_dev, 500) == 0) {
|
|
smartbox_wait_reboot_dev((void *)1);
|
|
}
|
|
#endif
|
|
|
|
}
|
|
|
|
int JL_smartbox_adv_event_handler(struct rcsp_event *rcsp)
|
|
{
|
|
switch (rcsp->event) {
|
|
case MSG_JL_REBOOT_DEV:
|
|
smartbox_rcsp_reboot_dev();
|
|
break;
|
|
case MSG_JL_UPDATE_SEQ:
|
|
/* printf("MSG_JL_UPDATE_SEQ\n"); */
|
|
/* extern void adv_seq_vaule_sync(void); */
|
|
/* adv_seq_vaule_sync(); */
|
|
break;
|
|
case MSG_JL_UPDAET_ADV_STATE_INFO:
|
|
/* if (get_rcsp_connect_status()) { */
|
|
/* JL_rcsp_set_auth_flag(rcsp->args[0]); */
|
|
/* bt_ble_adv_ioctl(BT_ADV_SET_NOTIFY_EN, rcsp->args[1], 1); */
|
|
/* } */
|
|
break;
|
|
default:
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// 下面是弹窗的其他设置
|
|
int app_core_data_for_send(u8 *packet, u16 size)
|
|
{
|
|
//printf("for app send size %d\n", size);
|
|
|
|
if (JL_rcsp_get_auth_flag()) {
|
|
*packet = 1;
|
|
} else {
|
|
*packet = 0;
|
|
}
|
|
|
|
if (RCSP_SPP == bt_3th_get_cur_bt_channel_sel()) {
|
|
if (get_ble_adv_notify()) {
|
|
*(packet + 1) = 1;
|
|
} else {
|
|
*(packet + 1) = 0;
|
|
}
|
|
|
|
#if RCSP_ADV_MUSIC_INFO_ENABLE
|
|
if (get_player_time_en()) {
|
|
*(packet + 2) = 1;
|
|
} else {
|
|
*(packet + 2) = 0;
|
|
}
|
|
#else
|
|
*(packet + 2) = 0;
|
|
#endif
|
|
|
|
*(packet + 3) = get_connect_flag();
|
|
}
|
|
|
|
return 4;
|
|
}
|
|
|
|
void app_core_data_for_set(u8 *packet, u16 size)
|
|
{
|
|
u8 rcsp_auth_flag = *packet;
|
|
u8 ble_adv_notify = *(packet + 1);
|
|
u8 player_time_en = *(packet + 2);
|
|
u8 connect_flag = *(packet + 3);
|
|
|
|
if (RCSP_SPP == bt_3th_get_cur_bt_channel_sel()) {
|
|
JL_rcsp_set_auth_flag(rcsp_auth_flag);
|
|
set_ble_adv_notify(ble_adv_notify);
|
|
#if RCSP_ADV_MUSIC_INFO_ENABLE
|
|
set_player_time_en(player_time_en);
|
|
#endif
|
|
set_connect_flag(connect_flag);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
u8 smart_auth_res_deal(void)
|
|
{
|
|
printf("smart_auth_res_deal\n");
|
|
if ((tws_api_get_tws_state() & TWS_STA_SIBLING_CONNECTED)) {
|
|
if (RCSP_SPP == bt_3th_get_cur_bt_channel_sel()) {
|
|
tws_api_sync_call_by_uuid(TWS_FUNC_APP_OPT_UUID, APP_OPT_SYNC_CMD_RCSP_AUTH_RES, 300);
|
|
return 0;
|
|
} else {
|
|
return 1;
|
|
}
|
|
} else {
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
void rcsp_tws_auth_sync_deal(void)
|
|
{
|
|
smart_auth_res_pass();
|
|
}
|
|
#endif
|