mirror of
https://github.com/h2zero/esp-nimble-cpp.git
synced 2024-12-18 09:10:47 +01:00
Refactor service changed handling
This makes the services changes notification more accurate by waiting until the changes have taken effect and the server re-started before indicating the change.
This commit is contained in:
parent
a12f3d4785
commit
70c6e89f19
2 changed files with 58 additions and 60 deletions
|
@ -153,13 +153,12 @@ NimBLEAdvertising* NimBLEServer::getAdvertising() const {
|
|||
# endif
|
||||
|
||||
/**
|
||||
* @brief Sends a service changed notification and resets the GATT server.
|
||||
* @brief Called when the services are added/removed and sets a flag to indicate they should be reloaded.
|
||||
* @details This has no effect if the GATT server was not already started.
|
||||
*/
|
||||
void NimBLEServer::serviceChanged() {
|
||||
if (m_gattsStarted) {
|
||||
m_svcChanged = true;
|
||||
ble_svc_gatt_changed(0x0001, 0xffff);
|
||||
resetGATT();
|
||||
}
|
||||
} // serviceChanged
|
||||
|
||||
|
@ -205,6 +204,12 @@ void NimBLEServer::start() {
|
|||
}
|
||||
}
|
||||
|
||||
// If the services have changed indicate it now
|
||||
if (m_svcChanged) {
|
||||
m_svcChanged = false;
|
||||
ble_svc_gatt_changed(0x0001, 0xffff);
|
||||
}
|
||||
|
||||
m_gattsStarted = true;
|
||||
} // start
|
||||
|
||||
|
@ -876,7 +881,6 @@ void NimBLEServer::resetGATT() {
|
|||
++it;
|
||||
}
|
||||
|
||||
m_svcChanged = false;
|
||||
m_gattsStarted = false;
|
||||
} // resetGATT
|
||||
|
||||
|
|
|
@ -90,20 +90,14 @@ void NimBLEService::dump() const {
|
|||
*/
|
||||
bool NimBLEService::start() {
|
||||
NIMBLE_LOGD(LOG_TAG, ">> start(): Starting service: %s", toString().c_str());
|
||||
|
||||
// Rebuild the service definition if the server attributes have changed.
|
||||
if (getServer()->m_svcChanged) {
|
||||
// If started previously, clear everything and start over
|
||||
if (m_pSvcDef->characteristics) {
|
||||
if (m_pSvcDef->characteristics->descriptors) {
|
||||
delete[] m_pSvcDef->characteristics->descriptors;
|
||||
}
|
||||
delete[] m_pSvcDef->characteristics;
|
||||
}
|
||||
m_pSvcDef->type = 0;
|
||||
}
|
||||
|
||||
if (!m_pSvcDef->type) {
|
||||
m_pSvcDef->type = BLE_GATT_SVC_TYPE_PRIMARY;
|
||||
size_t numChrs = 0;
|
||||
for (const auto& chr : m_vChars) {
|
||||
if (chr->getRemoved()) {
|
||||
|
@ -165,8 +159,8 @@ bool NimBLEService::start() {
|
|||
|
||||
m_pSvcDef->characteristics = pChrs;
|
||||
}
|
||||
}
|
||||
|
||||
m_pSvcDef->type = BLE_GATT_SVC_TYPE_PRIMARY;
|
||||
int rc = ble_gatts_count_cfg(m_pSvcDef);
|
||||
if (rc != 0) {
|
||||
NIMBLE_LOGE(LOG_TAG, "ble_gatts_count_cfg failed, rc= %d, %s", rc, NimBLEUtils::returnCodeToString(rc));
|
||||
|
|
Loading…
Reference in a new issue