summaryrefslogtreecommitdiff
path: root/devices
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2020-08-11 16:21:16 -0400
committerDan Halbert <halbert@halwitz.org>2020-08-11 16:21:16 -0400
commit06f3b4048a4ec18d9e46444972d12dc677745793 (patch)
treeab550eb25ee3ebe650e99b75ee7f68a1dcd27cc1 /devices
parent92cf56004fedb412cde1ac5159ef23df7398fa20 (diff)
fix #3228 for nrf; still needs to be fixed for HCI; tested
Diffstat (limited to 'devices')
-rw-r--r--devices/ble_hci/common-hal/_bleio/Characteristic.c28
-rw-r--r--devices/ble_hci/common-hal/_bleio/Characteristic.h4
-rw-r--r--devices/ble_hci/common-hal/_bleio/Connection.c22
-rw-r--r--devices/ble_hci/common-hal/_bleio/Connection.h2
4 files changed, 38 insertions, 18 deletions
diff --git a/devices/ble_hci/common-hal/_bleio/Characteristic.c b/devices/ble_hci/common-hal/_bleio/Characteristic.c
index b62957ea6..4e69c3522 100644
--- a/devices/ble_hci/common-hal/_bleio/Characteristic.c
+++ b/devices/ble_hci/common-hal/_bleio/Characteristic.c
@@ -47,7 +47,8 @@ void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self,
self->props = props;
self->read_perm = read_perm;
self->write_perm = write_perm;
- self->descriptor_list = NULL;
+ self->descriptor_linked_list = mp_obj_new_list(0, NULL);
+ self->watchers_list = mp_obj_new_list(0, NULL);
const mp_int_t max_length_max = 512;
if (max_length < 0 || max_length > max_length_max) {
@@ -67,8 +68,8 @@ void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self,
}
}
-bleio_descriptor_obj_t *common_hal_bleio_characteristic_get_descriptor_list(bleio_characteristic_obj_t *self) {
- return self->descriptor_list;
+bleio_descriptor_obj_t *common_hal_bleio_characteristic_get_descriptor_linked_list(bleio_characteristic_obj_t *self) {
+ return self->descriptor_linked_list;
}
bleio_service_obj_t *common_hal_bleio_characteristic_get_service(bleio_characteristic_obj_t *self) {
@@ -153,8 +154,8 @@ void common_hal_bleio_characteristic_add_descriptor(bleio_characteristic_obj_t *
self->service->end_handle = descriptor->handle;
// Link together all the descriptors for this characteristic.
- descriptor->next = self->descriptor_list;
- self->descriptor_list = descriptor;
+ descriptor->next = self->descriptor_linked_list;
+ self->descriptor_linked_list = descriptor;
}
void common_hal_bleio_characteristic_set_cccd(bleio_characteristic_obj_t *self, bool notify, bool indicate) {
@@ -201,3 +202,20 @@ void common_hal_bleio_characteristic_set_cccd(bleio_characteristic_obj_t *self,
// }
}
+
+bool bleio_characteristic_set_local_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo) {
+ if (self->fixed_length && bufinfo->len != self->max_length) {
+ return false;
+ }
+ if (bufinfo->len > self->max_length) {
+ bool
+ }
+
+ mp_buffer_info_t char_bufinfo;
+ if (!mp_get_buffer(characteristic->value, &bufinfo, MP_BUFFER_WRITE)) {
+ return false;
+ }
+ memcpy(&char_bufinfo->buf, bufinfo->buf, bufinfo->len);
+
+ for (size_t i; i < characteristic->set_callbacks.
+}
diff --git a/devices/ble_hci/common-hal/_bleio/Characteristic.h b/devices/ble_hci/common-hal/_bleio/Characteristic.h
index ce8302fcf..cc5ba4108 100644
--- a/devices/ble_hci/common-hal/_bleio/Characteristic.h
+++ b/devices/ble_hci/common-hal/_bleio/Characteristic.h
@@ -40,6 +40,8 @@ typedef struct _bleio_characteristic_obj {
bleio_service_obj_t *service;
bleio_uuid_obj_t *uuid;
mp_obj_t value;
+ mp_obj_list_t watcher_list;
+ mp_obj_list_t descriptor_linked_list;
uint16_t max_length;
bool fixed_length;
uint16_t decl_handle;
@@ -47,7 +49,7 @@ typedef struct _bleio_characteristic_obj {
bleio_characteristic_properties_t props;
bleio_attribute_security_mode_t read_perm;
bleio_attribute_security_mode_t write_perm;
- bleio_descriptor_obj_t *descriptor_list;
+ bleio_descriptor_obj_t *descriptor_linked_list;
uint16_t user_desc_handle;
uint16_t cccd_handle;
uint16_t sccd_handle;
diff --git a/devices/ble_hci/common-hal/_bleio/Connection.c b/devices/ble_hci/common-hal/_bleio/Connection.c
index 6b528552a..98fa4d1f7 100644
--- a/devices/ble_hci/common-hal/_bleio/Connection.c
+++ b/devices/ble_hci/common-hal/_bleio/Connection.c
@@ -319,7 +319,7 @@ static volatile bool m_discovery_successful;
// }
void bleio_connection_clear(bleio_connection_internal_t *self) {
- self->remote_service_list = NULL;
+ self->remote_service_linked_list = NULL;
//FIX self->conn_handle = BLE_CONN_HANDLE_INVALID;
self->pair_status = PAIR_NOT_PAIRED;
@@ -449,7 +449,7 @@ void common_hal_bleio_connection_set_connection_interval(bleio_connection_intern
// }
// STATIC void on_primary_srv_discovery_rsp(ble_gattc_evt_prim_srvc_disc_rsp_t *response, bleio_connection_internal_t* connection) {
-// bleio_service_obj_t* tail = connection->remote_service_list;
+// bleio_service_obj_t* tail = connection->remote_service_linked_list;
// for (size_t i = 0; i < response->count; ++i) {
// ble_gattc_service_t *gattc_service = &response->services[i];
@@ -482,7 +482,7 @@ void common_hal_bleio_connection_set_connection_interval(bleio_connection_intern
// tail = service;
// }
-// connection->remote_service_list = tail;
+// connection->remote_service_linked_list = tail;
// if (response->count > 0) {
// m_discovery_successful = true;
@@ -581,7 +581,7 @@ void common_hal_bleio_connection_set_connection_interval(bleio_connection_intern
// GATT_MAX_DATA_LENGTH, false, mp_const_empty_bytes);
// descriptor->handle = gattc_desc->handle;
-// mp_obj_list_append(m_desc_discovery_characteristic->descriptor_list, MP_OBJ_FROM_PTR(descriptor));
+// mp_obj_list_append(m_desc_discovery_characteristic->descriptor_linked_list, MP_OBJ_FROM_PTR(descriptor));
// }
// if (response->count > 0) {
@@ -622,7 +622,7 @@ void common_hal_bleio_connection_set_connection_interval(bleio_connection_intern
// ble_drv_add_event_handler(discovery_on_ble_evt, self);
// // Start over with an empty list.
-// self->remote_service_list = NULL;
+// self->remote_service_linked_list = NULL;
// if (service_uuids_whitelist == mp_const_none) {
// // List of service UUID's not given, so discover all available services.
@@ -634,7 +634,7 @@ void common_hal_bleio_connection_set_connection_interval(bleio_connection_intern
// // Get the most recently discovered service, and then ask for services
// // whose handles start after the last attribute handle inside that service.
-// const bleio_service_obj_t *service = self->remote_service_list;
+// const bleio_service_obj_t *service = self->remote_service_linked_list;
// next_service_start_handle = service->end_handle + 1;
// }
// } else {
@@ -658,7 +658,7 @@ void common_hal_bleio_connection_set_connection_interval(bleio_connection_intern
// }
-// bleio_service_obj_t *service = self->remote_service_list;
+// bleio_service_obj_t *service = self->remote_service_linked_list;
// while (service != NULL) {
// // Skip the service if it had an unknown (unregistered) UUID.
// if (service->uuid == NULL) {
@@ -707,14 +707,14 @@ void common_hal_bleio_connection_set_connection_interval(bleio_connection_intern
// // Stop when we go past the end of the range of handles for this service or
// // discovery call returns nothing.
-// // discover_next_descriptors() appends to the descriptor_list.
+// // discover_next_descriptors() appends to the descriptor_linked_list.
// while (next_desc_start_handle <= service->end_handle &&
// next_desc_start_handle <= next_desc_end_handle &&
// discover_next_descriptors(self, characteristic,
// next_desc_start_handle, next_desc_end_handle)) {
// // Get the most recently discovered descriptor, and then ask for descriptors
// // whose handles start after that descriptor's handle.
-// const bleio_descriptor_obj_t *descriptor = characteristic->descriptor_list;
+// const bleio_descriptor_obj_t *descriptor = characteristic->descriptor_linked_list;
// next_desc_start_handle = descriptor->handle + 1;
// }
// }
@@ -730,8 +730,8 @@ mp_obj_tuple_t *common_hal_bleio_connection_discover_remote_services(bleio_conne
//FIX discover_remote_services(self->connection, service_uuids_whitelist);
bleio_connection_ensure_connected(self);
// Convert to a tuple and then clear the list so the callee will take ownership.
- mp_obj_tuple_t *services_tuple = service_linked_list_to_tuple(self->connection->remote_service_list);
- self->connection->remote_service_list = NULL;
+ mp_obj_tuple_t *services_tuple = service_linked_list_to_tuple(self->connection->remote_service_linked_list);
+ self->connection->remote_service_linked_list = NULL;
return services_tuple;
}
diff --git a/devices/ble_hci/common-hal/_bleio/Connection.h b/devices/ble_hci/common-hal/_bleio/Connection.h
index 8b9790d9e..efd496ecc 100644
--- a/devices/ble_hci/common-hal/_bleio/Connection.h
+++ b/devices/ble_hci/common-hal/_bleio/Connection.h
@@ -50,7 +50,7 @@ typedef struct {
uint16_t conn_handle;
bool is_central;
// Remote services discovered when this peripheral is acting as a client.
- bleio_service_obj_t *remote_service_list;
+ bleio_service_obj_t *remote_service_linked_list;
// The advertising data and scan response buffers are held by us, not by the SD, so we must
// maintain them and not change it. If we need to change the contents during advertising,
// there are tricks to get the SD to notice (see DevZone - TBS).