|
@@ -138,31 +138,35 @@ static void btc_gap_bt_get_remote_service_record(btc_gap_bt_args_t *arg)
|
|
|
*******************************************************************************/
|
|
*******************************************************************************/
|
|
|
static void search_devices_copy_cb(btc_msg_t *msg, void *p_dest, void *p_src)
|
|
static void search_devices_copy_cb(btc_msg_t *msg, void *p_dest, void *p_src)
|
|
|
{
|
|
{
|
|
|
- tBTA_DM_SEARCH *p_dest_data = (tBTA_DM_SEARCH *) p_dest;
|
|
|
|
|
- tBTA_DM_SEARCH *p_src_data = (tBTA_DM_SEARCH *) p_src;
|
|
|
|
|
-
|
|
|
|
|
|
|
+ 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;
|
|
|
if (!p_src) {
|
|
if (!p_src) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
+ 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);
|
|
|
|
|
|
|
|
- switch (msg->aid) {
|
|
|
|
|
- case BTA_DM_INQ_RES_EVT: {
|
|
|
|
|
- if (p_src_data->inq_res.p_eir) {
|
|
|
|
|
- p_dest_data->inq_res.p_eir = (UINT8 *)(p_dest + sizeof(tBTA_DM_SEARCH));
|
|
|
|
|
- memcpy(p_dest_data->inq_res.p_eir, p_src_data->inq_res.p_eir, HCI_EXT_INQ_RESPONSE_LEN);
|
|
|
|
|
|
|
+ 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) {
|
|
|
|
|
+ p_dest_data->p_data->inq_res.p_eir = (UINT8 *)(p_dest_data->p_data + sizeof(tBTA_DM_SEARCH));
|
|
|
|
|
+ memcpy(p_dest_data->p_data->inq_res.p_eir, p_src_data->p_data->inq_res.p_eir, HCI_EXT_INQ_RESPONSE_LEN);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
- break;
|
|
|
|
|
|
|
+ break;
|
|
|
|
|
|
|
|
- case BTA_DM_DISC_RES_EVT: {
|
|
|
|
|
- if (p_src_data->disc_res.raw_data_size && p_src_data->disc_res.p_raw_data) {
|
|
|
|
|
- p_dest_data->disc_res.p_raw_data = (UINT8 *)(p_dest + sizeof(tBTA_DM_SEARCH));
|
|
|
|
|
- memcpy(p_dest_data->disc_res.p_raw_data,
|
|
|
|
|
- p_src_data->disc_res.p_raw_data,
|
|
|
|
|
- p_src_data->disc_res.raw_data_size);
|
|
|
|
|
|
|
+ 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) {
|
|
|
|
|
+ p_dest_data->p_data->disc_res.p_raw_data = (UINT8 *)(p_dest_data->p_data + sizeof(tBTA_DM_SEARCH));
|
|
|
|
|
+ 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;
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
- break;
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -177,26 +181,30 @@ static void search_devices_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)
|
|
static void search_service_record_copy_cb(btc_msg_t *msg, void *p_dest, void *p_src)
|
|
|
{
|
|
{
|
|
|
- tBTA_DM_SEARCH *p_dest_data = (tBTA_DM_SEARCH *) p_dest;
|
|
|
|
|
- tBTA_DM_SEARCH *p_src_data = (tBTA_DM_SEARCH *) p_src;
|
|
|
|
|
|
|
+ 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;
|
|
|
|
|
|
|
|
if (!p_src) {
|
|
if (!p_src) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- switch (msg->aid) {
|
|
|
|
|
- case BTA_DM_DISC_RES_EVT: {
|
|
|
|
|
- if (p_src_data->disc_res.p_raw_data && p_src_data->disc_res.raw_data_size > 0) {
|
|
|
|
|
- p_dest_data->disc_res.p_raw_data = (UINT8 *)(p_dest + sizeof(tBTA_DM_SEARCH));
|
|
|
|
|
- memcpy(p_dest_data->disc_res.p_raw_data,
|
|
|
|
|
- p_src_data->disc_res.p_raw_data,
|
|
|
|
|
- p_src_data->disc_res.raw_data_size);
|
|
|
|
|
|
|
+ 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) {
|
|
|
|
|
+ p_dest_data->p_data->disc_res.p_raw_data = (UINT8 *)(p_dest_data->p_data + sizeof(tBTA_DM_SEARCH));
|
|
|
|
|
+ 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;
|
|
|
|
|
-
|
|
|
|
|
- default:
|
|
|
|
|
break;
|
|
break;
|
|
|
|
|
+
|
|
|
|
|
+ default:
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -255,6 +263,10 @@ static BOOLEAN check_eir_remote_name(tBTA_DM_SEARCH *p_search_data,
|
|
|
*******************************************************************************/
|
|
*******************************************************************************/
|
|
|
static void bte_search_devices_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data)
|
|
static void bte_search_devices_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data)
|
|
|
{
|
|
{
|
|
|
|
|
+ tBTA_DM_SEARCH_PARAM search;
|
|
|
|
|
+ search.event = event;
|
|
|
|
|
+ search.p_data = p_data;
|
|
|
|
|
+
|
|
|
UINT16 param_len = 0;
|
|
UINT16 param_len = 0;
|
|
|
|
|
|
|
|
if (p_data) {
|
|
if (p_data) {
|
|
@@ -282,31 +294,30 @@ static void bte_search_devices_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_d
|
|
|
p_data->inq_res.remt_name_not_required = check_eir_remote_name(p_data, NULL, NULL);
|
|
p_data->inq_res.remt_name_not_required = check_eir_remote_name(p_data, NULL, NULL);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ search.len = param_len;
|
|
|
do {
|
|
do {
|
|
|
btc_msg_t msg;
|
|
btc_msg_t msg;
|
|
|
- msg.sig = BTC_SIG_API_CALL;
|
|
|
|
|
|
|
+ msg.sig = BTC_SIG_API_CB;
|
|
|
msg.pid = BTC_PID_GAP_BT;
|
|
msg.pid = BTC_PID_GAP_BT;
|
|
|
- msg.act = BTC_GAP_BT_ACT_SEARCH_DEVICES;
|
|
|
|
|
- msg.aid = event;
|
|
|
|
|
|
|
+ msg.act = BTC_GAP_BT_SEARCH_DEVICES_EVT;
|
|
|
|
|
|
|
|
- btc_transfer_context(&msg, p_data, param_len,
|
|
|
|
|
- (param_len > sizeof(tBTA_DM_SEARCH)) ? search_devices_copy_cb : NULL);
|
|
|
|
|
|
|
+ btc_transfer_context(&msg, &search, sizeof(tBTA_DM_SEARCH_PARAM), search_devices_copy_cb);
|
|
|
} while (0);
|
|
} while (0);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static void btc_gap_bt_search_devices_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data)
|
|
|
|
|
|
|
+static void btc_gap_bt_search_devices_evt(tBTA_DM_SEARCH_PARAM *p_data)
|
|
|
{
|
|
{
|
|
|
- switch (event) {
|
|
|
|
|
|
|
+ switch (p_data->event) {
|
|
|
case BTA_DM_DISC_RES_EVT: {
|
|
case BTA_DM_DISC_RES_EVT: {
|
|
|
/* remote name update */
|
|
/* remote name update */
|
|
|
- uint32_t bdname_len = strlen((const char *)p_data->disc_res.bd_name);
|
|
|
|
|
|
|
+ uint32_t bdname_len = strlen((const char *)p_data->p_data->disc_res.bd_name);
|
|
|
if (bdname_len) {
|
|
if (bdname_len) {
|
|
|
esp_bt_gap_dev_prop_t prop[1];
|
|
esp_bt_gap_dev_prop_t prop[1];
|
|
|
|
|
|
|
|
- BTC_STORAGE_FILL_PROPERTY(&prop[0], ESP_BT_GAP_DEV_PROP_BDNAME, bdname_len + 1, p_data->disc_res.bd_name);
|
|
|
|
|
|
|
+ BTC_STORAGE_FILL_PROPERTY(&prop[0], ESP_BT_GAP_DEV_PROP_BDNAME, bdname_len + 1, p_data->p_data->disc_res.bd_name);
|
|
|
|
|
|
|
|
esp_bt_gap_cb_param_t param;
|
|
esp_bt_gap_cb_param_t param;
|
|
|
- bdcpy(param.disc_res.bda, p_data->disc_res.bd_addr);
|
|
|
|
|
|
|
+ bdcpy(param.disc_res.bda, p_data->p_data->disc_res.bd_addr);
|
|
|
param.disc_res.num_prop = 1;
|
|
param.disc_res.num_prop = 1;
|
|
|
param.disc_res.prop = prop;
|
|
param.disc_res.prop = prop;
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_DISC_RES_EVT, ¶m);
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_DISC_RES_EVT, ¶m);
|
|
@@ -315,7 +326,7 @@ static void btc_gap_bt_search_devices_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEAR
|
|
|
}
|
|
}
|
|
|
case BTA_DM_INQ_RES_EVT: {
|
|
case BTA_DM_INQ_RES_EVT: {
|
|
|
/* inquiry result */
|
|
/* inquiry result */
|
|
|
- uint32_t cod = devclass2uint (p_data->inq_res.dev_class);
|
|
|
|
|
|
|
+ uint32_t cod = devclass2uint (p_data->p_data->inq_res.dev_class);
|
|
|
|
|
|
|
|
if (cod == 0) {
|
|
if (cod == 0) {
|
|
|
BTC_TRACE_DEBUG("%s cod is 0, set as unclassified", __func__);
|
|
BTC_TRACE_DEBUG("%s cod is 0, set as unclassified", __func__);
|
|
@@ -330,17 +341,17 @@ static void btc_gap_bt_search_devices_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEAR
|
|
|
BTC_STORAGE_FILL_PROPERTY(&prop[0], ESP_BT_GAP_DEV_PROP_COD, sizeof(cod), &cod);
|
|
BTC_STORAGE_FILL_PROPERTY(&prop[0], ESP_BT_GAP_DEV_PROP_COD, sizeof(cod), &cod);
|
|
|
num_prop++;
|
|
num_prop++;
|
|
|
|
|
|
|
|
- BTC_STORAGE_FILL_PROPERTY(&prop[1], ESP_BT_GAP_DEV_PROP_RSSI, 1, &(p_data->inq_res.rssi));
|
|
|
|
|
|
|
+ BTC_STORAGE_FILL_PROPERTY(&prop[1], ESP_BT_GAP_DEV_PROP_RSSI, 1, &(p_data->p_data->inq_res.rssi));
|
|
|
num_prop++;
|
|
num_prop++;
|
|
|
|
|
|
|
|
- if (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->inq_res.p_eir);
|
|
|
|
|
|
|
+ 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);
|
|
|
num_prop++;
|
|
num_prop++;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* Callback to notify upper layer of device */
|
|
/* Callback to notify upper layer of device */
|
|
|
esp_bt_gap_cb_param_t param;
|
|
esp_bt_gap_cb_param_t param;
|
|
|
- bdcpy(param.disc_res.bda, p_data->inq_res.bd_addr);
|
|
|
|
|
|
|
+ bdcpy(param.disc_res.bda, p_data->p_data->inq_res.bd_addr);
|
|
|
param.disc_res.num_prop = num_prop;
|
|
param.disc_res.num_prop = num_prop;
|
|
|
param.disc_res.prop = prop;
|
|
param.disc_res.prop = prop;
|
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_DISC_RES_EVT, ¶m);
|
|
btc_gap_bt_cb_to_app(ESP_BT_GAP_DISC_RES_EVT, ¶m);
|
|
@@ -382,18 +393,18 @@ static void btc_gap_bt_search_devices_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEAR
|
|
|
** Returns void
|
|
** Returns void
|
|
|
**
|
|
**
|
|
|
*******************************************************************************/
|
|
*******************************************************************************/
|
|
|
-static void btc_gap_bt_search_service_record(UINT16 event, char *p_param)
|
|
|
|
|
|
|
+static void btc_gap_bt_search_service_record(char *p_param)
|
|
|
{
|
|
{
|
|
|
- tBTA_DM_SEARCH *p_data = (tBTA_DM_SEARCH *)p_param;
|
|
|
|
|
|
|
+ tBTA_DM_SEARCH_PARAM *p_data = (tBTA_DM_SEARCH_PARAM *)p_param;
|
|
|
|
|
|
|
|
- switch (event) {
|
|
|
|
|
|
|
+ switch (p_data->event) {
|
|
|
case BTA_DM_DISC_RES_EVT: {
|
|
case BTA_DM_DISC_RES_EVT: {
|
|
|
esp_bt_gap_cb_param_t param;
|
|
esp_bt_gap_cb_param_t param;
|
|
|
- memcpy(param.rmt_srvcs.bda, p_data->disc_res.bd_addr, BD_ADDR_LEN);
|
|
|
|
|
- if (p_data->disc_res.p_raw_data && p_data->disc_res.raw_data_size > 0) {
|
|
|
|
|
|
|
+ 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) {
|
|
|
param.rmt_srvc_rec.stat = ESP_BT_STATUS_SUCCESS;
|
|
param.rmt_srvc_rec.stat = ESP_BT_STATUS_SUCCESS;
|
|
|
- // param.rmt_srvc_rec.raw_data_size = p_data->disc_res.raw_data_size;
|
|
|
|
|
- // param.rmt_srvc_rec.raw_data = p_data->disc_res.p_raw_data;
|
|
|
|
|
|
|
+ // 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;
|
|
|
} else {
|
|
} else {
|
|
|
param.rmt_srvc_rec.stat = ESP_BT_STATUS_FAIL;
|
|
param.rmt_srvc_rec.stat = ESP_BT_STATUS_FAIL;
|
|
|
// param.rmt_srvc_rec.raw_data_size = 0;
|
|
// param.rmt_srvc_rec.raw_data_size = 0;
|
|
@@ -421,6 +432,9 @@ static void btc_gap_bt_search_service_record(UINT16 event, char *p_param)
|
|
|
*******************************************************************************/
|
|
*******************************************************************************/
|
|
|
static void bte_dm_remote_service_record_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)
|
|
|
{
|
|
{
|
|
|
|
|
+ tBTA_DM_SEARCH_PARAM search;
|
|
|
|
|
+ search.event = event;
|
|
|
|
|
+ search.p_data = p_data;
|
|
|
UINT16 param_len = 0;
|
|
UINT16 param_len = 0;
|
|
|
|
|
|
|
|
if (p_data) {
|
|
if (p_data) {
|
|
@@ -432,17 +446,13 @@ static void bte_dm_remote_service_record_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_S
|
|
|
param_len += p_data->disc_res.raw_data_size;
|
|
param_len += p_data->disc_res.raw_data_size;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+ search.len = param_len;
|
|
|
do {
|
|
do {
|
|
|
btc_msg_t msg;
|
|
btc_msg_t msg;
|
|
|
- msg.sig = BTC_SIG_API_CALL;
|
|
|
|
|
|
|
+ msg.sig = BTC_SIG_API_CB;
|
|
|
msg.pid = BTC_PID_GAP_BT;
|
|
msg.pid = BTC_PID_GAP_BT;
|
|
|
- msg.act = BTC_GAP_BT_ACT_SEARCH_SERVICE_RECORD;
|
|
|
|
|
- msg.aid = event;
|
|
|
|
|
-
|
|
|
|
|
- btc_transfer_context(&msg, p_data, param_len,
|
|
|
|
|
- (param_len > sizeof(tBTA_DM_SEARCH)) ? search_service_record_copy_cb : NULL);
|
|
|
|
|
-
|
|
|
|
|
|
|
+ msg.act = BTC_GAP_BT_SEARCH_SERVICE_RECORD_EVT;
|
|
|
|
|
+ btc_transfer_context(&msg, &search, sizeof(tBTA_DM_SEARCH_PARAM), search_service_record_copy_cb);
|
|
|
} while (0);
|
|
} while (0);
|
|
|
|
|
|
|
|
}
|
|
}
|
|
@@ -456,27 +466,27 @@ static void bte_dm_remote_service_record_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_S
|
|
|
** Returns void
|
|
** Returns void
|
|
|
**
|
|
**
|
|
|
*******************************************************************************/
|
|
*******************************************************************************/
|
|
|
-static void btc_gap_bt_search_services(UINT16 event, char *p_param)
|
|
|
|
|
|
|
+static void btc_gap_bt_search_services(char *p_param)
|
|
|
{
|
|
{
|
|
|
- tBTA_DM_SEARCH *p_data = (tBTA_DM_SEARCH *)p_param;
|
|
|
|
|
|
|
+ tBTA_DM_SEARCH_PARAM *p_data = (tBTA_DM_SEARCH_PARAM *)p_param;
|
|
|
|
|
|
|
|
- switch (event) {
|
|
|
|
|
|
|
+ switch (p_data->event) {
|
|
|
case BTA_DM_DISC_RES_EVT: {
|
|
case BTA_DM_DISC_RES_EVT: {
|
|
|
esp_bt_gap_cb_param_t param;
|
|
esp_bt_gap_cb_param_t param;
|
|
|
esp_bt_uuid_t *uuid_list = NULL;
|
|
esp_bt_uuid_t *uuid_list = NULL;
|
|
|
- memcpy(param.rmt_srvcs.bda, p_data->disc_res.bd_addr, BD_ADDR_LEN);
|
|
|
|
|
|
|
+ memcpy(param.rmt_srvcs.bda, p_data->p_data->disc_res.bd_addr, BD_ADDR_LEN);
|
|
|
|
|
|
|
|
param.rmt_srvcs.stat = ESP_BT_STATUS_FAIL;
|
|
param.rmt_srvcs.stat = ESP_BT_STATUS_FAIL;
|
|
|
- if (p_data->disc_res.result == BTA_SUCCESS) {
|
|
|
|
|
- uuid_list = malloc(sizeof(esp_bt_uuid_t) * p_data->disc_res.num_uuids);
|
|
|
|
|
|
|
+ if (p_data->p_data->disc_res.result == BTA_SUCCESS) {
|
|
|
|
|
+ uuid_list = malloc(sizeof(esp_bt_uuid_t) * p_data->p_data->disc_res.num_uuids);
|
|
|
if (uuid_list) {
|
|
if (uuid_list) {
|
|
|
param.rmt_srvcs.stat = ESP_BT_STATUS_SUCCESS;
|
|
param.rmt_srvcs.stat = ESP_BT_STATUS_SUCCESS;
|
|
|
- param.rmt_srvcs.num_uuids = p_data->disc_res.num_uuids;
|
|
|
|
|
|
|
+ param.rmt_srvcs.num_uuids = p_data->p_data->disc_res.num_uuids;
|
|
|
param.rmt_srvcs.uuid_list = uuid_list;
|
|
param.rmt_srvcs.uuid_list = uuid_list;
|
|
|
// copy UUID list
|
|
// copy UUID list
|
|
|
- uint8_t *i_uu = (uint8_t *)p_data->disc_res.p_uuid_list;
|
|
|
|
|
|
|
+ uint8_t *i_uu = (uint8_t *)p_data->p_data->disc_res.p_uuid_list;
|
|
|
esp_bt_uuid_t *o_uu = uuid_list;
|
|
esp_bt_uuid_t *o_uu = uuid_list;
|
|
|
- for (int i = 0; i < p_data->disc_res.num_uuids; i++, i_uu += ESP_UUID_LEN_128, o_uu++) {
|
|
|
|
|
|
|
+ for (int i = 0; i < p_data->p_data->disc_res.num_uuids; i++, i_uu += ESP_UUID_LEN_128, o_uu++) {
|
|
|
uuid128_be_to_esp_uuid(o_uu, i_uu);
|
|
uuid128_be_to_esp_uuid(o_uu, i_uu);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -513,6 +523,10 @@ static void btc_gap_bt_search_services(UINT16 event, char *p_param)
|
|
|
*******************************************************************************/
|
|
*******************************************************************************/
|
|
|
static void bte_dm_search_services_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)
|
|
|
{
|
|
{
|
|
|
|
|
+ tBTA_DM_SEARCH_PARAM search;
|
|
|
|
|
+ search.event = event;
|
|
|
|
|
+ search.p_data = p_data;
|
|
|
|
|
+
|
|
|
UINT16 param_len = 0;
|
|
UINT16 param_len = 0;
|
|
|
if (p_data) {
|
|
if (p_data) {
|
|
|
param_len += sizeof(tBTA_DM_SEARCH);
|
|
param_len += sizeof(tBTA_DM_SEARCH);
|
|
@@ -525,46 +539,46 @@ static void bte_dm_search_services_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH
|
|
|
}
|
|
}
|
|
|
} break;
|
|
} break;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- /* TODO: The only other member that needs a deep copy is the p_raw_data. But not sure
|
|
|
|
|
- * if raw_data is needed. */
|
|
|
|
|
|
|
+ search.len = param_len;
|
|
|
do {
|
|
do {
|
|
|
btc_msg_t msg;
|
|
btc_msg_t msg;
|
|
|
- msg.sig = BTC_SIG_API_CALL;
|
|
|
|
|
|
|
+ msg.sig = BTC_SIG_API_CB;
|
|
|
msg.pid = BTC_PID_GAP_BT;
|
|
msg.pid = BTC_PID_GAP_BT;
|
|
|
- msg.act = BTC_GAP_BT_ACT_SEARCH_SERVICES;
|
|
|
|
|
- msg.aid = event;
|
|
|
|
|
-
|
|
|
|
|
- btc_transfer_context(&msg, p_data, param_len,
|
|
|
|
|
- (param_len > sizeof(tBTA_DM_SEARCH)) ? search_services_copy_cb : NULL);
|
|
|
|
|
|
|
+ msg.act = BTC_GAP_BT_SEARCH_SERVICES_EVT;
|
|
|
|
|
+ btc_transfer_context(&msg, &search, sizeof(tBTA_DM_SEARCH_PARAM), search_services_copy_cb);
|
|
|
} while (0);
|
|
} while (0);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void search_services_copy_cb(btc_msg_t *msg, void *p_dest, void *p_src)
|
|
static void search_services_copy_cb(btc_msg_t *msg, void *p_dest, void *p_src)
|
|
|
{
|
|
{
|
|
|
- tBTA_DM_SEARCH *p_dest_data = (tBTA_DM_SEARCH *) p_dest;
|
|
|
|
|
- tBTA_DM_SEARCH *p_src_data = (tBTA_DM_SEARCH *) p_src;
|
|
|
|
|
|
|
+ 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;
|
|
|
|
|
|
|
|
if (!p_src) {
|
|
if (!p_src) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- switch (msg->aid) {
|
|
|
|
|
- case BTA_DM_DISC_RES_EVT: {
|
|
|
|
|
- if (p_src_data->disc_res.result == BTA_SUCCESS) {
|
|
|
|
|
- if (p_src_data->disc_res.num_uuids > 0) {
|
|
|
|
|
- p_dest_data->disc_res.p_uuid_list = (UINT8 *)(p_dest + sizeof(tBTA_DM_SEARCH));
|
|
|
|
|
- memcpy(p_dest_data->disc_res.p_uuid_list, p_src_data->disc_res.p_uuid_list,
|
|
|
|
|
- p_src_data->disc_res.num_uuids * MAX_UUID_SIZE);
|
|
|
|
|
- osi_free(p_src_data->disc_res.p_uuid_list);
|
|
|
|
|
- p_src_data->disc_res.p_uuid_list = NULL;
|
|
|
|
|
- }
|
|
|
|
|
- if (p_src_data->disc_res.p_raw_data != NULL) {
|
|
|
|
|
- osi_free(p_src_data->disc_res.p_raw_data);
|
|
|
|
|
- p_src_data->disc_res.p_raw_data = NULL;
|
|
|
|
|
|
|
+ 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) {
|
|
|
|
|
+ p_dest_data->p_data->disc_res.p_uuid_list = (UINT8 *)(p_dest_data->p_data + sizeof(tBTA_DM_SEARCH));
|
|
|
|
|
+ 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;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+ } break;
|
|
|
}
|
|
}
|
|
|
- } break;
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -603,7 +617,7 @@ static void btc_gap_bt_read_rssi_delta_cmpl_callback(void *p_data)
|
|
|
btc_msg_t msg;
|
|
btc_msg_t msg;
|
|
|
msg.sig = BTC_SIG_API_CB;
|
|
msg.sig = BTC_SIG_API_CB;
|
|
|
msg.pid = BTC_PID_GAP_BT;
|
|
msg.pid = BTC_PID_GAP_BT;
|
|
|
- msg.act = ESP_BT_GAP_READ_RSSI_DELTA_EVT;
|
|
|
|
|
|
|
+ msg.act = BTC_GAP_BT_READ_RSSI_DELTA_EVT;
|
|
|
memcpy(param.read_rssi_delta.bda, result->rem_bda, sizeof(BD_ADDR));
|
|
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.stat = btc_btm_status_to_esp_status(result->status);
|
|
|
param.read_rssi_delta.rssi_delta = result->rssi;
|
|
param.read_rssi_delta.rssi_delta = result->rssi;
|
|
@@ -612,7 +626,7 @@ static void btc_gap_bt_read_rssi_delta_cmpl_callback(void *p_data)
|
|
|
sizeof(esp_bt_gap_cb_param_t), NULL);
|
|
sizeof(esp_bt_gap_cb_param_t), NULL);
|
|
|
|
|
|
|
|
if (ret != BT_STATUS_SUCCESS) {
|
|
if (ret != BT_STATUS_SUCCESS) {
|
|
|
- LOG_ERROR("%s btc_transfer_context failed\n", __func__);
|
|
|
|
|
|
|
+ BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -645,10 +659,6 @@ void btc_gap_bt_call_handler(btc_msg_t *msg)
|
|
|
btc_gap_bt_start_discovery(msg->arg);
|
|
btc_gap_bt_start_discovery(msg->arg);
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
- case BTC_GAP_BT_ACT_SEARCH_DEVICES: {
|
|
|
|
|
- btc_gap_bt_search_devices_evt(msg->aid, msg->arg);
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
case BTC_GAP_BT_ACT_CANCEL_DISCOVERY: {
|
|
case BTC_GAP_BT_ACT_CANCEL_DISCOVERY: {
|
|
|
btc_gap_bt_cancel_discovery();
|
|
btc_gap_bt_cancel_discovery();
|
|
|
break;
|
|
break;
|
|
@@ -657,18 +667,10 @@ void btc_gap_bt_call_handler(btc_msg_t *msg)
|
|
|
btc_gap_bt_get_remote_services(msg->arg);
|
|
btc_gap_bt_get_remote_services(msg->arg);
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
- case BTC_GAP_BT_ACT_SEARCH_SERVICES: {
|
|
|
|
|
- btc_gap_bt_search_services(msg->aid, msg->arg);
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
case BTC_GAP_BT_ACT_GET_REMOTE_SERVICE_RECORD: {
|
|
case BTC_GAP_BT_ACT_GET_REMOTE_SERVICE_RECORD: {
|
|
|
btc_gap_bt_get_remote_service_record(msg->arg);
|
|
btc_gap_bt_get_remote_service_record(msg->arg);
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
- case BTC_GAP_BT_ACT_SEARCH_SERVICE_RECORD: {
|
|
|
|
|
- btc_gap_bt_search_service_record(msg->aid, msg->arg);
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
case BTC_GAP_BT_ACT_SET_COD: {
|
|
case BTC_GAP_BT_ACT_SET_COD: {
|
|
|
btc_gap_bt_set_cod(msg->arg);
|
|
btc_gap_bt_set_cod(msg->arg);
|
|
|
break;
|
|
break;
|
|
@@ -704,15 +706,50 @@ void btc_gap_bt_busy_level_updated(uint8_t bl_flags)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void btc_gap_bt_cb_handler(btc_msg_t *msg)
|
|
|
|
|
|
|
+void btc_gap_bt_cb_deep_free(btc_msg_t *msg)
|
|
|
{
|
|
{
|
|
|
- esp_bt_gap_cb_param_t *param = (esp_bt_gap_cb_param_t *)msg->arg;
|
|
|
|
|
-
|
|
|
|
|
- if (msg->act < ESP_BT_GAP_EVT_MAX) {
|
|
|
|
|
- btc_gap_bt_cb_to_app(msg->act, param);
|
|
|
|
|
- } else {
|
|
|
|
|
- LOG_ERROR("%s, unknow msg->act = %d", __func__, msg->act);
|
|
|
|
|
|
|
+ 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:
|
|
|
|
|
+ case BTC_GAP_BT_AUTH_CMPL_EVT:
|
|
|
|
|
+ break;
|
|
|
|
|
+ default:
|
|
|
|
|
+ BTC_TRACE_ERROR("%s: Unhandled event (%d)!\n", __FUNCTION__, msg->act);
|
|
|
|
|
+ break;
|
|
|
}
|
|
}
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
|
|
+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);
|
|
|
|
|
+ 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;
|
|
|
|
|
+ }
|
|
|
|
|
+ default:
|
|
|
|
|
+ BTC_TRACE_ERROR("%s: Unhandled event (%d)!\n", __FUNCTION__, msg->act);
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ btc_gap_bt_cb_deep_free(msg);
|
|
|
}
|
|
}
|
|
|
#endif /* (BTC_GAP_BT_INCLUDED == TRUE) */
|
|
#endif /* (BTC_GAP_BT_INCLUDED == TRUE) */
|