@@ -252,18 +252,39 @@ inline CHIP_ERROR BLEManagerImpl::PrepareAdvertisingRequest()
252
252
Encoding::LittleEndian::Put16 (serviceData.uuid , UUID16_CHIPoBLEService.val );
253
253
ReturnErrorOnFailure (ConfigurationMgr ().GetBLEDeviceIdentificationInfo (serviceData.deviceIdInfo ));
254
254
255
+ #if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
256
+ if (mFlags .Has (Flags::kExtendedAdvertisingEnabled ))
257
+ {
258
+ serviceData.deviceIdInfo .SetVendorId (DEVICE_HANDLE_NULL);
259
+ serviceData.deviceIdInfo .SetProductId (DEVICE_HANDLE_NULL);
260
+ serviceData.deviceIdInfo .SetExtendedAnnouncementFlag (true );
261
+ }
262
+ #endif
263
+
255
264
advertisingData[0 ] = BT_DATA (BT_DATA_FLAGS, &kAdvertisingFlags , sizeof (kAdvertisingFlags ));
256
265
advertisingData[1 ] = BT_DATA (BT_DATA_SVC_DATA16, &serviceData, sizeof (serviceData));
257
266
scanResponseData[0 ] = BT_DATA (BT_DATA_NAME_COMPLETE, name, nameSize);
258
267
259
- mAdvertisingRequest .priority = CHIP_DEVICE_BLE_ADVERTISING_PRIORITY;
260
- mAdvertisingRequest .options = kAdvertisingOptions ;
261
- mAdvertisingRequest .minInterval = mFlags .Has (Flags::kFastAdvertisingEnabled )
262
- ? CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MIN
263
- : CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
264
- mAdvertisingRequest .maxInterval = mFlags .Has (Flags::kFastAdvertisingEnabled )
265
- ? CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MAX
266
- : CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
268
+ mAdvertisingRequest .priority = CHIP_DEVICE_BLE_ADVERTISING_PRIORITY;
269
+ mAdvertisingRequest .options = kAdvertisingOptions ;
270
+
271
+ if (mFlags .Has (Flags::kFastAdvertisingEnabled ))
272
+ {
273
+ mAdvertisingRequest .minInterval = CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MIN;
274
+ mAdvertisingRequest .maxInterval = CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MAX;
275
+ }
276
+ #if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
277
+ else if (mFlags .Has (Flags::kExtendedAdvertisingEnabled ))
278
+ {
279
+ mAdvertisingRequest .minInterval = CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_MIN;
280
+ mAdvertisingRequest .maxInterval = CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_MAX;
281
+ }
282
+ #endif
283
+ else
284
+ {
285
+ mAdvertisingRequest .minInterval = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
286
+ mAdvertisingRequest .maxInterval = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
287
+ }
267
288
mAdvertisingRequest .advertisingData = Span<bt_data>(advertisingData);
268
289
mAdvertisingRequest .scanResponseData = nameSize ? Span<bt_data>(scanResponseData) : Span<bt_data>{};
269
290
@@ -322,10 +343,17 @@ CHIP_ERROR BLEManagerImpl::StartAdvertising()
322
343
323
344
if (mFlags .Has (Flags::kFastAdvertisingEnabled ))
324
345
{
325
- // Start timer to change advertising interval.
346
+ // Start timer to change advertising interval from fast to slow .
326
347
DeviceLayer::SystemLayer ().StartTimer (
327
348
System::Clock::Milliseconds32 (CHIP_DEVICE_CONFIG_BLE_ADVERTISING_INTERVAL_CHANGE_TIME),
328
- HandleBLEAdvertisementIntervalChange, this );
349
+ HandleSlowBLEAdvertisementInterval, this );
350
+
351
+ #if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
352
+ // Start timer to schedule start of the extended advertising
353
+ DeviceLayer::SystemLayer ().StartTimer (
354
+ System::Clock::Milliseconds32 (CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_CHANGE_TIME_MS),
355
+ HandleExtendedBLEAdvertisementInterval, this );
356
+ #endif
329
357
}
330
358
}
331
359
@@ -342,6 +370,10 @@ CHIP_ERROR BLEManagerImpl::StopAdvertising()
342
370
mFlags .Clear (Flags::kAdvertising );
343
371
mFlags .Set (Flags::kFastAdvertisingEnabled , true );
344
372
373
+ #if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
374
+ mFlags .Clear (Flags::kExtendedAdvertisingEnabled );
375
+ #endif
376
+
345
377
ChipLogProgress (DeviceLayer, " CHIPoBLE advertising stopped" );
346
378
347
379
// Post a CHIPoBLEAdvertisingChange(Stopped) event.
@@ -353,7 +385,8 @@ CHIP_ERROR BLEManagerImpl::StopAdvertising()
353
385
}
354
386
355
387
// Cancel timer event changing CHIPoBLE advertisement interval
356
- DeviceLayer::SystemLayer ().CancelTimer (HandleBLEAdvertisementIntervalChange, this );
388
+ DeviceLayer::SystemLayer ().CancelTimer (HandleSlowBLEAdvertisementInterval, this );
389
+ DeviceLayer::SystemLayer ().CancelTimer (HandleExtendedBLEAdvertisementInterval, this );
357
390
}
358
391
359
392
return CHIP_NO_ERROR;
@@ -366,6 +399,9 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val)
366
399
ChipLogDetail (DeviceLayer, " CHIPoBLE advertising set to %s" , val ? " on" : " off" );
367
400
368
401
mFlags .Set (Flags::kAdvertisingEnabled , val);
402
+ // Ensure that each enabling/disabling of the standard advertising clears
403
+ // the extended mode flag.
404
+ mFlags .Set (Flags::kExtendedAdvertisingEnabled , false );
369
405
PlatformMgr ().ScheduleWork (DriveBLEState, 0 );
370
406
}
371
407
@@ -378,8 +414,14 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingMode(BLEAdvertisingMode mode)
378
414
{
379
415
case BLEAdvertisingMode::kFastAdvertising :
380
416
mFlags .Set (Flags::kFastAdvertisingEnabled , true );
417
+ mFlags .Set (Flags::kExtendedAdvertisingEnabled , false );
381
418
break ;
382
419
case BLEAdvertisingMode::kSlowAdvertising :
420
+ mFlags .Set (Flags::kFastAdvertisingEnabled , false );
421
+ mFlags .Set (Flags::kExtendedAdvertisingEnabled , false );
422
+ break ;
423
+ case BLEAdvertisingMode::kExtendedAdvertising :
424
+ mFlags .Set (Flags::kExtendedAdvertisingEnabled , true );
383
425
mFlags .Set (Flags::kFastAdvertisingEnabled , false );
384
426
break ;
385
427
default :
@@ -570,12 +612,18 @@ CHIP_ERROR BLEManagerImpl::PrepareC3CharData()
570
612
}
571
613
#endif
572
614
573
- void BLEManagerImpl::HandleBLEAdvertisementIntervalChange (System::Layer * layer, void * param)
615
+ void BLEManagerImpl::HandleSlowBLEAdvertisementInterval (System::Layer * layer, void * param)
574
616
{
575
617
BLEMgr ().SetAdvertisingMode (BLEAdvertisingMode::kSlowAdvertising );
576
618
ChipLogProgress (DeviceLayer, " CHIPoBLE advertising mode changed to slow" );
577
619
}
578
620
621
+ void BLEManagerImpl::HandleExtendedBLEAdvertisementInterval (System::Layer * layer, void * param)
622
+ {
623
+ BLEMgr ().SetAdvertisingMode (BLEAdvertisingMode::kExtendedAdvertising );
624
+ ChipLogProgress (DeviceLayer, " CHIPoBLE advertising mode changed to extended" );
625
+ }
626
+
579
627
void BLEManagerImpl::_OnPlatformEvent (const ChipDeviceEvent * event)
580
628
{
581
629
CHIP_ERROR err = CHIP_NO_ERROR;
0 commit comments