Skip to content

Commit 1639354

Browse files
committed
Scanner working, but not very first time
1 parent b71f6c9 commit 1639354

5 files changed

Lines changed: 61 additions & 110 deletions

File tree

ports/nrf/bluetooth/ble_drv.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,6 @@
3030

3131
#include "ble.h"
3232

33-
#if (BLUETOOTH_SD == 132) && (BLE_API_VERSION == 2)
34-
#define NRF52
35-
#endif
36-
3733
#define MAX_TX_IN_PROGRESS 10
3834

3935
#ifndef BLE_GATT_ATT_MTU_DEFAULT
@@ -43,6 +39,7 @@
4339
#define BLE_CONN_CFG_TAG_CUSTOM 1
4440

4541
#define MSEC_TO_UNITS(TIME, RESOLUTION) (((TIME) * 1000) / (RESOLUTION))
42+
#define SEC_TO_UNITS(TIME, RESOLUTION) (((TIME) * 1000000) / (RESOLUTION))
4643
// 0.625 msecs (625 usecs)
4744
#define ADV_INTERVAL_UNIT_FLOAT_SECS (0.000625)
4845
#define UNIT_0_625_MS (625)

ports/nrf/common-hal/bleio/Scanner.c

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,12 @@
3636
#include "shared-bindings/bleio/Scanner.h"
3737
#include "shared-module/bleio/ScanEntry.h"
3838

39-
#if (BLUETOOTH_SD == 140)
4039
static uint8_t m_scan_buffer_data[BLE_GAP_SCAN_BUFFER_MIN];
4140

4241
static ble_data_t m_scan_buffer = {
4342
m_scan_buffer_data,
4443
BLE_GAP_SCAN_BUFFER_MIN
4544
};
46-
#endif
4745

