@@ -338,110 +338,132 @@ void BLEDeviceManager::setAppearance(unsigned short appearance)
338
338
_appearance = appearance;
339
339
}
340
340
341
+ BLE_STATUS_T
342
+ BLEDeviceManager::setAdvertiseData (uint8_t type, const uint8_t * data, uint8_t length)
343
+ {
344
+ uint8_t lengthOfAdv = 0 ; // Flags data length
345
+ uint8_t lengthOfScanRsp = 0 ; // Flags data length
346
+ bt_data_t *fill_area = NULL ;
347
+
348
+ // Get the length of the Advertisement
349
+ for (uint8_t i = 0 ; i < _adv_data_idx; i++)
350
+ {
351
+ lengthOfAdv += _adv_data[i].data_len + 2 ;
352
+ }
353
+
354
+ for (uint8_t i = 0 ; i < _scan_rsp_data_idx; i++)
355
+ {
356
+ lengthOfAdv += _scan_rsp_data[i].data_len + 2 ;
357
+ }
358
+
359
+
360
+ if (((length + lengthOfAdv) < BLE_MAX_ADV_SIZE) &&
361
+ (_adv_data_idx < ARRAY_SIZE (_adv_data)))
362
+ {
363
+ fill_area = &_adv_data[_adv_data_idx];
364
+ _adv_data_idx++;
365
+ }
366
+ else if ((length + lengthOfScanRsp) < BLE_MAX_ADV_SIZE &&
367
+ (_scan_rsp_data_idx < ARRAY_SIZE (_scan_rsp_data)))
368
+ {
369
+ fill_area = &_scan_rsp_data[_scan_rsp_data_idx];
370
+ _scan_rsp_data_idx++;
371
+ }
372
+ else
373
+ {
374
+ // Service data block is too large.
375
+ return BLE_STATUS_ERROR_PARAMETER;
376
+ }
377
+
378
+ if (fill_area)
379
+ {
380
+ fill_area->type = type;
381
+ fill_area->data = data;
382
+ fill_area->data_len = length;
383
+
384
+ pr_info (LOG_MODULE_BLE, " ADV type %d Len - %d" ,type, length);
385
+ }
386
+ return BLE_STATUS_SUCCESS;
387
+ }
388
+
341
389
BLE_STATUS_T
342
390
BLEDeviceManager::_advDataInit (void )
343
391
{
344
- uint8_t lengthTotal = 2 ; // Flags data length
392
+ BLE_STATUS_T ret = BLE_STATUS_SUCCESS;
393
+ // Clear the indexs
345
394
_adv_data_idx = 0 ;
346
395
_scan_rsp_data_idx = 0 ;
347
396
348
397
/* Add flags */
349
398
_adv_type = (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR);
350
- _adv_data[_adv_data_idx].type = BT_DATA_FLAGS;
351
- _adv_data[_adv_data_idx].data = &_adv_type;
352
- _adv_data[_adv_data_idx].data_len = 1 ;
353
- _adv_data_idx++;
399
+ ret = setAdvertiseData (BT_DATA_FLAGS, &_adv_type, sizeof (_adv_type));
354
400
355
- if (_has_service_uuid)
401
+ if (_has_service_solicit_uuid &&
402
+ (BLE_STATUS_SUCCESS == ret))
356
403
{
357
404
uint8_t type;
358
405
uint8_t length;
359
406
uint8_t *data = NULL ;
360
407
361
- pr_info (LOG_MODULE_BLE, " ADV Type-%d" , _service_uuid .uuid .type );
362
- if (BT_UUID_TYPE_16 == _service_uuid .uuid .type )
408
+ pr_info (LOG_MODULE_BLE, " ADV Type-%d" , _service_solicit_uuid .uuid .type );
409
+ if (BT_UUID_TYPE_16 == _service_solicit_uuid .uuid .type )
363
410
{
364
- // UINT16_TO_LESTREAM(adv_tmp, uuid.uuid16);
365
- data = (uint8_t *)&(((bt_uuid_16_t *)&_service_uuid)->val );
411
+ data = (uint8_t *)&(((bt_uuid_16_t *)&_service_solicit_uuid)->val );
366
412
length = UUID_SIZE_16;
367
- type = BT_DATA_UUID16_ALL ;
413
+ type = BT_DATA_SOLICIT16 ;
368
414
}
369
- else // Sid. KW, default is BT_UUID_TYPE_128
415
+ else // Sid. KW, default is BT_UUID_TYPE_128
370
416
{
371
- data = _service_uuid .val ;
417
+ data = _service_solicit_uuid .val ;
372
418
length = UUID_SIZE_128;
373
- type = BT_DATA_UUID128_ALL;
374
- }
375
-
376
- // if (data) // Sid. KW, data is always initialized
377
- {
378
- _adv_data[_adv_data_idx].type = type;
379
- _adv_data[_adv_data_idx].data = data;
380
- _adv_data[_adv_data_idx].data_len = length;
381
- _adv_data_idx++;
382
- lengthTotal += length;
383
-
384
- pr_info (LOG_MODULE_BLE, " Service UUID Len -%d" , length);
419
+ type = BT_DATA_SOLICIT128;
385
420
}
421
+
422
+ ret = setAdvertiseData (type, data, length);
386
423
}
387
424
388
- if (_has_service_solicit_uuid)
425
+ if (_has_service_uuid &&
426
+ (BLE_STATUS_SUCCESS == ret))
389
427
{
390
428
uint8_t type;
391
429
uint8_t length;
392
430
uint8_t *data = NULL ;
393
431
394
- pr_info (LOG_MODULE_BLE, " ADV Type-%d" , _service_solicit_uuid .uuid .type );
395
- if (BT_UUID_TYPE_16 == _service_solicit_uuid .uuid .type )
432
+ pr_info (LOG_MODULE_BLE, " ADV Type-%d" , _service_uuid .uuid .type );
433
+ if (BT_UUID_TYPE_16 == _service_uuid .uuid .type )
396
434
{
397
- // UINT16_TO_LESTREAM(adv_tmp, uuid.uuid16);
398
- data = (uint8_t *)&(((bt_uuid_16_t *)&_service_solicit_uuid)->val );
435
+ data = (uint8_t *)&(((bt_uuid_16_t *)&_service_uuid)->val );
399
436
length = UUID_SIZE_16;
400
- type = BT_DATA_SOLICIT16 ;
437
+ type = BT_DATA_UUID16_ALL ;
401
438
}
402
- else // Sid. KW, default is BT_UUID_TYPE_128
439
+ else // Sid. KW, default is BT_UUID_TYPE_128
403
440
{
404
- data = _service_solicit_uuid .val ;
441
+ data = _service_uuid .val ;
405
442
length = UUID_SIZE_128;
406
- type = BT_DATA_SOLICIT128;
407
- }
408
- // Sid. KW, data is always initialized. if (data)
409
- {
410
- _adv_data[_adv_data_idx].type = type;
411
- _adv_data[_adv_data_idx].data = data;
412
- _adv_data[_adv_data_idx].data_len = length;
413
- _adv_data_idx++;
414
- lengthTotal += length;
415
-
416
- pr_info (LOG_MODULE_BLE, " Service UUID Len -%d" , length);
443
+ type = BT_DATA_UUID128_ALL;
417
444
}
445
+ ret = setAdvertiseData (type, data, length);
418
446
}
419
-
420
- if (_local_name.length () > 0 )
447
+
448
+ if (_manufacturer_data_length > 0 &&
449
+ (BLE_STATUS_SUCCESS == ret))
421
450
{
422
- /* Add device name (truncated if too long) */
423
- _adv_data[_adv_data_idx].type = BT_DATA_NAME_COMPLETE;
424
- _adv_data[_adv_data_idx].data = (const uint8_t *)_local_name.c_str ();
425
- _adv_data[_adv_data_idx].data_len = _local_name.length ();
426
- _adv_data_idx++;
427
-
428
- lengthTotal += _local_name.length ();
429
- pr_info (LOG_MODULE_BLE, " Local Name -%s" , _local_name.c_str ());
430
- pr_info (LOG_MODULE_BLE, " Local Name Len -%d" , _local_name.length ());
451
+ ret = setAdvertiseData (BT_DATA_MANUFACTURER_DATA,
452
+ _manufacturer_data,
453
+ _manufacturer_data_length);
431
454
}
432
-
433
- if (_manufacturer_data_length > 0 )
455
+
456
+ if (_local_name.length () > 0 &&
457
+ (BLE_STATUS_SUCCESS == ret))
434
458
{
435
- // Add manufacturer data
436
- _adv_data[_adv_data_idx].type = BT_DATA_MANUFACTURER_DATA;
437
- _adv_data[_adv_data_idx].data = _manufacturer_data;
438
- _adv_data[_adv_data_idx].data_len = _manufacturer_data_length;
439
- _adv_data_idx++;
440
-
441
- lengthTotal += _manufacturer_data_length;
459
+ uint8_t length = _local_name.length ();
460
+ ret = setAdvertiseData (BT_DATA_NAME_COMPLETE,
461
+ (const uint8_t *)_local_name.c_str (),
462
+ length);
442
463
}
443
464
444
- if (_service_data_length > 0 )
465
+ if (_service_data_length > 0 &&
466
+ (BLE_STATUS_SUCCESS == ret))
445
467
{
446
468
/* Add Service Data (if it will fit) */
447
469
@@ -459,29 +481,18 @@ BLEDeviceManager::_advDataInit(void)
459
481
return BLE_STATUS_ERROR_PARAMETER;
460
482
}
461
483
462
- _adv_data[_adv_data_idx].type = BT_DATA_SVC_DATA16;
463
- _adv_data[_adv_data_idx].data = _service_data_buf;
464
- _adv_data[_adv_data_idx].data_len = block_len;
465
- _adv_data_idx++;
484
+ ret = setAdvertiseData (BT_DATA_SVC_DATA16,
485
+ _service_data_buf,
486
+ block_len);
466
487
467
488
uint8_t *adv_tmp = _service_data_buf;
468
489
469
- // UINT16_TO_LESTREAM(adv_tmp, (((bt_uuid_16_t *)&_service_data_uuid)->val));
470
490
memcpy (adv_tmp, &((bt_uuid_16_t *)&_service_data_uuid)->val , sizeof (uint16_t ));
471
491
adv_tmp += 2 ;
472
492
memcpy (adv_tmp, _service_data, _service_data_length);
473
-
474
- lengthTotal += block_len;
475
- pr_info (LOG_MODULE_BLE, " SVC Len -%d" , block_len);
476
- }
477
-
478
- if (lengthTotal > BLE_MAX_ADV_SIZE)
479
- {
480
- pr_error (LOG_MODULE_BLE, " ADV Total length-%d" , lengthTotal);
481
- // Service data block is too large.
482
- return BLE_STATUS_ERROR_PARAMETER;
483
493
}
484
- return BLE_STATUS_SUCCESS;
494
+
495
+ return ret;
485
496
}
486
497
487
498
BLE_STATUS_T BLEDeviceManager::startAdvertising ()
@@ -498,7 +509,9 @@ BLE_STATUS_T BLEDeviceManager::startAdvertising()
498
509
if (_state != BLE_PERIPH_STATE_READY)
499
510
return BLE_STATUS_WRONG_STATE;
500
511
501
- ret = bt_le_adv_start (&_adv_param, _adv_data, _adv_data_idx, _scan_rsp_data, _scan_rsp_data_idx);
512
+ ret = bt_le_adv_start (&_adv_param,
513
+ _adv_data, _adv_data_idx,
514
+ _scan_rsp_data, _scan_rsp_data_idx);
502
515
if (0 != ret)
503
516
{
504
517
pr_error (LOG_MODULE_APP, " [ADV] Start failed. Error: %d" , ret);
0 commit comments