18#ifndef NIMBLE_CPP_CHARACTERISTIC_H_ 
   19#define NIMBLE_CPP_CHARACTERISTIC_H_ 
   22#if CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_PERIPHERAL 
   30# include "NimBLELocalValueAttribute.h" 
   44                         uint16_t       properties = NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::WRITE,
 
   45                         uint16_t       maxLen     = BLE_ATT_ATTR_MAX_LEN,
 
   48                         uint16_t          properties = NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::WRITE,
 
   49                         uint16_t          maxLen     = BLE_ATT_ATTR_MAX_LEN,
 
   59    bool        indicate(uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE) 
const;
 
   60    bool        indicate(
const uint8_t* value, 
size_t length, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE) 
const;
 
   61    bool        notify(uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE) 
const;
 
   62    bool        notify(
const uint8_t* value, 
size_t length, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE) 
const;
 
   65                                       uint32_t    properties = NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::WRITE,
 
   66                                       uint16_t    maxLen     = BLE_ATT_ATTR_MAX_LEN);
 
   68                                       uint32_t          properties = NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::WRITE,
 
   69                                       uint16_t          maxLen     = BLE_ATT_ATTR_MAX_LEN);
 
   80# if __cplusplus < 201703L 
   91    typename std::enable_if<!std::is_pointer<T>::value && !std::is_array<T>::value && !Has_c_str_length<T>::value &&
 
   92                                !Has_data_size<T>::value,
 
   95    notify(
const T& v, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
 const {
 
   96        return notify(
reinterpret_cast<const uint8_t*
>(&v), 
sizeof(T), connHandle);
 
 
  104    template <
typename T>
 
  108    typename std::enable_if<Has_c_str_length<T>::value && !Has_data_size<T>::value, 
bool>::type
 
  110    notify(
const T& s, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
 const {
 
  111        return notify(
reinterpret_cast<const uint8_t*
>(s.c_str()), s.length(), connHandle);
 
 
  119    template <
typename T>
 
  123    typename std::enable_if<Has_data_size<T>::value, 
bool>::type
 
  125    notify(
const T& v, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
 const {
 
  126        return notify(
reinterpret_cast<const uint8_t*
>(v.data()), v.size(), connHandle);
 
 
  135    template <
typename T>
 
  139    typename std::enable_if<!std::is_pointer<T>::value && !std::is_array<T>::value && !Has_c_str_length<T>::value &&
 
  140                                !Has_data_size<T>::value,
 
  143    indicate(
const T& v, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
 const {
 
  144        return indicate(
reinterpret_cast<const uint8_t*
>(&v), 
sizeof(T), connHandle);
 
 
  152    template <
typename T>
 
  156    typename std::enable_if<Has_c_str_length<T>::value && !Has_data_size<T>::value, 
bool>::type
 
  158    indicate(
const T& s, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
 const {
 
  159        return indicate(
reinterpret_cast<const uint8_t*
>(s.c_str()), s.length(), connHandle);
 
 
  167    template <
typename T>
 
  171    typename std::enable_if<Has_data_size<T>::value, 
bool>::type
 
  173    indicate(
const T& v, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
 const {
 
  174        return indicate(
reinterpret_cast<const uint8_t*
>(v.data()), v.size(), connHandle);
 
 
  189    template <
typename T>
 
  190    typename std::enable_if<!std::is_pointer<T>::value && !std::is_array<T>::value, 
bool>::type 
notify(
 
  191        const T& value, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
 const {
 
  192        if constexpr (Has_data_size<T>::value) {
 
  193            return notify(
reinterpret_cast<const uint8_t*
>(value.data()), value.size(), connHandle);
 
  194        } 
else if constexpr (Has_c_str_length<T>::value) {
 
  195            return notify(
reinterpret_cast<const uint8_t*
>(value.c_str()), value.length(), connHandle);
 
  197            return notify(
reinterpret_cast<const uint8_t*
>(&value), 
sizeof(value), connHandle);
 
  211    template <
typename T>
 
  212    typename std::enable_if<!std::is_pointer<T>::value && !std::is_array<T>::value, 
bool>::type 
indicate(
 
  213        const T& value, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
 const {
 
  214        if constexpr (Has_data_size<T>::value) {
 
  215            return indicate(
reinterpret_cast<const uint8_t*
>(value.data()), value.size(), connHandle);
 
  216        } 
else if constexpr (Has_c_str_length<T>::value) {
 
  217            return indicate(
reinterpret_cast<const uint8_t*
>(value.c_str()), value.length(), connHandle);
 
  219            return indicate(
reinterpret_cast<const uint8_t*
>(&value), 
sizeof(value), connHandle);
 
  230    void writeEvent(
const uint8_t* val, uint16_t len, 
NimBLEConnInfo& connInfo) 
override;
 
  231    bool sendValue(
const uint8_t* value,
 
  233                   bool           is_notification = 
true,
 
  234                   uint16_t       connHandle      = BLE_HS_CONN_HANDLE_NONE) 
const;
 
  238    std::vector<NimBLEDescriptor*> m_vDescriptors{};
 
 
Descriptor for Characteristic Presentation Format.
Definition NimBLE2904.h:39
 
Callbacks that can be associated with a BLE characteristic to inform of events.
Definition NimBLECharacteristic.h:248
 
virtual void onSubscribe(NimBLECharacteristic *pCharacteristic, NimBLEConnInfo &connInfo, uint16_t subValue)
Callback function called when a client changes subscription status.
Definition NimBLECharacteristic.cpp:411
 
virtual void onRead(NimBLECharacteristic *pCharacteristic, NimBLEConnInfo &connInfo)
Callback function to support a read request.
Definition NimBLECharacteristic.cpp:377
 
virtual void onStatus(NimBLECharacteristic *pCharacteristic, int code)
Callback function to support a Notify/Indicate Status report.
Definition NimBLECharacteristic.cpp:397
 
virtual void onWrite(NimBLECharacteristic *pCharacteristic, NimBLEConnInfo &connInfo)
Callback function to support a write request.
Definition NimBLECharacteristic.cpp:386
 
The model of a BLE Characteristic.
Definition NimBLECharacteristic.h:41
 
uint16_t getProperties() const
Get the properties of the characteristic.
Definition NimBLECharacteristic.cpp:199
 
NimBLEDescriptor * getDescriptorByHandle(uint16_t handle) const
Return the BLE Descriptor for the given handle.
Definition NimBLECharacteristic.cpp:186
 
void setCallbacks(NimBLECharacteristicCallbacks *pCallbacks)
Set the callback handlers for this characteristic.
Definition NimBLECharacteristic.cpp:338
 
void removeDescriptor(NimBLEDescriptor *pDescriptor, bool deleteDsc=false)
Remove a descriptor from the characteristic.
Definition NimBLECharacteristic.cpp:136
 
bool indicate(const T &s, uint16_t connHandle=BLE_HS_CONN_HANDLE_NONE) const
Template to send a indication with a value from a class that has a c_str() and length() method.
Definition NimBLECharacteristic.h:158
 
NimBLEDescriptor * getDescriptorByUUID(const char *uuid) const
Return the BLE Descriptor for the given UUID.
Definition NimBLECharacteristic.cpp:163
 
~NimBLECharacteristic()
Destructor.
Definition NimBLECharacteristic.cpp:53
 
NimBLEService * getService() const
Get the service that owns this characteristic.
Definition NimBLECharacteristic.cpp:206
 
bool notify(const T &v, uint16_t connHandle=BLE_HS_CONN_HANDLE_NONE) const
Template to send a notification with a value from a struct or array.
Definition NimBLECharacteristic.h:95
 
bool indicate(const T &v, uint16_t connHandle=BLE_HS_CONN_HANDLE_NONE) const
Template to send an indication with a value from a struct or array.
Definition NimBLECharacteristic.h:143
 
NimBLEDescriptor * createDescriptor(const char *uuid, uint32_t properties=NIMBLE_PROPERTY::READ|NIMBLE_PROPERTY::WRITE, uint16_t maxLen=BLE_ATT_ATTR_MAX_LEN)
Create a new BLE Descriptor associated with this characteristic.
Definition NimBLECharacteristic.cpp:66
 
bool indicate(uint16_t connHandle=BLE_HS_CONN_HANDLE_NONE) const
Send an indication.
Definition NimBLECharacteristic.cpp:220
 
bool notify(const T &s, uint16_t connHandle=BLE_HS_CONN_HANDLE_NONE) const
Template to send a notification with a value from a class that has a c_str() and length() method.
Definition NimBLECharacteristic.h:110
 
NimBLECharacteristicCallbacks * getCallbacks() const
Get the callback handlers for this characteristic.
Definition NimBLECharacteristic.cpp:349
 
bool notify(uint16_t connHandle=BLE_HS_CONN_HANDLE_NONE) const
Send a notification.
Definition NimBLECharacteristic.cpp:242
 
NimBLE2904 * create2904()
Create a Characteristic Presentation Format Descriptor for this characteristic.
Definition NimBLECharacteristic.cpp:94
 
void addDescriptor(NimBLEDescriptor *pDescriptor)
Add a descriptor to the characteristic.
Definition NimBLECharacteristic.cpp:104
 
std::string toString() const
Return a string representation of the characteristic.
Definition NimBLECharacteristic.cpp:357
 
Connection information.
Definition NimBLEConnInfo.h:32
 
A model of a BLE descriptor.
Definition NimBLEDescriptor.h:33
 
The model of a BLE server.
Definition NimBLEServer.h:62
 
The model of a BLE service.
Definition NimBLEService.h:34
 
A model of a BLE UUID.
Definition NimBLEUUID.h:41