Skip to content

Commit

Permalink
[Gen3] concurrent BLE central and scanner role
Browse files Browse the repository at this point in the history
  • Loading branch information
XuGuohui committed Jul 11, 2024
1 parent cb0757d commit cc7b3fa
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 22 deletions.
31 changes: 23 additions & 8 deletions hal/src/nRF52840/ble_hal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,7 @@ class BleObject::Observer {
int getScanParams(hal_ble_scan_params_t* params) const;
int startScanning(hal_ble_on_scan_result_cb_t callback, void* context);
int stopScanning();
int continueScanning(bool stop = false);
ble_gap_scan_params_t toPlatformScanParams() const;
int processAdvReportEventFromThread(const ble_evt_t* event);

Expand All @@ -378,7 +379,6 @@ class BleObject::Observer {
int addPendingResult(const hal_ble_scan_result_evt_t& resultEvt);
void removePendingResult(const hal_ble_addr_t& address);
void clearPendingResult();
int continueScanning();
int constructObserverEvent(hal_ble_scan_result_evt_t& result, const ble_gap_evt_adv_report_t& advReport) const;
void notifyScanResultEvent(const hal_ble_scan_result_evt_t& result);
static void processObserverEvents(const ble_evt_t* event, void* context);
Expand Down Expand Up @@ -1406,9 +1406,17 @@ int BleObject::Observer::getScanParams(hal_ble_scan_params_t* params) const {
return SYSTEM_ERROR_NONE;
}

int BleObject::Observer::continueScanning() {
int ret = sd_ble_gap_scan_start(nullptr, &bleScanData_);
return nrf_system_error(ret);
int BleObject::Observer::continueScanning(bool stop) {
if (!scanning()) {
return SYSTEM_ERROR_NONE;
}
if (stop) {
sd_ble_gap_scan_stop();
ble_gap_scan_params_t bleGapScanParams = toPlatformScanParams();
return nrf_system_error(sd_ble_gap_scan_start(&bleGapScanParams, &bleScanData_));
} else {
return nrf_system_error(sd_ble_gap_scan_start(nullptr, &bleScanData_));
}
}

void BleObject::Observer::onScanGuardTimerExpired(os_timer_t timer) {
Expand Down Expand Up @@ -1465,10 +1473,16 @@ int BleObject::Observer::stopScanning() {
if (sd_ble_gap_scan_stop() != NRF_SUCCESS) {
// LOG(ERROR, "Device is not in scanning state.");
}
isScanning_ = false;

// Just in case
os_semaphore_give(scanSemaphore_, false);
bool give = false;
ATOMIC_BLOCK() {
if (isScanning_) {
isScanning_ = false;
give = true;
}
}
if (give) {
os_semaphore_give(scanSemaphore_, false);
}
return SYSTEM_ERROR_NONE;
}

Expand Down Expand Up @@ -2565,6 +2579,7 @@ void BleObject::ConnectionsManager::processConnectionEvents(const ble_evt_t* eve
ConnectionsManager* connMgr = static_cast<ConnectionsManagerImpl*>(context)->instance;
switch (event->header.evt_id) {
case BLE_GAP_EVT_CONNECTED: {
BleObject::getInstance().observer()->continueScanning(true);
LOG_DEBUG(TRACE, "BLE GAP event: connected.");
const ble_gap_evt_connected_t& connected = event->evt.gap_evt.params.connected;
ble_evt_t* connectedEvent = (ble_evt_t*)BleObject::getInstance().dispatcher()->allocEventData(sizeof(ble_evt_t));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -586,8 +586,8 @@ test(BLE_33_Central_Can_Connect_While_Scanning) {
BleScanParams params = {};
params.size = sizeof(BleScanParams);
params.timeout = 0;
params.interval = 8000; // *0.625ms = 5s
params.window = 8000; // *0.625 = 5s
params.interval = 800; // *0.625ms = 500ms
params.window = 800; // *0.625 = 500ms
params.active = true; // Send scan request
params.filter_policy = BLE_SCAN_FP_ACCEPT_ALL;
assertEqual(0, BLE.setScanParameters(&params));
Expand All @@ -614,9 +614,7 @@ test(BLE_33_Central_Can_Connect_While_Scanning) {
});
scanResults = 0;
delay(2000);
#if !HAL_PLATFORM_NRF52840
assertMoreOrEqual((unsigned)scanResults, 1);
#endif
assertTrue(peer.connected());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -505,8 +505,8 @@ test(BLE_35_Central_Can_Connect_While_Peripheral_Is_Scanning_Prepare) {
BleScanParams params = {};
params.size = sizeof(BleScanParams);
params.timeout = 0;
params.interval = 8000; // *0.625ms = 5s
params.window = 8000; // *0.625 = 5s
params.interval = 800; // *0.625ms = 500ms
params.window = 800; // *0.625 = 500ms
params.active = true; // Send scan request
params.filter_policy = BLE_SCAN_FP_ACCEPT_ALL;
assertEqual(0, BLE.setScanParameters(&params));
Expand All @@ -517,6 +517,7 @@ test(BLE_35_Central_Can_Connect_While_Peripheral_Is_Scanning_Prepare) {
}, nullptr);
}, nullptr);
assertTrue((bool)scanThread);
assertTrue(waitFor(BLE.scanning, 500));
}

test(BLE_36_Central_Can_Connect_While_Peripheral_Is_Scanning) {
Expand All @@ -532,18 +533,14 @@ test(BLE_36_Central_Can_Connect_While_Peripheral_Is_Scanning) {
assertTrue(waitFor(BLE.connected, 60000));
scanResults = 0;
delay(2000);
#if !HAL_PLATFORM_NRF52840
assertMoreOrEqual((unsigned)scanResults, 1);
#endif
SCOPE_GUARD ({
assertTrue(waitFor([]{ return !BLE.connected(); }, 10000));
assertFalse(BLE.connected());

scanResults = 0;
delay(2000);
#if !HAL_PLATFORM_NRF52840
assertMoreOrEqual((unsigned)scanResults, 1);
#endif

assertEqual(0, BLE.stopScanning());
assertFalse(BLE.scanning());
Expand All @@ -557,8 +554,8 @@ test(BLE_37_Central_Can_Connect_While_Peripheral_Is_Scanning_And_Stops_Scanning_
BleScanParams params = {};
params.size = sizeof(BleScanParams);
params.timeout = 0;
params.interval = 8000; // *0.625ms = 5s
params.window = 8000; // *0.625 = 5s
params.interval = 800; // *0.625ms = 500ms
params.window = 800; // *0.625 = 500ms
params.active = true; // Send scan request
params.filter_policy = BLE_SCAN_FP_ACCEPT_ALL;
assertEqual(0, BLE.setScanParameters(&params));
Expand All @@ -584,9 +581,7 @@ test(BLE_38_Central_Can_Connect_While_Peripheral_Is_Scanning_And_Stops_Scanning)
assertTrue(waitFor(BLE.connected, 60000));
scanResults = 0;
delay(2000);
#if !HAL_PLATFORM_NRF52840
assertMoreOrEqual((unsigned)scanResults, 1);
#endif

assertEqual(0, BLE.stopScanning());
assertFalse(BLE.scanning());
Expand Down

0 comments on commit cc7b3fa

Please sign in to comment.