Files
2025-12-03 11:12:34 +08:00

289 lines
7.3 KiB
C

#ifdef SUPPORT_MS_EXTENSIONS
#pragma bss_seg(".ble_adv.data.bss")
#pragma data_seg(".ble_adv.data")
#pragma const_seg(".ble_adv.text.const")
#pragma code_seg(".ble_adv.text")
#endif
#include "app_config.h"
#if TCFG_BT_BLE_ADV_ENABLE
#include "bt.h"
#include "app_main.h"
#include "bt_ble.h"
#include "bt_common.h"
#include "btstack/avctp_user.h"
#include "system/includes.h"
#include "bt_tws.h"
#define LOG_TAG "[BLE-ADV]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
typedef struct {
u8 miss_flag: 1;
u8 exchange_bat: 2;
u8 poweron_flag: 1;
u8 reserver: 4;
} icon_ctl_t;
static icon_ctl_t ble_icon_contrl;
int adv_earphone_state_set_page_scan_enable()
{
#if (TCFG_USER_TWS_ENABLE == 0)
bt_ble_icon_open(ICON_TYPE_INQUIRY);
#elif (CONFIG_NO_DISPLAY_BUTTON_ICON || !TCFG_CHARGESTORE_ENABLE)
if (tws_api_get_role() == TWS_ROLE_MASTER) {
printf("switch_icon_ctl11...\n");
bt_ble_icon_open(ICON_TYPE_INQUIRY);
}
#endif
return 0;
}
int adv_earphone_state_cancel_page_scan()
{
#if (TCFG_USER_TWS_ENABLE == 1)
#if (CONFIG_NO_DISPLAY_BUTTON_ICON || !TCFG_CHARGESTORE_ENABLE)
if (tws_api_get_role() == TWS_ROLE_MASTER) {
if (ble_icon_contrl.miss_flag) {
ble_icon_contrl.miss_flag = 0;
puts("ble_icon_contrl.miss_flag...\n");
} else {
printf("switch_icon_ctl00...\n");
bt_ble_icon_open(ICON_TYPE_INQUIRY);
}
}
#endif
#endif
return 0;
}
int adv_earphone_state_tws_init(int paired)
{
memset(&ble_icon_contrl, 0, sizeof(icon_ctl_t));
ble_icon_contrl.poweron_flag = 1;
if (paired) {
if (tws_api_get_role() == TWS_ROLE_MASTER) {
bt_ble_set_control_en(1);
} else {
//slave close
bt_ble_set_control_en(0);
}
} else {
}
return 0;
}
int adv_earphone_state_enter_soft_poweroff()
{
#if (!TCFG_CHARGESTORE_ENABLE)
//非智能充电仓时,做停止广播操作
if (bt_ble_icon_get_adv_state() != ADV_ST_NULL &&
bt_ble_icon_get_adv_state() != ADV_ST_END) {
bt_ble_icon_close(1);
os_time_dly(50);//盒盖时间,根据效果调整时间
}
#endif
bt_ble_exit();
return 0;
}
static int adv_bt_status_event_handler(int *msg)
{
u8 connet_type;
struct bt_event *bt = (struct bt_event *)msg;
switch (bt->event) {
case BT_STATUS_SECOND_CONNECTED:
case BT_STATUS_FIRST_CONNECTED:
if (bt_get_auto_connect_state(bt->args)) {
connet_type = ICON_TYPE_RECONNECT;
} else {
connet_type = ICON_TYPE_CONNECTED;
}
if (tws_api_get_role() == TWS_ROLE_MASTER) {
bt_ble_icon_open(connet_type);
} else {
//maybe slave already open
bt_ble_icon_close(0);
}
break;
case BT_STATUS_FIRST_DISCONNECT:
case BT_STATUS_SECOND_DISCONNECT:
break;
case BT_STATUS_SCO_STATUS_CHANGE:
break;
case BT_STATUS_PHONE_INCOME:
case BT_STATUS_PHONE_OUT:
case BT_STATUS_PHONE_ACTIVE:
break;
case BT_STATUS_PHONE_HANGUP:
break;
}
return 0;
}
APP_MSG_HANDLER(adv_btstack_msg_entry) = {
.owner = 0xff,
.from = MSG_FROM_BT_STACK,
.handler = adv_bt_status_event_handler,
};
int ble_adv_hci_event_handler(int *msg)
{
struct bt_event *bt = (struct bt_event *)msg;
switch (bt->event) {
case HCI_EVENT_CONNECTION_COMPLETE:
switch (bt->value) {
case ERROR_CODE_PIN_OR_KEY_MISSING:
#if (CONFIG_NO_DISPLAY_BUTTON_ICON && TCFG_CHARGESTORE_ENABLE)
//已取消配对了
if (bt_ble_icon_get_adv_state() == ADV_ST_RECONN) {
//切换广播
bt_ble_icon_open(ICON_TYPE_INQUIRY);
}
#endif
break;
}
break;
}
return 0;
}
APP_MSG_HANDLER(adv_bthci_msg_entry) = {
.owner = 0xff,
.from = MSG_FROM_BT_HCI,
.handler = ble_adv_hci_event_handler,
};
int ble_adv_bt_tws_event_handler(int *msg)
{
struct tws_event *bt = (struct tws_event *)msg;
int role = bt->args[0];
int phone_link_connection = bt->args[1];
int reason = bt->args[2];
switch (bt->event) {
case TWS_EVENT_CONNECTED:
bt_ble_icon_slave_en(1);
if (tws_api_get_role() == TWS_ROLE_MASTER) {
//master enable
log_info("master do icon_open\n");
bt_ble_set_control_en(1);
if (phone_link_connection) {
bt_ble_icon_open(ICON_TYPE_RECONNECT);
} else {
#if (TCFG_CHARGESTORE_ENABLE && !CONFIG_NO_DISPLAY_BUTTON_ICON)
bt_ble_icon_open(ICON_TYPE_RECONNECT);
#else
if (ble_icon_contrl.poweron_flag) { //上电标记
if (g_bt_hdl.auto_connection_counter > 0) {
//有回连手机动作
/* g_printf("ICON_TYPE_RECONNECT"); */
/* bt_ble_icon_open(ICON_TYPE_RECONNECT); //没按键配对的话,等回连成功的时候才显示电量。如果在这里显示,手机取消配对后耳机开机,会显示出按键的界面*/
} else {
//没有回连,设可连接
/* g_printf("ICON_TYPE_INQUIRY"); */
bt_ble_icon_open(ICON_TYPE_INQUIRY);
}
}
#endif
}
} else {
//slave disable
bt_ble_set_control_en(0);
}
ble_icon_contrl.poweron_flag = 0;
break;
case TWS_EVENT_CONNECTION_TIMEOUT:
/*
* TWS连接超时
*/
bt_ble_icon_slave_en(0);
break;
case TWS_EVENT_PHONE_LINK_DETACH:
/*
* 跟手机的链路LMP层已完全断开, 只有tws在连接状态才会收到此事件
*/
if (reason == 0x0b) {
//CONNECTION ALREADY EXISTS
ble_icon_contrl.miss_flag = 1;
} else {
ble_icon_contrl.miss_flag = 0;
}
break;
case TWS_EVENT_ROLE_SWITCH:
bt_ble_icon_role_switch(role);
break;
}
return 0;
}
APP_MSG_HANDLER(adv_tws_msg_entry) = {
.owner = 0xff,
.from = MSG_FROM_TWS,
.handler = ble_adv_bt_tws_event_handler,
};
static int adv_app_msg_handler(int *msg)
{
u8 comm_addr[6];
switch (msg[0]) {
case APP_MSG_BT_OPEN_PAGE_SCAN:
adv_earphone_state_set_page_scan_enable();
break;
case APP_MSG_BT_CLOSE_PAGE_SCAN:
adv_earphone_state_cancel_page_scan();
break;
case APP_MSG_BT_ENTER_SNIFF:
bt_ble_icon_state_sniff(1);
break;
case APP_MSG_BT_EXIT_SNIFF:
bt_ble_icon_state_sniff(0);
break;
case APP_MSG_TWS_PAIRED:
adv_earphone_state_tws_init(1);
break;
case APP_MSG_TWS_UNPAIRED:
adv_earphone_state_tws_init(0);
break;
case APP_MSG_TWS_PAIR_SUSS:
syscfg_read(CFG_TWS_COMMON_ADDR, comm_addr, 6);
bt_ble_icon_set_comm_address(comm_addr);
break;
case APP_MSG_POWER_OFF:
adv_earphone_state_enter_soft_poweroff();
break;
}
return 0;
}
APP_MSG_HANDLER(adv_app_msg_entry) = {
.owner = 0xff,
.from = MSG_FROM_APP,
.handler = adv_app_msg_handler,
};
#endif