summaryrefslogtreecommitdiff
path: root/ports
diff options
context:
space:
mode:
Diffstat (limited to 'ports')
-rw-r--r--ports/nrf/common-hal/bleio/Device.c32
-rw-r--r--ports/nrf/drivers/bluetooth/ble_drv.c75
-rw-r--r--ports/nrf/drivers/bluetooth/ble_drv.h18
3 files changed, 45 insertions, 80 deletions
diff --git a/ports/nrf/common-hal/bleio/Device.c b/ports/nrf/common-hal/bleio/Device.c
index 04151431c..848e60c57 100644
--- a/ports/nrf/common-hal/bleio/Device.c
+++ b/ports/nrf/common-hal/bleio/Device.c
@@ -54,34 +54,6 @@ STATIC void gattc_event_handler(bleio_device_obj_t *device, uint16_t event_id, u
m_disc_evt_received = true;
}
-STATIC void disc_add_char(bleio_service_obj_t *service, ble_drv_char_data_t *chara_data) {
- bleio_characteristic_obj_t *chara = m_new_obj(bleio_characteristic_obj_t);
- chara->base.type = &bleio_characteristic_type;
-
- bleio_uuid_obj_t * p_uuid = m_new_obj(bleio_uuid_obj_t);
- p_uuid->base.type = &bleio_uuid_type;
-
- chara->uuid = p_uuid;
-
- p_uuid->type = chara_data->uuid_type;
- p_uuid->value[0] = chara_data->uuid & 0xFF;
- p_uuid->value[1] = chara_data->uuid >> 8;
-
- // add characteristic specific data from discovery
- chara->props.broadcast = chara_data->props.broadcast;
- chara->props.indicate = chara_data->props.indicate;
- chara->props.notify = chara_data->props.notify;
- chara->props.read = chara_data->props.read;
- chara->props.write = chara_data->props.write;
- chara->props.write_wo_resp = chara_data->props.write_wo_resp;
- chara->handle = chara_data->value_handle;
-
- chara->service_handle = service->handle;
- chara->service = service;
-
- mp_obj_list_append(service->char_list, MP_OBJ_FROM_PTR(chara));
-}
-
void common_hal_bleio_device_start_advertising(bleio_device_obj_t *device, bleio_advertisement_data_t *adv_data) {
if (adv_data->connectable) {
ble_drv_gap_event_handler_set(device, gap_event_handler);
@@ -126,7 +98,7 @@ void common_hal_bleio_device_connect(bleio_device_obj_t *device) {
for (size_t i = 0; i < service_list->len; ++i) {
bleio_service_obj_t *service = service_list->items[i];
- bool found_char = ble_drv_discover_characteristic(device, service, service->start_handle, disc_add_char);
+ bool found_char = ble_drv_discover_characteristic(device, service, service->start_handle);
while (found_char) {
const mp_obj_list_t *char_list = MP_OBJ_TO_PTR(service->char_list);
const bleio_characteristic_obj_t *characteristic = char_list->items[char_list->len - 1];
@@ -136,7 +108,7 @@ void common_hal_bleio_device_connect(bleio_device_obj_t *device) {
break;
}
- found_char = ble_drv_discover_characteristic(device, service, next_handle, disc_add_char);
+ found_char = ble_drv_discover_characteristic(device, service, next_handle);
}
}
}
diff --git a/ports/nrf/drivers/bluetooth/ble_drv.c b/ports/nrf/drivers/bluetooth/ble_drv.c
index 797d1a573..e911adc93 100644
--- a/ports/nrf/drivers/bluetooth/ble_drv.c
+++ b/ports/nrf/drivers/bluetooth/ble_drv.c
@@ -35,6 +35,7 @@
#define NRF52 // Needed for SD132 v2
#endif
+#include "shared-bindings/bleio/Characteristic.h"
#include "shared-bindings/bleio/ScanEntry.h"
#include "shared-bindings/bleio/Service.h"
#include "shared-bindings/bleio/UUID.h"
@@ -91,7 +92,6 @@ static volatile bool m_write_done;
static volatile ble_drv_adv_evt_callback_t adv_event_handler;
static volatile ble_drv_gattc_evt_callback_t gattc_event_handler;
-static volatile ble_drv_disc_add_char_callback_t disc_add_char_handler;
static volatile ble_drv_gattc_char_data_callback_t gattc_char_data_handle;
static bleio_scanner_obj_t *mp_adv_observer;
@@ -820,11 +820,10 @@ bool ble_drv_discover_services(bleio_device_obj_t *device, uint16_t start_handle
return m_primary_service_found;
}
-bool ble_drv_discover_characteristic(bleio_device_obj_t *device, bleio_service_obj_t *service, uint16_t start_handle, ble_drv_disc_add_char_callback_t cb) {
+bool ble_drv_discover_characteristic(bleio_device_obj_t *device, bleio_service_obj_t *service, uint16_t start_handle) {
BLE_DRIVER_LOG("Discover characteristicts. Conn handle: 0x" HEX2_FMT "\n", device->conn_handle);
mp_gattc_disc_char_observer = service;
- disc_add_char_handler = cb;
ble_gattc_handle_range_t handle_range;
handle_range.start_handle = start_handle;
@@ -837,7 +836,7 @@ bool ble_drv_discover_characteristic(bleio_device_obj_t *device, bleio_service_o
return false;
}
- while (disc_add_char_handler != NULL) {
+ while (mp_gattc_disc_char_observer != NULL) {
#ifdef MICROPY_VM_HOOK_LOOP
MICROPY_VM_HOOK_LOOP
#endif
@@ -902,6 +901,44 @@ STATIC void on_primary_srv_discovery_rsp(ble_gattc_evt_prim_srvc_disc_rsp_t *res
mp_gattc_disc_service_observer = NULL;
}
+STATIC void on_characteristic_discovery_rsp(ble_gattc_evt_char_disc_rsp_t *response) {
+ BLE_DRIVER_LOG(">>> characteristic count: %d\n", response->count);
+
+ for (size_t i = 0; i < response->count; ++i) {
+ const ble_gattc_char_t *gattc_char = &response->chars[i];
+
+ bleio_characteristic_obj_t *characteristic = m_new_obj(bleio_characteristic_obj_t);
+ characteristic->base.type = &bleio_characteristic_type;
+
+ bleio_uuid_obj_t *uuid = m_new_obj(bleio_uuid_obj_t);
+ uuid->base.type = &bleio_uuid_type;
+ uuid->type = (gattc_char->uuid.type == BLE_UUID_TYPE_BLE) ? UUID_TYPE_16BIT : UUID_TYPE_128BIT;
+ uuid->value[0] = gattc_char->uuid.uuid & 0xFF;
+ uuid->value[1] = gattc_char->uuid.uuid >> 8;
+ characteristic->uuid = uuid;
+
+ characteristic->props.broadcast = gattc_char->char_props.broadcast;
+ characteristic->props.indicate = gattc_char->char_props.indicate;
+ characteristic->props.notify = gattc_char->char_props.notify;
+ characteristic->props.read = gattc_char->char_props.read;
+ characteristic->props.write = gattc_char->char_props.write;
+ characteristic->props.write_wo_resp = gattc_char->char_props.write_wo_resp;
+ characteristic->handle = gattc_char->handle_value;
+
+ characteristic->service_handle = mp_gattc_disc_char_observer->handle;
+ characteristic->service = mp_gattc_disc_char_observer;
+
+ mp_obj_list_append(mp_gattc_disc_char_observer->char_list, MP_OBJ_FROM_PTR(characteristic));
+ }
+
+ if (response->count > 0) {
+ m_characteristic_found = true;
+ }
+
+ // mark end of characteristic discovery
+ mp_gattc_disc_char_observer = NULL;
+}
+
STATIC void ble_evt_handler(ble_evt_t *p_ble_evt) {
printf("%s - 0x%02X\r\n", __func__, p_ble_evt->header.evt_id);
@@ -984,35 +1021,7 @@ STATIC void ble_evt_handler(ble_evt_t *p_ble_evt) {
break;
case BLE_GATTC_EVT_CHAR_DISC_RSP:
- BLE_DRIVER_LOG("BLE EVT CHAR DISCOVERY RESPONSE\n");
- BLE_DRIVER_LOG(">>> characteristic count: %d\n", p_ble_evt->evt.gattc_evt.params.char_disc_rsp.count);
-
- for (uint16_t i = 0; i < p_ble_evt->evt.gattc_evt.params.char_disc_rsp.count; i++) {
- ble_gattc_char_t * p_char = &p_ble_evt->evt.gattc_evt.params.char_disc_rsp.chars[i];
-
- ble_drv_char_data_t char_data;
- char_data.uuid_type = p_char->uuid.type;
- char_data.uuid = p_char->uuid.uuid;
- char_data.decl_handle = p_char->handle_decl;
- char_data.value_handle = p_char->handle_value;
-
- char_data.props.broadcast = p_char->char_props.broadcast;
- char_data.props.read = p_char->char_props.read;
- char_data.props.write_wo_resp = p_char->char_props.write_wo_resp;
- char_data.props.write = p_char->char_props.write;
- char_data.props.notify = p_char->char_props.notify;
- char_data.props.indicate = p_char->char_props.indicate;
-
- disc_add_char_handler(mp_gattc_disc_char_observer, &char_data);
- }
-
- if (p_ble_evt->evt.gattc_evt.params.char_disc_rsp.count > 0) {
- m_characteristic_found = true;
- }
-
- // mark end of characteristic discovery
- disc_add_char_handler = NULL;
-
+ on_characteristic_discovery_rsp(&p_ble_evt->evt.gattc_evt.params.char_disc_rsp);
break;
case BLE_GATTC_EVT_READ_RSP:
diff --git a/ports/nrf/drivers/bluetooth/ble_drv.h b/ports/nrf/drivers/bluetooth/ble_drv.h
index 9ac70f97c..e0f95eefe 100644
--- a/ports/nrf/drivers/bluetooth/ble_drv.h
+++ b/ports/nrf/drivers/bluetooth/ble_drv.h
@@ -39,26 +39,10 @@
#include "shared-module/bleio/Scanner.h"
#include "shared-module/bleio/Service.h"
-typedef struct {
- uint16_t uuid;
- uint8_t uuid_type;
- struct {
- bool broadcast : 1;
- bool read : 1;
- bool write_wo_resp : 1;
- bool write : 1;
- bool notify : 1;
- bool indicate : 1;
- } props;
- uint16_t decl_handle;
- uint16_t value_handle;
-} ble_drv_char_data_t;
-
typedef void (*ble_drv_gap_evt_callback_t)(bleio_device_obj_t *device, uint16_t event_id, uint16_t conn_handle, uint16_t length, uint8_t * data);
typedef void (*ble_drv_gatts_evt_callback_t)(bleio_device_obj_t *device, uint16_t event_id, uint16_t attr_handle, uint16_t length, uint8_t * data);
typedef void (*ble_drv_gattc_evt_callback_t)(bleio_device_obj_t *device, uint16_t event_id, uint16_t attr_handle, uint16_t length, uint8_t * data);
typedef void (*ble_drv_adv_evt_callback_t)(bleio_scanner_obj_t *scanner, bleio_scanentry_obj_t *entry);
-typedef void (*ble_drv_disc_add_char_callback_t)(bleio_service_obj_t *service, ble_drv_char_data_t * p_desc_data);
typedef void (*ble_drv_gattc_char_data_callback_t)(bleio_characteristic_obj_t *self, uint16_t length, uint8_t * p_data);
uint32_t ble_drv_stack_enable(void);
@@ -109,7 +93,7 @@ void ble_drv_disconnect(bleio_device_obj_t *device);
bool ble_drv_discover_services(bleio_device_obj_t *device, uint16_t start_handle);
-bool ble_drv_discover_characteristic(bleio_device_obj_t *device, bleio_service_obj_t *service, uint16_t start_handle, ble_drv_disc_add_char_callback_t cb);
+bool ble_drv_discover_characteristic(bleio_device_obj_t *device, bleio_service_obj_t *service, uint16_t start_handle);
void ble_drv_discover_descriptors(void);