@@ -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
+ #if CHIP_DEVICE_CONFIG_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
+ #if CHIP_DEVICE_CONFIG_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,20 @@ CHIP_ERROR BLEManagerImpl::MapBLEError(int bleErr)
907
930
}
908
931
}
909
932
933
+ void BLEManagerImpl::CancelBleAdvTimeoutTimer (void )
934
+ {
935
+ SystemLayer ().CancelTimer (BleAdvTimeoutHandler, nullptr );
936
+ }
937
+
938
+ void BLEManagerImpl::StartBleAdvTimeoutTimer (uint32_t aTimeoutInMs)
939
+ {
940
+ CHIP_ERROR err = SystemLayer ().StartTimer (System::Clock::Milliseconds32 (aTimeoutInMs), BleAdvTimeoutHandler, nullptr );
941
+ if ((err != CHIP_NO_ERROR))
942
+ {
943
+ ChipLogError (DeviceLayer, " Failed to start BledAdv timeout timer" );
944
+ }
945
+ }
946
+
910
947
void BLEManagerImpl::DriveBLEState (void )
911
948
{
912
949
CHIP_ERROR err = CHIP_NO_ERROR;
@@ -1030,7 +1067,8 @@ void BLEManagerImpl::DriveBLEState(void)
1030
1067
ExitNow ();
1031
1068
}
1032
1069
1033
- mFlags .Set (Flags::kControlOpInProgress );
1070
+ DeinitESPBleLayer ();
1071
+ mFlags .ClearAll ();
1034
1072
1035
1073
ExitNow ();
1036
1074
}
@@ -1133,6 +1171,23 @@ CHIP_ERROR BLEManagerImpl::InitESPBleLayer(void)
1133
1171
return err;
1134
1172
}
1135
1173
1174
+ esp_err_t bluedroid_set_random_address ()
1175
+ {
1176
+ esp_bd_addr_t rand_addr;
1177
+
1178
+ esp_fill_random (rand_addr, sizeof (esp_bd_addr_t ));
1179
+ rand_addr[0 ] = (rand_addr[0 ] & 0x3F ) | 0xC0 ;
1180
+
1181
+ esp_err_t ret = esp_ble_gap_set_rand_addr (rand_addr);
1182
+ if (ret != ESP_OK)
1183
+ {
1184
+ ChipLogError (DeviceLayer, " Failed to set random address: %s" , esp_err_to_name (ret));
1185
+ return ret;
1186
+ }
1187
+
1188
+ return ESP_OK;
1189
+ }
1190
+
1136
1191
CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData (void )
1137
1192
{
1138
1193
CHIP_ERROR err;
@@ -1158,6 +1213,27 @@ CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
1158
1213
ExitNow ();
1159
1214
}
1160
1215
1216
+ #if CHIP_DEVICE_CONFIG_EXT_ADVERTISING
1217
+ // Check for extended advertisement interval and redact VID/PID if past the initial period.
1218
+ if (mFlags .Has (Flags::kExtAdvertisingEnabled ))
1219
+ {
1220
+ deviceIdInfo.SetVendorId (0 );
1221
+ deviceIdInfo.SetProductId (0 );
1222
+ deviceIdInfo.SetExtendedAnnouncementFlag (true );
1223
+ }
1224
+ #endif
1225
+
1226
+ #if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
1227
+ if (!mFlags .Has (Flags::kExtAdvertisingEnabled ))
1228
+ {
1229
+ deviceIdInfo.SetAdditionalDataFlag (true );
1230
+ }
1231
+ else
1232
+ {
1233
+ deviceIdInfo.SetAdditionalDataFlag (false );
1234
+ }
1235
+ #endif
1236
+
1161
1237
memset (advData, 0 , sizeof (advData));
1162
1238
advData[index ++] = 0x02 ; // length
1163
1239
advData[index ++] = CHIP_ADV_DATA_TYPE_FLAGS; // AD type : flags
@@ -1187,12 +1263,16 @@ CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
1187
1263
ExitNow ();
1188
1264
}
1189
1265
1266
+ bluedroid_set_random_address ();
1190
1267
mFlags .Set (Flags::kControlOpInProgress );
1191
1268
1192
1269
exit :
1193
1270
return err;
1194
1271
}
1195
1272
1273
+ // TODO(#36919): Fix the Bluedroid ShutDown flow for ESP32.
1274
+ void BLEManagerImpl::DeinitESPBleLayer () {}
1275
+
1196
1276
CHIP_ERROR BLEManagerImpl::StartAdvertising (void )
1197
1277
{
1198
1278
CHIP_ERROR err;
@@ -1223,8 +1303,23 @@ CHIP_ERROR BLEManagerImpl::StartAdvertising(void)
1223
1303
}
1224
1304
else
1225
1305
{
1306
+ #if CHIP_DEVICE_CONFIG_EXT_ADVERTISING
1307
+ if (!mFlags .Has (Flags::kExtAdvertisingEnabled ))
1308
+ {
1309
+ advertParams.adv_int_min = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
1310
+ advertParams.adv_int_max = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
1311
+ }
1312
+ else
1313
+ {
1314
+ advertParams.adv_int_min = CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_MIN;
1315
+ advertParams.adv_int_max = CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_MAX;
1316
+ }
1317
+ #else
1318
+
1226
1319
advertParams.adv_int_min = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
1227
1320
advertParams.adv_int_max = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
1321
+
1322
+ #endif
1228
1323
}
1229
1324
1230
1325
ChipLogProgress (DeviceLayer, " Configuring CHIPoBLE advertising (interval %" PRIu32 " ms, %sconnectable, device name %s)" ,
0 commit comments