4846
STATIC void on_ble_evt(ble_evt_t *ble_evt, void *scanner_in) {
4947
bleio_scanner_obj_t *scanner = (bleio_scanner_obj_t*)scanner_in;
@@ -61,48 +59,34 @@ STATIC void on_ble_evt(ble_evt_t *ble_evt, void *scanner_in) {
6159
entry->address.type = report->peer_addr.addr_type;
6260
memcpy(entry->address.value, report->peer_addr.addr, BLEIO_ADDRESS_BYTES);
6361

64-
#if (BLUETOOTH_SD == 140)
6562
entry->data = mp_obj_new_bytearray(report->data.len, report->data.p_data);
66-
#else
67-
entry->data = mp_obj_new_bytearray(report->dlen, report->data);
68-
#endif
6963

7064
mp_obj_list_append(scanner->adv_reports, entry);
7165

72-
#if (BLUETOOTH_SD == 140)
7366
const uint32_t err_code = sd_ble_gap_scan_start(NULL, &m_scan_buffer);
7467
if (err_code != NRF_SUCCESS) {
7568
mp_raise_OSError_msg_varg(translate("Failed to continue scanning, err 0x%04x"), err_code);
7669
}
77-
#endif
7870
}
7971

80-
void common_hal_bleio_scanner_scan(bleio_scanner_obj_t *self, mp_int_t timeout) {
72+
void common_hal_bleio_scanner_scan(bleio_scanner_obj_t *self, mp_float_t timeout, mp_float_t interval, mp_float_t window) {
8173
ble_drv_add_event_handler(on_ble_evt, self);
8274

8375
ble_gap_scan_params_t scan_params = {
84-
.interval = MSEC_TO_UNITS(self->interval, UNIT_0_625_MS),
85-
.window = MSEC_TO_UNITS(self->window, UNIT_0_625_MS),
86-
#if (BLUETOOTH_SD == 140)
76+
.interval = SEC_TO_UNITS(interval, UNIT_0_625_MS),
77+
.window = SEC_TO_UNITS(window, UNIT_0_625_MS),
8778
.scan_phys = BLE_GAP_PHY_1MBPS,
88-
#endif
8979
};
9080

9181
common_hal_bleio_adapter_set_enabled(true);
9282

9383
uint32_t err_code;
94-
#if (BLUETOOTH_SD == 140)
9584
err_code = sd_ble_gap_scan_start(&scan_params, &m_scan_buffer);
96-
#else
97-
err_code = sd_ble_gap_scan_start(&scan_params);
98-
#endif
9985

10086
if (err_code != NRF_SUCCESS) {
10187
mp_raise_OSError_msg_varg(translate("Failed to start scanning, err 0x%04x"), err_code);
10288
}
10389

104-
if (timeout > 0) {
105-
mp_hal_delay_ms(timeout);
106-
sd_ble_gap_scan_stop();
107-
}
90+
mp_hal_delay_ms(timeout * 1000);
91+
sd_ble_gap_scan_stop();
10892
}

shared-bindings/bleio/Scanner.c

Lines changed: 50 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,12 @@
3030
#include "shared-bindings/bleio/ScanEntry.h"
3131
#include "shared-bindings/bleio/Scanner.h"
3232

33-
#define DEFAULT_INTERVAL 100
34-
#define DEFAULT_WINDOW 100
33+
#define INTERVAL_DEFAULT (0.1f)
34+
#define INTERVAL_MIN (0.0025f)
35+
#define INTERVAL_MIN_STRING "0.0025"
36+
#define INTERVAL_MAX (40.959375f)
37+
#define INTERVAL_MAX_STRING "40.959375"
38+
#define WINDOW_DEFAULT (0.1f)
3539

3640
//| .. currentmodule:: bleio
3741
//|
@@ -45,117 +49,83 @@
4549
//| import bleio
4650
//| scanner = bleio.Scanner()
4751
//| entries = scanner.scan(2.5) # Scan for 2.5 seconds
48-
//| print(entries)
4952
//|
5053

5154
//| .. class:: Scanner()
5255
//|
5356
//| Create a new Scanner object.
5457
//|
58+
STATIC mp_obj_t bleio_scanner_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *all_args, mp_map_t *kw_args) {
59+
mp_arg_check_num(n_args, kw_args, 0, 0, false);
5560

56-
//| .. attribute:: interval
57-
//|
58-
//| The interval (in seconds) between the start of two consecutive scan windows.
59-
//| Allowed values are between 0.010 and 10.24 sec.
60-
//|
61+
bleio_scanner_obj_t *self = m_new_obj(bleio_scanner_obj_t);
62+
self->base.type = type;
6163

62-
//| .. attribute:: window
63-
//|
64-
//| The duration (in seconds) in which a single BLE channel is scanned.
65-
//| Allowed values are between 0.010 and 10.24 sec.
66-
//|
64+
return MP_OBJ_FROM_PTR(self);
65+
}
6766

68-
//| .. method:: scan(timeout)
67+
//| .. method:: scan(timeout, \*, interval=0.1, window=0.1)
6968
//|
7069
//| Performs a BLE scan.
7170
//|
7271
//| :param float timeout: the scan timeout in seconds
72+
//| :param float interval: the interval (in seconds) between the start of two consecutive scan windows
73+
//| Must be in the range 0.0025 - 40.959375 seconds.
74+
//| :param float window: the duration (in seconds) to scan a single BLE channel
75+
//| `window` must be <= `interval`.
7376
//| :returns: advertising packets found
7477
//| :rtype: list of :py:class:`bleio.ScanEntry`
7578
//|
76-
STATIC mp_obj_t bleio_scanner_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *all_args, mp_map_t *kw_args) {
77-
mp_arg_check_num(n_args, kw_args, 0, 0, false);
78-
79-
80-
bleio_scanner_obj_t *self = m_new_obj(bleio_scanner_obj_t);
81-
self->base.type = type;
82-
83-
self->interval = DEFAULT_INTERVAL;
84-
self->window = DEFAULT_WINDOW;
85-
86-
return MP_OBJ_FROM_PTR(self);
87-
}
88-
89-
STATIC mp_obj_t bleio_scanner_get_interval(mp_obj_t self_in) {
90-
bleio_scanner_obj_t *self = MP_OBJ_TO_PTR(self_in);
91-
92-
return mp_obj_new_int(self->interval);
93-
}
94-
MP_DEFINE_CONST_FUN_OBJ_1(bleio_scanner_get_interval_obj, bleio_scanner_get_interval);
95-
96-
static mp_obj_t bleio_scanner_set_interval(mp_obj_t self_in, mp_obj_t value) {
97-
bleio_scanner_obj_t *self = MP_OBJ_TO_PTR(self_in);
98-
99-
self->interval = mp_obj_get_int(value);
100-
101-
return mp_const_none;
102-
}
103-
STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_scanner_set_interval_obj, bleio_scanner_set_interval);
104-
105-
const mp_obj_property_t bleio_scanner_interval_obj = {
106-
.base.type = &mp_type_property,
107-
.proxy = { (mp_obj_t)&bleio_scanner_get_interval_obj,
108-
(mp_obj_t)&bleio_scanner_set_interval_obj,
109-
(mp_obj_t)&mp_const_none_obj },
110-
};
111-
112-
STATIC mp_obj_t scanner_scan(mp_obj_t self_in, mp_obj_t timeout_in) {
113-
bleio_scanner_obj_t *self = MP_OBJ_TO_PTR(self_in);
114-
const mp_int_t timeout = mp_obj_get_int(timeout_in);
79+
STATIC mp_obj_t bleio_scanner_scan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
80+
enum { ARG_timeout, ARG_interval, ARG_window };
81+
static const mp_arg_t allowed_args[] = {
82+
{ MP_QSTR_timeout, MP_ARG_REQUIRED | MP_ARG_OBJ },
83+
{ MP_QSTR_interval, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_obj = MP_OBJ_NULL} },
84+
{ MP_QSTR_window, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_obj = MP_OBJ_NULL} },
85+
};
86+
87+
bleio_scanner_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
88+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
89+
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
90+
91+
const mp_float_t timeout = mp_obj_get_float(args[ARG_timeout].u_obj);
92+
93+
if (args[ARG_interval].u_obj == MP_OBJ_NULL) {
94+
args[ARG_interval].u_obj = mp_obj_new_float(INTERVAL_DEFAULT);
95+
}
96+
97+
if (args[ARG_window].u_obj == MP_OBJ_NULL) {
98+
args[ARG_window].u_obj = mp_obj_new_float(WINDOW_DEFAULT);
99+
}
100+
101+
const mp_float_t interval = mp_obj_float_get(args[ARG_interval].u_obj);
102+
if (interval < INTERVAL_MIN || interval > INTERVAL_MAX) {
103+
mp_raise_ValueError_varg(translate("interval must be in range %s-%s"), INTERVAL_MIN_STRING, INTERVAL_MAX_STRING);
104+
}
105+
106+
const mp_float_t window = mp_obj_float_get(args[ARG_window].u_obj);
107+
if (window > interval) {
108+
mp_raise_ValueError(translate("window must be <= interval"));
109+
}
115110

