@@ -254,14 +254,18 @@ void NimBLEServer::gattRegisterCallback(ble_gatt_register_ctxt* ctxt, void* arg)
254254 * @details Required to be called after setup of all services and characteristics / descriptors
255255 * for the NimBLE host to register them.
256256 */
257- void NimBLEServer::start () {
257+ bool NimBLEServer::start () {
258258 if (m_svcChanged && !getConnectedCount ()) {
259259 NIMBLE_LOGD (LOG_TAG , " Services have changed since last start, resetting GATT server" );
260- resetGATT () ;
260+ m_gattsStarted = false ;
261261 }
262262
263263 if (m_gattsStarted) {
264- return ; // already started
264+ return true ; // already started
265+ }
266+
267+ if (!resetGATT ()) {
268+ return false ;
265269 }
266270
267271 ble_hs_cfg.gatts_register_cb = NimBLEServer::gattRegisterCallback;
@@ -271,7 +275,7 @@ void NimBLEServer::start() {
271275 int rc = ble_gatts_start ();
272276 if (rc != 0 ) {
273277 NIMBLE_LOGE (LOG_TAG , " ble_gatts_start; rc=%d, %s" , rc, NimBLEUtils::returnCodeToString (rc));
274- return ;
278+ return false ;
275279 }
276280
277281# if CONFIG_NIMBLE_CPP_LOG_LEVEL >= 4
@@ -298,6 +302,7 @@ void NimBLEServer::start() {
298302 }
299303
300304 m_gattsStarted = true ;
305+ return true ;
301306} // start
302307
303308/* *
@@ -320,7 +325,7 @@ bool NimBLEServer::disconnect(uint16_t connHandle, uint8_t reason) const {
320325 * @brief Disconnect the specified client with optional reason.
321326 * @param [in] connInfo Connection of the client to disconnect.
322327 * @param [in] reason code for disconnecting.
323- * @return NimBLE host return code .
328+ * @return True if successful .
324329 */
325330bool NimBLEServer::disconnect (const NimBLEConnInfo& connInfo, uint8_t reason) const {
326331 return disconnect (connInfo.getConnHandle (), reason);
@@ -490,7 +495,7 @@ int NimBLEServer::handleGapEvent(ble_gap_event* event, void* arg) {
490495
491496 peerInfo.m_desc = event->disconnect .conn ;
492497 pServer->m_pServerCallbacks ->onDisconnect (pServer, peerInfo, event->disconnect .reason );
493- # if !CONFIG_BT_NIMBLE_EXT_ADV
498+ # if !CONFIG_BT_NIMBLE_EXT_ADV && CONFIG_BT_NIMBLE_ROLE_BROADCASTER
494499 if (pServer->m_advertiseOnDisconnect ) {
495500 pServer->startAdvertising ();
496501 }
@@ -857,8 +862,13 @@ void NimBLEServer::addService(NimBLEService* service) {
857862
858863/* *
859864 * @brief Resets the GATT server, used when services are added/removed after initialization.
865+ * @return True if successful.
866+ * @details This will reset the GATT server and re-register all services, characteristics, and
867+ * descriptors that have not been removed. Services, characteristics, and descriptors that have been
868+ * removed but not deleted will be skipped and have their handles cleared, and those that have been
869+ * deleted will be removed from the server's service vector.
860870 */
861- void NimBLEServer::resetGATT () {
871+ bool NimBLEServer::resetGATT () {
862872# if CONFIG_BT_NIMBLE_ROLE_BROADCASTER
863873 NimBLEDevice::stopAdvertising ();
864874# endif
@@ -867,8 +877,6 @@ void NimBLEServer::resetGATT() {
867877 ble_svc_gap_init ();
868878 ble_svc_gatt_init ();
869879
870- m_gattsStarted = false ;
871-
872880 for (auto svcIt = m_svcVec.begin (); svcIt != m_svcVec.end ();) {
873881 auto * pSvc = *svcIt;
874882 if (pSvc->getRemoved () == NIMBLE_ATT_REMOVE_DELETE ) {
@@ -902,12 +910,17 @@ void NimBLEServer::resetGATT() {
902910 }
903911
904912 if (pSvc->getRemoved () == 0 ) {
905- pSvc->start ();
913+ if (!pSvc->start_internal ()) {
914+ NIMBLE_LOGE (LOG_TAG , " Failed to start service: %s" , pSvc->getUUID ().toString ().c_str ());
915+ return false ;
916+ }
906917 }
907918
908919 pSvc->m_handle = 0 ;
909920 ++svcIt;
910921 }
922+
923+ return true ;
911924} // resetGATT
912925
913926/* *
0 commit comments