Files
99_7018_lmx/apps/earphone/earphone.c
2025-10-30 16:14:14 +08:00

2791 lines
83 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "system/includes.h"
#include "media/includes.h"
#include "tone_player.h"
#include "earphone.h"
#include "app_config.h"
#include "app_action.h"
#include "app_task.h"
#include "btstack/avctp_user.h"
#include "btstack/btstack_task.h"
#include "btctrler/btctrler_task.h"
#include "btstack/frame_queque.h"
#include "user_cfg.h"
#include "aec_user.h"
#include "classic/hci_lmp.h"
#include "bt_common.h"
#include "bt_ble.h"
#include "bt_tws.h"
#include "pbg_user.h"
#include "btstack/bluetooth.h"
#include "colorful_lights/colorful_lights.h"
#if TCFG_AUDIO_ANC_ENABLE
#include "audio_anc.h"
#endif/*TCFG_AUDIO_ANC_ENABLE*/
#if TCFG_ANC_BOX_ENABLE
#include "app_ancbox.h"
#endif
#if TCFG_USER_TWS_ENABLE
#include "bt_tws.h"
#endif
#if TCFG_AUDIO_SPATIAL_EFFECT_ENABLE
#include "spatial_imu_trim.h"
#endif /*TCFG_AUDIO_SPATIAL_EFFECT_ENABLE*/
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
#include "include/bt_ble.h"
#endif
#if TCFG_AUDIO_CVP_DUT_ENABLE
#include "audio_cvp_dut.h"
#endif /*TCFG_AUDIO_CVP_DUT_ENABLE*/
#if TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE
#include "app_chargestore.h"
#endif
#include "jl_kws/jl_kws_api.h"
#include "asm/charge.h"
#include "app_charge.h"
#include "ui_manage.h"
#include "app_chargestore.h"
#include "app_umidigi_chargestore.h"
#include "app_testbox.h"
#include "app_online_cfg.h"
#include "app_main.h"
#include "app_power_manage.h"
#include "gSensor/gSensor_manage.h"
#include "key_event_deal.h"
#include "classic/tws_api.h"
#include "asm/pwm_led.h"
#include "ir_sensor/ir_manage.h"
#include "in_ear_detect/in_ear_manage.h"
#include "vol_sync.h"
#include "bt_background.h"
#include "default_event_handler.h"
#define xlog(format, ...) printf("[%s] " format, __func__, ##__VA_ARGS__)
#ifdef CONFIG_BOARD_AISPEECH_VAD_ASR
extern int ais_platform_asr_open(void);
extern void ais_platform_asr_close(void);
#endif /*CONFIG_BOARD_AISPEECH_VAD_ASR*/
#define LOG_TAG_CONST EARPHONE
#define LOG_TAG "[EARPHONE]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
#define TIMEOUT_CONN_TIME 60 //超时断开之后回连的时间s
#define POWERON_AUTO_CONN_TIME 12 //开机去回连的时间
#define TWS_RETRY_CONN_TIMEOUT ((rand32() & BIT(0)) ? 200 : 400)
#define PHONE_DLY_DISCONN_TIME 0//4000 //超时断开,快速连接上不播提示音
extern void dac_analog_power_control(u8 en);
extern u8 is_dac_power_off();
extern u8 get_esco_coder_busy_flag();
extern void dac_power_off(void);
extern void bredr_fcc_init(u8 mode, u8 fre);
extern void bredr_set_dut_enble(u8 en, u8 phone);
extern int lmp_private_esco_suspend_resume(int flag);
extern void tws_user_sync_call_vol();
extern void ble_enter_single_carrier_mode(u8 ch_index);
extern int music_player_get_play_status(void);
/* extern void set_adjust_conn_dac_check(u8 value); */
void sys_auto_shut_down_disable(void);
extern void bt_pll_para(u32 osc, u32 sys, u8 low_power, u8 xosc);
BT_USER_COMM_VAR bt_user_comm_var;
BT_USER_PRIV_VAR bt_user_priv_var;
int phone_call_begin(void *priv);
int phone_call_end(void *priv);
int earphone_a2dp_audio_codec_open(int media_type);
void earphone_a2dp_audio_codec_close();
u8 bt_audio_is_running(void);
void tws_try_connect_disable(void);
int lmp_private_esco_suspend_resume(int flag);
u8 hci_standard_connect_check(void);
void ble_adv_enable(u8 enable);
int a2dp_dec_open(int media_type);
int a2dp_dut_dec_open(int media_type);
void a2dp_dec_close();
int esco_dec_open(void *, u8);
void esco_dec_close();
void esco_enc_close();
void __set_sbc_cap_bitpool(u8 sbc_cap_bitpoola);
static u16 power_mode_timer = 0;
u8 init_ok = 0;
u8 get_bt_init_status(void)
{
return init_ok;
}
static u8 sniff_out = 0;
u8 get_sniff_out_status()
{
return sniff_out;
}
void clear_sniff_out_status()
{
sniff_out = 0;
}
void earphone_change_pwr_mode(int mode, int msec)
{
#if TCFG_POWER_MODE_QUIET_ENABLE
if (power_mode_timer) {
sys_timeout_del(power_mode_timer);
power_mode_timer = 0;
}
if (msec == 0) {
power_set_mode(mode);
} else {
power_mode_timer = sys_timeout_add((void *)mode, power_set_mode, msec);
}
#endif
}
/*开关可发现可连接的函数接口*/
void bt_wait_phone_connect_control(u8 enable)
{
#if TCFG_USER_TWS_ENABLE
return;
#endif
if (enable && app_var.goto_poweroff_flag) {
return;
}
if (enable) {
log_info("is_1t2_connection:%d \t total_conn_dev:%d\n", is_1t2_connection(), get_total_connect_dev());
if (is_1t2_connection()) {
/*达到最大连接数,可发现(0)可连接(0)*/
user_send_cmd_prepare(USER_CTRL_WRITE_SCAN_DISABLE, 0, NULL);
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_DISABLE, 0, NULL);
} else {
if (get_total_connect_dev() == 1) {
/*支持连接2台只连接一台的情况下可发现(0)可连接(1)*/
user_send_cmd_prepare(USER_CTRL_WRITE_SCAN_DISABLE, 0, NULL);
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL);
} else {
/*可发现(1)可连接(1)*/
EARPHONE_STATE_SET_PAGE_SCAN_ENABLE();
user_send_cmd_prepare(USER_CTRL_WRITE_SCAN_ENABLE, 0, NULL);
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL);
}
}
} else {
user_send_cmd_prepare(USER_CTRL_WRITE_SCAN_DISABLE, 0, NULL);
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_DISABLE, 0, NULL);
}
}
void bt_send_keypress(u8 key)
{
user_send_cmd_prepare(USER_CTRL_KEYPRESS, 1, &key);
}
void bt_send_pair(u8 en)
{
user_send_cmd_prepare(USER_CTRL_PAIR, 1, &en);
}
void bt_init_ok_search_index(void)
{
if (!bt_user_priv_var.auto_connection_counter && get_current_poweron_memory_search_index(bt_user_priv_var.auto_connection_addr)) {
log_info("bt_wait_connect_and_phone_connect_switch\n");
clear_current_poweron_memory_search_index(1);
bt_user_priv_var.auto_connection_counter = POWERON_AUTO_CONN_TIME * 1000; //8000ms
EARPHONE_STATE_GET_CONNECT_MAC_ADDR();
}
}
int bt_wait_connect_and_phone_connect_switch(void *p)
{
int ret = 0;
int timeout = 0;
s32 wait_timeout;
if (bt_user_priv_var.auto_connection_counter <= 0) {
bt_user_priv_var.auto_connection_timer = 0;
bt_user_priv_var.auto_connection_counter = 0;
EARPHONE_STATE_CANCEL_PAGE_SCAN();
log_info("auto_connection_counter = 0\n");
user_send_cmd_prepare(USER_CTRL_PAGE_CANCEL, 0, NULL);
if (get_current_poweron_memory_search_index(NULL)) {
bt_init_ok_search_index();
return bt_wait_connect_and_phone_connect_switch(0);
} else {
bt_wait_phone_connect_control(1);
return 0;
}
}
/* log_info(">>>phone_connect_switch=%d\n",bt_user_priv_var.auto_connection_counter ); */
if ((int)p == 0) {
if (bt_user_priv_var.auto_connection_counter) {
timeout = 5600;
bt_wait_phone_connect_control(0);
user_send_cmd_prepare(USER_CTRL_START_CONNEC_VIA_ADDR, 6, bt_user_priv_var.auto_connection_addr);
ret = 1;
}
} else {
timeout = 400;
user_send_cmd_prepare(USER_CTRL_PAGE_CANCEL, 0, NULL);
bt_wait_phone_connect_control(1);
}
if (bt_user_priv_var.auto_connection_counter) {
bt_user_priv_var.auto_connection_counter -= timeout ;
log_info("do=%d\n", bt_user_priv_var.auto_connection_counter);
}
bt_user_priv_var.auto_connection_timer = sys_timeout_add((void *)(!(int)p),
bt_wait_connect_and_phone_connect_switch, timeout);
return ret;
}
void bt_close_page_scan(void *p)
{
log_info(">>>%s\n", __func__);
bt_wait_phone_connect_control(0);
sys_timer_del(app_var.auto_stop_page_scan_timer);
}
extern bool get_esco_busy_flag();
extern u8 get_cur_battery_level(void);
extern void audio_adc_mic_demo(u8 mic_idx, u8 gain, u8 mic_2_dac);
extern void audio_fast_mode_test();
extern void audio_adc_mic_demo_close();
static int bt_get_battery_value()
{
//取消默认蓝牙定时发送电量给手机需要更新电量给手机使用USER_CTRL_HFP_CMD_UPDATE_BATTARY命令
/*电量协议的是0-9个等级请比例换算*/
return get_cur_battery_level();
}
void bt_fast_test_api(void)
{
log_info("------------bt_fast_test_api---------\n");
//进入快速测试模式,用户根据此标志判断测试,如测试按键-开按键音 、测试mic-开扩音 、根据fast_test_mode根据改变led闪烁方式、关闭可发现可连接
if (bt_user_priv_var.fast_test_mode == 0) {
bt_user_priv_var.fast_test_mode = 1;
audio_fast_mode_test();
pwm_led_mode_set(PWM_LED_ALL_ON);
}
}
static void bt_dut_api(void)
{
log_info("bt in dut \n");
sys_auto_shut_down_disable();
#if TCFG_USER_TWS_ENABLE
extern void tws_cancle_all_noconn();
tws_cancle_all_noconn() ;
#else
sys_timer_del(app_var.auto_stop_page_scan_timer);
extern void bredr_close_all_scan();
bredr_close_all_scan();
#endif
if (bt_user_priv_var.auto_connection_timer) {
sys_timeout_del(bt_user_priv_var.auto_connection_timer);
bt_user_priv_var.auto_connection_timer = 0;
}
#if TCFG_USER_BLE_ENABLE
#if (CONFIG_BT_MODE == BT_NORMAL)
bt_ble_adv_enable(0);
#endif
#endif
}
void bit_clr_ie(unsigned char index);
void bt_fix_fre_api(u8 fre)
{
bt_dut_api();
bit_clr_ie(IRQ_BREDR_IDX);
bit_clr_ie(IRQ_BT_CLKN_IDX);
bredr_fcc_init(BT_FRE, fre);
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙模式进入定频测试接收发射
@param mode 0 测试发射 1测试接收
mac_addr:测试设置的地址
fre定频的频点 0=2402 1=2403
packet_type数据包类型
#define DH1_1 0
#define DH3_1 1
#define DH5_1 2
#define DH1_2 3
#define DH3_2 4
#define DH5_2 5
payload数据包内容 0x0000 0x0055 0x00aa 0x00ff
0xffff:prbs9
@return
@note 量产的时候通过串口,发送设置的参数,设置发送接收的参数
关闭定频接收发射测试
void link_fix_txrx_disable();
更新接收结果
void bt_updata_fix_rx_result()
struct link_fix_rx_result {
u32 rx_err_b; //接收到err bit
u32 rx_sum_b; //接收到正确bit
u32 rx_perr_p; //接收到crc 错误 包数
u32 rx_herr_p; //接收到crc 以外其他错误包数
u32 rx_invail_p; //接收到crc错误bit太多的包数丢弃不统计到err bit中
};
*/
/*----------------------------------------------------------------------------*/
void bt_fix_txrx_api(u8 mode, u8 *mac_addr, u8 fre, u8 packet_type, u16 payload)
{
bt_dut_api();
local_irq_disable();
link_fix_txrx_disable();
if (mode) {
link_fix_rx_enable(mac_addr, fre, packet_type, 0xffff);
} else {
link_fix_tx_enable(mac_addr, fre, packet_type, 0xffff);
}
local_irq_enable();
}
void bt_updata_fix_rx_result()
{
struct link_fix_rx_result fix_rx_result;
link_fix_rx_update_result(&fix_rx_result);
printf("err_b:%d sum_b:%d perr:%d herr_b:%d invaile:%d \n",
fix_rx_result.rx_err_b,
fix_rx_result.rx_sum_b,
fix_rx_result.rx_perr_p,
fix_rx_result.rx_herr_p,
fix_rx_result.rx_invail_p
);
}
#if (defined TCFG_USER_RSSI_TEST_EN && TCFG_USER_RSSI_TEST_EN)
extern s8 get_rssi_api(s8 *phone_rssi, s8 *tws_rssi);
static void spp_send_rssi(int slave_rssi)
{
s8 send_buf[8];
send_buf[0] = 0xfe;
send_buf[1] = 0xdc;
send_buf[2] = 0x04;
send_buf[3] = 0x02;
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_local_channel() == 'L') {
get_rssi_api(&send_buf[4], &send_buf[6]);
send_buf[5] = (s8)slave_rssi;
} else
#endif
{
get_rssi_api(&send_buf[5], &send_buf[6]);
send_buf[4] = (s8)slave_rssi;
}
send_buf[7] = 0xba;
user_send_cmd_prepare(USER_CTRL_SPP_SEND_DATA, sizeof(send_buf), send_buf);
/* put_buf(send_buf, sizeof(send_buf)); */
/* printf("get rssi, l:%d, r:%d, tws:%d", send_buf[4], send_buf[5], send_buf[6]); */
}
static void app_core_send_rssi(int slave_rssi)
{
int msg[3];
msg[0] = spp_send_rssi;
msg[1] = 1;
msg[2] = slave_rssi;
os_taskq_post_type("app_core", Q_CALLBACK, 3, msg);
}
#if TCFG_USER_TWS_ENABLE
#define TWS_FUNC_ID_RSSI_SYNC TWS_FUNC_ID('R', 'S', 'S', 'I')
static void tws_get_rssi_handler(void *_data, u16 len, bool rx)
{
u8 *data = (u8 *)_data;
if (rx) {
app_core_send_rssi(data[0]);
}
}
REGISTER_TWS_FUNC_STUB(tws_get_rssi) = {
.func_id = TWS_FUNC_ID_RSSI_SYNC,
.func = tws_get_rssi_handler,
};
#endif
static int spp_get_rssi_handler(u8 *packet, u16 size)
{
const u8 get_rssi_cmd[] = {0xfe, 0xdc, 0x01, 0x01, 0xba};
u8 send_cmd_buffer[2];
if (size == strlen(get_rssi_cmd) && !memcmp(packet, get_rssi_cmd, size)) {
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_tws_state() & TWS_STA_SIBLING_CONNECTED) {
if (tws_api_get_role() == TWS_ROLE_SLAVE) {
get_rssi_api(&send_cmd_buffer[0], &send_cmd_buffer[1]);
tws_api_send_data_to_sibling(send_cmd_buffer, sizeof(send_cmd_buffer), TWS_FUNC_ID_RSSI_SYNC);
}
} else
#endif
{
app_core_send_rssi(-127);
}
return 1;
}
return 0;
}
#endif
void spp_data_handler(u8 packet_type, u16 ch, u8 *packet, u16 size)
{
switch (packet_type) {
case 1:
log_info("spp connect\n");
break;
case 2:
log_info("spp disconnect\n");
break;
case 7:
//log_info("spp_rx:");
//put_buf(packet,size);
#if AEC_DEBUG_ONLINE
aec_debug_online(packet, size);
#endif
#if (defined TCFG_USER_RSSI_TEST_EN && TCFG_USER_RSSI_TEST_EN)
spp_get_rssi_handler(packet, size);
#endif
break;
}
}
extern const char *sdk_version_info_get(void);
static u8 *bt_get_sdk_ver_info(u8 *len)
{
char *p = sdk_version_info_get();
if (len) {
*len = strlen(p);
}
log_info("sdk_ver:%s %x\n", p, *len);
return (u8 *)p;
}
extern void bt_set_tx_power(u8 txpower);
extern void __set_aac_bitrate(u32 bitrate);
extern void user_spp_data_handler(u8 packet_type, u16 ch, u8 *packet, u16 size);
extern void online_spp_init(void);
extern u16 get_vbat_value(void);
extern u8 get_vbat_percent(void);
extern u8 *sdfile_get_burn_code(u8 *len);
void bredr_handle_register()
{
#if (USER_SUPPORT_PROFILE_SPP==1)
#if APP_ONLINE_DEBUG
spp_data_deal_handle_register(user_spp_data_handler);
online_spp_init();
#else
spp_data_deal_handle_register(spp_data_handler);
#endif
#endif
bt_fast_test_handle_register(bt_fast_test_api);//测试盒快速测试接口
#if BT_SUPPORT_MUSIC_VOL_SYNC
music_vol_change_handle_register(set_music_device_volume, phone_get_device_vol);
#endif
#if BT_SUPPORT_DISPLAY_BAT
get_battery_value_register(bt_get_battery_value); /*电量显示获取电量的接口*/
#endif
bt_dut_test_handle_register(bt_dut_api);
}
extern void __set_support_ldac_flag(bool flag);
extern void lib_make_ble_address(u8 *ble_address, u8 *edr_address);
extern int le_controller_set_mac(void *addr);
void bt_function_select_init()
{
/* #if TCFG_LOWEST_POWER_EN */
void set_qos_value(u8 qos_on_value, u8 qos_off_value);
void set_pure_monitor_eanble_qos(u8 en);
/* set_pure_monitor_eanble_qos(1); */
/* set_qos_value(5, 15); */
/* #endif */
/* set_bt_data_rate_acl_3mbs_mode(1); */
if (CONFIG_WIFI_DETECT_ENABLE) {
set_bt_afh_classs_enc(1);//report 手机用wifi_detect的频点,不设置用回手机
}
__set_user_ctrl_conn_num(TCFG_BD_NUM);
#ifdef CONFIG_CPU_BR21
__set_support_msbc_flag(0);
#else
__set_support_msbc_flag(1);
#endif
__set_aac_bitrate(131 * 1000);
#if TCFG_BT_SUPPORT_AAC && (!CONFIG_A2DP_GAME_MODE_ENABLE)
/* #if TCFG_BT_SUPPORT_AAC */
__set_support_aac_flag(1);
#else
__set_support_aac_flag(0);
#endif
#if TCFG_BT_SUPPORT_LDAC && (!CONFIG_A2DP_GAME_MODE_ENABLE)
__set_support_ldac_flag(1);
__set_a2dp_ldac_sampling_freq(LDAC_SAMPLING_FREQ_44100 | LDAC_SAMPLING_FREQ_48000 | LDAC_SAMPLING_FREQ_88200 | LDAC_SAMPLING_FREQ_96000); /* 设置ldac支持采样率0x20//44.1KHZ,0x10//48KHZ,0x08//88.1KHZ,0x04//96KHZ */
#else
__set_support_ldac_flag(0);
#endif
#if BT_SUPPORT_DISPLAY_BAT
__bt_set_update_battery_time(60);
#else
__bt_set_update_battery_time(0);
#endif
__set_page_timeout_value(8000); /*回连搜索时间长度设置,可使用该函数注册使用ms单位,u16*/
__set_super_timeout_value(8000); /*回连时超时参数设置。ms单位。做主机有效*/
#if (TCFG_BD_NUM == 2)
__set_auto_conn_device_num(2);
#endif
#if BT_SUPPORT_MUSIC_VOL_SYNC
vol_sys_tab_init();
#endif
//io_capabilities ; /*0: Display only 1: Display YesNo 2: KeyboardOnly 3: NoInputNoOutput*/
//authentication_requirements: 0:not protect 1 :protect
__set_simple_pair_param(3, 0, 2);
bt_testbox_ex_info_get_handle_register(TESTBOX_INFO_VBAT_VALUE, get_vbat_value);
bt_testbox_ex_info_get_handle_register(TESTBOX_INFO_VBAT_PERCENT, get_vbat_percent);
bt_testbox_ex_info_get_handle_register(TESTBOX_INFO_BURN_CODE, sdfile_get_burn_code);
bt_testbox_ex_info_get_handle_register(TESTBOX_INFO_SDK_VERSION, bt_get_sdk_ver_info);
#if TCFG_USER_BLE_ENABLE
{
u8 tmp_ble_addr[6];
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
/* bt_set_tx_power(9);//ble txpwer level:0~9 */
memcpy(tmp_ble_addr, (void *)bt_get_mac_addr(), 6);
#else
lib_make_ble_address(tmp_ble_addr, (void *)bt_get_mac_addr());
#endif //
le_controller_set_mac((void *)tmp_ble_addr);
printf("\n-----edr + ble 's address-----");
printf_buf((void *)bt_get_mac_addr(), 6);
printf_buf((void *)tmp_ble_addr, 6);
}
#endif // TCFG_USER_BLE_ENABLE
/* #if (CONFIG_BT_MODE != BT_NORMAL) */
set_bt_enhanced_power_control(1);
/* #endif */
//#endif
#if (TCFG_USER_TWS_ENABLE==0)
extern void set_g_need_inc_power(u8 en);
set_g_need_inc_power(1);
#endif
}
void phone_sync_vol(void)
{
user_send_cmd_prepare(USER_CTRL_HFP_CALL_SET_VOLUME, 1, &bt_user_priv_var.phone_vol);
}
/*配置通话时前面丢掉的数据包包数*/
#define ESCO_DUMP_PACKET_ADJUST 1 /*配置使能*/
#define ESCO_DUMP_PACKET_DEFAULT 0
#ifdef CONFIG_NEW_BREDR_ENABLE
#define ESCO_DUMP_PACKET_CALL 60 /*0~0xFF*/
#else
#define ESCO_DUMP_PACKET_CALL 120 /*0~0xFF*/
#endif
static u8 esco_dump_packet = ESCO_DUMP_PACKET_CALL;
#if ESCO_DUMP_PACKET_ADJUST
u8 get_esco_packet_dump(void)
{
//log_info("esco_dump_packet:%d\n", esco_dump_packet);
return esco_dump_packet;
}
#endif
/*
* app模式切换
*/
void task_switch(const char *name, int action)
{
struct intent it;
struct application *app;
log_info("app_exit\n");
init_intent(&it);
app = get_current_app();
if (app) {
/*
* 退出当前app, 会执行state_machine()函数中APP_STA_STOP 和 APP_STA_DESTORY
*/
it.name = app->name;
it.action = ACTION_BACK;
start_app(&it);
}
/*
* 切换到app (name)并执行action分支
*/
it.name = name;
it.action = action;
start_app(&it);
}
#if(USE_DMA_UART_TEST) //使用dm串口测试时不能同时打开
#define MY_SNIFF_EN 0
#else
#define MY_SNIFF_EN 1 //默认打开
#endif
/*
*以下情况关闭sniff
*(1)通过spp在线调试eq
*(2)通过spp导出数据
*/
#if APP_ONLINE_DEBUG
#if (TCFG_EQ_ONLINE_ENABLE || (TCFG_AUDIO_DATA_EXPORT_ENABLE == AUDIO_DATA_EXPORT_USE_SPP) || TCFG_LP_TOUCH_KEY_BT_TOOL_ENABLE)
#undef MY_SNIFF_EN
#define MY_SNIFF_EN 0
#endif
#endif/*APP_ONLINE_DEBUG*/
#define SNIFF_CNT_TIME 10/////<空闲10S之后进入sniff模式
#define SNIFF_MAX_INTERVALSLOT 800
#define SNIFF_MIN_INTERVALSLOT 100
#define SNIFF_ATTEMPT_SLOT 4
#define SNIFF_TIMEOUT_SLOT 1
u8 sniff_ready_status = 0; //0:sniff_ready 1:sniff_not_ready
int exit_sniff_timer = 0;
bool bt_is_sniff_close(void)
{
return (bt_user_priv_var.sniff_timer == 0);
}
void bt_check_exit_sniff()
{
sys_timeout_del(exit_sniff_timer);
exit_sniff_timer = 0;
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_role() == TWS_ROLE_SLAVE) {
return;
}
#endif
user_send_cmd_prepare(USER_CTRL_ALL_SNIFF_EXIT, 0, NULL);
}
void bt_sniff_ready_clean(void)
{
sniff_ready_status = 1;
}
static u8 bt_sniff_enable = 1;
void bt_check_enter_sniff()
{
struct sniff_ctrl_config_t sniff_ctrl_config;
u8 addr[12];
u8 conn_cnt = 0;
u8 i = 0;
if (!bt_sniff_enable) {
return;
}
#if TCFG_AUDIO_ANC_ENABLE
if (anc_train_open_query() || anc_online_busy_get()) { //如果ANC训练则不进入SNIFF
return;
}
#endif
#if (RCSP_ADV_EN)
extern u8 get_ble_adv_modify(void);
extern u8 get_ble_adv_notify(void);
if (get_ble_adv_modify() || get_ble_adv_notify()) {
return;
}
#endif
if (sniff_ready_status) {
sniff_ready_status = 0;
return;
}
/*putchar('H');*/
conn_cnt = bt_api_enter_sniff_status_check(SNIFF_CNT_TIME, addr);
#if (TCFG_BD_NUM == 2)
/* if (BT_STATUS_PLAYING_MUSIC == get_bt_connect_status() || get_esco_coder_busy_flag()) { */
if (get_esco_coder_busy_flag()) {
return;
}
#endif
ASSERT(conn_cnt <= 2);
for (i = 0; i < conn_cnt; i++) {
log_info("-----USER SEND SNIFF IN %d %d\n", i, conn_cnt);
sniff_ctrl_config.sniff_max_interval = SNIFF_MAX_INTERVALSLOT;
sniff_ctrl_config.sniff_mix_interval = SNIFF_MIN_INTERVALSLOT;
sniff_ctrl_config.sniff_attemp = SNIFF_ATTEMPT_SLOT;
sniff_ctrl_config.sniff_timeout = SNIFF_TIMEOUT_SLOT;
memcpy(sniff_ctrl_config.sniff_addr, addr + i * 6, 6);
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_role() == TWS_ROLE_SLAVE) {
return;
}
#endif
user_send_cmd_prepare(USER_CTRL_SNIFF_IN, sizeof(struct sniff_ctrl_config_t), (u8 *)&sniff_ctrl_config);
}
}
void sys_auto_sniff_controle(u8 enable, u8 *addr)
{
if (app_var.goto_poweroff_flag) {
return;
}
if (addr) {
if (bt_api_conn_mode_check(enable, addr) == 0) {
log_info("sniff ctr not change\n");
return;
}
}
if (enable) {
if (addr) {
log_info("sniff cmd timer init\n");
user_send_cmd_prepare(USER_CTRL_HALF_SEC_LOOP_CREATE, 0, NULL);
/* user_cmd_timer_init(); */
}
if (bt_user_priv_var.sniff_timer == 0) {
log_info("check_sniff_enable\n");
bt_user_priv_var.sniff_timer = sys_timer_add(NULL, bt_check_enter_sniff, 1000);
}
EARPHONE_STATE_SNIFF(0);
} else {
if (addr) {
log_info("sniff cmd timer remove\n");
user_send_cmd_prepare(USER_CTRL_HALF_SEC_LOOP_DEL, 0, NULL);
/* remove_user_cmd_timer(); */
}
if (bt_user_priv_var.sniff_timer) {
log_info("check_sniff_disable\n");
sys_timeout_del(bt_user_priv_var.sniff_timer);
bt_user_priv_var.sniff_timer = 0;
if (exit_sniff_timer == 0) {
/* exit_sniff_timer = sys_timer_add(NULL, bt_check_exit_sniff, 5000); */
}
}
EARPHONE_STATE_SNIFF(1);
}
}
u8 lmp_rx_sniff_req_check()
{
return !bt_sniff_enable;
}
extern void tws_tx_unsniff_req(void);
void bt_sniff_set_enable(u8 en)
{
bt_sniff_enable = en;
if (en) {
sys_auto_sniff_controle(1, NULL);
tws_sniff_controle_check_enable();
} else {
#if TCFG_USER_TWS_ENABLE
if (get_tws_phone_connect_state() == TRUE) {
user_send_cmd_prepare(USER_CTRL_ALL_SNIFF_EXIT, 0, NULL);
} else {
tws_tx_unsniff_req();
}
tws_sniff_controle_check_disable();
#else
user_send_cmd_prepare(USER_CTRL_ALL_SNIFF_EXIT, 0, NULL);
#endif
sys_auto_sniff_controle(0, NULL);
}
}
void bt_sniff_feature_init()
{
#if TCFG_BT_SNIFF_DISABLE
u8 feature = lmp_hci_read_local_supported_features(0);
feature &= ~BIT(7); //BIT_SNIFF_MODE;
lmp_hci_write_local_supported_features(feature, 0);
#endif
}
int btstack_exit();
void wait_exit_btstack_flag(void *priv)
{
if (!bt_audio_is_running()) {
//btstack_exit();
lmp_hci_reset();
os_time_dly(2);
sys_timer_del(app_var.wait_exit_timer);
if (priv == NULL) {
log_info("task_switch to idle...\n");
task_switch("idle", ACTION_IDLE_MAIN);
} else if (priv == (void *)1) {
log_info("cpu_reset!!!\n");
cpu_reset();
}
} else {
app_var.goto_poweroff_cnt++;
if (app_var.goto_poweroff_cnt > 200) {
log_info("audio:%d, status:%d, hci:%d\n",
bt_audio_is_running(),
get_curr_channel_state(),
hci_standard_connect_check());
log_info("mabe ..... death!\n");
log_info("cpu_reset!!!\n");
cpu_reset();
}
}
}
#if TCFG_USER_TWS_ENABLE
static void power_off_at_same_time(void *p)
{
if (!bt_audio_is_running()) {
int state = tws_api_get_tws_state();
log_info("wait_phone_link_detach: %x\n", state);
if (state & TWS_STA_PHONE_DISCONNECTED) {
if (state & TWS_STA_SIBLING_CONNECTED) {
if (tws_api_get_role() == TWS_ROLE_MASTER) {
bt_tws_play_tone_at_same_time(SYNC_TONE_POWER_OFF, 400);
} else {
/* 防止TWS异常断开导致从耳不关机 */
bt_tws_play_tone_at_same_time(SYNC_TONE_POWER_OFF, 2400);
}
sys_timer_del(app_var.wait_exit_timer);
task_switch("idle", ACTION_IDLE_POWER_OFF);
} else {
sys_timer_del(app_var.wait_exit_timer);
task_switch("idle", ACTION_IDLE_MAIN);
}
} else {
lmp_hci_reset();
os_time_dly(2);
}
} else {
app_var.goto_poweroff_cnt++;
if (app_var.goto_poweroff_cnt > 200) {
log_info("audio:%d, status:%d, hci:%d\n",
bt_audio_is_running(),
get_curr_channel_state(),
hci_standard_connect_check());
log_info("mabe ..... death!\n");
log_info("cpu_reset!!!\n");
cpu_reset();
}
}
}
#endif
extern int tws_sniff_state_check();
void poweroff_sniff_all_exit()
{
u8 exit_cnt = 0;
sys_auto_sniff_controle(0, NULL);
#if TCFG_USER_TWS_ENABLE
log_info("%s %d %d %d %d\n", __func__, get_tws_phone_connect_state(), get_tws_sibling_connect_state(), bt_api_get_sniff_state(), tws_sniff_state_check());
if (get_tws_phone_connect_state()) {
while (bt_api_get_sniff_state() || tws_sniff_state_check()) { //wait lmp and tws_sniff exit
if (exit_cnt % 5 == 0) {
user_send_cmd_prepare(USER_CTRL_ALL_SNIFF_EXIT, 0, NULL); //lmp_sniff exit then tws_sniff will exit
}
if (exit_cnt ++ >= 25) {
exit_cnt = 0;
break;
}
os_time_dly(10); //500ms * 5
}
} else if (get_tws_sibling_connect_state()) { //if only tws connect
while (tws_sniff_state_check()) {
if (exit_cnt % 5 == 0) {
tws_tx_unsniff_req();
}
if (exit_cnt ++ >= 25) {
exit_cnt = 0;
break;
}
os_time_dly(10); //500ms * 5
}
}
log_info("%s %d %d %d %d\n", __func__, get_tws_phone_connect_state(), get_tws_sibling_connect_state(), bt_api_get_sniff_state(), tws_sniff_state_check());
#else
while (bt_api_get_sniff_state()) { //wait lmp and tws_sniff exit
if (exit_cnt % 5 == 0) {
user_send_cmd_prepare(USER_CTRL_ALL_SNIFF_EXIT, 0, NULL); //lmp_sniff exit then tws_sniff will exit
}
if (exit_cnt ++ >= 25) {
exit_cnt = 0;
break;
}
os_time_dly(10); //500ms * 5
}
#endif /*TCFG_USER_TWS_ENABLE*/
}
void sys_enter_soft_poweroff(void *priv)
{
int detach_phone = 1;
struct sys_event clear_key_event = {.type = SYS_KEY_EVENT, .arg = "key"};
log_info("%s, %d\n", __func__, (int)priv);
if (app_var.goto_poweroff_flag) {
return;
}
if ((int)priv != 4) {
#if CONFIG_BT_BACKGROUND_ENABLE
bt_switch_to_foreground(ACTION_DO_NOTHING, 1);
#endif
ui_update_status(STATUS_POWEROFF);
}
sys_auto_sniff_controle(0, NULL);
app_var.goto_poweroff_flag = 1;
app_var.goto_poweroff_cnt = 0;
sys_key_event_disable();
sys_event_clear(&clear_key_event);
sys_auto_shut_down_disable();
poweroff_sniff_all_exit(); //确保关机前sniff已经退出
/* user_send_cmd_prepare(USER_CTRL_ALL_SNIFF_EXIT, 0, NULL); */
EARPHONE_STATE_ENTER_SOFT_POWEROFF();
#if TCFG_AUDIO_ANC_ENABLE
anc_poweroff();
#endif/*TCFG_AUDIO_ANC_ENABLE*/
#if TCFG_USER_TWS_ENABLE
if ((int)priv == 3) {
user_send_cmd_prepare(USER_CTRL_POWER_OFF, 0, NULL);
if (app_var.wait_exit_timer == 0) {
app_var.wait_exit_timer = sys_timer_add(NULL, power_off_at_same_time, 50);
}
return;
}
#if TCFG_CHARGESTORE_ENABLE
if (chargestore_get_earphone_online() != 2) {
bt_tws_poweroff();
}
#else
bt_tws_poweroff();
#endif
int state = tws_api_get_tws_state();
if (state & TWS_STA_PHONE_DISCONNECTED) {
detach_phone = 0;
}
log_info("detach_phone: %x, %d\n", state, detach_phone);
#endif
if (detach_phone) {
user_send_cmd_prepare(USER_CTRL_POWER_OFF, 0, NULL);
}
if (app_var.wait_exit_timer == 0) {
app_var.wait_exit_timer = sys_timer_add(priv, wait_exit_btstack_flag, 50);
}
}
static void sys_auto_shut_down_deal(void *priv)
{
r_printf("%s\n", __func__);
#if TCFG_USER_TWS_ENABLE
if (get_bt_tws_connect_status()) {
if (tws_api_get_role() == TWS_ROLE_MASTER) {
tws_api_sync_call_by_uuid('T', SYNC_CMD_POWER_OFF_TOGETHER, 400);
}
} else
#endif
{
sys_enter_soft_poweroff(0);
}
}
void sys_auto_shut_down_enable(void)
{
#if TCFG_AUTO_SHUT_DOWN_TIME
log_info("sys_auto_shut_down_enable\n");
#if TCFG_AUDIO_ANC_ENABLE
/*ANC打开不支持自动关机*/
if (anc_status_get()) {
return;
}
#endif/*TCFG_AUDIO_ANC_ENABLE*/
#if TCFG_APP_PC_EN
/*PC模式下不支持自动关机*/
if (app_get_curr_task() == APP_PC_TASK) {
log_info("APP_PC_TASK now sys_auto_shut_down_disable\n");
return;
}
#endif/*TCFG_APP_PC_EN*/
if (app_var.auto_shut_down_timer == 0) {
app_var.auto_shut_down_timer = sys_timeout_add(NULL, sys_auto_shut_down_deal, (app_var.auto_off_time * 1000));
}
#endif
}
void sys_auto_shut_down_disable(void)
{
#if TCFG_AUTO_SHUT_DOWN_TIME
log_info("sys_auto_shut_down_disable\n");
if (app_var.auto_shut_down_timer) {
sys_timeout_del(app_var.auto_shut_down_timer);
app_var.auto_shut_down_timer = 0;
}
#endif
}
/*static u32 len_lst[34];*/
static const u32 num0_9[] = {
(u32)TONE_NUM_0,
(u32)TONE_NUM_1,
(u32)TONE_NUM_2,
(u32)TONE_NUM_3,
(u32)TONE_NUM_4,
(u32)TONE_NUM_5,
(u32)TONE_NUM_6,
(u32)TONE_NUM_7,
(u32)TONE_NUM_8,
(u32)TONE_NUM_9,
} ;
static u8 check_phone_income_idle(void)
{
if (bt_user_priv_var.phone_ring_flag) {
return 0;
}
return 1;
}
REGISTER_LP_TARGET(phone_incom_lp_target) = {
.name = "phone_check",
.is_idle = check_phone_income_idle,
};
static void number_to_play_list(char *num, u32 *lst)
{
u8 i = 0;
#if BT_PHONE_NUMBER
if (num) {
for (; i < strlen(num); i++) {
lst[i] = num0_9[num[i] - '0'] ;
}
}
#endif
lst[i++] = (u32)TONE_REPEAT_BEGIN(-1);
lst[i++] = (u32)TONE_RING;
lst[i++] = (u32)TONE_REPEAT_END();
lst[i++] = (u32)NULL;
}
extern u8 is_siri_open();
void phone_num_play_timer(void *priv)
{
char *len_lst[34];
if (get_call_status() == BT_CALL_HANGUP || is_siri_open()) {
log_info("hangup,--phone num play return\n");
return;
}
log_info("%s\n", __FUNCTION__);
if (bt_user_priv_var.phone_num_flag) {
tone_play_stop();
number_to_play_list((char *)(bt_user_priv_var.income_phone_num), (u32 *)len_lst);
tone_file_list_play((const char *)len_lst, 1);
} else {
/*电话号码还没有获取到,定时查询*/
bt_user_priv_var.phone_timer_id = sys_timeout_add(NULL, phone_num_play_timer, 200);
}
}
static void phone_num_play_start(void)
{
/* check if support inband ringtone */
if (!bt_user_priv_var.inband_ringtone) {
bt_user_priv_var.phone_num_flag = 0;
bt_user_priv_var.phone_timer_id = sys_timeout_add(NULL, phone_num_play_timer, 500);
}
}
void phone_check_inband_ring_play_timer(void *priv)
{
#if BT_INBAND_RINGTONE
if (bt_user_priv_var.inband_ringtone && bt_user_priv_var.phone_ring_flag) {
if (!get_esco_coder_busy_flag()) {
r_printf("phone_check_inband_ring_play_timer play");
bt_user_priv_var.inband_ringtone = 0;
#if TCFG_USER_TWS_ENABLE
if (!bt_tws_sync_phone_num(NULL))
#endif
{
extern u8 phone_ring_play_start(void);
phone_ring_play_start();
}
}
}
#endif
}
u8 phone_ring_play_start(void)
{
char *len_lst[34];
if (get_call_status() == BT_CALL_HANGUP || is_siri_open()) {
log_info("hangup,--phone ring play return\n");
return 0;
}
log_info("%s,%d\n", __FUNCTION__, bt_user_priv_var.inband_ringtone);
/* check if support inband ringtone */
if (!bt_user_priv_var.inband_ringtone) {
tone_play_stop();
number_to_play_list(NULL, len_lst);
tone_file_list_play((const char **)len_lst, 1);
return 1;
} else {
#if BT_INBAND_RINGTONE
/* bt_user_priv_var.phone_timer_id = sys_timeout_add(NULL, phone_check_inband_ring_play_timer, 4000); //4s之后检测有没建立通话链路没有建立播本地铃声 */
#endif
}
return 0;
}
static u16 play_poweron_ok_timer_id = 0;
static void play_poweron_ok_timer(void *priv)
{
app_var.wait_timer_do = 0;
log_d("\n-------play_poweron_ok_timer-------\n", priv);
if (is_dac_power_off()) {
#if TCFG_USER_TWS_ENABLE
bt_tws_poweron();
#else
bt_wait_connect_and_phone_connect_switch(0);
#endif
return;
}
app_var.wait_timer_do = sys_timeout_add(priv, play_poweron_ok_timer, 100);
}
static void play_bt_connect_dly(void *priv)
{
app_var.wait_timer_do = 0;
log_d("\n-------play_bt_connect_dly-------\n", priv);
if (!app_var.goto_poweroff_flag) {
STATUS *p_tone = get_tone_config();
tone_play_index(p_tone->bt_connect_ok, 1);
}
}
//=============================================================================//
//NOTE by MO: For fix Make, should be implemented later;
__attribute__((weak))
int earphone_a2dp_codec_get_low_latency_mode()
{
return 0;
}
__attribute__((weak))
int earphone_a2dp_codec_set_low_latency_mode(int enable, int msec)
{
return 0;
}
//=============================================================================//
int bt_get_low_latency_mode()
{
return earphone_a2dp_codec_get_low_latency_mode();
}
void bt_set_low_latency_mode(int enable)
{
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_role() == TWS_ROLE_MASTER) {
if (tws_api_get_tws_state() & TWS_STA_SIBLING_CONNECTED) {
if (enable) {
tws_api_sync_call_by_uuid('T', SYNC_CMD_LOW_LATENCY_ENABLE, 300);
} else {
tws_api_sync_call_by_uuid('T', SYNC_CMD_LOW_LATENCY_DISABLE, 300);
}
} else {
if (earphone_a2dp_codec_set_low_latency_mode(enable, enable ? 800 : 600) == 0) {
if (enable) {
tone_play(TONE_LOW_LATENCY_IN, 1);
} else {
tone_play(TONE_LOW_LATENCY_OUT, 1);
}
}
}
}
#else
earphone_a2dp_codec_set_low_latency_mode(enable, enable ? 800 : 600);
#endif
}
static void bt_discon_dly_handle(void *priv)
{
app_var.phone_dly_discon_time = 0;
STATUS *p_tone = get_tone_config();
#if(TCFG_BD_NUM == 2) //对耳在bt_tws同步播放提示音
/* tone_play(TONE_DISCONN); */
tone_play_index(p_tone->bt_disconnect, 1);
#else
#if TCFG_USER_TWS_ENABLE
if (!get_bt_tws_connect_status() && !get_bt_tws_discon_dly_state())
#endif
{
tone_play_index(p_tone->bt_disconnect, 1);
}
#endif
#if TCFG_USER_TWS_ENABLE
STATUS *p_led = get_led_config();
if (get_bt_tws_connect_status()) {
#if TCFG_CHARGESTORE_ENABLE
chargestore_set_phone_disconnect();
#endif
if (tws_api_get_role() == TWS_ROLE_MASTER) {
bt_tws_play_tone_at_same_time(SYNC_TONE_PHONE_DISCONNECTED, 400);
}
} else {
//断开手机时如果对耳未连接要把LED时钟切到RC因为单台会进SNIFF
pwm_led_clk_set((!TCFG_LOWPOWER_BTOSC_DISABLE) ? PWM_LED_CLK_RC32K : PWM_LED_CLK_BTOSC_24M);
//pwm_led_clk_set(PWM_LED_CLK_RC32K);
ui_update_status(STATUS_BT_DISCONN);
}
#endif
}
#if TCFG_CALL_KWS_SWITCH_ENABLE
extern int audio_phone_call_kws_start(void);
extern int audio_phone_call_kws_close(void);
extern void audio_smart_voice_detect_close(void);
extern int esco_ul_stream_switch(u8 en);
extern u8 bt_phone_dec_is_running();
#endif
static void jl_call_kws_handler(int event)
{
if (event == BT_STATUS_PHONE_INCOME) {
#if TCFG_KWS_VOICE_RECOGNITION_ENABLE
extern void a2dp_media_suspend_resume(u8 flag);
a2dp_media_suspend_resume(1);
a2dp_dec_close();
audio_aec_reboot(1);
jl_kws_speech_recognition_open();
jl_kws_speech_recognition_start();
#endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */
#if TCFG_CALL_KWS_SWITCH_ENABLE
extern void a2dp_media_suspend_resume(u8 flag);
a2dp_media_suspend_resume(1);
a2dp_dec_close();
audio_aec_reboot(1);
//esco_ul_stream_switch(0);
audio_phone_call_kws_start();
#endif /* #if TCFG_CALL_KWS_SWITCH_ENABLE */
} else if (event == BT_STATUS_PHONE_ACTIVE) {
#if TCFG_KWS_VOICE_RECOGNITION_ENABLE
jl_kws_speech_recognition_close();
audio_aec_reboot(0);
#endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */
#ifdef CONFIG_BOARD_AISPEECH_VAD_ASR
printf("----aispeech_state phone active");
ais_platform_asr_close();
esco_mic_reset();
#endif /*CONFIG_BOARD_AISPEECH_VAD_ASR*/
#if TCFG_CALL_KWS_SWITCH_ENABLE
audio_smart_voice_detect_close();
audio_aec_reboot(0);
//esco_ul_stream_switch(1);
#endif /* TCFG_CALL_KWS_SWITCH_ENABLE */
} else if (event == BT_STATUS_PHONE_HANGUP) {
#if TCFG_KWS_VOICE_RECOGNITION_ENABLE
jl_kws_speech_recognition_close();
#endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */
#if TCFG_CALL_KWS_SWITCH_ENABLE
if (!bt_phone_dec_is_running()) {
audio_phone_call_kws_close();
}
#endif /* TCFG_CALL_KWS_SWITCH_ENABLE */
}
}
extern void tws_page_scan_deal_by_esco(u8 esco_flag);
/*
* 对应原来的状态处理函数,连接,电话状态等
*/
void tws_conn_switch_role();
static int bt_connction_status_event_handler(struct bt_event *bt)
{
STATUS *p_tone = get_tone_config();
u8 *phone_number = NULL;
#if CONFIG_BT_BACKGROUND_ENABLE
int ret = bt_background_event_probe_handler(bt);
if (ret == -EINVAL) {
return 0;
}
#endif
//log_info("bt_conn_event:%d", bt->event);
switch (bt->event) {
case BT_STATUS_INIT_OK:
/*
* 蓝牙初始化完成
*/
log_info("BT_STATUS_INIT_OK\n");
init_ok = 1;
#if TCFG_AUDIO_DATA_EXPORT_ENABLE
#if (TCFG_AUDIO_DATA_EXPORT_ENABLE == AUDIO_DATA_EXPORT_USE_SPP)
lmp_hci_set_role_switch_supported(0);
#endif/*AUDIO_DATA_EXPORT_USE_SPP*/
extern int audio_capture_init();
audio_capture_init();
#endif/*TCFG_AUDIO_DATA_EXPORT_ENABLE*/
#if TCFG_AUDIO_ANC_ENABLE
anc_poweron();
#endif/*TCFG_AUDIO_ANC_ENABLE*/
__set_sbc_cap_bitpool(38);
#if (TCFG_USER_BLE_ENABLE)
if (BT_MODE_IS(BT_BQB)) {
ble_bqb_test_thread_init();
} else {
#if !TCFG_WIRELESS_MIC_ENABLE
bt_ble_init();
#endif
#if BLE_HID_EN && (!TCFG_USER_TWS_ENABLE)
ble_module_enable(1);
#endif
}
#endif
#if TCFG_USER_TWS_ENABLE
extern void pbg_demo_init(void);
pbg_demo_init();
#endif
#if TCFG_USER_EMITTER_ENABLE
////发射器设置回调等
void bt_emitter_init() ;
bt_emitter_init();
extern u8 emitter_search_result(char *name, u8 name_len, u8 * addr, u32 dev_class, char rssi);
inquiry_result_handle_register(emitter_search_result);
extern void emitter_or_receiver_switch(u8 flag);
emitter_or_receiver_switch(BT_EMITTER_EN);
break;
#endif
bt_init_ok_search_index();
ui_update_status(STATUS_BT_INIT_OK);
#if TCFG_CHARGESTORE_ENABLE
chargestore_set_bt_init_ok(1);
#endif
#if TCFG_TEST_BOX_ENABLE
testbox_set_bt_init_ok(1);
#endif
#if ((CONFIG_BT_MODE == BT_BQB)||(CONFIG_BT_MODE == BT_PER))
bt_wait_phone_connect_control(1);
#else
if (is_dac_power_off()) {
#if TCFG_USER_TWS_ENABLE
bt_tws_poweron();
#else
bt_wait_connect_and_phone_connect_switch(0);
#endif
} else {
app_var.wait_timer_do = sys_timeout_add(NULL, play_poweron_ok_timer, 100);
}
#endif
/*if (app_var.play_poweron_tone) {
tone_play_index(p_tone->power_on, 1);
}*/
break;
case BT_STATUS_SECOND_CONNECTED:
clear_current_poweron_memory_search_index(0);
case BT_STATUS_FIRST_CONNECTED:
log_info("BT_STATUS_CONNECTED\n");
earphone_change_pwr_mode(PWR_DCDC15, 3000);
sys_auto_shut_down_disable();
#if TCFG_ADSP_UART_ENABLE
ADSP_UART_Init();
#endif
#if(JL_EARPHONE_APP_EN && RCSP_UPDATE_EN)
extern u8 rcsp_update_get_role_switch(void);
if (rcsp_update_get_role_switch()) {
tws_conn_switch_role();
tws_api_auto_role_switch_disable();
}
#endif
#if(TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
{
u8 connet_type;
if (get_auto_connect_state(bt->args)) {
connet_type = ICON_TYPE_RECONNECT;
} else {
connet_type = ICON_TYPE_CONNECTED;
}
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_role() == TWS_ROLE_MASTER) {
bt_ble_icon_open(connet_type);
} else {
//maybe slave already open
bt_ble_icon_close(0);
}
#else
bt_ble_icon_open(connet_type);
#endif
}
#endif
#if (TCFG_BD_NUM == 2)
if (get_current_poweron_memory_search_index(NULL) == 0) {
bt_wait_phone_connect_control(1);
}
#endif
#if TCFG_USER_TWS_ENABLE
if (!get_bt_tws_connect_status()) { //如果对耳还未连接就连上手机,要切换闪灯状态
ui_update_status(STATUS_BT_CONN);
}
#if TCFG_CHARGESTORE_ENABLE
chargestore_set_phone_connect();
#endif
if (bt_tws_phone_connected()) {
break;
}
#else
ui_update_status(STATUS_BT_CONN); //单台在此处设置连接状态,对耳的连接状态需要同步在bt_tws.c中去设置
#if (TCFG_AUTO_STOP_PAGE_SCAN_TIME && TCFG_BD_NUM == 2)
if (get_total_connect_dev() == 1) { //当前有一台连接上了
if (app_var.auto_stop_page_scan_timer == 0) {
app_var.auto_stop_page_scan_timer = sys_timeout_add(NULL, bt_close_page_scan, (TCFG_AUTO_STOP_PAGE_SCAN_TIME * 1000)); //2
}
} else {
if (app_var.auto_stop_page_scan_timer) {
sys_timeout_del(app_var.auto_stop_page_scan_timer);
app_var.auto_stop_page_scan_timer = 0;
}
}
#endif //endif AUTO_STOP_PAGE_SCAN_TIME
#endif
/* tone_play(TONE_CONN); */
/*os_time_dly(40); // for test*/
log_info("tone status:%d\n", tone_get_status());
if (get_call_status() == BT_CALL_HANGUP) {
if (app_var.phone_dly_discon_time) {
sys_timeout_del(app_var.phone_dly_discon_time);
app_var.phone_dly_discon_time = 0;
} else {
app_var.wait_timer_do = sys_timeout_add(NULL, play_bt_connect_dly, 1600);
/* tone_play_index(p_tone->bt_connect_ok, 1); */
}
}
/*int timeout = 5000 + rand32() % 10000;
sys_timeout_add(NULL, connect_phone_test, timeout);*/
break;
case BT_STATUS_FIRST_DISCONNECT:
case BT_STATUS_SECOND_DISCONNECT:
log_info("BT_STATUS_DISCONNECT\n");
#if TCFG_ADSP_UART_ENABLE
ADSP_UART_Deinit();
#endif
if (app_var.goto_poweroff_flag) {
/*关机不播断开提示音*/
/*关机时不改UI*/
break;
}
#if PHONE_DLY_DISCONN_TIME
if (app_var.phone_dly_discon_time == 0) {
app_var.phone_dly_discon_time = sys_timeout_add(NULL, bt_discon_dly_handle, PHONE_DLY_DISCONN_TIME);
}
#else
bt_discon_dly_handle(NULL);
#endif
break;
//phone status deal
case BT_STATUS_PHONE_INCOME:
log_info("BT_STATUS_PHONE_INCOME\n");
esco_dump_packet = ESCO_DUMP_PACKET_CALL;
ui_update_status(STATUS_PHONE_INCOME);
u8 tmp_bd_addr[6];
memcpy(tmp_bd_addr, bt->args, 6);
jl_call_kws_handler(BT_STATUS_PHONE_INCOME);
/*
*(1)1t2有一台通话的时候另一台如果来电不要提示
*(2)1t2两台同时来电现来的题示后来的不播
*/
if ((check_esco_state_via_addr(tmp_bd_addr) != BD_ESCO_BUSY_OTHER) &&
(bt_user_priv_var.phone_ring_flag == 0)) {
#if BT_INBAND_RINGTONE
extern u8 get_device_inband_ringtone_flag(void);
bt_user_priv_var.inband_ringtone = get_device_inband_ringtone_flag();
#else
bt_user_priv_var.inband_ringtone = 0 ;
lmp_private_esco_suspend_resume(3);
#endif
g_printf("bt_user_priv_var.inband_ringtone=0x%x\n", bt_user_priv_var.inband_ringtone);
bt_user_priv_var.phone_ring_flag = 1;
bt_user_priv_var.phone_income_flag = 1;
#if TCFG_USER_TWS_ENABLE
if (!bt_tws_sync_phone_num(NULL))
#endif
{
#if BT_PHONE_NUMBER
phone_num_play_start();
#else
phone_ring_play_start();
#endif
}
user_send_cmd_prepare(USER_CTRL_HFP_CALL_CURRENT, 0, NULL); //发命令获取电话号码
} else {
log_info("SCO busy now:%d,%d\n", check_esco_state_via_addr(tmp_bd_addr),
bt_user_priv_var.phone_ring_flag);
}
break;
case BT_STATUS_PHONE_OUT:
log_info("BT_STATUS_PHONE_OUT\n");
esco_dump_packet = ESCO_DUMP_PACKET_CALL;
ui_update_status(STATUS_PHONE_OUT);
bt_user_priv_var.phone_income_flag = 0;
user_send_cmd_prepare(USER_CTRL_HFP_CALL_CURRENT, 0, NULL); //发命令获取电话号码
break;
case BT_STATUS_PHONE_ACTIVE:
jl_call_kws_handler(BT_STATUS_PHONE_ACTIVE);
log_info("BT_STATUS_PHONE_ACTIVE\n");
ui_update_status(STATUS_PHONE_ACTIV);
if (bt_user_priv_var.phone_call_dec_begin) {
log_info("call_active,dump_packet clear\n");
esco_dump_packet = ESCO_DUMP_PACKET_DEFAULT;
}
if (bt_user_priv_var.phone_ring_flag) {
bt_user_priv_var.phone_ring_flag = 0;
tone_play_stop();
if (bt_user_priv_var.phone_timer_id) {
sys_timeout_del(bt_user_priv_var.phone_timer_id);
bt_user_priv_var.phone_timer_id = 0;
}
}
lmp_private_esco_suspend_resume(4);
bt_user_priv_var.phone_income_flag = 0;
bt_user_priv_var.phone_num_flag = 0;
bt_user_priv_var.phone_con_sync_num_ring = 0;
bt_user_priv_var.phone_con_sync_ring = 0;
bt_user_priv_var.phone_vol = 15;
//phone_sync_vol();
#if TCFG_USER_TWS_ENABLE
bt_tws_sync_volume();
#endif
r_printf("phone_active:%d\n", app_var.call_volume);
app_audio_set_volume(APP_AUDIO_STATE_CALL, app_var.call_volume, 1);
#if TCFG_EAR_DETECT_ENABLE
#if TCFG_EAR_DETECT_CALL_CTL_SCO
ear_detect_phone_active_deal();
#endif
#if (TCFG_EAR_DETECT_AUTO_CHG_MASTER && TCFG_USER_TWS_ENABLE)
ear_detect_call_chg_master_deal();
#endif //TCFG_EAR_DETECT_AUTO_CHG_MASTER
#endif // TCFG_EAR_DETECT_ENABLE
break;
case BT_STATUS_PHONE_HANGUP:
esco_dump_packet = ESCO_DUMP_PACKET_CALL;
log_info("phone_handup\n");
jl_call_kws_handler(BT_STATUS_PHONE_HANGUP);
if (bt_user_priv_var.phone_ring_flag) {
bt_user_priv_var.phone_ring_flag = 0;
tone_play_stop();
if (bt_user_priv_var.phone_timer_id) {
sys_timeout_del(bt_user_priv_var.phone_timer_id);
bt_user_priv_var.phone_timer_id = 0;
}
}
bt_user_priv_var.phone_income_flag = 0;
bt_user_priv_var.phone_num_flag = 0;
bt_user_priv_var.phone_con_sync_num_ring = 0;
bt_user_priv_var.phone_con_sync_ring = 0;
lmp_private_esco_suspend_resume(4);
#if (TCFG_EAR_DETECT_ENABLE && TCFG_EAR_DETECT_AUTO_CHG_MASTER && TCFG_USER_TWS_ENABLE)
ear_detect_change_master_timer_del(); //假如通话结束了,但是还没开始切换主从,取消切换
#endif
break;
case BT_STATUS_PHONE_NUMBER:
log_info("BT_STATUS_PHONE_NUMBER\n");
phone_number = (u8 *)bt->value;
//put_buf(phone_number, strlen((const char *)phone_number));
if (bt_user_priv_var.phone_num_flag == 1) {
break;
}
bt_user_priv_var.income_phone_len = 0;
memset(bt_user_priv_var.income_phone_num, '\0', sizeof(bt_user_priv_var.income_phone_num));
for (int i = 0; i < strlen((const char *)phone_number); i++) {
if (phone_number[i] >= '0' && phone_number[i] <= '9') {
//过滤,只有数字才能报号
bt_user_priv_var.income_phone_num[bt_user_priv_var.income_phone_len++] = phone_number[i];
if (bt_user_priv_var.income_phone_len >= sizeof(bt_user_priv_var.income_phone_num)) {
break; /*buffer 空间不够,后面不要了*/
}
}
}
if (bt_user_priv_var.income_phone_len > 0) {
bt_user_priv_var.phone_num_flag = 1;
} else {
log_info("PHONE_NUMBER len err\n");
}
break;
case BT_STATUS_INBAND_RINGTONE:
log_info("BT_STATUS_INBAND_RINGTONE\n");
#if BT_INBAND_RINGTONE
bt_user_priv_var.inband_ringtone = bt->value;
#else
bt_user_priv_var.inband_ringtone = 0;
#endif
printf("bt_user_priv_var.inband_ringtone=0x%x\n", bt_user_priv_var.inband_ringtone);
break;
case BT_STATUS_BEGIN_AUTO_CON:
log_info("BT_STATUS_BEGIN_AUTO_CON\n");
break;
case BT_STATUS_A2DP_MEDIA_START:
log_info(" BT_STATUS_A2DP_MEDIA_START:0x%x", bt->value);
#if TCFG_AUDIO_CVP_DUT_ENABLE
if (audio_dec_dut_en_get(0)) {
a2dp_dut_dec_open(bt->value);
} else
#endif /*TCFG_AUDIO_CVP_DUT_ENABLE*/
{
a2dp_dec_open(bt->value);
}
break;
case BT_STATUS_A2DP_MEDIA_STOP:
log_info(" BT_STATUS_A2DP_MEDIA_STop");
a2dp_dec_close();
extern void free_a2dp_using_decoder_conn();
free_a2dp_using_decoder_conn();
break;
case BT_STATUS_SCO_STATUS_CHANGE:
printf(" BT_STATUS_SCO_STATUS_CHANGE len:%d ,type:%d", (bt->value >> 16), (bt->value & 0x0000ffff));
if (bt->value != 0xff) {
puts("<<<<<<<<<<<esco_dec_stat\n");
void aac_decoder_energy_det_close();
aac_decoder_energy_det_close();
#if 0 //debug
void mic_capless_feedback_toggle(u8 toggle);
mic_capless_feedback_toggle(0);
#endif
#if PHONE_CALL_USE_LDO15
if ((get_chip_version() & 0xff) <= 0x04) { //F版芯片以下的通话需要使用LDO模式
power_set_mode(PWR_LDO15);
}
#endif
/*phone_call_begin(&bt->value);*/
esco_dec_open(&bt->value, 0);
bt_user_priv_var.phone_call_dec_begin = 1;
if (get_call_status() == BT_CALL_ACTIVE) {
log_info("dec_begin,dump_packet clear\n");
esco_dump_packet = ESCO_DUMP_PACKET_DEFAULT;
}
#if TCFG_USER_TWS_ENABLE
tws_page_scan_deal_by_esco(1);
pbg_user_mic_fixed_deal(1);
#endif
} else {
puts("<<<<<<<<<<<esco_dec_stop\n");
bt_user_priv_var.phone_call_dec_begin = 0;
esco_dump_packet = ESCO_DUMP_PACKET_CALL;
esco_dec_close();
#if TCFG_USER_TWS_ENABLE
tws_page_scan_deal_by_esco(0);
pbg_user_mic_fixed_deal(0);
#endif
#if PHONE_CALL_USE_LDO15
if ((get_chip_version() & 0xff) <= 0x04) { //F版芯片以下的通话需要使用LDO模式
power_set_mode(TCFG_LOWPOWER_POWER_SEL);
}
#endif
#if TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN
extern u8 get_speak_to_chat_state();
if (get_speak_to_chat_state()) {
clk_set_sys_lock(48 * 1000000L, 2);
} else
#endif
{
clk_set_sys_lock(BT_NORMAL_HZ, 2);
}
}
break;
case BT_STATUS_CALL_VOL_CHANGE:
printf("call_vol:%d", bt->value);
//u8 volume = app_audio_get_max_volume() * bt->value / 15;
u8 volume = bt->value;
u8 call_status = get_call_status();
#if BT_INBAND_RINGTONE
if ((call_status != BT_CALL_ACTIVE) && (bt->value == 0)) {
printf("not set vol\n");
break;
}
#endif
bt_user_priv_var.phone_vol = bt->value;
if ((call_status == BT_CALL_ACTIVE) || (call_status == BT_CALL_OUTGOING) || app_var.siri_stu) {
app_audio_set_volume(APP_AUDIO_STATE_CALL, volume, 1);
#if TCFG_USER_TWS_ENABLE
if (call_status == BT_CALL_ACTIVE) {
bt_tws_sync_volume();
}
#endif
} else { /*if (call_status != BT_CALL_HANGUP)*/
/*
*只保存不设置到dac
*微信语音通话的时候会更新音量到app但是此时的call status可能是hangup
*/
app_var.call_volume = volume;
}
break;
case BT_STATUS_SNIFF_STATE_UPDATE:
log_info(" BT_STATUS_SNIFF_STATE_UPDATE %d\n", bt->value); //0退出SNIFF
if (bt->value == 0) {
sniff_out = 1;
#if defined CFG_LED_MODE && (CFG_LED_MODE == CFG_LED_SOFT_MODE)
pwm_led_mode_set(pwm_led_display_mode_get());
#endif
#if(TCFG_USER_TWS_ENABLE == 1)
led_module_exit_sniff_mode();
pwm_led_clk_set(PWM_LED_CLK_BTOSC_24M);
#endif
sys_auto_sniff_controle(MY_SNIFF_EN, bt->args);
} else {
#if(TCFG_USER_TWS_ENABLE == 1)
led_module_enter_sniff_mode();
pwm_led_clk_set((!TCFG_LOWPOWER_BTOSC_DISABLE) ? PWM_LED_CLK_RC32K : PWM_LED_CLK_BTOSC_24M);
#endif
sys_auto_sniff_controle(0, bt->args);
}
break;
case BT_STATUS_LAST_CALL_TYPE_CHANGE:
log_info("BT_STATUS_LAST_CALL_TYPE_CHANGE:%d\n", bt->value);
bt_user_priv_var.last_call_type = bt->value;
break;
case BT_STATUS_CONN_A2DP_CH:
case BT_STATUS_CONN_HFP_CH:
if ((!is_1t2_connection()) && (get_current_poweron_memory_search_index(NULL))) { //回连下一个device
if (get_esco_coder_busy_flag()) {
clear_current_poweron_memory_search_index(0);
} else {
user_send_cmd_prepare(USER_CTRL_START_CONNECTION, 0, NULL);
}
}
break;
case BT_STATUS_PHONE_MANUFACTURER:
log_info("BT_STATUS_PHONE_MANUFACTURER:%d\n", bt->value);
extern const u8 hid_conn_depend_on_dev_company;
app_var.remote_dev_company = bt->value;
if (hid_conn_depend_on_dev_company) {
if (bt->value) {
//user_send_cmd_prepare(USER_CTRL_HID_CONN, 0, NULL);
} else {
if (get_curr_channel_state() == HID_CH) {
//如果只连上hid 先不断开
} else {
user_send_cmd_prepare(USER_CTRL_HID_DISCONNECT, 0, NULL);
}
}
}
break;
case BT_STATUS_VOICE_RECOGNITION:
log_info(" BT_STATUS_VOICE_RECOGNITION:%d \n", bt->value);
/* put_buf(bt, sizeof(struct bt_event)); */
app_var.siri_stu = bt->value;
esco_dump_packet = ESCO_DUMP_PACKET_DEFAULT;
break;
case BT_STATUS_AVRCP_INCOME_OPID:
#define AVC_VOLUME_UP 0x41
#define AVC_VOLUME_DOWN 0x42
log_info("BT_STATUS_AVRCP_INCOME_OPID:%d\n", bt->value);
if (bt->value == AVC_VOLUME_UP) {
}
if (bt->value == AVC_VOLUME_DOWN) {
}
break;
default:
log_info(" BT STATUS DEFAULT\n");
break;
}
return 0;
}
static void sys_time_auto_connection_deal(void *arg)
{
if (bt_user_priv_var.auto_connection_counter) {
log_info("------------------------auto_timeout conuter %d", bt_user_priv_var.auto_connection_counter);
bt_user_priv_var.auto_connection_counter--;
user_send_cmd_prepare(USER_CTRL_START_CONNEC_VIA_ADDR, 6, bt_user_priv_var.auto_connection_addr);
}
}
static void bt_hci_event_inquiry(struct bt_event *bt)
{
#if TCFG_USER_EMITTER_ENABLE
if (bt_user_priv_var.emitter_or_receiver == BT_EMITTER_EN) {
extern void emitter_search_stop();
emitter_search_stop();
}
#endif
}
static void bt_hci_event_connection(struct bt_event *bt)
{
//clk_set_sys_lock(BT_CONNECT_HZ, 0);
log_info("tws_conn_state=%d\n", bt_user_priv_var.tws_conn_state);
#if TCFG_USER_TWS_ENABLE
bt_tws_hci_event_connect();
#ifndef CONFIG_NEW_BREDR_ENABLE
tws_try_connect_disable();
#endif
#else
if (bt_user_priv_var.auto_connection_timer) {
sys_timeout_del(bt_user_priv_var.auto_connection_timer);
bt_user_priv_var.auto_connection_timer = 0;
}
bt_user_priv_var.auto_connection_counter = 0;
bt_wait_phone_connect_control(0);
user_send_cmd_prepare(USER_CTRL_ALL_SNIFF_EXIT, 0, NULL);
#endif
}
extern void bt_get_vm_mac_addr(u8 *addr);
static void bt_discovery_and_connectable_using_loca_mac_addr(u8 inquiry_scan_en, u8 page_scan_en)
{
u8 local_addr[6];
log_info("<<<<<<<<<<<wait bt discon,inquiry_scan:%x pasge_scan:%x>>>>>>>>>>>>>\n", inquiry_scan_en, page_scan_en);
bt_get_vm_mac_addr(local_addr);
//log_info("local_adr\n");
//put_buf(local_addr,6);
lmp_hci_write_local_address(local_addr);
if (page_scan_en) {
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL);
}
if (inquiry_scan_en) {
user_send_cmd_prepare(USER_CTRL_WRITE_SCAN_ENABLE, 0, NULL);
}
}
static void bt_hci_event_disconnect(struct bt_event *bt)
{
if (app_var.goto_poweroff_flag) {
return;
}
earphone_change_pwr_mode(PWR_LDO15, 0);
/* if (get_total_connect_dev() == 0) { //已经没有设备连接 */
/* sys_auto_shut_down_enable(); */
/* } */
log_info("<<<<<<<<<<<<<<total_dev: %d>>>>>>>>>>>>>\n", get_total_connect_dev());
if (!get_curr_channel_state()) {
/* if (get_total_connect_dev() == 0) { //已经没有设备连接 */
#if (TCFG_USER_TWS_ENABLE == 0)
if (!app_var.goto_poweroff_flag) { /*关机时不改UI*/
ui_update_status(STATUS_BT_DISCONN);
}
#endif
sys_auto_shut_down_enable();
}
#if (TCFG_BD_NUM == 2)
log_info("get_bt_connect_status = 0x%x,%x\n", get_bt_connect_status(), get_curr_channel_state());
if (!get_curr_channel_state()) {
sys_auto_shut_down_enable();
}
#endif
#if TCFG_TEST_BOX_ENABLE
if (testbox_get_ex_enter_dut_flag()) {
bt_discovery_and_connectable_using_loca_mac_addr(1, 1);
return;
}
if (testbox_get_status()) {
bt_discovery_and_connectable_using_loca_mac_addr(0, 1);
return;
}
#endif
#if (TCFG_AUTO_STOP_PAGE_SCAN_TIME && TCFG_BD_NUM == 2)
if (get_total_connect_dev() == 1) { //当前有一台连接上了
if (app_var.auto_stop_page_scan_timer == 0) {
app_var.auto_stop_page_scan_timer = sys_timeout_add(NULL, bt_close_page_scan, (TCFG_AUTO_STOP_PAGE_SCAN_TIME * 1000)); //2
}
} else {
if (app_var.auto_stop_page_scan_timer) {
sys_timeout_del(app_var.auto_stop_page_scan_timer);
app_var.auto_stop_page_scan_timer = 0;
}
}
#endif //endif AUTO_STOP_PAGE_SCAN_TIME
#if (TCFG_BD_NUM == 2)
if ((bt->event == ERROR_CODE_CONNECTION_REJECTED_DUE_TO_UNACCEPTABLE_BD_ADDR)
|| (bt->event == ERROR_CODE_CONNECTION_ACCEPT_TIMEOUT_EXCEEDED)
|| (bt->event == ERROR_CODE_ROLE_SWITCH_FAILED)
|| (bt->event == ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS)) {
/*
*连接接受超时
*如果支持1t2可以选择继续回连下一台除非已经回连完毕
*/
if (get_current_poweron_memory_search_index(NULL)) {
user_send_cmd_prepare(USER_CTRL_START_CONNECTION, 0, NULL);
return;
}
}
#endif
#if TCFG_USER_TWS_ENABLE
if (bt->value == ERROR_CODE_CONNECTION_TIMEOUT) {
bt_tws_phone_connect_timeout();
} else {
bt_tws_phone_disconnected();
}
#else
bt_wait_phone_connect_control(1);
#endif
}
static void bt_hci_event_linkkey_missing(struct bt_event *bt)
{
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
#if (CONFIG_NO_DISPLAY_BUTTON_ICON && TCFG_CHARGESTORE_ENABLE)
//已取消配对了
if (bt_ble_icon_get_adv_state() == ADV_ST_RECONN) {
//切换广播
log_info("switch_INQ\n");
bt_ble_icon_open(ICON_TYPE_INQUIRY);
}
#endif
#endif
}
static void bt_hci_event_page_timeout()
{
log_info("------------------------HCI_EVENT_PAGE_TIMEOUT conuter %d", bt_user_priv_var.auto_connection_counter);
#if TCFG_USER_TWS_ENABLE
bt_tws_phone_page_timeout();
#else
/* if (!bt_user_priv_var.auto_connection_counter) { */
if (bt_user_priv_var.auto_connection_timer) {
sys_timer_del(bt_user_priv_var.auto_connection_timer);
bt_user_priv_var.auto_connection_timer = 0;
}
#if (TCFG_BD_NUM == 2)
if (get_current_poweron_memory_search_index(NULL)) {
user_send_cmd_prepare(USER_CTRL_START_CONNECTION, 0, NULL);
}
#endif
bt_wait_phone_connect_control(1);
#endif
}
static void bt_hci_event_connection_timeout(struct bt_event *bt)
{
earphone_change_pwr_mode(PWR_LDO15, 0);
#if TCFG_TEST_BOX_ENABLE
if (testbox_get_ex_enter_dut_flag()) {
bt_discovery_and_connectable_using_loca_mac_addr(1, 1);
return;
}
#endif
if (!get_remote_test_flag() && !get_esco_busy_flag()) {
bt_user_priv_var.auto_connection_counter = (TIMEOUT_CONN_TIME * 1000);
memcpy(bt_user_priv_var.auto_connection_addr, bt->args, 6);
#if TCFG_USER_TWS_ENABLE
bt_tws_phone_connect_timeout();
#else
#if ((CONFIG_BT_MODE == BT_BQB)||(CONFIG_BT_MODE == BT_PER))
bt_wait_phone_connect_control(1);
#else
user_send_cmd_prepare(USER_CTRL_PAGE_CANCEL, 0, NULL);
#if (TCFG_BD_NUM == 2)
if (bt_user_priv_var.auto_connection_timer) {
log_info("1To2 had registered timer,del it\n");//1To2 存在两个手机都断连的情况,所以要判断,删掉第一个手机断连时候的定时器
sys_timeout_del(bt_user_priv_var.auto_connection_timer);
bt_user_priv_var.auto_connection_timer = 0;
}
#endif
bt_wait_connect_and_phone_connect_switch(0);
#endif
//user_send_cmd_prepare(USER_CTRL_START_CONNEC_VIA_ADDR, 6, bt->args);
#endif
} else {
#if TCFG_USER_TWS_ENABLE
bt_tws_phone_disconnected();
#else
bt_wait_phone_connect_control(1);
#endif
}
}
static void bt_hci_event_connection_exist(struct bt_event *bt)
{
if (!get_remote_test_flag() && !get_esco_busy_flag()) {
bt_user_priv_var.auto_connection_counter = (8 * 1000);
memcpy(bt_user_priv_var.auto_connection_addr, bt->args, 6);
#if TCFG_USER_TWS_ENABLE
bt_tws_phone_connect_timeout();
#else
if (bt_user_priv_var.auto_connection_timer) {
sys_timer_del(bt_user_priv_var.auto_connection_timer);
bt_user_priv_var.auto_connection_timer = 0;
}
bt_wait_connect_and_phone_connect_switch(0);
//user_send_cmd_prepare(USER_CTRL_START_CONNEC_VIA_ADDR, 6, bt->args);
#endif
} else {
#if TCFG_USER_TWS_ENABLE
bt_tws_phone_disconnected();
#else
bt_wait_phone_connect_control(1);
#endif
}
}
void eartch_testbox_flag(u8 flag);
enum {
TEST_STATE_INIT = 1,
TEST_STATE_EXIT = 3,
};
enum {
ITEM_KEY_STATE_DETECT = 0,
ITEM_IN_EAR_DETECT,
};
static u8 in_ear_detect_test_flag = 0;
static void testbox_in_ear_detect_test_flag_set(u8 flag)
{
in_ear_detect_test_flag = flag;
}
u8 testbox_in_ear_detect_test_flag_get(void)
{
return in_ear_detect_test_flag;
}
static void bt_in_ear_detection_test_state_handle(u8 state, u8 *value)
{
switch (state) {
case TEST_STATE_INIT:
testbox_in_ear_detect_test_flag_set(1);
#if TCFG_EARTCH_EVENT_HANDLE_ENABLE
eartch_testbox_flag(1);
#endif
//start trim
break;
case TEST_STATE_EXIT:
testbox_in_ear_detect_test_flag_set(0);
#if TCFG_EARTCH_EVENT_HANDLE_ENABLE
eartch_testbox_flag(0);
#endif
break;
}
}
static void bt_vendor_meta_event_handle(u8 sub_evt, u8 *arg, u8 len)
{
log_info("vendor event:%x\n", sub_evt);
log_info_hexdump(arg, 6);
if (sub_evt != HCI_SUBEVENT_VENDOR_TEST_MODE_CFG) {
log_info("unknow_sub_evt:%x\n", sub_evt);
return;
}
u8 test_item = arg[0];
u8 state = arg[1];
if (ITEM_IN_EAR_DETECT == test_item) {
bt_in_ear_detection_test_state_handle(state, NULL);
}
}
extern void set_remote_test_flag(u8 own_remote_test);
static int bt_hci_event_handler(struct bt_event *bt)
{
//对应原来的蓝牙连接上断开处理函数 ,bt->value=reason
log_info("------------------------bt_hci_event_handler reason %x %x", bt->event, bt->value);
if (bt->event == HCI_EVENT_VENDOR_REMOTE_TEST) {
if (VENDOR_TEST_DISCONNECTED == bt->value) {
#if TCFG_TEST_BOX_ENABLE
if (testbox_get_status()) {
if (get_remote_test_flag()) {
testbox_clear_connect_status();
}
}
#endif
set_remote_test_flag(0);
log_info("clear_test_box_flag");
cpu_reset();
return 0;
} else {
#if TCFG_USER_BLE_ENABLE
#if (CONFIG_BT_MODE == BT_NORMAL)
//1:edr con;2:ble con;
if (VENDOR_TEST_LEGACY_CONNECTED_BY_BT_CLASSIC == bt->value) {
extern void bt_ble_adv_enable(u8 enable);
bt_ble_adv_enable(0);
}
#endif
#endif
#if TCFG_USER_TWS_ENABLE
if (VENDOR_TEST_CONNECTED_WITH_TWS != bt->value) {
bt_tws_poweroff();
}
#endif
}
}
/* if (((bt->event != HCI_EVENT_CONNECTION_COMPLETE) && (bt->event != HCI_EVENT_VENDOR_REMOTE_TEST)) \ */
/* || ((bt->event == HCI_EVENT_CONNECTION_COMPLETE) && (bt->value != ERROR_CODE_SUCCESS))) { */
/* #if TCFG_TEST_BOX_ENABLE */
/* if (testbox_get_status()) { */
/* if (get_remote_test_flag()) { */
/* chargestore_clear_connect_status(); */
/* } */
/* //return 0; */
/* } */
/* #endif */
/* } */
switch (bt->event) {
case HCI_EVENT_VENDOR_META:
bt_vendor_meta_event_handle(bt->value, bt->args, 6);
break;
case HCI_EVENT_INQUIRY_COMPLETE:
log_info(" HCI_EVENT_INQUIRY_COMPLETE \n");
bt_hci_event_inquiry(bt);
break;
case HCI_EVENT_USER_CONFIRMATION_REQUEST:
log_info(" HCI_EVENT_USER_CONFIRMATION_REQUEST \n");
///<可通过按键来确认是否配对 1配对 0取消
bt_send_pair(1);
break;
case HCI_EVENT_USER_PASSKEY_REQUEST:
log_info(" HCI_EVENT_USER_PASSKEY_REQUEST \n");
///<可以开始输入6位passkey
break;
case HCI_EVENT_USER_PRESSKEY_NOTIFICATION:
log_info(" HCI_EVENT_USER_PRESSKEY_NOTIFICATION %x\n", bt->value);
///<可用于显示输入passkey位置 value 0:start 1:enrer 2:earse 3:clear 4:complete
break;
case HCI_EVENT_PIN_CODE_REQUEST :
log_info("HCI_EVENT_PIN_CODE_REQUEST \n");
bt_send_pair(1);
break;
case HCI_EVENT_VENDOR_NO_RECONN_ADDR :
log_info("HCI_EVENT_VENDOR_NO_RECONN_ADDR \n");
bt_hci_event_disconnect(bt) ;
break;
case HCI_EVENT_DISCONNECTION_COMPLETE :
log_info("HCI_EVENT_DISCONNECTION_COMPLETE \n");
bt_hci_event_disconnect(bt) ;
break;
case BTSTACK_EVENT_HCI_CONNECTIONS_DELETE:
case HCI_EVENT_CONNECTION_COMPLETE:
#if PHONE_DLY_DISCONN_TIME
if (bt->value == ERROR_CODE_REMOTE_USER_TERMINATED_CONNECTION) {
if (app_var.phone_dly_discon_time) {
sys_timeout_del(app_var.phone_dly_discon_time);
bt_discon_dly_handle(NULL);
}
}
#endif
log_info(" HCI_EVENT_CONNECTION_COMPLETE \n");
switch (bt->value) {
case ERROR_CODE_SUCCESS :
log_info("ERROR_CODE_SUCCESS \n");
testbox_in_ear_detect_test_flag_set(0);
bt_hci_event_connection(bt);
break;
case ERROR_CODE_PIN_OR_KEY_MISSING:
log_info(" ERROR_CODE_PIN_OR_KEY_MISSING \n");
bt_hci_event_linkkey_missing(bt);
case ERROR_CODE_SYNCHRONOUS_CONNECTION_LIMIT_TO_A_DEVICE_EXCEEDED :
case ERROR_CODE_CONNECTION_REJECTED_DUE_TO_LIMITED_RESOURCES:
case ERROR_CODE_CONNECTION_REJECTED_DUE_TO_UNACCEPTABLE_BD_ADDR:
case ERROR_CODE_CONNECTION_ACCEPT_TIMEOUT_EXCEEDED :
case ERROR_CODE_REMOTE_USER_TERMINATED_CONNECTION :
case ERROR_CODE_CONNECTION_TERMINATED_BY_LOCAL_HOST :
case ERROR_CODE_AUTHENTICATION_FAILURE :
//case CUSTOM_BB_AUTO_CANCEL_PAGE:
bt_hci_event_disconnect(bt) ;
break;
case ERROR_CODE_PAGE_TIMEOUT:
log_info(" ERROR_CODE_PAGE_TIMEOUT \n");
bt_hci_event_page_timeout();
break;
case ERROR_CODE_CONNECTION_TIMEOUT:
log_info(" ERROR_CODE_CONNECTION_TIMEOUT \n");
bt_hci_event_connection_timeout(bt);
break;
case ERROR_CODE_ROLE_SWITCH_FAILED:
log_info("ERROR_CODE_ROLE_SWITCH_FAILED \n");
case ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS :
log_info("ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS \n");
bt_hci_event_connection_exist(bt);
break;
default:
break;
}
break;
default:
break;
}
return 0;
}
//恢复前台运行
static void earphone_run_at_foreground()
{
sys_auto_shut_down_disable();
}
/*
* 系统事件处理函数
*/
static int event_handler(struct application *app, struct sys_event *event)
{
if (SYS_EVENT_REMAP(event)) {
g_printf("****SYS_EVENT_REMAP**** \n");
return 0;
}
switch (event->type) {
case SYS_KEY_EVENT:
/*
* 普通按键消息处理
*/
if (bt_user_priv_var.fast_test_mode) {
audio_adc_mic_demo_close();
tone_play_index(IDEX_TONE_NORMAL, 1);
}
#if CONFIG_BT_BACKGROUND_ENABLE
if (bt_in_background()) {
break;
}
#endif
app_earphone_key_event_handler(event);
break;
case SYS_BT_EVENT:
/*
* 蓝牙事件处理
*/
if ((u32)event->arg == SYS_BT_EVENT_TYPE_CON_STATUS) {
bt_connction_status_event_handler(&event->u.bt);
} else if ((u32)event->arg == SYS_BT_EVENT_TYPE_HCI_STATUS) {
bt_hci_event_handler(&event->u.bt);
}
#if TCFG_ADSP_UART_ENABLE
else if (!strcmp(event->arg, "UART")) {
extern void bt_uart_command_handler(struct uart_event * event);
bt_uart_command_handler(&event->u.uart);
} else if (!strcmp(event->arg, "UART_CMD")) {
extern void adsp_uart_command_event_handle(struct uart_cmd_event * uart_cmd);
adsp_uart_command_event_handle(&event->u.uart_cmd);
}
#endif
#if TCFG_USER_TWS_ENABLE
else if (((u32)event->arg == SYS_BT_EVENT_FROM_TWS)) {
/*
* tws事件处理函数
*/
bt_tws_connction_status_event_handler(&event->u.bt);
}
#endif
break;
case SYS_DEVICE_EVENT:
/*
* 系统设备事件处理
*/
if ((u32)event->arg == DEVICE_EVENT_FROM_CHARGE) {
#if TCFG_CHARGE_ENABLE
return app_charge_event_handler(&event->u.dev);
#endif
#if (TCFG_ONLINE_ENABLE || TCFG_CFG_TOOL_ENABLE)
} else if ((u32)event->arg == DEVICE_EVENT_FROM_CFG_TOOL) {
extern int app_cfg_tool_event_handler(struct cfg_tool_event * cfg_tool_dev);
app_cfg_tool_event_handler(&event->u.cfg_tool);
#endif
#if TCFG_ONLINE_ENABLE
} else if ((u32)event->arg == DEVICE_EVENT_FROM_CI_UART) {
ci_data_rx_handler(CI_UART);
#if TCFG_USER_TWS_ENABLE
} else if ((u32)event->arg == DEVICE_EVENT_FROM_CI_TWS) {
ci_data_rx_handler(CI_TWS);
#endif
#endif
} else if ((u32)event->arg == DEVICE_EVENT_FROM_POWER) {
return app_power_event_handler(&event->u.dev);
}
#if TCFG_CHARGESTORE_ENABLE
else if ((u32)event->arg == DEVICE_EVENT_CHARGE_STORE) {
app_chargestore_event_handler(&event->u.chargestore);
}
#endif
#if TCFG_UMIDIGI_BOX_ENABLE
else if ((u32)event->arg == DEVICE_EVENT_UMIDIGI_CHARGE_STORE) {
app_umidigi_chargestore_event_handler(&event->u.umidigi_chargestore);
}
#endif
#if TCFG_TEST_BOX_ENABLE
else if ((u32)event->arg == DEVICE_EVENT_TEST_BOX) {
app_testbox_event_handler(&event->u.testbox);
}
#endif
#if TCFG_EAR_DETECT_ENABLE
else if ((u32)event->arg == DEVICE_EVENT_FROM_EAR_DETECT) {
ear_detect_event_handle(event->u.ear.value);
}
#endif
#if TCFG_ANC_BOX_ENABLE
else if ((u32)event->arg == DEVICE_EVENT_FROM_ANC) {
return app_ancbox_event_handler(&event->u.ancbox);
}
#endif
#if TCFG_EARTCH_EVENT_HANDLE_ENABLE
else if ((u32)event->arg == DEVICE_EVENT_FROM_EARTCH) {
extern void eartch_event_handle(u8 state);
eartch_event_handle(event->u.ear.value);
}
#endif /* #if TCFG_EARTCH_EVENT_HANDLE_ENABLE */
#if APP_ONLINE_DEBUG
else if ((u32)event->arg == DEVICE_EVENT_ONLINE_DATA) {
extern void app_online_event_handle(int evt_value);
app_online_event_handle(event->u.dev.value);
}
#endif /* #if TCFG_EARTCH_EVENT_HANDLE_ENABLE */
break;
#if TCFG_USER_TWS_ENABLE
case SYS_IR_EVENT:
g_printf("[SYS_IR_EVENT]");
#if TCFG_USER_TWS_ENABLE
if (get_bt_tws_connect_status()) {
if (event->u.ir.event == IR_SENSOR_EVENT_FAR) { //FAR
tws_api_sync_call_by_uuid('T', SYNC_CMD_IRSENSOR_EVENT_FAR, 500);
} else if (event->u.ir.event == IR_SENSOR_EVENT_NEAR) { //NEAR
tws_api_sync_call_by_uuid('T', SYNC_CMD_IRSENSOR_EVENT_NEAR, 500);
}
} else
#endif
{
if (event->u.ir.event == IR_SENSOR_EVENT_FAR) { //FAR
g_printf("TWS FAR STOP MUSIC PLAY");
g_printf("a2dp_get_status = %d", a2dp_get_status());
if (a2dp_get_status() == BT_MUSIC_STATUS_STARTING) {
r_printf("STOP...\n");
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PAUSE, 0, NULL);
}
} else if (event->u.ir.event == IR_SENSOR_EVENT_NEAR) { //NEAR
g_printf("TWS NEAR START MUSIC PLAY");
g_printf("a2dp_get_status = %d", a2dp_get_status());
if (a2dp_get_status() != BT_MUSIC_STATUS_STARTING) {
r_printf("START...\n");
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PLAY, 0, NULL);
}
}
}
return 0;
case SYS_PBG_EVENT:
pbg_user_event_deal(&event->u.pbg);
break;
#endif
#if TCFG_AUDIO_SPATIAL_EFFECT_ENABLE
/*空间音频校准*/
case SYS_AUD_EVENT:
if ((u32)event->arg == AUDIO_EVENT_TRIM_IMU_START) {
extern int spatial_imu_trim_start();
spatial_imu_trim_task_start();
} else if ((u32)event->arg == AUDIO_EVENT_TRIM_IMU_STOP) {
extern int spatial_imu_trim_task_stop();
spatial_imu_trim_task_stop();
}
break;
#endif /*TCFG_AUDIO_SPATIAL_EFFECT_ENABLE*/
default:
return false;
}
SYS_EVENT_HANDLER_SPECIFIC(event);
#ifdef CONFIG_BT_BACKGROUND_ENABLE
if (app) {
default_event_handler(event);
}
#endif
return false;
}
int bt_in_background_event_handler(struct sys_event *event)
{
return event_handler(NULL, event);
}
u8 bt_app_exit_check(void)
{
int esco_state;
if (app_var.siri_stu && app_var.siri_stu != 3) {
// siri不退出
return 0;
}
esco_state = get_call_status();
if (esco_state == BT_CALL_OUTGOING ||
esco_state == BT_CALL_ALERT ||
esco_state == BT_CALL_INCOMING ||
esco_state == BT_CALL_ACTIVE) {
// 通话不退出
return 0;
}
return 1;
}
int bt_app_exit(void *priv)
{
int a2dp_state;
init_ok = 0;
a2dp_state = a2dp_get_status();
extern u8 bt_media_is_running();
extern void a2dp_dec_close();
if (bt_media_is_running()) {
a2dp_dec_close();
a2dp_media_clear_packet_before_seqn(0);
}
tone_play_stop();
user_send_cmd_prepare(USER_CTRL_WRITE_SCAN_DISABLE, 0, NULL);
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_DISABLE, 0, NULL);
user_send_cmd_prepare(USER_CTRL_PAGE_CANCEL, 0, NULL);
user_send_cmd_prepare(USER_CTRL_CONNECTION_CANCEL, 0, NULL);
user_send_cmd_prepare(USER_CTRL_POWER_OFF, 0, NULL);
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_tws_state() & TWS_STA_SIBLING_DISCONNECTED) {
return 1;
}
#endif
btstack_exit();
sys_auto_shut_down_disable();
return 1;
}
static void tone_play_end_callback(void *priv, int flag)
{
int index = (int)priv;
switch (index) {
case IDEX_TONE_BT_MODE:
printf("%s:IDEX_TONE_BT_MODE", __FUNCTION__);
/* 按键消息使能 */
sys_key_event_enable();
break;
}
}
/*
* earphone 模式状态机, 通过start_app()控制状态切换
*/
/* extern int audio_mic_init(); */
static int state_machine(struct application *app, enum app_state state, struct intent *it)
{
int error = 0;
static u8 tone_player_err = 0;
r_printf("bt_state_machine=%d\n", state);
switch (state) {
case APP_STA_CREATE:
/* set_adjust_conn_dac_check(0); */
#if TCFG_SD0_ENABLE || TCFG_PC_ENABLE
STATUS *p_tone = get_tone_config();
tone_play_index(p_tone->bt_init_ok, 1);
#else
if (app_var.play_poweron_tone) {
STATUS *p_tone = get_tone_config();
/* tone_play_index(p_tone->power_on, 1); */
tone_player_err = tone_play_index_with_callback(p_tone->power_on, 1, tone_play_end_callback, (void *)IDEX_TONE_BT_MODE);
} else {
#ifdef CONFIG_CURRENT_SOUND_DEAL_ENABLE
dac_analog_power_control(0);
#endif
}
#endif
break;
case APP_STA_START:
//进入蓝牙模式,UI退出充电状态
ui_update_status(STATUS_EXIT_LOWPOWER);
if (!it) {
break;
}
switch (it->action) {
case ACTION_EARPHONE_MAIN:
/*
* earphone 模式初始化
*/
clk_set("sys", BT_NORMAL_HZ);
u32 sys_clk = clk_get("sys");
bt_pll_para(TCFG_CLOCK_OSC_HZ, sys_clk, 0, 0);
/* bredr_set_dut_enble(1, 1); */
bt_function_select_init();
bredr_handle_register();
EARPHONE_STATE_INIT();
btstack_init();
u8 mac_data[6];
extern void rcsp_adv_fill_mac_addr(u8 *mac_addr_buf);
rcsp_adv_fill_mac_addr(mac_data); //读取MAC地址
xlog("ble xtell BT mac data:%x:%x:%x:%x:%x:%x",mac_data[0],mac_data[1],mac_data[2],mac_data[3],mac_data[4],mac_data[5]);
xlog("=============bt_function_select_init================\n");
#if TCFG_USER_TWS_ENABLE
tws_profile_init();
sys_key_event_filter_disable();
#endif
/* 按键消息使能 */
sys_key_event_enable();
#if TCFG_AUDIO_WIDE_AREA_TAP_ENABLE
extern int audio_wat_click_open();
audio_wat_click_open();
#endif /*TCFG_AUDIO_WIDE_AREA_TAP_ENABLE*/
sys_auto_shut_down_enable();
bt_sniff_feature_init();
sys_auto_sniff_controle(MY_SNIFF_EN, NULL);
app_var.dev_volume = -1;
colorful_lights_function().update_display_mode(COLORFUL_LIGHTS_BREATHE_MODE);
break;
case ACTION_A2DP_START:
#if (BT_SUPPORT_MUSIC_VOL_SYNC && CONFIG_BT_BACKGROUND_ENABLE)
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, app_var.bt_volume, 1);
r_printf("BT_BACKGROUND RESET ACTION_A2DP_START STATE_MUSIC bt_volume=%d\n", app_var.bt_volume);
#endif
a2dp_dec_open(0);
break;
case ACTION_BY_KEY_MODE:
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PLAY, 0, NULL);
break;
case ACTION_TONE_PLAY:
STATUS *p_tone = get_tone_config();
tone_play_index(p_tone->bt_init_ok, 1);
break;
case ACTION_DO_NOTHING:
break;
}
break;
case APP_STA_PAUSE:
//转入后台运行
#if CONFIG_BT_BACKGROUND_ENABLE
error = bt_switch_to_background();
if (error == 0) {
sys_auto_shut_down_disable();
}
#if (BT_SUPPORT_MUSIC_VOL_SYNC)
app_var.bt_volume = app_audio_get_volume(APP_AUDIO_STATE_MUSIC);
if (app_var.dev_volume != -1) { //切换到其它模式恢复上一次的音量
r_printf("resume dev_volume=%d\n", app_var.dev_volume);
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, app_var.dev_volume, 1);
app_var.dev_volume = -1;
}
#endif
log_info("APP_STA_PAUSE: %d\n", error);
#endif
break;
case APP_STA_RESUME:
#if (BT_SUPPORT_MUSIC_VOL_SYNC && CONFIG_BT_BACKGROUND_ENABLE)
app_var.dev_volume = app_audio_get_volume(APP_AUDIO_STATE_MUSIC);
r_printf("APP_STA_RESUME rec dev_volume=%d\n", app_audio_get_volume(APP_AUDIO_STATE_MUSIC));
#endif
//恢复前台运行
sys_auto_shut_down_disable();
sys_key_event_enable();
break;
case APP_STA_STOP:
break;
case APP_STA_DESTROY:
r_printf("APP_STA_DESTROY\n");
if (!app_var.goto_poweroff_flag) {
bt_app_exit(NULL);
}
break;
}
return error;
}
static const struct application_operation app_earphone_ops = {
.state_machine = state_machine,
.event_handler = event_handler,
};
/*
* 注册earphone模式
*/
REGISTER_APPLICATION(app_earphone) = {
.name = "earphone",
.action = ACTION_EARPHONE_MAIN,
.ops = &app_earphone_ops,
.state = APP_STA_DESTROY,
};