summaryrefslogtreecommitdiff
path: root/shared-bindings
diff options
context:
space:
mode:
authorarturo182 <arturo182@tlen.pl>2018-07-26 00:04:48 +0200
committerarturo182 <arturo182@tlen.pl>2018-10-21 16:00:04 +0200
commiteceb21a0175bd6109c81c7fa0def81dd57fdfe9c (patch)
tree8d846a75d49acaaae5a20d5a2e5cf8fa8a564619 /shared-bindings
parentad466b3edbf5848febf062dff125e6a019ac88f5 (diff)
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.
Diffstat (limited to 'shared-bindings')
-rw-r--r--shared-bindings/bleio/Device.c8
-rw-r--r--shared-bindings/bleio/Device.h2
-rw-r--r--shared-bindings/bleio/Service.c5
-rw-r--r--shared-bindings/bleio/Service.h1
4 files changed, 11 insertions, 5 deletions
diff --git a/shared-bindings/bleio/Device.c b/shared-bindings/bleio/Device.c
index 756a5e05d..e89bc45a2 100644
--- a/shared-bindings/bleio/Device.c
+++ b/shared-bindings/bleio/Device.c
@@ -291,6 +291,14 @@ STATIC mp_obj_t bleio_device_start_advertising(mp_uint_t n_args, const mp_obj_t
mp_get_buffer_raise(args[ARG_data].u_obj, &bufinfo, MP_BUFFER_READ);
}
+ const mp_obj_list_t *service_list = MP_OBJ_TO_PTR(self->service_list);
+ for (size_t i = 0; i < service_list->len; ++i) {
+ bleio_service_obj_t *service = service_list->items[i];
+ if (service->handle == 0xFFFF) {
+ common_hal_bleio_device_add_service(self, service);
+ }
+ }
+
common_hal_bleio_device_start_advertising(self, args[ARG_connectable].u_bool, &bufinfo);
return mp_const_none;
diff --git a/shared-bindings/bleio/Device.h b/shared-bindings/bleio/Device.h
index f989736dd..aebf1d639 100644
--- a/shared-bindings/bleio/Device.h
+++ b/shared-bindings/bleio/Device.h
@@ -29,9 +29,11 @@
#include "shared-module/bleio/AdvertisementData.h"
#include "shared-module/bleio/Device.h"
+#include "shared-module/bleio/Service.h"
extern const mp_obj_type_t bleio_device_type;
+extern void common_hal_bleio_device_add_service(bleio_device_obj_t *device, bleio_service_obj_t *service);
extern void common_hal_bleio_device_start_advertising(bleio_device_obj_t *device, bool connectable, mp_buffer_info_t *raw_data);
extern void common_hal_bleio_device_stop_advertising(bleio_device_obj_t *device);
extern void common_hal_bleio_device_connect(bleio_device_obj_t *device);
diff --git a/shared-bindings/bleio/Service.c b/shared-bindings/bleio/Service.c
index a5043a346..6e112880a 100644
--- a/shared-bindings/bleio/Service.c
+++ b/shared-bindings/bleio/Service.c
@@ -76,6 +76,7 @@ STATIC mp_obj_t bleio_service_make_new(const mp_obj_type_t *type, size_t n_args,
self->base.type = &bleio_service_type;
self->device = NULL;
self->char_list = mp_obj_new_list(0, NULL);
+ self->handle = 0xFFFF;
mp_map_t kw_args;
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,
"Invalid UUID parameter"));
}
- common_hal_bleio_service_construct(self);
-
return MP_OBJ_FROM_PTR(self);
}
@@ -118,8 +117,6 @@ STATIC mp_obj_t bleio_service_add_characteristic(mp_obj_t self_in, mp_obj_t char
characteristic->uuid->uuid_vs_idx = self->uuid->uuid_vs_idx;
}
- common_hal_bleio_service_add_characteristic(self, characteristic);
-
characteristic->service = self;
mp_obj_list_append(self->char_list, characteristic);
diff --git a/shared-bindings/bleio/Service.h b/shared-bindings/bleio/Service.h
index 6e3079cf9..77c751829 100644
--- a/shared-bindings/bleio/Service.h
+++ b/shared-bindings/bleio/Service.h
@@ -32,7 +32,6 @@
const mp_obj_type_t bleio_service_type;
-extern void common_hal_bleio_service_construct(bleio_service_obj_t *self);
extern void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, bleio_characteristic_obj_t *characteristic);
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SERVICE_H