diff options
| author | Dan Halbert <halbert@halwitz.org> | 2019-01-01 14:11:59 -0500 |
|---|---|---|
| committer | Dan Halbert <halbert@halwitz.org> | 2019-01-01 14:11:59 -0500 |
| commit | 87c6f33bccc38548ec1b811885cd974aadf6804e (patch) | |
| tree | 013dbb946fa0e38152d81ddf3fc630e440b7340a | |
| parent | 941ccf87c88e9a72804b829682d842cac8f116b7 (diff) | |
Broadcaster now takes whole packet. Also should be scannable
| -rw-r--r-- | ports/nrf/common-hal/bleio/Broadcaster.c | 27 | ||||
| -rw-r--r-- | shared-bindings/bleio/Broadcaster.c | 10 |
2 files changed, 9 insertions, 28 deletions
diff --git a/ports/nrf/common-hal/bleio/Broadcaster.c b/ports/nrf/common-hal/bleio/Broadcaster.c index 508ede1d6..a70209a7f 100644 --- a/ports/nrf/common-hal/bleio/Broadcaster.c +++ b/ports/nrf/common-hal/bleio/Broadcaster.c @@ -38,12 +38,6 @@ static uint8_t m_adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET; -STATIC void check_data_fit(size_t pos, size_t data_len) { - if (pos + data_len >= BLE_GAP_ADV_SET_DATA_SIZE_MAX) { - mp_raise_ValueError(translate("Data too large for advertisement packet")); - } -} - void common_hal_bleio_broadcaster_construct(bleio_broadcaster_obj_t *self, mp_float_t interval) { common_hal_bleio_adapter_set_enabled(true); // TODO -- Do this somewhere else maybe bleio __init__ 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 void common_hal_bleio_broadcaster_start_advertising(bleio_broadcaster_obj_t *self, mp_buffer_info_t *data) { - size_t adv_data_pos = 0; uint32_t err_code; - // Build up advertising packet. - check_data_fit(adv_data_pos, 1 + 1 + 1); - self->adv_data[adv_data_pos++] = 2; - self->adv_data[adv_data_pos++] = BLE_GAP_AD_TYPE_FLAGS; - self->adv_data[adv_data_pos++] = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; - - // Data is always send as manufacturer-specific data - check_data_fit(adv_data_pos, 1 + 1 + data->len); - self->adv_data[adv_data_pos++] = 1 + data->len; - self->adv_data[adv_data_pos++] = BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA; - memcpy(&(self->adv_data[adv_data_pos]), data->buf, data->len); - adv_data_pos += data->len; + if (data->len >= BLE_GAP_ADV_SET_DATA_SIZE_MAX) { + mp_raise_ValueError(translate("Data too large for advertisement packet")); + } + memcpy(self->adv_data, data->buf, data->len); ble_gap_adv_params_t m_adv_params = { .interval = (uint32_t) (self->interval / ADV_INTERVAL_UNIT_FLOAT_SECS), - .properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED, + .properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED, .duration = BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED, .filter_policy = BLE_GAP_ADV_FP_ANY, .primary_phy = BLE_GAP_PHY_1MBPS, @@ -86,7 +71,7 @@ void common_hal_bleio_broadcaster_start_advertising(bleio_broadcaster_obj_t *sel const ble_gap_adv_data_t ble_gap_adv_data = { .adv_data.p_data = self->adv_data, - .adv_data.len = adv_data_pos, + .adv_data.len = data->len, }; err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &ble_gap_adv_data, &m_adv_params); diff --git a/shared-bindings/bleio/Broadcaster.c b/shared-bindings/bleio/Broadcaster.c index ae4f28b74..c4524e8fc 100644 --- a/shared-bindings/bleio/Broadcaster.c +++ b/shared-bindings/bleio/Broadcaster.c @@ -42,18 +42,14 @@ //| import bleio //| import time //| -//| //| # Broadcast once a second. //| broadcaster = bleio.Broadcaster(interval=1) //| i = 0 -//| data = bytearray(1) //| # Broadcast a byte of data that's incremented once a minute //| while True: -//| data[0] = i -//| bytearray +//| # data is an entire advertising data packet, starting with flags. //| broadcaster.start_advertising(data) //| time.sleep(60) -//| i += 1 //| //| .. class:: Broadcaster(interval=1) //| @@ -88,9 +84,9 @@ STATIC mp_obj_t bleio_broadcaster_make_new(const mp_obj_type_t *type, size_t n_a //| .. method:: start_advertising(data) //| -//| Start advertising the given manufacturer-specific data. +//| Start advertising using the given data packet. //| -//| :param buf data: Send data bytes in advertising packets, labeled as manufacturer-specific data +//| :param buf data: advertising data packet, starting with advertising data flags (0x01) //| STATIC mp_obj_t bleio_broadcaster_start_advertising(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { bleio_broadcaster_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); |
