@@ -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 */
135137NimBLERemoteDescriptor* 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
0 commit comments