diff --git a/src/NimBLERemoteCharacteristic.cpp b/src/NimBLERemoteCharacteristic.cpp index a8d2801b..30023799 100644 --- a/src/NimBLERemoteCharacteristic.cpp +++ b/src/NimBLERemoteCharacteristic.cpp @@ -26,10 +26,13 @@ # include +// Private structure used to filter descriptors during discovery and return results. struct NimBLEDescriptorFilter { - NimBLERemoteDescriptor* dsc; + NimBLEDescriptorFilter() = delete; + NimBLEDescriptorFilter(const NimBLEUUID* uuid, NimBLEUtils::TaskData* td = nullptr) : uuid(uuid), taskData(td) {} const NimBLEUUID* uuid; - void* taskData; + NimBLEUtils::TaskData* taskData; + NimBLERemoteDescriptor* dsc{nullptr}; }; static const char* LOG_TAG = "NimBLERemoteCharacteristic"; @@ -117,9 +120,11 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* pFi } NimBLEUtils::TaskData taskData(const_cast(this)); - NimBLEDescriptorFilter defaultFilter{nullptr, nullptr, &taskData}; + NimBLEDescriptorFilter defaultFilter(nullptr, &taskData); if (pFilter == nullptr) { pFilter = &defaultFilter; + } else { + pFilter->taskData = &taskData; } int rc = ble_gattc_disc_all_dscs(getClient()->getConnHandle(), @@ -134,7 +139,7 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* pFi auto prevDscCount = m_vDescriptors.size(); NimBLEUtils::taskWait(taskData, BLE_NPL_TIME_FOREVER); - rc = ((NimBLEUtils::TaskData*)pFilter->taskData)->m_flags; + rc = taskData.m_flags; if (rc != BLE_HS_EDONE) { NIMBLE_LOGE(LOG_TAG, "<< retrieveDescriptors(): failed: rc=%d %s", rc, NimBLEUtils::returnCodeToString(rc)); return false; @@ -156,8 +161,7 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* pFi NimBLERemoteDescriptor* NimBLERemoteCharacteristic::getDescriptor(const NimBLEUUID& uuid) const { NIMBLE_LOGD(LOG_TAG, ">> getDescriptor: uuid: %s", uuid.toString().c_str()); NimBLEUUID uuidTmp{uuid}; - NimBLEUtils::TaskData taskData(const_cast(this)); - NimBLEDescriptorFilter filter{nullptr, &uuidTmp, &taskData}; + NimBLEDescriptorFilter filter(&uuidTmp); for (const auto& dsc : m_vDescriptors) { if (dsc->getUUID() == uuid) {