mirror of
https://github.com/espressif/esp-matter.git
synced 2026-04-27 19:13:13 +00:00
ble manager fixes in custom platform
This commit is contained in:
@@ -92,8 +92,7 @@ namespace Internal {
|
||||
|
||||
namespace {
|
||||
|
||||
TimerHandle_t sbleAdvTimeoutTimer; // FreeRTOS sw timer.
|
||||
#if CONFIG_ENABLE_ESP32_BLE_CONTROLLER
|
||||
#ifdef CONFIG_ENABLE_ESP32_BLE_CONTROLLER
|
||||
static constexpr uint16_t kNewConnectionScanTimeout = 60;
|
||||
static constexpr uint16_t kConnectTimeout = 20;
|
||||
#endif
|
||||
@@ -228,16 +227,6 @@ CHIP_ERROR BLEManagerImpl::_Init()
|
||||
{
|
||||
CHIP_ERROR err;
|
||||
|
||||
// Create FreeRTOS sw timer for BLE timeouts and interval change.
|
||||
sbleAdvTimeoutTimer = xTimerCreate("BleAdvTimer", // Just a text name, not used by the RTOS kernel
|
||||
1, // == default timer period
|
||||
false, // no timer reload (==one-shot)
|
||||
(void *) this, // init timer id = ble obj context
|
||||
BleAdvTimeoutHandler // timer callback handler
|
||||
);
|
||||
|
||||
VerifyOrReturnError(sbleAdvTimeoutTimer != nullptr, CHIP_ERROR_NO_MEMORY);
|
||||
|
||||
// Initialize the Chip BleLayer.
|
||||
#if CONFIG_ENABLE_ESP32_BLE_CONTROLLER
|
||||
err = BleLayer::Init(this, this, this, &DeviceLayer::SystemLayer());
|
||||
@@ -273,9 +262,7 @@ exit:
|
||||
|
||||
void BLEManagerImpl::_Shutdown()
|
||||
{
|
||||
VerifyOrReturn(sbleAdvTimeoutTimer != nullptr);
|
||||
xTimerDelete(sbleAdvTimeoutTimer, portMAX_DELAY);
|
||||
sbleAdvTimeoutTimer = nullptr;
|
||||
CancelBleAdvTimeoutTimer();
|
||||
|
||||
BleLayer::Shutdown();
|
||||
|
||||
@@ -310,7 +297,7 @@ exit:
|
||||
return err;
|
||||
}
|
||||
|
||||
void BLEManagerImpl::BleAdvTimeoutHandler(TimerHandle_t xTimer)
|
||||
void BLEManagerImpl::BleAdvTimeoutHandler(System::Layer *, void *)
|
||||
{
|
||||
if (BLEMgrImpl().mFlags.Has(Flags::kFastAdvertisingEnabled))
|
||||
{
|
||||
@@ -322,7 +309,6 @@ void BLEManagerImpl::BleAdvTimeoutHandler(TimerHandle_t xTimer)
|
||||
BLEMgrImpl().mFlags.Clear(Flags::kExtAdvertisingEnabled);
|
||||
BLEMgrImpl().StartBleAdvTimeoutTimer(CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_CHANGE_TIME_MS);
|
||||
#endif
|
||||
PlatformMgr().ScheduleWork(DriveBLEState, 0);
|
||||
}
|
||||
#if CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING
|
||||
else
|
||||
@@ -332,9 +318,9 @@ void BLEManagerImpl::BleAdvTimeoutHandler(TimerHandle_t xTimer)
|
||||
BLEMgrImpl().mFlags.Set(Flags::kExtAdvertisingEnabled);
|
||||
BLEMgr().SetAdvertisingMode(BLEAdvertisingMode::kSlowAdvertising);
|
||||
BLEMgrImpl().mFlags.Set(Flags::kAdvertisingRefreshNeeded, 1);
|
||||
PlatformMgr().ScheduleWork(DriveBLEState, 0);
|
||||
}
|
||||
#endif
|
||||
PlatformMgr().ScheduleWork(DriveBLEState, 0);
|
||||
}
|
||||
|
||||
CHIP_ERROR BLEManagerImpl::_SetAdvertisingMode(BLEAdvertisingMode mode)
|
||||
@@ -530,6 +516,11 @@ bool BLEManagerImpl::SubscribeCharacteristic(BLE_CONNECTION_OBJECT conId, const
|
||||
int rc;
|
||||
struct peer * peer = peer_find(conId);
|
||||
|
||||
if (peer == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
dsc = peer_dsc_find_uuid(peer, (ble_uuid_t *) (&ShortUUID_CHIPoBLEService), (ble_uuid_t *) (&UUID_CHIPoBLEChar_TX),
|
||||
(ble_uuid_t *) (&ShortUUID_CHIPoBLE_CharTx_Desc));
|
||||
|
||||
@@ -564,6 +555,11 @@ bool BLEManagerImpl::UnsubscribeCharacteristic(BLE_CONNECTION_OBJECT conId, cons
|
||||
int rc;
|
||||
struct peer * peer = peer_find(conId);
|
||||
|
||||
if (peer == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
dsc = peer_dsc_find_uuid(peer, (ble_uuid_t *) (&ShortUUID_CHIPoBLEService), (ble_uuid_t *) (&UUID_CHIPoBLEChar_TX),
|
||||
(ble_uuid_t *) (&ShortUUID_CHIPoBLE_CharTx_Desc));
|
||||
|
||||
@@ -712,7 +708,11 @@ bool BLEManagerImpl::SendReadResponse(BLE_CONNECTION_OBJECT conId, BLE_READ_REQU
|
||||
return false;
|
||||
}
|
||||
|
||||
void BLEManagerImpl::NotifyChipConnectionClosed(BLE_CONNECTION_OBJECT conId) {}
|
||||
void BLEManagerImpl::NotifyChipConnectionClosed(BLE_CONNECTION_OBJECT conId)
|
||||
{
|
||||
ChipLogDetail(Ble, "Received notification of closed CHIPoBLE connection (con %u)", conId);
|
||||
CloseConnection(conId);
|
||||
}
|
||||
|
||||
CHIP_ERROR BLEManagerImpl::MapBLEError(int bleErr)
|
||||
{
|
||||
@@ -745,26 +745,17 @@ CHIP_ERROR BLEManagerImpl::MapBLEError(int bleErr)
|
||||
}
|
||||
void BLEManagerImpl::CancelBleAdvTimeoutTimer(void)
|
||||
{
|
||||
VerifyOrReturn(sbleAdvTimeoutTimer != nullptr);
|
||||
|
||||
if (xTimerStop(sbleAdvTimeoutTimer, pdMS_TO_TICKS(0)) == pdFAIL)
|
||||
if (SystemLayer().IsTimerActive(BleAdvTimeoutHandler, nullptr))
|
||||
{
|
||||
ChipLogError(DeviceLayer, "Failed to stop BledAdv timeout timer");
|
||||
SystemLayer().CancelTimer(BleAdvTimeoutHandler, nullptr);
|
||||
}
|
||||
}
|
||||
void BLEManagerImpl::StartBleAdvTimeoutTimer(uint32_t aTimeoutInMs)
|
||||
{
|
||||
VerifyOrReturn(sbleAdvTimeoutTimer != nullptr);
|
||||
CancelBleAdvTimeoutTimer();
|
||||
|
||||
if (xTimerIsTimerActive(sbleAdvTimeoutTimer))
|
||||
{
|
||||
CancelBleAdvTimeoutTimer();
|
||||
}
|
||||
|
||||
// timer is not active, change its period to required value (== restart).
|
||||
// FreeRTOS- Block for a maximum of 100 ticks if the change period command
|
||||
// cannot immediately be sent to the timer command queue.
|
||||
if (xTimerChangePeriod(sbleAdvTimeoutTimer, pdMS_TO_TICKS(aTimeoutInMs), pdMS_TO_TICKS(100)) != pdPASS)
|
||||
CHIP_ERROR err = SystemLayer().StartTimer(System::Clock::Milliseconds32(aTimeoutInMs), BleAdvTimeoutHandler, nullptr);
|
||||
if (err != CHIP_NO_ERROR)
|
||||
{
|
||||
ChipLogError(DeviceLayer, "Failed to start BledAdv timeout timer");
|
||||
}
|
||||
@@ -899,23 +890,21 @@ void BLEManagerImpl::DriveBLEState(void)
|
||||
ExitNow();
|
||||
}
|
||||
}
|
||||
// mFlags.Clear(Flags::kAdvertisingRefreshNeeded);
|
||||
|
||||
// Transition to the not Advertising state...
|
||||
if (mFlags.Has(Flags::kAdvertising))
|
||||
mFlags.Clear(Flags::kAdvertising);
|
||||
mFlags.Set(Flags::kFastAdvertisingEnabled, true);
|
||||
|
||||
ChipLogProgress(DeviceLayer, "CHIPoBLE advertising stopped");
|
||||
|
||||
CancelBleAdvTimeoutTimer();
|
||||
|
||||
// Post a CHIPoBLEAdvertisingChange(Stopped) event.
|
||||
{
|
||||
mFlags.Clear(Flags::kAdvertising);
|
||||
mFlags.Set(Flags::kFastAdvertisingEnabled, true);
|
||||
|
||||
ChipLogProgress(DeviceLayer, "CHIPoBLE advertising stopped");
|
||||
|
||||
// Post a CHIPoBLEAdvertisingChange(Stopped) event.
|
||||
{
|
||||
ChipDeviceEvent advChange;
|
||||
advChange.Type = DeviceEventType::kCHIPoBLEAdvertisingChange;
|
||||
advChange.CHIPoBLEAdvertisingChange.Result = kActivity_Stopped;
|
||||
err = PlatformMgr().PostEvent(&advChange);
|
||||
}
|
||||
ChipDeviceEvent advChange;
|
||||
advChange.Type = DeviceEventType::kCHIPoBLEAdvertisingChange;
|
||||
advChange.CHIPoBLEAdvertisingChange.Result = kActivity_Stopped;
|
||||
err = PlatformMgr().PostEvent(&advChange);
|
||||
}
|
||||
|
||||
ExitNow();
|
||||
|
||||
Reference in New Issue
Block a user