@@ -76,6 +76,7 @@ namespace Internal {
76
76
77
77
namespace {
78
78
79
+ TimerHandle_t sbleAdvTimeoutTimer; // FreeRTOS sw timer.
79
80
#if CONFIG_ENABLE_ESP32_BLE_CONTROLLER
80
81
static constexpr uint16_t kNewConnectionScanTimeout = 60 ;
81
82
static constexpr uint16_t kConnectTimeout = 20 ;
@@ -123,8 +124,6 @@ uint8_t own_addr_type = BLE_OWN_ADDR_RANDOM;
123
124
ChipDeviceScanner & mDeviceScanner = Internal::ChipDeviceScanner::GetInstance();
124
125
#endif
125
126
BLEManagerImpl BLEManagerImpl::sInstance ;
126
- constexpr System::Clock::Timeout BLEManagerImpl::kFastAdvertiseTimeout ;
127
-
128
127
const struct ble_gatt_svc_def BLEManagerImpl::CHIPoBLEGATTAttrs[] = {
129
128
{ .type = BLE_GATT_SVC_TYPE_PRIMARY,
130
129
.uuid = (ble_uuid_t *) (&ShortUUID_CHIPoBLEService),
@@ -221,6 +220,14 @@ CHIP_ERROR BLEManagerImpl::_Init()
221
220
#endif
222
221
SuccessOrExit (err);
223
222
223
+ // Create FreeRTOS sw timer for BLE timeouts and interval change.
224
+ sbleAdvTimeoutTimer = xTimerCreate (" BleAdvTimer" , // Just a text name, not used by the RTOS kernel
225
+ 1 , // == default timer period
226
+ false , // no timer reload (==one-shot)
227
+ (void *) this , // init timer id = ble obj context
228
+ BleAdvTimeoutHandler // timer callback handler
229
+ );
230
+
224
231
mRXCharAttrHandle = 0 ;
225
232
#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
226
233
mC3CharAttrHandle = 0 ;
@@ -254,8 +261,7 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val)
254
261
255
262
if (val)
256
263
{
257
- mAdvertiseStartTime = System::SystemClock ().GetMonotonicTimestamp ();
258
- ReturnErrorOnFailure (DeviceLayer::SystemLayer ().StartTimer (kFastAdvertiseTimeout , HandleFastAdvertisementTimer, this ));
264
+ StartBleAdvTimeoutTimer (CHIP_DEVICE_CONFIG_BLE_ADVERTISING_INTERVAL_CHANGE_TIME);
259
265
}
260
266
261
267
mFlags .Set (Flags::kFastAdvertisingEnabled , val);
@@ -267,21 +273,31 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val)
267
273
return err;
268
274
}
269
275
270
- void BLEManagerImpl::HandleFastAdvertisementTimer (System::Layer * systemLayer, void * context)
271
- {
272
- static_cast <BLEManagerImpl *>(context)->HandleFastAdvertisementTimer ();
273
- }
274
-
275
- void BLEManagerImpl::HandleFastAdvertisementTimer ()
276
+ void BLEManagerImpl::BleAdvTimeoutHandler (TimerHandle_t xTimer)
276
277
{
277
- System::Clock::Timestamp currentTimestamp = System::SystemClock ().GetMonotonicTimestamp ();
278
+ if (BLEMgrImpl ().mFlags .Has (Flags::kFastAdvertisingEnabled ))
279
+ {
280
+ ChipLogProgress (DeviceLayer, " bleAdv Timeout : Start slow advertisement" );
281
+ BLEMgrImpl ().mFlags .Set (Flags::kFastAdvertisingEnabled , 0 );
282
+ BLEMgrImpl ().mFlags .Set (Flags::kAdvertisingRefreshNeeded , 1 );
278
283
279
- if (currentTimestamp - mAdvertiseStartTime >= kFastAdvertiseTimeout )
284
+ #if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
285
+ BLEMgrImpl ().mFlags .Clear (Flags::kExtAdvertisingEnabled );
286
+ BLEMgrImpl ().StartBleAdvTimeoutTimer (CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_CHANGE_TIME_MS);
287
+ #endif
288
+ PlatformMgr ().ScheduleWork (DriveBLEState, 0 );
289
+ }
290
+ #if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
291
+ else
280
292
{
281
- mFlags .Set (Flags::kFastAdvertisingEnabled , 0 );
282
- mFlags .Set (Flags::kAdvertisingRefreshNeeded , 1 );
293
+ ChipLogProgress (DeviceLayer, " bleAdv Timeout : Start extended advertisement" );
294
+ BLEMgrImpl ().mFlags .Set (Flags::kAdvertising );
295
+ BLEMgrImpl ().mFlags .Set (Flags::kExtAdvertisingEnabled );
296
+ BLEMgr ().SetAdvertisingMode (BLEAdvertisingMode::kSlowAdvertising );
297
+ BLEMgrImpl ().mFlags .Set (Flags::kAdvertisingRefreshNeeded , 1 );
283
298
PlatformMgr ().ScheduleWork (DriveBLEState, 0 );
284
299
}
300
+ #endif
285
301
}
286
302
287
303
CHIP_ERROR BLEManagerImpl::_SetAdvertisingMode (BLEAdvertisingMode mode)
@@ -690,6 +706,28 @@ CHIP_ERROR BLEManagerImpl::MapBLEError(int bleErr)
690
706
return CHIP_ERROR (ChipError::Range::kPlatform , CHIP_DEVICE_CONFIG_ESP32_BLE_ERROR_MIN + bleErr);
691
707
}
692
708
}
709
+ void BLEManagerImpl::CancelBleAdvTimeoutTimer (void )
710
+ {
711
+ if (xTimerStop (sbleAdvTimeoutTimer, pdMS_TO_TICKS (0 )) == pdFAIL)
712
+ {
713
+ ChipLogError (DeviceLayer, " Failed to stop BledAdv timeout timer" );
714
+ }
715
+ }
716
+ void BLEManagerImpl::StartBleAdvTimeoutTimer (uint32_t aTimeoutInMs)
717
+ {
718
+ if (xTimerIsTimerActive (sbleAdvTimeoutTimer))
719
+ {
720
+ CancelBleAdvTimeoutTimer ();
721
+ }
722
+
723
+ // timer is not active, change its period to required value (== restart).
724
+ // FreeRTOS- Block for a maximum of 100 ticks if the change period command
725
+ // cannot immediately be sent to the timer command queue.
726
+ if (xTimerChangePeriod (sbleAdvTimeoutTimer, pdMS_TO_TICKS (aTimeoutInMs), pdMS_TO_TICKS (100 )) != pdPASS)
727
+ {
728
+ ChipLogError (DeviceLayer, " Failed to start BledAdv timeout timer" );
729
+ }
730
+ }
693
731
void BLEManagerImpl::DriveBLEState (void )
694
732
{
695
733
CHIP_ERROR err = CHIP_NO_ERROR;
@@ -977,8 +1015,25 @@ CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
977
1015
ExitNow ();
978
1016
}
979
1017
1018
+ #if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
1019
+ // Check for extended advertisement interval and redact VID/PID if past the initial period.
1020
+ if (mFlags .Has (Flags::kExtAdvertisingEnabled ))
1021
+ {
1022
+ deviceIdInfo.SetVendorId (0 );
1023
+ deviceIdInfo.SetProductId (0 );
1024
+ deviceIdInfo.SetExtendedAnnouncementFlag (true );
1025
+ }
1026
+ #endif
1027
+
980
1028
#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
981
- deviceIdInfo.SetAdditionalDataFlag (true );
1029
+ if (!mFlags .Has (Flags::kExtAdvertisingEnabled ))
1030
+ {
1031
+ deviceIdInfo.SetAdditionalDataFlag (true );
1032
+ }
1033
+ else
1034
+ {
1035
+ deviceIdInfo.SetAdditionalDataFlag (false );
1036
+ }
982
1037
#endif
983
1038
984
1039
VerifyOrExit (index + sizeof (deviceIdInfo) <= sizeof (advData), err = CHIP_ERROR_OUTBOUND_MESSAGE_TOO_BIG);
@@ -1565,8 +1620,23 @@ CHIP_ERROR BLEManagerImpl::StartAdvertising(void)
1565
1620
}
1566
1621
else
1567
1622
{
1623
+ #if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
1624
+ if (!mFlags .Has (Flags::kExtAdvertisingEnabled ))
1625
+ {
1626
+ adv_params.itvl_min = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
1627
+ adv_params.itvl_max = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
1628
+ }
1629
+ else
1630
+ {
1631
+ adv_params.itvl_min = CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_MIN;
1632
+ adv_params.itvl_max = CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_MAX;
1633
+ }
1634
+ #else
1635
+
1568
1636
adv_params.itvl_min = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
1569
1637
adv_params.itvl_max = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
1638
+
1639
+ #endif
1570
1640
}
1571
1641
1572
1642
ChipLogProgress (DeviceLayer, " Configuring CHIPoBLE advertising (interval %" PRIu32 " ms, %sconnectable)" ,
0 commit comments