pinebuds/services/app_ibrt/src/app_ibrt_search_pair_ui.cpp

777 lines
26 KiB
C++

/***************************************************************************
*
* 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 <string.h>
#include "app_tws_ibrt_trace.h"
#include "app_tws_if.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; i<sizeof(tws_inq_addr)/sizeof(tws_inq_addr[0]); i++)
{
if(tws_inq_addr[i].used == 1)
{
if(!memcmp(tws_inq_addr[i].bdaddr.address,addr->address,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; i<sizeof(tws_inq_addr)/sizeof(tws_inq_addr[0]); i++)
{
if(tws_inq_addr[i].used == 0)
{
tws_inq_addr[i].used =1;
memcpy(tws_inq_addr[i].bdaddr.address,addr->address,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; i<sizeof(tws_inq_addr)/sizeof(tws_inq_addr[0]); i++)
{
if(tws_inq_addr[i].used == 1)
{
count++;
}
}
return count;
}
/*****************************************************************************
Prototype : app_tws_ibrt_update_info
Description : config tws info
Input : ibrt_role_e twsRole
bt_bdaddr_t *twsAddr
Output : None
Return Value :
Calls :
Called By :
History :
Date : 2019/3/26
Author : bestechnic
Modification : Created function
*****************************************************************************/
void app_tws_ibrt_update_info(ibrt_role_e ibrtRole,bt_bdaddr_t *ibrtPeerAddr)
{
TRACE(1,"%s",__func__);
ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx();
if(p_ibrt_ctrl->nv_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 (app_tws_is_left_side()){
p_ibrt_ctrl->audio_chnl_sel = A2DP_AUDIO_CHANNEL_SELECT_LCHNL;
}else {
p_ibrt_ctrl->audio_chnl_sel = A2DP_AUDIO_CHANNEL_SELECT_RCHNL;
}
// #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()<sizeof(tws_inq_addr)/sizeof(tws_inq_addr[0]))
{
app_tws_fill_addr_to_array(btif_me_get_callback_event_inq_result_bd_addr(event));
if(app_tws_get_tws_addr_inq_num()==sizeof(tws_inq_addr)/sizeof(tws_inq_addr[0]))
{
///fail to find a tws slave
btif_me_cancel_inquiry();
tws_app_stop_find();
}
}
else
{
///fail to find a tws slave
btif_me_cancel_inquiry();
tws_app_stop_find();
}
}
break;
}
/////have no name so just wait for next device
//////we can do remote name req for tws slave if eir can't received correctly
}
}
break;
case BTIF_BTEVENT_INQUIRY_COMPLETE:
TWSCON_DBLOG(2,"\n%s %d BTEVENT_INQUIRY_COMPLETE\n",__FUNCTION__,__LINE__);
if(tws_inquiry_count>=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