Skip to content

Commit 4c1a0c5

Browse files
[ESP32] Fixed the bluedroid build issue in ESP32. (#34133)
- Fixed the build issue due to missing bits in bluedroid BLEManagerImpl. - Added extended ble advertising support.
1 parent b6da5d5 commit 4c1a0c5

File tree

1 file changed

+113
-18
lines changed

1 file changed

+113
-18
lines changed

src/platform/ESP32/bluedroid/BLEManagerImpl.cpp

+113-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+
#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
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,20 @@ CHIP_ERROR BLEManagerImpl::MapBLEError(int bleErr)
907930
}
908931
}
909932

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+
910947
void BLEManagerImpl::DriveBLEState(void)
911948
{
912949
CHIP_ERROR err = CHIP_NO_ERROR;
@@ -1030,7 +1067,8 @@ void BLEManagerImpl::DriveBLEState(void)
10301067
ExitNow();
10311068
}
10321069

1033-
mFlags.Set(Flags::kControlOpInProgress);
1070+
DeinitESPBleLayer();
1071+
mFlags.ClearAll();
10341072

10351073
ExitNow();
10361074
}
@@ -1133,6 +1171,23 @@ CHIP_ERROR BLEManagerImpl::InitESPBleLayer(void)
11331171
return err;
11341172
}
11351173

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+
11361191
CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
11371192
{
11381193
CHIP_ERROR err;
@@ -1158,6 +1213,27 @@ CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
11581213
ExitNow();
11591214
}
11601215

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+
11611237
memset(advData, 0, sizeof(advData));
11621238
advData[index++] = 0x02; // length
11631239
advData[index++] = CHIP_ADV_DATA_TYPE_FLAGS; // AD type : flags
@@ -1187,12 +1263,16 @@ CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
11871263
ExitNow();
11881264
}
11891265

1266+
bluedroid_set_random_address();
11901267
mFlags.Set(Flags::kControlOpInProgress);
11911268

11921269
exit:
11931270
return err;
11941271
}
11951272

1273+
// TODO(#36919): Fix the Bluedroid ShutDown flow for ESP32.
1274+
void BLEManagerImpl::DeinitESPBleLayer() {}
1275+
11961276
CHIP_ERROR BLEManagerImpl::StartAdvertising(void)
11971277
{
11981278
CHIP_ERROR err;
@@ -1223,8 +1303,23 @@ CHIP_ERROR BLEManagerImpl::StartAdvertising(void)
12231303
}
12241304
else
12251305
{
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+
12261319
advertParams.adv_int_min = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
12271320
advertParams.adv_int_max = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
1321+
1322+
#endif
12281323
}
12291324

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

0 commit comments

Comments
 (0)