btif_gatt_test.c revision b804e2114b4e9c2d2481d62538f4d450d7b67128
1497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker/******************************************************************************
2497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *
3497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *  Copyright (C) 2009-2013 Broadcom Corporation
4497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *
5497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *  Licensed under the Apache License, Version 2.0 (the "License");
6497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *  you may not use this file except in compliance with the License.
7497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *  You may obtain a copy of the License at:
8497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *
9497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *  http://www.apache.org/licenses/LICENSE-2.0
10497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *
11497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *  Unless required by applicable law or agreed to in writing, software
12497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *  distributed under the License is distributed on an "AS IS" BASIS,
13497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *  See the License for the specific language governing permissions and
15497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *  limitations under the License.
16497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *
17c7a11b2208aa8f1e6a39eb70a136fbc0dafd3260Marco Nelissen ******************************************************************************/
18497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
19497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
20497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker#include <hardware/bluetooth.h>
21497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker#include <hardware/bt_gatt.h>
22497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker#include <stdio.h>
23497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker#include <stdlib.h>
24497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker#include <errno.h>
25497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker#include <string.h>
26497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
27497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker#define LOG_TAG "BtGatt.btif_test"
28497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
29497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker#include "btif_common.h"
30497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker#include "btif_util.h"
31497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
32497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
33497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
34497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker#include "bta_api.h"
35497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker#include "bta_gatt_api.h"
36497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker#include "bd.h"
37497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker#include "btif_storage.h"
383305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker#include "bte_appl.h"
393305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker
403305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker#include "btif_gatt.h"
413305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker#include "btif_gatt_util.h"
423305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker#include "btif_dm.h"
433305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker
443305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker#include "gatt_api.h"
453305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker
463305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker/*******************************************************************************
473305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker * Typedefs & Macros
483305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker *******************************************************************************/
49497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
50497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinkertypedef struct
51497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker{
52497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    tGATT_IF    gatt_if;
53497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    UINT16      conn_id;
54497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker} btif_test_cb_t;
55497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
56497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker/*******************************************************************************
57497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker * Static variables
58497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *******************************************************************************/
59497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
603305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinkerstatic const char * disc_name[GATT_DISC_MAX] =
61497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker{
62497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    "Unknown",
633305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    "GATT_DISC_SRVC_ALL",
643305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    "GATT_DISC_SRVC_BY_UUID",
653305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    "GATT_DISC_INC_SRVC",
663305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    "GATT_DISC_CHAR",
673305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    "GATT_DISC_CHAR_DSCPT"
683305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker};
693305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker
703305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinkerstatic btif_test_cb_t test_cb;
713305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker
723305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker/*******************************************************************************
733305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker * Callback functions
743305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker *******************************************************************************/
753305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker
763305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinkerstatic char * format_uuid(tBT_UUID bt_uuid, char *str_buf)
773305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker{
783305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    int x = 0;
793305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker
803305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    if (bt_uuid.len == LEN_UUID_16)
813305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    {
823305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker        sprintf(str_buf, "0x%04x", bt_uuid.uu.uuid16);
833305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    }
843305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    else if (bt_uuid.len == LEN_UUID_128)
853305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    {
863305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker        x += sprintf(&str_buf[x], "%02x%02x%02x%02x-%02x%02x-%02x%02x",
873305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker                bt_uuid.uu.uuid128[15], bt_uuid.uu.uuid128[14],
883305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker                bt_uuid.uu.uuid128[13], bt_uuid.uu.uuid128[12],
893305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker                bt_uuid.uu.uuid128[11], bt_uuid.uu.uuid128[10],
903305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker                bt_uuid.uu.uuid128[9], bt_uuid.uu.uuid128[8]);
913305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker        sprintf(&str_buf[x], "%02x%02x-%02x%02x%02x%02x%02x%02x",
923305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker                bt_uuid.uu.uuid128[7], bt_uuid.uu.uuid128[6],
933305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker                bt_uuid.uu.uuid128[5], bt_uuid.uu.uuid128[4],
943305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker                bt_uuid.uu.uuid128[3], bt_uuid.uu.uuid128[2],
953305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker                bt_uuid.uu.uuid128[1], bt_uuid.uu.uuid128[0]);
963305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    }
973305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    else
983305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker        sprintf(str_buf, "Unknown (len=%d)", bt_uuid.len);
993305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker
1003305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    return str_buf;
1013305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker}
1023305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker
1033305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinkerstatic void btif_test_connect_cback(tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
10418a1b5904b352cedef29b95169a1226140d38576Marco Nelissen                                    BOOLEAN connected, tGATT_DISCONN_REASON reason, tBT_TRANSPORT transport)
1053305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker{
1063305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    UNUSED(gatt_if);
1073305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    UNUSED(bda);
1083305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    UNUSED(reason);
1093305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker    UNUSED (transport);
1103305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker
111497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    ALOGD("%s: conn_id=%d, connected=%d", __FUNCTION__, conn_id, connected);
112497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    test_cb.conn_id = connected ? conn_id : 0;
113e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen}
114e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen
115497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinkerstatic void btif_test_command_complete_cback(UINT16 conn_id, tGATTC_OPTYPE op,
116497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                                tGATT_STATUS status, tGATT_CL_COMPLETE *p_data)
117e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen{
118497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    ALOGD ("%s: op_code=0x%02x, conn_id=0x%x. status=0x%x",
119497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            __FUNCTION__, op, conn_id, status);
120e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen
121497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    switch (op)
122497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    {
123e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen        case GATTC_OPTYPE_READ:
124497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        case GATTC_OPTYPE_WRITE:
125497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        case GATTC_OPTYPE_CONFIG:
126e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen        case GATTC_OPTYPE_EXE_WRITE:
127497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        case GATTC_OPTYPE_NOTIFICATION:
128497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            break;
129e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen
130497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        case GATTC_OPTYPE_INDICATION:
131497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            GATTC_SendHandleValueConfirm(conn_id, p_data->handle);
132e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen            break;
133497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
134497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        default:
135e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen            ALOGD ("%s: Unknown op_code (0x%02x)", __FUNCTION__, op);
136497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            break;
137497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    }
138e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen}
139497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
140497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
141e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenstatic void btif_test_discovery_result_cback(UINT16 conn_id, tGATT_DISC_TYPE disc_type,
142497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                                           tGATT_DISC_RES *p_data)
143497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker{
144497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    char    str_buf[50];
145497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    UNUSED(conn_id);
146497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
147497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    ALOGD("------ GATT Discovery result %-22s -------", disc_name[disc_type]);
148497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    ALOGD("      Attribute handle: 0x%04x (%d)", p_data->handle, p_data->handle);
149497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
150497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    if (disc_type != GATT_DISC_CHAR_DSCPT) {
151497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        ALOGD("        Attribute type: %s", format_uuid(p_data->type, str_buf));
152497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    }
153497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
154497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    switch (disc_type)
155497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    {
156497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        case GATT_DISC_SRVC_ALL:
157497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            ALOGD("          Handle range: 0x%04x ~ 0x%04x (%d ~ %d)",
158497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                  p_data->handle, p_data->value.group_value.e_handle,
159497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                  p_data->handle, p_data->value.group_value.e_handle);
160497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            ALOGD("          Service UUID: %s",
161497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                    format_uuid(p_data->value.group_value.service_type, str_buf));
162497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            break;
163497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
164497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        case GATT_DISC_SRVC_BY_UUID:
165497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            ALOGD("          Handle range: 0x%04x ~ 0x%04x (%d ~ %d)",
166497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                  p_data->handle, p_data->value.handle,
167497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                  p_data->handle, p_data->value.handle);
168497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            break;
169497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
170497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        case GATT_DISC_INC_SRVC:
171497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            ALOGD("          Handle range: 0x%04x ~ 0x%04x (%d ~ %d)",
172497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                  p_data->value.incl_service.s_handle, p_data->value.incl_service.e_handle,
173497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                  p_data->value.incl_service.s_handle, p_data->value.incl_service.e_handle);
174497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            ALOGD("          Service UUID: %s",
175497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                  format_uuid(p_data->value.incl_service.service_type, str_buf));
176497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            break;
177497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
178497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        case GATT_DISC_CHAR:
179497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            ALOGD("            Properties: 0x%02x",
180497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                  p_data->value.dclr_value.char_prop);
181497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            ALOGD("   Characteristic UUID: %s",
182497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                  format_uuid(p_data->value.dclr_value.char_uuid, str_buf));
183497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            break;
184497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
185497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        case GATT_DISC_CHAR_DSCPT:
186497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            ALOGD("       Descriptor UUID: %s", format_uuid(p_data->type, str_buf));
187497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            break;
1883425fd5a55dd31e261d2f2a9590c762d6d0a6b79Marco Nelissen    }
189497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
190497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    ALOGD("-----------------------------------------------------------");
191497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker}
192497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
193497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinkerstatic void btif_test_discovery_complete_cback(UINT16 conn_id,
194497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                                               tGATT_DISC_TYPE disc_type,
195497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                                               tGATT_STATUS status)
196497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker{
197497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    UNUSED(conn_id);
198497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    UNUSED(disc_type);
199497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    ALOGD("%s: status=%d", __FUNCTION__, status);
2003425fd5a55dd31e261d2f2a9590c762d6d0a6b79Marco Nelissen}
201497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
202497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinkerstatic tGATT_CBACK btif_test_callbacks =
203497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker{
204497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    btif_test_connect_cback ,
205497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    btif_test_command_complete_cback,
206497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    btif_test_discovery_result_cback,
2073425fd5a55dd31e261d2f2a9590c762d6d0a6b79Marco Nelissen    btif_test_discovery_complete_cback,
208497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    NULL,
209497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    NULL
210497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker};
211497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
212497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker/*******************************************************************************
213497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker * Implementation
214497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker *******************************************************************************/
215497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
216497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinkerbt_status_t btif_gattc_test_command_impl(uint16_t command, btgatt_test_params_t* params)
2173305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker{
2187c96d53a65085f42ac2b6d416cbc16fd36ed72ffMarco Nelissen    switch(command) {
2193305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker        case 0x01: /* Enable */
2207c96d53a65085f42ac2b6d416cbc16fd36ed72ffMarco Nelissen        {
2213305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker            ALOGD("%s: ENABLE - enable=%d", __FUNCTION__, params->u1);
2223305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker            if (params->u1)
2233305b99ec3804c740aecd2ab6d1edd5c6137b7c6Jeff Tinker            {
2247c96d53a65085f42ac2b6d416cbc16fd36ed72ffMarco Nelissen                tBT_UUID app_uuid = {LEN_UUID_128,{0xAE}};
225497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                test_cb.gatt_if = GATT_Register(&app_uuid, &btif_test_callbacks);
226497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                GATT_StartIf(test_cb.gatt_if);
227497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            } else {
228497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                GATT_Deregister(test_cb.gatt_if);
229497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                test_cb.gatt_if = 0;
230497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            }
231497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            break;
232497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        }
233497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
234497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        case 0x02: /* Connect */
235497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        {
236497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            ALOGD("%s: CONNECT - device=%02x:%02x:%02x:%02x:%02x:%02x (dev_type=%d, addr_type=%d)",
237497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                __FUNCTION__,
2383425fd5a55dd31e261d2f2a9590c762d6d0a6b79Marco Nelissen                params->bda1->address[0], params->bda1->address[1],
23918a1b5904b352cedef29b95169a1226140d38576Marco Nelissen                params->bda1->address[2], params->bda1->address[3],
240497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                params->bda1->address[4], params->bda1->address[5],
241e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen                params->u1, params->u2);
242497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
24318a1b5904b352cedef29b95169a1226140d38576Marco Nelissen            if (params->u1 == BT_DEVICE_TYPE_BLE)
24418a1b5904b352cedef29b95169a1226140d38576Marco Nelissen                BTM_SecAddBleDevice(params->bda1->address, NULL, BT_DEVICE_TYPE_BLE, params->u2);
24518a1b5904b352cedef29b95169a1226140d38576Marco Nelissen
246497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            if ( !GATT_Connect(test_cb.gatt_if, params->bda1->address, TRUE, BT_TRANSPORT_LE) )
247497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            {
248497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                ALOGE("%s: GATT_Connect failed!", __FUNCTION__);
249497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            }
250497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            break;
25118a1b5904b352cedef29b95169a1226140d38576Marco Nelissen        }
25218a1b5904b352cedef29b95169a1226140d38576Marco Nelissen
253497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        case 0x03: /* Disconnect */
254e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen        {
255497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            ALOGD("%s: DISCONNECT - conn_id=%d", __FUNCTION__, test_cb.conn_id);
256497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            GATT_Disconnect(test_cb.conn_id);
2573425fd5a55dd31e261d2f2a9590c762d6d0a6b79Marco Nelissen            break;
25818a1b5904b352cedef29b95169a1226140d38576Marco Nelissen        }
259497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
260e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen        case 0x04: /* Discover */
261497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        {
26218a1b5904b352cedef29b95169a1226140d38576Marco Nelissen            char buf[50] = {0};
26318a1b5904b352cedef29b95169a1226140d38576Marco Nelissen            tGATT_DISC_PARAM        param;
26418a1b5904b352cedef29b95169a1226140d38576Marco Nelissen            memset(&param, 0, sizeof(tGATT_DISC_PARAM));
265497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
266497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            if (params->u1 >= GATT_DISC_MAX)
26718a1b5904b352cedef29b95169a1226140d38576Marco Nelissen            {
268e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen                ALOGE("%s: DISCOVER - Invalid type (%d)!", __FUNCTION__, params->u1);
269497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                return 0;
270497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            }
271497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
272e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen            param.s_handle = params->u2;
273497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            param.e_handle = params->u3;
274497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            btif_to_bta_uuid(&param.service, params->uuid1);
2753425fd5a55dd31e261d2f2a9590c762d6d0a6b79Marco Nelissen
27618a1b5904b352cedef29b95169a1226140d38576Marco Nelissen            ALOGD("%s: DISCOVER (%s), conn_id=%d, uuid=%s, handles=0x%04x-0x%04x",
277497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                  __FUNCTION__, disc_name[params->u1], test_cb.conn_id,
278497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                  format_uuid(param.service, buf), params->u2, params->u3);
27918a1b5904b352cedef29b95169a1226140d38576Marco Nelissen            GATTC_Discover(test_cb.conn_id, params->u1, &param);
280497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            break;
281497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        }
282e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen
283497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        case 0xF0: /* Pairing configuration */
28418a1b5904b352cedef29b95169a1226140d38576Marco Nelissen            ALOGD("%s: Setting pairing config auth=%d, iocaps=%d, keys=%d/%d/%d",
285e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen                  __FUNCTION__, params->u1, params->u2, params->u3, params->u4,
286497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker                  params->u5);
287497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
288497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            bte_appl_cfg.ble_auth_req = params->u1;
28918a1b5904b352cedef29b95169a1226140d38576Marco Nelissen            bte_appl_cfg.ble_io_cap = params->u2;
290e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen            bte_appl_cfg.ble_init_key = params->u3;
291497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            bte_appl_cfg.ble_resp_key = params->u4;
292497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            bte_appl_cfg.ble_max_key_size = params->u5;
293497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            break;
294497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
295497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker        default:
296497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            ALOGE("%s: UNKNOWN TEST COMMAND 0x%02x", __FUNCTION__, command);
297497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker            break;
298497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    }
299497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker    return 0;
300497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker}
301497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker
302497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker#endif
303497ca097bf373ac69405131bd257915c97b31dc0Jeff Tinker