Skip to content

Commit bb7392a

Browse files
committed
separate prph and central connection bandwidth setting
- add configPrphConn() and configCentralConn() for setting bandwidth for prph and central connection. These replace configMaxMtu(), configGapEventLen(), configHvnTxQueue(), configWriteCmdQueue() - fix concurrent connection config - central_uart_multi works with S132 v5
1 parent 444bf50 commit bb7392a

File tree

5 files changed

+154
-92
lines changed

5 files changed

+154
-92
lines changed

libraries/Bluefruit52Lib/examples/Central/central_bleuart_multi/central_bleuart_multi.ino

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,11 @@ void setup()
9191
Serial.println("Bluefruit52 Central Multi BLEUART Example");
9292
Serial.println("-----------------------------------------\n");
9393

94-
// Enable both peripheral and central
95-
Bluefruit.begin(true, true);
94+
// Initialize Bluefruit with maximum connections as Peripheral = 0, Central = 1
95+
// SRAM usage required by SoftDevice will increase dramatically with number of connections
96+
Bluefruit.begin(0, BLE_CENTRAL_MAX_CONN);
97+
98+
// Set Name
9699
Bluefruit.setName("Bluefruit52 Central");
97100

98101
// Init peripheral pool

libraries/Bluefruit52Lib/src/BLEAdvertising.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ bool BLEAdvertising::_start(uint16_t interval, uint16_t timeout)
349349
#if SD_VER < 500
350350
VERIFY_STATUS( sd_ble_gap_adv_start(&adv_para), false );
351351
#else
352-
VERIFY_STATUS( sd_ble_gap_adv_start(&adv_para, BLE_CONN_CFG_HIGH_BANDWIDTH), false );
352+
VERIFY_STATUS( sd_ble_gap_adv_start(&adv_para, CONN_CFG_PERIPHERAL), false );
353353
#endif
354354

355355
Bluefruit._startConnLed(); // start blinking

libraries/Bluefruit52Lib/src/BLECentral.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ bool BLECentral::connect(const ble_gap_addr_t* peer_addr)
8383
#if SD_VER < 500
8484
VERIFY_STATUS( sd_ble_gap_connect(peer_addr, Bluefruit.Scanner.getParams(), &gap_conn_params), false );
8585
#else
86-
VERIFY_STATUS( sd_ble_gap_connect(peer_addr, Bluefruit.Scanner.getParams(), &gap_conn_params, BLE_CONN_CFG_HIGH_BANDWIDTH), false );
86+
VERIFY_STATUS( sd_ble_gap_connect(peer_addr, Bluefruit.Scanner.getParams(), &gap_conn_params, CONN_CFG_CENTRAL), false );
8787
#endif
8888
return true;
8989
}

libraries/Bluefruit52Lib/src/bluefruit.cpp

Lines changed: 135 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,25 @@ AdafruitBluefruit::AdafruitBluefruit(void)
105105
*/
106106
/*------------------------------------------------------------------*/
107107
varclr(&_sd_cfg);
108+
109+
_sd_cfg.attr_table_size = 0x800;
108110
_sd_cfg.uuid128_max = BLE_UUID_VS_COUNT_DEFAULT;
109111
_sd_cfg.service_changed = 0;
110-
_sd_cfg.mtu_max = BLEGATT_ATT_MTU_MAX;
112+
113+
_sd_cfg.prph.mtu_max = BLEGATT_ATT_MTU_MAX;
114+
_sd_cfg.central.mtu_max = BLE_GATT_ATT_MTU_DEFAULT;
111115

112116
#if SD_VER >= 500
113-
_sd_cfg.event_len = BLE_GAP_EVENT_LENGTH_DEFAULT;
117+
_sd_cfg.prph.event_len = BLE_GAP_EVENT_LENGTH_DEFAULT;
118+
_sd_cfg.prph.hvn_tx_qsize = 3;
119+
_sd_cfg.prph.wr_cmd_qsize = BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT;
120+
121+
_sd_cfg.central.event_len = BLE_GAP_EVENT_LENGTH_DEFAULT;
122+
_sd_cfg.central.hvn_tx_qsize = BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT;
123+
_sd_cfg.central.wr_cmd_qsize = BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT;
114124
#endif
115125

126+
116127
_prph_count = 0;
117128
_central_count = 0;
118129

