/*************************************************************************** * * Copyright 2015-2019 BES. * All rights reserved. All unpublished rights reserved. * * No part of this work may be used or reproduced in any form or by any * means, or stored in a database or retrieval system, without prior written * permission of BES. * * Use of this work is governed by a license granted by BES. * This work contains confidential and proprietary information of * BES. which is protected by copyright, trade secret, * trademark and other intellectual property rights. * ****************************************************************************/ #include #include "app_tws_ibrt_trace.h" #include "bluetooth.h" #include "btapp.h" #include "app_ibrt_ui.h" #include "app_tws_ibrt_cmd_handler.h" #include "app_tws_ctrl_thread.h" #include "app_vendor_cmd_evt.h" #include "cmsis_os.h" #include "besbt.h" #include "stdlib.h" #include "app_bt.h" #include "factory_section.h" #include "app_ibrt_if.h" #include "a2dp_decoder.h" #include "app_battery.h" #include "nvrecord.h" #include "nvrecord_env.h" #include "app_status_ind.h" #include "app_ibrt_peripheral_manager.h" #include "nvrecord_ble.h" extern "C" { } #ifdef IBRT_SEARCH_UI static void app_tws_inquiry_timeout_handler(void const *param); osTimerDef (APP_TWS_INQ, app_tws_inquiry_timeout_handler); static osTimerId app_tws_timer = NULL; static void app_tws_delay_connect_handler(void const *param); osTimerDef (APP_TWS_DELAY_CONNECT, app_tws_delay_connect_handler); static osTimerId app_tws_delay_connect_timer = NULL; static uint8_t tws_find_process=0; static uint8_t tws_inquiry_count=0; #define MAX_TWS_INQUIRY_TIMES 3 #define IBRT_MAX_SEARCH_TIME 10 /* 12.8s */ uint8_t tws_inq_addr_used; typedef struct { uint8_t used; bt_bdaddr_t bdaddr; } TWS_INQ_ADDR_STRUCT; TWS_INQ_ADDR_STRUCT tws_inq_addr[5]; #define IBRT_SEARCH_DEBUG #ifdef IBRT_SEARCH_DEBUG #define TWSCON_DBLOG TRACE #else #define TWSCON_DBLOG(...) #endif uint8_t box_event=IBRT_NONE_EVENT; static void app_box_handle_timehandler(void const *param); osTimerDef (APP_BOX_HANDLE, app_box_handle_timehandler); static osTimerId app_box_handle_timer = NULL; static void app_box_handle_timehandler(void const *param) { uint8_t *box_event_ptr=(uint8_t *)param; uint8_t boxStatus=*box_event_ptr; TRACE(1,"box event:%d",boxStatus); app_ibrt_search_ui_init(true,boxStatus); app_ibrt_if_event_entry(boxStatus); if(IBRT_IN_BOX_CLOSED==boxStatus) app_ibrt_search_ui_init(true,boxStatus); } static void app_tws_inquiry_timeout_handler(void const *param) { TWSCON_DBLOG(0,"app_tws_inquiry_timeout_handler\n"); btif_me_inquiry(BTIF_BT_IAC_LIAC, IBRT_MAX_SEARCH_TIME, 0); } static void app_tws_delay_connect_handler(void const *parma) { TWSCON_DBLOG(1,"%s",__func__); app_ibrt_if_enter_pairing_after_tws_connected(); } bool app_tws_is_addr_in_tws_inq_array(const bt_bdaddr_t* addr) { uint8_t i; for(i=0; iaddress,BTIF_BD_ADDR_SIZE)) return true; } } return false; } void app_tws_clear_tws_inq_array(void) { memset(&tws_inq_addr,0,sizeof(tws_inq_addr)); } int app_tws_fill_addr_to_array(const bt_bdaddr_t*addr) { uint8_t i; for(i=0; iaddress,BTIF_BD_ADDR_SIZE); return 0; } } return -1; } uint8_t app_tws_get_tws_addr_inq_num(void) { uint8_t i,count=0; for(i=0; inv_role ==IBRT_UNKNOW) p_ibrt_ctrl->nv_role = ibrtRole; if(NULL!=ibrtPeerAddr) { memcpy(p_ibrt_ctrl->peer_addr.address,ibrtPeerAddr->address, BD_ADDR_LEN); nv_record_update_ibrt_info(p_ibrt_ctrl->nv_role,ibrtPeerAddr); } } void tws_app_stop_find(void) { tws_find_process=0; btif_me_unregister_globa_handler((btif_handler *)btif_me_get_bt_handler()); } void app_bt_manager_ibrt_role_process(const btif_event_t *Event) { switch (btif_me_get_callback_event_type(Event)) { case BTIF_BTEVENT_LINK_CONNECT_IND: case BTIF_BTEVENT_LINK_CONNECT_CNF: if (BTIF_BEC_NO_ERROR == btif_me_get_callback_event_err_code(Event)) { bt_bdaddr_t *p_remote_dev_addr=NULL; ibrt_ctrl_t *p_ibrt_ctrl=NULL; p_remote_dev_addr = btif_me_get_callback_event_rem_dev_bd_addr(Event); p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); if(p_ibrt_ctrl->nv_role ==IBRT_UNKNOW) factory_section_original_btaddr_get(p_ibrt_ctrl->local_addr.address); TRACE(2,"local:%x remd:%x",p_ibrt_ctrl->local_addr.address[5],p_remote_dev_addr->address[5]); if((p_ibrt_ctrl->local_addr.address[3]==p_remote_dev_addr->address[3]) &&(p_ibrt_ctrl->local_addr.address[4]==p_remote_dev_addr->address[4]) &&(p_ibrt_ctrl->local_addr.address[5]==p_remote_dev_addr->address[5])) { app_tws_ibrt_update_info(IBRT_SLAVE,p_remote_dev_addr); if(app_ibrt_ui_get_tws_use_same_addr_enable()) { memcpy(p_ibrt_ctrl->local_addr.address,p_remote_dev_addr->address,6); } #if 0 p_ibrt_ctrl->audio_chnl_sel = A2DP_AUDIO_CHANNEL_SELECT_LRMERGE; #else if(IBRT_MASTER == p_ibrt_ctrl->nv_role) { TRACE(0,"#right"); p_ibrt_ctrl->audio_chnl_sel = A2DP_AUDIO_CHANNEL_SELECT_RCHNL; } else if(IBRT_SLAVE == p_ibrt_ctrl->nv_role) { TRACE(0,"#left"); p_ibrt_ctrl->audio_chnl_sel = A2DP_AUDIO_CHANNEL_SELECT_LCHNL; } #endif } } break; default: break; } } void app_ibrt_config_the_same_bd_addr(bt_bdaddr_t *ibrtSearchedAddr) { ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); app_tws_ibrt_set_access_mode(BTIF_BAM_NOT_ACCESSIBLE); memcpy(p_ibrt_ctrl->local_addr.address, ibrtSearchedAddr->address, BD_ADDR_LEN); memcpy(p_ibrt_ctrl->peer_addr.address, ibrtSearchedAddr->address, BD_ADDR_LEN); btif_me_set_bt_address(ibrtSearchedAddr->address); #ifdef __GMA_VOICE__ btif_me_set_ble_bd_address(ibrtSearchedAddr->address); bt_set_ble_local_address(ibrtSearchedAddr->address); NV_EXTENSION_RECORD_T *pNvExtRec = nv_record_get_extension_entry_ptr(); memcpy(pNvExtRec->tws_info.ble_info.ble_addr, ibrtSearchedAddr->address, BLE_IRK_SIZE); nv_record_tws_exchange_ble_info(); #endif TRACE(1,"%s", __func__); DUMP8("%02x ", p_ibrt_ctrl->local_addr.address, BD_ADDR_LEN); //after change the bd_addr, we should reset access mode again app_tws_ibrt_set_access_mode(BTIF_BAM_CONNECTABLE_ONLY); } void app_ibrt_reconfig_btAddr_from_nv() { struct nvrecord_env_t *nvrecord_env; if(nv_record_env_get(&nvrecord_env)!=-1) { if(nvrecord_env->ibrt_mode.mode !=IBRT_UNKNOW) { TRACE(0,"reconfig addr from nv"); DUMP8("%02x ",nvrecord_env->ibrt_mode.record.bdAddr.address, 6); bt_set_local_address(nvrecord_env->ibrt_mode.record.bdAddr.address); bt_set_ble_local_address(nvrecord_env->ibrt_mode.record.bdAddr.address); } } } void app_bt_inquiry_call_back(const btif_event_t* event) { TWSCON_DBLOG(2,"\nenter: %s %d\n",__func__,__LINE__); uint8_t device_name[64]; uint8_t device_name_len; app_ibrt_ui_t *p_ibrt_ui = app_ibrt_ui_get_ctx(); ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); factory_section_original_btaddr_get(p_ibrt_ctrl->local_addr.address); switch(btif_me_get_callback_event_type(event)) { case BTIF_BTEVENT_NAME_RESULT: TWSCON_DBLOG(2,"\n%s %d BTEVENT_NAME_RESULT\n",__func__,__LINE__); break; case BTIF_BTEVENT_INQUIRY_RESULT: TWSCON_DBLOG(2,"\n%s %d BTEVENT_INQUIRY_RESULT\n",__func__,__LINE__); DUMP8("%02x ", btif_me_get_callback_event_inq_result_bd_addr_addr(event), 6); TWSCON_DBLOG(1,"inqmode = %x",btif_me_get_callback_event_inq_result_inq_mode(event)); DUMP8("%02x ", btif_me_get_callback_event_inq_result_ext_inq_resp(event), 20); ///check the uap and nap if equal ,get the name for tws slave TRACE(1,"##RSSI:%d",(int8_t)btif_me_get_callback_event_rssi(event)); TRACE(6,"local %02x %02x %02x %02x %02x %02x\n", p_ibrt_ctrl->local_addr.address[0], p_ibrt_ctrl->local_addr.address[1], p_ibrt_ctrl->local_addr.address[2], p_ibrt_ctrl->local_addr.address[3], p_ibrt_ctrl->local_addr.address[4], p_ibrt_ctrl->local_addr.address[5]); if((btif_me_get_callback_event_inq_result_bd_addr(event)->address[5]== p_ibrt_ctrl->local_addr.address[5]) && (btif_me_get_callback_event_inq_result_bd_addr(event)->address[4]== p_ibrt_ctrl->local_addr.address[4]) && (btif_me_get_callback_event_inq_result_bd_addr(event)->address[3]== p_ibrt_ctrl->local_addr.address[3])) { ///check the device is already checked TWSCON_DBLOG(0,"<1>"); if(app_tws_is_addr_in_tws_inq_array(btif_me_get_callback_event_inq_result_bd_addr(event))) { break; } ////if rssi event is eir,so find name derictly if(btif_me_get_callback_event_inq_result_inq_mode(event) == BTIF_INQ_MODE_EXTENDED) { TWSCON_DBLOG(0,"<2>"); uint8_t *eir = (uint8_t *)btif_me_get_callback_event_inq_result_ext_inq_resp(event); //device_name_len = ME_GetExtInqData(eir,0x09,device_name,sizeof(device_name)); device_name_len = btif_me_get_ext_inq_data(eir,0x09,device_name,sizeof(device_name)); if(device_name_len>0) { TWSCON_DBLOG(3,"<3> search name len %d %s local name %s\n", device_name_len, device_name, bt_get_local_name()); ////if name is the same as the local name so we think the device is the tws slave if(!memcmp(device_name,bt_get_local_name(),device_name_len)) { TWSCON_DBLOG(0,"<4>"); //modify local addr app_ibrt_config_the_same_bd_addr(btif_me_get_callback_event_inq_result_bd_addr(event)); btif_me_cancel_inquiry(); osTimerStop(app_tws_timer); tws_app_stop_find(); app_tws_ibrt_update_info(IBRT_MASTER,btif_me_get_callback_event_inq_result_bd_addr(event)); p_ibrt_ctrl->audio_chnl_sel = A2DP_AUDIO_CHANNEL_SELECT_LRMERGE; if(NULL !=app_tws_delay_connect_timer) { osTimerStop(app_tws_delay_connect_timer); osTimerStart(app_tws_delay_connect_timer, 500); } } else { if(app_tws_get_tws_addr_inq_num()=MAX_TWS_INQUIRY_TIMES) { tws_app_stop_find(); return; } if(p_ibrt_ui->super_state ==IBRT_UI_IDLE) { ////inquiry complete if bt don't find any slave ,so do inquiry again uint8_t rand_delay = rand() % 5; tws_inquiry_count++; if(rand_delay == 0) { //btif_me_inquiry(BTIF_BT_IAC_GIAC, IBRT_MAX_SEARCH_TIME, 0); btif_me_inquiry(BTIF_BT_IAC_LIAC, IBRT_MAX_SEARCH_TIME, 0); } else { osTimerStart(app_tws_timer, rand_delay*1000); } } break; /** The Inquiry process is canceled. */ case BTIF_BTEVENT_INQUIRY_CANCELED: TWSCON_DBLOG(2,"\n%s %d BTEVENT_INQUIRY_CANCELED\n",__FUNCTION__,__LINE__); // tws.notify(&tws); break; case BTIF_BTEVENT_LINK_CONNECT_CNF: TWSCON_DBLOG(3,"\n%s %d BTEVENT_LINK_CONNECT_CNF stats=%x\n",__FUNCTION__,__LINE__,btif_me_get_callback_event_err_code(event)); //connect fail start inquiry again if(btif_me_get_callback_event_err_code(event) ==4 && tws_find_process == 1) { if(tws_inquiry_count>=MAX_TWS_INQUIRY_TIMES) { tws_app_stop_find(); return; } uint8_t rand_delay = rand() % 5; tws_inquiry_count++; if(rand_delay == 0) { //btif_me_inquiry(BTIF_BT_IAC_GIAC, IBRT_MAX_SEARCH_TIME, 0); btif_me_inquiry(BTIF_BT_IAC_LIAC, IBRT_MAX_SEARCH_TIME, 0); } else { osTimerStart(app_tws_timer, rand_delay*1000); } } ///connect succ,so stop the finding tws procedure else if(btif_me_get_callback_event_err_code(event) ==0) { tws_app_stop_find(); } break; case BTIF_BTEVENT_LINK_CONNECT_IND: TWSCON_DBLOG(3,"\n%s %d BTEVENT_LINK_CONNECT_IND stats=%x\n",__FUNCTION__,__LINE__,btif_me_get_callback_event_err_code(event)); ////there is a incoming connect so cancel the inquiry and the timer and the connect creating btif_me_cancel_inquiry(); osTimerStop(app_tws_timer); break; default: //TWS_DBLOG("\n%s %d etype:%d\n",__FUNCTION__,__LINE__,event->eType); break; } //TWS_DBLOG("\nexit: %s %d\n",__FUNCTION__,__LINE__); } uint8_t is_find_tws_peer_device_onprocess(void) { return tws_find_process; } void find_tws_peer_device_start(void) { TWSCON_DBLOG(2,"\nibrt_ui_log: %s %d\n",__func__,__LINE__); bt_status_t status; app_tws_clear_tws_inq_array(); if(tws_find_process ==0) { tws_find_process = 1; tws_inquiry_count = 0; if (app_tws_timer == NULL) app_tws_timer = osTimerCreate(osTimer(APP_TWS_INQ), osTimerOnce, NULL); btif_me_set_handler(btif_me_get_bt_handler(),app_bt_inquiry_call_back); btif_me_register_global_handler(btif_me_get_bt_handler()); btif_me_set_event_mask(btif_me_get_bt_handler(), BTIF_BEM_LINK_DISCONNECT|BTIF_BEM_ROLE_CHANGE|BTIF_BEM_INQUIRY_RESULT| BTIF_BEM_INQUIRY_COMPLETE|BTIF_BEM_INQUIRY_CANCELED|BTIF_BEM_LINK_CONNECT_CNF|BTIF_BEM_LINK_CONNECT_IND); again: TWSCON_DBLOG(2,"\n%s %d\n",__func__,__LINE__); status = btif_me_inquiry(BTIF_BT_IAC_LIAC, IBRT_MAX_SEARCH_TIME, 0); TWSCON_DBLOG(2,"\n%s %d\n",__func__,__LINE__); if (status != BT_STS_PENDING) { osDelay(500); goto again; } TWSCON_DBLOG(2,"\n%s %d\n",__func__,__LINE__); } } void find_tws_peer_device_stop(void) { btif_me_cancel_inquiry(); tws_app_stop_find(); } void app_start_tws_serching_direactly() { btif_accessible_mode_t mode; ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); mode = p_ibrt_ctrl->access_mode; TWSCON_DBLOG(1,"ibrt_ui_log:search tws direactly access_mode:%d",mode); //if ((BTIF_DEFAULT_ACCESS_MODE_PAIR==mode)||(BTIF_BAM_LIMITED_ACCESSIBLE==mode)) if(BTIF_BAM_LIMITED_ACCESSIBLE==mode) { if(NULL==app_tws_delay_connect_timer) app_tws_delay_connect_timer=osTimerCreate(osTimer(APP_TWS_DELAY_CONNECT),osTimerOnce,NULL ); if (is_find_tws_peer_device_onprocess()) { find_tws_peer_device_stop(); } else { p_ibrt_ctrl->nv_role=IBRT_UNKNOW; find_tws_peer_device_start(); //app_status_indication_set(APP_STATUS_INDICATION_CONNECTING); } } } static void app_ibrt_battery_handle_process_normal(uint32_t status, union APP_BATTERY_MSG_PRAMS prams) { app_ibrt_ui_t *p_ui_ctrl = app_ibrt_ui_get_ctx(); switch (status) { case APP_BATTERY_STATUS_CHARGING: TWSCON_DBLOG(1,"charger:%d",prams.charger); if (prams.charger == APP_BATTERY_CHARGER_PLUGIN) { ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); TWSCON_DBLOG(1,"APP_BATTERY_CHARGER_PLUGIN nv_role %02x", p_ibrt_ctrl->nv_role); /*if (p_ibrt_ctrl->nv_role == IBRT_UNKNOW) { return; }*/ if(p_ui_ctrl->config.check_plugin_excute_closedbox_event==true) box_event=IBRT_CLOSE_BOX_EVENT; else box_event=IBRT_PUT_IN_EVENT; if(app_box_handle_timer!=NULL) { osTimerStop(app_box_handle_timer); osTimerStart(app_box_handle_timer,500); } } else if (prams.charger == APP_BATTERY_CHARGER_PLUGOUT) { ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); TWSCON_DBLOG(1,"APP_BATTERY_CHARGER_PLUGOUT nv_role %02x", p_ibrt_ctrl->nv_role); if (p_ibrt_ctrl->nv_role == IBRT_UNKNOW) { return; } box_event=IBRT_FETCH_OUT_EVENT; if(app_box_handle_timer!=NULL) { osTimerStop(app_box_handle_timer); osTimerStart(app_box_handle_timer,500); } } break; case APP_BATTERY_STATUS_INVALID: default: break; } } void app_ibrt_battery_callback(APP_BATTERY_MV_T currvolt, uint8_t currlevel,enum APP_BATTERY_STATUS_T curstatus,uint32_t status, union APP_BATTERY_MSG_PRAMS prams) { switch (curstatus) { case APP_BATTERY_STATUS_NORMAL: case APP_BATTERY_STATUS_CHARGING: app_ibrt_battery_handle_process_normal(status,prams); break; default: break; } } #ifdef BOX_DET_USE_GPIO #define BOX_DET_PIN HAL_IOMUX_PIN_P1_0 static void box_det_pin_irq_set(enum HAL_GPIO_IRQ_POLARITY_T polarity); static void box_det_pin_irq_update(void) { if (hal_gpio_pin_get_val((enum HAL_GPIO_PIN_T)BOX_DET_PIN)) box_det_pin_irq_set(HAL_GPIO_IRQ_POLARITY_LOW_FALLING); else box_det_pin_irq_set(HAL_GPIO_IRQ_POLARITY_HIGH_RISING); } static void box_det_handler(uint32_t val) { ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); TRACE(2,"%s: %d", __func__, p_ibrt_ctrl->nv_role); box_det_pin_irq_update(); if (val) { box_event = IBRT_FETCH_OUT_EVENT; } else { box_event=IBRT_CLOSE_BOX_EVENT; } if (p_ibrt_ctrl->nv_role == IBRT_UNKNOW) return; if (app_box_handle_timer) { osTimerStop(app_box_handle_timer); osTimerStart(app_box_handle_timer,500); } } static void box_det_irq_handler(enum HAL_GPIO_PIN_T pin) { uint8_t val = hal_gpio_pin_get_val(pin); TRACE(3,"%s: %d, %d", __func__, pin, val); app_ibrt_peripheral_run1((uint32_t)box_det_handler, (uint32_t)val); } static void box_det_pin_irq_set(enum HAL_GPIO_IRQ_POLARITY_T polarity) { struct HAL_GPIO_IRQ_CFG_T box_det_pin_cfg; box_det_pin_cfg.irq_debounce = true; box_det_pin_cfg.irq_handler = box_det_irq_handler; box_det_pin_cfg.irq_type = HAL_GPIO_IRQ_TYPE_EDGE_SENSITIVE; box_det_pin_cfg.irq_enable = true; box_det_pin_cfg.irq_polarity = polarity; hal_gpio_setup_irq((enum HAL_GPIO_PIN_T)BOX_DET_PIN, &box_det_pin_cfg); } static void box_det_pin_init(void) { const struct HAL_IOMUX_PIN_FUNCTION_MAP box_det_gpio_cfg = { BOX_DET_PIN, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE }; hal_iomux_init((struct HAL_IOMUX_PIN_FUNCTION_MAP *)&box_det_gpio_cfg, 1); hal_gpio_pin_set_dir((enum HAL_GPIO_PIN_T)box_det_gpio_cfg.pin, HAL_GPIO_DIR_IN, 1); box_det_pin_irq_update(); } #endif void app_ibrt_search_ui_init(bool boxOperation,ibrt_event_type evt_type) { app_ibrt_ui_t *p_ui_ctrl = app_ibrt_ui_get_ctx(); if((true==p_ui_ctrl->config.check_plugin_excute_closedbox_event) || (false==boxOperation)) p_ui_ctrl->box_state = IBRT_IN_BOX_OPEN; if(false==boxOperation) { #ifdef BOX_DET_USE_GPIO box_det_pin_init(); #else app_battery_register(app_ibrt_battery_callback); #endif if (app_box_handle_timer == NULL) app_box_handle_timer = osTimerCreate(osTimer(APP_BOX_HANDLE), osTimerOnce, &box_event); } else if(evt_type !=IBRT_IN_BOX_CLOSED) { app_ibrt_ui_judge_scan_type(IBRT_OPEN_BOX_TRIGGER,NO_LINK_TYPE,IBRT_UI_NO_ERROR); } } void app_ibrt_remove_history_paired_device(void) { bt_status_t retStatus; btif_device_record_t record; ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); int paired_dev_count = nv_record_get_paired_dev_count(); TWSCON_DBLOG(0,"Remove all history tws nv records."); TWSCON_DBLOG(0,"Master addr:"); DUMP8("%02x ",p_ibrt_ctrl->local_addr.address, BTIF_BD_ADDR_SIZE); TWSCON_DBLOG(0,"Slave addr:"); DUMP8("%02x ",p_ibrt_ctrl->peer_addr.address, BTIF_BD_ADDR_SIZE); for (int32_t index = paired_dev_count - 1; index >= 0; index--) { retStatus = nv_record_enum_dev_records(index, &record); if (BT_STS_SUCCESS == retStatus) { TWSCON_DBLOG(1,"The index %d of nv records:", index); DUMP8("%02x ", record.bdAddr.address, BTIF_BD_ADDR_SIZE); if (!memcmp(record.bdAddr.address, p_ibrt_ctrl->local_addr.address, BTIF_BD_ADDR_SIZE) || !memcmp(record.bdAddr.address, p_ibrt_ctrl->peer_addr.address, BTIF_BD_ADDR_SIZE)) { nv_record_ddbrec_delete(&record.bdAddr); TWSCON_DBLOG(1,"Delete the nv record entry %d", index); } } } memset(p_ibrt_ctrl->local_addr.address, 0, BTIF_BD_ADDR_SIZE); memset(p_ibrt_ctrl->peer_addr.address, 0, BTIF_BD_ADDR_SIZE); } void app_bt_enter_mono_pairing_mode(void) { ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); app_ibrt_ui_t *p_ibrt_ui = app_ibrt_ui_get_ctx(); p_ibrt_ui->box_state = IBRT_OUT_BOX; TRACE(0,"ibrt_ui_log:app_bt_enter_mono_pairing_mode"); if(!app_device_bt_is_connected()) { if(p_ibrt_ctrl->nv_role == IBRT_UNKNOW) { app_ibrt_ui_judge_scan_type(IBRT_FREEMAN_PAIR_TRIGGER,NO_LINK_TYPE, IBRT_UI_NO_ERROR); app_ibrt_ui_set_freeman_enable(); } else { //app_tws_ibrt_set_access_mode(BTIF_BAM_GENERAL_ACCESSIBLE); app_ibrt_ui_set_enter_pairing_mode(IBRT_CONNECT_MOBILE_FAILED); app_ibrt_ui_judge_scan_type(IBRT_CONNECTE_TRIGGER,MOBILE_LINK, 0); } } } void app_ibrt_enter_limited_mode(void) { ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); app_ibrt_ui_t *p_ibrt_ui = app_ibrt_ui_get_ctx(); p_ibrt_ctrl->nv_role=IBRT_UNKNOW; p_ibrt_ui->box_state = IBRT_OUT_BOX; app_ibrt_remove_history_paired_device(); TRACE(0,"ibrt_ui_log:power on enter pairing"); app_ibrt_ui_judge_scan_type(IBRT_SEARCH_SLAVE_TRIGGER,NO_LINK_TYPE,IBRT_UI_NO_ERROR); } #endif