MeshTalos-Client/managed_components/espressif__arduino-esp32/libraries/BLE/src/BLEDescriptor.h
2025-12-03 14:20:11 +08:00

187 lines
7.7 KiB
C++

/*
* BLEDescriptor.h
*
* Created on: Jun 22, 2017
* Author: kolban
*
* Modified on: Feb 18, 2025
* Author: lucasssvaz (based on kolban's and h2zero's work)
* Description: Added support for NimBLE
*/
#ifndef COMPONENTS_CPP_UTILS_BLEDESCRIPTOR_H_
#define COMPONENTS_CPP_UTILS_BLEDESCRIPTOR_H_
#include "soc/soc_caps.h"
#include "sdkconfig.h"
#if defined(SOC_BLE_SUPPORTED) || defined(CONFIG_ESP_HOSTED_ENABLE_BT_NIMBLE)
#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)
/***************************************************************************
* Common includes *
***************************************************************************/
#include <string>
#include "BLEUUID.h"
#include "BLECharacteristic.h"
#include "RTOS.h"
/***************************************************************************
* Bluedroid includes *
***************************************************************************/
#if defined(CONFIG_BLUEDROID_ENABLED)
#include <esp_gatts_api.h>
#endif
/***************************************************************************
* NimBLE includes *
***************************************************************************/
#if defined(CONFIG_NIMBLE_ENABLED)
#include <host/ble_att.h>
#include "BLEConnInfo.h"
// Bluedroid compatibility
// NimBLE does not support signed reads and writes
#define ESP_GATT_PERM_READ BLE_ATT_F_READ
#define ESP_GATT_PERM_WRITE BLE_ATT_F_WRITE
#define ESP_GATT_PERM_READ_ENCRYPTED BLE_ATT_F_READ_ENC
#define ESP_GATT_PERM_WRITE_ENCRYPTED BLE_ATT_F_WRITE_ENC
#define ESP_GATT_PERM_READ_AUTHORIZATION BLE_ATT_F_READ_AUTHOR
#define ESP_GATT_PERM_WRITE_AUTHORIZATION BLE_ATT_F_WRITE_AUTHOR
#define ESP_GATT_PERM_READ_ENC_MITM BLE_ATT_F_READ_AUTHEN
#define ESP_GATT_PERM_WRITE_ENC_MITM BLE_ATT_F_WRITE_AUTHEN
#endif
/***************************************************************************
* NimBLE types *
***************************************************************************/
#if defined(CONFIG_NIMBLE_ENABLED)
typedef struct {
uint16_t attr_max_len; /*!< attribute max value length */
uint16_t attr_len; /*!< attribute current value length */
uint8_t *attr_value; /*!< the pointer to attribute value */
} esp_attr_value_t;
#endif
/***************************************************************************
* Forward declarations *
***************************************************************************/
class BLEService;
class BLECharacteristic;
class BLEDescriptorCallbacks;
/**
* @brief A model of a %BLE descriptor.
*/
class BLEDescriptor {
public:
/***************************************************************************
* Common public declarations *
***************************************************************************/
BLEDescriptor(const char *uuid, uint16_t max_len = 100);
BLEDescriptor(BLEUUID uuid, uint16_t max_len = 100);
virtual ~BLEDescriptor();
uint16_t getHandle() const; // Get the handle of the descriptor.
size_t getLength() const; // Get the length of the value of the descriptor.
BLEUUID getUUID() const; // Get the UUID of the descriptor.
uint8_t *getValue() const; // Get a pointer to the value of the descriptor.
BLECharacteristic *getCharacteristic() const; // Get the characteristic that this descriptor belongs to.
void setAccessPermissions(uint16_t perm); // Set the permissions of the descriptor.
void setCallbacks(BLEDescriptorCallbacks *pCallbacks); // Set callbacks to be invoked for the descriptor.
void setValue(const uint8_t *data, size_t size); // Set the value of the descriptor as a pointer to data.
void setValue(const String &value); // Set the value of the descriptor as a data buffer.
String toString() const; // Convert the descriptor to a string representation.
/***************************************************************************
* Bluedroid public declarations *
***************************************************************************/
#if defined(CONFIG_BLUEDROID_ENABLED)
void handleGATTServerEvent(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param);
#endif
/***************************************************************************
* NimBLE public declarations *
***************************************************************************/
#if defined(CONFIG_NIMBLE_ENABLED)
static int handleGATTServerEvent(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg);
#endif
private:
friend class BLEDescriptorMap;
friend class BLECharacteristic;
friend class BLEService;
friend class BLE2901;
friend class BLE2902;
friend class BLE2904;
/***************************************************************************
* Common private properties *
***************************************************************************/
BLEUUID m_bleUUID;
uint16_t m_handle;
esp_attr_value_t m_value;
BLEDescriptorCallbacks *m_pCallback;
BLECharacteristic *m_pCharacteristic;
FreeRTOS::Semaphore m_semaphoreSetValue = FreeRTOS::Semaphore("SetValue");
/***************************************************************************
* Bluedroid private properties *
***************************************************************************/
#if defined(CONFIG_BLUEDROID_ENABLED)
FreeRTOS::Semaphore m_semaphoreCreateEvt = FreeRTOS::Semaphore("CreateEvt");
uint16_t m_permissions = ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE;
#endif
/***************************************************************************
* NimBLE private properties *
***************************************************************************/
#if defined(CONFIG_NIMBLE_ENABLED)
uint8_t m_permissions = HA_FLAG_PERM_RW;
uint8_t m_removed = 0;
#endif
/***************************************************************************
* Common private declarations *
***************************************************************************/
void executeCreate(BLECharacteristic *pCharacteristic);
void setHandle(uint16_t handle);
}; // BLEDescriptor
/**
* @brief Callbacks that can be associated with a %BLE descriptors to inform of events.
*
* When a server application creates a %BLE descriptor, we may wish to be informed when there is either
* a read or write request to the descriptors value. An application can register a
* sub-classed instance of this class and will be notified when such an event happens.
*/
class BLEDescriptorCallbacks {
public:
/***************************************************************************
* Common public declarations *
***************************************************************************/
virtual ~BLEDescriptorCallbacks();
virtual void onRead(BLEDescriptor *pDescriptor);
virtual void onWrite(BLEDescriptor *pDescriptor);
};
#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */
#endif /* SOC_BLE_SUPPORTED || CONFIG_ESP_HOSTED_ENABLE_BT_NIMBLE */
#endif /* COMPONENTS_CPP_UTILS_BLEDESCRIPTOR_H_ */