116111
self->adv_reports = mp_obj_new_list(0, NULL);
117112

118-
common_hal_bleio_scanner_scan(self, timeout);
113+
common_hal_bleio_scanner_scan(self, timeout, interval, window);
119114

120115
return self->adv_reports;
121116
}
122-
STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_scanner_scan_obj, scanner_scan);
123-
124-
STATIC mp_obj_t bleio_scanner_get_window(mp_obj_t self_in) {
125-
bleio_scanner_obj_t *self = MP_OBJ_TO_PTR(self_in);
126-
127-
return mp_obj_new_int(self->window);
128-
}
129-
MP_DEFINE_CONST_FUN_OBJ_1(bleio_scanner_get_window_obj, bleio_scanner_get_window);
130-
131-
static mp_obj_t bleio_scanner_set_window(mp_obj_t self_in, mp_obj_t value) {
132-
bleio_scanner_obj_t *self = MP_OBJ_TO_PTR(self_in);
117+
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_scanner_scan_obj, 2, bleio_scanner_scan);
133118

134-
self->window = mp_obj_get_int(value);
135-
136-
return mp_const_none;
137-
}
138-
STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_scanner_set_window_obj, bleio_scanner_set_window);
139-
140-
const mp_obj_property_t bleio_scanner_window_obj = {
141-
.base.type = &mp_type_property,
142-
.proxy = { (mp_obj_t)&bleio_scanner_get_window_obj,
143-
(mp_obj_t)&bleio_scanner_set_window_obj,
144-
(mp_obj_t)&mp_const_none_obj },
145-
};
146119