@@ -172,42 +183,39 @@ void AdafruitBluefruit::configAttrTableSize(uint32_t attr_table_size)
172183
_sd_cfg.attr_table_size = maxof(attr_table_size, BLE_GATTS_ATTR_TAB_SIZE_MIN);
173184
}
174185

175-
void AdafruitBluefruit::configMaxMtu(uint16_t mtu_max)
176-
{
177-
_sd_cfg.mtu_max = maxof(mtu_max, BLE_GATT_ATT_MTU_DEFAULT);
178-
}
179-
180-
void AdafruitBluefruit::configGapEventLen(uint8_t event_length)
186+
void AdafruitBluefruit::configPrphConn(uint16_t mtu_max, uint8_t event_len, uint8_t hvn_qsize, uint8_t wrcmd_qsize)
181187
{
188+
_sd_cfg.prph.mtu_max = maxof(mtu_max, BLE_GATT_ATT_MTU_DEFAULT);
182189
#if SD_VER >= 500
183-
_sd_cfg.event_len = maxof(event_length, BLE_GAP_EVENT_LENGTH_MIN);
190+
_sd_cfg.prph.event_len = maxof(event_len, BLE_GAP_EVENT_LENGTH_MIN);
184191
#endif
192+
_sd_cfg.prph.hvn_tx_qsize = hvn_qsize;
193+
_sd_cfg.prph.wr_cmd_qsize = wrcmd_qsize;
185194
}
186195

187-
void AdafruitBluefruit::configHvnTxQueue(uint8_t hvn_tx_qsize)
188-
{
189-
_sd_cfg.hvn_tx_qsize = hvn_tx_qsize;
190-
}
191-
192-
void AdafruitBluefruit::configWriteCmdQueue(uint8_t wr_cmd_qsize)
196+
void AdafruitBluefruit::configCentralConn(uint16_t mtu_max, uint8_t event_len, uint8_t hvn_qsize, uint8_t wrcmd_qsize)
193197
{
194-
_sd_cfg.wr_cmd_qsize = wr_cmd_qsize;
198+
_sd_cfg.central.mtu_max = maxof(mtu_max, BLE_GATT_ATT_MTU_DEFAULT);
199+
#if SD_VER >= 500
200+
_sd_cfg.central.event_len = maxof(event_len, BLE_GAP_EVENT_LENGTH_MIN);
201+
#endif
202+
_sd_cfg.central.hvn_tx_qsize = hvn_qsize;
203+
_sd_cfg.central.wr_cmd_qsize = wrcmd_qsize;
195204
}
196205

197-
198206
uint16_t AdafruitBluefruit::getMaxMtu(void)
199207
{
200-
return _sd_cfg.mtu_max;
208+
return _sd_cfg.prph.mtu_max;
201209
}
202210

203211
uint8_t AdafruitBluefruit::getHvnTxQueue(void)
204212
{
205-
return _sd_cfg.hvn_tx_qsize;
213+
return _sd_cfg.prph.hvn_tx_qsize;
206214
}
207215

208216
uint8_t AdafruitBluefruit::getWriteCmdQueue(void)
209217
{
210-
return _sd_cfg.wr_cmd_qsize;
218+
return _sd_cfg.prph.wr_cmd_qsize;
211219
}
212220

213221

