summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJim Mussared <jim.mussared@gmail.com>2019-10-21 22:35:58 +1100
committerJim Mussared <jim.mussared@gmail.com>2019-10-22 14:30:23 +1100
commitf34e16dbc6648a46590501bbc5e4b146bd032eef (patch)
tree07a0b4b502452d40935de573965f9edf38d1db72
parentc7ae8c5a99fa463dea23c34e0bd70e71dfc118b9 (diff)
downloadmicropython-f34e16dbc6648a46590501bbc5e4b146bd032eef.tar.gz
micropython-f34e16dbc6648a46590501bbc5e4b146bd032eef.zip
extmod/modbluetooth: Persist reference to NimBLE service instances.
NimBLE doesn't actually copy this data, it requires it to stay live. Only dereference when we register a new set of services. Fixes #5226 This will allow incrementally adding services in the future, so rename `reset` to `append` to make it clearer.
-rw-r--r--extmod/modbluetooth.c6
-rw-r--r--extmod/modbluetooth.h2
-rw-r--r--extmod/modbluetooth_nimble.c15
3 files changed, 12 insertions, 11 deletions
diff --git a/extmod/modbluetooth.c b/extmod/modbluetooth.c
index 1b98888448..2a3e87bc24 100644
--- a/extmod/modbluetooth.c
+++ b/extmod/modbluetooth.c
@@ -421,9 +421,9 @@ STATIC mp_obj_t bluetooth_ble_gatts_register_services(mp_obj_t self_in, mp_obj_t
uint16_t **handles = m_new0(uint16_t*, len);
size_t *num_handles = m_new0(size_t, len);
- // We always reset the service list, as Nimble has no other option.
- // TODO: Add a `reset` or `clear` kwarg (defaulting to True) to make this behavior optional.
- int err = mp_bluetooth_gatts_register_service_begin(true);
+ // TODO: Add a `append` kwarg (defaulting to False) to make this behavior optional.
+ bool append = false;
+ int err = mp_bluetooth_gatts_register_service_begin(append);
if (err != 0) {
return bluetooth_handle_errno(err);
}
diff --git a/extmod/modbluetooth.h b/extmod/modbluetooth.h
index e99641e8f7..20476b183c 100644
--- a/extmod/modbluetooth.h
+++ b/extmod/modbluetooth.h
@@ -165,7 +165,7 @@ int mp_bluetooth_gap_advertise_start(bool connectable, int32_t interval_us, cons
void mp_bluetooth_gap_advertise_stop(void);
// Start adding services. Must be called before mp_bluetooth_register_service.
-int mp_bluetooth_gatts_register_service_begin(bool reset);
+int mp_bluetooth_gatts_register_service_begin(bool append);
// // Add a service with the given list of characteristics to the queue to be registered.
// The value_handles won't be valid until after mp_bluetooth_register_service_end is called.
int mp_bluetooth_gatts_register_service(mp_obj_bluetooth_uuid_t *service_uuid, mp_obj_bluetooth_uuid_t **characteristic_uuids, uint8_t *characteristic_flags, mp_obj_bluetooth_uuid_t **descriptor_uuids, uint8_t *descriptor_flags, uint8_t *num_descriptors, uint16_t *handles, size_t num_characteristics);
diff --git a/extmod/modbluetooth_nimble.c b/extmod/modbluetooth_nimble.c
index c09f1cd2de..d873368581 100644
--- a/extmod/modbluetooth_nimble.c
+++ b/extmod/modbluetooth_nimble.c
@@ -440,7 +440,7 @@ static int characteristic_access_cb(uint16_t conn_handle, uint16_t value_handle,
return BLE_ATT_ERR_UNLIKELY;
}
-int mp_bluetooth_gatts_register_service_begin(bool reset) {
+int mp_bluetooth_gatts_register_service_begin(bool append) {
int ret = ble_gatts_reset();
if (ret != 0) {
return ble_hs_err_to_errno(ret);
@@ -452,7 +452,13 @@ int mp_bluetooth_gatts_register_service_begin(bool reset) {
// By default, just register the default gap service.
ble_svc_gap_init();
- MP_STATE_PORT(bluetooth_nimble_root_pointers)->n_services = 0;
+ if (!append) {
+ // Unref any previous service definitions.
+ for (int i = 0; i < MP_STATE_PORT(bluetooth_nimble_root_pointers)->n_services; ++i) {
+ MP_STATE_PORT(bluetooth_nimble_root_pointers)->services[i] = NULL;
+ }
+ MP_STATE_PORT(bluetooth_nimble_root_pointers)->n_services = 0;
+ }
return 0;
}
@@ -463,11 +469,6 @@ int mp_bluetooth_gatts_register_service_end() {
return ble_hs_err_to_errno(ret);
}
- for (int i = 0; i < MP_STATE_PORT(bluetooth_nimble_root_pointers)->n_services; ++i) {
- MP_STATE_PORT(bluetooth_nimble_root_pointers)->services[i] = NULL;
- }
- MP_STATE_PORT(bluetooth_nimble_root_pointers)->n_services = 0;
-
return 0;
}