27
27
28
28
# include < climits>
29
29
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 ;
35
34
36
35
static const char * LOG_TAG = " NimBLERemoteCharacteristic" ;
37
36
@@ -69,7 +68,7 @@ int NimBLERemoteCharacteristic::descriptorDiscCB(uint16_t connHandle,
69
68
const ble_gatt_dsc* dsc,
70
69
void * arg) {
71
70
int rc = error->status ;
72
- auto filter = (NimBLEDescriptorFilter *)arg;
71
+ auto filter = (desc_filter_t *)arg;
73
72
auto pTaskData = (NimBLETaskData*)filter->taskData ;
74
73
const auto pChr = (NimBLERemoteCharacteristic*)pTaskData->m_pInstance ;
75
74
const auto uuid = filter->uuid ; // UUID to filter for
@@ -93,10 +92,10 @@ int NimBLERemoteCharacteristic::descriptorDiscCB(uint16_t connHandle,
93
92
94
93
/* *
95
94
* @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 .
97
96
* @return True if successfully retrieved, success = BLE_HS_EDONE.
98
97
*/
99
- bool NimBLERemoteCharacteristic::retrieveDescriptors (NimBLEDescriptorFilter* filter ) const {
98
+ bool NimBLERemoteCharacteristic::retrieveDescriptors (const NimBLEUUID* uuid, NimBLERemoteDescriptor* out ) const {
100
99
NIMBLE_LOGD (LOG_TAG, " >> retrieveDescriptors() for characteristic: %s" , getUUID ().toString ().c_str ());
101
100
102
101
// If this is the last handle then there are no descriptors
@@ -105,24 +104,29 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* fil
105
104
return true ;
106
105
}
107
106
107
+ NimBLETaskData taskData (const_cast <NimBLERemoteCharacteristic*>(this ));
108
+ desc_filter_t filter = {uuid, &taskData};
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
+ & filter);
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 (taskData, BLE_NPL_TIME_FOREVER);
121
+ rc = 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
+ if (out) {
128
+ out = m_vDescriptors.back ();
129
+ }
126
130
NIMBLE_LOGD (LOG_TAG, " << retrieveDescriptors(): found %d descriptors." , m_vDescriptors.size ());
127
131
return true ;
128
132
} // retrieveDescriptors
@@ -134,36 +138,35 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(NimBLEDescriptorFilter* fil
134
138
*/
135
139
NimBLERemoteDescriptor* NimBLERemoteCharacteristic::getDescriptor (const NimBLEUUID& uuid) const {
136
140
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;
140
143
141
144
for (const auto & dsc : m_vDescriptors) {
142
145
if (dsc->getUUID () == uuid) {
143
- filter. dsc = dsc;
146
+ pDsc = dsc;
144
147
goto Done;
145
148
}
146
149
}
147
150
148
- if (!retrieveDescriptors (&filter ) || filter. dsc ) {
151
+ if (!retrieveDescriptors (&uuid, pDsc ) || pDsc ) {
149
152
goto Done;
150
153
}
151
154
// Try again with 128 bit uuid if request succeeded with no uuid found.
152
155
if (uuid.bitSize () == BLE_UUID_TYPE_16 || uuid.bitSize () == BLE_UUID_TYPE_32) {
153
156
uuidTmp = NimBLEUUID (uuid).to128 ();
154
- retrieveDescriptors (&filter );
157
+ retrieveDescriptors (&uuid, pDsc );
155
158
goto Done;
156
159
}
157
160
// Try again with 16 bit uuid if request succeeded with no uuid found.
158
161
// If the uuid was 128 bit but not of the BLE base type this check will fail.
159
162
uuidTmp = NimBLEUUID (uuid).to16 ();
160
163
if (uuidTmp.bitSize () == BLE_UUID_TYPE_16) {
161
- retrieveDescriptors (&filter );
164
+ retrieveDescriptors (&uuid, pDsc );
162
165
}
163
166
164
167
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 ;
167
170
} // getDescriptor
168
171
169
172
/* *
0 commit comments