@@ -253,28 +261,20 @@ err_t AdafruitBluefruit::begin(uint8_t prph_count, uint8_t central_count)
253261
* Note: Value is left as it is if already configured by user.
254262
*/
255263
/*------------------------------------------------------------------*/
256-
if ( _prph_count )
257-
{
258-
// If not configured by user, set Attr Table Size large enough for
259-
// most peripheral applications
260-
if ( _sd_cfg.attr_table_size == 0 ) _sd_cfg.attr_table_size = 0x800;
261-
262-
// Increase HVN queue size with prph connections if not configured
263-
if ( _sd_cfg.hvn_tx_qsize == 0 ) _sd_cfg.hvn_tx_qsize = 3;
264-
}
265-
266-
if ( _central_count)
267-
{
268-
// Increase Write Command queue size with central connections if not configured
269-
if ( _sd_cfg.wr_cmd_qsize == 0) _sd_cfg.wr_cmd_qsize = 3;
270-
}
271-
272-
// Not configure, default value are used
273-
if ( _sd_cfg.attr_table_size == 0 ) _sd_cfg.attr_table_size = BLE_GATTS_ATTR_TAB_SIZE_DEFAULT;
274-
#if SD_VER >= 500
275-
if ( _sd_cfg.hvn_tx_qsize == 0 ) _sd_cfg.hvn_tx_qsize = BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT;
276-
if ( _sd_cfg.wr_cmd_qsize == 0 ) _sd_cfg.wr_cmd_qsize = BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT;
277-
#endif
264+
// if ( _prph_count )
265+
// {
266+
// // If not configured by user, set Attr Table Size large enough for
267+
// // most peripheral applications
268+
// if ( _sd_cfg.attr_table_size == 0 ) _sd_cfg.attr_table_size = 0x800;
269+
// }
270+
//
271+
// if ( _central_count)
272+
// {
273+
//
274+
// }
275+
//
276+
// // Not configure, default value are used
277+
// if ( _sd_cfg.attr_table_size == 0 ) _sd_cfg.attr_table_size = BLE_GATTS_ATTR_TAB_SIZE_DEFAULT;
278278

279279
/*------------- Configure BLE params -------------*/
280280
extern uint32_t __data_start__[]; // defined in linker
@@ -328,30 +328,62 @@ err_t AdafruitBluefruit::begin(uint8_t prph_count, uint8_t central_count)
328328
blecfg.gatts_cfg.attr_tab_size.attr_tab_size = _sd_cfg.attr_table_size;
329329
VERIFY_STATUS ( sd_ble_cfg_set(BLE_GATTS_CFG_ATTR_TAB_SIZE, &blecfg, ram_start) );
330330

331-
// ATT MTU
332-
varclr(&blecfg);
333-
blecfg.conn_cfg.conn_cfg_tag = BLE_CONN_CFG_HIGH_BANDWIDTH;
334-
blecfg.conn_cfg.params.gatt_conn_cfg.att_mtu = _sd_cfg.mtu_max;
335-
VERIFY_STATUS ( sd_ble_cfg_set(BLE_CONN_CFG_GATT, &blecfg, ram_start) );
336-
337-
// Event Length + HVN queue + WRITE CMD queue setting affecting bandwidth
338-
varclr(&blecfg);
339-
blecfg.conn_cfg.conn_cfg_tag = BLE_CONN_CFG_HIGH_BANDWIDTH;
340-
blecfg.conn_cfg.params.gap_conn_cfg.conn_count = 1;
341-
blecfg.conn_cfg.params.gap_conn_cfg.event_length = _sd_cfg.event_len;
342-
VERIFY_STATUS ( sd_ble_cfg_set(BLE_CONN_CFG_GAP, &blecfg, ram_start) );
343-
344-
// HVN queue size
345-
varclr(&blecfg);
346-
blecfg.conn_cfg.conn_cfg_tag = BLE_CONN_CFG_HIGH_BANDWIDTH;
347-
blecfg.conn_cfg.params.gatts_conn_cfg.hvn_tx_queue_size = _sd_cfg.hvn_tx_qsize;
348-
VERIFY_STATUS ( sd_ble_cfg_set(BLE_CONN_CFG_GATTS, &blecfg, ram_start) );
331+
/*------------- Event Length + MTU + HVN queue + WRITE CMD queue setting affecting bandwidth -------------*/
332+
if ( _prph_count )
333+
{
334+
// ATT MTU
335+
varclr(&blecfg);
336+
blecfg.conn_cfg.conn_cfg_tag = CONN_CFG_PERIPHERAL;
337+
blecfg.conn_cfg.params.gatt_conn_cfg.att_mtu = _sd_cfg.prph.mtu_max;
338+
VERIFY_STATUS ( sd_ble_cfg_set(BLE_CONN_CFG_GATT, &blecfg, ram_start) );
339+
340+
// Event length and max connection for this config
341+
varclr(&blecfg);
342+
blecfg.conn_cfg.conn_cfg_tag = CONN_CFG_PERIPHERAL;
343+
blecfg.conn_cfg.params.gap_conn_cfg.conn_count = _prph_count;
344+
blecfg.conn_cfg.params.gap_conn_cfg.event_length = _sd_cfg.prph.event_len;
345+
VERIFY_STATUS ( sd_ble_cfg_set(BLE_CONN_CFG_GAP, &blecfg, ram_start) );
346+
347+
// HVN queue size
348+
varclr(&blecfg);
349+
blecfg.conn_cfg.conn_cfg_tag = CONN_CFG_PERIPHERAL;
350+
blecfg.conn_cfg.params.gatts_conn_cfg.hvn_tx_queue_size = _sd_cfg.prph.hvn_tx_qsize;
351+
VERIFY_STATUS ( sd_ble_cfg_set(BLE_CONN_CFG_GATTS, &blecfg, ram_start) );
352+
353+
// WRITE COMMAND queue size
354+
varclr(&blecfg);
355+
blecfg.conn_cfg.conn_cfg_tag = CONN_CFG_PERIPHERAL;
356+
blecfg.conn_cfg.params.gattc_conn_cfg.write_cmd_tx_queue_size = _sd_cfg.prph.wr_cmd_qsize;
357+
VERIFY_STATUS ( sd_ble_cfg_set(BLE_CONN_CFG_GATTC, &blecfg, ram_start) );
358+
}
349359

