18#ifndef NIMBLE_CPP_REMOTE_VALUE_ATTRIBUTE_H_
19#define NIMBLE_CPP_REMOTE_VALUE_ATTRIBUTE_H_
22#if CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_CENTRAL
24# if defined(CONFIG_NIMBLE_CPP_IDF)
25# include <host/ble_gatt.h>
27# include <nimble/nimble/host/include/host/ble_gatt.h>
35# include "NimBLEValueAttribute.h"
36# include "NimBLEAttValue.h"
40class NimBLERemoteValueAttribute :
public NimBLEValueAttribute,
public NimBLEAttribute {
61 bool writeValue(
const uint8_t* data,
size_t length,
bool response =
false)
const;
70 bool writeValue(
const char* str,
size_t length = 0,
bool response =
false)
const {
71 return writeValue(
reinterpret_cast<const uint8_t*
>(str), length ? length : strlen(str), response);
74# if __cplusplus < 201703L
86 typename std::enable_if<!std::is_pointer<T>::value && !Has_c_str_length<T>::value && !Has_data_size<T>::value,
bool>::type
88 writeValue(
const T& v,
bool response =
false)
const {
89 return writeValue(
reinterpret_cast<const uint8_t*
>(&v),
sizeof(T), response);
102 typename std::enable_if<Has_c_str_length<T>::value && !Has_data_size<T>::value,
bool>::type
104 writeValue(
const T& s,
bool response =
false)
const {
105 return writeValue(
reinterpret_cast<const uint8_t*
>(s.c_str()), s.length(), response);
115 template <
typename T>
119 typename std::enable_if<Has_data_size<T>::value && Has_value_type<T>::value,
bool>::type
121 writeValue(
const T& v,
bool response =
false)
const {
123 reinterpret_cast<const uint8_t*
>(v.data()),
124 v.size() *
sizeof(
typename T::value_type),
135 template <
typename T>
139 typename std::enable_if<Has_data_size<T>::value && !Has_value_type<T>::value,
bool>::type
141 writeValue(
const T& v,
bool response =
false)
const {
142 return writeValue(
reinterpret_cast<const uint8_t*
>(v.data()), v.size(), response);
152 template <
typename T>
153 typename std::enable_if<!std::is_pointer<T>::value,
bool>::type writeValue(
const T& v,
bool response =
false)
const {
154 if constexpr (Has_data_size<T>::value) {
155 if constexpr (Has_value_type<T>::value) {
156 return writeValue(
reinterpret_cast<const uint8_t*
>(v.data()), v.size() *
sizeof(
typename T::value_type), response);
158 return writeValue(
reinterpret_cast<const uint8_t*
>(v.data()), v.size(), response);
160 }
else if constexpr (Has_c_str_length<T>::value) {
161 return writeValue(
reinterpret_cast<const uint8_t*
>(v.c_str()), v.length(), response);
163 return writeValue(
reinterpret_cast<const uint8_t*
>(&v),
sizeof(v), response);
177 template <
typename T>
178 T readValue(time_t* timestamp =
nullptr,
bool skipSizeCheck =
false) {
180 return getValue<T>(timestamp, skipSizeCheck);
187 NimBLERemoteValueAttribute(
const ble_uuid_any_t& uuid, uint16_t handle) :
NimBLEAttribute{uuid, handle} {}
192 virtual ~NimBLERemoteValueAttribute() =
default;
194 static int onReadCB(uint16_t conn_handle,
const ble_gatt_error* error, ble_gatt_attr* attr,
void* arg);
195 static int onWriteCB(uint16_t conn_handle,
const ble_gatt_error* error, ble_gatt_attr* attr,
void* arg);
A specialized container class to hold BLE attribute values.
Definition NimBLEAttValue.h:80
A base class for BLE attributes.
Definition NimBLEAttribute.h:29
A model of a BLE client.
Definition NimBLEClient.h:49