Skip to content

Commit

Permalink
Use safe System::Clock types in src/platform (#10862)
Browse files Browse the repository at this point in the history
#### Problem

Code uses plain integers to represent time values and relies on
users to get the unit scale correct.

Part of #10062 _Some operations on System::Clock types are not safe_

#### Change overview

Change code under `src/platform`, and immediate callers, to use the
safer `System::Clock` types.

#### Testing

CI; no change to functionality intended.
  • Loading branch information
kpschoedel authored and pull[bot] committed Oct 27, 2021
1 parent c495799 commit 1636901
Show file tree
Hide file tree
Showing 23 changed files with 210 additions and 206 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ bool emberAfGeneralCommissioningClusterArmFailSafeCallback(app::CommandHandler *
const app::ConcreteCommandPath & commandPath,
const Commands::ArmFailSafe::DecodableType & commandData)
{
auto & expiryLengthSeconds = commandData.expiryLengthSeconds;
auto expiryLengthSeconds = System::Clock::Seconds16(commandData.expiryLengthSeconds);

CHIP_ERROR err = DeviceLayer::Internal::DeviceControlServer::DeviceControlSvr().ArmFailSafe(expiryLengthSeconds);
emberAfSendImmediateDefaultResponse(err == CHIP_NO_ERROR ? EMBER_ZCL_STATUS_SUCCESS : EMBER_ZCL_STATUS_FAILURE);
Expand Down
4 changes: 2 additions & 2 deletions src/controller/python/chip/ble/LinuxImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ class ScannerDelegateImpl : public ChipDeviceScannerDelegate

} // namespace

extern "C" void * pychip_ble_start_scanning(PyObject * context, void * adapter, uint32_t timeout,
extern "C" void * pychip_ble_start_scanning(PyObject * context, void * adapter, uint32_t timeoutMs,
ScannerDelegateImpl::DeviceScannedCallback scanCallback,
ScannerDelegateImpl::ScanCompleteCallback completeCallback)
{
Expand All @@ -117,7 +117,7 @@ extern "C" void * pychip_ble_start_scanning(PyObject * context, void * adapter,
return nullptr;
}

if (scanner->StartScan(timeout) != CHIP_NO_ERROR)
if (scanner->StartScan(chip::System::Clock::Milliseconds32(timeoutMs)) != CHIP_NO_ERROR)
{
return nullptr;
}
Expand Down
2 changes: 1 addition & 1 deletion src/include/platform/internal/DeviceControlServer.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class DeviceControlServer final
public:
// ===== Members for internal use by other Device Layer components.

CHIP_ERROR ArmFailSafe(uint16_t expiryLengthSeconds);
CHIP_ERROR ArmFailSafe(System::Clock::Timeout expiryLength);
CHIP_ERROR DisarmFailSafe();
CHIP_ERROR CommissioningComplete();
CHIP_ERROR SetRegulatoryConfig(uint8_t location, const CharSpan & countryCode, uint64_t breadcrumb);
Expand Down
4 changes: 2 additions & 2 deletions src/platform/DeviceControlServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ void DeviceControlServer::CommissioningFailedTimerComplete()
}
}

CHIP_ERROR DeviceControlServer::ArmFailSafe(uint16_t expiryLengthSeconds)
CHIP_ERROR DeviceControlServer::ArmFailSafe(System::Clock::Timeout expiryLength)
{
DeviceLayer::SystemLayer().StartTimer(System::Clock::Seconds16(expiryLengthSeconds), HandleArmFailSafe, this);
DeviceLayer::SystemLayer().StartTimer(expiryLength, HandleArmFailSafe, this);
return CHIP_NO_ERROR;
}

Expand Down
8 changes: 5 additions & 3 deletions src/platform/ESP32/BLEManagerImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -198,9 +198,11 @@ class BLEManagerImpl final : public BLEManager,
CHIP_ERROR ConfigureAdvertisingData(void);
CHIP_ERROR StartAdvertising(void);

static constexpr uint32_t kAdvertiseTimeout = CHIP_DEVICE_CONFIG_BLE_ADVERTISING_TIMEOUT;
static constexpr uint32_t kFastAdvertiseTimeout = CHIP_DEVICE_CONFIG_BLE_ADVERTISING_INTERVAL_CHANGE_TIME;
uint64_t mAdvertiseStartTime;
static constexpr System::Clock::Timeout kAdvertiseTimeout =
System::Clock::Milliseconds32(CHIP_DEVICE_CONFIG_BLE_ADVERTISING_TIMEOUT);
static constexpr System::Clock::Timeout kFastAdvertiseTimeout =
System::Clock::Milliseconds32(CHIP_DEVICE_CONFIG_BLE_ADVERTISING_INTERVAL_CHANGE_TIME);
System::Clock::Timestamp mAdvertiseStartTime;

static void HandleFastAdvertisementTimer(System::Layer * systemLayer, void * context);
void HandleFastAdvertisementTimer();
Expand Down
24 changes: 12 additions & 12 deletions src/platform/ESP32/ConnectivityManagerImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,8 @@ class ConnectivityManagerImpl final : public ConnectivityManager,
bool _IsWiFiStationEnabled(void);
bool _IsWiFiStationApplicationControlled(void);
bool _IsWiFiStationConnected(void);
uint32_t _GetWiFiStationReconnectIntervalMS(void);
CHIP_ERROR _SetWiFiStationReconnectIntervalMS(uint32_t val);
System::Clock::Timeout _GetWiFiStationReconnectInterval(void);
CHIP_ERROR _SetWiFiStationReconnectInterval(System::Clock::Timeout val);
bool _IsWiFiStationProvisioned(void);
void _ClearWiFiStationProvision(void);
WiFiAPMode _GetWiFiAPMode(void);
Expand All @@ -105,8 +105,8 @@ class ConnectivityManagerImpl final : public ConnectivityManager,
void _DemandStartWiFiAP(void);
void _StopOnDemandWiFiAP(void);
void _MaintainOnDemandWiFiAP(void);
uint32_t _GetWiFiAPIdleTimeoutMS(void);
void _SetWiFiAPIdleTimeoutMS(uint32_t val);
System::Clock::Timeout _GetWiFiAPIdleTimeout(void);
void _SetWiFiAPIdleTimeout(System::Clock::Timeout val);
CHIP_ERROR _GetAndLogWifiStatsCounters(void);
bool _CanStartWiFiScan();
void _OnWiFiScanDone();
Expand All @@ -130,14 +130,14 @@ class ConnectivityManagerImpl final : public ConnectivityManager,

// ===== Private members reserved for use by this class only.

uint64_t mLastStationConnectFailTime;
uint64_t mLastAPDemandTime;
System::Clock::Timestamp mLastStationConnectFailTime;
System::Clock::Timestamp mLastAPDemandTime;
WiFiStationMode mWiFiStationMode;
WiFiStationState mWiFiStationState;
WiFiAPMode mWiFiAPMode;
WiFiAPState mWiFiAPState;
uint32_t mWiFiStationReconnectIntervalMS;
uint32_t mWiFiAPIdleTimeoutMS;
System::Clock::Timeout mWiFiStationReconnectInterval;
System::Clock::Timeout mWiFiAPIdleTimeout;
BitFlags<Flags> mFlags;

CHIP_ERROR InitWiFi(void);
Expand Down Expand Up @@ -180,9 +180,9 @@ inline bool ConnectivityManagerImpl::_IsWiFiAPApplicationControlled(void)
return mWiFiAPMode == kWiFiAPMode_ApplicationControlled;
}

