@@ -53,7 +53,15 @@ NimBLEClient::NimBLEClient()
53
53
m_haveServices = false ;
54
54
m_isConnected = false ;
55
55
m_connectTimeout = 30000 ;
56
- m_pConnParams = nullptr ;
56
+
57
+ m_pConnParams.scan_itvl = 16 ; // Scan interval in 0.625ms units (NimBLE Default)
58
+ m_pConnParams.scan_window = 16 ; // Scan window in 0.625ms units (NimBLE Default)
59
+ m_pConnParams.itvl_min = BLE_GAP_INITIAL_CONN_ITVL_MIN; // min_int = 0x10*1.25ms = 20ms
60
+ m_pConnParams.itvl_max = BLE_GAP_INITIAL_CONN_ITVL_MAX; // max_int = 0x20*1.25ms = 40ms
61
+ m_pConnParams.latency = BLE_GAP_INITIAL_CONN_LATENCY; // number of packets allowed to skip (extends max interval)
62
+ m_pConnParams.supervision_timeout = BLE_GAP_INITIAL_SUPERVISION_TIMEOUT; // timeout = 400*10ms = 4000ms
63
+ m_pConnParams.min_ce_len = BLE_GAP_INITIAL_CONN_MIN_CE_LEN; // Minimum length of connection event in 0.625ms units
64
+ m_pConnParams.max_ce_len = BLE_GAP_INITIAL_CONN_MAX_CE_LEN; // Maximum length of connection event in 0.625ms units
57
65
} // NimBLEClient
58
66
59
67
@@ -69,10 +77,7 @@ NimBLEClient::~NimBLEClient() {
69
77
if (m_deleteCallbacks) {
70
78
delete m_pClientCallbacks;
71
79
}
72
-
73
- if (m_pConnParams != nullptr ) {
74
- free (m_pConnParams);
75
- }
80
+
76
81
} // ~NimBLEClient
77
82
78
83
@@ -142,7 +147,7 @@ bool NimBLEClient::connect(NimBLEAddress address, uint8_t type, bool refreshServ
142
147
* Loop on BLE_HS_EBUSY if the scan hasn't stopped yet.
143
148
*/
144
149
do {
145
- rc = ble_gap_connect (BLE_OWN_ADDR_PUBLIC, &peerAddrt, m_connectTimeout, m_pConnParams,
150
+ rc = ble_gap_connect (BLE_OWN_ADDR_PUBLIC, &peerAddrt, m_connectTimeout, & m_pConnParams,
146
151
NimBLEClient::handleGapEvent, this );
147
152
if (rc == BLE_HS_EBUSY) {
148
153
vTaskDelay (1 );
@@ -168,19 +173,6 @@ bool NimBLEClient::connect(NimBLEAddress address, uint8_t type, bool refreshServ
168
173
if (rc != 0 ){
169
174
return false ;
170
175
}
171
-
172
- m_semaphoreOpenEvt.take (" exg-mtu" );
173
-
174
- rc = ble_gattc_exchange_mtu (m_conn_id, NULL ,NULL );
175
- if (rc != 0 ) {
176
- NIMBLE_LOGE (LOG_TAG, " ble_gattc_exchange_mtu: rc=%d %s" ,rc,
177
- NimBLEUtils::returnCodeToString (rc));
178
- disconnect ();
179
- m_semaphoreOpenEvt.give ();
180
- return false ;
181
- }
182
-
183
- m_semaphoreOpenEvt.wait (" exg-mtu" );
184
176
185
177
if (refreshServices) {
186
178
NIMBLE_LOGD (LOG_TAG, " Refreshing Services for: (%s)" , address.toString ().c_str ());
@@ -241,8 +233,12 @@ int NimBLEClient::disconnect(uint8_t reason) {
241
233
m_isConnected = false ; // flag the disconnect now so no calls are performed after
242
234
rc = ble_gap_terminate (m_conn_id, reason);
243
235
if (rc != 0 ){
244
- NIMBLE_LOGE (LOG_TAG, " ble_gap_terminate failed: rc=%d %s" , rc, NimBLEUtils::returnCodeToString (rc));
236
+ NIMBLE_LOGE (LOG_TAG, " ble_gap_terminate failed: rc=%d %s" , rc,
237
+ NimBLEUtils::returnCodeToString (rc));
245
238
}
239
+ // Sometimes a disconnect event is not sent so we need to make sure
240
+ // the device can be found again.
241
+ NimBLEDevice::removeIgnored (m_peerAddress);
246
242
}
247
243
248
244
NIMBLE_LOGD (LOG_TAG, " << disconnect()" );
@@ -255,56 +251,41 @@ int NimBLEClient::disconnect(uint8_t reason) {
255
251
*/
256
252
void NimBLEClient::setConnectionParams (uint16_t minInterval, uint16_t maxInterval,
257
253
uint16_t latency, uint16_t timeout,
258
- uint16_t minConnTime, uint16_t maxConnTime)
254
+ uint16_t scanInterval, uint16_t scanWindow)/* ,
255
+ uint16_t minConnTime, uint16_t maxConnTime)*/
259
256
{
260
- if (m_pConnParams == nullptr ) {
261
- m_pConnParams = (ble_gap_conn_params*)calloc (1 , sizeof (ble_gap_conn_params));
262
- if (m_pConnParams == nullptr ) {
263
- NIMBLE_LOGE (LOG_TAG, " setConnectionParams: Error No Mem" );
264
- return ;
265
- }
266
- }else if (0 == (minInterval | maxInterval | latency | timeout)) {
267
- free (m_pConnParams);
268
- m_pConnParams = nullptr ;
269
- return ;
270
- }
271
- m_pConnParams->scan_itvl = 16 ; // Scan interval in 0.625ms units (NimBLE Default)
272
- m_pConnParams->scan_window = 16 ; // Scan window in 0.625ms units (NimBLE Default)
273
- m_pConnParams->itvl_min = minInterval; // min_int = 0x10*1.25ms = 20ms
274
- m_pConnParams->itvl_max = maxInterval; // max_int = 0x20*1.25ms = 40ms
275
- m_pConnParams->latency = latency; // number of packets allowed to skip (extends max interval)
276
- m_pConnParams->supervision_timeout = timeout; // timeout = 400*10ms = 4000ms
277
- m_pConnParams->min_ce_len = minConnTime; // Minimum length of connection event in 0.625ms units
278
- m_pConnParams->max_ce_len = maxConnTime; // Maximum length of connection event in 0.625ms units
257
+
258
+ m_pConnParams.scan_itvl = scanInterval; // Scan interval in 0.625ms units
259
+ m_pConnParams.scan_window = scanWindow; // Scan window in 0.625ms units
260
+ m_pConnParams.itvl_min = minInterval; // min_int = 0x10*1.25ms = 20ms
261
+ m_pConnParams.itvl_max = maxInterval; // max_int = 0x20*1.25ms = 40ms
262
+ m_pConnParams.latency = latency; // number of packets allowed to skip (extends max interval)
263
+ m_pConnParams.supervision_timeout = timeout; // timeout = 400*10ms = 4000ms
279
264
280
- int rc = NimBLEUtils::checkConnParams (m_pConnParams);
281
- if (rc != 0 ) {
282
- NIMBLE_LOGE (LOG_TAG, " setConnectionParams : %s " , NimBLEUtils::returnCodeToString (rc));
283
- free (m_pConnParams);
284
- m_pConnParams = nullptr ;
285
- }
265
+ // These are not used by NimBLE at this time - Must leave at defaults
266
+ // m_pConnParams->min_ce_len = minConnTime; // Minimum length of connection event in 0.625ms units
267
+ // m_pConnParams->max_ce_len = maxConnTime; // Maximum length of connection event in 0.625ms units
268
+
269
+ int rc = NimBLEUtils::checkConnParams (&m_pConnParams) ;
270
+ assert (rc == 0 && " Invalid Connection parameters " );
286
271
}
287
272
288
273
289
274
/* *
290
275
* Update connection parameters can be called only after connection has been established
291
276
*/
292
277
void NimBLEClient::updateConnParams (uint16_t minInterval, uint16_t maxInterval,
293
- uint16_t latency, uint16_t timeout,
294
- uint16_t minConnTime, uint16_t maxConnTime)
295
- {
296
- if (m_pConnParams == nullptr ) {
297
- setConnectionParams (minInterval, maxInterval, latency, timeout, minConnTime, maxConnTime);
298
- }
299
-
278
+ uint16_t latency, uint16_t timeout)
279
+ {
300
280
ble_gap_upd_params params;
301
281
302
282
params.latency = latency;
303
283
params.itvl_max = maxInterval;
304
284
params.itvl_min = minInterval;
305
- params.supervision_timeout = timeout;
306
- params.min_ce_len = minConnTime;
307
- params.max_ce_len = maxConnTime;
285
+ params.supervision_timeout = timeout;
286
+ // These are not used by NimBLE at this time - Must leave at defaults
287
+ params.min_ce_len = BLE_GAP_INITIAL_CONN_MIN_CE_LEN;
288
+ params.max_ce_len = BLE_GAP_INITIAL_CONN_MAX_CE_LEN;
308
289
309
290
int rc = ble_gap_update_params (m_conn_id, ¶ms);
310
291
if (rc != 0 ) {
@@ -648,28 +629,23 @@ uint16_t NimBLEClient::getMTU() {
648
629
// print_conn_desc(&desc);
649
630
// MODLOG_DFLT(INFO, "\n");
650
631
651
- // client->m_pClientCallbacks->onConnect(client);
652
632
653
633
// In the case of a multiconnecting device we ignore this device when
654
634
// scanning since we are already connected to it
655
635
NimBLEDevice::addIgnored (client->m_peerAddress );
656
636
657
- /* rc = ble_gattc_exchange_mtu(client->m_conn_id, NULL,NULL);
637
+ rc = ble_gattc_exchange_mtu (client->m_conn_id , NULL ,NULL );
658
638
if (rc != 0 ) {
659
639
NIMBLE_LOGE (LOG_TAG, " ble_gattc_exchange_mtu: rc=%d %s" ,rc,
660
640
NimBLEUtils::returnCodeToString (rc));
661
641
// if error getting mtu indicate a connection error.
662
642
client->m_semaphoreOpenEvt .give (rc);
663
- } else {
664
- client->m_semaphoreOpenEvt.give(0);
665
- }
666
- */
643
+ }
667
644
} else {
668
645
// Connection attempt failed
669
646
NIMBLE_LOGE (LOG_TAG, " Error: Connection failed; status=%d %s" ,
670
647
event->connect .status ,
671
648
NimBLEUtils::returnCodeToString (event->connect .status ));
672
- // client->m_semaphoreOpenEvt.give(event->connect.status);
673
649
}
674
650
client->m_semaphoreOpenEvt .give (event->connect .status );
675
651
return 0 ;
@@ -723,17 +699,10 @@ uint16_t NimBLEClient::getMTU() {
723
699
724
700
725
701
if (!rc && event->type == BLE_GAP_EVENT_CONN_UPDATE_REQ ) {
726
- if (client->m_pConnParams != nullptr ) {
727
- event->conn_update_req .self_params ->itvl_min = client->m_pConnParams ->itvl_min ;
728
- event->conn_update_req .self_params ->itvl_max = client->m_pConnParams ->itvl_max ;
729
- event->conn_update_req .self_params ->latency = client->m_pConnParams ->latency ;
730
- event->conn_update_req .self_params ->supervision_timeout = client->m_pConnParams ->supervision_timeout ;
731
- } else {
732
- event->conn_update_req .self_params ->itvl_min = BLE_GAP_INITIAL_CONN_ITVL_MIN;
733
- event->conn_update_req .self_params ->itvl_max = BLE_GAP_INITIAL_CONN_ITVL_MAX;
734
- event->conn_update_req .self_params ->latency = BLE_GAP_INITIAL_CONN_LATENCY;
735
- event->conn_update_req .self_params ->supervision_timeout = BLE_GAP_INITIAL_SUPERVISION_TIMEOUT;
736
- }
702
+ event->conn_update_req .self_params ->itvl_min = client->m_pConnParams .itvl_min ;
703
+ event->conn_update_req .self_params ->itvl_max = client->m_pConnParams .itvl_max ;
704
+ event->conn_update_req .self_params ->latency = client->m_pConnParams .latency ;
705
+ event->conn_update_req .self_params ->supervision_timeout = client->m_pConnParams .supervision_timeout ;
737
706
}
738
707
739
708
NIMBLE_LOGD (LOG_TAG, " %s peer params" , (rc == 0 ) ? " Accepted" : " Rejected" );
@@ -780,7 +749,7 @@ uint16_t NimBLEClient::getMTU() {
780
749
NIMBLE_LOGI (LOG_TAG, " mtu update event; conn_handle=%d mtu=%d" ,
781
750
event->mtu .conn_handle ,
782
751
event->mtu .value );
783
- client->m_semaphoreOpenEvt .give (0 );
752
+ client->m_semaphoreOpenEvt .give (0 );
784
753
// client->m_mtu = event->mtu.value;
785
754
return 0 ;
786
755
} // BLE_GAP_EVENT_MTU
0 commit comments