mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
component/bt : add class bt read RSSI delta (golden range)
This commit is contained in:
parent
cc2d1fda96
commit
8646913cbf
@ -178,4 +178,17 @@ esp_err_t esp_bt_gap_get_cod(esp_bt_cod_t *cod)
|
|||||||
return btc_gap_bt_get_cod(cod);
|
return btc_gap_bt_get_cod(cod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
esp_err_t esp_bt_gap_read_rssi_delta(esp_bd_addr_t remote_addr)
|
||||||
|
{
|
||||||
|
btc_msg_t msg;
|
||||||
|
btc_gap_bt_args_t arg;
|
||||||
|
|
||||||
|
msg.sig = BTC_SIG_API_CALL;
|
||||||
|
msg.pid = BTC_PID_GAP_BT;
|
||||||
|
msg.act = BTC_GAP_BT_ACT_READ_RSSI_DELTA;
|
||||||
|
memcpy(arg.read_rssi_delta.bda.address, remote_addr, sizeof(esp_bd_addr_t));
|
||||||
|
|
||||||
|
return (btc_transfer_context(&msg, &arg, sizeof(btc_gap_bt_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* #if BTC_GAP_BT_INCLUDED == TRUE */
|
#endif /* #if BTC_GAP_BT_INCLUDED == TRUE */
|
||||||
|
@ -23,6 +23,10 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/// RSSI threshold
|
||||||
|
#define ESP_BT_GAP_RSSI_HIGH_THRLD -20 /*!< High RSSI threshold */
|
||||||
|
#define ESP_BT_GAP_RSSI_LOW_THRLD -45 /*!< Low RSSI threshold */
|
||||||
|
|
||||||
/// Class of device
|
/// Class of device
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t reserved_2: 2; /*!< undefined */
|
uint32_t reserved_2: 2; /*!< undefined */
|
||||||
@ -144,6 +148,8 @@ typedef enum {
|
|||||||
ESP_BT_GAP_DISC_STATE_CHANGED_EVT, /*!< discovery state changed event */
|
ESP_BT_GAP_DISC_STATE_CHANGED_EVT, /*!< discovery state changed event */
|
||||||
ESP_BT_GAP_RMT_SRVCS_EVT, /*!< get remote services event */
|
ESP_BT_GAP_RMT_SRVCS_EVT, /*!< get remote services event */
|
||||||
ESP_BT_GAP_RMT_SRVC_REC_EVT, /*!< get remote service record event */
|
ESP_BT_GAP_RMT_SRVC_REC_EVT, /*!< get remote service record event */
|
||||||
|
ESP_BT_GAP_READ_RSSI_DELTA_EVT, /*!< read rssi event */
|
||||||
|
ESP_BT_GAP_EVT_MAX,
|
||||||
} esp_bt_gap_cb_event_t;
|
} esp_bt_gap_cb_event_t;
|
||||||
|
|
||||||
/** Inquiry Mode */
|
/** Inquiry Mode */
|
||||||
@ -192,6 +198,14 @@ typedef union {
|
|||||||
esp_bt_status_t stat; /*!< service search status */
|
esp_bt_status_t stat; /*!< service search status */
|
||||||
} rmt_srvc_rec; /*!< specific service record from remote device parameter struct */
|
} rmt_srvc_rec; /*!< specific service record from remote device parameter struct */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ESP_BT_GAP_READ_RSSI_DELTA_EVT *
|
||||||
|
*/
|
||||||
|
struct read_rssi_delta_param {
|
||||||
|
esp_bd_addr_t bda; /*!< remote bluetooth device address*/
|
||||||
|
esp_bt_status_t stat; /*!< read rssi status */
|
||||||
|
int8_t rssi_delta; /*!< rssi delta value range -128 ~127, The value zero indicates that the RSSI is inside the Golden Receive Power Range, the Golden Receive Power Range is from ESP_BT_GAP_RSSI_LOW_THRLD to ESP_BT_GAP_RSSI_HIGH_THRLD */
|
||||||
|
} read_rssi_delta; /*!< read rssi parameter struct */
|
||||||
} esp_bt_gap_cb_param_t;
|
} esp_bt_gap_cb_param_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -372,6 +386,18 @@ esp_err_t esp_bt_gap_set_cod(esp_bt_cod_t cod, esp_bt_cod_mode_t mode);
|
|||||||
*/
|
*/
|
||||||
esp_err_t esp_bt_gap_get_cod(esp_bt_cod_t *cod);
|
esp_err_t esp_bt_gap_get_cod(esp_bt_cod_t *cod);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is called to read RSSI delta by address after connected. The RSSI value returned by ESP_BT_GAP_READ_RSSI_DELTA_EVT.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param[in] remote_addr - remote device address, corresponding to a certain connection handle.
|
||||||
|
* @return
|
||||||
|
* - ESP_OK : Succeed
|
||||||
|
* - ESP_FAIL: others
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
esp_err_t esp_bt_gap_read_rssi_delta(esp_bd_addr_t remote_addr);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -70,7 +70,7 @@ static btc_func_t profile_tab[BTC_PID_NUM] = {
|
|||||||
[BTC_PID_ALARM] = {btc_alarm_handler, NULL },
|
[BTC_PID_ALARM] = {btc_alarm_handler, NULL },
|
||||||
#if CONFIG_CLASSIC_BT_ENABLED
|
#if CONFIG_CLASSIC_BT_ENABLED
|
||||||
#if (BTC_GAP_BT_INCLUDED == TRUE)
|
#if (BTC_GAP_BT_INCLUDED == TRUE)
|
||||||
[BTC_PID_GAP_BT] = {btc_gap_bt_call_handler, NULL },
|
[BTC_PID_GAP_BT] = {btc_gap_bt_call_handler, btc_gap_bt_cb_handler },
|
||||||
#endif /* (BTC_GAP_BT_INCLUDED == TRUE) */
|
#endif /* (BTC_GAP_BT_INCLUDED == TRUE) */
|
||||||
[BTC_PID_PRF_QUE] = {btc_profile_queue_handler, NULL },
|
[BTC_PID_PRF_QUE] = {btc_profile_queue_handler, NULL },
|
||||||
#if BTC_AV_INCLUDED
|
#if BTC_AV_INCLUDED
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include "bta/bta_av_api.h"
|
#include "bta/bta_av_api.h"
|
||||||
#endif ///BTA_AV_INCLUDED == TRUE
|
#endif ///BTA_AV_INCLUDED == TRUE
|
||||||
#include "common/bt_defs.h"
|
#include "common/bt_defs.h"
|
||||||
|
#include "stack/btm_api.h"
|
||||||
|
|
||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
** Constants & Macros
|
** Constants & Macros
|
||||||
@ -179,3 +180,69 @@ void uuid_to_string_legacy(bt_uuid_t *p_uuid, char *str)
|
|||||||
ntohl(uuid4), ntohs(uuid5));
|
ntohl(uuid4), ntohs(uuid5));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
esp_bt_status_t btc_hci_to_esp_status(uint8_t hci_status)
|
||||||
|
{
|
||||||
|
esp_bt_status_t esp_status = ESP_BT_STATUS_FAIL;
|
||||||
|
switch(hci_status) {
|
||||||
|
case HCI_SUCCESS:
|
||||||
|
esp_status = ESP_BT_STATUS_SUCCESS;
|
||||||
|
break;
|
||||||
|
case HCI_ERR_HOST_TIMEOUT:
|
||||||
|
esp_status = ESP_BT_STATUS_TIMEOUT;
|
||||||
|
break;
|
||||||
|
case HCI_ERR_ILLEGAL_COMMAND:
|
||||||
|
esp_status = ESP_BT_STATUS_PENDING;
|
||||||
|
break;
|
||||||
|
case HCI_ERR_UNACCEPT_CONN_INTERVAL:
|
||||||
|
esp_status = ESP_BT_STATUS_UNACCEPT_CONN_INTERVAL;
|
||||||
|
break;
|
||||||
|
case HCI_ERR_PARAM_OUT_OF_RANGE:
|
||||||
|
esp_status = ESP_BT_STATUS_PARAM_OUT_OF_RANGE;
|
||||||
|
break;
|
||||||
|
case HCI_ERR_ILLEGAL_PARAMETER_FMT:
|
||||||
|
esp_status = ESP_BT_STATUS_ERR_ILLEGAL_PARAMETER_FMT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
esp_status = ESP_BT_STATUS_FAIL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return esp_status;
|
||||||
|
}
|
||||||
|
|
||||||
|
esp_bt_status_t btc_btm_status_to_esp_status (uint8_t btm_status)
|
||||||
|
{
|
||||||
|
esp_bt_status_t esp_status = ESP_BT_STATUS_FAIL;
|
||||||
|
switch(btm_status){
|
||||||
|
case BTM_SUCCESS:
|
||||||
|
esp_status = ESP_BT_STATUS_SUCCESS;
|
||||||
|
break;
|
||||||
|
case BTM_BUSY:
|
||||||
|
esp_status = ESP_BT_STATUS_BUSY;
|
||||||
|
break;
|
||||||
|
case BTM_NO_RESOURCES:
|
||||||
|
esp_status = ESP_BT_STATUS_NOMEM;
|
||||||
|
break;
|
||||||
|
case BTM_ERR_PROCESSING:
|
||||||
|
esp_status = ESP_BT_STATUS_PENDING;
|
||||||
|
break;
|
||||||
|
case BTM_PEER_LE_DATA_LEN_UNSUPPORTED:
|
||||||
|
esp_status = ESP_BT_STATUS_PEER_LE_DATA_LEN_UNSUPPORTED;
|
||||||
|
break;
|
||||||
|
case BTM_CONTROL_LE_DATA_LEN_UNSUPPORTED:
|
||||||
|
esp_status = ESP_BT_STATUS_CONTROL_LE_DATA_LEN_UNSUPPORTED;
|
||||||
|
break;
|
||||||
|
case BTM_SET_PRIVACY_SUCCESS:
|
||||||
|
esp_status = ESP_BT_STATUS_SUCCESS;
|
||||||
|
break;
|
||||||
|
case BTM_SET_PRIVACY_FAIL:
|
||||||
|
esp_status = ESP_BT_STATUS_FAIL;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
esp_status = ESP_BT_STATUS_FAIL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return esp_status;
|
||||||
|
}
|
||||||
|
@ -44,4 +44,7 @@ void uuid128_be_to_esp_uuid(esp_bt_uuid_t *u, uint8_t* uuid128);
|
|||||||
|
|
||||||
void uuid_to_string_legacy(bt_uuid_t *p_uuid, char *str);
|
void uuid_to_string_legacy(bt_uuid_t *p_uuid, char *str);
|
||||||
|
|
||||||
|
esp_bt_status_t btc_hci_to_esp_status(uint8_t hci_status);
|
||||||
|
esp_bt_status_t btc_btm_status_to_esp_status (uint8_t btm_status);
|
||||||
|
|
||||||
#endif /* __BTC_UTIL_H__ */
|
#endif /* __BTC_UTIL_H__ */
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include "esp_gap_ble_api.h"
|
#include "esp_gap_ble_api.h"
|
||||||
#include "btc/btc_ble_storage.h"
|
#include "btc/btc_ble_storage.h"
|
||||||
#include "btc/btc_dm.h"
|
#include "btc/btc_dm.h"
|
||||||
|
#include "btc/btc_util.h"
|
||||||
|
|
||||||
static tBTA_BLE_ADV_DATA gl_bta_adv_data;
|
static tBTA_BLE_ADV_DATA gl_bta_adv_data;
|
||||||
static tBTA_BLE_ADV_DATA gl_bta_scan_rsp_data;
|
static tBTA_BLE_ADV_DATA gl_bta_scan_rsp_data;
|
||||||
@ -107,85 +108,6 @@ static void btc_cleanup_adv_data(tBTA_BLE_ADV_DATA *bta_adv_data)
|
|||||||
btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_sol_service_128b);
|
btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_sol_service_128b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static esp_bt_status_t btc_hci_to_esp_status(uint8_t hci_status)
|
|
||||||
{
|
|
||||||
esp_bt_status_t esp_status = ESP_BT_STATUS_FAIL;
|
|
||||||
switch(hci_status) {
|
|
||||||
case HCI_SUCCESS:
|
|
||||||
esp_status = ESP_BT_STATUS_SUCCESS;
|
|
||||||
break;
|
|
||||||
case HCI_ERR_ESP_VENDOR_FAIL:
|
|
||||||
esp_status = ESP_BT_STATUS_FAIL;
|
|
||||||
break;
|
|
||||||
case HCI_ERR_HOST_TIMEOUT:
|
|
||||||
esp_status = ESP_BT_STATUS_TIMEOUT;
|
|
||||||
break;
|
|
||||||
case HCI_ERR_ILLEGAL_COMMAND:
|
|
||||||
esp_status = ESP_BT_STATUS_PENDING;
|
|
||||||
break;
|
|
||||||
case HCI_ERR_UNACCEPT_CONN_INTERVAL:
|
|
||||||
esp_status = ESP_BT_STATUS_UNACCEPT_CONN_INTERVAL;
|
|
||||||
break;
|
|
||||||
case HCI_ERR_PARAM_OUT_OF_RANGE:
|
|
||||||
esp_status = ESP_BT_STATUS_PARAM_OUT_OF_RANGE;
|
|
||||||
break;
|
|
||||||
case HCI_ERR_ILLEGAL_PARAMETER_FMT:
|
|
||||||
esp_status = ESP_BT_STATUS_ERR_ILLEGAL_PARAMETER_FMT;
|
|
||||||
break;
|
|
||||||
case HCI_ERR_MEMORY_FULL:
|
|
||||||
esp_status = ESP_BT_STATUS_MEMORY_FULL;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
esp_status = ESP_BT_STATUS_FAIL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return esp_status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static esp_bt_status_t btc_btm_status_to_esp_status (uint8_t btm_status)
|
|
||||||
{
|
|
||||||
esp_bt_status_t esp_status = ESP_BT_STATUS_FAIL;
|
|
||||||
switch(btm_status){
|
|
||||||
case BTM_SUCCESS:
|
|
||||||
esp_status = ESP_BT_STATUS_SUCCESS;
|
|
||||||
break;
|
|
||||||
case BTM_BUSY:
|
|
||||||
esp_status = ESP_BT_STATUS_BUSY;
|
|
||||||
break;
|
|
||||||
case BTM_NO_RESOURCES:
|
|
||||||
esp_status = ESP_BT_STATUS_NOMEM;
|
|
||||||
break;
|
|
||||||
case BTM_ERR_PROCESSING:
|
|
||||||
esp_status = ESP_BT_STATUS_PENDING;
|
|
||||||
break;
|
|
||||||
case BTM_PEER_LE_DATA_LEN_UNSUPPORTED:
|
|
||||||
esp_status = ESP_BT_STATUS_PEER_LE_DATA_LEN_UNSUPPORTED;
|
|
||||||
break;
|
|
||||||
case BTM_CONTROL_LE_DATA_LEN_UNSUPPORTED:
|
|
||||||
esp_status = ESP_BT_STATUS_CONTROL_LE_DATA_LEN_UNSUPPORTED;
|
|
||||||
break;
|
|
||||||
case BTM_SET_PRIVACY_SUCCESS:
|
|
||||||
esp_status = ESP_BT_STATUS_SUCCESS;
|
|
||||||
break;
|
|
||||||
case BTM_SET_PRIVACY_FAIL:
|
|
||||||
esp_status = ESP_BT_STATUS_FAIL;
|
|
||||||
break;
|
|
||||||
case BTM_INVALID_STATIC_RAND_ADDR:
|
|
||||||
esp_status = ESP_BT_STATUS_INVALID_STATIC_RAND_ADDR;
|
|
||||||
break;
|
|
||||||
case BTM_SET_STATIC_RAND_ADDR_FAIL:
|
|
||||||
esp_status = ESP_BT_STATUS_FAIL;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
esp_status = ESP_BT_STATUS_FAIL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return esp_status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void btc_to_bta_adv_data(esp_ble_adv_data_t *p_adv_data, tBTA_BLE_ADV_DATA *bta_adv_data, uint32_t *data_mask)
|
static void btc_to_bta_adv_data(esp_ble_adv_data_t *p_adv_data, tBTA_BLE_ADV_DATA *bta_adv_data, uint32_t *data_mask)
|
||||||
{
|
{
|
||||||
uint32_t mask;
|
uint32_t mask;
|
||||||
|
@ -594,6 +594,32 @@ esp_err_t btc_gap_bt_get_cod(esp_bt_cod_t *cod)
|
|||||||
return ESP_BT_STATUS_SUCCESS;
|
return ESP_BT_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
msg.act = ESP_BT_GAP_READ_RSSI_DELTA_EVT;
|
||||||
|
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) {
|
||||||
|
LOG_ERROR("%s btc_transfer_context failed\n", __func__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void btc_gap_bt_read_rssi_delta(btc_gap_bt_args_t *arg)
|
||||||
|
{
|
||||||
|
BTA_DmBleReadRSSI(arg->read_rssi_delta.bda.address, btc_gap_bt_read_rssi_delta_cmpl_callback);
|
||||||
|
}
|
||||||
|
|
||||||
void btc_gap_bt_call_handler(btc_msg_t *msg)
|
void btc_gap_bt_call_handler(btc_msg_t *msg)
|
||||||
{
|
{
|
||||||
btc_gap_bt_args_t *arg = (btc_gap_bt_args_t *)msg->arg;
|
btc_gap_bt_args_t *arg = (btc_gap_bt_args_t *)msg->arg;
|
||||||
@ -635,6 +661,10 @@ void btc_gap_bt_call_handler(btc_msg_t *msg)
|
|||||||
btc_gap_bt_set_cod(msg->arg);
|
btc_gap_bt_set_cod(msg->arg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case BTC_GAP_BT_ACT_READ_RSSI_DELTA: {
|
||||||
|
btc_gap_bt_read_rssi_delta(msg->arg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -658,4 +688,15 @@ void btc_gap_bt_busy_level_updated(uint8_t bl_flags)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void btc_gap_bt_cb_handler(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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
#endif /* (BTC_GAP_BT_INCLUDED == TRUE) */
|
#endif /* (BTC_GAP_BT_INCLUDED == TRUE) */
|
||||||
|
@ -34,6 +34,7 @@ typedef enum {
|
|||||||
BTC_GAP_BT_ACT_GET_REMOTE_SERVICE_RECORD,
|
BTC_GAP_BT_ACT_GET_REMOTE_SERVICE_RECORD,
|
||||||
BTC_GAP_BT_ACT_SEARCH_SERVICE_RECORD,
|
BTC_GAP_BT_ACT_SEARCH_SERVICE_RECORD,
|
||||||
BTC_GAP_BT_ACT_SET_COD,
|
BTC_GAP_BT_ACT_SET_COD,
|
||||||
|
BTC_GAP_BT_ACT_READ_RSSI_DELTA,
|
||||||
} btc_gap_bt_act_t;
|
} btc_gap_bt_act_t;
|
||||||
|
|
||||||
/* btc_bt_gap_args_t */
|
/* btc_bt_gap_args_t */
|
||||||
@ -65,9 +66,14 @@ typedef union {
|
|||||||
esp_bt_cod_mode_t mode;
|
esp_bt_cod_mode_t mode;
|
||||||
} set_cod;
|
} set_cod;
|
||||||
|
|
||||||
|
//BTC_GAP_BT_ACT_READ_RSSI_DELTA,
|
||||||
|
struct bt_read_rssi_delta_args {
|
||||||
|
bt_bdaddr_t bda;
|
||||||
|
} read_rssi_delta;
|
||||||
} btc_gap_bt_args_t;
|
} btc_gap_bt_args_t;
|
||||||
|
|
||||||
void btc_gap_bt_call_handler(btc_msg_t *msg);
|
void btc_gap_bt_call_handler(btc_msg_t *msg);
|
||||||
|
void btc_gap_bt_cb_handler(btc_msg_t *msg);
|
||||||
|
|
||||||
void btc_gap_bt_busy_level_updated(uint8_t bl_flags);
|
void btc_gap_bt_busy_level_updated(uint8_t bl_flags);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user