AC695N-SoundBox-SDK/apps/soundbox/smartbox/smartbox_setting_opt/smartbox_adv_bluetooth.c
2026-08-09 00:00:00 +00:00

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