@@ -147,7 +147,6 @@ const uint16_t CHIPoBLEGATTAttrCount = sizeof(CHIPoBLEGATTAttrs) / sizeof(CHIPoB
147
147
ChipDeviceScanner & mDeviceScanner = Internal::ChipDeviceScanner::GetInstance();
148
148
#endif
149
149
BLEManagerImpl BLEManagerImpl::sInstance ;
150
- constexpr System::Clock::Timeout BLEManagerImpl::kFastAdvertiseTimeout ;
151
150
#ifdef CONFIG_ENABLE_ESP32_BLE_CONTROLLER
152
151
static esp_gattc_char_elem_t * char_elem_result = NULL ;
153
152
static esp_gattc_descr_elem_t * descr_elem_result = NULL ;
@@ -228,6 +227,23 @@ CHIP_ERROR BLEManagerImpl::_Init()
228
227
return err;
229
228
}
230
229
230
+ void BLEManagerImpl::_Shutdown ()
231
+ {
232
+ CancelBleAdvTimeoutTimer ();
233
+
234
+ BleLayer::Shutdown ();
235
+ mServiceMode = ConnectivityManager::kCHIPoBLEServiceMode_Disabled ;
236
+
237
+ // selectively setting kGATTServiceStarted flag, in order to notify the state machine to stop the CHIPoBLE gatt service
238
+ mFlags .ClearAll ().Set (Flags::kGATTServiceStarted );
239
+
240
+ #ifdef CONFIG_ENABLE_ESP32_BLE_CONTROLLER
241
+ OnChipBleConnectReceived = nullptr ;
242
+ #endif // CONFIG_ENABLE_ESP32_BLE_CONTROLLER
243
+
244
+ PlatformMgr ().ScheduleWork (DriveBLEState, 0 );
245
+ }
246
+
231
247
CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled (bool val)
232
248
{
233
249
CHIP_ERROR err = CHIP_NO_ERROR;
@@ -236,8 +252,7 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val)
236
252
237
253
if (val)
238
254
{
239
- mAdvertiseStartTime = System::SystemClock ().GetMonotonicTimestamp ();
240
- ReturnErrorOnFailure (DeviceLayer::SystemLayer ().StartTimer (kFastAdvertiseTimeout , HandleFastAdvertisementTimer, this ));
255
+ StartBleAdvTimeoutTimer (CHIP_DEVICE_CONFIG_BLE_ADVERTISING_INTERVAL_CHANGE_TIME);
241
256
}
242
257
mFlags .Set (Flags::kFastAdvertisingEnabled , val);
243
258
mFlags .Set (Flags::kAdvertisingRefreshNeeded , 1 );
@@ -247,21 +262,29 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val)
247
262
return err;
248
263
}
249
264
250
- void BLEManagerImpl::HandleFastAdvertisementTimer (System::Layer * systemLayer, void * context)
251
- {
252
- static_cast <BLEManagerImpl *>(context)->HandleFastAdvertisementTimer ();
253
- }
254
-
255
- void BLEManagerImpl::HandleFastAdvertisementTimer ()
265
+ void BLEManagerImpl::BleAdvTimeoutHandler (System::Layer *, void *)
256
266
{
257
- System::Clock::Timestamp currentTimestamp = System::SystemClock ().GetMonotonicTimestamp ();
258
-
259
- if (currentTimestamp - mAdvertiseStartTime >= kFastAdvertiseTimeout )
267
+ if (BLEMgrImpl ().mFlags .Has (Flags::kFastAdvertisingEnabled ))
268
+ {
269
+ ChipLogProgress (DeviceLayer, " bleAdv Timeout : Start slow advertisement" );
270
+ BLEMgrImpl ().mFlags .Set (Flags::kFastAdvertisingEnabled , 0 );
271
+ BLEMgrImpl ().mFlags .Set (Flags::kAdvertisingRefreshNeeded , 1 );
272
+ #ifdef CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
273
+ BLEMgrImpl ().mFlags .Clear (Flags::kExtAdvertisingEnabled );
274
+ BLEMgrImpl ().StartBleAdvTimeoutTimer (CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_CHANGE_TIME_MS);
275
+ #endif
276
+ }
277
+ #ifdef CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
278
+ else
260
279
{
261
- mFlags .Clear (Flags::kFastAdvertisingEnabled );
262
- mFlags .Set (Flags::kAdvertisingRefreshNeeded );
263
- PlatformMgr ().ScheduleWork (DriveBLEState, 0 );
280
+ ChipLogProgress (DeviceLayer, " bleAdv Timeout : Start extended advertisement" );
281
+ BLEMgrImpl ().mFlags .Set (Flags::kAdvertising );
282
+ BLEMgrImpl ().mFlags .Set (Flags::kExtAdvertisingEnabled );
283
+ BLEMgr ().SetAdvertisingMode (BLEAdvertisingMode::kSlowAdvertising );
284
+ BLEMgrImpl ().mFlags .Set (Flags::kAdvertisingRefreshNeeded , 1 );
264
285
}
286
+ #endif
287
+ PlatformMgr ().ScheduleWork (DriveBLEState, 0 );
265
288
}
266
289
267
290
CHIP_ERROR BLEManagerImpl::_SetAdvertisingMode (BLEAdvertisingMode mode)
@@ -843,8 +866,8 @@ CHIP_ERROR BLEManagerImpl::SendIndication(BLE_CONNECTION_OBJECT conId, const Chi
843
866
#endif
844
867
845
868
// Set param need_confirm as false will send notification, otherwise indication.
846
- err = MapBLEError (
847
- esp_ble_gatts_send_indicate ( mAppIf , conId, mTXCharAttrHandle , data-> DataLength (), data->Start (), true /* need_confirm */ ));
869
+ err = MapBLEError (esp_ble_gatts_send_indicate ( mAppIf , conId, mTXCharAttrHandle , static_cast < uint16_t >(data-> DataLength ()),
870
+ data->Start (), true /* need_confirm */ ));
848
871
if (err != CHIP_NO_ERROR)
849
872
{
850
873
ChipLogError (DeviceLayer, " esp_ble_gatts_send_indicate() failed: %s" , ErrorStr (err));
@@ -907,6 +930,25 @@ CHIP_ERROR BLEManagerImpl::MapBLEError(int bleErr)
907
930
}
908
931
}
909
932
933
+ void BLEManagerImpl::CancelBleAdvTimeoutTimer (void )
934
+ {
935
+ if (SystemLayer ().IsTimerActive (BleAdvTimeoutHandler, nullptr ))
936
+ {
937
+ SystemLayer ().CancelTimer (BleAdvTimeoutHandler, nullptr );
938
+ }
939
+ }
940
+
941
+ void BLEManagerImpl::StartBleAdvTimeoutTimer (uint32_t aTimeoutInMs)
942
+ {
943
+ CancelBleAdvTimeoutTimer ();
944
+
945
+ CHIP_ERROR err = SystemLayer ().StartTimer (System::Clock::Milliseconds32 (aTimeoutInMs), BleAdvTimeoutHandler, nullptr );
946
+ if ((err != CHIP_NO_ERROR))
947
+ {
948
+ ChipLogError (DeviceLayer, " Failed to start BledAdv timeout timer" );
949
+ }
950
+ }
951
+
910
952
void BLEManagerImpl::DriveBLEState (void )
911
953
{
912
954
CHIP_ERROR err = CHIP_NO_ERROR;
@@ -1030,7 +1072,8 @@ void BLEManagerImpl::DriveBLEState(void)
1030
1072
ExitNow ();
1031
1073
}
1032
1074
1033
- mFlags .Set (Flags::kControlOpInProgress );
1075
+ DeinitESPBleLayer ();
1076
+ mFlags .ClearAll ();
1034
1077
1035
1078
ExitNow ();
1036
1079
}
@@ -1133,6 +1176,23 @@ CHIP_ERROR BLEManagerImpl::InitESPBleLayer(void)
1133
1176
return err;
1134
1177
}
1135
1178
1179
+ esp_err_t bluedroid_set_random_address ()
1180
+ {
1181
+ esp_bd_addr_t rand_addr;
1182
+
1183
+ esp_fill_random (rand_addr, sizeof (esp_bd_addr_t ));
1184
+ rand_addr[0 ] = (rand_addr[0 ] & 0x3F ) | 0xC0 ;
1185
+
1186
+ esp_err_t ret = esp_ble_gap_set_rand_addr (rand_addr);
1187
+ if (ret != ESP_OK)
1188
+ {
1189
+ ChipLogError (DeviceLayer, " Failed to set random address: %s" , esp_err_to_name (ret));
1190
+ return ret;
1191
+ }
1192
+
1193
+ return ESP_OK;
1194
+ }
1195
+
1136
1196
CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData (void )
1137
1197
{
1138
1198
CHIP_ERROR err;
@@ -1158,6 +1218,27 @@ CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
1158
1218
ExitNow ();
1159
1219
}
1160
1220
1221
+ #ifdef CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
1222
+ // Check for extended advertisement interval and redact VID/PID if past the initial period.
1223
+ if (mFlags .Has (Flags::kExtAdvertisingEnabled ))
1224
+ {
1225
+ deviceIdInfo.SetVendorId (0 );
1226
+ deviceIdInfo.SetProductId (0 );
1227
+ deviceIdInfo.SetExtendedAnnouncementFlag (true );
1228
+ }
1229
+ #endif
1230
+
1231
+ #if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
1232
+ if (!mFlags .Has (Flags::kExtAdvertisingEnabled ))
1233
+ {
1234
+ deviceIdInfo.SetAdditionalDataFlag (true );
1235
+ }
1236
+ else
1237
+ {
1238
+ deviceIdInfo.SetAdditionalDataFlag (false );
1239
+ }
1240
+ #endif
1241
+
1161
1242
memset (advData, 0 , sizeof (advData));
1162
1243
advData[index ++] = 0x02 ; // length
1163
1244
advData[index ++] = CHIP_ADV_DATA_TYPE_FLAGS; // AD type : flags
@@ -1187,12 +1268,16 @@ CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
1187
1268
ExitNow ();
1188
1269
}
1189
1270
1271
+ bluedroid_set_random_address ();
1190
1272
mFlags .Set (Flags::kControlOpInProgress );
1191
1273
1192
1274
exit :
1193
1275
return err;
1194
1276
}
1195
1277
1278
+ // TODO(#36919): Fix the Bluedroid ShutDown flow for ESP32.
1279
+ void BLEManagerImpl::DeinitESPBleLayer () {}
1280
+
1196
1281
CHIP_ERROR BLEManagerImpl::StartAdvertising (void )
1197
1282
{
1198
1283
CHIP_ERROR err;
@@ -1223,8 +1308,23 @@ CHIP_ERROR BLEManagerImpl::StartAdvertising(void)
1223
1308
}
1224
1309
else
1225
1310
{
1311
+ #ifdef CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
1312
+ if (!mFlags .Has (Flags::kExtAdvertisingEnabled ))
1313
+ {
1314
+ advertParams.adv_int_min = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
1315
+ advertParams.adv_int_max = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
1316
+ }
1317
+ else
1318
+ {
1319
+ advertParams.adv_int_min = CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_MIN;
1320
+ advertParams.adv_int_max = CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_MAX;
1321
+ }
1322
+ #else
1323
+
1226
1324
advertParams.adv_int_min = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
1227
1325
advertParams.adv_int_max = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
1326
+
1327
+ #endif
1228
1328
}
1229
1329
1230
1330
ChipLogProgress (DeviceLayer, " Configuring CHIPoBLE advertising (interval %" PRIu32 " ms, %sconnectable, device name %s)" ,
0 commit comments