inline uint32_t ConnectivityManagerImpl::_GetWiFiStationReconnectIntervalMS(void)
inline System::Clock::Timeout ConnectivityManagerImpl::_GetWiFiStationReconnectInterval(void)
{
return mWiFiStationReconnectIntervalMS;
return mWiFiStationReconnectInterval;
}

inline ConnectivityManager::WiFiAPMode ConnectivityManagerImpl::_GetWiFiAPMode(void)
Expand All @@ -195,9 +195,9 @@ inline bool ConnectivityManagerImpl::_IsWiFiAPActive(void)
return mWiFiAPState == kWiFiAPState_Active;
}

inline uint32_t ConnectivityManagerImpl::_GetWiFiAPIdleTimeoutMS(void)
inline System::Clock::Timeout ConnectivityManagerImpl::_GetWiFiAPIdleTimeout(void)
{
return mWiFiAPIdleTimeoutMS;
return mWiFiAPIdleTimeout;
}

inline bool ConnectivityManagerImpl::_CanStartWiFiScan()
Expand Down
56 changes: 28 additions & 28 deletions src/platform/ESP32/ConnectivityManagerImpl_WiFi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ void ConnectivityManagerImpl::_DemandStartWiFiAP(void)
{
if (mWiFiAPMode == kWiFiAPMode_OnDemand || mWiFiAPMode == kWiFiAPMode_OnDemand_NoStationProvision)
{
mLastAPDemandTime = System::SystemClock().GetMonotonicMilliseconds();
mLastAPDemandTime = System::SystemClock().GetMonotonicTimestamp();
DeviceLayer::SystemLayer().ScheduleWork(DriveAPState, NULL);
}
}
Expand All @@ -142,7 +142,7 @@ void ConnectivityManagerImpl::_StopOnDemandWiFiAP(void)
{
if (mWiFiAPMode == kWiFiAPMode_OnDemand || mWiFiAPMode == kWiFiAPMode_OnDemand_NoStationProvision)
{
mLastAPDemandTime = 0;
mLastAPDemandTime = System::Clock::Zero;
DeviceLayer::SystemLayer().ScheduleWork(DriveAPState, NULL);
}
}
Expand All @@ -153,14 +153,14 @@ void ConnectivityManagerImpl::_MaintainOnDemandWiFiAP(void)
{
if (mWiFiAPState == kWiFiAPState_Activating || mWiFiAPState == kWiFiAPState_Active)
{
mLastAPDemandTime = System::SystemClock().GetMonotonicMilliseconds();
mLastAPDemandTime = System::SystemClock().GetMonotonicTimestamp();
}
}
}