147120
STATIC const mp_rom_map_elem_t bleio_scanner_locals_dict_table[] = {
148-
{ MP_ROM_QSTR(MP_QSTR_interval), MP_ROM_PTR(&bleio_scanner_interval_obj) },
149121
{ MP_ROM_QSTR(MP_QSTR_scan), MP_ROM_PTR(&bleio_scanner_scan_obj) },
150-
{ MP_ROM_QSTR(MP_QSTR_window), MP_ROM_PTR(&bleio_scanner_window_obj) },
151122
};
152123

153124
STATIC MP_DEFINE_CONST_DICT(bleio_scanner_locals_dict, bleio_scanner_locals_dict_table);
154125

155126
const mp_obj_type_t bleio_scanner_type = {
156127
{ &mp_type_type },
157128
.name = MP_QSTR_Scanner,
158-
.print = bleio_scanner_print,
159129
.make_new = bleio_scanner_make_new,
160130
.locals_dict = (mp_obj_dict_t*)&bleio_scanner_locals_dict
161131
};

shared-bindings/bleio/Scanner.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
extern const mp_obj_type_t bleio_scanner_type;
3535

36-
extern void common_hal_bleio_scanner_scan(bleio_scanner_obj_t *self, mp_int_t timeout);
36+
void common_hal_bleio_scanner_scan(bleio_scanner_obj_t *self, mp_float_t timeout, mp_float_t interval, mp_float_t window);
3737
extern void common_hal_bleio_scanner_stop(bleio_scanner_obj_t *self);
3838

3939
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SCANNER_H

shared-bindings/bleio/__init__.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@
6464
// Descriptor
6565
// Device
6666
//| Peripheral
67-
// ScanEntry
68-
// Scanner
67+
//| ScanEntry
68+
//| Scanner
6969
//| Service
7070
//| UUID
7171
//|
@@ -86,8 +86,8 @@ STATIC const mp_rom_map_elem_t bleio_module_globals_table[] = {
8686
// { MP_ROM_QSTR(MP_QSTR_Descriptor), MP_ROM_PTR(&bleio_descriptor_type) },
8787
{ MP_ROM_QSTR(MP_QSTR_Peripheral), MP_ROM_PTR(&bleio_peripheral_type) },
8888
// Hide work-in-progress.
89-
// { MP_ROM_QSTR(MP_QSTR_ScanEntry), MP_ROM_PTR(&bleio_scanentry_type) },
90-
// { MP_ROM_QSTR(MP_QSTR_Scanner), MP_ROM_PTR(&bleio_scanner_type) },
89+
{ MP_ROM_QSTR(MP_QSTR_ScanEntry), MP_ROM_PTR(&bleio_scanentry_type) },
90+
{ MP_ROM_QSTR(MP_QSTR_Scanner), MP_ROM_PTR(&bleio_scanner_type) },
9191
{ MP_ROM_QSTR(MP_QSTR_Service), MP_ROM_PTR(&bleio_service_type) },
9292
{ MP_ROM_QSTR(MP_QSTR_UUID), MP_ROM_PTR(&bleio_uuid_type) },
9393

0 commit comments

Comments
 (0)