350-
// WRITE COMMAND queue size
351-
varclr(&blecfg);
352-
blecfg.conn_cfg.conn_cfg_tag = BLE_CONN_CFG_HIGH_BANDWIDTH;
353-
blecfg.conn_cfg.params.gattc_conn_cfg.write_cmd_tx_queue_size = _sd_cfg.wr_cmd_qsize;
354-
VERIFY_STATUS ( sd_ble_cfg_set(BLE_CONN_CFG_GATTC, &blecfg, ram_start) );
360+
if ( _central_count)
361+
{
362+
// ATT MTU
363+
varclr(&blecfg);
364+
blecfg.conn_cfg.conn_cfg_tag = CONN_CFG_CENTRAL;
365+
blecfg.conn_cfg.params.gatt_conn_cfg.att_mtu = _sd_cfg.central.mtu_max;
366+
VERIFY_STATUS ( sd_ble_cfg_set(BLE_CONN_CFG_GATT, &blecfg, ram_start) );
367+
368+
// Event length and max connection for this config
369+
varclr(&blecfg);
370+
blecfg.conn_cfg.conn_cfg_tag = CONN_CFG_CENTRAL;
371+
blecfg.conn_cfg.params.gap_conn_cfg.conn_count = _central_count;
372+
blecfg.conn_cfg.params.gap_conn_cfg.event_length = _sd_cfg.central.event_len;
373+
VERIFY_STATUS ( sd_ble_cfg_set(BLE_CONN_CFG_GAP, &blecfg, ram_start) );
374+
375+
// HVN queue size
376+
varclr(&blecfg);
377+
blecfg.conn_cfg.conn_cfg_tag = CONN_CFG_CENTRAL;
378+
blecfg.conn_cfg.params.gatts_conn_cfg.hvn_tx_queue_size = _sd_cfg.central.hvn_tx_qsize;
379+
VERIFY_STATUS ( sd_ble_cfg_set(BLE_CONN_CFG_GATTS, &blecfg, ram_start) );
380+
381+
// WRITE COMMAND queue size
382+
varclr(&blecfg);
383+
blecfg.conn_cfg.conn_cfg_tag = CONN_CFG_CENTRAL;
384+
blecfg.conn_cfg.params.gattc_conn_cfg.write_cmd_tx_queue_size = _sd_cfg.central.wr_cmd_qsize;
385+
VERIFY_STATUS ( sd_ble_cfg_set(BLE_CONN_CFG_GATTC, &blecfg, ram_start) );
386+
}
355387

356388
// Enable BLE stack
357389
// The memory requirement for a specific configuration will not increase
@@ -622,21 +654,47 @@ void AdafruitBluefruit::printInfo(void)
622654
Serial.println(_sd_cfg.service_changed);
623655

