Skip to content

Commit eb3c2e5

Browse files
committed
fix(RemoteChar): Revert NimBLEDescriptorFilter
1 parent 5179398 commit eb3c2e5

File tree

2 files changed

+25
-22
lines changed

2 files changed

+25
-22
lines changed

src/NimBLERemoteCharacteristic.cpp

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,10 @@
2727

2828
# include <climits>
2929

30-
struct NimBLEDescriptorFilter {
31-
NimBLERemoteDescriptor* dsc;
32-
const NimBLEUUID* uuid;
33-
void* taskData;
34-
};
30+
typedef struct {
31+
const NimBLEUUID* uuid;
32+
void* taskData;
33+
} desc_filter_t;
3534

3635
static const char* LOG_TAG = "NimBLERemoteCharacteristic";
3736

@@ -69,7 +68,7 @@ int NimBLERemoteCharacteristic::descriptorDiscCB(uint16_t connHandle,
6968
const ble_gatt_dsc* dsc,
7069
void* arg) {
7170
int rc = error->status;
72-
auto filter = (NimBLEDescriptorFilter*)arg;
71+
auto filter = (desc_filter_t*)arg;
7372
auto pTaskData = (NimBLETaskData*)filter->taskData;
7473
const auto pChr = (NimBLERemoteCharacteristic*)pTaskData->m_pInstance;
7574
const auto uuid = filter->uuid; // UUID to filter for
@@ -93,10 +92,10 @@ int NimBLERemoteCharacteristic::descriptorDiscCB(uint16_t connHandle,
9392

9493
/**
9594
* @brief Populate the descriptors (if any) for this characteristic.
96-
* @param [in] filter Structure containing pointers to descriptor, UUID, and task data.
95+
* This function will not return until we have all the descriptors.
9796
* @return True if successfully retrieved, success = BLE_HS_EDONE.
9897
*/
99-
bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* filter) const {
98+
bool NimBLERemoteCharacteristic::retrieveDescriptors(const NimBLEUUID* uuid, NimBLERemoteDescriptor* out) const {
10099
NIMBLE_LOGD(LOG_TAG, ">> retrieveDescriptors() for characteristic: %s", getUUID().toString().c_str());
101100

102101
// If this is the last handle then there are no descriptors
@@ -105,24 +104,29 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* fil
105104
return true;
106105
}
107106

107+
NimBLETaskData taskData(const_cast<NimBLERemoteCharacteristic*>(this));
108+
desc_filter_t filter = {uuid, &taskData};
109+
108110
int rc = ble_gattc_disc_all_dscs(getClient()->getConnHandle(),
109111
getHandle(),
110112
getRemoteService()->getEndHandle(),
111113
NimBLERemoteCharacteristic::descriptorDiscCB,
112-
filter);
114+
&filter);
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(taskData, BLE_NPL_TIME_FOREVER);
121+
rc = 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+
if (out) {
128+
out = m_vDescriptors.back();
129+
}
126130
NIMBLE_LOGD(LOG_TAG, "<< retrieveDescriptors(): found %d descriptors.", m_vDescriptors.size());
127131
return true;
128132
} // retrieveDescriptors
@@ -134,36 +138,35 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* fil
134138
*/
135139
NimBLERemoteDescriptor* NimBLERemoteCharacteristic::getDescriptor(const NimBLEUUID& uuid) const {
136140
NIMBLE_LOGD(LOG_TAG, ">> getDescriptor: uuid: %s", uuid.toString().c_str());
137-
NimBLETaskData taskData(const_cast<NimBLERemoteCharacteristic*>(this));
138-
NimBLEDescriptorFilter filter = {nullptr, &uuid, &taskData};
139-
NimBLEUUID uuidTmp;
141+
NimBLERemoteDescriptor* pDsc = nullptr;
142+
NimBLEUUID uuidTmp;
140143

141144
for (const auto& dsc : m_vDescriptors) {
142145
if (dsc->getUUID() == uuid) {
143-
filter.dsc = dsc;
146+
pDsc = dsc;
144147
goto Done;
145148
}
146149
}
147150

148-
if (!retrieveDescriptors(&filter) || filter.dsc) {
151+
if (!retrieveDescriptors(&uuid, pDsc) || pDsc) {
149152
goto Done;
150153
}
151154
// Try again with 128 bit uuid if request succeeded with no uuid found.
152155
if (uuid.bitSize() == BLE_UUID_TYPE_16 || uuid.bitSize() == BLE_UUID_TYPE_32) {
153156
uuidTmp = NimBLEUUID(uuid).to128();
154-
retrieveDescriptors(&filter);
157+
retrieveDescriptors(&uuid, pDsc);
155158
goto Done;
156159
}
157160
// Try again with 16 bit uuid if request succeeded with no uuid found.
158161
// If the uuid was 128 bit but not of the BLE base type this check will fail.
159162
uuidTmp = NimBLEUUID(uuid).to16();
160163
if (uuidTmp.bitSize() == BLE_UUID_TYPE_16) {
161-
retrieveDescriptors(&filter);
164+
retrieveDescriptors(&uuid, pDsc);
162165
}
163166

164167
Done:
165-
NIMBLE_LOGD(LOG_TAG, "<< getDescriptor: %sfound", filter.dsc ? "" : "not ");
166-
return filter.dsc;
168+
NIMBLE_LOGD(LOG_TAG, "<< getDescriptor: %sfound", pDsc ? "" : "not ");
169+
return pDsc;
167170
} // getDescriptor
168171

169172
/**

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(const NimBLEUUID* uuid = nullptr, NimBLERemoteDescriptor* out = 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)