From 6545aa99a9d86f4e93a89bee75ecd04e17bed3d2 Mon Sep 17 00:00:00 2001 From: arturo182 Date: Thu, 19 Jul 2018 22:59:18 +0200 Subject: nrf: Remove the ble drv specific characteristic struct --- ports/nrf/common-hal/bleio/Device.c | 32 +-------------- ports/nrf/drivers/bluetooth/ble_drv.c | 75 ++++++++++++++++++++--------------- ports/nrf/drivers/bluetooth/ble_drv.h | 18 +-------- 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); -- cgit v1.2.3