void ConnectivityManagerImpl::_SetWiFiAPIdleTimeoutMS(uint32_t val)
void ConnectivityManagerImpl::_SetWiFiAPIdleTimeout(System::Clock::Timeout val)
{
mWiFiAPIdleTimeoutMS = val;
mWiFiAPIdleTimeout = val;
DeviceLayer::SystemLayer().ScheduleWork(DriveAPState, NULL);
}

Expand Down Expand Up @@ -375,14 +375,14 @@ CHIP_ERROR ConnectivityManagerImpl::_GetAndLogWifiStatsCounters(void)

CHIP_ERROR ConnectivityManagerImpl::InitWiFi()
{
mLastStationConnectFailTime = 0;
mLastAPDemandTime = 0;
mWiFiStationMode = kWiFiStationMode_Disabled;
mWiFiStationState = kWiFiStationState_NotConnected;
mWiFiAPMode = kWiFiAPMode_Disabled;
mWiFiAPState = kWiFiAPState_NotActive;
mWiFiStationReconnectIntervalMS = CHIP_DEVICE_CONFIG_WIFI_STATION_RECONNECT_INTERVAL;
mWiFiAPIdleTimeoutMS = CHIP_DEVICE_CONFIG_WIFI_AP_IDLE_TIMEOUT;
mLastStationConnectFailTime = System::Clock::Zero;
mLastAPDemandTime = System::Clock::Zero;
mWiFiStationMode = kWiFiStationMode_Disabled;
mWiFiStationState = kWiFiStationState_NotConnected;
mWiFiAPMode = kWiFiAPMode_Disabled;
mWiFiAPState = kWiFiAPState_NotActive;
mWiFiStationReconnectInterval = System::Clock::Milliseconds32(CHIP_DEVICE_CONFIG_WIFI_STATION_RECONNECT_INTERVAL);
mWiFiAPIdleTimeout = System::Clock::Milliseconds32(CHIP_DEVICE_CONFIG_WIFI_AP_IDLE_TIMEOUT);
mFlags.SetRaw(0);

// TODO Initialize the Chip Addressing and Routing Module.
Expand Down Expand Up @@ -551,7 +551,7 @@ void ConnectivityManagerImpl::DriveStationState()
{
ChangeWiFiStationState(kWiFiStationState_Connected);
ChipLogProgress(DeviceLayer, "WiFi station interface connected");
mLastStationConnectFailTime = 0;
mLastStationConnectFailTime = System::Clock::Zero;
OnStationConnected();
}

Expand All @@ -576,7 +576,7 @@ void ConnectivityManagerImpl::DriveStationState()
// Otherwise the station interface is NOT connected to an AP, so...
else
{
uint64_t now = System::SystemClock().GetMonotonicMilliseconds();
System::Clock::Timestamp now = System::SystemClock().GetMonotonicTimestamp();

// Advance the station state to NotConnected if it was previously Connected or Disconnecting,
// or if a previous initiated connect attempt failed.
Expand All @@ -588,7 +588,7 @@ void ConnectivityManagerImpl::DriveStationState()
if (prevState != kWiFiStationState_Connecting_Failed)
{
ChipLogProgress(DeviceLayer, "WiFi station interface disconnected");
mLastStationConnectFailTime = 0;
mLastStationConnectFailTime = System::Clock::Zero;
OnStationDisconnected();
}
else
Expand All @@ -604,7 +604,8 @@ void ConnectivityManagerImpl::DriveStationState()
{
// Initiate a connection to the AP if we haven't done so before, or if enough
// time has passed since the last attempt.
if (mLastStationConnectFailTime == 0 || now >= mLastStationConnectFailTime + mWiFiStationReconnectIntervalMS)
if (mLastStationConnectFailTime == System::Clock::Zero ||
now >= mLastStationConnectFailTime + mWiFiStationReconnectInterval)
{
ChipLogProgress(DeviceLayer, "Attempting to connect WiFi station interface");
esp_err_t err = esp_wifi_connect();
Expand All @@ -620,12 +621,12 @@ void ConnectivityManagerImpl::DriveStationState()
// Otherwise arrange another connection attempt at a suitable point in the future.
else
{
uint32_t timeToNextConnect = (uint32_t)((mLastStationConnectFailTime + mWiFiStationReconnectIntervalMS) - now);
System::Clock::Timeout timeToNextConnect = (mLastStationConnectFailTime + mWiFiStationReconnectInterval) - now;

ChipLogProgress(DeviceLayer, "Next WiFi station reconnect in %" PRIu32 " ms", timeToNextConnect);
ChipLogProgress(DeviceLayer, "Next WiFi station reconnect in %" PRIu32 " ms",
System::Clock::Milliseconds32(timeToNextConnect).count());

ReturnOnFailure(DeviceLayer::SystemLayer().StartTimer(chip::System::Clock::Milliseconds32(timeToNextConnect),
DriveStationState, NULL));
ReturnOnFailure(DeviceLayer::SystemLayer().StartTimer(timeToNextConnect, DriveStationState, NULL));
}
}
}
Expand Down Expand Up @@ -687,8 +688,6 @@ void ConnectivityManagerImpl::DriveAPState()
{
CHIP_ERROR err = CHIP_NO_ERROR;
WiFiAPState targetState;
uint64_t now;
uint32_t apTimeout;
bool espAPModeEnabled;

// Determine if AP mode is currently enabled in the ESP WiFi layer.
Expand Down Expand Up @@ -739,18 +738,19 @@ void ConnectivityManagerImpl::DriveAPState()
// has been demand for the AP within the idle timeout period.
else if (mWiFiAPMode == kWiFiAPMode_OnDemand || mWiFiAPMode == kWiFiAPMode_OnDemand_NoStationProvision)
{
now = System::SystemClock().GetMonotonicMilliseconds();
System::Clock::Timestamp now = System::SystemClock().GetMonotonicTimestamp();

if (mLastAPDemandTime != 0 && now < (mLastAPDemandTime + mWiFiAPIdleTimeoutMS))
if (mLastAPDemandTime != System::Clock::Zero && now < (mLastAPDemandTime + mWiFiAPIdleTimeout))
{
targetState = kWiFiAPState_Active;

// Compute the amount of idle time before the AP should be deactivated and
// arm a timer to fire at that time.
apTimeout = (uint32_t)((mLastAPDemandTime + mWiFiAPIdleTimeoutMS) - now);
err = DeviceLayer::SystemLayer().StartTimer(System::Clock::Milliseconds32(apTimeout), DriveAPState, NULL);
System::Clock::Timeout apTimeout = (mLastAPDemandTime + mWiFiAPIdleTimeout) - now;
err = DeviceLayer::SystemLayer().StartTimer(apTimeout, DriveAPState, NULL);
SuccessOrExit(err);
ChipLogProgress(DeviceLayer, "Next WiFi AP timeout in %" PRIu32 " ms", apTimeout);
ChipLogProgress(DeviceLayer, "Next WiFi AP timeout in %" PRIu32 " ms",
System::Clock::Milliseconds32(apTimeout).count());
}
else
{
Expand Down
14 changes: 7 additions & 7 deletions src/platform/ESP32/bluedroid/BLEManagerImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ const uint16_t CHIPoBLEGATTAttrCount = sizeof(CHIPoBLEGATTAttrs) / sizeof(CHIPoB
} // unnamed namespace

BLEManagerImpl BLEManagerImpl::sInstance;
constexpr System::Clock::Timeout BLEManagerImpl::kAdvertiseTimeout;
constexpr System::Clock::Timeout BLEManagerImpl::kFastAdvertiseTimeout;

CHIP_ERROR BLEManagerImpl::_Init()
{
Expand Down Expand Up @@ -175,11 +177,9 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val)

if (val)
{
mAdvertiseStartTime = System::SystemClock().GetMonotonicMilliseconds();
ReturnErrorOnFailure(DeviceLayer::SystemLayer().StartTimer(System::Clock::Milliseconds32(kAdvertiseTimeout),
HandleAdvertisementTimer, this));
ReturnErrorOnFailure(DeviceLayer::SystemLayer().StartTimer(System::Clock::Milliseconds32(kFastAdvertiseTimeout),
HandleFastAdvertisementTimer, this));
mAdvertiseStartTime = System::SystemClock().GetMonotonicTimestamp();
ReturnErrorOnFailure(DeviceLayer::SystemLayer().StartTimer(kAdvertiseTimeout, HandleAdvertisementTimer, this));
ReturnErrorOnFailure(DeviceLayer::SystemLayer().StartTimer(kFastAdvertiseTimeout, HandleFastAdvertisementTimer, this));
}
mFlags.Set(Flags::kFastAdvertisingEnabled, val);
mFlags.Set(Flags::kAdvertisingRefreshNeeded, 1);
Expand All @@ -196,7 +196,7 @@ void BLEManagerImpl::HandleAdvertisementTimer(System::Layer * systemLayer, void

void BLEManagerImpl::HandleAdvertisementTimer()
{
uint64_t currentTimestamp = System::SystemClock().GetMonotonicMilliseconds();
System::Clock::Timestamp currentTimestamp = System::SystemClock().GetMonotonicTimestamp();

if (currentTimestamp - mAdvertiseStartTime >= kAdvertiseTimeout)
{
Expand All @@ -212,7 +212,7 @@ void BLEManagerImpl::HandleFastAdvertisementTimer(System::Layer * systemLayer, v

void BLEManagerImpl::HandleFastAdvertisementTimer()
{
uint64_t currentTimestamp = System::SystemClock().GetMonotonicMilliseconds();
System::Clock::Timestamp currentTimestamp = System::SystemClock().GetMonotonicTimestamp();

if (currentTimestamp - mAdvertiseStartTime >= kFastAdvertiseTimeout)
{
Expand Down
14 changes: 7 additions & 7 deletions src/platform/ESP32/nimble/BLEManagerImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ SemaphoreHandle_t semaphoreHandle = NULL;
} // unnamed namespace

BLEManagerImpl BLEManagerImpl::sInstance;
constexpr System::Clock::Timeout BLEManagerImpl::kAdvertiseTimeout;
constexpr System::Clock::Timeout BLEManagerImpl::kFastAdvertiseTimeout;

const struct ble_gatt_svc_def BLEManagerImpl::CHIPoBLEGATTAttrs[] = {
{ .type = BLE_GATT_SVC_TYPE_PRIMARY,
Expand Down Expand Up @@ -171,11 +173,9 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val)

if (val)
{
mAdvertiseStartTime = System::SystemClock().GetMonotonicMilliseconds();
ReturnErrorOnFailure(DeviceLayer::SystemLayer().StartTimer(System::Clock::Milliseconds32(kAdvertiseTimeout),
HandleAdvertisementTimer, this));
ReturnErrorOnFailure(DeviceLayer::SystemLayer().StartTimer(System::Clock::Milliseconds32(kFastAdvertiseTimeout),
HandleFastAdvertisementTimer, this));
mAdvertiseStartTime = System::SystemClock().GetMonotonicTimestamp();
ReturnErrorOnFailure(DeviceLayer::SystemLayer().StartTimer(kAdvertiseTimeout, HandleAdvertisementTimer, this));
ReturnErrorOnFailure(DeviceLayer::SystemLayer().StartTimer(kFastAdvertiseTimeout, HandleFastAdvertisementTimer, this));
}

mFlags.Set(Flags::kFastAdvertisingEnabled, val);
Expand All @@ -194,7 +194,7 @@ void BLEManagerImpl::HandleAdvertisementTimer(System::Layer * systemLayer, void

void BLEManagerImpl::HandleAdvertisementTimer()
{
uint64_t currentTimestamp = System::SystemClock().GetMonotonicMilliseconds();
System::Clock::Timestamp currentTimestamp = System::SystemClock().GetMonotonicTimestamp();

if (currentTimestamp - mAdvertiseStartTime >= kAdvertiseTimeout)
{
Expand All @@ -210,7 +210,7 @@ void BLEManagerImpl::HandleFastAdvertisementTimer(System::Layer * systemLayer, v

void BLEManagerImpl::HandleFastAdvertisementTimer()
{
uint64_t currentTimestamp = System::SystemClock().GetMonotonicMilliseconds();
System::Clock::Timestamp currentTimestamp = System::SystemClock().GetMonotonicTimestamp();

if (currentTimestamp - mAdvertiseStartTime >= kFastAdvertiseTimeout)
{
Expand Down
8 changes: 4 additions & 4 deletions src/platform/Linux/BLEManagerImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ namespace Internal {

namespace {

static constexpr unsigned kNewConnectionScanTimeoutMs = 10000;
static constexpr unsigned kConnectTimeoutMs = 10000;
static constexpr System::Clock::Timeout kNewConnectionScanTimeout = System::Clock::Seconds16(10);
static constexpr System::Clock::Timeout kConnectTimeout = System::Clock::Seconds16(10);

const ChipBleUUID ChipUUID_CHIPoBLEChar_RX = { { 0x18, 0xEE, 0x2E, 0xF5, 0x26, 0x3D, 0x45, 0x59, 0x95, 0x9F, 0x4F, 0x9C, 0x42, 0x9F,
0x9D, 0x11 } };
Expand Down Expand Up @@ -702,7 +702,7 @@ void BLEManagerImpl::InitiateScan(BleScanState scanType)
return;
}

CHIP_ERROR err = mDeviceScanner->StartScan(kNewConnectionScanTimeoutMs);
CHIP_ERROR err = mDeviceScanner->StartScan(kNewConnectionScanTimeout);
if (err != CHIP_NO_ERROR)
{
mBLEScanConfig.mBleScanState = BleScanState::kNotScanning;
Expand Down Expand Up @@ -803,7 +803,7 @@ void BLEManagerImpl::OnDeviceScanned(BluezDevice1 * device, const chip::Ble::Chi
}

mBLEScanConfig.mBleScanState = BleScanState::kConnecting;
DeviceLayer::SystemLayer().StartTimer(System::Clock::Milliseconds32(kConnectTimeoutMs), HandleConnectTimeout, mpEndpoint);
DeviceLayer::SystemLayer().StartTimer(kConnectTimeout, HandleConnectTimeout, mpEndpoint);
mDeviceScanner->StopScan();

ConnectDevice(device, mpEndpoint);
Expand Down
Loading

0 comments on commit 1636901

Please sign in to comment.