btif_gatt_test.cc revision 6bd442f543972b072ef2cbbcf2f7c91202de1045
1ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************
2ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *
3ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  Copyright (C) 2009-2013 Broadcom Corporation
4ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *
5ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  Licensed under the Apache License, Version 2.0 (the "License");
6ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  you may not use this file except in compliance with the License.
7ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  You may obtain a copy of the License at:
8ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *
9ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  http://www.apache.org/licenses/LICENSE-2.0
10ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *
11ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  Unless required by applicable law or agreed to in writing, software
12ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  distributed under the License is distributed on an "AS IS" BASIS,
13ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  See the License for the specific language governing permissions and
15ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  limitations under the License.
16ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *
17ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ******************************************************************************/
18ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1949a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#define LOG_TAG "bt_btif_gatt"
20ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2149a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include <errno.h>
22ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include <stdio.h>
23ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include <stdlib.h>
24ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include <string.h>
25ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
26db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <hardware/bluetooth.h>
27db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <hardware/bt_gatt.h>
28ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
29ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btif_common.h"
30ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btif_util.h"
31ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
32b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen#if (BLE_INCLUDED == TRUE)
33ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
34ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "bta_gatt_api.h"
35ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "bte_appl.h"
36db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "btif_dm.h"
37ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btif_gatt.h"
38ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btif_gatt_util.h"
39db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "btif_storage.h"
40ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "gatt_api.h"
4144802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#include "osi/include/log.h"
42ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
43ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
44ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Typedefs & Macros
45ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *******************************************************************************/
46ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsontypedef struct {
486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  tGATT_IF gatt_if;
496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  uint16_t conn_id;
50ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} btif_test_cb_t;
51ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
52ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
53ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Static variables
54ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *******************************************************************************/
55ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic const char* disc_name[GATT_DISC_MAX] = {"Unknown",
576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                               "GATT_DISC_SRVC_ALL",
586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                               "GATT_DISC_SRVC_BY_UUID",
596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                               "GATT_DISC_INC_SRVC",
606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                               "GATT_DISC_CHAR",
616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                               "GATT_DISC_CHAR_DSCPT"};
62ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
63ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic btif_test_cb_t test_cb;
64ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
65ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
66ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Callback functions
67ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *******************************************************************************/
68ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic char* format_uuid(tBT_UUID bt_uuid, char* str_buf, size_t buf_size) {
706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (bt_uuid.len == LEN_UUID_16) {
716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    snprintf(str_buf, buf_size, "0x%04x", bt_uuid.uu.uuid16);
726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  } else if (bt_uuid.len == LEN_UUID_128) {
736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    int x = snprintf(str_buf, buf_size, "%02x%02x%02x%02x-%02x%02x-%02x%02x",
746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                     bt_uuid.uu.uuid128[15], bt_uuid.uu.uuid128[14],
756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                     bt_uuid.uu.uuid128[13], bt_uuid.uu.uuid128[12],
766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                     bt_uuid.uu.uuid128[11], bt_uuid.uu.uuid128[10],
776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                     bt_uuid.uu.uuid128[9], bt_uuid.uu.uuid128[8]);
786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    snprintf(&str_buf[x], buf_size - x, "%02x%02x-%02x%02x%02x%02x%02x%02x",
796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson             bt_uuid.uu.uuid128[7], bt_uuid.uu.uuid128[6],
806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson             bt_uuid.uu.uuid128[5], bt_uuid.uu.uuid128[4],
816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson             bt_uuid.uu.uuid128[3], bt_uuid.uu.uuid128[2],
826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson             bt_uuid.uu.uuid128[1], bt_uuid.uu.uuid128[0]);
836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  } else {
846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    snprintf(str_buf, buf_size, "Unknown (len=%d)", bt_uuid.len);
856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return str_buf;
88ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
89ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic void btif_test_connect_cback(tGATT_IF gatt_if, BD_ADDR bda,
916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                    uint16_t conn_id, bool connected,
926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                    tGATT_DISCONN_REASON reason,
936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                    tBT_TRANSPORT transport) {
946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  UNUSED(gatt_if);
956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  UNUSED(bda);
966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  UNUSED(reason);
976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  UNUSED(transport);
986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  LOG_DEBUG(LOG_TAG, "%s: conn_id=%d, connected=%d", __func__, conn_id,
1006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson            connected);
1016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  test_cb.conn_id = connected ? conn_id : 0;
102ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
103ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
104b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssenstatic void btif_test_command_complete_cback(uint16_t conn_id, tGATTC_OPTYPE op,
1056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                             tGATT_STATUS status,
1066bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                             tGATT_CL_COMPLETE* p_data) {
1076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  LOG_DEBUG(LOG_TAG, "%s: op_code=0x%02x, conn_id=0x%x. status=0x%x", __func__,
1086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson            op, conn_id, status);
1096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
1106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  switch (op) {
1116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case GATTC_OPTYPE_READ:
1126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case GATTC_OPTYPE_WRITE:
1136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case GATTC_OPTYPE_CONFIG:
1146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case GATTC_OPTYPE_EXE_WRITE:
1156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case GATTC_OPTYPE_NOTIFICATION:
1166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
1176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
1186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case GATTC_OPTYPE_INDICATION:
1196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      GATTC_SendHandleValueConfirm(conn_id, p_data->handle);
1206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
1216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
1226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    default:
1236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      LOG_DEBUG(LOG_TAG, "%s: Unknown op_code (0x%02x)", __func__, op);
1246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
1256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
126ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
127ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic void btif_test_discovery_result_cback(uint16_t conn_id,
1296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                             tGATT_DISC_TYPE disc_type,
1306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                             tGATT_DISC_RES* p_data) {
1316bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  char str_buf[50];
1326bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  UNUSED(conn_id);
1336bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
1346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  LOG_DEBUG(LOG_TAG, "------ GATT Discovery result %-22s -------",
1356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson            disc_name[disc_type]);
1366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  LOG_DEBUG(LOG_TAG, "      Attribute handle: 0x%04x (%d)", p_data->handle,
1376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson            p_data->handle);
1386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
1396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (disc_type != GATT_DISC_CHAR_DSCPT) {
1406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    LOG_DEBUG(LOG_TAG, "        Attribute type: %s",
1416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson              format_uuid(p_data->type, str_buf, sizeof(str_buf)));
1426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
1436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
1446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  switch (disc_type) {
1456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case GATT_DISC_SRVC_ALL:
1466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      LOG_DEBUG(LOG_TAG, "          Handle range: 0x%04x ~ 0x%04x (%d ~ %d)",
1476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                p_data->handle, p_data->value.group_value.e_handle,
1486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                p_data->handle, p_data->value.group_value.e_handle);
1496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      LOG_DEBUG(LOG_TAG, "          Service UUID: %s",
1506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                format_uuid(p_data->value.group_value.service_type, str_buf,
1516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                            sizeof(str_buf)));
1526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
1536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
1546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case GATT_DISC_SRVC_BY_UUID:
1556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      LOG_DEBUG(LOG_TAG, "          Handle range: 0x%04x ~ 0x%04x (%d ~ %d)",
1566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                p_data->handle, p_data->value.handle, p_data->handle,
1576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                p_data->value.handle);
1586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
1596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
1606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case GATT_DISC_INC_SRVC:
1616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      LOG_DEBUG(LOG_TAG, "          Handle range: 0x%04x ~ 0x%04x (%d ~ %d)",
1626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                p_data->value.incl_service.s_handle,
1636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                p_data->value.incl_service.e_handle,
1646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                p_data->value.incl_service.s_handle,
1656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                p_data->value.incl_service.e_handle);
1666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      LOG_DEBUG(LOG_TAG, "          Service UUID: %s",
1676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                format_uuid(p_data->value.incl_service.service_type, str_buf,
1686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                            sizeof(str_buf)));
1696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
1706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
1716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case GATT_DISC_CHAR:
1726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      LOG_DEBUG(LOG_TAG, "            Properties: 0x%02x",
1736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                p_data->value.dclr_value.char_prop);
1746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      LOG_DEBUG(LOG_TAG, "   Characteristic UUID: %s",
1756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                format_uuid(p_data->value.dclr_value.char_uuid, str_buf,
1766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                            sizeof(str_buf)));
1776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
1786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
1796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case GATT_DISC_CHAR_DSCPT:
1806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      LOG_DEBUG(LOG_TAG, "       Descriptor UUID: %s",
1816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                format_uuid(p_data->type, str_buf, sizeof(str_buf)));
1826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
1836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
1846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
1856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  LOG_DEBUG(LOG_TAG,
1866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson            "-----------------------------------------------------------");
187ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
188ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
189b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssenstatic void btif_test_discovery_complete_cback(uint16_t conn_id,
190ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                               tGATT_DISC_TYPE disc_type,
1916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                               tGATT_STATUS status) {
1926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  UNUSED(conn_id);
1936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  UNUSED(disc_type);
1946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  LOG_DEBUG(LOG_TAG, "%s: status=%d", __func__, status);
195ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
196ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic tGATT_CBACK btif_test_callbacks = {btif_test_connect_cback,
1986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                          btif_test_command_complete_cback,
1996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                          btif_test_discovery_result_cback,
2006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                          btif_test_discovery_complete_cback,
2016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                          NULL,
2026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                          NULL,
2036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                          NULL};
204ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
205ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
206ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Implementation
207ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *******************************************************************************/
208ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_gattc_test_command_impl(int command,
2106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                         btgatt_test_params_t* params) {
2116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  switch (command) {
2126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case 0x01: /* Enable */
2136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    {
2146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      LOG_DEBUG(LOG_TAG, "%s: ENABLE - enable=%d", __func__, params->u1);
2156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      if (params->u1) {
2166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        tBT_UUID app_uuid = {LEN_UUID_128, {0xAE}};
2176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        test_cb.gatt_if = GATT_Register(&app_uuid, &btif_test_callbacks);
2186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        GATT_StartIf(test_cb.gatt_if);
2196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      } else {
2206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        GATT_Deregister(test_cb.gatt_if);
2216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        test_cb.gatt_if = 0;
2226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      }
2236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
2246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    }
2256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
2266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case 0x02: /* Connect */
2276bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    {
2286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      LOG_DEBUG(LOG_TAG,
2296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                "%s: CONNECT - device=%02x:%02x:%02x:%02x:%02x:%02x "
2306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                "(dev_type=%d, addr_type=%d)",
2316bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                __func__, params->bda1->address[0], params->bda1->address[1],
232ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                params->bda1->address[2], params->bda1->address[3],
2336bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                params->bda1->address[4], params->bda1->address[5], params->u1,
2346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                params->u2);
2356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
2366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      if (params->u1 == BT_DEVICE_TYPE_BLE)
2376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        BTM_SecAddBleDevice(params->bda1->address, NULL, BT_DEVICE_TYPE_BLE,
2386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                            params->u2);
2396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
2406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      if (!GATT_Connect(test_cb.gatt_if, params->bda1->address, true,
2416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                        BT_TRANSPORT_LE, false)) {
2426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        LOG_ERROR(LOG_TAG, "%s: GATT_Connect failed!", __func__);
2436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      }
2446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
245ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
2466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
2476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case 0x03: /* Disconnect */
2486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    {
2496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      LOG_DEBUG(LOG_TAG, "%s: DISCONNECT - conn_id=%d", __func__,
2506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                test_cb.conn_id);
2516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      GATT_Disconnect(test_cb.conn_id);
2526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
2536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    }
2546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
2556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case 0x04: /* Discover */
2566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    {
2576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      char buf[50] = {0};
2586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      tGATT_DISC_PARAM param;
2596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      memset(&param, 0, sizeof(tGATT_DISC_PARAM));
2606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
2616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      if (params->u1 >= GATT_DISC_MAX) {
2626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        LOG_ERROR(LOG_TAG, "%s: DISCOVER - Invalid type (%d)!", __func__,
2636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                  params->u1);
2646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        return (bt_status_t)0;
2656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      }
2666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
2676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      param.s_handle = params->u2;
2686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      param.e_handle = params->u3;
2696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      btif_to_bta_uuid(&param.service, params->uuid1);
2706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
2716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      LOG_DEBUG(LOG_TAG,
2726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                "%s: DISCOVER (%s), conn_id=%d, uuid=%s, handles=0x%04x-0x%04x",
2736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                __func__, disc_name[params->u1], test_cb.conn_id,
2746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                format_uuid(param.service, buf, sizeof(buf)), params->u2,
2756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                params->u3);
2766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      GATTC_Discover(test_cb.conn_id, params->u1, &param);
2776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
2786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    }
2796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
2806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case 0xF0: /* Pairing configuration */
2816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      LOG_DEBUG(LOG_TAG,
2826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                "%s: Setting pairing config auth=%d, iocaps=%d, keys=%d/%d/%d",
2836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                __func__, params->u1, params->u2, params->u3, params->u4,
2846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                params->u5);
2856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
2866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      bte_appl_cfg.ble_auth_req = params->u1;
2876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      bte_appl_cfg.ble_io_cap = params->u2;
2886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      bte_appl_cfg.ble_init_key = params->u3;
2896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      bte_appl_cfg.ble_resp_key = params->u4;
2906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      bte_appl_cfg.ble_max_key_size = params->u5;
2916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
2926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
2936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    default:
2946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      LOG_ERROR(LOG_TAG, "%s: UNKNOWN TEST COMMAND 0x%02x", __func__, command);
2956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
2966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
2976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return (bt_status_t)0;
298ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
299ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
300ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
301