Skip to content

Commit beac19c

Browse files
committed
[BREAKING] - Refactor NimBLEUtils
* Add functions `NimBLEUtils::taskWait` and `NimBLEUtils::taskRelease` to simplify task blocking/messaging. * `NimBLEUtils::buildHexData` replaced with `NimBLEUtils::dataToHexString` * Add missing GAP event strings. * Add missing return code strings. * `NimBLEUtils::dumpGapEvent` function removed. * Event/error code strings optimized.
1 parent 65e05e6 commit beac19c

12 files changed

+481
-524
lines changed

src/NimBLEAdvertisedDevice.cpp

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ NimBLEScan* NimBLEAdvertisedDevice::getScan() const {
253253
* @return The number of addresses.
254254
*/
255255
uint8_t NimBLEAdvertisedDevice::getTargetAddressCount() const {
256-
uint8_t count = findAdvField(BLE_HS_ADV_TYPE_PUBLIC_TGT_ADDR);
256+
uint8_t count = findAdvField(BLE_HS_ADV_TYPE_PUBLIC_TGT_ADDR);
257257
count += findAdvField(BLE_HS_ADV_TYPE_RANDOM_TGT_ADDR);
258258

259259
return count;
@@ -269,7 +269,7 @@ NimBLEAddress NimBLEAdvertisedDevice::getTargetAddress(uint8_t index) const {
269269
uint8_t count = findAdvField(BLE_HS_ADV_TYPE_PUBLIC_TGT_ADDR, index, &data_loc);
270270
if (count < index + 1) {
271271
index -= count;
272-
count = findAdvField(BLE_HS_ADV_TYPE_RANDOM_TGT_ADDR, index, &data_loc);
272+
count = findAdvField(BLE_HS_ADV_TYPE_RANDOM_TGT_ADDR, index, &data_loc);
273273
}
274274

275275
if (count > 0 && data_loc != ULONG_MAX) {
@@ -368,14 +368,14 @@ size_t NimBLEAdvertisedDevice::findServiceData(uint8_t index, uint8_t* bytes) co
368368
}
369369

370370
index -= found;
371-
found = findAdvField(BLE_HS_ADV_TYPE_SVC_DATA_UUID32, index, &data_loc);
371+
found = findAdvField(BLE_HS_ADV_TYPE_SVC_DATA_UUID32, index, &data_loc);
372372
if (found > index) {
373373
*bytes = 4;
374374
return data_loc;
375375
}
376376

377377
index -= found;
378-
found = findAdvField(BLE_HS_ADV_TYPE_SVC_DATA_UUID128, index, &data_loc);
378+
found = findAdvField(BLE_HS_ADV_TYPE_SVC_DATA_UUID128, index, &data_loc);
379379
if (found > index) {
380380
*bytes = 16;
381381
return data_loc;
@@ -389,7 +389,7 @@ size_t NimBLEAdvertisedDevice::findServiceData(uint8_t index, uint8_t* bytes) co
389389
* @return The number of service data UUIDS in the vector.
390390
*/
391391
uint8_t NimBLEAdvertisedDevice::getServiceDataCount() const {
392-
uint8_t count = findAdvField(BLE_HS_ADV_TYPE_SVC_DATA_UUID16);
392+
uint8_t count = findAdvField(BLE_HS_ADV_TYPE_SVC_DATA_UUID16);
393393
count += findAdvField(BLE_HS_ADV_TYPE_SVC_DATA_UUID32);
394394
count += findAdvField(BLE_HS_ADV_TYPE_SVC_DATA_UUID128);
395395

@@ -448,7 +448,7 @@ NimBLEUUID NimBLEAdvertisedDevice::getServiceUUID(uint8_t index) const {
448448
* @return The count of services in the advertising packet.
449449
*/
450450
uint8_t NimBLEAdvertisedDevice::getServiceUUIDCount() const {
451-
uint8_t count = findAdvField(BLE_HS_ADV_TYPE_INCOMP_UUIDS16);
451+
uint8_t count = findAdvField(BLE_HS_ADV_TYPE_INCOMP_UUIDS16);
452452
count += findAdvField(BLE_HS_ADV_TYPE_COMP_UUIDS16);
453453
count += findAdvField(BLE_HS_ADV_TYPE_INCOMP_UUIDS32);
454454
count += findAdvField(BLE_HS_ADV_TYPE_COMP_UUIDS32);
@@ -695,11 +695,9 @@ std::string NimBLEAdvertisedDevice::toString() const {
695695
}
696696

697697
if (haveManufacturerData()) {
698-
char* pHex =
699-
NimBLEUtils::buildHexData(nullptr, (uint8_t*)getManufacturerData().data(), getManufacturerData().length());
700-
res += ", manufacturer data: ";
701-
res += pHex;
702-
free(pHex);
698+
auto mfgData = getManufacturerData();
699+
res += ", manufacturer data: ";
700+
res += NimBLEUtils::dataToHexString(reinterpret_cast<const uint8_t*>(mfgData.data()), mfgData.length());
703701
}
704702

705703
if (haveServiceUUID()) {
@@ -714,7 +712,7 @@ std::string NimBLEAdvertisedDevice::toString() const {
714712
}
715713

716714
if (haveServiceData()) {
717-
uint8_t count = getServiceDataCount();
715+
uint8_t count = getServiceDataCount();
718716
res += "\nService Data:";
719717
for (uint8_t i = 0; i < count; i++) {
720718
res += "\nUUID: " + std::string(getServiceDataUUID(i));

src/NimBLEClient.cpp

Lines changed: 28 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,10 @@ bool NimBLEClient::connect(const NimBLEAddress& address, bool deleteAttributes,
201201
deleteServices();
202202
}
203203

204-
int rc = 0;
205-
m_asyncConnect = asyncConnect;
206-
m_exchangeMTU = exchangeMTU;
207-
TaskHandle_t curTask = xTaskGetCurrentTaskHandle();
208-
BleTaskData taskData = {this, curTask, 0, nullptr};
204+
int rc = 0;
205+
m_asyncConnect = asyncConnect;
206+
m_exchangeMTU = exchangeMTU;
207+
NimBLETaskData taskData(this);
209208
if (!asyncConnect) {
210209
m_pTaskData = &taskData;
211210
}
@@ -276,12 +275,8 @@ bool NimBLEClient::connect(const NimBLEAddress& address, bool deleteAttributes,
276275
return true;
277276
}
278277

279-
# ifdef ulTaskNotifyValueClear
280-
// Clear the task notification value to ensure we block
281-
ulTaskNotifyValueClear(curTask, ULONG_MAX);
282-
# endif
283278
// Wait for the connect timeout time +1 second for the connection to complete
284-
if (ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(m_connectTimeout + 1000)) == pdFALSE) {
279+
if (!NimBLEUtils::taskWait(*m_pTaskData, m_connectTimeout + 1000)) {
285280
m_pTaskData = nullptr;
286281
// If a connection was made but no response from MTU exchange; disconnect
287282
if (isConnected()) {
@@ -296,9 +291,9 @@ bool NimBLEClient::connect(const NimBLEAddress& address, bool deleteAttributes,
296291

297292
return false;
298293

299-
} else if (taskData.rc != 0) {
300-
m_lastErr = taskData.rc;
301-
NIMBLE_LOGE(LOG_TAG, "Connection failed; status=%d %s", taskData.rc, NimBLEUtils::returnCodeToString(taskData.rc));
294+
} else if (taskData.m_flags != 0) {
295+
m_lastErr = taskData.m_flags;
296+
NIMBLE_LOGE(LOG_TAG, "Connection failed; status=%d %s", m_lastErr, NimBLEUtils::returnCodeToString(m_lastErr));
302297
// If the failure was not a result of a disconnection, make sure we disconnect now to avoid dangling connections
303298
if (isConnected()) {
304299
disconnect();
@@ -324,9 +319,8 @@ bool NimBLEClient::connect(const NimBLEAddress& address, bool deleteAttributes,
324319
*/
325320
bool NimBLEClient::secureConnection() const {
326321
NIMBLE_LOGD(LOG_TAG, ">> secureConnection()");
327-
TaskHandle_t cur_task = xTaskGetCurrentTaskHandle();
328-
BleTaskData taskData = {const_cast<NimBLEClient*>(this), cur_task, 0, nullptr};
329-
int retryCount = 1;
322+
NimBLETaskData taskData(const_cast<NimBLEClient*>(this));
323+
int retryCount = 1;
330324

331325
do {
332326
m_pTaskData = &taskData;
@@ -337,16 +331,12 @@ bool NimBLEClient::secureConnection() const {
337331
return false;
338332
}
339333

340-
# ifdef ulTaskNotifyValueClear
341-
// Clear the task notification value to ensure we block
342-
ulTaskNotifyValueClear(cur_task, ULONG_MAX);
343-
# endif
344-
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
345-
} while (taskData.rc == (BLE_HS_ERR_HCI_BASE + BLE_ERR_PINKEY_MISSING) && retryCount--);
334+
NimBLEUtils::taskWait(*m_pTaskData, BLE_NPL_TIME_FOREVER);
335+
} while (taskData.m_flags == (BLE_HS_ERR_HCI_BASE + BLE_ERR_PINKEY_MISSING) && retryCount--);
346336

347-
if (taskData.rc != 0) {
348-
m_lastErr = taskData.rc;
349-
NIMBLE_LOGE(LOG_TAG, "secureConnection: failed rc=%d", taskData.rc);
337+
if (taskData.m_flags != 0) {
338+
m_lastErr = taskData.m_flags;
339+
NIMBLE_LOGE(LOG_TAG, "secureConnection: failed rc=%d", taskData.m_flags);
350340
return false;
351341
}
352342

@@ -736,9 +726,8 @@ bool NimBLEClient::retrieveServices(const NimBLEUUID* uuidFilter) {
736726
return false;
737727
}
738728

739-
int rc = 0;
740-
TaskHandle_t cur_task = xTaskGetCurrentTaskHandle();
741-
BleTaskData taskData = {this, cur_task, 0, nullptr};
729+
int rc = 0;
730+
NimBLETaskData taskData(this);
742731

743732
if (uuidFilter == nullptr) {
744733
rc = ble_gattc_disc_all_svcs(m_connHandle, NimBLEClient::serviceDiscoveredCB, &taskData);
@@ -752,24 +741,15 @@ bool NimBLEClient::retrieveServices(const NimBLEUUID* uuidFilter) {
752741
return false;
753742
}
754743

755-
# ifdef ulTaskNotifyValueClear
756-
// Clear the task notification value to ensure we block
757-
ulTaskNotifyValueClear(cur_task, ULONG_MAX);
758-
# endif
759-
760-
// wait until we have all the services
761-
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
762-
m_lastErr = taskData.rc;
763-
764-
if (taskData.rc == 0) {
744+
NimBLEUtils::taskWait(taskData, BLE_NPL_TIME_FOREVER);
745+
rc = taskData.m_flags;
746+
if (rc == 0 || rc == BLE_HS_EDONE) {
765747
return true;
766-
} else {
767-
NIMBLE_LOGE(LOG_TAG,
768-
"Could not retrieve services, rc=%d %s",
769-
taskData.rc,
770-
NimBLEUtils::returnCodeToString(taskData.rc));
771-
return false;
772748
}
749+
750+
m_lastErr = rc;
751+
NIMBLE_LOGE(LOG_TAG, "Could not retrieve services, rc=%d %s", rc, NimBLEUtils::returnCodeToString(rc));
752+
return false;
773753
} // getServices
774754

775755
/**
@@ -786,8 +766,8 @@ int NimBLEClient::serviceDiscoveredCB(uint16_t connHandle,
786766
error->status,
787767
(error->status == 0) ? service->start_handle : -1);
788768

789-
BleTaskData* pTaskData = (BleTaskData*)arg;
790-
NimBLEClient* pClient = (NimBLEClient*)pTaskData->pATT;
769+
NimBLETaskData* pTaskData = (NimBLETaskData*)arg;
770+
NimBLEClient* pClient = (NimBLEClient*)pTaskData->m_pInstance;
791771

792772
// Make sure the service discovery is for this device
793773
if (pClient->getConnHandle() != connHandle) {
@@ -800,15 +780,7 @@ int NimBLEClient::serviceDiscoveredCB(uint16_t connHandle,
800780
return 0;
801781
}
802782

803-
if (error->status == BLE_HS_EDONE) {
804-
pTaskData->rc = 0;
805-
} else {
806-
NIMBLE_LOGE(LOG_TAG, "serviceDiscoveredCB() rc=%d %s", error->status, NimBLEUtils::returnCodeToString(error->status));
807-
pTaskData->rc = error->status;
808-
}
809-
810-
xTaskNotifyGive(pTaskData->task);
811-
783+
NimBLEUtils::taskRelease(*pTaskData, error->status);
812784
NIMBLE_LOGD(LOG_TAG, "<< Service Discovered");
813785
return error->status;
814786
}
@@ -1204,10 +1176,7 @@ int NimBLEClient::handleGapEvent(struct ble_gap_event* event, void* arg) {
12041176
} // Switch
12051177

12061178
if (pClient->m_pTaskData != nullptr) {
1207-
pClient->m_pTaskData->rc = rc;
1208-
if (pClient->m_pTaskData->task) {
1209-
xTaskNotifyGive(pClient->m_pTaskData->task);
1210-
}
1179+
NimBLEUtils::taskRelease(*pClient->m_pTaskData, rc);
12111180
pClient->m_pTaskData = nullptr;
12121181
}
12131182

src/NimBLEClient.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class NimBLEAdvertisedDevice;
3737
class NimBLEAttValue;
3838
class NimBLEClientCallbacks;
3939
class NimBLEConnInfo;
40-
struct BleTaskData;
40+
struct NimBLETaskData;
4141

4242
/**
4343
* @brief A model of a BLE client.
@@ -112,7 +112,7 @@ class NimBLEClient {
112112
NimBLEAddress m_peerAddress;
113113
mutable int m_lastErr;
114114
int32_t m_connectTimeout;
115-
mutable BleTaskData* m_pTaskData;
115+
mutable NimBLETaskData* m_pTaskData;
116116
std::vector<NimBLERemoteService*> m_svcVec;
117117
NimBLEClientCallbacks* m_pClientCallbacks;
118118
uint16_t m_connHandle;

src/NimBLERemoteCharacteristic.cpp

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ int NimBLERemoteCharacteristic::descriptorDiscCB(
6565
NIMBLE_LOGD(LOG_TAG, "Descriptor Discovery >> status: %d handle: %d", rc, (rc == 0) ? dsc->handle : -1);
6666

6767
auto filter = (desc_filter_t*)arg;
68-
auto pTaskData = (BleTaskData*)filter->task_data;
69-
const auto pChr = (NimBLERemoteCharacteristic*)pTaskData->pATT;
68+
auto pTaskData = (NimBLETaskData*)filter->task_data;
69+
const auto pChr = (NimBLERemoteCharacteristic*)pTaskData->m_pInstance;
7070
const NimBLEUUID* uuidFilter = filter->uuid;
7171

7272
if (pChr->getHandle() != chr_val_handle) {
@@ -85,12 +85,8 @@ int NimBLERemoteCharacteristic::descriptorDiscCB(
8585
pChr->m_vDescriptors.push_back(new NimBLERemoteDescriptor(pChr, dsc));
8686
}
8787

88-
if (rc != 0) {
89-
pTaskData->rc = rc == BLE_HS_EDONE ? 0 : rc;
90-
NIMBLE_LOGD(LOG_TAG, "<< Descriptor Discovery");
91-
xTaskNotifyGive(pTaskData->task);
92-
}
93-
88+
NimBLEUtils::taskRelease(*pTaskData, rc);
89+
NIMBLE_LOGD(LOG_TAG, "<< Descriptor Discovery");
9490
return rc;
9591
}
9692

@@ -101,9 +97,8 @@ int NimBLERemoteCharacteristic::descriptorDiscCB(
10197
bool NimBLERemoteCharacteristic::retrieveDescriptors(const NimBLEUUID* uuidFilter) const {
10298
NIMBLE_LOGD(LOG_TAG, ">> retrieveDescriptors() for characteristic: %s", getUUID().toString().c_str());
10399

104-
TaskHandle_t cur_task = xTaskGetCurrentTaskHandle();
105-
BleTaskData taskData = {const_cast<NimBLERemoteCharacteristic*>(this), cur_task, 0, nullptr};
106-
desc_filter_t filter = {uuidFilter, &taskData};
100+
NimBLETaskData taskData(const_cast<NimBLERemoteCharacteristic*>(this));
101+
desc_filter_t filter = {uuidFilter, &taskData};
107102

108103
int rc = ble_gattc_disc_all_dscs(getClient()->getConnHandle(),
109104
getHandle(),
@@ -115,22 +110,15 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(const NimBLEUUID* uuidFilte
115110
return false;
116111
}
117112

118-
# ifdef ulTaskNotifyValueClear
119-
// Clear the task notification value to ensure we block
120-
ulTaskNotifyValueClear(cur_task, ULONG_MAX);
121-
# endif
122-
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
123-
124-
if (taskData.rc != 0) {
125-
NIMBLE_LOGE(LOG_TAG,
126-
"<< retrieveDescriptors(): failed: rc=%d %s",
127-
taskData.rc,
128-
NimBLEUtils::returnCodeToString(taskData.rc));
129-
} else {
113+
NimBLEUtils::taskWait(taskData, BLE_NPL_TIME_FOREVER);
114+
rc = taskData.m_flags;
115+
if (rc == 0 || rc == BLE_HS_EDONE) {
130116
NIMBLE_LOGD(LOG_TAG, "<< retrieveDescriptors(): found %d descriptors.", m_vDescriptors.size());
117+
return true;
131118
}
132119

133-
return taskData.rc == 0;
120+
NIMBLE_LOGE(LOG_TAG, "<< retrieveDescriptors(): failed: rc=%d %s", rc, NimBLEUtils::returnCodeToString(rc));
121+
return false;
134122
} // retrieveDescriptors
135123

136124
/**

src/NimBLERemoteService.cpp

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@ int NimBLERemoteService::characteristicDiscCB(uint16_t conn_handle,
145145
const ble_gatt_chr* chr,
146146
void* arg) {
147147
NIMBLE_LOGD(LOG_TAG, "Characteristic Discovery >>");
148-
auto pTaskData = (BleTaskData*)arg;
149-
const auto pSvc = (NimBLERemoteService*)pTaskData->pATT;
148+
auto pTaskData = (NimBLETaskData*)arg;
149+
const auto pSvc = (NimBLERemoteService*)pTaskData->m_pInstance;
150150

151151
// Make sure the discovery is for this device
152152
if (pSvc->getClient()->getConnHandle() != conn_handle) {
@@ -155,12 +155,11 @@ int NimBLERemoteService::characteristicDiscCB(uint16_t conn_handle,
155155

156156
if (error->status == 0) {
157157
pSvc->m_vChars.push_back(new NimBLERemoteCharacteristic(pSvc, chr));
158-
} else {
159-
pTaskData->rc = error->status == BLE_HS_EDONE ? 0 : error->status;
160-
NIMBLE_LOGD(LOG_TAG, "<< Characteristic Discovery");
161-
xTaskNotifyGive(pTaskData->task);
158+
return 0;
162159
}
163160

161+
NimBLEUtils::taskRelease(*pTaskData, error->status);
162+
NIMBLE_LOGD(LOG_TAG, "<< Characteristic Discovery");
164163
return error->status;
165164
}
166165

@@ -171,9 +170,8 @@ int NimBLERemoteService::characteristicDiscCB(uint16_t conn_handle,
171170
*/
172171
bool NimBLERemoteService::retrieveCharacteristics(const NimBLEUUID* uuidFilter) const {
173172
NIMBLE_LOGD(LOG_TAG, ">> retrieveCharacteristics()");
174-
int rc = 0;
175-
TaskHandle_t cur_task = xTaskGetCurrentTaskHandle();
176-
BleTaskData taskData = {const_cast<NimBLERemoteService*>(this), cur_task, 0, nullptr};
173+
int rc = 0;
174+
NimBLETaskData taskData(const_cast<NimBLERemoteService*>(this));
177175

178176
if (uuidFilter == nullptr) {
179177
rc = ble_gattc_disc_all_chrs(m_pClient->getConnHandle(),
@@ -190,21 +188,20 @@ bool NimBLERemoteService::retrieveCharacteristics(const NimBLEUUID* uuidFilter)
190188
&taskData);
191189
}
192190

193-
if (rc == 0) {
194-
# ifdef ulTaskNotifyValueClear
195-
// Clear the task notification value to ensure we block
196-
ulTaskNotifyValueClear(cur_task, ULONG_MAX);
197-
# endif
198-
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
191+
if (rc != 0) {
192+
NIMBLE_LOGE(LOG_TAG, "ble_gattc_disc_chrs rc=%d %s", rc, NimBLEUtils::returnCodeToString(rc));
193+
return false;
199194
}
200195

201-
if (taskData.rc != 0) {
202-
NIMBLE_LOGE(LOG_TAG, "<< retrieveCharacteristics() rc=%d %s", rc, NimBLEUtils::returnCodeToString(rc));
203-
} else {
196+
NimBLEUtils::taskWait(taskData, BLE_NPL_TIME_FOREVER);
197+
rc = taskData.m_flags;
198+
if (rc == 0 || rc == BLE_HS_EDONE) {
204199
NIMBLE_LOGD(LOG_TAG, "<< retrieveCharacteristics()");
200+
return true;
205201
}
206202

207-
return taskData.rc == 0;
203+
NIMBLE_LOGE(LOG_TAG, "<< retrieveCharacteristics() rc=%d %s", rc, NimBLEUtils::returnCodeToString(rc));
204+
return false;
208205
} // retrieveCharacteristics
209206

210207
/**

0 commit comments

Comments
 (0)