extmod/modbluetooth: Allow config of scan interval/window.

This adds two additional optional kwargs to `gap_scan()`:
  - `interval_us`: How long between scans.
  - `window_us`: How long to scan for during a scan.

The default with NimBLE is a 11.25ms window with a 1.28s interval.

Changing these parameters is important for detecting low-frequency
advertisements (e.g. beacons).

Note: these params are in microseconds, not milliseconds in order
to allow the 625us granularity offered by the spec.
This commit is contained in:
Jim Mussared
2019-10-08 14:25:32 +11:00
parent 06ae818f93
commit b65cc387cd
3 changed files with 23 additions and 20 deletions

View File

@@ -501,23 +501,26 @@ STATIC mp_obj_t bluetooth_ble_gap_connect(size_t n_args, const mp_obj_t *args) {
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(bluetooth_ble_gap_connect_obj, 3, 4, bluetooth_ble_gap_connect);
STATIC mp_obj_t bluetooth_ble_gap_scan(size_t n_args, const mp_obj_t *args) {
if (n_args == 2 && args[1] == mp_const_none) {
int err = mp_bluetooth_gap_scan_stop();
return bluetooth_handle_errno(err);
} else {
mp_int_t duration_ms = 0;
if (n_args == 2) {
if (!mp_obj_is_int(args[1])) {
mp_raise_ValueError("invalid duration");
}
duration_ms = mp_obj_get_int(args[1]);
// Default is indefinite scan, with the NimBLE "background scan" interval and window.
mp_int_t duration_ms = 0;
mp_int_t interval_us = 1280000;
mp_int_t window_us = 11250;
if (n_args > 1) {
if (args[1] == mp_const_none) {
// scan(None) --> stop scan.
return bluetooth_handle_errno(mp_bluetooth_gap_scan_stop());
}
duration_ms = mp_obj_get_int(args[1]);
if (n_args > 2) {
interval_us = mp_obj_get_int(args[2]);
if (n_args > 3) {
window_us = mp_obj_get_int(args[3]);
}
}
int err = mp_bluetooth_gap_scan_start(duration_ms);
return bluetooth_handle_errno(err);
}
return bluetooth_handle_errno(mp_bluetooth_gap_scan_start(duration_ms, interval_us, window_us));
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(bluetooth_ble_gap_scan_obj, 1, 2, bluetooth_ble_gap_scan);
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(bluetooth_ble_gap_scan_obj, 1, 4, bluetooth_ble_gap_scan);
#endif // MICROPY_PY_BLUETOOTH_ENABLE_CENTRAL_MODE
STATIC mp_obj_t bluetooth_ble_gap_disconnect(mp_obj_t self_in, mp_obj_t conn_handle_in) {