@@ -297,18 +297,39 @@ inline CHIP_ERROR BLEManagerImpl::PrepareAdvertisingRequest()
297
297
Encoding::LittleEndian::Put16 (serviceData.uuid , UUID16_CHIPoBLEService.val );
298
298
ReturnErrorOnFailure (ConfigurationMgr ().GetBLEDeviceIdentificationInfo (serviceData.deviceIdInfo ));
299
299
300
+ #if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
301
+ if (mFlags .Has (Flags::kExtendedAdvertisingEnabled ))
302
+ {
303
+ serviceData.deviceIdInfo .SetVendorId (DEVICE_HANDLE_NULL);
304
+ serviceData.deviceIdInfo .SetProductId (DEVICE_HANDLE_NULL);
305
+ serviceData.deviceIdInfo .SetExtendedAnnouncementFlag (true );
306
+ }
307
+ #endif
308
+
300
309
advertisingData[0 ] = BT_DATA (BT_DATA_FLAGS, &kAdvertisingFlags , sizeof (kAdvertisingFlags ));
301
310
advertisingData[1 ] = BT_DATA (BT_DATA_SVC_DATA16, &serviceData, sizeof (serviceData));
302
311
scanResponseData[0 ] = BT_DATA (BT_DATA_NAME_COMPLETE, name, nameSize);
303
312
304
- mAdvertisingRequest .priority = CHIP_DEVICE_BLE_ADVERTISING_PRIORITY;
305
- mAdvertisingRequest .options = kAdvertisingOptions ;
306
- mAdvertisingRequest .minInterval = mFlags .Has (Flags::kFastAdvertisingEnabled )
307
- ? CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MIN
308
- : CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
309
- mAdvertisingRequest .maxInterval = mFlags .Has (Flags::kFastAdvertisingEnabled )
310
- ? CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MAX
311
- : CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
313
+ mAdvertisingRequest .priority = CHIP_DEVICE_BLE_ADVERTISING_PRIORITY;
314
+ mAdvertisingRequest .options = kAdvertisingOptions ;
315
+
316
+ if (mFlags .Has (Flags::kFastAdvertisingEnabled ))
317
+ {
318
+ mAdvertisingRequest .minInterval = CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MIN;
319
+ mAdvertisingRequest .maxInterval = CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MAX;
320
+ }
321
+ #if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
322
+ else if (mFlags .Has (Flags::kExtendedAdvertisingEnabled ))
323
+ {
324
+ mAdvertisingRequest .minInterval = CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_MIN;
325
+ mAdvertisingRequest .maxInterval = CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_MAX;
326
+ }
327
+ #endif
328
+ else
329
+ {
330
+ mAdvertisingRequest .minInterval = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
331
+ mAdvertisingRequest .maxInterval = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
332
+ }
312
333
mAdvertisingRequest .advertisingData = Span<bt_data>(advertisingData);
313
334
mAdvertisingRequest .scanResponseData = nameSize ? Span<bt_data>(scanResponseData) : Span<bt_data>{};
314
335
@@ -397,10 +418,17 @@ CHIP_ERROR BLEManagerImpl::StartAdvertising()
397
418
398
419
if (mFlags .Has (Flags::kFastAdvertisingEnabled ))
399
420
{
400
- // Start timer to change advertising interval.
421
+ // Start timer to change advertising interval from fast to slow .
401
422
DeviceLayer::SystemLayer ().StartTimer (
402
423
System::Clock::Milliseconds32 (CHIP_DEVICE_CONFIG_BLE_ADVERTISING_INTERVAL_CHANGE_TIME),
403
- HandleBLEAdvertisementIntervalChange, this );
424
+ HandleSlowBLEAdvertisementInterval, this );
425
+
426
+ #if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
427
+ // Start timer to schedule start of the extended advertising
428
+ DeviceLayer::SystemLayer ().StartTimer (
429
+ System::Clock::Milliseconds32 (CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_CHANGE_TIME_MS),
430
+ HandleExtendedBLEAdvertisementInterval, this );
431
+ #endif
404
432
}
405
433
}
406
434
@@ -417,6 +445,10 @@ CHIP_ERROR BLEManagerImpl::StopAdvertising()
417
445
mFlags .Clear (Flags::kAdvertising );
418
446
mFlags .Set (Flags::kFastAdvertisingEnabled , true );
419
447
448
+ #if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
449
+ mFlags .Clear (Flags::kExtendedAdvertisingEnabled );
450
+ #endif
451
+
420
452
ChipLogProgress (DeviceLayer, " CHIPoBLE advertising stopped" );
421
453
422
454
// Post a CHIPoBLEAdvertisingChange(Stopped) event.
@@ -428,7 +460,8 @@ CHIP_ERROR BLEManagerImpl::StopAdvertising()
428
460
}
429
461
430
462
// Cancel timer event changing CHIPoBLE advertisement interval
431
- DeviceLayer::SystemLayer ().CancelTimer (HandleBLEAdvertisementIntervalChange, this );
463
+ DeviceLayer::SystemLayer ().CancelTimer (HandleSlowBLEAdvertisementInterval, this );
464
+ DeviceLayer::SystemLayer ().CancelTimer (HandleExtendedBLEAdvertisementInterval, this );
432
465
}
433
466
else
434
467
{
@@ -443,6 +476,9 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val)
443
476
ChipLogDetail (DeviceLayer, " CHIPoBLE advertising set to %s" , val ? " on" : " off" );
444
477
445
478
mFlags .Set (Flags::kAdvertisingEnabled , val);
479
+ // Ensure that each enabling/disabling of the general advertising clears
480
+ // the extended mode, to make sure we always start fresh in the regular mode
481
+ mFlags .Set (Flags::kExtendedAdvertisingEnabled , false );
446
482
PlatformMgr ().ScheduleWork (DriveBLEState, 0 );
447
483
448
484
return CHIP_NO_ERROR;
@@ -454,8 +490,14 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingMode(BLEAdvertisingMode mode)
454
490
{
455
491
case BLEAdvertisingMode::kFastAdvertising :
456
492
mFlags .Set (Flags::kFastAdvertisingEnabled , true );
493
+ mFlags .Set (Flags::kExtendedAdvertisingEnabled , false );
457
494
break ;
458
495
case BLEAdvertisingMode::kSlowAdvertising :
496
+ mFlags .Set (Flags::kFastAdvertisingEnabled , false );
497
+ mFlags .Set (Flags::kExtendedAdvertisingEnabled , false );
498
+ break ;
499
+ case BLEAdvertisingMode::kExtendedAdvertising :
500
+ mFlags .Set (Flags::kExtendedAdvertisingEnabled , true );
459
501
mFlags .Set (Flags::kFastAdvertisingEnabled , false );
460
502
break ;
461
503
default :
@@ -645,12 +687,18 @@ CHIP_ERROR BLEManagerImpl::PrepareC3CharData()
645
687
}
646
688
#endif
647
689
648
- void BLEManagerImpl::HandleBLEAdvertisementIntervalChange (System::Layer * layer, void * param)
690
+ void BLEManagerImpl::HandleSlowBLEAdvertisementInterval (System::Layer * layer, void * param)
649
691
{
650
692
BLEMgr ().SetAdvertisingMode (BLEAdvertisingMode::kSlowAdvertising );
651
693
ChipLogProgress (DeviceLayer, " CHIPoBLE advertising mode changed to slow" );
652
694
}
653
695
696
+ void BLEManagerImpl::HandleExtendedBLEAdvertisementInterval (System::Layer * layer, void * param)
697
+ {
698
+ BLEMgr ().SetAdvertisingMode (BLEAdvertisingMode::kExtendedAdvertising );
699
+ ChipLogProgress (DeviceLayer, " CHIPoBLE advertising mode changed to extended" );
700
+ }
701
+
654
702
void BLEManagerImpl::_OnPlatformEvent (const ChipDeviceEvent * event)
655
703
{
656
704
CHIP_ERROR err = CHIP_NO_ERROR;
0 commit comments