esp_err_t esp_blufi_register_callbacks(esp_blufi_callbacks_t *callbacks)
{
+ if (ESP_BLUEDROID_STATUS_UNINITIALIZED == esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
if (callbacks == NULL) {
return ESP_FAIL;
}
btc_msg_t msg;
btc_blufi_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_BLUFI;
msg.act = BTC_BLUFI_ACT_SEND_CFG_REPORT;
{
btc_msg_t msg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_BLUFI;
msg.act = BTC_BLUFI_ACT_INIT;
{
btc_msg_t msg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_BLUFI;
msg.act = BTC_BLUFI_ACT_DEINIT;
#include "esp_bt_device.h"
+#include "esp_bt_main.h"
#include "controller.h"
const uint8_t *esp_bt_dev_get_address(void)
{
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return NULL;
+ }
return controller_get_interface()->get_address()->address;
}
static bool esp_already_enable = false;
static bool esp_already_init = false;
+esp_bluedroid_status_t esp_bluedroid_get_status(void)
+{
+ if (esp_already_init) {
+ if (esp_already_enable) {
+ return ESP_BLUEDROID_STATUS_ENABLED;
+ } else {
+ return ESP_BLUEDROID_STATUS_INITIALIZED;
+ }
+ } else {
+ return ESP_BLUEDROID_STATUS_UNINITIALIZED;
+ }
+}
+
esp_err_t esp_bluedroid_enable(void)
{
btc_msg_t msg;
return ESP_FAIL;
}
- esp_already_init = true;;
+ esp_already_init = true;
return ESP_OK;
}
#include <string.h>
+#include "esp_bt_main.h"
#include "esp_gap_ble_api.h"
#include "bta_api.h"
#include "bt_trace.h"
esp_err_t esp_ble_gap_register_callback(esp_gap_ble_cb_t callback)
{
+ if (ESP_BLUEDROID_STATUS_UNINITIALIZED == esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
return (btc_profile_cb_set(BTC_PID_GAP_BLE, callback) == 0 ? ESP_OK : ESP_FAIL);
}
{
btc_msg_t msg;
btc_ble_gap_args_t arg;
-
+
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
if (adv_data == NULL) {
return ESP_ERR_INVALID_ARG;
}
{
btc_msg_t msg;
btc_ble_gap_args_t arg;
-
+
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
if (scan_params == NULL) {
return ESP_ERR_INVALID_ARG;
}
btc_msg_t msg;
btc_ble_gap_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GAP_BLE;
msg.act = BTC_GAP_BLE_ACT_START_SCAN;
esp_err_t esp_ble_gap_stop_scanning(void)
{
btc_msg_t msg;
-
+
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GAP_BLE;
msg.act = BTC_GAP_BLE_ACT_STOP_SCAN;
btc_msg_t msg;
btc_ble_gap_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GAP_BLE;
msg.act = BTC_GAP_BLE_ACT_START_ADV;
{
btc_msg_t msg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GAP_BLE;
msg.act = BTC_GAP_BLE_ACT_STOP_ADV;
btc_msg_t msg;
btc_ble_gap_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GAP_BLE;
msg.act = BTC_GAP_BLE_ACT_UPDATE_CONN_PARAM;
{
btc_msg_t msg;
btc_ble_gap_args_t arg;
-
+
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GAP_BLE;
msg.act = BTC_GAP_BLE_ACT_SET_PKT_DATA_LEN;
{
btc_msg_t msg;
btc_ble_gap_args_t arg;
-
+
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GAP_BLE;
msg.act = BTC_GAP_BLE_ACT_SET_RAND_ADDRESS;
btc_msg_t msg;
btc_ble_gap_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GAP_BLE;
msg.act = BTC_GAP_BLE_ACT_CONFIG_LOCAL_PRIVACY;
btc_msg_t msg;
btc_ble_gap_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
if (strlen(name) > ESP_GAP_DEVICE_NAME_MAX) {
return ESP_ERR_INVALID_ARG;
}
#include <string.h>
#include "esp_gattc_api.h"
+#include "esp_bt_main.h"
#include "btc_manage.h"
#include "btc_gattc.h"
#include "btc_gatt_util.h"
esp_err_t esp_ble_gattc_register_callback(esp_gattc_cb_t callback)
{
+ if (ESP_BLUEDROID_STATUS_UNINITIALIZED == esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
if (callback == NULL) {
return ESP_FAIL;
}
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
if (app_id > ESP_APP_ID_MAX) {
return ESP_ERR_INVALID_ARG;
}
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTC;
msg.act = BTC_GATTC_ACT_APP_UNREGISTER;
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTC;
msg.act = BTC_GATTC_ACT_OPEN;
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTC;
msg.act = BTC_GATTC_ACT_CLOSE;
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
if ((mtu < ESP_GATT_DEF_BLE_MTU_SIZE) || (mtu > ESP_GATT_MAX_MTU_SIZE)) {
return ESP_GATT_ILLEGAL_PARAMETER;
}
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTC;
msg.act = BTC_GATTC_ACT_SEARCH_SERVICE;
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTC;
if (start_char_id) {
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTC;
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTC;
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTC;
msg.act = BTC_GATTC_ACT_READ_CHAR;
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTC;
msg.act = BTC_GATTC_ACT_READ_CHAR_DESCR;
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTC;
msg.act = BTC_GATTC_ACT_WRITE_CHAR;
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTC;
msg.act = BTC_GATTC_ACT_WRITE_CHAR_DESCR;
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTC;
msg.act = BTC_GATTC_ACT_PREPARE_WRITE;
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTC;
msg.act = BTC_GATTC_ACT_EXECUTE_WRITE;
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTC;
msg.act = BTC_GATTC_ACT_REG_FOR_NOTIFY;
btc_msg_t msg;
btc_ble_gattc_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTC;
msg.act = BTC_GATTC_ACT_UNREG_FOR_NOTIFY;
#include "string.h"
#include "esp_gatt_defs.h"
#include "esp_gatts_api.h"
+#include "esp_bt_main.h"
#include "btc_manage.h"
#include "btc_gatts.h"
#include "btc_gatt_util.h"
esp_err_t esp_ble_gatts_register_callback(esp_gatts_cb_t callback)
{
+ if (ESP_BLUEDROID_STATUS_UNINITIALIZED == esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
return (btc_profile_cb_set(BTC_PID_GATTS, callback) == 0 ? ESP_OK : ESP_FAIL);
}
btc_msg_t msg;
btc_ble_gatts_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
//if (app_id < ESP_APP_ID_MIN || app_id > ESP_APP_ID_MAX) {
if (app_id > ESP_APP_ID_MAX) {
return ESP_ERR_INVALID_ARG;
btc_msg_t msg;
btc_ble_gatts_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTS;
msg.act = BTC_GATTS_ACT_APP_UNREGISTER;
btc_msg_t msg;
btc_ble_gatts_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTS;
msg.act = BTC_GATTS_ACT_CREATE_SERVICE;
btc_msg_t msg;
btc_ble_gatts_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTS;
msg.act = BTC_GATTS_ACT_ADD_INCLUDE_SERVICE;
btc_msg_t msg;
btc_ble_gatts_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTS;
msg.act = BTC_GATTS_ACT_ADD_CHAR;
btc_msg_t msg;
btc_ble_gatts_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTS;
msg.act = BTC_GATTS_ACT_ADD_CHAR_DESCR;
btc_msg_t msg;
btc_ble_gatts_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTS;
msg.act = BTC_GATTS_ACT_DELETE_SERVICE;
btc_msg_t msg;
btc_ble_gatts_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTS;
msg.act = BTC_GATTS_ACT_START_SERVICE;
btc_msg_t msg;
btc_ble_gatts_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTS;
msg.act = BTC_GATTS_ACT_STOP_SERVICE;
btc_msg_t msg;
btc_ble_gatts_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTS;
msg.act = BTC_GATTS_ACT_SEND_INDICATE;
btc_msg_t msg;
btc_ble_gatts_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTS;
msg.act = BTC_GATTS_ACT_SEND_RESPONSE;
btc_msg_t msg;
btc_ble_gatts_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTS;
msg.act = BTC_GATTS_ACT_OPEN;
btc_msg_t msg;
btc_ble_gatts_args_t arg;
+ if (ESP_BLUEDROID_STATUS_ENABLED != esp_bluedroid_get_status()) {
+ return ESP_ERR_INVALID_STATE;
+ }
+
msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GATTS;
msg.act = BTC_GATTS_ACT_CLOSE;
*
* @brief Get bluetooth device address. Must use after "esp_bluedroid_enable".
*
- * @return bluetooth device address (six bytes)
+ * @return bluetooth device address (six bytes), or NULL if bluetooth stack is not enabled
*/
const uint8_t *esp_bt_dev_get_address(void);
extern "C" {
#endif
+/**
+ * @brief Bluetooth stack status type, to indicate whether the bluetooth stack is ready
+ */
+typedef enum {
+ ESP_BLUEDROID_STATUS_UNINITIALIZED = 0, /*!< Bluetooth not initialized */
+ ESP_BLUEDROID_STATUS_INITIALIZED, /*!< Bluetooth initialized but not enabled */
+ ESP_BLUEDROID_STATUS_ENABLED /*!< Bluetooth initialized and enabled */
+} esp_bluedroid_status_t;
+
+/**
+ * @brief Get bluetooth stack status
+ *
+ * @return Bluetooth stack status
+ *
+ */
+esp_bluedroid_status_t esp_bluedroid_get_status(void);
+
/**
* @brief Enable bluetooth, must after esp_bluedroid_init()
*
static void btc_enable_bluetooth(void)
{
if (BTA_EnableBluetooth(btc_sec_callback) != BTA_SUCCESS) {
- future_ready(*btc_main_get_future_p(BTC_MAIN_ENABLE_FUTURE), FUTURE_SUCCESS);
+ future_ready(*btc_main_get_future_p(BTC_MAIN_ENABLE_FUTURE), FUTURE_FAIL);
}
}
static void btc_disable_bluetooth(void)
{
if (BTA_DisableBluetooth() != BTA_SUCCESS) {
- future_ready(*btc_main_get_future_p(BTC_MAIN_DISABLE_FUTURE), FUTURE_SUCCESS);
+ future_ready(*btc_main_get_future_p(BTC_MAIN_DISABLE_FUTURE), FUTURE_FAIL);
}
}
Bluetooth Controller && VHCI <controller_vhci>
Bluetooth Common <bt_common>
- Bluetooth Classic
Bluetooth LE <bt_le>
--------
BLUFI is a profile based GATT to config ESP32 WIFI to connect/disconnect AP or setup a softap and etc.
Use should concern these things:
- 1. The event sent from profile. Then you need to do something as the event indicate.
- 2. Security reference. You can write your own Security functions such as symmetrical encryption/decryption and checksum functions.
- Even you can define the "Key Exchange/Negotiation" procedure.
+1. The event sent from profile. Then you need to do something as the event indicate.
+2. Security reference. You can write your own Security functions such as symmetrical encryption/decryption and checksum functions.
+Even you can define the "Key Exchange/Negotiation" procedure.
Application Example
-------------------
Enumerations
^^^^^^^^^^^^
+.. doxygenenum:: esp_bluedroid_status_t
+
Structures
^^^^^^^^^^
Functions
^^^^^^^^^
+.. doxygenfunction:: esp_bluedroid_get_status
.. doxygenfunction:: esp_bluedroid_enable
.. doxygenfunction:: esp_bluedroid_disable
.. doxygenfunction:: esp_bluedroid_init