Skip to content

Commit eceb21a

Browse files
committed
bleio: Don't register the services until needed
Because of the very specific way nRF requires service registration (characteristics can be added only to last added service), we would have to write the Python code in a specific way. With this patch the user has more freedom.
1 parent ad466b3 commit eceb21a

File tree

6 files changed

+41
-29
lines changed

6 files changed

+41
-29
lines changed

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,36 @@ STATIC void on_ble_evt(ble_evt_t *ble_evt, void *device_in) {
490490
}
491491
}
492492

493+
void common_hal_bleio_device_add_service(bleio_device_obj_t *device, bleio_service_obj_t *service) {
494+
ble_uuid_t uuid = {
495+
.type = BLE_UUID_TYPE_BLE,
496+
.uuid = service->uuid->value[0] | (service->uuid->value[1] << 8)
497+
};
498+
499+
if (service->uuid->type == UUID_TYPE_128BIT) {
500+
uuid.type = service->uuid->uuid_vs_idx;
501+
}
502+
503+
uint8_t service_type = BLE_GATTS_SRVC_TYPE_PRIMARY;
504+
if (service->is_secondary) {
505+
service_type = BLE_GATTS_SRVC_TYPE_SECONDARY;
506+
}
507+
508+
common_hal_bleio_adapter_set_enabled(true);
509+
510+
const uint32_t err_code = sd_ble_gatts_service_add(service_type, &uuid, &service->handle);
511+
if (err_code != NRF_SUCCESS) {
512+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError,
513+
"Failed to add service, status: 0x%08lX", err_code));
514+
}
515+
516+
const mp_obj_list_t *char_list = MP_OBJ_TO_PTR(service->char_list);
517+
for (size_t i = 0; i < char_list->len; ++i) {
518+
bleio_characteristic_obj_t *characteristic = char_list->items[i];
519+
common_hal_bleio_service_add_characteristic(service, characteristic);
520+
}
521+
}
522+
493523
void common_hal_bleio_device_start_advertising(bleio_device_obj_t *device, bool connectable, mp_buffer_info_t *raw_data) {
494524
if (connectable) {
495525
ble_drv_add_event_handler(on_ble_evt, device);

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

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -30,30 +30,6 @@
3030
#include "shared-bindings/bleio/Service.h"
3131
#include "shared-bindings/bleio/Adapter.h"
3232

33-
void common_hal_bleio_service_construct(bleio_service_obj_t *self) {
34-
ble_uuid_t uuid = {
35-
.type = BLE_UUID_TYPE_BLE,
36-
.uuid = self->uuid->value[0] | (self->uuid->value[1] << 8)
37-
};
38-
39-
if (self->uuid->type == UUID_TYPE_128BIT) {
40-
uuid.type = self->uuid->uuid_vs_idx;
41-
}
42-
43-
uint8_t service_type = BLE_GATTS_SRVC_TYPE_PRIMARY;
44-
if (self->is_secondary) {
45-
service_type = BLE_GATTS_SRVC_TYPE_SECONDARY;
46-
}
47-
48-
common_hal_bleio_adapter_set_enabled(true);
49-
50-
const uint32_t err_code = sd_ble_gatts_service_add(service_type, &uuid, &self->handle);
51-
if (err_code != NRF_SUCCESS) {
52-
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError,
53-
"Failed to add service, status: 0x%08lX", err_code));
54-
}
55-
}
56-
5733
void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, bleio_characteristic_obj_t *characteristic) {
5834
ble_gatts_char_md_t char_md = {
5935
.char_props.broadcast = characteristic->props.broadcast,

shared-bindings/bleio/Device.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,14 @@ STATIC mp_obj_t bleio_device_start_advertising(mp_uint_t n_args, const mp_obj_t
291291
mp_get_buffer_raise(args[ARG_data].u_obj, &bufinfo, MP_BUFFER_READ);
292292
}
293293

294+
const mp_obj_list_t *service_list = MP_OBJ_TO_PTR(self->service_list);
295+
for (size_t i = 0; i < service_list->len; ++i) {
296+
bleio_service_obj_t *service = service_list->items[i];
297+
if (service->handle == 0xFFFF) {
298+
common_hal_bleio_device_add_service(self, service);
299+
}
300+
}
301+
294302
common_hal_bleio_device_start_advertising(self, args[ARG_connectable].u_bool, &bufinfo);
295303

296304
return mp_const_none;

shared-bindings/bleio/Device.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@
2929

3030
#include "shared-module/bleio/AdvertisementData.h"
3131
#include "shared-module/bleio/Device.h"
32+
#include "shared-module/bleio/Service.h"
3233

3334
extern const mp_obj_type_t bleio_device_type;
3435

36+
extern void common_hal_bleio_device_add_service(bleio_device_obj_t *device, bleio_service_obj_t *service);
3537
extern void common_hal_bleio_device_start_advertising(bleio_device_obj_t *device, bool connectable, mp_buffer_info_t *raw_data);
3638
extern void common_hal_bleio_device_stop_advertising(bleio_device_obj_t *device);
3739
extern void common_hal_bleio_device_connect(bleio_device_obj_t *device);

shared-bindings/bleio/Service.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ STATIC mp_obj_t bleio_service_make_new(const mp_obj_type_t *type, size_t n_args,
7676
self->base.type = &bleio_service_type;
7777
self->device = NULL;
7878
self->char_list = mp_obj_new_list(0, NULL);
79+
self->handle = 0xFFFF;
7980

8081
mp_map_t kw_args;
8182
mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args);
@@ -104,8 +105,6 @@ STATIC mp_obj_t bleio_service_make_new(const mp_obj_type_t *type, size_t n_args,
104105
"Invalid UUID parameter"));
105106
}
106107

107-
common_hal_bleio_service_construct(self);
108-
109108
return MP_OBJ_FROM_PTR(self);
110109
}
111110

@@ -118,8 +117,6 @@ STATIC mp_obj_t bleio_service_add_characteristic(mp_obj_t self_in, mp_obj_t char
118117
characteristic->uuid->uuid_vs_idx = self->uuid->uuid_vs_idx;
119118
}
120119

121-
common_hal_bleio_service_add_characteristic(self, characteristic);
122-
123120
characteristic->service = self;
124121

125122
mp_obj_list_append(self->char_list, characteristic);

shared-bindings/bleio/Service.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232

3333
const mp_obj_type_t bleio_service_type;
3434

35-
extern void common_hal_bleio_service_construct(bleio_service_obj_t *self);
3635
extern void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, bleio_characteristic_obj_t *characteristic);
3736

3837
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SERVICE_H

0 commit comments

Comments
 (0)