624656
#if SD_VER >= 500
625-
// Max MTU
626-
Serial.printf(title_fmt, "Max MTU");
627-
Serial.println(_sd_cfg.mtu_max);
657+
if ( _prph_count )
658+
{
659+
Serial.println("Peripheral Connect Setting");
660+
661+
Serial.print(" - ");
662+
Serial.printf(title_fmt, "Max MTU");
663+
Serial.println(_sd_cfg.prph.mtu_max);
628664

629-
// Event Length
630-
Serial.printf(title_fmt, "Event Length");
631-
Serial.println(_sd_cfg.event_len);
665+
Serial.print(" - ");
666+
Serial.printf(title_fmt, "Event Length");
667+
Serial.println(_sd_cfg.prph.event_len);
632668

633-
// HVN Queue Size
634-
Serial.printf(title_fmt, "HVN Queue Size");
635-
Serial.println(_sd_cfg.hvn_tx_qsize);
669+
Serial.print(" - ");
670+
Serial.printf(title_fmt, "HVN Queue Size");
671+
Serial.println(_sd_cfg.prph.hvn_tx_qsize);
636672

637-
// Write Command Queue Size
638-
Serial.printf(title_fmt, "WrCmd Queue Size");
639-
Serial.println(_sd_cfg.wr_cmd_qsize);
673+
Serial.print(" - ");
674+
Serial.printf(title_fmt, "WrCmd Queue Size");
675+
Serial.println(_sd_cfg.prph.wr_cmd_qsize);
676+
}
677+
678+
if ( _central_count )
679+
{
680+
Serial.println("Central Connect Setting");
681+
682+
Serial.print(" - ");
683+
Serial.printf(title_fmt, "Max MTU");
684+
Serial.println(_sd_cfg.central.mtu_max);
685+
686+
Serial.print(" - ");
687+
Serial.printf(title_fmt, "Event Length");
688+
Serial.println(_sd_cfg.central.event_len);
689+
690+
Serial.print(" - ");
691+
Serial.printf(title_fmt, "HVN Queue Size");
692+
Serial.println(_sd_cfg.central.hvn_tx_qsize);
693+
694+
Serial.print(" - ");
695+
Serial.printf(title_fmt, "WrCmd Queue Size");
696+
Serial.println(_sd_cfg.central.wr_cmd_qsize);
697+
}
640698
#endif
641699

642700
/*------------- Settings -------------*/

libraries/Bluefruit52Lib/src/bluefruit.h

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@
9292

9393
enum
9494
{
95-
BLE_CONN_CFG_HIGH_BANDWIDTH = 1
95+
CONN_CFG_PERIPHERAL = 1,
96+
CONN_CFG_CENTRAL = 2,
9697
};
9798

9899
extern "C"
@@ -127,12 +128,10 @@ class AdafruitBluefruit
127128
void configServiceChanged (bool changed);
128129
void configUuid128Count (uint8_t uuid128_max);
129130
void configAttrTableSize (uint32_t attr_table_size);
130-
void configMaxMtu (uint16_t mtu_max);
131131

132132
// Bandwidth affection function
133-
void configGapEventLen (uint8_t event_length);
134-
void configHvnTxQueue (uint8_t hvn_tx_qsize);
135-
void configWriteCmdQueue (uint8_t wr_cmd_qsize);
133+
void configPrphConn (uint16_t mtu_max, uint8_t event_len, uint8_t hvn_qsize, uint8_t wrcmd_qsize);
134+
void configCentralConn (uint16_t mtu_max, uint8_t event_len, uint8_t hvn_qsize, uint8_t wrcmd_qsize);
136135

137136
err_t begin(uint8_t prph_count = 1, uint8_t central_count = 0);
138137

@@ -203,17 +202,19 @@ class AdafruitBluefruit
203202
/*------------- SoftDevice Configuration -------------*/
204203
struct {
205204
uint32_t attr_table_size;
206-
uint16_t mtu_max;
207205
uint8_t service_changed;
208206
uint8_t uuid128_max;
209207

210-
uint8_t event_len;
211-
uint8_t hvn_tx_qsize;
212-
uint8_t wr_cmd_qsize;
208+
struct {
209+
uint16_t mtu_max;
210+
uint8_t event_len;
211+
uint8_t hvn_tx_qsize;
212+
uint8_t wr_cmd_qsize;
213+
}prph, central;
213214
}_sd_cfg;
214215

215-
bool _prph_count;
216-
bool _central_count;
216+
uint8_t _prph_count;
217+
uint8_t _central_count;
217218

218219
// Peripheral Preferred Connection Parameters (PPCP)
219220
uint16_t _ppcp_min_conn;

0 commit comments

Comments
 (0)