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);
120 template <
typename T>
124 typename std::enable_if<Has_data_size<T>::value && Has_value_type<T>::value,
bool>::type
126 notify(
const T& v, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
const {
128 reinterpret_cast<const uint8_t*
>(v.data()),
129 v.size() *
sizeof(
typename T::value_type),
139 template <
typename T>
143 typename std::enable_if<Has_data_size<T>::value && !Has_value_type<T>::value,
bool>::type
145 notify(
const T& v, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
const {
146 return notify(
reinterpret_cast<const uint8_t*
>(v.data()), v.size(), connHandle);
155 template <
typename T>
159 typename std::enable_if<!std::is_pointer<T>::value && !std::is_array<T>::value && !Has_c_str_length<T>::value &&
160 !Has_data_size<T>::value,
163 indicate(
const T& v, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
const {
164 return indicate(
reinterpret_cast<const uint8_t*
>(&v),
sizeof(T), connHandle);
172 template <
typename T>
176 typename std::enable_if<Has_c_str_length<T>::value && !Has_data_size<T>::value,
bool>::type
178 indicate(
const T& s, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
const {
179 return indicate(
reinterpret_cast<const uint8_t*
>(s.c_str()), s.length(), connHandle);
188 template <
typename T>
192 typename std::enable_if<Has_data_size<T>::value && Has_value_type<T>::value,
bool>::type
194 indicate(
const T& v, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
const {
196 reinterpret_cast<const uint8_t*
>(v.data()),
197 v.size() *
sizeof(
typename T::value_type),
207 template <
typename T>
211 typename std::enable_if<Has_data_size<T>::value && !Has_value_type<T>::value,
bool>::type
213 indicate(
const T& v, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
const {
214 return indicate(
reinterpret_cast<const uint8_t*
>(v.data()), v.size(), connHandle);
229 template <
typename T>
230 typename std::enable_if<!std::is_pointer<T>::value && !std::is_array<T>::value,
bool>::type
notify(
231 const T& value, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
const {
232 if constexpr (Has_data_size<T>::value) {
233 if constexpr (Has_value_type<T>::value) {
234 return notify(
reinterpret_cast<const uint8_t*
>(value.data()), value.size() *
sizeof(
typename T::value_type), connHandle);
236 return notify(
reinterpret_cast<const uint8_t*
>(value.data()), value.size(), connHandle);
238 }
else if constexpr (Has_c_str_length<T>::value) {
239 return notify(
reinterpret_cast<const uint8_t*
>(value.c_str()), value.length(), connHandle);
241 return notify(
reinterpret_cast<const uint8_t*
>(&value),
sizeof(value), connHandle);
255 template <
typename T>
256 typename std::enable_if<!std::is_pointer<T>::value && !std::is_array<T>::value,
bool>::type
indicate(
257 const T& value, uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
const {
258 if constexpr (Has_data_size<T>::value) {
259 if constexpr (Has_value_type<T>::value) {
260 return indicate(
reinterpret_cast<const uint8_t*
>(value.data()), value.size() *
sizeof(
typename T::value_type), connHandle);
262 return indicate(
reinterpret_cast<const uint8_t*
>(value.data()), value.size(), connHandle);
264 }
else if constexpr (Has_c_str_length<T>::value) {
265 return indicate(
reinterpret_cast<const uint8_t*
>(value.c_str()), value.length(), connHandle);
267 return indicate(
reinterpret_cast<const uint8_t*
>(&value),
sizeof(value), connHandle);
278 void writeEvent(
const uint8_t* val, uint16_t len,
NimBLEConnInfo& connInfo)
override;
279 bool sendValue(
const uint8_t* value,
281 bool is_notification =
true,
282 uint16_t connHandle = BLE_HS_CONN_HANDLE_NONE)
const;
286 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:296
virtual void onSubscribe(NimBLECharacteristic *pCharacteristic, NimBLEConnInfo &connInfo, uint16_t subValue)
Callback function called when a client changes subscription status.
Definition NimBLECharacteristic.cpp:423
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:178
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:163
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