@@ -63,11 +63,8 @@ NimBLERemoteCharacteristic::~NimBLERemoteCharacteristic() {
63
63
/* *
64
64
* @brief Callback used by the API when a descriptor is discovered or search complete.
65
65
*/
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) {
71
68
int rc = error->status ;
72
69
auto filter = (NimBLEDescriptorFilter*)arg;
73
70
auto pTaskData = (NimBLETaskData*)filter->taskData ;
@@ -77,8 +74,7 @@ int NimBLERemoteCharacteristic::descriptorDiscCB(uint16_t connHandle,
77
74
78
75
// Results for chrHandle added until rc != 0
79
76
// 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 ))) {
82
78
// Return BLE_HS_EDONE if the descriptor was found, stop the search
83
79
pChr->m_vDescriptors .push_back (new NimBLERemoteDescriptor (pChr, dsc));
84
80
rc = !!uuid * BLE_HS_EDONE;
@@ -93,10 +89,10 @@ int NimBLERemoteCharacteristic::descriptorDiscCB(uint16_t connHandle,
93
89
94
90
/* *
95
91
* @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.
97
93
* @return True if successfully retrieved, success = BLE_HS_EDONE.
98
94
*/
99
- bool NimBLERemoteCharacteristic::retrieveDescriptors (NimBLEDescriptorFilter* filter ) const {
95
+ bool NimBLERemoteCharacteristic::retrieveDescriptors (NimBLEDescriptorFilter* pFilter ) const {
100
96
NIMBLE_LOGD (LOG_TAG, " >> retrieveDescriptors() for characteristic: %s" , getUUID ().toString ().c_str ());
101
97
102
98
// If this is the last handle then there are no descriptors
@@ -105,24 +101,30 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* fil
105
101
return true ;
106
102
}
107
103
104
+ NimBLETaskData taskData (const_cast <NimBLERemoteCharacteristic*>(this ));
105
+ NimBLEDescriptorFilter defaultFilter{nullptr , nullptr , &taskData};
106
+ if (pFilter == nullptr ) {
107
+ pFilter = &defaultFilter;
108
+ }
109
+
108
110
int rc = ble_gattc_disc_all_dscs (getClient ()->getConnHandle (),
109
111
getHandle (),
110
112
getRemoteService ()->getEndHandle (),
111
113
NimBLERemoteCharacteristic::descriptorDiscCB,
112
- filter );
114
+ pFilter );
113
115
if (rc != 0 ) {
114
116
NIMBLE_LOGE (LOG_TAG, " ble_gattc_disc_all_dscs: rc=%d %s" , rc, NimBLEUtils::returnCodeToString (rc));
115
117
return false ;
116
118
}
117
119
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 ;
120
122
if (rc != BLE_HS_EDONE) {
121
123
NIMBLE_LOGE (LOG_TAG, " << retrieveDescriptors(): failed: rc=%d %s" , rc, NimBLEUtils::returnCodeToString (rc));
122
124
return false ;
123
125
}
124
126
125
- filter ->dsc = m_vDescriptors.back ();
127
+ pFilter ->dsc = m_vDescriptors.back ();
126
128
NIMBLE_LOGD (LOG_TAG, " << retrieveDescriptors(): found %d descriptors." , m_vDescriptors.size ());
127
129
return true ;
128
130
} // retrieveDescriptors
@@ -134,9 +136,9 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* fil
134
136
*/
135
137
NimBLERemoteDescriptor* NimBLERemoteCharacteristic::getDescriptor (const NimBLEUUID& uuid) const {
136
138
NIMBLE_LOGD (LOG_TAG, " >> getDescriptor: uuid: %s" , uuid.toString ().c_str ());
139
+ NimBLEUUID uuidTmp{uuid};
137
140
NimBLETaskData taskData (const_cast <NimBLERemoteCharacteristic*>(this ));
138
- NimBLEDescriptorFilter filter = {nullptr , &uuid, &taskData};
139
- NimBLEUUID uuidTmp;
141
+ NimBLEDescriptorFilter filter{nullptr , &uuidTmp, &taskData};
140
142
141
143
for (const auto & dsc : m_vDescriptors) {
142
144
if (dsc->getUUID () == uuid) {
@@ -148,16 +150,18 @@ NimBLERemoteDescriptor* NimBLERemoteCharacteristic::getDescriptor(const NimBLEUU
148
150
if (!retrieveDescriptors (&filter) || filter.dsc ) {
149
151
goto Done;
150
152
}
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 ();
154
157
retrieveDescriptors (&filter);
155
158
goto Done;
156
159
}
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 ();
160
163
if (uuidTmp.bitSize () == BLE_UUID_TYPE_16) {
164
+ filter.uuid = &uuidTmp;
161
165
retrieveDescriptors (&filter);
162
166
}
163
167
0 commit comments