1049 lines
27 KiB
C
1049 lines
27 KiB
C
#ifdef SUPPORT_MS_EXTENSIONS
|
|
#pragma bss_seg(".bt_ble.data.bss")
|
|
#pragma data_seg(".bt_ble.data")
|
|
#pragma const_seg(".bt_ble.text.const")
|
|
#pragma code_seg(".bt_ble.text")
|
|
#endif
|
|
#include "system/includes.h"
|
|
|
|
#include "app_config.h"
|
|
#include "app_action.h"
|
|
|
|
#include "btstack/btstack_task.h"
|
|
#include "user_cfg.h"
|
|
#include "vm.h"
|
|
#include "app_power_manage.h"
|
|
#include "btcontroller_modules.h"
|
|
#include "app_chargestore.h"
|
|
#include "btstack/avctp_user.h"
|
|
#include "bt_common.h"
|
|
#include "le_common.h"
|
|
#include "bt_ble.h"
|
|
#include "pbg_user.h"
|
|
#include "bt_tws.h"
|
|
#include "btstack/le/le_common_define.h"
|
|
#include "asm/charge.h"
|
|
|
|
#if TCFG_BT_BLE_ADV_ENABLE
|
|
|
|
#define LOG_TAG_CONST BT_BLE
|
|
#define LOG_TAG "[BT_BLE]"
|
|
#define LOG_ERROR_ENABLE
|
|
#define LOG_DEBUG_ENABLE
|
|
#define LOG_INFO_ENABLE
|
|
/* #define LOG_DUMP_ENABLE */
|
|
#define LOG_CLI_ENABLE
|
|
#include "debug.h"
|
|
|
|
|
|
#if 1
|
|
#undef log_info
|
|
#undef log_debug_hexdump
|
|
|
|
#define log_info(x, ...) y_printf("[BT-BLE]" x " ", ## __VA_ARGS__)
|
|
#define log_debug_hexdump put_buf
|
|
#endif
|
|
|
|
|
|
//unit: (1ms)
|
|
#define BLE_TIMER_SET (150) /*未连接 或者 连接后未入sniff的定时器检测时间*/
|
|
#define BLE_SNIFF_TIMER_SET (500*2) /*连接后入sniff的定时器检测时间*/
|
|
|
|
//unit: (0.625us)
|
|
#define ADV_FAST_INTERVAL (48) /*未连接广播周期*/
|
|
#define ADV_CONN_FAST_INTERVAL (64) /*连接后快速广播周期*/
|
|
#define ADV_CONN_NORMAL_INTERVAL (64 * 2) /*未连接广播周期*/
|
|
#define ADV_SNIFF_INTERVAL (800*1) /*edr连接进入sniff后的广播周期*/
|
|
#define ADV_SLOW_INTERVAL (800*1) /*连接后慢速广播周期*/
|
|
|
|
//连上后广播持续密集的时间,默认15秒: ADV_CONN_NORMAL_INTERVAL-->ADV_SLOW_INTERVAL
|
|
#define ADV_TIME_TO_SLOW_MS (15000/BLE_TIMER_SET + 1)
|
|
|
|
//停留时间 50秒,可以自定义修改
|
|
#define ADV_ST_CONN_HOLD_TIME (50000/BLE_TIMER_SET)//phone connect device,配对连上停留时间
|
|
#define ADV_ST_RECONN_HOLD_TIME (50000/BLE_TIMER_SET)//device connect phone,回连连上停留时间
|
|
|
|
//以下时间不建议修改
|
|
#define ADV_ST_DISMISS_HOLD_TIME (2000/BLE_TIMER_SET +1)
|
|
#define ADV_ST_PRE1_HOLD_TIME (200/BLE_TIMER_SET +1)
|
|
#define ADV_ST_FAST_DISMISS_HOLD_TIME (1500/BLE_TIMER_SET +1)//to fast display reconnect
|
|
|
|
//0---tws应用,2设备配对后才开广播
|
|
//1---单设备应用,开广播
|
|
#define PHONE_ICON_ONE_BETA 0 //beta case,one ear case
|
|
|
|
//0---default,inquiry,connect,reconnect,支持搜索、配对连接、回连的显示
|
|
//1---only inquiry and first connect ,只支持搜索、配对连接的显示
|
|
#define PHONE_ICON_CTRL_MODE 0 //
|
|
|
|
//1--连上后,广播一段时间,超时关闭广播
|
|
//0--连上后,一直持续广播,显示电量
|
|
#define PHONE_ICON_AUTO_DISMISS 1 //auto dismiss icon
|
|
|
|
#if TCFG_CHARGESTORE_ENABLE
|
|
#define REFLASH_ICON_STATE 1 //auto reflash,定时自动更新电量和耳机状态
|
|
#else
|
|
#define REFLASH_ICON_STATE 0 //not auto reflash,fixed,固定电量,不需要定时更新耳机状态
|
|
#endif
|
|
|
|
static u32 ble_timer_handle;//定时器id
|
|
static u16 adv_st_count;//定时器的计数器
|
|
static u8 dev_battery_level[3];//master,slave,box,存储电量
|
|
static volatile u8 adv_control_enable;//广播控制,默认只有matster开广播
|
|
static volatile u8 adv_st_mode;//当前广播模式
|
|
static volatile u8 adv_st_next_mode;//准备切换的广播模式
|
|
static volatile u8 adv_enable;//广播开关
|
|
static u8 adv_data[ADV_RSP_PACKET_MAX];
|
|
static u8 adv_data_len;
|
|
static u8 rsp_data[ADV_RSP_PACKET_MAX];
|
|
static u8 rsp_data_len;
|
|
static u8 adv_rand;//广播随机数
|
|
static u8 adv_open_lock;//lock open 标记
|
|
static volatile u8 send_sync_pos_flag;/*耳机状态有变化,就需要发送形象同步*/
|
|
|
|
//-------------------------------------------------------------------
|
|
//持续广播控制操作:开机快广播一段时间,后面根据状态调整广播
|
|
|
|
enum { //广播步进状态
|
|
ADV_STEP_FAST = 0, //未连接,快速广播
|
|
ADV_STEP_NORMAL, //连上正常广播
|
|
ADV_STEP_SNIFF, //EDR进入sleep后,广播
|
|
ADV_STEP_SLOW, //慢广播状态
|
|
};
|
|
|
|
//0-normal,1-timeout,2-sniff,3-slow adv
|
|
static u8 adv_state_step = ADV_STEP_FAST; /*广播的频率状态*/
|
|
static u32 adv_check_timer_ms = BLE_TIMER_SET;/*定时器检测的频率*/
|
|
static u32 adv_high_timer_count;//广播快变慢计数器
|
|
|
|
//-------------------user_tag data start----------------------------------------------------------
|
|
static u8 user_tag_data[19] = {
|
|
0xd6, 0x05,
|
|
0x01, 0x00,
|
|
0x01, 0x00,
|
|
0x00, //6
|
|
};
|
|
|
|
#define ADV_LONG_PACKET_SIZE 23//
|
|
|
|
static const u8 user_pre1_tag_data[ADV_LONG_PACKET_SIZE] = {
|
|
0xd6, 0x05,
|
|
0x02, 0x00,
|
|
0x02, 0x00,
|
|
0x00, //6
|
|
};
|
|
|
|
static const u8 user_pre2_tag_data[ADV_LONG_PACKET_SIZE] = {
|
|
0xd6, 0x05,
|
|
0x02, 0x00,
|
|
0x02, 0x00,
|
|
0x00, //6
|
|
};
|
|
|
|
static const u8 user_conn_tag_data[ADV_LONG_PACKET_SIZE] = {
|
|
0xd6, 0x05,
|
|
0x02, 0x00,
|
|
0x02, 0x00,
|
|
0x00, //6
|
|
};
|
|
|
|
static const u8 user_reconn_tag_data[ADV_LONG_PACKET_SIZE] = {
|
|
0xd6, 0x05,
|
|
0x02, 0x00,
|
|
0x02, 0x00,
|
|
0x00, //6
|
|
};
|
|
|
|
//-----------------------data end------------------------------------------------------
|
|
|
|
static void adv_rand_init(void);
|
|
static u8 update_dev_battery_level(void);
|
|
static void bt_ble_timer_init(void);
|
|
static void bt_ble_timer_exit(void);
|
|
|
|
//-------------------------------------------------------
|
|
/*填入adv包数据*/
|
|
const char ble_tag_string[] = "<ble>";
|
|
static int make_set_adv_data(u8 *info, u8 len)
|
|
{
|
|
u8 offset = 0;
|
|
u8 *buf = (void *)adv_data;
|
|
u8 *tag_buf = (void *)info;
|
|
u8 tag_len = len;
|
|
|
|
#if 0
|
|
//BLE广播使用EDR的蓝牙名字,防止连接时蓝牙名字变成693_ble蓝牙名字最多只能31-21=10字节。
|
|
const char *edr_name = bt_get_local_name();
|
|
u8 ext_name_len = strlen(ble_tag_string);
|
|
if ((strlen(edr_name) + ext_name_len) > BT_NAME_LEN_MAX) {
|
|
ext_name_len = 0;
|
|
}
|
|
offset += make_eir_packet_data(&buf[offset], offset, HCI_EIR_DATATYPE_COMPLETE_LOCAL_NAME, (void *)edr_name, strlen(edr_name) + ext_name_len);
|
|
if (ext_name_len) {
|
|
memcpy(&buf[offset - ext_name_len], ble_tag_string, ext_name_len);
|
|
}
|
|
/* offset += make_eir_packet_data(&buf[offset], offset, HCI_EIR_DATATYPE_COMPLETE_LOCAL_NAME, (void *)ble_name_string, strlen(ble_name_string)); */
|
|
#else
|
|
offset += make_eir_packet_data(&buf[offset], offset, HCI_EIR_DATATYPE_MANUFACTURER_SPECIFIC_DATA, (void *)tag_buf, tag_len);
|
|
#endif
|
|
|
|
if (offset > ADV_RSP_PACKET_MAX) {
|
|
log_info("adv_data overflow!!!\n");
|
|
return -1;
|
|
}
|
|
log_info("ADV data(%d):", offset);
|
|
log_debug_hexdump(buf, offset);
|
|
adv_data_len = offset;
|
|
return 0;
|
|
}
|
|
|
|
/*填入rsp包数据,只广播默认不需要*/
|
|
static int make_set_rsp_data(void)
|
|
{
|
|
u8 offset = 0;
|
|
u8 *buf = (void *)rsp_data;
|
|
|
|
if (offset > ADV_RSP_PACKET_MAX) {
|
|
log_info("rsp_data overflow!!!\n");
|
|
return -1;
|
|
}
|
|
|
|
log_info("RSP data(%d):", offset);
|
|
log_debug_hexdump(buf, offset);
|
|
rsp_data_len = offset;
|
|
return 0;
|
|
}
|
|
|
|
#define TCFG_BT_BLE_ADV_TYPE 3
|
|
#define TCFG_BT_BLE_ADV_CHANNEL 0x07
|
|
static void adv_setup_init(void)
|
|
{
|
|
u8 adv_type = TCFG_BT_BLE_ADV_TYPE;
|
|
u8 adv_channel = TCFG_BT_BLE_ADV_CHANNEL;
|
|
u16 adv_interval;
|
|
|
|
switch (adv_st_mode) {
|
|
case ADV_ST_INQUIRY:
|
|
case ADV_ST_DISMISS:
|
|
case ADV_ST_FAST_DISMISS:
|
|
//特殊状态,广播周期快
|
|
adv_interval = ADV_FAST_INTERVAL;
|
|
break;
|
|
|
|
//已连接及其他状态
|
|
case ADV_ST_CONN:
|
|
case ADV_ST_RECONN:
|
|
default:
|
|
if (adv_state_step == ADV_STEP_NORMAL) {
|
|
adv_interval = ADV_CONN_NORMAL_INTERVAL;
|
|
adv_high_timer_count = ADV_TIME_TO_SLOW_MS;
|
|
} else if (adv_state_step == ADV_STEP_SNIFF) {
|
|
adv_interval = ADV_SNIFF_INTERVAL;
|
|
} else if (adv_state_step == ADV_STEP_SLOW) {
|
|
adv_interval = ADV_SLOW_INTERVAL;
|
|
} else {
|
|
adv_interval = ADV_CONN_FAST_INTERVAL;
|
|
}
|
|
break;
|
|
}
|
|
|
|
log_info("adv_interval= %d\n", adv_interval);
|
|
|
|
ble_user_cmd_prepare(BLE_CMD_ADV_PARAM, 3, adv_interval, adv_type, adv_channel);
|
|
ble_user_cmd_prepare(BLE_CMD_ADV_DATA, 2, adv_data_len, adv_data);
|
|
ble_user_cmd_prepare(BLE_CMD_RSP_DATA, 2, rsp_data_len, rsp_data);
|
|
}
|
|
__attribute__((weak))
|
|
u8 bt_ble_get_adv_enable(void)
|
|
{
|
|
return adv_enable;
|
|
}
|
|
|
|
__attribute__((weak))
|
|
void bt_ble_adv_enable(u8 enable)
|
|
{
|
|
if (adv_enable == enable) {
|
|
return;
|
|
}
|
|
adv_enable = enable;
|
|
|
|
log_info("***ble_adv_en: %d\n", enable);
|
|
if (enable) {
|
|
bt_ble_timer_init();
|
|
adv_setup_init();
|
|
} else {
|
|
bt_ble_timer_exit();
|
|
adv_high_timer_count = 0;
|
|
}
|
|
ble_user_cmd_prepare(BLE_CMD_ADV_ENABLE, 1, enable);
|
|
}
|
|
|
|
//-----------------------
|
|
static u8 get_device_bat_percent(void)
|
|
{
|
|
#if CONFIG_DISPLAY_DETAIL_BAT
|
|
u8 val = get_vbat_percent();
|
|
#else
|
|
u8 val = get_self_battery_level() * 10 + 10;
|
|
#endif
|
|
|
|
if (val > 100) {
|
|
val = 100;
|
|
}
|
|
val = (val | (get_charge_online_flag() << 7));
|
|
/* printf("[%d]",val); */
|
|
return val;
|
|
}
|
|
|
|
static void reflash_adv_tag_data(const u8 *tag_data, u8 len, u8 spec_val)
|
|
{
|
|
u8 tmp_tag_data[32];
|
|
u8 tmp8;
|
|
|
|
memcpy(tmp_tag_data, tag_data, len);
|
|
memcpy(&tmp_tag_data[14], dev_battery_level, 3);
|
|
|
|
u8 cur_ear_pos;
|
|
#if TCFG_CHARGESTORE_ENABLE
|
|
log_info("get pos form chargesstore\n");
|
|
cur_ear_pos = chargestore_get_earphone_pos();
|
|
#else
|
|
cur_ear_pos = bt_tws_get_local_channel();
|
|
#endif
|
|
|
|
//位置14,15,16 对应 L,R,BOX
|
|
if (cur_ear_pos != 'R') {
|
|
//switch position
|
|
log_info("is R pos\n");
|
|
tmp8 = tmp_tag_data[14];
|
|
tmp_tag_data[14] = tmp_tag_data[15];
|
|
tmp_tag_data[15] = tmp8;
|
|
} else {
|
|
log_info("is L pos\n");
|
|
}
|
|
|
|
if (spec_val != 0xff) {
|
|
tmp_tag_data[17] = spec_val;
|
|
if (spec_val != 9) {
|
|
} else {
|
|
memset(&tmp_tag_data[14], 0xFF, 3);//关闭广播的时候不显示电量
|
|
}
|
|
}
|
|
|
|
//---
|
|
#if (!REFLASH_ICON_STATE) //
|
|
if (len == ADV_LONG_PACKET_SIZE) {
|
|
//fixed do,start,固定分开显示电量,如不分开,可以屏蔽这段代码
|
|
log_info("fixed two do\n");
|
|
/* log_debug_hexdump(&tmp_tag_data[14],3); */
|
|
if ((tmp_tag_data[14] != 0xff)
|
|
&& (tmp_tag_data[15] != 0xff)) {
|
|
if ((tmp_tag_data[14]&BIT(7))
|
|
&& (tmp_tag_data[15]&BIT(7))) {
|
|
tmp_tag_data[15] &= 0x7f;
|
|
log_info("fixed c1\n");
|
|
} else {
|
|
if (((tmp_tag_data[14]&BIT(7)) == 0)
|
|
&& ((tmp_tag_data[15]&BIT(7)) == 0)) {
|
|
tmp_tag_data[14] |= BIT(7);
|
|
log_info("fixed c2\n");
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
//fixed do,end
|
|
}
|
|
#endif
|
|
//---
|
|
|
|
bt_ble_adv_enable(0);
|
|
|
|
if (send_sync_pos_flag) {
|
|
u8 pos_state[2];
|
|
//L---offset 14
|
|
if (tmp_tag_data[14] == 0xff) {
|
|
pos_state[0] = PBG_POS_NOT_EXIST;
|
|
} else if (tmp_tag_data[14] & BIT(7)) {
|
|
pos_state[0] = PBG_POS_IN_BOX;
|
|
} else {
|
|
pos_state[0] = PBG_POS_OUT_BOX;
|
|
}
|
|
|
|
//R---offset 15
|
|
if (tmp_tag_data[15] == 0xff) {
|
|
pos_state[1] = PBG_POS_NOT_EXIST;
|
|
} else if (tmp_tag_data[15] & BIT(7)) {
|
|
pos_state[1] = PBG_POS_IN_BOX;
|
|
} else {
|
|
pos_state[1] = PBG_POS_OUT_BOX;
|
|
}
|
|
send_sync_pos_flag = 0;
|
|
pbg_user_battery_level_sync(&tmp_tag_data[14]);
|
|
pbg_user_ear_pos_sync(pos_state[0], pos_state[1]);
|
|
}
|
|
|
|
//fix adv_data state
|
|
#if 0//(CONFIG_NO_DISPLAY_BUTTON_ICON == 0)
|
|
//if(ADV_ST_CONN == adv_st_mode) //
|
|
if (0) {
|
|
;
|
|
} else {
|
|
//pbg_adv_data_change_parse(tmp_tag_data, len, adv_rand);
|
|
}
|
|
#endif
|
|
//end
|
|
|
|
make_set_adv_data(tmp_tag_data, len);
|
|
bt_ble_adv_enable(1);
|
|
}
|
|
|
|
static bool check_adv_open_lock(void)
|
|
{
|
|
if (bt_get_total_connect_dev()) {
|
|
//已连上手机
|
|
adv_open_lock = 1;
|
|
}
|
|
return adv_open_lock;
|
|
}
|
|
|
|
static void change_adv_st_mode(u8 mode)
|
|
{
|
|
if (mode == adv_st_mode) {
|
|
return;
|
|
}
|
|
|
|
log_info("ble_adv_st:old= %d,new= %d \n", adv_st_mode, mode);
|
|
|
|
adv_st_mode = mode;
|
|
adv_st_count = 0;
|
|
|
|
switch (mode) {
|
|
case ADV_ST_CONN:
|
|
check_adv_open_lock();
|
|
reflash_adv_tag_data(user_conn_tag_data, sizeof(user_conn_tag_data), 0xff);
|
|
break;
|
|
|
|
case ADV_ST_RECONN:
|
|
check_adv_open_lock();
|
|
reflash_adv_tag_data(user_reconn_tag_data, sizeof(user_reconn_tag_data), 0xff);
|
|
break;
|
|
|
|
case ADV_ST_DISMISS:
|
|
reflash_adv_tag_data(user_tag_data, sizeof(user_tag_data), 0x9);
|
|
break;
|
|
|
|
case ADV_ST_INQUIRY:
|
|
reflash_adv_tag_data(user_tag_data, sizeof(user_tag_data), adv_rand);
|
|
break;
|
|
|
|
/* case ADV_ST_PRE1: */
|
|
/* reflash_adv_tag_data(user_pre1_tag_data, sizeof(user_pre1_tag_data), 0xff); */
|
|
/* break; */
|
|
|
|
/* case ADV_ST_PRE2: */
|
|
/* reflash_adv_tag_data(user_pre2_tag_data, sizeof(user_pre2_tag_data), 0xff); */
|
|
/* break; */
|
|
|
|
case ADV_ST_FAST_DISMISS:
|
|
reflash_adv_tag_data(user_tag_data, sizeof(user_tag_data), 0x9);
|
|
break;
|
|
|
|
case ADV_ST_END:
|
|
bt_ble_adv_enable(0);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
static void check_dev_pos_changed(u8 cur_adv_mode)
|
|
{
|
|
#if REFLASH_ICON_STATE
|
|
if (update_dev_battery_level()) {
|
|
log_info("---reflash_dev_state\n");
|
|
/* adv_st_next_mode = cur_adv_mode; */
|
|
/* change_adv_st_mode(ADV_ST_FAST_DISMISS); */
|
|
if (adv_state_step == ADV_STEP_SLOW) {
|
|
adv_state_step = ADV_STEP_NORMAL;//slow to high
|
|
}
|
|
send_sync_pos_flag = 1;
|
|
change_adv_st_mode(ADV_ST_END);
|
|
change_adv_st_mode(cur_adv_mode);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
static void dev_adv_reset_do(u8 cur_adv_mode)
|
|
{
|
|
if (bt_ble_get_adv_enable()) {
|
|
log_info("dev_adv_reset_do:%d\n", cur_adv_mode);
|
|
change_adv_st_mode(ADV_ST_END);
|
|
change_adv_st_mode(cur_adv_mode);
|
|
}
|
|
}
|
|
|
|
|
|
static void bt_ble_timer_handler(void *priv)
|
|
{
|
|
putchar('~');
|
|
|
|
if (!adv_enable) {
|
|
return;
|
|
}
|
|
|
|
adv_st_count++;
|
|
switch (adv_st_mode) {
|
|
/* case ADV_ST_PRE1: */
|
|
/* if (adv_st_count > ADV_ST_PRE1_HOLD_TIME) { */
|
|
/* change_adv_st_mode(ADV_ST_PRE2); */
|
|
/* } */
|
|
/* break; */
|
|
|
|
case ADV_ST_CONN:
|
|
if (adv_st_count > ADV_ST_CONN_HOLD_TIME) {
|
|
if (!pbg_user_is_connected()) {
|
|
change_adv_st_mode(ADV_ST_DISMISS);
|
|
break;
|
|
}
|
|
#if PHONE_ICON_AUTO_DISMISS
|
|
change_adv_st_mode(ADV_ST_DISMISS);
|
|
#else
|
|
if (adv_state_step == ADV_STEP_FAST) {
|
|
adv_state_step = ADV_STEP_NORMAL;
|
|
dev_adv_reset_do(adv_st_mode);
|
|
} else {
|
|
//keep adv
|
|
}
|
|
//change_adv_st_mode(ADV_ST_END);
|
|
#endif
|
|
} else {
|
|
check_dev_pos_changed(adv_st_mode);
|
|
}
|
|
break;
|
|
|
|
case ADV_ST_RECONN:
|
|
if (adv_st_count > ADV_ST_RECONN_HOLD_TIME) {
|
|
if (!pbg_user_is_connected()) {
|
|
change_adv_st_mode(ADV_ST_DISMISS);
|
|
break;
|
|
}
|
|
#if PHONE_ICON_AUTO_DISMISS
|
|
change_adv_st_mode(ADV_ST_DISMISS);
|
|
#else
|
|
if (adv_state_step == ADV_STEP_FAST) {
|
|
adv_state_step = ADV_STEP_NORMAL;
|
|
dev_adv_reset_do(adv_st_mode);
|
|
} else {
|
|
//keep adv
|
|
}
|
|
//change_adv_st_mode(ADV_ST_END);
|
|
#endif
|
|
} else {
|
|
check_dev_pos_changed(adv_st_mode);
|
|
}
|
|
break;
|
|
|
|
case ADV_ST_DISMISS:
|
|
if (adv_st_count > ADV_ST_DISMISS_HOLD_TIME) {
|
|
change_adv_st_mode(ADV_ST_END);
|
|
}
|
|
break;
|
|
|
|
case ADV_ST_FAST_DISMISS:
|
|
if (adv_st_count > ADV_ST_FAST_DISMISS_HOLD_TIME) {
|
|
change_adv_st_mode(adv_st_next_mode);
|
|
}
|
|
break;
|
|
|
|
case ADV_ST_INQUIRY:
|
|
check_dev_pos_changed(adv_st_mode);
|
|
break;
|
|
|
|
case ADV_ST_NULL:
|
|
/* case ADV_ST_PRE2: */
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
#if(!PHONE_ICON_AUTO_DISMISS)
|
|
if (adv_high_timer_count && (adv_state_step != ADV_STEP_FAST)) {
|
|
if (adv_high_timer_count == 1) {
|
|
log_info("adv high to slow\n");
|
|
adv_state_step = ADV_STEP_SLOW;
|
|
dev_adv_reset_do(adv_st_mode);
|
|
}
|
|
adv_high_timer_count--;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/*创建定时器*/
|
|
static void bt_ble_timer_init(void)
|
|
{
|
|
if (!ble_timer_handle) {
|
|
ble_timer_handle = sys_timer_add(NULL, bt_ble_timer_handler, adv_check_timer_ms);
|
|
}
|
|
}
|
|
|
|
/*删除定时器*/
|
|
static void bt_ble_timer_exit(void)
|
|
{
|
|
if (ble_timer_handle) {
|
|
sys_timer_del(ble_timer_handle);
|
|
ble_timer_handle = 0;
|
|
}
|
|
}
|
|
|
|
static void bt_ble_init_tag_do(void)
|
|
{
|
|
log_info("bt_ble_init_tag_do\n");
|
|
//初始化三个电量值
|
|
memset(dev_battery_level, 0xff, sizeof(dev_battery_level));
|
|
dev_battery_level[0] = get_device_bat_percent();
|
|
swapX(bt_get_mac_addr(), &user_tag_data[7], 6);
|
|
log_info("---master address:\n");
|
|
log_debug_hexdump(&user_tag_data[7], 6);
|
|
}
|
|
|
|
/*重设ble的mac地址*/
|
|
void bt_ble_icon_set_comm_address(u8 *addr)
|
|
{
|
|
u8 tmp_addr[6];
|
|
|
|
if (TCFG_BT_BLE_BREDR_SAME_ADDR) {
|
|
memcpy(tmp_addr, addr, 6);
|
|
} else {
|
|
bt_make_ble_address(tmp_addr, addr);
|
|
}
|
|
|
|
swapX(tmp_addr, &user_tag_data[7], 6);
|
|
le_controller_set_mac(tmp_addr);//将ble广播地址改成公共地址
|
|
log_info("---reset master address:\n");
|
|
log_debug_hexdump(&user_tag_data[7], 6);
|
|
}
|
|
|
|
/*重设icon*/
|
|
void bt_ble_icon_reset(void)
|
|
{
|
|
log_info("bt_ble_icon_reset\n");
|
|
if (!adv_control_enable) {
|
|
return;
|
|
}
|
|
//重置状态,允许再广播
|
|
log_info("reset_do\n");
|
|
/* adv_rand_init(); */
|
|
adv_st_mode = ADV_ST_NULL;
|
|
adv_open_lock = 0;
|
|
bt_ble_adv_enable(0);
|
|
}
|
|
|
|
u8 bt_ble_icon_get_adv_state(void)
|
|
{
|
|
return adv_st_mode;
|
|
}
|
|
|
|
//return change_flag
|
|
static u8 update_dev_battery_level(void)
|
|
{
|
|
|
|
u8 old_dev_battery[3];
|
|
|
|
memcpy(old_dev_battery, dev_battery_level, 3);
|
|
|
|
//read bat_level
|
|
dev_battery_level[0] = get_device_bat_percent();
|
|
|
|
if (!get_tws_sibling_connect_state()) {
|
|
dev_battery_level[1] = 0xff;
|
|
}
|
|
|
|
u8 sibling_bat_level = dev_battery_level[1];
|
|
if (sibling_bat_level == 0xff) {
|
|
/* log_info("--update_bat_00\n"); */
|
|
goto update_dev2;
|
|
}
|
|
|
|
|
|
sibling_bat_level = get_tws_sibling_bat_persent();
|
|
|
|
#if TCFG_CHARGESTORE_ENABLE
|
|
if (sibling_bat_level == 0xff) {
|
|
/* log_info("--update_bat_01\n"); */
|
|
sibling_bat_level = chargestore_get_sibling_power_level();
|
|
}
|
|
#endif
|
|
|
|
if (sibling_bat_level == 0xff) {
|
|
/* log_info("--update_bat_02\n"); */
|
|
dev_battery_level[1] = dev_battery_level[0];
|
|
} else {
|
|
dev_battery_level[1] = sibling_bat_level;
|
|
}
|
|
|
|
update_dev2:
|
|
if (((dev_battery_level[0] & BIT(7)) && (dev_battery_level[0] != 0xff))
|
|
|| ((dev_battery_level[1] & BIT(7)) && (dev_battery_level[1] != 0xff))) {
|
|
//earphone in charge
|
|
#if TCFG_CHARGESTORE_ENABLE
|
|
dev_battery_level[2] = chargestore_get_power_level();
|
|
#else
|
|
dev_battery_level[2] = 0xff;
|
|
#endif
|
|
} else {
|
|
//all not in charge
|
|
dev_battery_level[2] = 0xff;
|
|
}
|
|
|
|
u8 i;
|
|
u8 change_flag = 0;
|
|
|
|
for (i = 0; i < 3; i++) {
|
|
if ((dev_battery_level[i]&BIT(7)) != (old_dev_battery[i]&BIT(7))) {
|
|
break;
|
|
}
|
|
|
|
if ((dev_battery_level[i] == 0xff) && (old_dev_battery[i] != 0xff)) {
|
|
break;
|
|
}
|
|
|
|
if ((dev_battery_level[i] != 0xff) && (old_dev_battery[i] == 0xff)) {
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
if (i < 3) {
|
|
log_info("dev_pos_state have changed:");
|
|
log_debug_hexdump(old_dev_battery, 3);
|
|
log_debug_hexdump(dev_battery_level, 3);
|
|
change_flag = 1;
|
|
}
|
|
return change_flag;
|
|
}
|
|
|
|
|
|
|
|
//open 不同类型广播
|
|
void bt_ble_icon_open(u8 type)
|
|
{
|
|
log_info("bt_ble_icon_open: %d\n", type);
|
|
|
|
if (!adv_control_enable) {
|
|
return;
|
|
}
|
|
|
|
if (adv_open_lock) {
|
|
log_info("open_lock\n");
|
|
return;
|
|
}
|
|
|
|
log_info("open_do\n");
|
|
|
|
adv_state_step = ADV_STEP_FAST;
|
|
send_sync_pos_flag = 1;
|
|
update_dev_battery_level();
|
|
|
|
switch (adv_st_mode) {
|
|
case ADV_ST_NULL:
|
|
|
|
#if PHONE_ICON_ONE_BETA
|
|
if (type == ICON_TYPE_INQUIRY) {
|
|
change_adv_st_mode(ADV_ST_INQUIRY);
|
|
} else if (type == ICON_TYPE_CONNECTED || type == ICON_TYPE_RECONNECT) {
|
|
//record,and not display
|
|
change_adv_st_mode(ADV_ST_END);
|
|
}
|
|
break;
|
|
#endif
|
|
|
|
#if (PHONE_ICON_CTRL_MODE == 1)
|
|
if (type == ICON_TYPE_INQUIRY) {
|
|
change_adv_st_mode(ADV_ST_INQUIRY);
|
|
} else if (type == ICON_TYPE_CONNECTED || type == ICON_TYPE_RECONNECT) {
|
|
//record,and not display
|
|
change_adv_st_mode(ADV_ST_END);
|
|
}
|
|
break;
|
|
#endif
|
|
|
|
|
|
if (type == ICON_TYPE_CONNECTED || type == ICON_TYPE_RECONNECT) {
|
|
change_adv_st_mode(ADV_ST_RECONN);
|
|
} else if (type == ICON_TYPE_PRE_DEV) {
|
|
/* change_adv_st_mode(ADV_ST_PRE1); */
|
|
} else {
|
|
change_adv_st_mode(ADV_ST_INQUIRY);
|
|
}
|
|
break;
|
|
|
|
case ADV_ST_INQUIRY:
|
|
|
|
#if PHONE_ICON_ONE_BETA
|
|
if (type == ICON_TYPE_CONNECTED || type == ICON_TYPE_RECONNECT) {
|
|
change_adv_st_mode(ADV_ST_DISMISS);
|
|
}
|
|
break;
|
|
#endif
|
|
|
|
#if (PHONE_ICON_CTRL_MODE == 1)
|
|
if (type == ICON_TYPE_CONNECTED || type == ICON_TYPE_RECONNECT) {
|
|
change_adv_st_mode(ADV_ST_DISMISS);
|
|
}
|
|
break;
|
|
#endif
|
|
|
|
|
|
switch (type) {
|
|
case ICON_TYPE_CONNECTED:
|
|
change_adv_st_mode(ADV_ST_CONN);
|
|
break;
|
|
|
|
case ICON_TYPE_RECONNECT:
|
|
change_adv_st_mode(ADV_ST_FAST_DISMISS);
|
|
adv_st_next_mode = ADV_ST_RECONN;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
/* case ADV_ST_PRE1: */
|
|
/* case ADV_ST_PRE2: */
|
|
/* if (type == ICON_TYPE_INQUIRY) { */
|
|
/* change_adv_st_mode(ADV_ST_INQUIRY); */
|
|
/* } else if (type == ICON_TYPE_CONNECTED) { */
|
|
/* change_adv_st_mode(ADV_ST_CONN); */
|
|
/* } else { */
|
|
/* ; */
|
|
/* } */
|
|
/* break; */
|
|
|
|
|
|
case ADV_ST_RECONN:
|
|
if (type == ICON_TYPE_INQUIRY) {
|
|
change_adv_st_mode(ADV_ST_FAST_DISMISS);
|
|
adv_st_next_mode = ADV_ST_INQUIRY;
|
|
} else if (type == ICON_TYPE_CONNECTED) {
|
|
change_adv_st_mode(ADV_ST_FAST_DISMISS);
|
|
adv_st_next_mode = ADV_ST_CONN;
|
|
} else {
|
|
;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
//dismiss_flag
|
|
void bt_ble_icon_close(u8 dismiss_flag)
|
|
{
|
|
log_info("bt_ble_close: %d\n", dismiss_flag);
|
|
|
|
if ((!dismiss_flag) || (!adv_control_enable)) {
|
|
log_info("close_adv\n");
|
|
change_adv_st_mode(ADV_ST_END);
|
|
return;
|
|
}
|
|
|
|
#if TCFG_CHARGESTORE_ENABLE
|
|
log_info("###ear_online:%x, conn_state:%x\n", chargestore_get_earphone_online(), get_tws_sibling_connect_state());
|
|
if (chargestore_get_earphone_online() != 2 && get_tws_sibling_connect_state()) {
|
|
log_info("sibling is running\n");
|
|
//另外一个耳机没有关机,不需要去icon
|
|
change_adv_st_mode(ADV_ST_END);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
switch (adv_st_mode) {
|
|
case ADV_ST_CONN:
|
|
case ADV_ST_RECONN:
|
|
case ADV_ST_INQUIRY:
|
|
/* case ADV_ST_PRE1: */
|
|
/* case ADV_ST_PRE2: */
|
|
case ADV_ST_FAST_DISMISS:
|
|
case ADV_ST_DISMISS:
|
|
case ADV_ST_END://也要做
|
|
if (get_tws_sibling_connect_state() == FALSE) {
|
|
adv_open_lock = 0;
|
|
adv_state_step = ADV_STEP_NORMAL;
|
|
bt_ble_set_control_en(1);
|
|
bt_ble_icon_reset();
|
|
}
|
|
change_adv_st_mode(ADV_ST_DISMISS);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
//tws,need set en
|
|
void bt_ble_icon_slave_en(u8 en)
|
|
{
|
|
log_info("---icon_slave_enable= %d\n", en);
|
|
if (en) {
|
|
dev_battery_level[1] = 0xfc;//set flag
|
|
} else {
|
|
dev_battery_level[1] = 0xff;
|
|
}
|
|
|
|
if (get_tws_sibling_connect_state()) {
|
|
if (tws_api_get_role() == TWS_ROLE_SLAVE) {
|
|
//已配对连接过的从机,记录以后不允许再广播
|
|
adv_open_lock = 1;//lock open 接口
|
|
bt_ble_icon_close(0);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//tws,master need set en;使能ICON_OPEN 接口控制
|
|
void bt_ble_set_control_en(u8 en)
|
|
{
|
|
log_info("---adv_control_enable= %d\n", en);
|
|
adv_control_enable = en;//set master flag
|
|
}
|
|
//-----------------------
|
|
static void adv_rand_init(void)
|
|
{
|
|
int ret = syscfg_read(CFG_BLE_MODE_INFO, (u8 *)&adv_rand, 1);
|
|
if (!ret) {
|
|
adv_rand = (rand32() % 7) + 1;
|
|
} else {
|
|
adv_rand++;
|
|
}
|
|
|
|
if (adv_rand > 7) {
|
|
adv_rand = 1;
|
|
}
|
|
syscfg_write(CFG_BLE_MODE_INFO, (u8 *)&adv_rand, 1);
|
|
log_info("------adv_rand = %d------\n", adv_rand);
|
|
|
|
}
|
|
|
|
//新增两个接口如下,用于获取和同步 adv_rand
|
|
void adv_rand_tws_sync(u8 sibling_rand)
|
|
{
|
|
log_info("---sync_adv_rand = %d,%d---\n", adv_rand, sibling_rand);
|
|
if (sibling_rand != adv_rand) {
|
|
log_info("update sync\n");
|
|
adv_rand = sibling_rand;
|
|
syscfg_write(CFG_BLE_MODE_INFO, (u8 *)&adv_rand, 1);
|
|
}
|
|
}
|
|
|
|
/*获取广播随机数*/
|
|
u8 adv_rand_tws_get(void)
|
|
{
|
|
return adv_rand;
|
|
}
|
|
|
|
__BANK_INIT_ENTRY
|
|
__attribute__((weak))
|
|
void bt_ble_init(void)
|
|
{
|
|
if (BT_MODE_IS(BT_NORMAL)) {
|
|
log_info("***ble_init***\n");
|
|
adv_rand_init();
|
|
|
|
adv_control_enable = 0;//tws,default off
|
|
adv_st_mode = ADV_ST_NULL;
|
|
adv_open_lock = 0;
|
|
bt_ble_init_tag_do();
|
|
}
|
|
}
|
|
|
|
/*
|
|
void bt_ble_icon_set(u8 *info, u8 len)
|
|
{
|
|
log_info("***** ble_icon_set******\n");
|
|
|
|
bt_ble_adv_enable(0);
|
|
update_user_tag_data(info, len);
|
|
bt_ble_adv_enable(1);
|
|
}
|
|
*/
|
|
|
|
__attribute__((weak))
|
|
void bt_ble_exit(void)
|
|
{
|
|
log_info("***ble_exit***\n");
|
|
|
|
bt_ble_adv_enable(0);
|
|
adv_st_mode = ADV_ST_NULL;
|
|
adv_control_enable = 0;
|
|
bt_ble_timer_exit();
|
|
}
|
|
|
|
/*模块开关使能*/
|
|
__attribute__((weak))
|
|
void ble_module_enable(u8 en)
|
|
{
|
|
log_info("mode_en:%d\n", en);
|
|
bt_ble_adv_enable(en);
|
|
}
|
|
|
|
/*edr 是否进入sniff状态,state: 1--sniff,0-- no sniff*/
|
|
void bt_ble_icon_state_sniff(u8 state)
|
|
{
|
|
log_info("icon_state_sniff= %d, adv_state_step= %d\n", state, adv_state_step);
|
|
|
|
#if (!PHONE_ICON_AUTO_DISMISS)
|
|
|
|
if (state) {
|
|
// enter sniff
|
|
adv_state_step = ADV_STEP_SNIFF;
|
|
adv_check_timer_ms = BLE_SNIFF_TIMER_SET;
|
|
} else {
|
|
// exit sniff
|
|
if (adv_state_step != ADV_STEP_FAST) {
|
|
adv_state_step = ADV_STEP_NORMAL;
|
|
adv_check_timer_ms = BLE_TIMER_SET;
|
|
}
|
|
}
|
|
|
|
if (ble_timer_handle) {
|
|
sys_timer_modify(ble_timer_handle, adv_check_timer_ms);
|
|
}
|
|
dev_adv_reset_do(adv_st_mode);
|
|
log_info("adv_state_step:%d ,mdy adv timer:%d ms\n", adv_state_step, adv_check_timer_ms);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
void bt_ble_icon_role_switch(u8 role)
|
|
{
|
|
#if(!PHONE_ICON_AUTO_DISMISS)
|
|
log_info("###bt_ble_icon_role_switch: %d\n", role);
|
|
if (role == TWS_ROLE_MASTER && bt_get_total_connect_dev() && pbg_user_is_connected()) {
|
|
log_info("change to master\n");
|
|
adv_open_lock = 0;
|
|
bt_ble_set_control_en(1);
|
|
adv_state_step = ADV_STEP_NORMAL;
|
|
bt_ble_icon_reset();
|
|
bt_ble_icon_open(ICON_TYPE_RECONNECT);
|
|
} else {
|
|
log_info("change to slave\n");
|
|
change_adv_st_mode(ADV_ST_END);
|
|
bt_ble_set_control_en(0);
|
|
}
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|