@@ -168,20 +168,35 @@ bool BLEGap::requestPairing(uint16_t conn_hdl)
168168{
169169 gap_peer_t * peer = &_peers[conn_hdl];
170170
171- // skip if already bonded
171+ // skip if already paired
172172 if ( peer->paired ) return true ;
173173
174+ // Check to see if we did bonded with current prph
175+ if ( peer->role == BLE_GAP_ROLE_CENTRAL )
176+ {
177+ bond_data_t bdata;
174178
175-
176- VERIFY_STATUS ( sd_ble_gap_authenticate (conn_hdl, &_sec_param ), false );
177- uint32_t start = millis ();
178-
179- // timeout in 30 seconds
180- while ( ! ((volatile bool ) peer->paired ) && (start + 30000 > millis ()) )
179+ if ( bond_find_cntr (&peer->addr , &bdata) )
180+ {
181+ LOG_LV2 (" BOND" , " Load Keys from file " BOND_FNAME_CNTR, bdata.peer_enc .master_id .ediv );
182+ VERIFY_STATUS ( sd_ble_gap_encrypt (conn_hdl, &bdata.peer_enc .master_id , &bdata.peer_enc .enc_info ), false );
183+ }else
184+ {
185+ VERIFY_STATUS ( sd_ble_gap_authenticate (conn_hdl, &_sec_param ), false );
186+ }
187+ }else
181188 {
182- yield ( );
189+ VERIFY_STATUS ( sd_ble_gap_authenticate (conn_hdl, &_sec_param ), false );
183190 }
184191
192+ // Wait for pairing process using on-the-fly semaphore
193+ peer->pair_sem = xSemaphoreCreateBinary ();
194+
195+ xSemaphoreTake (peer->pair_sem , portMAX_DELAY);
196+
197+ vSemaphoreDelete (peer->pair_sem );
198+ peer->pair_sem = NULL ;
199+
185200 return peer->paired ;
186201}
187202
@@ -372,15 +387,22 @@ void BLEGap::_eventHandler(ble_evt_t* evt)
372387 break ;
373388
374389 case BLE_GAP_EVT_CONN_SEC_UPDATE:
375- // Connection is secured aka Paired
390+ {
391+ const ble_gap_conn_sec_t * conn_sec = &evt->evt .gap_evt .params .conn_sec_update .conn_sec ;
376392
377- // Previously bonded --> secure by re-connection process
378- // --> Load & Set Sys Attr (Apply Service Context)
379- // Else Init Sys Attr
380- bond_load_cccd (peer->role , conn_hdl, peer->ediv );
393+ // Connection is secured (paired)
394+ if ( !( conn_sec->sec_mode .sm == 1 && conn_sec->sec_mode .lv == 1 ) )
395+ {
396+ // Previously bonded --> secure by re-connection process
397+ // --> Load & Set Sys Attr (Apply Service Context)
398+ // Else Init Sys Attr
399+ bond_load_cccd (peer->role , conn_hdl, peer->ediv );
381400
382- // Paired is Bonded (as we always save keys)
383- peer->paired = true ;
401+ peer->paired = true ;
402+ }
403+
404+ if (peer->pair_sem ) xSemaphoreGive (peer->pair_sem );
405+ }
384406 break ;
385407
386408 case BLE_GAP_EVT_PASSKEY_DISPLAY:
0 commit comments