From 5f5027e26df14f5af75c0b2365bc7dc3cb98b7b3 Mon Sep 17 00:00:00 2001 From: Rohit Grover Date: Wed, 29 Apr 2015 12:37:16 +0100 Subject: [PATCH] separate out gatt-client functionality into btle_gattc.cpp presently have event handler and lauchServiceDiscovery() --- btle/btle.cpp | 49 ++-------------------- btle/btle_gattc.cpp | 100 ++++++++++++++++++++++++++++++++++++++++++++ btle/btle_gattc.h | 26 ++++++++++++ 3 files changed, 129 insertions(+), 46 deletions(-) create mode 100644 btle/btle_gattc.cpp create mode 100644 btle/btle_gattc.h diff --git a/btle/btle.cpp b/btle/btle.cpp index d88e26d..38c3a80 100644 --- a/btle/btle.cpp +++ b/btle/btle.cpp @@ -24,6 +24,7 @@ #include "ble_conn_params.h" #include "btle_gap.h" +#include "btle_gattc.h" #include "btle_advertising.h" #include "custom/custom_helper.h" @@ -104,6 +105,8 @@ static void btle_handler(ble_evt_t *p_ble_evt) dm_ble_evt_handler(p_ble_evt); + bleGattcEventHandler(p_ble_evt); + /* Custom event handler */ switch (p_ble_evt->header.evt_id) { case BLE_GAP_EVT_CONNECTED: { @@ -174,52 +177,6 @@ static void btle_handler(ble_evt_t *p_ble_evt) break; } - case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP: - switch (p_ble_evt->evt.gattc_evt.gatt_status) { - case BLE_GATT_STATUS_SUCCESS: { - printf("count of primary services: %u; status code %u\r\n", - p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.count, p_ble_evt->evt.gattc_evt.gatt_status); - - unsigned index; - for (index = 0; index < p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.count; index++) { - printf("%x [%u %u]\r\n", - p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index].uuid.uuid, - p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index].handle_range.start_handle, - p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index].handle_range.end_handle); - - ble_gattc_handle_range_t handleRange = { - .start_handle = p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index].handle_range.start_handle, - .end_handle = p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index].handle_range.end_handle - }; - printf("characteristics_discover returned %u\r\n", - sd_ble_gattc_characteristics_discover(p_ble_evt->evt.gattc_evt.conn_handle, &handleRange)); - } - printf("services discover returned %u\r\n", - sd_ble_gattc_primary_services_discover(p_ble_evt->evt.gattc_evt.conn_handle, - p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index -1].handle_range.end_handle, - NULL)); - break; - } - case BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND: { - printf("end of service discovery\r\n"); - break; - } - default: { - printf("gatt failure status: %u\r\n", p_ble_evt->evt.gattc_evt.gatt_status); - break; - } - } - break; - - case BLE_GATTC_EVT_CHAR_DISC_RSP: { - switch (p_ble_evt->evt.gattc_evt.gatt_status) { - default: - printf("gatt failure status: %u\r\n", p_ble_evt->evt.gattc_evt.gatt_status); - break; - } - break; - } - default: break; } diff --git a/btle/btle_gattc.cpp b/btle/btle_gattc.cpp new file mode 100644 index 0000000..06da7e5 --- /dev/null +++ b/btle/btle_gattc.cpp @@ -0,0 +1,100 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "btle_gattc.h" + +#define BLE_DB_DISCOVERY_MAX_SRV 4 /**< Maximum number of services supported by this module. This also indicates the maximum number of users allowed to be registered to this module. (one user per service). */ +#define BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV 4 /**< Maximum number of characteristics per service supported by this module. */ + +#define SRV_DISC_START_HANDLE 0x0001 /**< The start handle value used during service discovery. */ + + +/**@brief Structure for holding information about the service and the characteristics found during + * the discovery process. + */ +typedef struct +{ + ble_uuid_t srvUUID; /**< UUID of the service. */ + // uint8_t char_count; /**< Number of characteristics present in the service. */ + // ble_db_discovery_char_t charateristics[BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV]; /**< Array of information related to the characteristics present in the service. */ + ble_gattc_handle_range_t handleRange; /**< Service Handle Range. */ +} ble_db_discovery_srv_t; + +typedef struct +{ + ble_db_discovery_srv_t services[BLE_DB_DISCOVERY_MAX_SRV]; /**< Information related to the current service being discovered. This is intended for internal use during service discovery.*/ + uint16_t connHandle; /**< Connection handle as provided by the SoftDevice. */ + uint8_t srvCount; /**< Number of services at the peers GATT database.*/ + // uint8_t currCharInd; /**< Index of the current characteristic being discovered. This is intended for internal use during service discovery.*/ + uint8_t currSrvInd; /**< Index of the current service being discovered. This is intended for internal use during service discovery.*/ + // bool discoveryInProgress; /**< Variable to indicate if there is a service discovery in progress. */ +} ble_db_discovery_t; + +void launchServiceDiscovery(Gap::Handle_t connectionHandle) +{ + // printf("connectionHandle %u\r\n", connectionHandle); + printf("launch service discovery returned %u\r\n", sd_ble_gattc_primary_services_discover(connectionHandle, SRV_DISC_START_HANDLE, NULL)); +} + +void bleGattcEventHandler(const ble_evt_t *p_ble_evt) +{ + switch (p_ble_evt->header.evt_id) { + case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP: + switch (p_ble_evt->evt.gattc_evt.gatt_status) { + case BLE_GATT_STATUS_SUCCESS: { + printf("count of primary services: %u\r\n", p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.count); + + unsigned index; + for (index = 0; index < p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.count; index++) { + printf("%x [%u %u]\r\n", + p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index].uuid.uuid, + p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index].handle_range.start_handle, + p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index].handle_range.end_handle); + + ble_gattc_handle_range_t handleRange = { + .start_handle = p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index].handle_range.start_handle, + .end_handle = p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index].handle_range.end_handle + }; + printf("characteristics_discover returned %u\r\n", + sd_ble_gattc_characteristics_discover(p_ble_evt->evt.gattc_evt.conn_handle, &handleRange)); + } + printf("services discover returned %u\r\n", + sd_ble_gattc_primary_services_discover(p_ble_evt->evt.gattc_evt.conn_handle, + p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp.services[index -1].handle_range.end_handle, + NULL)); + break; + } + case BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND: { + printf("end of service discovery\r\n"); + break; + } + default: { + printf("gatt failure status: %u\r\n", p_ble_evt->evt.gattc_evt.gatt_status); + break; + } + } + break; + + case BLE_GATTC_EVT_CHAR_DISC_RSP: { + switch (p_ble_evt->evt.gattc_evt.gatt_status) { + default: + printf("gatt failure status: %u\r\n", p_ble_evt->evt.gattc_evt.gatt_status); + break; + } + break; + } + } +} diff --git a/btle/btle_gattc.h b/btle/btle_gattc.h new file mode 100644 index 0000000..8aa74f0 --- /dev/null +++ b/btle/btle_gattc.h @@ -0,0 +1,26 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _BTLE_GATTC_H_ +#define _BTLE_GATTC_H_ + +#include "btle.h" +#include "Gap.h" + +void launchServiceDiscovery(Gap::Handle_t connectionHandle); +void bleGattcEventHandler(const ble_evt_t *p_ble_evt); + +#endif // ifndef _BTLE_GATTC_H_