#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; } 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("<<<<<<<<<<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("<<<<<<<<<<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("<<<<<<<<<<>>>>>>>>>>>>\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("<<<<<<<<<<<<<>>>>>>>>>>>>\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); 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, // };