Skip to content

Commit 87c6f33

Browse files
committed
Broadcaster now takes whole packet. Also should be scannable
1 parent 941ccf8 commit 87c6f33

2 files changed

Lines changed: 9 additions & 28 deletions

File tree

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

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,6 @@
3838

3939
static uint8_t m_adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET;
4040

41-
STATIC void check_data_fit(size_t pos, size_t data_len) {
42-
if (pos + data_len >= BLE_GAP_ADV_SET_DATA_SIZE_MAX) {
43-
mp_raise_ValueError(translate("Data too large for advertisement packet"));
44-
}
45-
}
46-
4741
void common_hal_bleio_broadcaster_construct(bleio_broadcaster_obj_t *self, mp_float_t interval) {
4842
common_hal_bleio_adapter_set_enabled(true); // TODO -- Do this somewhere else maybe bleio __init__
4943
const mp_float_t min = BLE_GAP_ADV_INTERVAL_MIN * ADV_INTERVAL_UNIT_FLOAT_SECS;
@@ -58,25 +52,16 @@ void common_hal_bleio_broadcaster_construct(bleio_broadcaster_obj_t *self, mp_fl
5852

5953

6054
void common_hal_bleio_broadcaster_start_advertising(bleio_broadcaster_obj_t *self, mp_buffer_info_t *data) {
61-
size_t adv_data_pos = 0;
6255
uint32_t err_code;
6356

64-
// Build up advertising packet.
65-
check_data_fit(adv_data_pos, 1 + 1 + 1);
66-
self->adv_data[adv_data_pos++] = 2;
67-
self->adv_data[adv_data_pos++] = BLE_GAP_AD_TYPE_FLAGS;
68-
self->adv_data[adv_data_pos++] = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
69-
70-
// Data is always send as manufacturer-specific data
71-
check_data_fit(adv_data_pos, 1 + 1 + data->len);
72-
self->adv_data[adv_data_pos++] = 1 + data->len;
73-
self->adv_data[adv_data_pos++] = BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA;
74-
memcpy(&(self->adv_data[adv_data_pos]), data->buf, data->len);
75-
adv_data_pos += data->len;
57+
if (data->len >= BLE_GAP_ADV_SET_DATA_SIZE_MAX) {
58+
mp_raise_ValueError(translate("Data too large for advertisement packet"));
59+
}
60+
memcpy(self->adv_data, data->buf, data->len);
7661

7762
ble_gap_adv_params_t m_adv_params = {
7863
.interval = (uint32_t) (self->interval / ADV_INTERVAL_UNIT_FLOAT_SECS),
79-
.properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED,
64+
.properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED,
8065
.duration = BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED,
8166
.filter_policy = BLE_GAP_ADV_FP_ANY,
8267
.primary_phy = BLE_GAP_PHY_1MBPS,
@@ -86,7 +71,7 @@ void common_hal_bleio_broadcaster_start_advertising(bleio_broadcaster_obj_t *sel
8671

8772
const ble_gap_adv_data_t ble_gap_adv_data = {
8873
.adv_data.p_data = self->adv_data,
89-
.adv_data.len = adv_data_pos,
74+
.adv_data.len = data->len,
9075
};
9176

9277
err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &ble_gap_adv_data, &m_adv_params);

shared-bindings/bleio/Broadcaster.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,14 @@
4242
//| import bleio
4343
//| import time
4444
//|
45-
//|
4645
//| # Broadcast once a second.
4746
//| broadcaster = bleio.Broadcaster(interval=1)
4847
//| i = 0
49-
//| data = bytearray(1)
5048
//| # Broadcast a byte of data that's incremented once a minute
5149
//| while True:
52-
//| data[0] = i
53-
//| bytearray
50+
//| # data is an entire advertising data packet, starting with flags.
5451
//| broadcaster.start_advertising(data)
5552
//| time.sleep(60)
56-
//| i += 1
5753
//|
5854
//| .. class:: Broadcaster(interval=1)
5955
//|
@@ -88,9 +84,9 @@ STATIC mp_obj_t bleio_broadcaster_make_new(const mp_obj_type_t *type, size_t n_a
8884

8985
//| .. method:: start_advertising(data)
9086
//|
91-
//| Start advertising the given manufacturer-specific data.
87+
//| Start advertising using the given data packet.
9288
//|
93-
//| :param buf data: Send data bytes in advertising packets, labeled as manufacturer-specific data
89+
//| :param buf data: advertising data packet, starting with advertising data flags (0x01)
9490
//|
9591
STATIC mp_obj_t bleio_broadcaster_start_advertising(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
9692
bleio_broadcaster_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);

0 commit comments

Comments
 (0)