Skip to content

Commit f5aca05

Browse files
committed
refactor(RemoteServ): Reduce nesting
* Adds parameter out to retrieveCharacteristics, default valuel works as the original method. * out: if not nullptr, will allow caller to obtain the characteristic * Add check to retrieveCharacteristics, return if found the last handle * General cleanup
1 parent 5ac7272 commit f5aca05

File tree

2 files changed

+55
-85
lines changed

2 files changed

+55
-85
lines changed

src/NimBLERemoteService.cpp

Lines changed: 52 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -76,46 +76,31 @@ NimBLERemoteCharacteristic* NimBLERemoteService::getCharacteristic(const char* u
7676
*/
7777
NimBLERemoteCharacteristic* NimBLERemoteService::getCharacteristic(const NimBLEUUID& uuid) const {
7878
NIMBLE_LOGD(LOG_TAG, ">> getCharacteristic: uuid: %s", uuid.toString().c_str());
79-
NimBLERemoteCharacteristic* pChar = nullptr;
80-
size_t prev_size = m_vChars.size();
79+
NimBLERemoteCharacteristic* pChar = nullptr;
80+
NimBLEUUID uuidTmp;
8181

82-
for (const auto& it : m_vChars) {
83-
if (it->getUUID() == uuid) {
84-
pChar = it;
82+
for (const auto& chr : m_vChars) {
83+
if (chr->getUUID() == uuid) {
84+
pChar = chr;
8585
goto Done;
8686
}
8787
}
8888

89-
if (retrieveCharacteristics(&uuid)) {
90-
if (m_vChars.size() > prev_size) {
91-
pChar = m_vChars.back();
92-
goto Done;
93-
}
89+
if (!retrieveCharacteristics(&uuid, pChar) || pChar) {
90+
goto Done;
91+
}
9492

95-
// If the request was successful but 16/32 bit uuid not found
96-
// try again with the 128 bit uuid.
97-
if (uuid.bitSize() == BLE_UUID_TYPE_16 || uuid.bitSize() == BLE_UUID_TYPE_32) {
98-
NimBLEUUID uuid128(uuid);
99-
uuid128.to128();
100-
if (retrieveCharacteristics(&uuid128)) {
101-
if (m_vChars.size() > prev_size) {
102-
pChar = m_vChars.back();
103-
}
104-
}
105-
} else {
106-
// If the request was successful but the 128 bit uuid not found
107-
// try again with the 16 bit uuid.
108-
NimBLEUUID uuid16(uuid);
109-
uuid16.to16();
110-
// if the uuid was 128 bit but not of the BLE base type this check will fail
111-
if (uuid16.bitSize() == BLE_UUID_TYPE_16) {
112-
if (retrieveCharacteristics(&uuid16)) {
113-
if (m_vChars.size() > prev_size) {
114-
pChar = m_vChars.back();
115-
}
116-
}
117-
}
118-
}
93+
// Try again with 128 bit uuid if request succeeded with no uuid found.
94+
if (uuid.bitSize() == BLE_UUID_TYPE_16 || uuid.bitSize() == BLE_UUID_TYPE_32) {
95+
uuidTmp = NimBLEUUID(uuid).to128();
96+
retrieveCharacteristics(&uuidTmp, pChar);
97+
goto Done;
98+
}
99+
// Try again with 16 bit uuid if request succeeded with no uuid found.
100+
// If the uuid was 128 bit but not of the BLE base type this check will fail.
101+
uuidTmp = NimBLEUUID(uuid).to16();
102+
if (uuidTmp.bitSize() == BLE_UUID_TYPE_16) {
103+
retrieveCharacteristics(&uuidTmp, pChar);
119104
}
120105

121106
Done:
@@ -143,77 +128,67 @@ const std::vector<NimBLERemoteCharacteristic*>& NimBLERemoteService::getCharacte
143128
* @brief Callback for Characteristic discovery.
144129
* @return success == 0 or error code.
145130
*/
146-
int NimBLERemoteService::characteristicDiscCB(uint16_t conn_handle,
131+
int NimBLERemoteService::characteristicDiscCB(uint16_t connHandle,
147132
const ble_gatt_error* error,
148133
const ble_gatt_chr* chr,
149134
void* arg) {
150-
NIMBLE_LOGD(LOG_TAG,
151-
"Characteristic Discovery >> status: %d handle: %d",
152-
error->status,
153-
(error->status == 0) ? chr->def_handle : -1);
135+
const int rc = error->status;
154136
auto pTaskData = (NimBLETaskData*)arg;
155137
const auto pSvc = (NimBLERemoteService*)pTaskData->m_pInstance;
156-
157-
if (error->status == BLE_HS_ENOTCONN) {
158-
NIMBLE_LOGE(LOG_TAG, "<< Characteristic Discovery; Not connected");
159-
NimBLEUtils::taskRelease(*pTaskData, error->status);
160-
return error->status;
161-
}
138+
NIMBLE_LOGD(LOG_TAG, "Characteristic Discovery >> status: %d handle: %d", rc, (rc == 0) ? chr->def_handle : -1);
162139

163140
// Make sure the discovery is for this device
164-
if (pSvc->getClient()->getConnHandle() != conn_handle) {
141+
if (pSvc->getClient()->getConnHandle() != connHandle) {
165142
return 0;
166143
}
167144

168-
if (error->status == 0) {
145+
if (rc == 0) {
169146
pSvc->m_vChars.push_back(new NimBLERemoteCharacteristic(pSvc, chr));
170147
return 0;
171148
}
172149

173-
NimBLEUtils::taskRelease(*pTaskData, error->status);
174-
NIMBLE_LOGD(LOG_TAG, "<< Characteristic Discovery");
175-
return error->status;
150+
NimBLEUtils::taskRelease(*pTaskData, rc);
151+
NIMBLE_LOGD(LOG_TAG, "<< Characteristic Discovery%s", (rc == BLE_HS_ENOTCONN) ? "; Not connected" : "");
152+
return rc;
176153
}
177154

178155
/**
179156
* @brief Retrieve all the characteristics for this service.
180157
* This function will not return until we have all the characteristics.
181-
* @return True if successful.
158+
* @return True if successfully retrieved, success = BLE_HS_EDONE.
182159
*/
183-
bool NimBLERemoteService::retrieveCharacteristics(const NimBLEUUID* uuidFilter) const {
160+
bool NimBLERemoteService::retrieveCharacteristics(const NimBLEUUID* uuid, NimBLERemoteCharacteristic* out) const {
184161
NIMBLE_LOGD(LOG_TAG, ">> retrieveCharacteristics()");
185-
int rc = 0;
186162
NimBLETaskData taskData(const_cast<NimBLERemoteService*>(this));
163+
const uint16_t connHandle = m_pClient->getConnHandle();
164+
const uint16_t endHandle = getEndHandle();
165+
const uint16_t handle = getHandle();
187166

188-
if (uuidFilter == nullptr) {
189-
rc = ble_gattc_disc_all_chrs(m_pClient->getConnHandle(),
190-
getHandle(),
191-
getEndHandle(),
192-
NimBLERemoteService::characteristicDiscCB,
193-
&taskData);
194-
} else {
195-
rc = ble_gattc_disc_chrs_by_uuid(m_pClient->getConnHandle(),
196-
getHandle(),
197-
getEndHandle(),
198-
uuidFilter->getBase(),
199-
NimBLERemoteService::characteristicDiscCB,
200-
&taskData);
167+
// If this is the last handle then there are no more characteristics
168+
if (handle == endHandle) {
169+
NIMBLE_LOGD(LOG_TAG, "<< retrieveCharacteristics(): found %d characteristics.", m_vChars.size());
170+
return true;
201171
}
202172

173+
int rc = (uuid == nullptr)
174+
? ble_gattc_disc_all_chrs(connHandle, handle, endHandle, characteristicDiscCB, &taskData)
175+
: ble_gattc_disc_chrs_by_uuid(connHandle, handle, endHandle, uuid->getBase(), characteristicDiscCB, &taskData);
176+
203177
if (rc != 0) {
204178
NIMBLE_LOGE(LOG_TAG, "ble_gattc_disc_chrs rc=%d %s", rc, NimBLEUtils::returnCodeToString(rc));
205179
return false;
206180
}
207181

208182
NimBLEUtils::taskWait(taskData, BLE_NPL_TIME_FOREVER);
209183
rc = taskData.m_flags;
210-
if (rc == 0 || rc == BLE_HS_EDONE) {
211-
NIMBLE_LOGD(LOG_TAG, "<< retrieveCharacteristics()");
212-
return true;
184+
if (rc != BLE_HS_EDONE) {
185+
NIMBLE_LOGE(LOG_TAG, "<< retrieveCharacteristics(): failed: rc=%d %s", rc, NimBLEUtils::returnCodeToString(rc));
186+
return false;
213187
}
214188

215-
NIMBLE_LOGE(LOG_TAG, "<< retrieveCharacteristics() rc=%d %s", rc, NimBLEUtils::returnCodeToString(rc));
216-
return false;
189+
*out = m_vChars.back();
190+
NIMBLE_LOGD(LOG_TAG, "<< retrieveCharacteristics(): found %d characteristics.", m_vChars.size());
191+
return true;
217192
} // retrieveCharacteristics
218193

219194
/**
@@ -231,11 +206,8 @@ NimBLEClient* NimBLERemoteService::getClient() const {
231206
*/
232207
NimBLEAttValue NimBLERemoteService::getValue(const NimBLEUUID& uuid) const {
233208
const auto pChar = getCharacteristic(uuid);
234-
if (pChar) {
235-
return pChar->readValue();
236-
}
237-
238-
return NimBLEAttValue{};
209+
return pChar ? pChar->readValue()
210+
: NimBLEAttValue{};
239211
} // readValue
240212

241213
/**
@@ -246,11 +218,8 @@ NimBLEAttValue NimBLERemoteService::getValue(const NimBLEUUID& uuid) const {
246218
*/
247219
bool NimBLERemoteService::setValue(const NimBLEUUID& uuid, const NimBLEAttValue& value) const {
248220
const auto pChar = getCharacteristic(uuid);
249-
if (pChar) {
250-
return pChar->writeValue(value);
251-
}
252-
253-
return false;
221+
return pChar ? pChar->writeValue(value)
222+
: false;
254223
} // setValue
255224

256225
/**
@@ -260,8 +229,8 @@ bool NimBLERemoteService::setValue(const NimBLEUUID& uuid, const NimBLEAttValue&
260229
* them. This method does just that.
261230
*/
262231
void NimBLERemoteService::deleteCharacteristics() const {
263-
for (const auto& it : m_vChars) {
264-
delete it;
232+
for (const auto& chr : m_vChars) {
233+
delete chr;
265234
}
266235
std::vector<NimBLERemoteCharacteristic*>{}.swap(m_vChars);
267236
} // deleteCharacteristics

src/NimBLERemoteService.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,9 @@ class NimBLERemoteService : public NimBLEAttribute {
5353

5454
NimBLERemoteService(NimBLEClient* pClient, const struct ble_gatt_svc* service);
5555
~NimBLERemoteService();
56-
bool retrieveCharacteristics(const NimBLEUUID* uuidFilter = nullptr) const;
57-
static int characteristicDiscCB(uint16_t conn_handle,
56+
bool retrieveCharacteristics(const NimBLEUUID* uuid = nullptr,
57+
NimBLERemoteCharacteristic* out = nullptr) const;
58+
static int characteristicDiscCB(uint16_t connHandle,
5859
const struct ble_gatt_error* error,
5960
const struct ble_gatt_chr* chr,
6061
void* arg);

0 commit comments

Comments
 (0)