2016-11-04 18:48:16 +00:00
|
|
|
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
2017-11-24 09:28:43 +00:00
|
|
|
#include <string.h>
|
|
|
|
#include "esp_bt_defs.h"
|
2016-11-15 12:56:15 +00:00
|
|
|
#include "esp_gap_bt_api.h"
|
2017-02-24 09:28:33 +00:00
|
|
|
#include "btc_gap_bt.h"
|
2018-05-03 11:05:57 +00:00
|
|
|
#include "btc/btc_storage.h"
|
2018-04-08 04:10:50 +00:00
|
|
|
#include "bta/bta_api.h"
|
|
|
|
#include "common/bt_trace.h"
|
|
|
|
#include "common/bt_target.h"
|
|
|
|
#include "btc/btc_manage.h"
|
|
|
|
#include "btc/btc_util.h"
|
|
|
|
#include "osi/allocator.h"
|
2018-07-10 03:18:52 +00:00
|
|
|
#include "bta/bta_dm_co.h"
|
2016-10-26 03:25:24 +00:00
|
|
|
|
2017-11-24 09:28:43 +00:00
|
|
|
#if (BTC_GAP_BT_INCLUDED == TRUE)
|
|
|
|
|
|
|
|
#define COD_UNCLASSIFIED ((0x1F) << 8)
|
|
|
|
|
|
|
|
#define BTC_STORAGE_FILL_PROPERTY(p_prop, t, l, p_v) \
|
|
|
|
(p_prop)->type = t;(p_prop)->len = l; (p_prop)->val = (p_v);
|
|
|
|
|
|
|
|
static void bte_search_devices_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data);
|
|
|
|
static void bte_dm_search_services_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data);
|
|
|
|
static void bte_dm_remote_service_record_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data);
|
|
|
|
static void search_services_copy_cb(btc_msg_t *msg, void *p_dest, void *p_src);
|
|
|
|
static void search_service_record_copy_cb(btc_msg_t *msg, void *p_dest, void *p_src);
|
2017-02-24 09:28:33 +00:00
|
|
|
|
2017-11-24 09:28:43 +00:00
|
|
|
static bool btc_gap_bt_inquiry_in_progress = false;
|
|
|
|
|
|
|
|
static inline void btc_gap_bt_cb_to_app(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *param)
|
2017-02-24 09:28:33 +00:00
|
|
|
{
|
2017-11-24 09:28:43 +00:00
|
|
|
esp_bt_gap_cb_t cb = (esp_bt_gap_cb_t)btc_profile_cb_get(BTC_PID_GAP_BT);
|
|
|
|
if (cb) {
|
|
|
|
cb(event, param);
|
2017-02-24 09:28:33 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-09 10:30:48 +00:00
|
|
|
static void btc_bt_set_scan_mode(esp_bt_connection_mode_t c_mode, esp_bt_discovery_mode_t d_mode)
|
2016-10-26 03:25:24 +00:00
|
|
|
{
|
|
|
|
tBTA_DM_DISC disc_mode;
|
|
|
|
tBTA_DM_CONN conn_mode;
|
|
|
|
|
2018-04-09 10:30:48 +00:00
|
|
|
switch (c_mode) {
|
|
|
|
case ESP_BT_NON_CONNECTABLE:
|
2016-10-26 03:25:24 +00:00
|
|
|
conn_mode = BTA_DM_NON_CONN;
|
|
|
|
break;
|
2018-04-09 10:30:48 +00:00
|
|
|
case ESP_BT_CONNECTABLE:
|
2016-10-26 03:25:24 +00:00
|
|
|
conn_mode = BTA_DM_CONN;
|
|
|
|
break;
|
2018-04-09 10:30:48 +00:00
|
|
|
default:
|
|
|
|
BTC_TRACE_WARNING("invalid connection mode (0x%x)", c_mode);
|
|
|
|
return;
|
|
|
|
}
|
2016-10-26 03:25:24 +00:00
|
|
|
|
2018-04-09 10:30:48 +00:00
|
|
|
switch (d_mode) {
|
|
|
|
case ESP_BT_NON_DISCOVERABLE:
|
|
|
|
disc_mode = BTA_DM_NON_DISC;
|
|
|
|
break;
|
|
|
|
case ESP_BT_LIMITED_DISCOVERABLE:
|
|
|
|
disc_mode = BTA_DM_LIMITED_DISC;
|
|
|
|
break;
|
|
|
|
case ESP_BT_GENERAL_DISCOVERABLE:
|
2016-10-26 03:25:24 +00:00
|
|
|
disc_mode = BTA_DM_GENERAL_DISC;
|
|
|
|
break;
|
|
|
|
default:
|
2018-04-09 10:30:48 +00:00
|
|
|
BTC_TRACE_WARNING("invalid discovery mode (0x%x)", d_mode);
|
2017-02-24 09:28:33 +00:00
|
|
|
return;
|
2016-10-26 03:25:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
BTA_DmSetVisibility(disc_mode, conn_mode, BTA_DM_IGNORE, BTA_DM_IGNORE);
|
2017-02-24 09:28:33 +00:00
|
|
|
return;
|
|
|
|
}
|
2016-11-24 18:10:15 +00:00
|
|
|
|
2017-11-24 09:28:43 +00:00
|
|
|
static void btc_gap_bt_start_discovery(btc_gap_bt_args_t *arg)
|
|
|
|
{
|
|
|
|
tBTA_DM_INQ inq_params;
|
|
|
|
tBTA_SERVICE_MASK services = 0;
|
|
|
|
|
|
|
|
BTIF_TRACE_EVENT("%s", __FUNCTION__);
|
|
|
|
|
|
|
|
inq_params.mode = (arg->start_disc.mode == ESP_BT_INQ_MODE_GENERAL_INQUIRY) ?
|
|
|
|
BTA_DM_GENERAL_INQUIRY : BTA_DM_LIMITED_INQUIRY;
|
|
|
|
inq_params.duration = arg->start_disc.inq_len;
|
|
|
|
inq_params.max_resps = arg->start_disc.num_rsps;
|
|
|
|
|
|
|
|
inq_params.report_dup = TRUE;
|
|
|
|
inq_params.filter_type = BTA_DM_INQ_CLR;
|
|
|
|
/* TODO: Filter device by BDA needs to be implemented here */
|
|
|
|
|
|
|
|
/* Will be enabled to TRUE once inquiry busy level has been received */
|
|
|
|
btc_gap_bt_inquiry_in_progress = FALSE;
|
|
|
|
/* find nearby devices */
|
|
|
|
BTA_DmSearch(&inq_params, services, bte_search_devices_evt);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void btc_gap_bt_cancel_discovery(void)
|
|
|
|
{
|
|
|
|
BTA_DmSearchCancel();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void btc_gap_bt_get_remote_services(bt_bdaddr_t *remote_bda)
|
|
|
|
{
|
|
|
|
BTA_DmDiscover(remote_bda->address, BTA_ALL_SERVICE_MASK,
|
|
|
|
bte_dm_search_services_evt, TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void btc_gap_bt_get_remote_service_record(btc_gap_bt_args_t *arg)
|
|
|
|
{
|
|
|
|
esp_bt_uuid_t *uuid = &arg->get_rmt_srv_rcd.uuid;
|
|
|
|
bt_bdaddr_t *remote_bda = &arg->get_rmt_srv_rcd.bda;
|
|
|
|
|
|
|
|
tSDP_UUID sdp_uuid;
|
|
|
|
|
|
|
|
sdp_uuid.len = uuid->len;
|
|
|
|
memcpy(&sdp_uuid.uu, &uuid->uuid, uuid->len);
|
|
|
|
|
|
|
|
BTA_DmDiscoverUUID(remote_bda->address, &sdp_uuid,
|
|
|
|
bte_dm_remote_service_record_evt, TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
**
|
|
|
|
** Function search_devices_copy_cb
|
|
|
|
**
|
|
|
|
** Description Deep copy callback for search devices event
|
|
|
|
**
|
|
|
|
** Returns void
|
|
|
|
**
|
|
|
|
*******************************************************************************/
|
|
|
|
static void search_devices_copy_cb(btc_msg_t *msg, void *p_dest, void *p_src)
|
|
|
|
{
|
2018-05-16 10:58:13 +00:00
|
|
|
tBTA_DM_SEARCH_PARAM *p_dest_data = (tBTA_DM_SEARCH_PARAM *) p_dest;
|
|
|
|
tBTA_DM_SEARCH_PARAM *p_src_data = (tBTA_DM_SEARCH_PARAM *) p_src;
|
2017-11-24 09:28:43 +00:00
|
|
|
if (!p_src) {
|
|
|
|
return;
|
|
|
|
}
|
2018-05-16 10:58:13 +00:00
|
|
|
p_dest_data->p_data = (void *)osi_malloc(p_dest_data->len);
|
|
|
|
memset(p_dest_data->p_data, 0x00, p_dest_data->len);
|
|
|
|
memcpy(p_dest_data->p_data, p_src_data->p_data, p_dest_data->len);
|
2017-11-24 09:28:43 +00:00
|
|
|
|
2018-05-16 10:58:13 +00:00
|
|
|
if ( p_dest_data->len > sizeof(tBTA_DM_SEARCH)){
|
|
|
|
switch (p_dest_data->event) {
|
|
|
|
case BTA_DM_INQ_RES_EVT: {
|
|
|
|
if (p_src_data->p_data->inq_res.p_eir) {
|
2018-06-29 03:40:46 +00:00
|
|
|
p_dest_data->p_data->inq_res.p_eir = (UINT8 *)(p_dest_data->p_data) + sizeof(tBTA_DM_SEARCH);
|
2018-05-16 10:58:13 +00:00
|
|
|
memcpy(p_dest_data->p_data->inq_res.p_eir, p_src_data->p_data->inq_res.p_eir, HCI_EXT_INQ_RESPONSE_LEN);
|
|
|
|
}
|
2017-11-24 09:28:43 +00:00
|
|
|
}
|
2018-05-16 10:58:13 +00:00
|
|
|
break;
|
2017-11-24 09:28:43 +00:00
|
|
|
|
2018-05-16 10:58:13 +00:00
|
|
|
case BTA_DM_DISC_RES_EVT: {
|
|
|
|
if (p_src_data->p_data->disc_res.raw_data_size && p_src_data->p_data->disc_res.p_raw_data) {
|
2018-06-29 03:40:46 +00:00
|
|
|
p_dest_data->p_data->disc_res.p_raw_data = (UINT8 *)(p_dest_data->p_data) + sizeof(tBTA_DM_SEARCH);
|
2018-05-16 10:58:13 +00:00
|
|
|
memcpy(p_dest_data->p_data->disc_res.p_raw_data,
|
|
|
|
p_src_data->p_data->disc_res.p_raw_data,
|
|
|
|
p_src_data->p_data->disc_res.raw_data_size);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2017-11-24 09:28:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
**
|
|
|
|
** Function search_service_record_copy_cb
|
|
|
|
**
|
|
|
|
** Description Deep copy callback for search service record event
|
|
|
|
**
|
|
|
|
** Returns void
|
|
|
|
**
|
|
|
|
*******************************************************************************/
|
|
|
|
static void search_service_record_copy_cb(btc_msg_t *msg, void *p_dest, void *p_src)
|
|
|
|
{
|
2018-05-16 10:58:13 +00:00
|
|
|
tBTA_DM_SEARCH_PARAM *p_dest_data = (tBTA_DM_SEARCH_PARAM *) p_dest;
|
|
|
|
tBTA_DM_SEARCH_PARAM *p_src_data = (tBTA_DM_SEARCH_PARAM *) p_src;
|
2017-11-24 09:28:43 +00:00
|
|
|
|
|
|
|
if (!p_src) {
|
|
|
|
return;
|
|
|
|
}
|
2018-05-16 10:58:13 +00:00
|
|
|
p_dest_data->p_data = osi_malloc(p_dest_data->len);
|
|
|
|
memset(p_dest_data->p_data, 0x00, p_dest_data->len);
|
|
|
|
memcpy(p_dest_data->p_data, p_src_data->p_data, p_dest_data->len);
|
|
|
|
if ( p_dest_data->len > sizeof(tBTA_DM_SEARCH)){
|
|
|
|
switch (p_dest_data->event) {
|
|
|
|
case BTA_DM_DISC_RES_EVT: {
|
|
|
|
if (p_src_data->p_data->disc_res.p_raw_data && p_src_data->p_data->disc_res.raw_data_size > 0) {
|
2018-06-29 03:40:46 +00:00
|
|
|
p_dest_data->p_data->disc_res.p_raw_data = (UINT8 *)(p_dest_data->p_data) + sizeof(tBTA_DM_SEARCH);
|
2018-05-16 10:58:13 +00:00
|
|
|
memcpy(p_dest_data->p_data->disc_res.p_raw_data,
|
|
|
|
p_src_data->p_data->disc_res.p_raw_data,
|
|
|
|
p_src_data->p_data->disc_res.raw_data_size);
|
|
|
|
}
|
2017-11-24 09:28:43 +00:00
|
|
|
}
|
|
|
|
break;
|
2018-05-16 10:58:13 +00:00
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2017-11-24 09:28:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
**
|
|
|
|
** Function check_eir_remote_name
|
|
|
|
**
|
|
|
|
** Description Check if remote name is in the EIR data
|
|
|
|
**
|
|
|
|
** Returns TRUE if remote name found
|
|
|
|
** Populate p_remote_name, if provided and remote name found
|
|
|
|
**
|
|
|
|
*******************************************************************************/
|
|
|
|
static BOOLEAN check_eir_remote_name(tBTA_DM_SEARCH *p_search_data,
|
|
|
|
UINT8 *p_remote_name, UINT8 *p_remote_name_len)
|
|
|
|
{
|
|
|
|
UINT8 *p_eir_remote_name = NULL;
|
|
|
|
UINT8 remote_name_len = 0;
|
|
|
|
|
|
|
|
/* Check EIR for remote name and services */
|
|
|
|
if (p_search_data->inq_res.p_eir) {
|
|
|
|
p_eir_remote_name = BTM_CheckEirData(p_search_data->inq_res.p_eir,
|
|
|
|
BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len);
|
|
|
|
if (!p_eir_remote_name) {
|
|
|
|
p_eir_remote_name = BTM_CheckEirData(p_search_data->inq_res.p_eir,
|
|
|
|
BTM_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (p_eir_remote_name) {
|
|
|
|
if (remote_name_len > BD_NAME_LEN) {
|
|
|
|
remote_name_len = BD_NAME_LEN;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (p_remote_name && p_remote_name_len) {
|
|
|
|
memcpy(p_remote_name, p_eir_remote_name, remote_name_len);
|
|
|
|
*(p_remote_name + remote_name_len) = 0;
|
|
|
|
*p_remote_name_len = remote_name_len;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
**
|
|
|
|
** Function bte_search_devices_evt
|
|
|
|
**
|
|
|
|
** Description Switches context from BTE to BTIF for DM search events
|
|
|
|
**
|
|
|
|
** Returns void
|
|
|
|
**
|
|
|
|
*******************************************************************************/
|
|
|
|
static void bte_search_devices_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data)
|
|
|
|
{
|
2018-05-16 10:58:13 +00:00
|
|
|
tBTA_DM_SEARCH_PARAM search;
|
|
|
|
search.event = event;
|
|
|
|
search.p_data = p_data;
|
|
|
|
|
2017-11-24 09:28:43 +00:00
|
|
|
UINT16 param_len = 0;
|
|
|
|
|
|
|
|
if (p_data) {
|
|
|
|
param_len += sizeof(tBTA_DM_SEARCH);
|
|
|
|
}
|
|
|
|
/* Allocate buffer to hold the pointers (deep copy). The pointers will point to the end of the tBTA_DM_SEARCH */
|
|
|
|
switch (event) {
|
|
|
|
case BTA_DM_INQ_RES_EVT: {
|
|
|
|
if (p_data->inq_res.p_eir) {
|
|
|
|
param_len += HCI_EXT_INQ_RESPONSE_LEN;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BTA_DM_DISC_RES_EVT: {
|
|
|
|
if (p_data->disc_res.raw_data_size && p_data->disc_res.p_raw_data) {
|
|
|
|
param_len += p_data->disc_res.raw_data_size;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if remote name is available in EIR, set the flag so that stack doesn't trigger RNR */
|
|
|
|
if (event == BTA_DM_INQ_RES_EVT) {
|
|
|
|
p_data->inq_res.remt_name_not_required = check_eir_remote_name(p_data, NULL, NULL);
|
|
|
|
}
|
|
|
|
|
2018-05-16 10:58:13 +00:00
|
|
|
search.len = param_len;
|
2017-11-24 09:28:43 +00:00
|
|
|
do {
|
|
|
|
btc_msg_t msg;
|
2018-05-16 10:58:13 +00:00
|
|
|
msg.sig = BTC_SIG_API_CB;
|
2017-11-24 09:28:43 +00:00
|
|
|
msg.pid = BTC_PID_GAP_BT;
|
2018-05-16 10:58:13 +00:00
|
|
|
msg.act = BTC_GAP_BT_SEARCH_DEVICES_EVT;
|
2017-11-24 09:28:43 +00:00
|
|
|
|
2018-05-16 10:58:13 +00:00
|
|
|
btc_transfer_context(&msg, &search, sizeof(tBTA_DM_SEARCH_PARAM), search_devices_copy_cb);
|
2017-11-24 09:28:43 +00:00
|
|
|
} while (0);
|
|
|
|
}
|
|
|
|
|
2018-05-16 10:58:13 +00:00
|
|
|
static void btc_gap_bt_search_devices_evt(tBTA_DM_SEARCH_PARAM *p_data)
|
2017-11-24 09:28:43 +00:00
|
|
|
{
|
2018-05-16 10:58:13 +00:00
|
|
|
switch (p_data->event) {
|
2017-11-24 09:28:43 +00:00
|
|
|
case BTA_DM_DISC_RES_EVT: {
|
|
|
|
/* remote name update */
|
2018-05-16 10:58:13 +00:00
|
|
|
uint32_t bdname_len = strlen((const char *)p_data->p_data->disc_res.bd_name);
|
2017-11-24 09:28:43 +00:00
|
|
|
if (bdname_len) {
|
|
|
|
esp_bt_gap_dev_prop_t prop[1];
|
|
|
|
|
2018-05-16 10:58:13 +00:00
|
|
|
BTC_STORAGE_FILL_PROPERTY(&prop[0], ESP_BT_GAP_DEV_PROP_BDNAME, bdname_len + 1, p_data->p_data->disc_res.bd_name);
|
2017-11-24 09:28:43 +00:00
|
|
|
|
|
|
|
esp_bt_gap_cb_param_t param;
|
2018-05-16 10:58:13 +00:00
|
|
|
bdcpy(param.disc_res.bda, p_data->p_data->disc_res.bd_addr);
|
2017-11-24 09:28:43 +00:00
|
|
|
param.disc_res.num_prop = 1;
|
|
|
|
param.disc_res.prop = prop;
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_DISC_RES_EVT, ¶m);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BTA_DM_INQ_RES_EVT: {
|
|
|
|
/* inquiry result */
|
2018-05-16 10:58:13 +00:00
|
|
|
uint32_t cod = devclass2uint (p_data->p_data->inq_res.dev_class);
|
2017-11-24 09:28:43 +00:00
|
|
|
|
|
|
|
if (cod == 0) {
|
2018-04-25 02:11:06 +00:00
|
|
|
BTC_TRACE_DEBUG("%s cod is 0, set as unclassified", __func__);
|
2017-11-24 09:28:43 +00:00
|
|
|
cod = COD_UNCLASSIFIED;
|
|
|
|
}
|
|
|
|
|
|
|
|
do {
|
|
|
|
esp_bt_gap_dev_prop_t prop[3];
|
|
|
|
int num_prop = 0;
|
|
|
|
|
|
|
|
memset(prop, 0, sizeof(prop));
|
|
|
|
BTC_STORAGE_FILL_PROPERTY(&prop[0], ESP_BT_GAP_DEV_PROP_COD, sizeof(cod), &cod);
|
|
|
|
num_prop++;
|
|
|
|
|
2018-05-16 10:58:13 +00:00
|
|
|
BTC_STORAGE_FILL_PROPERTY(&prop[1], ESP_BT_GAP_DEV_PROP_RSSI, 1, &(p_data->p_data->inq_res.rssi));
|
2017-11-24 09:28:43 +00:00
|
|
|
num_prop++;
|
|
|
|
|
2018-05-16 10:58:13 +00:00
|
|
|
if (p_data->p_data->inq_res.p_eir) {
|
|
|
|
BTC_STORAGE_FILL_PROPERTY(&prop[2], ESP_BT_GAP_DEV_PROP_EIR, HCI_EXT_INQ_RESPONSE_LEN, p_data->p_data->inq_res.p_eir);
|
2017-11-24 09:28:43 +00:00
|
|
|
num_prop++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Callback to notify upper layer of device */
|
|
|
|
esp_bt_gap_cb_param_t param;
|
2018-05-16 10:58:13 +00:00
|
|
|
bdcpy(param.disc_res.bda, p_data->p_data->inq_res.bd_addr);
|
2017-11-24 09:28:43 +00:00
|
|
|
param.disc_res.num_prop = num_prop;
|
|
|
|
param.disc_res.prop = prop;
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_DISC_RES_EVT, ¶m);
|
|
|
|
} while (0);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BTA_DM_INQ_CMPL_EVT:
|
|
|
|
break;
|
|
|
|
case BTA_DM_DISC_CMPL_EVT: {
|
|
|
|
esp_bt_gap_cb_param_t param;
|
|
|
|
param.disc_st_chg.state = ESP_BT_GAP_DISCOVERY_STOPPED;
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_DISC_STATE_CHANGED_EVT, ¶m);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BTA_DM_SEARCH_CANCEL_CMPL_EVT: {
|
|
|
|
/* if inquiry is not in progress and we get a cancel event, then
|
|
|
|
* it means we are done with inquiry, but remote_name fetches are in
|
|
|
|
* progress
|
|
|
|
*
|
|
|
|
* if inquiry is in progress, then we don't want to act on this cancel_cmpl_evt
|
|
|
|
* but instead wait for the cancel_cmpl_evt_via the busy level
|
|
|
|
*/
|
|
|
|
if (btc_gap_bt_inquiry_in_progress == false) {
|
|
|
|
esp_bt_gap_cb_param_t param;
|
|
|
|
param.disc_st_chg.state = ESP_BT_GAP_DISCOVERY_STOPPED;
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_DISC_STATE_CHANGED_EVT, ¶m);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/*******************************************************************************
|
|
|
|
**
|
|
|
|
** Function btc_gap_bt_search_service_record
|
|
|
|
**
|
|
|
|
** Description Executes search service record event in btif context
|
|
|
|
**
|
|
|
|
** Returns void
|
|
|
|
**
|
|
|
|
*******************************************************************************/
|
2018-05-16 10:58:13 +00:00
|
|
|
static void btc_gap_bt_search_service_record(char *p_param)
|
2017-11-24 09:28:43 +00:00
|
|
|
{
|
2018-05-16 10:58:13 +00:00
|
|
|
tBTA_DM_SEARCH_PARAM *p_data = (tBTA_DM_SEARCH_PARAM *)p_param;
|
2017-11-24 09:28:43 +00:00
|
|
|
|
2018-05-16 10:58:13 +00:00
|
|
|
switch (p_data->event) {
|
2017-11-24 09:28:43 +00:00
|
|
|
case BTA_DM_DISC_RES_EVT: {
|
|
|
|
esp_bt_gap_cb_param_t param;
|
2018-05-16 10:58:13 +00:00
|
|
|
memcpy(param.rmt_srvcs.bda, p_data->p_data->disc_res.bd_addr, BD_ADDR_LEN);
|
|
|
|
if (p_data->p_data->disc_res.p_raw_data && p_data->p_data->disc_res.raw_data_size > 0) {
|
2017-11-24 09:28:43 +00:00
|
|
|
param.rmt_srvc_rec.stat = ESP_BT_STATUS_SUCCESS;
|
2018-05-16 10:58:13 +00:00
|
|
|
// param.rmt_srvc_rec.raw_data_size = p_data->p_data->disc_res.raw_data_size;
|
|
|
|
// param.rmt_srvc_rec.raw_data = p_data->p_data->disc_res.p_raw_data;
|
2017-11-24 09:28:43 +00:00
|
|
|
} else {
|
|
|
|
param.rmt_srvc_rec.stat = ESP_BT_STATUS_FAIL;
|
|
|
|
// param.rmt_srvc_rec.raw_data_size = 0;
|
|
|
|
// param.rmt_srvc_rec.raw_data = NULL;
|
|
|
|
}
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_RMT_SRVC_REC_EVT, ¶m);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case BTA_DM_DISC_CMPL_EVT:
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
**
|
|
|
|
** Function bte_dm_remote_service_record_evt
|
|
|
|
**
|
|
|
|
** Description Switches context from BTE to BTC for DM search service
|
|
|
|
** record event
|
|
|
|
**
|
|
|
|
** Returns void
|
|
|
|
**
|
|
|
|
*******************************************************************************/
|
|
|
|
static void bte_dm_remote_service_record_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data)
|
|
|
|
{
|
2018-05-16 10:58:13 +00:00
|
|
|
tBTA_DM_SEARCH_PARAM search;
|
|
|
|
search.event = event;
|
|
|
|
search.p_data = p_data;
|
2017-11-24 09:28:43 +00:00
|
|
|
UINT16 param_len = 0;
|
|
|
|
|
|
|
|
if (p_data) {
|
|
|
|
param_len += sizeof(tBTA_DM_SEARCH);
|
|
|
|
}
|
|
|
|
/* Allocate buffer to hold the pointers (deep copy). The pointers will point to the end of the tBTA_DM_SEARCH */
|
|
|
|
if (event == BTA_DM_DISC_RES_EVT) {
|
|
|
|
if (p_data->disc_res.raw_data_size && p_data->disc_res.p_raw_data) {
|
|
|
|
param_len += p_data->disc_res.raw_data_size;
|
|
|
|
}
|
|
|
|
}
|
2018-05-16 10:58:13 +00:00
|
|
|
search.len = param_len;
|
2017-11-24 09:28:43 +00:00
|
|
|
do {
|
|
|
|
btc_msg_t msg;
|
2018-05-16 10:58:13 +00:00
|
|
|
msg.sig = BTC_SIG_API_CB;
|
2017-11-24 09:28:43 +00:00
|
|
|
msg.pid = BTC_PID_GAP_BT;
|
2018-05-16 10:58:13 +00:00
|
|
|
msg.act = BTC_GAP_BT_SEARCH_SERVICE_RECORD_EVT;
|
|
|
|
btc_transfer_context(&msg, &search, sizeof(tBTA_DM_SEARCH_PARAM), search_service_record_copy_cb);
|
2017-11-24 09:28:43 +00:00
|
|
|
} while (0);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
**
|
|
|
|
** Function btc_gap_bt_search_services
|
|
|
|
**
|
|
|
|
** Description Executes search services event in btc context
|
|
|
|
**
|
|
|
|
** Returns void
|
|
|
|
**
|
|
|
|
*******************************************************************************/
|
2018-05-16 10:58:13 +00:00
|
|
|
static void btc_gap_bt_search_services(char *p_param)
|
2017-11-24 09:28:43 +00:00
|
|
|
{
|
2018-05-16 10:58:13 +00:00
|
|
|
tBTA_DM_SEARCH_PARAM *p_data = (tBTA_DM_SEARCH_PARAM *)p_param;
|
2017-11-24 09:28:43 +00:00
|
|
|
|
2018-05-16 10:58:13 +00:00
|
|
|
switch (p_data->event) {
|
2017-11-24 09:28:43 +00:00
|
|
|
case BTA_DM_DISC_RES_EVT: {
|
|
|
|
esp_bt_gap_cb_param_t param;
|
|
|
|
esp_bt_uuid_t *uuid_list = NULL;
|
2018-05-16 10:58:13 +00:00
|
|
|
memcpy(param.rmt_srvcs.bda, p_data->p_data->disc_res.bd_addr, BD_ADDR_LEN);
|
2017-11-24 09:28:43 +00:00
|
|
|
|
|
|
|
param.rmt_srvcs.stat = ESP_BT_STATUS_FAIL;
|
2018-05-16 10:58:13 +00:00
|
|
|
if (p_data->p_data->disc_res.result == BTA_SUCCESS) {
|
2018-07-11 06:33:55 +00:00
|
|
|
uuid_list = osi_malloc(sizeof(esp_bt_uuid_t) * p_data->p_data->disc_res.num_uuids);
|
2017-11-24 09:28:43 +00:00
|
|
|
if (uuid_list) {
|
|
|
|
param.rmt_srvcs.stat = ESP_BT_STATUS_SUCCESS;
|
2018-05-16 10:58:13 +00:00
|
|
|
param.rmt_srvcs.num_uuids = p_data->p_data->disc_res.num_uuids;
|
2017-11-24 09:28:43 +00:00
|
|
|
param.rmt_srvcs.uuid_list = uuid_list;
|
|
|
|
// copy UUID list
|
2018-05-16 10:58:13 +00:00
|
|
|
uint8_t *i_uu = (uint8_t *)p_data->p_data->disc_res.p_uuid_list;
|
2017-11-24 09:28:43 +00:00
|
|
|
esp_bt_uuid_t *o_uu = uuid_list;
|
2018-05-16 10:58:13 +00:00
|
|
|
for (int i = 0; i < p_data->p_data->disc_res.num_uuids; i++, i_uu += ESP_UUID_LEN_128, o_uu++) {
|
2017-11-24 09:28:43 +00:00
|
|
|
uuid128_be_to_esp_uuid(o_uu, i_uu);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (param.rmt_srvcs.stat == ESP_BT_STATUS_FAIL) {
|
|
|
|
param.rmt_srvcs.num_uuids = 0;
|
|
|
|
param.rmt_srvcs.uuid_list = NULL;
|
|
|
|
}
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_RMT_SRVCS_EVT, ¶m);
|
|
|
|
|
|
|
|
if (uuid_list) {
|
|
|
|
osi_free(uuid_list);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BTA_DM_DISC_BLE_RES_EVT:
|
|
|
|
case BTA_DM_DISC_CMPL_EVT:
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
**
|
|
|
|
** Function bte_dm_search_services_evt
|
|
|
|
**
|
|
|
|
** Description Switches context from BTE to BTIF for DM search services
|
|
|
|
** event
|
|
|
|
**
|
|
|
|
** Returns void
|
|
|
|
**
|
|
|
|
*******************************************************************************/
|
|
|
|
static void bte_dm_search_services_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data)
|
|
|
|
{
|
2018-05-16 10:58:13 +00:00
|
|
|
tBTA_DM_SEARCH_PARAM search;
|
|
|
|
search.event = event;
|
|
|
|
search.p_data = p_data;
|
|
|
|
|
2017-11-24 09:28:43 +00:00
|
|
|
UINT16 param_len = 0;
|
|
|
|
if (p_data) {
|
|
|
|
param_len += sizeof(tBTA_DM_SEARCH);
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (event) {
|
|
|
|
case BTA_DM_DISC_RES_EVT: {
|
|
|
|
if ((p_data->disc_res.result == BTA_SUCCESS) && (p_data->disc_res.num_uuids > 0)) {
|
|
|
|
param_len += (p_data->disc_res.num_uuids * MAX_UUID_SIZE);
|
|
|
|
}
|
|
|
|
} break;
|
|
|
|
}
|
2018-05-16 10:58:13 +00:00
|
|
|
search.len = param_len;
|
2017-11-24 09:28:43 +00:00
|
|
|
do {
|
|
|
|
btc_msg_t msg;
|
2018-05-16 10:58:13 +00:00
|
|
|
msg.sig = BTC_SIG_API_CB;
|
2017-11-24 09:28:43 +00:00
|
|
|
msg.pid = BTC_PID_GAP_BT;
|
2018-05-16 10:58:13 +00:00
|
|
|
msg.act = BTC_GAP_BT_SEARCH_SERVICES_EVT;
|
|
|
|
btc_transfer_context(&msg, &search, sizeof(tBTA_DM_SEARCH_PARAM), search_services_copy_cb);
|
2017-11-24 09:28:43 +00:00
|
|
|
} while (0);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void search_services_copy_cb(btc_msg_t *msg, void *p_dest, void *p_src)
|
|
|
|
{
|
2018-05-16 10:58:13 +00:00
|
|
|
tBTA_DM_SEARCH_PARAM *p_dest_data = (tBTA_DM_SEARCH_PARAM *) p_dest;
|
|
|
|
tBTA_DM_SEARCH_PARAM *p_src_data = (tBTA_DM_SEARCH_PARAM *) p_src;
|
2017-11-24 09:28:43 +00:00
|
|
|
|
|
|
|
if (!p_src) {
|
|
|
|
return;
|
|
|
|
}
|
2018-05-16 10:58:13 +00:00
|
|
|
p_dest_data->p_data = osi_malloc(p_dest_data->len);
|
|
|
|
memset(p_dest_data->p_data, 0x00, p_dest_data->len);
|
|
|
|
memcpy(p_dest_data->p_data, p_src_data->p_data, p_dest_data->len);
|
|
|
|
|
|
|
|
if ( p_dest_data->len > sizeof(tBTA_DM_SEARCH)){
|
|
|
|
switch (p_dest_data->event) {
|
|
|
|
case BTA_DM_DISC_RES_EVT: {
|
|
|
|
if (p_src_data->p_data->disc_res.result == BTA_SUCCESS) {
|
|
|
|
if (p_src_data->p_data->disc_res.num_uuids > 0) {
|
2018-06-29 03:40:46 +00:00
|
|
|
p_dest_data->p_data->disc_res.p_uuid_list = (UINT8 *)(p_dest_data->p_data) + sizeof(tBTA_DM_SEARCH);
|
2018-05-16 10:58:13 +00:00
|
|
|
memcpy(p_dest_data->p_data->disc_res.p_uuid_list, p_src_data->p_data->disc_res.p_uuid_list,
|
|
|
|
p_src_data->p_data->disc_res.num_uuids * MAX_UUID_SIZE);
|
|
|
|
osi_free(p_src_data->p_data->disc_res.p_uuid_list);
|
|
|
|
p_src_data->p_data->disc_res.p_uuid_list = NULL;
|
|
|
|
}
|
|
|
|
if (p_src_data->p_data->disc_res.p_raw_data != NULL) {
|
|
|
|
osi_free(p_src_data->p_data->disc_res.p_raw_data);
|
|
|
|
p_src_data->p_data->disc_res.p_raw_data = NULL;
|
|
|
|
}
|
2017-11-24 09:28:43 +00:00
|
|
|
}
|
2018-05-16 10:58:13 +00:00
|
|
|
} break;
|
2017-11-24 09:28:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-09 11:25:26 +00:00
|
|
|
static void btc_gap_bt_set_cod(btc_gap_bt_args_t *arg)
|
|
|
|
{
|
|
|
|
tBTA_UTL_COD p_cod;
|
|
|
|
esp_bt_cod_t *cod = &(arg->set_cod.cod);
|
|
|
|
p_cod.minor = cod->minor << 2;
|
|
|
|
p_cod.major = cod->major;
|
|
|
|
p_cod.service = cod->service << 5;
|
|
|
|
bool ret = utl_set_device_class(&p_cod, arg->set_cod.mode);
|
|
|
|
if (!ret){
|
2018-04-25 02:11:06 +00:00
|
|
|
BTC_TRACE_ERROR("%s set class of device failed!",__func__);
|
2018-04-09 11:25:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
esp_err_t btc_gap_bt_get_cod(esp_bt_cod_t *cod)
|
|
|
|
{
|
|
|
|
tBTA_UTL_COD p_cod;
|
|
|
|
bool ret = utl_get_device_class(&p_cod);
|
|
|
|
if (!ret){
|
2018-04-25 02:11:06 +00:00
|
|
|
BTC_TRACE_ERROR("%s get class of device failed!",__func__);
|
2018-04-09 11:25:26 +00:00
|
|
|
return ESP_BT_STATUS_FAIL;
|
|
|
|
}
|
|
|
|
cod->minor = p_cod.minor >> 2;
|
|
|
|
cod->major = p_cod.major;
|
|
|
|
cod->service = p_cod.service >> 5;
|
|
|
|
return ESP_BT_STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2018-01-16 10:36:31 +00:00
|
|
|
static void btc_gap_bt_read_rssi_delta_cmpl_callback(void *p_data)
|
|
|
|
{
|
|
|
|
tBTA_RSSI_RESULTS *result = (tBTA_RSSI_RESULTS *)p_data;
|
|
|
|
esp_bt_gap_cb_param_t param;
|
|
|
|
bt_status_t ret;
|
|
|
|
btc_msg_t msg;
|
|
|
|
msg.sig = BTC_SIG_API_CB;
|
|
|
|
msg.pid = BTC_PID_GAP_BT;
|
2018-05-16 10:58:13 +00:00
|
|
|
msg.act = BTC_GAP_BT_READ_RSSI_DELTA_EVT;
|
2018-01-16 10:36:31 +00:00
|
|
|
memcpy(param.read_rssi_delta.bda, result->rem_bda, sizeof(BD_ADDR));
|
|
|
|
param.read_rssi_delta.stat = btc_btm_status_to_esp_status(result->status);
|
|
|
|
param.read_rssi_delta.rssi_delta = result->rssi;
|
|
|
|
|
|
|
|
ret = btc_transfer_context(&msg, ¶m,
|
|
|
|
sizeof(esp_bt_gap_cb_param_t), NULL);
|
|
|
|
|
|
|
|
if (ret != BT_STATUS_SUCCESS) {
|
2018-05-16 10:58:13 +00:00
|
|
|
BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__);
|
2018-01-16 10:36:31 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void btc_gap_bt_read_rssi_delta(btc_gap_bt_args_t *arg)
|
|
|
|
{
|
2018-06-21 13:43:46 +00:00
|
|
|
BTA_DmBleReadRSSI(arg->read_rssi_delta.bda.address, BTA_TRANSPORT_BR_EDR, btc_gap_bt_read_rssi_delta_cmpl_callback);
|
2018-01-16 10:36:31 +00:00
|
|
|
}
|
|
|
|
|
2018-07-10 03:18:52 +00:00
|
|
|
static esp_err_t btc_gap_bt_remove_bond_device(btc_gap_bt_args_t *arg)
|
2018-05-03 11:05:57 +00:00
|
|
|
{
|
|
|
|
BD_ADDR bd_addr;
|
|
|
|
memcpy(bd_addr, arg->rm_bond_device.bda.address, sizeof(BD_ADDR));
|
2018-06-22 03:54:40 +00:00
|
|
|
if(BTA_DmRemoveDevice(bd_addr, BT_TRANSPORT_BR_EDR) == BTA_SUCCESS){
|
2018-05-03 11:05:57 +00:00
|
|
|
return ESP_BT_STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
return ESP_BT_STATUS_FAIL;
|
|
|
|
}
|
|
|
|
|
2018-09-04 13:11:03 +00:00
|
|
|
static void btc_gap_bt_set_pin_type(btc_gap_bt_args_t *arg){
|
|
|
|
BTA_DMSetPinType (arg->set_pin_type.pin_type, arg->set_pin_type.pin_code, arg->set_pin_type.pin_code_len);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void btc_gap_bt_pin_reply(btc_gap_bt_args_t *arg){
|
|
|
|
BTA_DmPinReply(arg->pin_reply.bda.address, arg->pin_reply.accept, arg->pin_reply.pin_code_len, arg->pin_reply.pin_code);
|
|
|
|
}
|
|
|
|
|
2018-07-10 03:18:52 +00:00
|
|
|
#if (BT_SSP_INCLUDED == TRUE)
|
|
|
|
static esp_err_t btc_gap_bt_set_security_param(btc_gap_bt_args_t *arg)
|
|
|
|
{
|
|
|
|
esp_err_t ret;
|
|
|
|
switch(arg->set_security_param.param_type) {
|
|
|
|
case ESP_BT_SP_IOCAP_MODE:{
|
|
|
|
uint8_t iocap = 0;
|
|
|
|
uint8_t *p = arg->set_security_param.value;
|
|
|
|
STREAM_TO_UINT8(iocap, p);
|
|
|
|
ret = bta_dm_co_bt_set_io_cap(iocap);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
ret = ESP_BT_STATUS_FAIL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void btc_gap_bt_ssp_passkey_reply(btc_gap_bt_args_t *arg)
|
|
|
|
{
|
|
|
|
BTA_DmPasskeyReqReply(arg->passkey_reply.accept, arg->passkey_reply.bda.address, arg->passkey_reply.passkey);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void btc_gap_bt_ssp_confirm(btc_gap_bt_args_t *arg)
|
|
|
|
{
|
|
|
|
BTA_DmConfirm(arg->confirm_reply.bda.address, arg->confirm_reply.accept);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif ///BT_SSP_INCLUDED == TRUE
|
|
|
|
|
2019-06-03 11:29:54 +00:00
|
|
|
static void btc_gap_bt_config_eir(btc_gap_bt_args_t *arg)
|
|
|
|
{
|
|
|
|
tBTA_DM_EIR_CONF eir_config;
|
|
|
|
esp_bt_eir_data_t *eir_data = &arg->config_eir.eir_data;
|
|
|
|
|
|
|
|
eir_config.bta_dm_eir_fec_required = eir_data->fec_required;
|
|
|
|
eir_config.bta_dm_eir_included_tx_power = eir_data->include_txpower;
|
|
|
|
eir_config.bta_dm_eir_included_uuid = eir_data->include_uuid;
|
|
|
|
eir_config.bta_dm_eir_flags = eir_data->flag;
|
|
|
|
eir_config.bta_dm_eir_manufac_spec_len = eir_data->manufacturer_len;
|
|
|
|
eir_config.bta_dm_eir_manufac_spec = eir_data->p_manufacturer_data;
|
|
|
|
eir_config.bta_dm_eir_url_len = eir_data->url_len;
|
|
|
|
eir_config.bta_dm_eir_url = eir_data->p_url;
|
|
|
|
|
|
|
|
BTA_DmConfigEir(&eir_config);
|
|
|
|
}
|
|
|
|
|
2019-09-29 08:20:40 +00:00
|
|
|
static void btc_gap_bt_set_afh_channels_cmpl_callback(void *p_data)
|
|
|
|
{
|
|
|
|
tBTA_SET_AFH_CHANNELS_RESULTS *result = (tBTA_SET_AFH_CHANNELS_RESULTS *)p_data;
|
|
|
|
esp_bt_gap_cb_param_t param;
|
|
|
|
bt_status_t ret;
|
|
|
|
btc_msg_t msg;
|
|
|
|
msg.sig = BTC_SIG_API_CB;
|
|
|
|
msg.pid = BTC_PID_GAP_BT;
|
|
|
|
msg.act = BTC_GAP_BT_SET_AFH_CHANNELS_EVT;
|
|
|
|
|
|
|
|
param.set_afh_channels.stat = btc_btm_status_to_esp_status(result->status);
|
|
|
|
|
|
|
|
ret = btc_transfer_context(&msg, ¶m,
|
|
|
|
sizeof(esp_bt_gap_cb_param_t), NULL);
|
|
|
|
|
|
|
|
if (ret != BT_STATUS_SUCCESS) {
|
|
|
|
BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void btc_gap_bt_set_afh_channels(btc_gap_bt_args_t *arg)
|
|
|
|
{
|
|
|
|
BTA_DmSetAfhChannels(arg->set_afh_channels.channels, btc_gap_bt_set_afh_channels_cmpl_callback);
|
|
|
|
}
|
|
|
|
|
2019-10-30 07:06:29 +00:00
|
|
|
static void btc_gap_bt_read_remote_name_cmpl_callback(void *p_data)
|
|
|
|
{
|
|
|
|
tBTA_REMOTE_DEV_NAME *result = (tBTA_REMOTE_DEV_NAME *)p_data;
|
|
|
|
esp_bt_gap_cb_param_t param;
|
|
|
|
btc_msg_t msg;
|
|
|
|
bt_status_t ret;
|
|
|
|
msg.sig = BTC_SIG_API_CB;
|
|
|
|
msg.pid = BTC_PID_GAP_BT;
|
|
|
|
msg.act = BTC_GAP_BT_READ_REMOTE_NAME_EVT;
|
|
|
|
|
|
|
|
param.read_rmt_name.stat = btc_btm_status_to_esp_status(result->status);
|
|
|
|
memcpy(param.read_rmt_name.rmt_name,result->remote_bd_name,ESP_BT_GAP_MAX_BDNAME_LEN);
|
|
|
|
|
|
|
|
ret = btc_transfer_context(&msg, ¶m, sizeof(esp_bt_gap_cb_param_t), NULL);
|
|
|
|
if (ret != BT_STATUS_SUCCESS) {
|
|
|
|
BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void btc_gap_bt_read_remote_name(btc_gap_bt_args_t *arg)
|
|
|
|
{
|
|
|
|
BTA_DmGetRemoteName(arg->rmt_name_bda.address, btc_gap_bt_read_remote_name_cmpl_callback);
|
|
|
|
}
|
|
|
|
|
2018-07-10 03:18:52 +00:00
|
|
|
void btc_gap_bt_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src)
|
|
|
|
{
|
|
|
|
switch (msg->act) {
|
|
|
|
case BTC_GAP_BT_ACT_SET_SCAN_MODE:
|
|
|
|
case BTC_GAP_BT_ACT_START_DISCOVERY:
|
|
|
|
case BTC_GAP_BT_ACT_CANCEL_DISCOVERY:
|
|
|
|
case BTC_GAP_BT_ACT_GET_REMOTE_SERVICES:
|
|
|
|
case BTC_GAP_BT_ACT_GET_REMOTE_SERVICE_RECORD:
|
|
|
|
case BTC_GAP_BT_ACT_SET_COD:
|
|
|
|
case BTC_GAP_BT_ACT_READ_RSSI_DELTA:
|
|
|
|
case BTC_GAP_BT_ACT_REMOVE_BOND_DEVICE:
|
2018-09-04 13:11:03 +00:00
|
|
|
case BTC_GAP_BT_ACT_PIN_REPLY:
|
|
|
|
case BTC_GAP_BT_ACT_SET_PIN_TYPE:
|
2019-10-30 07:06:29 +00:00
|
|
|
case BTC_GAP_BT_ACT_SET_AFH_CHANNELS:
|
|
|
|
case BTC_GAP_BT_ACT_READ_REMOTE_NAME:
|
2018-07-10 03:18:52 +00:00
|
|
|
break;
|
|
|
|
#if (BT_SSP_INCLUDED == TRUE)
|
|
|
|
case BTC_GAP_BT_ACT_PASSKEY_REPLY:
|
|
|
|
case BTC_GAP_BT_ACT_CONFIRM_REPLY:
|
|
|
|
break;
|
|
|
|
case BTC_GAP_BT_ACT_SET_SECURITY_PARAM:{
|
|
|
|
btc_gap_bt_args_t *src = (btc_gap_bt_args_t *)p_src;
|
2019-06-03 11:29:54 +00:00
|
|
|
btc_gap_bt_args_t *dst = (btc_gap_bt_args_t *)p_dest;
|
2018-07-10 03:18:52 +00:00
|
|
|
if (src->set_security_param.value) {
|
2019-06-03 11:29:54 +00:00
|
|
|
dst->set_security_param.value = osi_malloc(src->set_security_param.len);
|
2018-07-10 03:18:52 +00:00
|
|
|
if (dst->set_security_param.value != NULL) {
|
2019-06-03 11:29:54 +00:00
|
|
|
memcpy(dst->set_security_param.value, src->set_security_param.value, src->set_security_param.len);
|
2018-07-10 03:18:52 +00:00
|
|
|
} else {
|
|
|
|
BTC_TRACE_ERROR("%s %d no mem\n",__func__, msg->act);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
#endif ///BT_SSP_INCLUDED == TRUE
|
2019-06-03 11:29:54 +00:00
|
|
|
|
|
|
|
case BTC_GAP_BT_ACT_CONFIG_EIR:{
|
|
|
|
btc_gap_bt_args_t *src = (btc_gap_bt_args_t *)p_src;
|
|
|
|
btc_gap_bt_args_t *dst = (btc_gap_bt_args_t *)p_dest;
|
|
|
|
if (src->config_eir.eir_data.p_manufacturer_data) {
|
|
|
|
dst->config_eir.eir_data.p_manufacturer_data = osi_malloc(src->config_eir.eir_data.manufacturer_len);
|
|
|
|
if (dst->config_eir.eir_data.p_manufacturer_data != NULL) {
|
|
|
|
memcpy(dst->config_eir.eir_data.p_manufacturer_data, src->config_eir.eir_data.p_manufacturer_data, src->config_eir.eir_data.manufacturer_len);
|
|
|
|
} else {
|
|
|
|
dst->config_eir.eir_data.manufacturer_len = 0;
|
|
|
|
BTC_TRACE_ERROR("%s %d no mem\n",__func__, msg->act);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (src->config_eir.eir_data.p_url) {
|
|
|
|
dst->config_eir.eir_data.p_url = osi_malloc(src->config_eir.eir_data.url_len);
|
|
|
|
if (dst->config_eir.eir_data.p_url != NULL) {
|
|
|
|
memcpy(dst->config_eir.eir_data.p_url, src->config_eir.eir_data.p_url, src->config_eir.eir_data.url_len);
|
|
|
|
} else {
|
|
|
|
dst->config_eir.eir_data.url_len = 0;
|
|
|
|
BTC_TRACE_ERROR("%s %d no mem\n",__func__, msg->act);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2018-07-10 03:18:52 +00:00
|
|
|
default:
|
|
|
|
BTC_TRACE_ERROR("Unhandled deep copy %d\n", msg->act);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void btc_gap_bt_arg_deep_free(btc_msg_t *msg)
|
|
|
|
{
|
|
|
|
btc_gap_bt_args_t *arg = (btc_gap_bt_args_t *)msg->arg;
|
|
|
|
switch (msg->act) {
|
|
|
|
case BTC_GAP_BT_ACT_SET_SCAN_MODE:
|
|
|
|
case BTC_GAP_BT_ACT_START_DISCOVERY:
|
|
|
|
case BTC_GAP_BT_ACT_CANCEL_DISCOVERY:
|
|
|
|
case BTC_GAP_BT_ACT_GET_REMOTE_SERVICES:
|
|
|
|
case BTC_GAP_BT_ACT_GET_REMOTE_SERVICE_RECORD:
|
|
|
|
case BTC_GAP_BT_ACT_SET_COD:
|
|
|
|
case BTC_GAP_BT_ACT_READ_RSSI_DELTA:
|
|
|
|
case BTC_GAP_BT_ACT_REMOVE_BOND_DEVICE:
|
2018-09-04 13:11:03 +00:00
|
|
|
case BTC_GAP_BT_ACT_PIN_REPLY:
|
|
|
|
case BTC_GAP_BT_ACT_SET_PIN_TYPE:
|
2019-10-30 07:06:29 +00:00
|
|
|
case BTC_GAP_BT_ACT_SET_AFH_CHANNELS:
|
|
|
|
case BTC_GAP_BT_ACT_READ_REMOTE_NAME:
|
2018-07-10 03:18:52 +00:00
|
|
|
break;
|
|
|
|
#if (BT_SSP_INCLUDED == TRUE)
|
|
|
|
case BTC_GAP_BT_ACT_PASSKEY_REPLY:
|
|
|
|
case BTC_GAP_BT_ACT_CONFIRM_REPLY:
|
|
|
|
break;
|
|
|
|
case BTC_GAP_BT_ACT_SET_SECURITY_PARAM:
|
2019-06-03 11:29:54 +00:00
|
|
|
if (arg->set_security_param.value) {
|
|
|
|
osi_free(arg->set_security_param.value);
|
|
|
|
}
|
2018-07-10 03:18:52 +00:00
|
|
|
break;
|
|
|
|
#endif ///BT_SSP_INCLUDED == TRUE
|
2019-06-03 11:29:54 +00:00
|
|
|
|
|
|
|
case BTC_GAP_BT_ACT_CONFIG_EIR:
|
|
|
|
if (arg->config_eir.eir_data.p_manufacturer_data) {
|
|
|
|
osi_free(arg->config_eir.eir_data.p_manufacturer_data);
|
|
|
|
}
|
|
|
|
if (arg->config_eir.eir_data.p_url) {
|
|
|
|
osi_free(arg->config_eir.eir_data.p_url);
|
|
|
|
}
|
|
|
|
break;
|
2018-07-10 03:18:52 +00:00
|
|
|
default:
|
2018-12-11 11:39:04 +00:00
|
|
|
BTC_TRACE_ERROR("Unhandled deep copy %d, arg: %p\n", msg->act, arg);
|
2018-07-10 03:18:52 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-02-24 09:28:33 +00:00
|
|
|
void btc_gap_bt_call_handler(btc_msg_t *msg)
|
|
|
|
{
|
|
|
|
btc_gap_bt_args_t *arg = (btc_gap_bt_args_t *)msg->arg;
|
2018-04-25 02:11:06 +00:00
|
|
|
BTC_TRACE_DEBUG("%s act %d\n", __func__, msg->act);
|
2017-02-24 09:28:33 +00:00
|
|
|
switch (msg->act) {
|
|
|
|
case BTC_GAP_BT_ACT_SET_SCAN_MODE: {
|
2018-04-09 10:30:48 +00:00
|
|
|
btc_bt_set_scan_mode(arg->set_scan_mode.c_mode, arg->set_scan_mode.d_mode);
|
2017-02-28 03:47:04 +00:00
|
|
|
break;
|
|
|
|
}
|
2017-11-24 09:28:43 +00:00
|
|
|
case BTC_GAP_BT_ACT_START_DISCOVERY: {
|
|
|
|
btc_gap_bt_start_discovery(msg->arg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BTC_GAP_BT_ACT_CANCEL_DISCOVERY: {
|
|
|
|
btc_gap_bt_cancel_discovery();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BTC_GAP_BT_ACT_GET_REMOTE_SERVICES: {
|
|
|
|
btc_gap_bt_get_remote_services(msg->arg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BTC_GAP_BT_ACT_GET_REMOTE_SERVICE_RECORD: {
|
|
|
|
btc_gap_bt_get_remote_service_record(msg->arg);
|
|
|
|
break;
|
|
|
|
}
|
2018-04-09 11:25:26 +00:00
|
|
|
case BTC_GAP_BT_ACT_SET_COD: {
|
|
|
|
btc_gap_bt_set_cod(msg->arg);
|
|
|
|
break;
|
|
|
|
}
|
2018-01-16 10:36:31 +00:00
|
|
|
case BTC_GAP_BT_ACT_READ_RSSI_DELTA: {
|
|
|
|
btc_gap_bt_read_rssi_delta(msg->arg);
|
|
|
|
break;
|
|
|
|
}
|
2018-05-03 11:05:57 +00:00
|
|
|
case BTC_GAP_BT_ACT_REMOVE_BOND_DEVICE:{
|
|
|
|
btc_gap_bt_remove_bond_device(msg->arg);
|
|
|
|
break;
|
|
|
|
}
|
2018-09-04 13:11:03 +00:00
|
|
|
case BTC_GAP_BT_ACT_SET_PIN_TYPE:{
|
|
|
|
btc_gap_bt_set_pin_type(arg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BTC_GAP_BT_ACT_PIN_REPLY: {
|
|
|
|
btc_gap_bt_pin_reply(arg);
|
|
|
|
break;
|
|
|
|
}
|
2018-07-10 03:18:52 +00:00
|
|
|
#if (BT_SSP_INCLUDED == TRUE)
|
|
|
|
case BTC_GAP_BT_ACT_SET_SECURITY_PARAM:{
|
|
|
|
btc_gap_bt_set_security_param(arg);
|
2017-02-24 09:28:33 +00:00
|
|
|
break;
|
|
|
|
}
|
2018-07-10 03:18:52 +00:00
|
|
|
case BTC_GAP_BT_ACT_PASSKEY_REPLY:{
|
|
|
|
btc_gap_bt_ssp_passkey_reply(arg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BTC_GAP_BT_ACT_CONFIRM_REPLY:{
|
|
|
|
btc_gap_bt_ssp_confirm(arg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
#endif ///BT_SSP_INCLUDED == TRUE
|
2019-06-03 11:29:54 +00:00
|
|
|
case BTC_GAP_BT_ACT_CONFIG_EIR: {
|
|
|
|
btc_gap_bt_config_eir(arg);
|
|
|
|
break;
|
|
|
|
}
|
2019-09-29 08:20:40 +00:00
|
|
|
|
|
|
|
case BTC_GAP_BT_ACT_SET_AFH_CHANNELS: {
|
|
|
|
btc_gap_bt_set_afh_channels(arg);
|
|
|
|
break;
|
|
|
|
}
|
2019-10-30 07:06:29 +00:00
|
|
|
case BTC_GAP_BT_ACT_READ_REMOTE_NAME: {
|
|
|
|
btc_gap_bt_read_remote_name(arg);
|
|
|
|
break;
|
|
|
|
}
|
2018-07-10 03:18:52 +00:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
btc_gap_bt_arg_deep_free(msg);
|
2017-11-24 09:28:43 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
void btc_gap_bt_busy_level_updated(uint8_t bl_flags)
|
|
|
|
{
|
|
|
|
esp_bt_gap_cb_param_t param;
|
|
|
|
|
|
|
|
if (bl_flags == BTM_BL_INQUIRY_STARTED) {
|
|
|
|
param.disc_st_chg.state = ESP_BT_GAP_DISCOVERY_STARTED;
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_DISC_STATE_CHANGED_EVT, ¶m);
|
|
|
|
btc_gap_bt_inquiry_in_progress = true;
|
2020-06-16 14:18:21 +00:00
|
|
|
} else if (bl_flags == BTM_BL_INQUIRY_CANCELLED) {
|
2017-11-24 09:28:43 +00:00
|
|
|
param.disc_st_chg.state = ESP_BT_GAP_DISCOVERY_STOPPED;
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_DISC_STATE_CHANGED_EVT, ¶m);
|
|
|
|
btc_gap_bt_inquiry_in_progress = false;
|
2020-06-16 14:18:21 +00:00
|
|
|
} else if (bl_flags == BTM_BL_INQUIRY_COMPLETE) {
|
|
|
|
/* The Inquiry Complete event is not transported to app layer,
|
|
|
|
since the app only cares about the Name Discovery Complete event */
|
|
|
|
btc_gap_bt_inquiry_in_progress = false;
|
2017-11-24 09:28:43 +00:00
|
|
|
}
|
2016-10-26 03:25:24 +00:00
|
|
|
}
|
2017-03-17 07:08:47 +00:00
|
|
|
|
2018-05-16 10:58:13 +00:00
|
|
|
void btc_gap_bt_cb_deep_free(btc_msg_t *msg)
|
2018-01-16 10:36:31 +00:00
|
|
|
{
|
2018-05-16 10:58:13 +00:00
|
|
|
switch (msg->act) {
|
|
|
|
case BTC_GAP_BT_SEARCH_DEVICES_EVT:
|
|
|
|
case BTC_GAP_BT_SEARCH_SERVICES_EVT:
|
|
|
|
case BTC_GAP_BT_SEARCH_SERVICE_RECORD_EVT:
|
|
|
|
osi_free(((tBTA_DM_SEARCH_PARAM *) (msg->arg)) ->p_data);
|
|
|
|
break;
|
|
|
|
case BTC_GAP_BT_READ_RSSI_DELTA_EVT:
|
2019-06-03 11:29:54 +00:00
|
|
|
case BTC_GAP_BT_CONFIG_EIR_DATA_EVT:
|
2018-05-16 10:58:13 +00:00
|
|
|
case BTC_GAP_BT_AUTH_CMPL_EVT:
|
2018-09-04 13:11:03 +00:00
|
|
|
case BTC_GAP_BT_PIN_REQ_EVT:
|
2019-09-29 08:20:40 +00:00
|
|
|
case BTC_GAP_BT_SET_AFH_CHANNELS_EVT:
|
2019-10-30 07:06:29 +00:00
|
|
|
case BTC_GAP_BT_READ_REMOTE_NAME_EVT:
|
2018-09-04 13:11:03 +00:00
|
|
|
#if (BT_SSP_INCLUDED == TRUE)
|
2018-07-10 03:18:52 +00:00
|
|
|
case BTC_GAP_BT_CFM_REQ_EVT:
|
|
|
|
case BTC_GAP_BT_KEY_NOTIF_EVT:
|
|
|
|
case BTC_GAP_BT_KEY_REQ_EVT:
|
|
|
|
#endif ///BT_SSP_INCLUDED == TRUE
|
2018-05-16 10:58:13 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
BTC_TRACE_ERROR("%s: Unhandled event (%d)!\n", __FUNCTION__, msg->act);
|
|
|
|
break;
|
2018-01-16 10:36:31 +00:00
|
|
|
}
|
2018-05-16 10:58:13 +00:00
|
|
|
}
|
2018-05-03 11:05:57 +00:00
|
|
|
|
2018-05-16 10:58:13 +00:00
|
|
|
void btc_gap_bt_cb_handler(btc_msg_t *msg)
|
|
|
|
{
|
|
|
|
switch (msg->act) {
|
|
|
|
case BTC_GAP_BT_SEARCH_DEVICES_EVT: {
|
|
|
|
btc_gap_bt_search_devices_evt(msg->arg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BTC_GAP_BT_SEARCH_SERVICES_EVT: {
|
|
|
|
btc_gap_bt_search_services(msg->arg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BTC_GAP_BT_SEARCH_SERVICE_RECORD_EVT: {
|
|
|
|
btc_gap_bt_search_service_record(msg->arg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BTC_GAP_BT_READ_RSSI_DELTA_EVT:{
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_READ_RSSI_DELTA_EVT, (esp_bt_gap_cb_param_t *)msg->arg);
|
2019-06-03 11:29:54 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BTC_GAP_BT_CONFIG_EIR_DATA_EVT: {
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_CONFIG_EIR_DATA_EVT, (esp_bt_gap_cb_param_t *)msg->arg);
|
2018-05-16 10:58:13 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BTC_GAP_BT_AUTH_CMPL_EVT:{
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_AUTH_CMPL_EVT, (esp_bt_gap_cb_param_t *)msg->arg);
|
|
|
|
break;
|
|
|
|
}
|
2018-09-04 13:11:03 +00:00
|
|
|
case BTC_GAP_BT_PIN_REQ_EVT:{
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_PIN_REQ_EVT, (esp_bt_gap_cb_param_t *)msg->arg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
#if (BT_SSP_INCLUDED == TRUE)
|
2018-07-10 03:18:52 +00:00
|
|
|
case BTC_GAP_BT_CFM_REQ_EVT:{
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_CFM_REQ_EVT, (esp_bt_gap_cb_param_t *)msg->arg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BTC_GAP_BT_KEY_NOTIF_EVT:{
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_KEY_NOTIF_EVT, (esp_bt_gap_cb_param_t *)msg->arg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BTC_GAP_BT_KEY_REQ_EVT:{
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_KEY_REQ_EVT, (esp_bt_gap_cb_param_t *)msg->arg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
#endif ///BT_SSP_INCLUDED == TRUE
|
2019-09-29 08:20:40 +00:00
|
|
|
case BTC_GAP_BT_SET_AFH_CHANNELS_EVT:{
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_SET_AFH_CHANNELS_EVT, (esp_bt_gap_cb_param_t *)msg->arg);
|
|
|
|
break;
|
|
|
|
}
|
2019-10-30 07:06:29 +00:00
|
|
|
#if (SDP_INCLUDED == TRUE)
|
|
|
|
case BTC_GAP_BT_READ_REMOTE_NAME_EVT:{
|
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_READ_REMOTE_NAME_EVT,(esp_bt_gap_cb_param_t *)msg->arg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
#endif
|
2018-05-16 10:58:13 +00:00
|
|
|
default:
|
|
|
|
BTC_TRACE_ERROR("%s: Unhandled event (%d)!\n", __FUNCTION__, msg->act);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
btc_gap_bt_cb_deep_free(msg);
|
2018-01-16 10:36:31 +00:00
|
|
|
}
|
2017-11-24 09:28:43 +00:00
|
|
|
#endif /* (BTC_GAP_BT_INCLUDED == TRUE) */
|