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:
h2zero 2024-11-26 18:22:37 -07:00 committed by h2zero
parent a12f3d4785
commit 70c6e89f19
2 changed files with 58 additions and 60 deletions

View file

@ -153,13 +153,12 @@ NimBLEAdvertising* NimBLEServer::getAdvertising() const {
# endif # 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() { void NimBLEServer::serviceChanged() {
if (m_gattsStarted) { if (m_gattsStarted) {
m_svcChanged = true; m_svcChanged = true;
ble_svc_gatt_changed(0x0001, 0xffff);
resetGATT();
} }
} // serviceChanged } // 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; m_gattsStarted = true;
} // start } // start
@ -876,7 +881,6 @@ void NimBLEServer::resetGATT() {
++it; ++it;
} }
m_svcChanged = false;
m_gattsStarted = false; m_gattsStarted = false;
} // resetGATT } // resetGATT

View file

@ -90,20 +90,14 @@ void NimBLEService::dump() const {
*/ */
bool NimBLEService::start() { bool NimBLEService::start() {
NIMBLE_LOGD(LOG_TAG, ">> start(): Starting service: %s", toString().c_str()); NIMBLE_LOGD(LOG_TAG, ">> start(): Starting service: %s", toString().c_str());
// If started previously, clear everything and start over
// Rebuild the service definition if the server attributes have changed.
if (getServer()->m_svcChanged) {
if (m_pSvcDef->characteristics) { if (m_pSvcDef->characteristics) {
if (m_pSvcDef->characteristics->descriptors) { if (m_pSvcDef->characteristics->descriptors) {
delete[] m_pSvcDef->characteristics->descriptors; delete[] m_pSvcDef->characteristics->descriptors;
} }
delete[] m_pSvcDef->characteristics; delete[] m_pSvcDef->characteristics;
} }
m_pSvcDef->type = 0;
}
if (!m_pSvcDef->type) {
m_pSvcDef->type = BLE_GATT_SVC_TYPE_PRIMARY;
size_t numChrs = 0; size_t numChrs = 0;
for (const auto& chr : m_vChars) { for (const auto& chr : m_vChars) {
if (chr->getRemoved()) { if (chr->getRemoved()) {
@ -165,8 +159,8 @@ bool NimBLEService::start() {
m_pSvcDef->characteristics = pChrs; m_pSvcDef->characteristics = pChrs;
} }
}
m_pSvcDef->type = BLE_GATT_SVC_TYPE_PRIMARY;
int rc = ble_gatts_count_cfg(m_pSvcDef); int rc = ble_gatts_count_cfg(m_pSvcDef);
if (rc != 0) { if (rc != 0) {
NIMBLE_LOGE(LOG_TAG, "ble_gatts_count_cfg failed, rc= %d, %s", rc, NimBLEUtils::returnCodeToString(rc)); NIMBLE_LOGE(LOG_TAG, "ble_gatts_count_cfg failed, rc= %d, %s", rc, NimBLEUtils::returnCodeToString(rc));