Skip to content

Commit 2f6717a

Browse files
committed
Fixed the bluedroid build issue in ESP32
- Fixed the build issue with bluedroid. - Added extended ble advertising support.
1 parent af336ec commit 2f6717a

File tree

1 file changed

+118
-18
lines changed

1 file changed

+118
-18
lines changed

src/platform/ESP32/bluedroid/BLEManagerImpl.cpp

+118-18
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,6 @@ const uint16_t CHIPoBLEGATTAttrCount = sizeof(CHIPoBLEGATTAttrs) / sizeof(CHIPoB
147147
ChipDeviceScanner & mDeviceScanner = Internal::ChipDeviceScanner::GetInstance();
148148
#endif
149149
BLEManagerImpl BLEManagerImpl::sInstance;
150-
constexpr System::Clock::Timeout BLEManagerImpl::kFastAdvertiseTimeout;
151150
#ifdef CONFIG_ENABLE_ESP32_BLE_CONTROLLER
152151
static esp_gattc_char_elem_t * char_elem_result = NULL;
153152
static esp_gattc_descr_elem_t * descr_elem_result = NULL;
@@ -228,6 +227,23 @@ CHIP_ERROR BLEManagerImpl::_Init()
228227
return err;
229228
}
230229

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+
231247
CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val)
232248
{
233249
CHIP_ERROR err = CHIP_NO_ERROR;
@@ -236,8 +252,7 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val)
236252

237253
if (val)
238254
{
239-
mAdvertiseStartTime = System::SystemClock().GetMonotonicTimestamp();
240-
ReturnErrorOnFailure(DeviceLayer::SystemLayer().StartTimer(kFastAdvertiseTimeout, HandleFastAdvertisementTimer, this));
255+
StartBleAdvTimeoutTimer(CHIP_DEVICE_CONFIG_BLE_ADVERTISING_INTERVAL_CHANGE_TIME);
241256
}
242257
mFlags.Set(Flags::kFastAdvertisingEnabled, val);
243258
mFlags.Set(Flags::kAdvertisingRefreshNeeded, 1);
@@ -247,21 +262,29 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val)
247262
return err;
248263
}
249264

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 *)
256266
{
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
260279
{
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);
264285
}
286+
#endif
287+
PlatformMgr().ScheduleWork(DriveBLEState, 0);
265288
}
266289

267290
CHIP_ERROR BLEManagerImpl::_SetAdvertisingMode(BLEAdvertisingMode mode)
@@ -843,8 +866,8 @@ CHIP_ERROR BLEManagerImpl::SendIndication(BLE_CONNECTION_OBJECT conId, const Chi
843866
#endif
844867

845868
// 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 */));
848871
if (err != CHIP_NO_ERROR)
849872
{
850873
ChipLogError(DeviceLayer, "esp_ble_gatts_send_indicate() failed: %s", ErrorStr(err));
@@ -907,6 +930,25 @@ CHIP_ERROR BLEManagerImpl::MapBLEError(int bleErr)
907930
}
908931
}
909932

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+
910952
void BLEManagerImpl::DriveBLEState(void)
911953
{
912954
CHIP_ERROR err = CHIP_NO_ERROR;
@@ -1030,7 +1072,8 @@ void BLEManagerImpl::DriveBLEState(void)
10301072
ExitNow();
10311073
}
10321074

1033-
mFlags.Set(Flags::kControlOpInProgress);
1075+
DeinitESPBleLayer();
1076+
mFlags.ClearAll();
10341077

10351078
ExitNow();
10361079
}
@@ -1133,6 +1176,23 @@ CHIP_ERROR BLEManagerImpl::InitESPBleLayer(void)
11331176
return err;
11341177
}
11351178

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+
11361196
CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
11371197
{
11381198
CHIP_ERROR err;
@@ -1158,6 +1218,27 @@ CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
11581218
ExitNow();
11591219
}
11601220

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+
11611242
memset(advData, 0, sizeof(advData));
11621243
advData[index++] = 0x02; // length
11631244
advData[index++] = CHIP_ADV_DATA_TYPE_FLAGS; // AD type : flags
@@ -1187,12 +1268,16 @@ CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
11871268
ExitNow();
11881269
}
11891270

1271+
bluedroid_set_random_address();
11901272
mFlags.Set(Flags::kControlOpInProgress);
11911273

11921274
exit:
11931275
return err;
11941276
}
11951277

1278+
// TODO(#36919): Fix the Bluedroid ShutDown flow for ESP32.
1279+
void BLEManagerImpl::DeinitESPBleLayer() {}
1280+
11961281
CHIP_ERROR BLEManagerImpl::StartAdvertising(void)
11971282
{
11981283
CHIP_ERROR err;
@@ -1223,8 +1308,23 @@ CHIP_ERROR BLEManagerImpl::StartAdvertising(void)
12231308
}
12241309
else
12251310
{
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+
12261324
advertParams.adv_int_min = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
12271325
advertParams.adv_int_max = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
1326+
1327+
#endif
12281328
}
12291329

12301330
ChipLogProgress(DeviceLayer, "Configuring CHIPoBLE advertising (interval %" PRIu32 " ms, %sconnectable, device name %s)",

0 commit comments

Comments
 (0)