Skip to content

Commit fe5a492

Browse files
committed
[BugFix] Provide default task data when retrieving all descriptors.
* Update the descriptor filter when trying again with different UUID sizes.
1 parent 5179398 commit fe5a492

File tree

2 files changed

+26
-22
lines changed

2 files changed

+26
-22
lines changed

src/NimBLERemoteCharacteristic.cpp

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,8 @@ NimBLERemoteCharacteristic::~NimBLERemoteCharacteristic() {
6363
/**
6464
* @brief Callback used by the API when a descriptor is discovered or search complete.
6565
*/
66-
int NimBLERemoteCharacteristic::descriptorDiscCB(uint16_t connHandle,
67-
const ble_gatt_error* error,
68-
uint16_t chrHandle,
69-
const ble_gatt_dsc* dsc,
70-
void* arg) {
66+
int NimBLERemoteCharacteristic::descriptorDiscCB(
67+
uint16_t connHandle, const ble_gatt_error* error, uint16_t chrHandle, const ble_gatt_dsc* dsc, void* arg) {
7168
int rc = error->status;
7269
auto filter = (NimBLEDescriptorFilter*)arg;
7370
auto pTaskData = (NimBLETaskData*)filter->taskData;
@@ -77,8 +74,7 @@ int NimBLERemoteCharacteristic::descriptorDiscCB(uint16_t connHandle,
7774

7875
// Results for chrHandle added until rc != 0
7976
// Must find specified UUID if filter is used
80-
if (rc == 0 && pChr->getHandle() == chrHandle
81-
&& (!uuid || 0 == ble_uuid_cmp(uuid->getBase(), &dsc->uuid.u))) {
77+
if (rc == 0 && pChr->getHandle() == chrHandle && (!uuid || 0 == ble_uuid_cmp(uuid->getBase(), &dsc->uuid.u))) {
8278
// Return BLE_HS_EDONE if the descriptor was found, stop the search
8379
pChr->m_vDescriptors.push_back(new NimBLERemoteDescriptor(pChr, dsc));
8480
rc = !!uuid * BLE_HS_EDONE;
@@ -93,10 +89,10 @@ int NimBLERemoteCharacteristic::descriptorDiscCB(uint16_t connHandle,
9389

9490
/**
9591
* @brief Populate the descriptors (if any) for this characteristic.
96-
* @param [in] filter Structure containing pointers to descriptor, UUID, and task data.
92+
* @param [in] pFilter Pointer to a filter containing pointers to descriptor, UUID, and task data.
9793
* @return True if successfully retrieved, success = BLE_HS_EDONE.
9894
*/
99-
bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* filter) const {
95+
bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* pFilter) const {
10096
NIMBLE_LOGD(LOG_TAG, ">> retrieveDescriptors() for characteristic: %s", getUUID().toString().c_str());
10197

10298
// If this is the last handle then there are no descriptors
@@ -105,24 +101,30 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* fil
105101
return true;
106102
}
107103

104+
NimBLETaskData taskData(const_cast<NimBLERemoteCharacteristic*>(this));
105+
NimBLEDescriptorFilter defaultFilter{nullptr, nullptr, &taskData};
106+
if (pFilter == nullptr) {
107+
pFilter = &defaultFilter;
108+
}
109+
108110
int rc = ble_gattc_disc_all_dscs(getClient()->getConnHandle(),
109111
getHandle(),
110112
getRemoteService()->getEndHandle(),
111113
NimBLERemoteCharacteristic::descriptorDiscCB,
112-
filter);
114+
pFilter);
113115
if (rc != 0) {
114116
NIMBLE_LOGE(LOG_TAG, "ble_gattc_disc_all_dscs: rc=%d %s", rc, NimBLEUtils::returnCodeToString(rc));
115117
return false;
116118
}
117119

118-
NimBLEUtils::taskWait(filter->taskData, BLE_NPL_TIME_FOREVER);
119-
rc = ((NimBLETaskData*)filter->taskData)->m_flags;
120+
NimBLEUtils::taskWait(pFilter->taskData, BLE_NPL_TIME_FOREVER);
121+
rc = ((NimBLETaskData*)pFilter->taskData)->m_flags;
120122
if (rc != BLE_HS_EDONE) {
121123
NIMBLE_LOGE(LOG_TAG, "<< retrieveDescriptors(): failed: rc=%d %s", rc, NimBLEUtils::returnCodeToString(rc));
122124
return false;
123125
}
124126

125-
filter->dsc = m_vDescriptors.back();
127+
pFilter->dsc = m_vDescriptors.back();
126128
NIMBLE_LOGD(LOG_TAG, "<< retrieveDescriptors(): found %d descriptors.", m_vDescriptors.size());
127129
return true;
128130
} // retrieveDescriptors
@@ -134,9 +136,9 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* fil
134136
*/
135137
NimBLERemoteDescriptor* NimBLERemoteCharacteristic::getDescriptor(const NimBLEUUID& uuid) const {
136138
NIMBLE_LOGD(LOG_TAG, ">> getDescriptor: uuid: %s", uuid.toString().c_str());
139+
NimBLEUUID uuidTmp{uuid};
137140
NimBLETaskData taskData(const_cast<NimBLERemoteCharacteristic*>(this));
138-
NimBLEDescriptorFilter filter = {nullptr, &uuid, &taskData};
139-
NimBLEUUID uuidTmp;
141+
NimBLEDescriptorFilter filter{nullptr, &uuidTmp, &taskData};
140142

141143
for (const auto& dsc : m_vDescriptors) {
142144
if (dsc->getUUID() == uuid) {
@@ -148,16 +150,18 @@ NimBLERemoteDescriptor* NimBLERemoteCharacteristic::getDescriptor(const NimBLEUU
148150
if (!retrieveDescriptors(&filter) || filter.dsc) {
149151
goto Done;
150152
}
151-
// Try again with 128 bit uuid if request succeeded with no uuid found.
152-
if (uuid.bitSize() == BLE_UUID_TYPE_16 || uuid.bitSize() == BLE_UUID_TYPE_32) {
153-
uuidTmp = NimBLEUUID(uuid).to128();
153+
154+
// Try again with 128 bit uuid if request succeeded but no descriptor found.
155+
if (uuid.bitSize() != BLE_UUID_TYPE_128) {
156+
uuidTmp.to128();
154157
retrieveDescriptors(&filter);
155158
goto Done;
156159
}
157-
// Try again with 16 bit uuid if request succeeded with no uuid found.
158-
// If the uuid was 128 bit but not of the BLE base type this check will fail.
159-
uuidTmp = NimBLEUUID(uuid).to16();
160+
161+
// If the uuid was 128 bit, try again with 16 bit uuid.
162+
uuidTmp.to16();
160163
if (uuidTmp.bitSize() == BLE_UUID_TYPE_16) {
164+
filter.uuid = &uuidTmp;
161165
retrieveDescriptors(&filter);
162166
}
163167

src/NimBLERemoteCharacteristic.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class NimBLERemoteCharacteristic : public NimBLERemoteValueAttribute {
6767
~NimBLERemoteCharacteristic();
6868

6969
bool setNotify(uint16_t val, notify_callback notifyCallback = nullptr, bool response = true) const;
70-
bool retrieveDescriptors(NimBLEDescriptorFilter* filter = nullptr) const;
70+
bool retrieveDescriptors(NimBLEDescriptorFilter* pFilter = nullptr) const;
7171

7272
static int descriptorDiscCB(
7373
uint16_t connHandle, const ble_gatt_error* error, uint16_t chrHandle, const ble_gatt_dsc* dsc, void* arg);

0 commit comments

Comments
 (0)