1dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie/******************************************************************************
2dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie *
3dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie *  Copyright (C) 2009-2013 Broadcom Corporation
4dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie *
5dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie *  Licensed under the Apache License, Version 2.0 (the "License");
6dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie *  you may not use this file except in compliance with the License.
7dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie *  You may obtain a copy of the License at:
8dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie *
9dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie *  http://www.apache.org/licenses/LICENSE-2.0
10dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie *
11dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie *  Unless required by applicable law or agreed to in writing, software
12dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie *  distributed under the License is distributed on an "AS IS" BASIS,
13dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie *  See the License for the specific language governing permissions and
15dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie *  limitations under the License.
16dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie *
17dbba0e652e0ce23dd691df3c03979ec6e32c8db3Matthew Xie ******************************************************************************/
182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "bta_api.h"
202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "bta_hh_int.h"
212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE)
232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "bta_api.h"
252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include <string.h>
262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "btm_api.h"
272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "btm_ble_api.h"
282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "bta_hh_co.h"
292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "bta_gatt_api.h"
302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "srvc_api.h"
312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#ifndef BTA_HH_LE_RECONN
332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_RECONN    TRUE
342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_APP_ID_LE            0xff
372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_RPT_TYPE_VALID(x)     ((x) <= BTA_LE_HID_RPT_FEATURE && (x)>=BTA_LE_HID_RPT_INPUT)
392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_RPT_INST_ID_MAP(s,c)  (UINT8)(((s)<<4)||(c))
412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_RPT_GET_SRVC_INST_ID(x)  (UINT8)(x  >> 4)
422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_RPT_GET_RPT_INST_ID(x)  (UINT8)(x & 0x0f)
432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_PROTO_BOOT_MODE      0x00
462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_PROTO_REPORT_MODE      0x01
472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_SCPP_INST_DEF            0
492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_DISC_CHAR_NUM     8
512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic const UINT16 bta_hh_le_disc_char_uuid[BTA_HH_LE_DISC_CHAR_NUM] =
522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    GATT_UUID_HID_INFORMATION,
542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    GATT_UUID_HID_REPORT_MAP,
552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    GATT_UUID_HID_CONTROL_POINT,
562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    GATT_UUID_HID_REPORT,
572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    GATT_UUID_HID_BT_KB_INPUT,
582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    GATT_UUID_HID_BT_KB_OUTPUT,
592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    GATT_UUID_HID_BT_MOUSE_INPUT,
602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    GATT_UUID_HID_PROTO_MODE        /* always make sure this is the last attribute to discover */
612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach};
622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_LE_HID_RTP_UUID_MAX     5
642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic const UINT16 bta_hh_uuid_to_rtp_type[BTA_LE_HID_RTP_UUID_MAX][2] =
652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {GATT_UUID_HID_REPORT,       BTA_HH_RPTT_INPUT},
672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {GATT_UUID_HID_BT_KB_INPUT,  BTA_HH_RPTT_INPUT},
682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {GATT_UUID_HID_BT_KB_OUTPUT, BTA_HH_RPTT_OUTPUT},
692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {GATT_UUID_HID_BT_MOUSE_INPUT, BTA_HH_RPTT_INPUT},
702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {GATT_UUID_BATTERY_LEVEL,      BTA_HH_RPTT_INPUT}
712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach};
722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data);
752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_search_hid_chars(tBTA_HH_DEV_CB *p_dev_cb);
762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_search_hid_included(tBTA_HH_DEV_CB *p_dev_cb);
772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_search_scps(tBTA_HH_DEV_CB *p_cb);
782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_search_scps_chars(tBTA_HH_DEV_CB *p_cb);
792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_register_scpp_notif(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATT_STATUS status);
802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_register_scpp_notif_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATT_STATUS status);
812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_add_dev_bg_conn(tBTA_HH_DEV_CB *p_cb, BOOLEAN check_bond);
822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#define BTA_HH_LE_SRVC_DEF      0
842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE
862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic const char *bta_hh_le_rpt_name[4] =
872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    "UNKNOWN",
892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    "INPUT",
902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    "OUTPUT",
912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    "FEATURE"
922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach};
932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_hid_report_dbg
972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      debug function to print out all HID report available on remote
992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  device.
1002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
1022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
1042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_hid_report_dbg(tBTA_HH_DEV_CB *p_cb)
1052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
1062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8 i , j;
1072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_RPT  *p_rpt;
1082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    char *  rpt_name;
1092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
1102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    APPL_TRACE_DEBUG0("HID Report DB");
1112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++)
1122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
1132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_cb->hid_srvc[i].in_use)
1142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
1152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_rpt = &p_cb->hid_srvc[i].report[0];
1162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
1172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            APPL_TRACE_DEBUG1("\t HID serivce inst: %d", i);
1182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
1192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            for (j = 0; j < BTA_HH_LE_RPT_MAX; j ++, p_rpt++)
1202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
1212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                rpt_name = "Unknown";
1222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                if (p_rpt->in_use)
1232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                {
1242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    if (p_rpt->uuid == GATT_UUID_HID_REPORT)
1252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        rpt_name = "Report";
1262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    if (p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT)
1272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        rpt_name = "Boot KB Input";
1282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    if (p_rpt->uuid == GATT_UUID_HID_BT_KB_OUTPUT)
1292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        rpt_name = "Boot KB Output";
1302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    if (p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT)
1312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        rpt_name = "Boot MI Input";
1322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
1332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
1342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    APPL_TRACE_DEBUG6("\t\t [%s- 0x%04x] [Type: %s], [ReportID: %d] [inst_id: %d]  [Clt_cfg: %d]",
1352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        rpt_name,
1362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        p_rpt->uuid ,
1372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        ((p_rpt->rpt_type < 4) ? bta_hh_le_rpt_name[p_rpt->rpt_type] : "UNKNOWN"),
1382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        p_rpt->rpt_id,
1392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        p_rpt->inst_id,
1402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        p_rpt->client_cfg_value);
1412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                }
1422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                else
1432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    break;
1442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
1452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
1462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
1472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
1482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
1492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
1502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
1512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_uuid_to_str
1532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description
1552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
1572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
1592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic char *bta_hh_uuid_to_str(UINT16 uuid)
1602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
1612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    switch(uuid)
1622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
1632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_INFORMATION:
1642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return "GATT_UUID_HID_INFORMATION";
1652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_REPORT_MAP:
1662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return "GATT_UUID_HID_REPORT_MAP";
1672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_CONTROL_POINT:
1682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return "GATT_UUID_HID_CONTROL_POINT";
1692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_REPORT:
1702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return "GATT_UUID_HID_REPORT";
1712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_PROTO_MODE:
1722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return "GATT_UUID_HID_PROTO_MODE";
1732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_BT_KB_INPUT:
1742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return "GATT_UUID_HID_BT_KB_INPUT";
1752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_BT_KB_OUTPUT:
1762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return "GATT_UUID_HID_BT_KB_OUTPUT";
1772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_BT_MOUSE_INPUT:
1782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return "GATT_UUID_HID_BT_MOUSE_INPUT";
1792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_CHAR_CLIENT_CONFIG:
1802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return "GATT_UUID_CHAR_CLIENT_CONFIG";
1812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_EXT_RPT_REF_DESCR:
1822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return "GATT_UUID_EXT_RPT_REF_DESCR";
1832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_RPT_REF_DESCR:
1842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return "GATT_UUID_RPT_REF_DESCR";
1852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        default:
1862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return "Unknown UUID";
1872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
1882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
1892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
1902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
1912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_enable
1932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      initialize LE HID related functionality
1952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
1982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
2002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_enable(void)
2012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
2022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    char       app_name[LEN_UUID_128 + 1];
2032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBT_UUID    app_uuid = {LEN_UUID_128,{0}};
2042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8       xx;
2052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_cb.gatt_if = BTA_GATTS_INVALID_IF;
2072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++)
2092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_cb.le_cb_index[xx]       = BTA_HH_IDX_INVALID;
2102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    memset (app_name, 0, LEN_UUID_128 + 1);
2122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    strncpy(app_name, "BTA HH OVER LE", LEN_UUID_128);
2132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    memcpy((void *)app_uuid.uu.uuid128, (void *)app_name, LEN_UUID_128);
2152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    BTA_GATTC_AppRegister(&app_uuid, bta_hh_gattc_callback);
2172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return;
2192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
2202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
2212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_register_cmpl
2232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      BTA HH register with BTA GATTC completed
2252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
2272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
2292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_register_cmpl(tBTA_GATTC_REG *p_reg)
2302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
2312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_STATUS      status = BTA_HH_ERR;
2322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_reg->status == BTA_GATT_OK)
2342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
2352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_cb.gatt_if = p_reg->client_if;
2362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        status = BTA_HH_OK;
2372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
2382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
2392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_cb.gatt_if = BTA_GATTS_INVALID_IF;
2402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* signal BTA call back event */
2422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    (* bta_hh_cb.p_cback)(BTA_HH_ENABLE_EVT, (tBTA_HH *)&status);
2432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
2442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
2462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
24736b686527892172cb44091d160b7d2806d49fc76Zhihai Xu** Function         bta_hh_le_is_hh_gatt_if
24836b686527892172cb44091d160b7d2806d49fc76Zhihai Xu**
24936b686527892172cb44091d160b7d2806d49fc76Zhihai Xu** Description      Check to see if client_if is BTA HH LE GATT interface
25036b686527892172cb44091d160b7d2806d49fc76Zhihai Xu**
25136b686527892172cb44091d160b7d2806d49fc76Zhihai Xu**
25236b686527892172cb44091d160b7d2806d49fc76Zhihai Xu** Returns          whether it is HH GATT IF
25336b686527892172cb44091d160b7d2806d49fc76Zhihai Xu**
25436b686527892172cb44091d160b7d2806d49fc76Zhihai Xu*******************************************************************************/
25536b686527892172cb44091d160b7d2806d49fc76Zhihai XuBOOLEAN bta_hh_le_is_hh_gatt_if(tBTA_GATTC_IF client_if)
25636b686527892172cb44091d160b7d2806d49fc76Zhihai Xu{
25736b686527892172cb44091d160b7d2806d49fc76Zhihai Xu    return (bta_hh_cb.gatt_if == client_if);
25836b686527892172cb44091d160b7d2806d49fc76Zhihai Xu}
25936b686527892172cb44091d160b7d2806d49fc76Zhihai Xu
26036b686527892172cb44091d160b7d2806d49fc76Zhihai Xu/*******************************************************************************
26136b686527892172cb44091d160b7d2806d49fc76Zhihai Xu**
2622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_deregister
2632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      De-register BTA HH from BTA GATTC
2652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
2682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
2702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_deregister(void)
2712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
2722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    BTA_GATTC_AppDeregister(bta_hh_cb.gatt_if);
2732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
2742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
2762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_is_le_device
2782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Check to see if the remote device is a LE only device
2802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
2822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
2842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachBOOLEAN bta_hh_is_le_device(tBTA_HH_DEV_CB *p_cb, BD_ADDR remote_bda)
2852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
2862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->is_le_device = BTM_UseLeLink (remote_bda);
2872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return p_cb->is_le_device;
2892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
2902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
2912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_hid_srvc_cached
2932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Check to see if LE HID service has been discovered and cached
2952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:      TRUE : has cache; FALSE: none.
2972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
2992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachBOOLEAN bta_hh_le_hid_srvc_cached(tBTA_HH_DEV_CB *p_dev_cb)
3002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
3012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_dev_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].in_use)
3022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return TRUE;
3032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
3042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return FALSE;
3052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
3062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
3072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_add_hid_srvc_entry
3092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Add a HID service entry in the HID device control block
3112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
3132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
3152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachBOOLEAN bta_hh_le_add_hid_srvc_entry(tBTA_HH_DEV_CB *p_dev_cb, UINT8 idx)
3162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
3172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    BOOLEAN added = FALSE;
3182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (idx < BTA_HH_LE_HID_SRVC_MAX)
3202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
3212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb->hid_srvc[idx].in_use = TRUE;
3222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        added = TRUE;
3232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
3242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
3252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
3262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR0("DB full,max HID service entry!");
3272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
3282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return added;
3292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
3312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
3322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_open_conn
3342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      open a GATT connection first.
3362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
3382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
3402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_open_conn(tBTA_HH_DEV_CB *p_cb, BD_ADDR remote_bda)
3412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
3422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* update cb_index[] map */
3432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->hid_handle = BTA_HH_GET_LE_DEV_HDL(p_cb->index);
3442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    memcpy(p_cb->addr, remote_bda, BD_ADDR_LEN);
3452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(p_cb->hid_handle)] = p_cb->index;
3462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->in_use = TRUE;
3472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    BTA_GATTC_Open(bta_hh_cb.gatt_if, remote_bda, TRUE);
3492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
3502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
3512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_fill_16bits_gatt_id
3532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Utility function to fill a GATT ID strucure
3552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
3572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_fill_16bits_gatt_id(UINT8 inst_id, UINT16 uuid,  tBTA_GATT_ID *p_output)
3582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
3592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_output->inst_id        = inst_id;
3602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_output->uuid.len       = LEN_UUID_16;
3612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_output->uuid.uu.uuid16 = uuid;
3622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
3632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
3642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_fill_16bits_srvc_id
3662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Utility function to fill a service ID strucure with a 16 bits
3682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  service UUID.
3692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
3712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_fill_16bits_srvc_id(BOOLEAN is_pri, UINT8 inst_id, UINT16 srvc_uuid,
3722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                   tBTA_GATT_SRVC_ID *p_output)
3732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
3742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    memset((void *)p_output, 0, sizeof(tBTA_GATT_SRVC_ID));
3752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_output->is_primary        = is_pri;
3762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_fill_16bits_gatt_id(inst_id, srvc_uuid, &p_output->id);
3772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
3792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
3802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_fill_16bits_char_id
3822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Utility function to fill a char ID strucure with a 16 bits
3842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  char UUID.
3852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
3872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_fill_16bits_char_id(UINT8 inst_id, UINT16 char_uuid,
3882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                   tBTA_GATT_ID *p_output)
3892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
3902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    memset((void *)p_output, 0, sizeof(tBTA_GATT_ID));
3912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_fill_16bits_gatt_id(inst_id, char_uuid, p_output);
3922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
3932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
3942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_find_dev_cb_by_conn_id
3962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Utility function find a device control block by connection ID.
3982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
4002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtBTA_HH_DEV_CB * bta_hh_le_find_dev_cb_by_conn_id(UINT16 conn_id)
4012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
4022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8   i;
4032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_DEV_CB *p_dev_cb = &bta_hh_cb.kdev[0];
4042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i = 0; i < BTA_HH_MAX_DEVICE; i ++, p_dev_cb ++)
4062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
4072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_dev_cb->in_use  && p_dev_cb->conn_id == conn_id)
4082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return p_dev_cb;
4092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
4102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return NULL;
4112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
4122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
4132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
4142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_find_dev_cb_by_bda
4152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
4162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Utility function find a device control block by BD address.
4172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
4182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
4192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtBTA_HH_DEV_CB * bta_hh_le_find_dev_cb_by_bda(BD_ADDR bda)
4202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
4212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8   i;
4222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_DEV_CB *p_dev_cb = &bta_hh_cb.kdev[0];
4232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i = 0; i < BTA_HH_MAX_DEVICE; i ++, p_dev_cb ++)
4252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
4262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_dev_cb->in_use  &&
4272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            memcmp(p_dev_cb->addr, bda, BD_ADDR_LEN) == 0)
4282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return p_dev_cb;
4292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
4302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return NULL;
4312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
4322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachUINT8 bta_hh_le_find_service_inst_by_battery_inst_id(tBTA_HH_DEV_CB *p_cb, UINT8 ba_inst_id)
4332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
4342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8   i;
4352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++)
4372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
4382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_cb->hid_srvc[i].in_use &&
4392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_cb->hid_srvc[i].incl_srvc_inst == ba_inst_id)
4402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
4412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return i;
4422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
4432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
4442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return BTA_HH_IDX_INVALID;
4452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
4462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
4472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
4482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_find_report_entry
4492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
4502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      find the report entry by service instance and report UUID and
4512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  instance ID
4522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
4532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
4542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtBTA_HH_LE_RPT * bta_hh_le_find_report_entry(tBTA_HH_DEV_CB *p_cb,
4552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                             UINT8  srvc_inst_id,  /* service instance ID */
4562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                             UINT16 rpt_uuid,
4572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                             UINT8  char_inst_id)
4582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
4592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8   i;
4602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8   hid_inst_id = srvc_inst_id;
4612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_RPT *p_rpt;
4622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (rpt_uuid == GATT_UUID_BATTERY_LEVEL)
4642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
4652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hid_inst_id = bta_hh_le_find_service_inst_by_battery_inst_id(p_cb, srvc_inst_id);
4662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (hid_inst_id == BTA_HH_IDX_INVALID)
4682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return NULL;
4692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
4702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_rpt = &p_cb->hid_srvc[hid_inst_id].report[0];
4722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i = 0; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt ++)
4742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
4752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_rpt->uuid == rpt_uuid &&
4762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_rpt->inst_id == BTA_HH_LE_RPT_INST_ID_MAP(srvc_inst_id, char_inst_id))
4772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
4782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return p_rpt;
4802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
4812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
4822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return NULL;
4832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
4852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
4862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
4872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_find_rpt_by_idtype
4882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
4892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      find a report entry by report ID and protocol mode
4902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
4912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
4922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
4932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
4942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtBTA_HH_LE_RPT * bta_hh_le_find_rpt_by_idtype(tBTA_HH_LE_RPT*p_head, UINT8 mode,
4952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                              tBTA_HH_RPT_TYPE r_type, UINT8 rpt_id)
4962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
4972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_RPT *p_rpt = p_head;
4982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8   i;
4992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE
5012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    APPL_TRACE_DEBUG2("bta_hh_le_find_rpt_by_idtype: r_tpye: %d rpt_id: %d", r_type, rpt_id);
5022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
5032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i = 0 ; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt++)
5052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
5062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_rpt->in_use && p_rpt->rpt_id == rpt_id && r_type == p_rpt->rpt_type)
5072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
5082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            /* return battery report w/o condition */
5092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL)
5102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                return p_rpt;
5112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (mode == BTA_HH_PROTO_RPT_MODE && p_rpt->uuid == GATT_UUID_HID_REPORT)
5132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                return p_rpt;
5142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if ( mode ==BTA_HH_PROTO_BOOT_MODE &&
5162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                (p_rpt->uuid >= GATT_UUID_HID_BT_KB_INPUT && p_rpt->uuid <= GATT_UUID_HID_BT_MOUSE_INPUT))
5172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                return p_rpt;
5182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
5192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
5202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return NULL;
5212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
5222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
5232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
5242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_find_alloc_report_entry
5252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
5262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      find or allocate a report entry in the HID service report list.
5272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
5282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
5292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtBTA_HH_LE_RPT * bta_hh_le_find_alloc_report_entry(tBTA_HH_DEV_CB *p_cb,
5302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                   UINT8 srvc_inst_id,
5312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                   UINT16 rpt_uuid,
5322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                   UINT8  inst_id,
5332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                   UINT8  prop)
5342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
5352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8   i, hid_inst_id = srvc_inst_id;
5362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_RPT *p_rpt;
5372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (rpt_uuid == GATT_UUID_BATTERY_LEVEL)
5392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
5402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hid_inst_id = bta_hh_le_find_service_inst_by_battery_inst_id(p_cb, srvc_inst_id);
5412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (hid_inst_id == BTA_HH_IDX_INVALID)
5432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return NULL;
5442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
5452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_rpt = &p_cb->hid_srvc[hid_inst_id].report[0];
5462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i = 0; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt ++)
5482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
5492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (!p_rpt->in_use ||
5502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            (p_rpt->uuid == rpt_uuid &&
5512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach             p_rpt->inst_id == BTA_HH_LE_RPT_INST_ID_MAP(srvc_inst_id, inst_id)))
5522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
5532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (!p_rpt->in_use)
5542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
5552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                p_rpt->in_use   = TRUE;
5562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                p_rpt->index    = i;
5572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                p_rpt->inst_id  = BTA_HH_LE_RPT_INST_ID_MAP(srvc_inst_id, inst_id);
5582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                p_rpt->prop     = prop;
5592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                p_rpt->uuid     = rpt_uuid;
5602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                /* assign report type */
5622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                for (i = 0; i < BTA_LE_HID_RTP_UUID_MAX; i ++)
5632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                {
5642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    if (bta_hh_uuid_to_rtp_type[i][0] == rpt_uuid)
5652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    {
5662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        p_rpt->rpt_type = (tBTA_HH_RPT_TYPE)bta_hh_uuid_to_rtp_type[i][1];
5672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        if (rpt_uuid == GATT_UUID_HID_BT_KB_INPUT || rpt_uuid == GATT_UUID_HID_BT_KB_OUTPUT)
5692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            p_rpt->rpt_id = BTA_HH_KEYBD_RPT_ID;
5702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        if (rpt_uuid == GATT_UUID_HID_BT_MOUSE_INPUT)
5722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            p_rpt->rpt_id = BTA_HH_MOUSE_RPT_ID;
5732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        break;
5752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    }
5762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                }
5772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
5782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return p_rpt;
5802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
5812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
5822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return NULL;
5832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
5842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
5862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
5872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_read_char_dscrpt
5882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
5892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      read cahracteristic descriptor
5902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
5912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
5922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtBTA_HH_STATUS bta_hh_le_read_char_dscrpt(tBTA_HH_DEV_CB *p_cb, UINT16 srvc_uuid, UINT8 srvc_inst_id,
5932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                UINT16 char_uuid, UINT8 char_inst_id, UINT16 char_descp_uuid)
5942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
5952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_CHAR_ID  char_id;
5962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBT_UUID        descr_uuid;
5972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_CHAR_DESCR_ID    descr_id;
5982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_STATUS  status = BTA_HH_ERR;
5992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
6002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_fill_16bits_srvc_id(TRUE, srvc_inst_id, srvc_uuid, &char_id.srvc_id);
6012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_fill_16bits_char_id(char_inst_id, char_uuid, &char_id.char_id);
6022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
6032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    descr_uuid.len       = LEN_UUID_16;
6042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    descr_uuid.uu.uuid16 = char_descp_uuid;
6052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
6062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* find the report reference descriptor */
6072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (BTA_GATTC_GetFirstCharDescr(p_cb->conn_id,
6082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                &char_id,
6092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                &descr_uuid,
6102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                &descr_id) == BTA_GATT_OK)
6112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
6122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        BTA_GATTC_ReadCharDescr(p_cb->conn_id,
6132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                &descr_id,
6142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                BTA_GATT_AUTH_REQ_NONE);
6152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
6162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        status = BTA_HH_OK;
6172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
6182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
6192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
6202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE
6212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR2("bta_hh_le_read_char_dscrpt: No such descrpt exists: %s(0x%04x)",
6222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_uuid_to_str(char_descp_uuid), char_descp_uuid);
6232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
6242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
6252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return status;
6262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
6272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
6282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
6292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_read_rpt_ref_descr
6302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
6312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      read report refernece descriptors in service discovery process
6322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
6332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
6342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_read_rpt_ref_descr(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_LE_RPT *p_rpt)
6352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
6362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    BOOLEAN started = FALSE;
6372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT16  srvc_uuid, char_uuid;
6382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
6392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    while (p_rpt != NULL)
6402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
6412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_rpt->rpt_type == BTA_HH_RPTT_INPUT)
6422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
6432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            /* is battery report */
6442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL)
6452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
6462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE
6472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                APPL_TRACE_DEBUG0("read battery level report reference descriptor");
6482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
6492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                srvc_uuid = UUID_SERVCLASS_BATTERY;
6502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                char_uuid = GATT_UUID_BATTERY_LEVEL;
6512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
6522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            else
6532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
6542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE
6552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                APPL_TRACE_DEBUG0("read HID report reference descriptor");
6562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
6572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                srvc_uuid = UUID_SERVCLASS_LE_HID;
6582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                char_uuid = GATT_UUID_HID_REPORT;
6592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
6602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
6612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (bta_hh_le_read_char_dscrpt(p_dev_cb,
6622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                            srvc_uuid,
6632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                            BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt->inst_id),
6642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                            char_uuid,
6652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                            BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt->inst_id),
6662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                            GATT_UUID_RPT_REF_DESCR)
6672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                == BTA_HH_OK)
6682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
6692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                started = TRUE;
6702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                break;
6712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
6722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
6732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
6742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
6752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
6762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_rpt->index == BTA_HH_LE_RPT_MAX - 1)
6772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
6782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
6792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_rpt ++;
6802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
6812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
6822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
6832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* if no report reference descriptor */
6842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (!started)
6852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
6862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* explore next char */
6872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_search_hid_chars(p_dev_cb);
6882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
6892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
6902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
6912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
6922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_save_rpt_ref
6932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
6942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      save report reference information and move to next one.
6952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
6962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
6972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
6982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
6992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_save_rpt_ref(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_LE_RPT  *p_rpt,
7002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            tBTA_GATTC_READ *p_data)
7012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
7022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8 *pp;
7032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
7042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* if the length of the descriptor value is right, parse it */
7052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data->status == BTA_GATT_OK &&
7062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_data->p_value && p_data->p_value->unformat.len == 2)
7072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
7082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        pp = p_data->p_value->unformat.p_value;
7092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
7102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        STREAM_TO_UINT8(p_rpt->rpt_id, pp);
7112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        STREAM_TO_UINT8(p_rpt->rpt_type, pp);
7122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
7132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_rpt->rpt_type > BTA_HH_RPTT_FEATURE) /* invalid report type */
7142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_rpt->rpt_type = BTA_HH_RPTT_RESRV;
7152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
7162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE
7172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_DEBUG1("report ID: %d", p_rpt->rpt_id);
7182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
7192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
7202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
7212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_rpt->index < BTA_HH_LE_RPT_MAX)
7222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_rpt ++;
7232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
7242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* read next report reference descriptor  */
7252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_read_rpt_ref_descr(p_dev_cb, p_rpt);
7262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
7272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
7282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
7292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
7302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_save_rpt_ref
7312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
7322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      save report reference information and move to next one.
7332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
7342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
7352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
7362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
7372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_save_ext_rpt_ref(tBTA_HH_DEV_CB *p_dev_cb,
7382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                tBTA_GATTC_READ *p_data)
7392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
7402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8 *pp;
7412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
7422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* if the length of the descriptor value is right, parse it
7432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach      assume it's a 16 bits UUID */
7442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data->status == BTA_GATT_OK &&
7452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_data->p_value && p_data->p_value->unformat.len == 2)
7462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
7472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        pp = p_data->p_value->unformat.p_value;
7482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        STREAM_TO_UINT16(p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].ext_rpt_ref, pp);
7492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
7502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE
7512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_DEBUG1("External Report Reference UUID 0x%04x",
7522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].ext_rpt_ref);
7532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
7542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
7552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_search_hid_chars(p_dev_cb);
7562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
7572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
7582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
7592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
7602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_register_input_notif
7612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
7622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Register for all notifications for the report applicable
7632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  for the protocol mode.
7642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
7652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
7662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
7672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
7682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_register_input_notif(tBTA_HH_DEV_CB *p_dev_cb, UINT8 srvc_inst,
7692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                    UINT8 proto_mode, BOOLEAN register_ba)
7702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
7712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_RPT  *p_rpt = &p_dev_cb->hid_srvc[srvc_inst].report[0];
7722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_CHAR_ID  char_id;
7732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8   i;
7742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT16  srvc_uuid;
7752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
7762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE
7772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    APPL_TRACE_DEBUG1("bta_hh_le_register_input_notif mode: %d", proto_mode);
7782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
7792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
7802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i = 0; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt ++)
7812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
7822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_rpt->rpt_type == BTA_HH_RPTT_INPUT)
7832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
7842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL)
7852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                srvc_uuid = UUID_SERVCLASS_BATTERY;
7862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            else
7872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                srvc_uuid = UUID_SERVCLASS_LE_HID;
7882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
7892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_fill_16bits_srvc_id(TRUE, BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt->inst_id), srvc_uuid, &char_id.srvc_id);
7902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_fill_16bits_char_id(BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt->inst_id), p_rpt->uuid, &char_id.char_id);
7912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
7922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (register_ba && p_rpt->uuid == GATT_UUID_BATTERY_LEVEL)
7932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
7942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                BTA_GATTC_RegisterForNotifications(bta_hh_cb.gatt_if,
7952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                   p_dev_cb->addr,
7962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                   &char_id);
7972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
7982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            /* boot mode, deregister report input notification */
7992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            else if (proto_mode == BTA_HH_PROTO_BOOT_MODE)
8002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
8012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                if (p_rpt->uuid == GATT_UUID_HID_REPORT &&
8022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION)
8032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                {
8042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    APPL_TRACE_DEBUG1("---> Deregister Report ID: %d", p_rpt->rpt_id);
8052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    BTA_GATTC_DeregisterForNotifications(bta_hh_cb.gatt_if,
8062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                       p_dev_cb->addr,
8072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                       &char_id);
8082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                }
8092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                /* register boot reports notification */
8102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                else if (p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT ||
8112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                         p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT)
8122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                {
8132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    APPL_TRACE_DEBUG1("<--- Register Boot Report ID: %d", p_rpt->rpt_id);
8142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    BTA_GATTC_RegisterForNotifications(bta_hh_cb.gatt_if,
8152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                       p_dev_cb->addr,
8162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                       &char_id);
8172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                }
8182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
8192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            else if (proto_mode == BTA_HH_PROTO_RPT_MODE)
8202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
8212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                if ((p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT ||
8222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT) &&
8232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION)
8242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                {
8252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    APPL_TRACE_DEBUG1("---> Deregister Boot Report ID: %d", p_rpt->rpt_id);
8272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    BTA_GATTC_DeregisterForNotifications(bta_hh_cb.gatt_if,
8282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                       p_dev_cb->addr,
8292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                       &char_id);
8302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                }
8312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                else if (p_rpt->uuid == GATT_UUID_HID_REPORT &&
8322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                         p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION)
8332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                {
8342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    APPL_TRACE_DEBUG1("<--- Register Report ID: %d", p_rpt->rpt_id);
8352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    BTA_GATTC_RegisterForNotifications(bta_hh_cb.gatt_if,
8362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                       p_dev_cb->addr,
8372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                       &char_id);
8382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                }
8392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
8402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            /*
8412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            else unknow protocol mode */
8422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
8432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
8442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
8452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
8472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_open_cmpl
8492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      HID over GATT connection sucessfully opened
8512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
8532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_open_cmpl(tBTA_HH_DEV_CB *p_cb)
8542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
8552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if ( p_cb->disc_active == BTA_HH_LE_DISC_NONE)
8562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
8572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG
8582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_hid_report_dbg(p_cb);
8592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
8602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_register_input_notif(p_cb, 0, p_cb->mode, TRUE);
8612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, NULL);
8622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_RECONN == TRUE)
8632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_cb->status == BTA_HH_OK)
8642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
8652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_add_dev_bg_conn(p_cb, TRUE);
8662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
8672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
8682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
8692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
8702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
8712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_write_char_clt_cfg
8732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Utility function to find and write client configuration of
8752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  a characteristic
8762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
8782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachBOOLEAN bta_hh_le_write_char_clt_cfg(tBTA_HH_DEV_CB *p_cb,
8792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                     UINT8 srvc_inst_id, UINT16 srvc_uuid16,
8802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                     UINT8 char_inst_id, UINT16 char_uuid16,
8812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                     UINT16 clt_cfg_value)
8822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
8832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_CHAR_ID          char_id;
8842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBT_UUID                    descr_cond;
8852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_CHAR_DESCR_ID    descr_id;
8862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATT_UNFMT             value;
8872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8                      buf[2], *pp = buf;
8882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_fill_16bits_srvc_id(TRUE, srvc_inst_id, srvc_uuid16, &char_id.srvc_id);
8902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_fill_16bits_char_id(char_inst_id, char_uuid16, &char_id.char_id);
8912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    descr_cond.len       = LEN_UUID_16;
8932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    descr_cond.uu.uuid16 = GATT_UUID_CHAR_CLIENT_CONFIG;
8942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    value.len = 2;
8962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    value.p_value = buf;
8972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT16_TO_STREAM(pp, clt_cfg_value);
8992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
9002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (BTA_GATTC_GetFirstCharDescr(p_cb->conn_id,
9012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                    &char_id,
9022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                    &descr_cond,
9032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                    &descr_id) == BTA_GATT_OK)
9042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
9052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        BTA_GATTC_WriteCharDescr(p_cb->conn_id,
9062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            &descr_id,
9072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            BTA_GATTC_TYPE_WRITE_NO_RSP,
9082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            &value,
9092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            BTA_GATT_AUTH_REQ_NONE);
9102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
9112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return TRUE;
9122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
9132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return FALSE;
9142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
9152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
9162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
9172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_write_rpt_clt_cfg
9182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
9192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      write client configuration. This is only for input report
9202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  enable all input notification upon connection open.
9212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
9222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
9232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachBOOLEAN bta_hh_le_write_rpt_clt_cfg(tBTA_HH_DEV_CB *p_cb, UINT8 srvc_inst_id)
9242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
9252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8           i;
9262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_RPT  *p_rpt = &p_cb->hid_srvc[srvc_inst_id].report[p_cb->clt_cfg_idx];
9272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT16          srvc_uuid;
9282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
9292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i = p_cb->clt_cfg_idx; i < BTA_HH_LE_RPT_MAX && p_rpt->in_use; i ++, p_rpt ++)
9302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
9312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* enable notification for all input report, regardless mode */
9322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_rpt->rpt_type == BTA_HH_RPTT_INPUT)
9332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
9342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
9352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL)
9362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                srvc_uuid = UUID_SERVCLASS_BATTERY;
9372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            else
9382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                srvc_uuid = UUID_SERVCLASS_LE_HID;
9392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
9402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (bta_hh_le_write_char_clt_cfg(p_cb,
9412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                             BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt->inst_id),
9422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                             srvc_uuid,
9432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                             BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt->inst_id),
9442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                             p_rpt->uuid,
9452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                             BTA_GATT_CLT_CONFIG_NOTIFICATION))
9462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
9472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                p_cb->clt_cfg_idx = i;
9482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                return TRUE;
9492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
9502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
9512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
9522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
9532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->clt_cfg_idx = 0;
9542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
9552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* client configuration is completed, send open callback */
9562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb->state == BTA_HH_W4_CONN_ST)
9572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
9582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->disc_active &= ~BTA_HH_LE_DISC_HIDS;
9592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
9602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* discover scan parameter profile is act as report host */
9612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_search_scps(p_cb);
9622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
9632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return FALSE;
9642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
9652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
9662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
9672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
9682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_set_protocol_mode
9692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
9702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Set remote device protocol mode.
9712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
9722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
9732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachBOOLEAN bta_hh_le_set_protocol_mode(tBTA_HH_DEV_CB *p_cb, tBTA_HH_PROTO_MODE mode)
9742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
9752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_CHAR_ID  char_id;
9762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_CBDATA      cback_data ;
9772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    BOOLEAN             exec = TRUE;
9782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
9792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    APPL_TRACE_DEBUG1("bta_hh_le_set_protocol_mode attempt mode: %s",
9802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                      (mode == BTA_HH_PROTO_RPT_MODE)? "Report": "Boot");
9812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
9822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    cback_data.handle  = p_cb->hid_handle;
9832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* boot mode is not supported in the remote device */
9842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if ((p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].option_char & BTA_HH_LE_PROTO_MODE_BIT) == 0)
9852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
9862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        exec        = FALSE;
9872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->mode  = BTA_HH_PROTO_RPT_MODE;
9882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
9892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (mode == BTA_HH_PROTO_BOOT_MODE)
9902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
9912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            APPL_TRACE_ERROR0("Set Boot Mode failed!! No PROTO_MODE Char!");
9922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            cback_data.status = BTA_HH_ERR;
9932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
9942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
9952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
9962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            /* if set to report mode, need to de-register all input report notification */
9972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_register_input_notif(p_cb, 0, p_cb->mode, FALSE);
9982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            cback_data.status = BTA_HH_OK;
9992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
10002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_cb->state == BTA_HH_W4_CONN_ST)
10012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
10022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_cb->status = (cback_data.status == BTA_HH_OK)? BTA_HH_OK: BTA_HH_ERR_PROTO;
10032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
10042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
10052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            (* bta_hh_cb.p_cback)(BTA_HH_SET_PROTO_EVT, (tBTA_HH *)&cback_data);
10062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
10072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
10082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
10092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_LE_HID, &char_id.srvc_id);
10102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_fill_16bits_char_id(0, GATT_UUID_HID_PROTO_MODE, &char_id.char_id);
10112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
10122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->mode = mode;
10132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        mode = (mode == BTA_HH_PROTO_BOOT_MODE)? BTA_HH_LE_PROTO_BOOT_MODE : BTA_HH_LE_PROTO_REPORT_MODE;
10142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
10152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        BTA_GATTC_WriteCharValue(p_cb->conn_id,
10162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                 &char_id,
10172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                 BTA_GATTC_TYPE_WRITE_NO_RSP,
10182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                 1,
10192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                 &mode,
10202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                 BTA_GATT_AUTH_REQ_NONE);
10212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
10222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return exec;
10232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
10242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
10252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
10262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
10272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_get_protocol_mode
10282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
10292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Get remote device protocol mode.
10302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
10312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
10322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_get_protocol_mode(tBTA_HH_DEV_CB *p_cb)
10332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
10342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_CHAR_ID  char_id;
10352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_HSDATA    hs_data;
10362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8 i;
10372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
10382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->w4_evt = BTA_HH_GET_PROTO_EVT;
10392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
10402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i = 0; i< BTA_HH_LE_HID_SRVC_MAX; i ++)
10412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
10422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_cb->hid_srvc[i].in_use &&
10432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_cb->hid_srvc[i].option_char & BTA_HH_LE_PROTO_MODE_BIT)
10442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
10452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_LE_HID, &char_id.srvc_id);
10462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_fill_16bits_char_id(0, GATT_UUID_HID_PROTO_MODE, &char_id.char_id);
10472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
10482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            BTA_GATTC_ReadCharacteristic(p_cb->conn_id,
10492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                        &char_id,
10502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                        BTA_GATT_AUTH_REQ_NONE);
10512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
10522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
10532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
10542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* no service support protocol_mode, by default report mode */
10552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (i == BTA_HH_LE_HID_SRVC_MAX)
10562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
10572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hs_data.status  = BTA_HH_OK;
10582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hs_data.handle  = p_cb->hid_handle;
10592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hs_data.rsp_data.proto_mode = BTA_HH_PROTO_RPT_MODE;
10602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->w4_evt = 0;
10612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        (* bta_hh_cb.p_cback)(BTA_HH_GET_PROTO_EVT, (tBTA_HH *)&hs_data);
10622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
10632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
10642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
10652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
10662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
10672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_expl_rpt
10682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
10692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      explore all report characteristic
10702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
10712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
10722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_expl_rpt(tBTA_HH_DEV_CB *p_dev_cb,
10732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                           tBTA_GATTC_CHAR_ID *p_char_id,
10742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                           tBT_UUID *p_char_cond,
10752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                           tBTA_GATT_CHAR_PROP prop)
10762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
10772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_CHAR_ID  char_result;
10782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
10792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    do
10802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
10812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (bta_hh_le_find_alloc_report_entry(p_dev_cb,
10822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                          p_dev_cb->cur_srvc_index,
10832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                          GATT_UUID_HID_REPORT,
10842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                          p_char_id->char_id.inst_id,
10852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                          prop) == NULL)
10862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
10872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            APPL_TRACE_ERROR0("Add report entry failed !!!")
10882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
10892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
10902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
10912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_DEBUG0("Find more REPORT");
10922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
10932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (BTA_GATTC_GetNextChar(p_dev_cb->conn_id,
10942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                          p_char_id,
10952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                          p_char_cond,
10962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                          &char_result,
10972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                          &prop) != BTA_GATT_OK)
10982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
10992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
11002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_char_id = &char_result;
11012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
11022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    while (1);
11032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
11042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    APPL_TRACE_ERROR0("all report searched");
11052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_read_rpt_ref_descr(p_dev_cb,
11062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                 &p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].report[0]);
11072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
11082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
11092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return ;
11102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
11112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
11122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
11132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_expl_boot_rpt
11142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
11152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      explore boot report
11162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
11172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
11182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_expl_boot_rpt(tBTA_HH_DEV_CB *p_dev_cb, UINT16 char_uuid,
11192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                tBTA_GATT_CHAR_PROP prop)
11202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
11212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (bta_hh_le_find_alloc_report_entry(p_dev_cb,
11222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_cb->cur_srvc_index,
11232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      char_uuid,
11242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      0,
11252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      prop) == NULL)
11262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
11272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
11282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR0("Add report entry failed !!!")
11292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
11302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
11312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return;
11322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
11332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
11342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
11352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_dis_cback
11362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
11372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      DIS read complete callback
11382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
11392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
11402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
11412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
11422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_dis_cback(BD_ADDR addr, tDIS_VALUE *p_dis_value)
11432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
11442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_DEV_CB *p_cb = bta_hh_le_find_dev_cb_by_bda(addr);
11452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
11462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
11472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb == NULL || p_dis_value == NULL)
11482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
11492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR0("received unexpected/error DIS callback");
11502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
11512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
11522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
11532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->disc_active &= ~BTA_HH_LE_DISC_DIS;
11542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* plug in the PnP info for this device */
11552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_dis_value->attr_mask & DIS_ATTR_PNP_ID_BIT)
11562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
11572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE
11582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_DEBUG3("Plug in PnP info: product_id = %02x, vendor_id = %04x, version = %04x",
11592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                p_dis_value->pnp_id.product_id,
11602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                p_dis_value->pnp_id.vendor_id,
11612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                p_dis_value->pnp_id.product_version);
11622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
11632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->dscp_info.product_id = p_dis_value->pnp_id.product_id;
11642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->dscp_info.vendor_id  = p_dis_value->pnp_id.vendor_id;
11652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->dscp_info.version    = p_dis_value->pnp_id.product_version;
11662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
11672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_open_cmpl(p_cb);
11682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
11692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
11702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
11712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_pri_service_discovery
11722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
11732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Initialize GATT discovery on the remote LE HID device by opening
11742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  a GATT connection first.
11752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
11762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
11772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
11782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
11792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_pri_service_discovery(tBTA_HH_DEV_CB *p_cb)
11802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
11812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBT_UUID        pri_srvc;
11822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
11832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->disc_active |= (BTA_HH_LE_DISC_HIDS|BTA_HH_LE_DISC_DIS);
11842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
11852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* read DIS info */
11862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (!DIS_ReadDISInfo(p_cb->addr, bta_hh_le_dis_cback))
11872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
11882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR0("read DIS failed");
11892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->disc_active &= ~BTA_HH_LE_DISC_DIS;
11902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
11912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
11922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* in parallel */
11932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* start primary service discovery for HID service */
11942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    pri_srvc.len        = LEN_UUID_16;
11952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    pri_srvc.uu.uuid16  = UUID_SERVCLASS_LE_HID;
11962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    BTA_GATTC_ServiceSearchRequest(p_cb->conn_id, &pri_srvc);
11972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return;
11982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
11992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
12002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
12012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_encrypt_cback
12022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
12032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      link encryption complete callback for bond verification.
12042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
12052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          None
12062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
12072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
12082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_encrypt_cback(BD_ADDR bd_addr, void *p_ref_data, tBTM_STATUS result)
12092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
12102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8   idx = bta_hh_find_cb(bd_addr);
12112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_DEV_CB *p_dev_cb;
12122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
12132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    APPL_TRACE_ERROR0("bta_hh_le_encrypt_cback");
12142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
12152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (idx != BTA_HH_IDX_INVALID)
12162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb = &bta_hh_cb.kdev[idx];
12172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
12182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
12192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR0("unexpected encryption callback, ignore");
12202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
12212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
12222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_dev_cb->status = (result == BTM_SUCCESS) ? BTA_HH_OK : BTA_HH_ERR_SEC;
12232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
12242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_sm_execute(p_dev_cb, BTA_HH_ENC_CMPL_EVT, NULL);
12252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
12262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
12272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
12282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_security_cmpl
12292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
12302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Security check completed, start the service discovery
12312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  if no cache available, otherwise report connection open completed
12322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
12332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
12342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
12352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
12362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_security_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf)
12372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
12382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb->status == BTA_HH_OK)
12392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
12402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /*  discovery has been done for HID service */
12412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_cb->app_id != 0 && bta_hh_le_hid_srvc_cached(p_cb))
12422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
12432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            /* configure protocol mode */
12442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (bta_hh_le_set_protocol_mode(p_cb, p_cb->mode) == FALSE)
12452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
12462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                APPL_TRACE_ERROR0("bta_hh_security_cmpl");
12472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                bta_hh_le_open_cmpl(p_cb);
12482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
12492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
12502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* start primary service discovery for HID service */
12512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
12522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
12532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_pri_service_discovery(p_cb);
12542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
12552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
12562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
12572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_api_disc_act(p_cb);
12582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
12592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
12602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
12612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
12622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_start_security
12632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
12642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      start the security check of the established connection
12652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
12662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
12672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
12682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
12692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_start_security(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf)
12702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
12712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8           sec_flag=0;
12722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
12732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* verify bond */
12742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    BTM_GetSecurityFlags(p_cb->addr, &sec_flag);
12752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
12762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* if link has been encrypted */
12772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (sec_flag & BTM_SEC_FLAG_ENCRYPTED)
12782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
12792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_sm_execute(p_cb, BTA_HH_ENC_CMPL_EVT, NULL);
12802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
12812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* if bonded and link not encrypted */
12822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else if (sec_flag & BTM_SEC_FLAG_LKEY_KNOWN)
12832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
12842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        sec_flag = BTM_BLE_SEC_ENCRYPT;
12852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->status = BTA_HH_ERR_AUTH_FAILED;
12862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        BTM_SetEncryption(p_cb->addr, bta_hh_le_encrypt_cback, &sec_flag);
12872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
12882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* unbonded device, report security error here */
12892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else if (p_cb->sec_mask != BTA_SEC_NONE)
12902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
12912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        sec_flag = BTM_BLE_SEC_ENCRYPT_NO_MITM;
12922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->status = BTA_HH_ERR_AUTH_FAILED;
12932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        BTM_SetEncryption(p_cb->addr, bta_hh_le_encrypt_cback, &sec_flag);
12942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
12952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* otherwise let it go through */
12962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
12972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
12982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_sm_execute(p_cb, BTA_HH_ENC_CMPL_EVT, NULL);
12992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
13002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
13032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
13042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
13052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_gatt_open
13062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
13072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      process GATT open event.
13082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
13092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
13102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
13112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
13122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_gatt_open(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf)
13132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
13142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_OPEN *p_data = &p_buf->le_open;
13152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8           *p2;
13162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tHID_STATUS     status = BTA_HH_ERR;
13172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* if received invalid callback data , ignore it */
13192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb == NULL || p_data == NULL)
13202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
13212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p2 = p_data->remote_bda;
13232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    APPL_TRACE_DEBUG3("bta_hh_gatt_open BTA_GATTC_OPEN_EVT bda= [%08x%04x] status =%d",
13252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                      ((p2[0])<<24)+((p2[1])<<16)+((p2[2])<<8)+(p2[3]),
13262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                      ((p2[4])<<8)+ p2[5],p_data->status);
13272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data->status == BTA_GATT_OK)
13292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
13302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->in_use    = TRUE;
13322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->conn_id   = p_data->conn_id;
13332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->hid_handle = BTA_HH_GET_LE_DEV_HDL(p_cb->index);
13342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(p_cb->hid_handle)] = p_cb->index;
13362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE
13382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_DEBUG3("hid_handle = %2x conn_id = %04x cb_index = %d", p_cb->hid_handle, p_cb->conn_id, p_cb->index);
13392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
13402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_sm_execute(p_cb, BTA_HH_START_ENC_EVT, NULL);
13422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
13442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else /* open failure */
13452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
13462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status);
13472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
13482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
13502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
13512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
13522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_close
13532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
13542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      This function process the GATT close event and post it as a
13552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  BTA HH internal event
13562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
13572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
13582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
13592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
13602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_close(tBTA_GATTC_CLOSE * p_data)
13612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
13622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_DEV_CB *p_dev_cb = bta_hh_le_find_dev_cb_by_bda(p_data->remote_bda);
13632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_CLOSE    *p_buf = NULL;
13642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT16  sm_event = BTA_HH_GATT_CLOSE_EVT;
13652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_dev_cb != NULL &&
13672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        (p_buf = (tBTA_HH_LE_CLOSE *)GKI_getbuf(sizeof(tBTA_HH_LE_CLOSE))) != NULL)
13682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
13692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_buf->hdr.event            = sm_event;
13702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_buf->hdr.layer_specific   = (UINT16)p_dev_cb->hid_handle;
13712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_buf->conn_id              = p_data->conn_id;
13722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_buf->reason               = p_data->reason;
13732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb->conn_id           = BTA_GATT_INVALID_CONN_ID;
13752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_sys_sendmsg(p_buf);
13772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
13782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
13792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
13812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
13822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_search_result
13832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
13842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      This function process the GATT service search result.
13852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
13862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
13872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
13882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
13892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_search_result(tBTA_GATTC_SRVC_RES *p_srvc_result)
13902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
13912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_DEV_CB *p_dev_cb = bta_hh_le_find_dev_cb_by_conn_id(p_srvc_result->conn_id);
13922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
13932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_dev_cb != NULL)
13942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
13952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        switch (p_srvc_result->service_uuid.id.uuid.uu.uuid16)
13962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
13972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case UUID_SERVCLASS_LE_HID:
13982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (p_srvc_result->service_uuid.is_primary)
13992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
14002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                /* found HID primamry service */
14012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                /* TODO: proceed to find battery and device info */
14022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                if (bta_hh_le_add_hid_srvc_entry(p_dev_cb, p_dev_cb->total_srvc))
14032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    p_dev_cb->total_srvc ++;
14042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                APPL_TRACE_DEBUG1("num of hid service: %d", p_dev_cb->total_srvc);
14052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
14062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
14072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
14082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case UUID_SERVCLASS_SCAN_PARAM : /* scan parameter service */
14092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_search_scps_chars(p_dev_cb);
14102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
14112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
14122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
14132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
14142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
14152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
14162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
14172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
14182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
14192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
14202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_gatt_disc_cmpl
14212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
14222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Check to see if the remote device is a LE only device
14232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
14242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
14252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
14262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
14272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_gatt_disc_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_STATUS status)
14282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
14292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    APPL_TRACE_DEBUG0("bta_hh_le_gatt_disc_cmpl ");
14302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
14312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* if open sucessful or protocol mode not desired, keep the connection open but inform app */
14322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (status == BTA_HH_OK || status == BTA_HH_ERR_PROTO)
14332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
14342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* assign a special APP ID temp, since device type unknown */
14352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->app_id = BTA_HH_APP_ID_LE;
14362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
14372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* set report notification configuration */
14382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->clt_cfg_idx = 0;
14392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_write_rpt_clt_cfg(p_cb, BTA_HH_LE_SRVC_DEF);
14402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
14412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else /* error, close the GATT connection */
14422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
14432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* close GATT connection if it's on */
14442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_api_disc_act(p_cb);
14452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
14462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
14472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
14482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
14492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
14502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_srvc_expl_srvc
14512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
14522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      This function discover the next avaible HID service.
14532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
14542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
14552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
14562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
14572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_srvc_expl_srvc(tBTA_HH_DEV_CB *p_dev_cb)
14582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
14592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE
14602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    APPL_TRACE_DEBUG2("bta_hh_le_srvc_expl_srvc cur_srvc_index = %d in_use = %d",
14612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    p_dev_cb->cur_srvc_index,
14622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].in_use);
14632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
14642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
14652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_dev_cb->cur_srvc_index < BTA_HH_LE_HID_SRVC_MAX &&
14662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].in_use)
14672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
14682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (!p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].expl_incl_srvc)
14692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            /* explore included service first */
14702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
14712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                bta_hh_le_search_hid_included(p_dev_cb);
14722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
14732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
14742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
14752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            /* explore characterisc */
14762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].cur_expl_char_idx = 0;
14772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_search_hid_chars(p_dev_cb);
14782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
14792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
14802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else /* all service discvery finished */
14812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
14822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_gatt_disc_cmpl(p_dev_cb, p_dev_cb->status);
14832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
14842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
14852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
14862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
14872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_srvc_search_cmpl
14882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
14892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      This function process the GATT service search complete.
14902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
14912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
14922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
14932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
14942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_srvc_search_cmpl(tBTA_GATTC_SEARCH_CMPL *p_data)
14952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
14962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_DEV_CB *p_dev_cb = bta_hh_le_find_dev_cb_by_conn_id(p_data->conn_id);
14972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
14982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* service search exception or no HID service is supported on remote */
14992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_dev_cb == NULL)
15002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
15012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
15022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if(p_data->status != BTA_GATT_OK || p_dev_cb->total_srvc == 0)
15032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
15042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb->status = BTA_HH_ERR_SDP;
15052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* close the connection and report service discovery complete with error */
15062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_api_disc_act(p_dev_cb);
15072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
15082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* GATT service discovery sucessfully finished */
15092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
15102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
15112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_dev_cb->disc_active  & BTA_HH_LE_DISC_SCPS)
15122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
15132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_dev_cb->disc_active  &= ~BTA_HH_LE_DISC_SCPS;
15142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_open_cmpl(p_dev_cb);
15152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
15162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else /* discover HID service */
15172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
15182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb->cur_srvc_index = 0;
15192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_srvc_expl_srvc(p_dev_cb);
15202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
15212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
15222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
15232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
15242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
15252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
15262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_search_hid_included
15272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
15282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      This function search the included service within the HID service.
15292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
15302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
15312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
15322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
15332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_search_hid_included(tBTA_HH_DEV_CB *p_dev_cb)
15342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
15352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBT_UUID    srvc_cond, char_cond;
15362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_INCL_SVC_ID  inc_srvc_result;
15372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATT_SRVC_ID srvc_id;
15382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_CHAR_ID  char_result;
15392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATT_CHAR_PROP prop = 0;
15402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
15412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_fill_16bits_srvc_id(TRUE, p_dev_cb->cur_srvc_index, UUID_SERVCLASS_LE_HID, &srvc_id);
15422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
15432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    srvc_cond.len = LEN_UUID_16;
15442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    srvc_cond.uu.uuid16 = UUID_SERVCLASS_BATTERY;
15452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
15462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (BTA_GATTC_GetFirstIncludedService(p_dev_cb->conn_id,
15472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            &srvc_id,
15482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            &srvc_cond,
15492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            &inc_srvc_result) == BTA_GATT_OK)
15502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
15512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* read include service UUID */
15522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
15532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].incl_srvc_inst = inc_srvc_result.incl_svc_id.id.inst_id;
15542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
15552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        char_cond.len = LEN_UUID_16;
15562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        char_cond.uu.uuid16 = GATT_UUID_BATTERY_LEVEL;
15572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
15582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* find the battery characteristic */
15592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (BTA_GATTC_GetFirstChar( p_dev_cb->conn_id,
15602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                    &inc_srvc_result.incl_svc_id,
15612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                    &char_cond,
15622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                    &char_result,
15632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                    &prop) == BTA_GATT_OK)
15642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
15652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (bta_hh_le_find_alloc_report_entry(p_dev_cb,
15662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                  char_result.srvc_id.id.inst_id,
15672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                  GATT_UUID_BATTERY_LEVEL,
15682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                  char_result.char_id.inst_id,
15692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                  prop) == NULL)
15702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
15712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                APPL_TRACE_ERROR0("Add battery report entry failed !!!")
15722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
15732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
15742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            /* read the battery characteristic */
15752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            BTA_GATTC_ReadCharacteristic(p_dev_cb->conn_id,
15762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                         &char_result,
15772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                         BTA_GATT_AUTH_REQ_NONE);
15782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
15792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return;
15802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
15812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
15822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
15832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
15842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            APPL_TRACE_ERROR0("Remote device does not have battery level");
15852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
15862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
15872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
15882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].expl_incl_srvc = TRUE;
15892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
15902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_srvc_expl_srvc(p_dev_cb);
15912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
15922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
15932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
15942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
15952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_read_battery_level_cmpl
15962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
15972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      This function process the battery level read
15982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
15992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
16002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
16012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
16022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_read_battery_level_cmpl(UINT8 status, tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p_data)
16032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
16042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].expl_incl_srvc = TRUE;
16052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_srvc_expl_srvc(p_dev_cb);
16062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
16072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
16082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
16092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_search_hid_chars
16102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
16112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      This function discover all characteristics a service and
16122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  all descriptors available.
16132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
16142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
16152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
16162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
16172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_search_hid_chars(tBTA_HH_DEV_CB *p_dev_cb)
16182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
16192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBT_UUID    char_cond;
16202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_CHAR_ID  char_result;
16212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATT_CHAR_PROP prop;
16222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    BOOLEAN     next = TRUE;
16232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT16      char_uuid = 0;
16242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATT_SRVC_ID srvc_id;
16252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
16262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].cur_expl_char_idx == BTA_HH_LE_DISC_CHAR_NUM ||
16272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        (p_dev_cb->status != BTA_HH_OK && p_dev_cb->status != BTA_HH_ERR_PROTO))
16282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
16292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].cur_expl_char_idx = 0;
16302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* explore next service */
16312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb->cur_srvc_index ++;
16322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_srvc_expl_srvc(p_dev_cb);
16332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
16342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
16352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
16362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_dev_cb->hid_srvc[ p_dev_cb->cur_srvc_index].cur_expl_char_idx ++;
16372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    char_uuid = bta_hh_le_disc_char_uuid[p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].cur_expl_char_idx - 1];
16382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
16392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    char_cond.len = LEN_UUID_16;
16402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    char_cond.uu.uuid16 = char_uuid;
16412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
16422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_fill_16bits_srvc_id(TRUE, p_dev_cb->cur_srvc_index, UUID_SERVCLASS_LE_HID, &srvc_id);
16432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
16442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE
16452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    APPL_TRACE_DEBUG2("bta_hh_le_search_hid_chars: looking for %s(0x%04x)",
16462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                       bta_hh_uuid_to_str(char_uuid), char_uuid);
16472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
16482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
16492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (BTA_GATTC_GetFirstChar( p_dev_cb->conn_id,
16502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            &srvc_id,
16512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            &char_cond,
16522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            &char_result,
16532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            &prop) == BTA_GATT_OK)
16542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
16552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        switch (char_uuid)
16562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
16572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_CONTROL_POINT:
16582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_dev_cb->hid_srvc[char_result.srvc_id.id.inst_id].option_char |= BTA_HH_LE_CP_BIT;
16592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            next = TRUE;
16602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
16612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_INFORMATION:
16622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_REPORT_MAP:
16632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            /* read the char value */
16642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            BTA_GATTC_ReadCharacteristic(p_dev_cb->conn_id,
16652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                        &char_result,
16662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                        BTA_GATT_AUTH_REQ_NONE);
16672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            next = FALSE;
16682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
16692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
16702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_PROTO_MODE:
16712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_dev_cb->hid_srvc[char_result.srvc_id.id.inst_id].option_char |= BTA_HH_LE_PROTO_MODE_BIT;
16722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            next = !bta_hh_le_set_protocol_mode(p_dev_cb, p_dev_cb->mode);
16732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
16742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
16752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_REPORT:
16762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_expl_rpt(p_dev_cb, &char_result, &char_cond, prop);
16772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            next = FALSE;
16782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
16792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
16802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* found boot mode report types */
16812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_BT_KB_OUTPUT:
16822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_BT_MOUSE_INPUT:
16832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_BT_KB_INPUT:
16842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_expl_boot_rpt(p_dev_cb, char_uuid, prop);
16852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
16862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
16872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
16882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
16892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
16902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (char_uuid == GATT_UUID_HID_PROTO_MODE)
16912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            next = !bta_hh_le_set_protocol_mode(p_dev_cb, p_dev_cb->mode);
16922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
16932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
16942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
16952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (next == TRUE)
16962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
16972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_search_hid_chars(p_dev_cb);
16982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
16992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
17002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
17012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
17022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_save_rpt_map
17032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
17042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      save the report map into the control block.
17052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
17062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
17072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
17082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
17092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_save_rpt_map(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p_data)
17102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
17112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8           *pp ;
17122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_HID_SRVC *p_srvc = &p_dev_cb->hid_srvc[p_data->srvc_id.id.inst_id];
17132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
17142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    pp = p_data->p_value->unformat.p_value;
17152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
17162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* save report descriptor */
17172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_srvc->rpt_map != NULL)
17182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        GKI_freebuf((void*)p_srvc->rpt_map);
17192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
17202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data->p_value->unformat.len > 0)
17212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_srvc->rpt_map = (UINT8 *)GKI_getbuf(p_data->p_value->unformat.len);
17222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
17232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_srvc->rpt_map != NULL)
17242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
17252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        STREAM_TO_ARRAY(p_srvc->rpt_map, pp, p_data->p_value->unformat.len);
17262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_srvc->descriptor.dl_len = p_data->p_value->unformat.len;
17272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_srvc->descriptor.dsc_list = p_dev_cb->hid_srvc[p_data->srvc_id.id.inst_id].rpt_map;
17282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
17292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
17302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (bta_hh_le_read_char_dscrpt(p_dev_cb,
17312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                   UUID_SERVCLASS_LE_HID,
17322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                               p_data->srvc_id.id.inst_id,
17332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                               GATT_UUID_HID_REPORT_MAP,
17342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                               p_data->char_id.inst_id,
17352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                               GATT_UUID_EXT_RPT_REF_DESCR) != BTA_HH_OK)
17362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
17372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_search_hid_chars(p_dev_cb);
17382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
17392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
17402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
17412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
17422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
17432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
17442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_proc_get_rpt_cmpl
17452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
17462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Process the Read report complete, send GET_REPORT_EVT to application
17472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  with the report data.
17482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
17492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
17502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
17512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
17522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_proc_get_rpt_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p_data)
17532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
17542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    BT_HDR              *p_buf = NULL;
17552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_RPT      *p_rpt;
17562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_HSDATA      hs_data;
17572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8               *pp ;
17582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
17592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_dev_cb->w4_evt != BTA_HH_GET_RPT_EVT)
17602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
17612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR1("Unexpected READ cmpl, w4_evt = %d", p_dev_cb->w4_evt);
17622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
17632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
17642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
17652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    hs_data.status  = BTA_HH_ERR;
17662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    hs_data.handle  = p_dev_cb->hid_handle;
17672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
17682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data->status == BTA_GATT_OK)
17692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
17702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_rpt = bta_hh_le_find_report_entry(p_dev_cb,
17712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                            p_data->srvc_id.id.inst_id,//BTA_HH_LE_SRVC_DEF,
17722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                            p_data->char_id.uuid.uu.uuid16,
17732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                            p_data->char_id.inst_id);
17742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
17752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_rpt != NULL &&
17762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_data->p_value != NULL &&
17772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            (p_buf = (BT_HDR *)GKI_getbuf((UINT16)(sizeof(BT_HDR) +p_data->p_value->unformat.len + 1))) != NULL)
17782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
17792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            /* pack data send to app */
17802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            hs_data.status  = BTA_HH_OK;
17812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_buf->len = p_data->p_value->unformat.len + 1;
17822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_buf->layer_specific = 0;
17832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
17842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            /* attach report ID as the first byte of the report before sending it to USB HID driver */
17852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            pp = (UINT8*)(p_buf + 1);
17862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            UINT8_TO_STREAM(pp, p_rpt->rpt_id);
17872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            memcpy(pp, p_data->p_value->unformat.p_value, p_data->p_value->unformat.len);
17882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
17892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            hs_data.rsp_data.p_rpt_data =p_buf;
17902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
17912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
17922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
17932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_dev_cb->w4_evt = 0;
17942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    (* bta_hh_cb.p_cback)(BTA_HH_GET_RPT_EVT, (tBTA_HH *)&hs_data);
17952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
17962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    utl_freebuf((void **)&p_buf);
17972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
17982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
17992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
18002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
18012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_proc_read_proto_mode
18022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
18032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Process the Read protocol mode, send GET_PROTO_EVT to application
18042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  with the protocol mode.
18052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
18062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
18072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_proc_read_proto_mode(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p_data)
18082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
18092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_HSDATA      hs_data;
18102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
18112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    hs_data.status  = BTA_HH_ERR;
18122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    hs_data.handle  = p_dev_cb->hid_handle;
18132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    hs_data.rsp_data.proto_mode = p_dev_cb->mode;
18142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
18152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data->status == BTA_GATT_OK && p_data->p_value)
18162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
18172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hs_data.status  = BTA_HH_OK;
18182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* match up BTE/BTA report/boot mode def*/
18192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hs_data.rsp_data.proto_mode = *(p_data->p_value->unformat.p_value);
18202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* LE repot mode is the opposite value of BR/EDR report mode, flip it here */
18212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (hs_data.rsp_data.proto_mode == 0)
18222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            hs_data.rsp_data.proto_mode = BTA_HH_PROTO_BOOT_MODE;
18232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
18242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            hs_data.rsp_data.proto_mode = BTA_HH_PROTO_RPT_MODE;
18252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
18262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb->mode = hs_data.rsp_data.proto_mode;
18272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
18282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG
18292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    APPL_TRACE_DEBUG1("LE GET_PROTOCOL Mode = [%s]",
18302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE)? "Report" : "Boot");
18312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
18322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
18332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_dev_cb->w4_evt = 0;
18342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    (* bta_hh_cb.p_cback)(BTA_HH_GET_PROTO_EVT, (tBTA_HH *)&hs_data);
18352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
18362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
18372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
18382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
18392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_w4_le_read_char_cmpl
18402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
18412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      process the GATT read complete in W4_CONN state.
18422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
18432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
18442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
18452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
18462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_w4_le_read_char_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf)
18472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
18482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_READ     * p_data = (tBTA_GATTC_READ *)p_buf;
18492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8               *pp ;
18502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
18512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data->char_id.uuid.uu.uuid16 == GATT_UUID_BATTERY_LEVEL)
18522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
18532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_read_battery_level_cmpl(p_data->status, p_dev_cb, p_data);
18542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
18552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
18562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
18572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_data->status == BTA_GATT_OK && p_data->p_value)
18582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
18592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            pp = p_data->p_value->unformat.p_value;
18602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
18612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            switch (p_data->char_id.uuid.uu.uuid16)
18622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
18632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           /* save device information */
18642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            case GATT_UUID_HID_INFORMATION:
18652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                STREAM_TO_UINT16(p_dev_cb->dscp_info.version, pp);
18662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                STREAM_TO_UINT8(p_dev_cb->dscp_info.ctry_code, pp);
18672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                STREAM_TO_UINT8(p_dev_cb->dscp_info.flag, pp);
18682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                break;
18692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
18702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            case GATT_UUID_HID_REPORT_MAP:
18712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                bta_hh_le_save_rpt_map(p_dev_cb, p_data);
18722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                return;
18732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
18742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            default:
18752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE
18762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                APPL_TRACE_ERROR2("Unexpected read %s(0x%04x)",
18772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                bta_hh_uuid_to_str(p_data->char_id.uuid.uu.uuid16),
18782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                p_data->char_id.uuid.uu.uuid16);
18792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
18802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                break;
18812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
18822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
18832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
18842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
18852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE
18862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            APPL_TRACE_ERROR3("read uuid %s[0x%04x] error: %d",
18872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                bta_hh_uuid_to_str(p_data->char_id.uuid.uu.uuid16),
18882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                p_data->char_id.uuid.uu.uuid16,
18892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                p_data->status);
18902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#else
18912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            APPL_TRACE_ERROR2("read uuid [0x%04x] error: %d", p_data->char_id.uuid.uu.uuid16, p_data->status);
18922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
18932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
18942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_search_hid_chars(p_dev_cb);
18952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
18962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
18972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
18982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
18992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
19002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_read_char_cmpl
19012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
19022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      a characteristic value is received.
19032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
19042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
19052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
19062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
19072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_read_char_cmpl (tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf)
19082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
19092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_READ * p_data = (tBTA_GATTC_READ *)p_buf;
19102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
19112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    switch (p_data->char_id.uuid.uu.uuid16)
19122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
19132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* GET_REPORT */
19142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    case GATT_UUID_HID_REPORT:
19152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    case GATT_UUID_HID_BT_KB_INPUT:
19162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    case GATT_UUID_HID_BT_KB_OUTPUT:
19172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    case GATT_UUID_HID_BT_MOUSE_INPUT:
19182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    case GATT_UUID_BATTERY_LEVEL: /* read battery level */
19192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_proc_get_rpt_cmpl(p_dev_cb, p_data);
19202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        break;
19212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
19222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    case GATT_UUID_HID_PROTO_MODE:
19232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_proc_read_proto_mode(p_dev_cb, p_data);
19242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        break;
19252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
19262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    default:
19272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR1("Unexpected Read UUID: 0x%04x", p_data->char_id.uuid.uu.uuid16);
19282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        break;
19292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
19302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
19312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
19322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
19332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
19342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_read_descr_cmpl
19352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
19362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      read characteristic descriptor is completed in CONN st.
19372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
19382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
19392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
19402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
19412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_read_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf)
19422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
19432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_RPT  *p_rpt;
19442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_READ * p_data = (tBTA_GATTC_READ *)p_buf;
19452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8   *pp;
19462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
19472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* if a report client configuration */
19482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data->descr_type.uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG)
19492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
19502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if ((p_rpt = bta_hh_le_find_report_entry(p_dev_cb,
19512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                 BTA_HH_LE_SRVC_DEF,
19522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                 p_data->char_id.uuid.uu.uuid16,
19532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                 p_data->char_id.inst_id)) != NULL)
19542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
19552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            pp = p_data->p_value->unformat.p_value;
19562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            STREAM_TO_UINT16(p_rpt->client_cfg_value, pp);
19572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
19582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            APPL_TRACE_DEBUG1("Read Client Configuration: 0x%04x", p_rpt->client_cfg_value);
19592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
19602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
19612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
19622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
19632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_read_battery_level_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ * p_data)
19642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
19652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_RPT  *p_rpt;
19662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT16 descr_uuid = p_data->descr_type.uuid.uu.uuid16;
19672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
19682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* read report reference descriptor for battery level is completed */
19692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (descr_uuid == GATT_UUID_RPT_REF_DESCR)
19702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
19712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if ((p_rpt = bta_hh_le_find_report_entry(p_dev_cb,
19722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                            p_data->srvc_id.id.inst_id,
19732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                            GATT_UUID_BATTERY_LEVEL,
19742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                            p_data->char_id.inst_id)) == NULL)
19752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
19762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_search_hid_chars(p_dev_cb);
19772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
19782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
19792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_save_rpt_ref(p_dev_cb, p_rpt, p_data);
19802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
19812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
19822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
19832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
19842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
19852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_w4_le_read_descr_cmpl
19862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
19872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      read characteristic descriptor is completed in W4_CONN st.
19882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
19892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
19902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
19912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
19922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_w4_le_read_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf)
19932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
19942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_RPT  *p_rpt;
19952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_READ * p_data = (tBTA_GATTC_READ *)p_buf;
19962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT16 char_uuid16;
19972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
19982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data == NULL)
19992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
20002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
20012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    char_uuid16 = p_data->char_id.uuid.uu.uuid16;
20022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
20032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE
20042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    APPL_TRACE_DEBUG2("bta_hh_w4_le_read_descr_cmpl uuid: %s(0x%04x)",
20052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        bta_hh_uuid_to_str(p_data->descr_type.uuid.uu.uuid16),
20062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        p_data->descr_type.uuid.uu.uuid16);
20072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
20082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    switch (char_uuid16)
20092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
20102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    case GATT_UUID_HID_REPORT:
20112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if ((p_rpt = bta_hh_le_find_report_entry(p_dev_cb,
20122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                            p_data->srvc_id.id.inst_id,
20132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                            GATT_UUID_HID_REPORT,
20142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                            p_data->char_id.inst_id)) == NULL)
20152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
20162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_search_hid_chars(p_dev_cb);
20172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
20182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
20192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_save_rpt_ref(p_dev_cb, p_rpt, p_data);
20202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        break;
20212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
20222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    case GATT_UUID_HID_REPORT_MAP:
20232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_save_ext_rpt_ref(p_dev_cb, p_data);
20242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        break;
20252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
20262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    case GATT_UUID_BATTERY_LEVEL:
20272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_read_battery_level_descr_cmpl(p_dev_cb, p_data);
20282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        break;
20292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
20302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    default:
20312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR1("unknown descriptor read complete for uuid: 0x%04x", char_uuid16);
20322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        break;
20332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
20342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
20352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
20362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
20372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
20382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_w4_le_write_cmpl
20392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
20402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Write charactersitic complete event at W4_CONN st.
20412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
20422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
20432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
20442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
20452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_w4_le_write_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf)
20462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
20472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_WRITE    *p_data = (tBTA_GATTC_WRITE *)p_buf;
20482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
20492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data == NULL)
20502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
20512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
20522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data->char_id.uuid.uu.uuid16 == GATT_UUID_HID_PROTO_MODE)
20532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
20542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb->status = (p_data->status == BTA_GATT_OK) ? BTA_HH_OK : BTA_HH_ERR_PROTO;
20552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
20562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if ((p_dev_cb->disc_active & BTA_HH_LE_DISC_HIDS) != 0)
20572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
20582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_search_hid_chars(p_dev_cb);
20592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
20602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
20612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
20622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_open_cmpl(p_dev_cb);
20632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
20642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
20652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
20662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
20672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
20682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_write_cmpl
20692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
20702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Write charactersitic complete event at CONN st.
20712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
20722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
20732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
20742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
20752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_write_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf)
20762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
20772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_WRITE    *p_data = (tBTA_GATTC_WRITE *)p_buf;
20782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_CBDATA      cback_data ;
20792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT16              cb_evt = p_dev_cb->w4_evt;
20802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
20812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data == NULL  || cb_evt == 0)
20822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
20832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
20842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG
20852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    APPL_TRACE_DEBUG1("bta_hh_le_write_cmpl w4_evt: %d", p_dev_cb->w4_evt);
20862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
20872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    switch (p_data->char_id.uuid.uu.uuid16)
20882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
20892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* Set protocol finished */
20902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    case GATT_UUID_HID_PROTO_MODE:
20912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        cback_data.handle  = p_dev_cb->hid_handle;
20922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_data->status == BTA_GATT_OK)
20932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
20942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_register_input_notif(p_dev_cb, p_data->srvc_id.id.inst_id, p_dev_cb->mode, FALSE);
20952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            cback_data.status = BTA_HH_OK;
20962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
20972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
20982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            cback_data.status =  BTA_HH_ERR;
20992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb->w4_evt = 0;
21002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        (* bta_hh_cb.p_cback)(cb_evt, (tBTA_HH *)&cback_data);
21012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        break;
21022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
21032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* Set Report finished */
21042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    case GATT_UUID_HID_REPORT:
21052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    case GATT_UUID_HID_BT_KB_INPUT:
21062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    case GATT_UUID_HID_BT_MOUSE_INPUT:
21072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    case GATT_UUID_HID_BT_KB_OUTPUT:
21082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        cback_data.handle  = p_dev_cb->hid_handle;
21092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        cback_data.status = (p_data->status == BTA_GATT_OK)? BTA_HH_OK : BTA_HH_ERR;
21102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb->w4_evt = 0;
21112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        (* bta_hh_cb.p_cback)(cb_evt, (tBTA_HH *)&cback_data);
21122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        break;
21132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
21142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    case GATT_UUID_SCAN_INT_WINDOW:
21152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_register_scpp_notif(p_dev_cb, p_data->status);
21162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        break;
21172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
21182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
21192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    default:
21202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        break;
21212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
21222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
21232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
21242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
21252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
21262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_write_char_descr_cmpl
21272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
21282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Write charactersitic descriptor complete event
21292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
21302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
21312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
21322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
21332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_write_char_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf)
21342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
21352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_WRITE    *p_data = (tBTA_GATTC_WRITE *)p_buf;
21362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8   srvc_inst_id, hid_inst_id;
21372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
21382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* only write client configuration possible */
21392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data && p_data->descr_type.uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG)
21402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
21412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        srvc_inst_id = p_data->srvc_id.id.inst_id;
21422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hid_inst_id = srvc_inst_id;
21432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        switch (p_data->char_id.uuid.uu.uuid16)
21442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
21452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_BATTERY_LEVEL: /* battery level clt cfg registered */
21462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            hid_inst_id = bta_hh_le_find_service_inst_by_battery_inst_id(p_dev_cb, srvc_inst_id);
21472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            /* fall through */
21482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_BT_KB_INPUT:
21492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_BT_MOUSE_INPUT:
21502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_HID_REPORT:
21512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (p_data->status == BTA_GATT_OK)
21522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                p_dev_cb->hid_srvc[hid_inst_id].report[p_dev_cb->clt_cfg_idx ++].client_cfg_value =
21532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        BTA_GATT_CLT_CONFIG_NOTIFICATION;
21542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
21552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_write_rpt_clt_cfg(p_dev_cb, hid_inst_id);
21562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
21572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
21582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
21592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATT_UUID_SCAN_REFRESH:
21602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_register_scpp_notif_cmpl(p_dev_cb, p_data->status);
21612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
21622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        default:
21632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            APPL_TRACE_ERROR1("Unknown char ID clt cfg: 0x%04x", p_data->char_id.uuid.uu.uuid16);
21642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
21652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
21662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
21672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
21682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG == TRUE
21692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR2("Unexpected write to %s(0x%04x)",
21702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        bta_hh_uuid_to_str(p_data->descr_type.uuid.uu.uuid16),
21712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        p_data->descr_type.uuid.uu.uuid16);
21722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#else
21732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR1("Unexpected write to (0x%04x)", p_data->descr_type.uuid.uu.uuid16);
21742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
21752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
21762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
21772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
21782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
21792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
21802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_input_rpt_notify
21812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
21822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      process the notificaton event, most likely for input report.
21832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
21842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
21852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
21862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
21872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_input_rpt_notify(tBTA_GATTC_NOTIFY *p_data)
21882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
21892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_DEV_CB       *p_dev_cb = bta_hh_le_find_dev_cb_by_conn_id(p_data->conn_id);
21902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8           app_id;
21912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8           *p_buf;
21922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_RPT  *p_rpt;
21932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
21942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_dev_cb == NULL)
21952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
21962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR0("notification received from Unknown device");
21972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
21982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
21992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
22002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    app_id= p_dev_cb->app_id;
22012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
22022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_rpt = bta_hh_le_find_report_entry(p_dev_cb,
22032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                        BTA_HH_LE_SRVC_DEF,
22042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                        p_data->char_id.char_id.uuid.uu.uuid16,
22052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                        p_data->char_id.char_id.inst_id);
22062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_rpt == NULL)
22072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
22082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR0("notification received for Unknown Report");
22092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
22102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
22112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
22122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data->char_id.char_id.uuid.uu.uuid16 == GATT_UUID_HID_BT_MOUSE_INPUT)
22132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        app_id = BTA_HH_APP_ID_MI;
22142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else if (p_data->char_id.char_id.uuid.uu.uuid16 == GATT_UUID_HID_BT_KB_INPUT)
22152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        app_id = BTA_HH_APP_ID_KB;
22162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
22170ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach    APPL_TRACE_ERROR1("Notification received on report ID: %d", p_rpt->rpt_id);
22180ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach
22192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* need to append report ID to the head of data */
22200ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach    if (p_rpt->rpt_id != 0)
22212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
22220ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach        if ((p_buf = (UINT8 *)GKI_getbuf((UINT16)(p_data->len + 1))) == NULL)
22230ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach        {
22240ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach            APPL_TRACE_ERROR0("No resources to send report data");
22250ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach            return;
22260ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach        }
22272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
22280ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach        p_buf[0] = p_rpt->rpt_id;
22290ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach        memcpy(&p_buf[1], p_data->value, p_data->len);
22300ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach        ++p_data->len;
22310ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach    } else {
22320ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach        p_buf = p_data->value;
22330ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach    }
22342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
22352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_co_data((UINT8)p_dev_cb->hid_handle,
22362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    p_buf,
22372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    p_data->len,
22382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    p_dev_cb->mode,
22392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    0 , /* no sub class*/
22402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    p_dev_cb->dscp_info.ctry_code,
22412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    p_dev_cb->addr,
22422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                    app_id);
22432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
22440ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach    if (p_buf != p_data->value)
22450ef5e93291bd4c6d8dedfd012cc27ee7c9b30c0dAndre Eisenbach        GKI_freebuf(p_buf);
22462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
22472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
22482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
22492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
22502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
22512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_gatt_open_fail
22522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
22532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      action function to process the open fail
22542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
22552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
22562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
22572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
22582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_open_fail(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
22592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
22602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_CONN            conn_dat ;
22612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_HID_SRVC     *p_hid_srvc = &p_cb->hid_srvc[0];
22622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8   i;
22632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
22642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->disc_active = BTA_HH_LE_DISC_NONE;
22652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* Failure in opening connection or GATT discovery failure */
22662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    conn_dat.handle = p_cb->hid_handle;
22672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    memcpy(conn_dat.bda, p_cb->addr, BD_ADDR_LEN);
22682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    conn_dat.le_hid = TRUE;
22692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    conn_dat.scps_supported = p_cb->scps_supported;
22702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
22712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb->status == BTA_HH_OK)
22722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        conn_dat.status = (p_data->le_close.reason == BTA_GATT_CONN_UNKNOWN) ? p_cb->status : BTA_HH_ERR;
22732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
22742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        conn_dat.status = p_cb->status;
22752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
22762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++, p_hid_srvc ++)
22772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
22782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        utl_freebuf((void **)&p_hid_srvc->rpt_map);
22792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        memset(p_hid_srvc, 0, sizeof(tBTA_HH_LE_HID_SRVC));
22802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
22812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
22822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* Report OPEN fail event */
22832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat);
22842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
22852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
22862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
22872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
22882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_gatt_close
22892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
22902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      action function to process the GATT close int he state machine.
22912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
22922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
22932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
22942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
22952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_gatt_close(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
22962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
22972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_CBDATA          disc_dat = {BTA_HH_OK, 0};
22982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
22992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* finaliza device driver */
23002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_co_close(p_cb->hid_handle, p_cb->app_id);
23012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* update total conn number */
23022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_cb.cnt_num --;
23032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
23042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    disc_dat.handle = p_cb->hid_handle;
23052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    disc_dat.status = p_cb->status;
23062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
23072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    (*bta_hh_cb.p_cback)(BTA_HH_CLOSE_EVT, (tBTA_HH *)&disc_dat);
23082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
23092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* if no connection is active and HH disable is signaled, disable service */
23102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable)
23112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
23122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_disc_cmpl();
23132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
23142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
23152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
23162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_RECONN == TRUE)
23172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data->le_close.reason == BTA_GATT_CONN_TIMEOUT)
23182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
23192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_add_dev_bg_conn(p_cb, FALSE);
23202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
23212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
23222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
23232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
23242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return;
23252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
23262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
23272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
23282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
23292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_api_disc_act
23302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
23312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      initaite a Close API to a remote HID device
23322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
23332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
23342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
23352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
23362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_api_disc_act(tBTA_HH_DEV_CB *p_cb)
23372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
23382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb->conn_id != BTA_GATT_INVALID_CONN_ID)
23392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        BTA_GATTC_Close(p_cb->conn_id);
23402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
23412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
23422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
23432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
23442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_get_rpt
23452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
23462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      GET_REPORT on a LE HID Report
23472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
23482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
23492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
23502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
23512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_get_rpt(tBTA_HH_DEV_CB *p_cb, UINT8 srvc_inst, tBTA_HH_RPT_TYPE r_type, UINT8 rpt_id)
23522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
23532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_RPT  *p_rpt = bta_hh_le_find_rpt_by_idtype(p_cb->hid_srvc[srvc_inst].report, p_cb->mode, r_type, rpt_id);
23542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_CHAR_ID  char_id;
23552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT16  srvc_uuid = UUID_SERVCLASS_LE_HID;
23562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
23572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_rpt == NULL)
23582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
23592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR0("bta_hh_le_get_rpt: no matching report");
23602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
23612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
23622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL)
23632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        srvc_uuid = UUID_SERVCLASS_BATTERY;
23642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
23652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->w4_evt = BTA_HH_GET_RPT_EVT;
23662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
23672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_fill_16bits_srvc_id(TRUE, srvc_inst, srvc_uuid, &char_id.srvc_id);
23682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_fill_16bits_char_id(p_rpt->inst_id, p_rpt->uuid, &char_id.char_id);
23692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
23702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    BTA_GATTC_ReadCharacteristic(p_cb->conn_id,
23712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                 &char_id,
23722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                 BTA_GATT_AUTH_REQ_NONE);
23732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
23742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
23752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
23762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
23772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_write_rpt
23782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
23792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      SET_REPORT/or DATA output on a LE HID Report
23802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
23812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
23822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
23832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
23842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_write_rpt(tBTA_HH_DEV_CB *p_cb, UINT8 srvc_inst,
23852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                         tBTA_GATTC_WRITE_TYPE   write_type,
23862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                         tBTA_HH_RPT_TYPE r_type,
23872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                         BT_HDR *p_buf, UINT16 w4_evt )
23882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
23892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_RPT  *p_rpt;
23902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_CHAR_ID  char_id;
23912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8   *p_value, rpt_id;
23922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
23932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_buf == NULL || p_buf->len == 0)
23942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
23952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR0("bta_hh_le_write_rpt: Illegal data");
23962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
23972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
23982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
23992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* strip report ID from the data */
24002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_value = (UINT8 *)(p_buf + 1) + p_buf->offset;
24012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    STREAM_TO_UINT8(rpt_id, p_value);
24022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_buf->len -= 1;
24032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
24042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_rpt = bta_hh_le_find_rpt_by_idtype(p_cb->hid_srvc[srvc_inst].report, p_cb->mode, r_type, rpt_id);
24052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
24062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_rpt == NULL)
24072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
24082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR0("bta_hh_le_write_rpt: no matching report");
24092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
24102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
24112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
24122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    APPL_TRACE_ERROR2("bta_hh_le_write_rpt: ReportID: 0x%02x Data Len: %d", rpt_id, p_buf->len);
24132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
24142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->w4_evt = w4_evt;
24152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
24162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_fill_16bits_srvc_id(TRUE, srvc_inst, UUID_SERVCLASS_LE_HID, &char_id.srvc_id);
24172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_fill_16bits_char_id(p_rpt->inst_id, p_rpt->uuid, &char_id.char_id);
24182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
24192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    BTA_GATTC_WriteCharValue(p_cb->conn_id,
24202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                             &char_id,
24212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                             write_type, /* default to use write request */
24222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                             p_buf->len,
24232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                             p_value,
24242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                             BTA_GATT_AUTH_REQ_NONE);
24252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
24262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
24272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
24282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
24292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_suspend
24302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
24312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      send LE suspend or exit suspend mode to remote device.
24322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
24332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
24342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
24352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
24362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_suspend(tBTA_HH_DEV_CB *p_cb, tBTA_HH_TRANS_CTRL_TYPE ctrl_type)
24372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
24382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8 i;
24392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_CHAR_ID  char_id;
24402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
24412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    ctrl_type -= BTA_HH_CTRL_SUSPEND;
24422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
24432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++)
24442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
24452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_fill_16bits_srvc_id(TRUE, i, UUID_SERVCLASS_LE_HID, &char_id.srvc_id);
24462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_fill_16bits_char_id(0, GATT_UUID_HID_CONTROL_POINT, &char_id.char_id);
24472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
24482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        BTA_GATTC_WriteCharValue(p_cb->conn_id,
24492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                 &char_id,
24502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                 BTA_GATTC_TYPE_WRITE_NO_RSP, /* default to use write request */
24512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                 1,
24522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                 &ctrl_type,
24532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                 BTA_GATT_AUTH_REQ_NONE);
24542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
24552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
24562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
24572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
24582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
24592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_write_dev_act
24602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
24612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Write LE device action. can be SET/GET/DATA transaction.
24622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
24632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
24642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
24652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
24662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_write_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
24672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
24682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    switch(p_data->api_sndcmd.t_type)
24692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
24702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case HID_TRANS_SET_PROTOCOL:
24712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_cb->w4_evt = BTA_HH_SET_PROTO_EVT;
24722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_set_protocol_mode(p_cb, p_data->api_sndcmd.param);
24732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
24742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
24752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case HID_TRANS_GET_PROTOCOL:
24762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_get_protocol_mode(p_cb);
24772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
24782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
24792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case HID_TRANS_GET_REPORT:
24802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_get_rpt(p_cb,
24812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                              BTA_HH_LE_SRVC_DEF,
24822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                              p_data->api_sndcmd.param,
24832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                              p_data->api_sndcmd.rpt_id);
24842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
24852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
24862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case HID_TRANS_SET_REPORT:
24872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_write_rpt(p_cb,
24882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                BTA_HH_LE_SRVC_DEF,
24892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                BTA_GATTC_TYPE_WRITE,
24902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                p_data->api_sndcmd.param,
24912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                p_data->api_sndcmd.p_data,
24922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                BTA_HH_SET_RPT_EVT);
24932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
24942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
24952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case HID_TRANS_DATA:  /* output report */
24962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
24972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_write_rpt(p_cb,
24982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                BTA_HH_LE_SRVC_DEF,
24992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                BTA_GATTC_TYPE_WRITE_NO_RSP,
25002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                p_data->api_sndcmd.param,
25012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                p_data->api_sndcmd.p_data,
25022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                BTA_HH_DATA_EVT);
25032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
25042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
25052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case HID_TRANS_CONTROL:
25062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            /* no handshake event will be generated */
25072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            /* if VC_UNPLUG is issued, set flag */
25082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (p_data->api_sndcmd.param == BTA_HH_CTRL_SUSPEND ||
25092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                p_data->api_sndcmd.param == BTA_HH_CTRL_EXIT_SUSPEND)
25102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
25112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                bta_hh_le_suspend(p_cb, p_data->api_sndcmd.param);
25122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
25132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
25142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
25152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        default:
25162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            APPL_TRACE_ERROR1("unsupported trsanction for LE HID device: %d", p_data->api_sndcmd.t_type);
25172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
25182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
25192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
25202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
25212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
25222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
25232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_get_dscp_act
25242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
25252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Send ReportDescriptor to application for all HID services.
25262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
25272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
25282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
25292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
25302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_get_dscp_act(tBTA_HH_DEV_CB *p_cb)
25312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
25322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8 i;
25332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
25342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i = 0 ;i < BTA_HH_LE_HID_SRVC_MAX; i ++)
25352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
25362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_cb->hid_srvc[i].in_use)
25372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
25382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_cb->dscp_info.descriptor.dl_len = p_cb->hid_srvc[i].descriptor.dl_len;
25392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_cb->dscp_info.descriptor.dsc_list = p_cb->hid_srvc[i].descriptor.dsc_list;
25402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
25412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            (*bta_hh_cb.p_cback)(BTA_HH_GET_DSCP_EVT, (tBTA_HH *)&p_cb->dscp_info);
25422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
25432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
25442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
25452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
25462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
25472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
25482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
25492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
25502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_add_dev_bg_conn
25512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
25522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Remove a LE HID device from back ground connection procedure.
25532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
25542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
25552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
25562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
25572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_add_dev_bg_conn(tBTA_HH_DEV_CB *p_cb, BOOLEAN check_bond)
25582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
25592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8           sec_flag=0;
25602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    BOOLEAN         to_add = TRUE;
25612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
25622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (check_bond)
25632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
25642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* start reconnection if remote is a bonded device */
25652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* verify bond */
25662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        BTM_GetSecurityFlags(p_cb->addr, &sec_flag);
25672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
25682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if ((sec_flag & BTM_SEC_FLAG_LKEY_KNOWN) == 0)
25692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            to_add = FALSE;
25702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
25712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
25722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (/*p_cb->dscp_info.flag & BTA_HH_LE_NORMAL_CONN &&*/
25732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        !p_cb->in_bg_conn && to_add)
25742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
25752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* add device into BG connection to accept remote initiated connection */
25762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        BTA_GATTC_Open(bta_hh_cb.gatt_if, p_cb->addr, FALSE);
25772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->in_bg_conn = TRUE;
25782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
25792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        BTA_DmBleSetBgConnType(BTA_DM_BLE_CONN_AUTO, NULL);
25802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
25812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return;
25822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
25832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
25842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
25852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
25862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_add_device
25872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
25882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Add a LE HID device as a known device, and also add the address
25892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  into back ground connection WL for incoming connection.
25902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
25912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
25922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
25932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
25942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachUINT8 bta_hh_le_add_device(tBTA_HH_DEV_CB *p_cb, tBTA_HH_MAINT_DEV *p_dev_info)
25952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
25962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
25972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* update DI information */
25982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_update_di_info(p_cb,
25992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                          p_dev_info->dscp_info.vendor_id,
26002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                          p_dev_info->dscp_info.product_id,
26012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                          p_dev_info->dscp_info.version,
26022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                          p_dev_info->dscp_info.flag);
26032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
26042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* add to BTA device list */
26052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_add_device_to_list(p_cb, p_cb->hid_handle,
26062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                              p_dev_info->attr_mask,
26072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                              &p_dev_info->dscp_info.descriptor,
26082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                              p_dev_info->sub_class,
26092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                              p_dev_info->dscp_info.ssr_max_latency,
26102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                              p_dev_info->dscp_info.ssr_min_tout,
26112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                              p_dev_info->app_id);
26122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
26132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_add_dev_bg_conn(p_cb, FALSE);
26142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
26152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return p_cb->hid_handle;
26162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
26172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
26182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
26192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
26202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_remove_dev_bg_conn
26212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
26222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Remove a LE HID device from back ground connection procedure.
26232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
26242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
26252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
26262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
26272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_remove_dev_bg_conn(tBTA_HH_DEV_CB *p_dev_cb)
26282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
26292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_dev_cb->in_bg_conn)
26302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
26312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb->in_bg_conn = FALSE;
26322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
26332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        BTA_GATTC_CancelOpen(bta_hh_cb.gatt_if, p_dev_cb->addr, FALSE);
26342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
26352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
26362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
26372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
26382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_update_scpp
26392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
26402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      action function to update the scan parameters on remote HID
26412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  device
26422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
26432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
26442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
26452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
26462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_update_scpp(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf)
26472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
26482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_CHAR_ID  char_id;
26492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8   value[4], *p = value;
26502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_CBDATA      cback_data ;
26512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
26522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (!p_dev_cb->is_le_device ||
26532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb->mode != BTA_HH_PROTO_RPT_MODE ||
26542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb->scps_supported == FALSE)
26552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
26562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR0("Can not set ScPP scan paramter as boot host, or remote does not support ScPP ");
26572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
26582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        cback_data.handle = p_dev_cb->hid_handle;
26592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        cback_data.status = BTA_HH_ERR;
26602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        (* bta_hh_cb.p_cback)(BTA_HH_UPDATE_SCPP_EVT, (tBTA_HH *)&cback_data);
26612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
26622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
26632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
26642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
26652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_dev_cb->w4_evt = BTA_HH_UPDATE_SCPP_EVT;
26662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
26672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT16_TO_STREAM(p, p_buf->le_scpp_update.scan_int);
26682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT16_TO_STREAM(p, p_buf->le_scpp_update.scan_win);
26692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
26702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_fill_16bits_srvc_id(TRUE, BTA_HH_SCPP_INST_DEF, UUID_SERVCLASS_SCAN_PARAM, &char_id.srvc_id);
26712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_fill_16bits_char_id(BTA_HH_SCPP_INST_DEF, GATT_UUID_SCAN_INT_WINDOW, &char_id.char_id);
26722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
26732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    BTA_GATTC_WriteCharValue(p_dev_cb->conn_id,
26742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                             &char_id,
26752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                             BTA_GATTC_TYPE_WRITE_NO_RSP,
26762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                             2,
26772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                             value,
26782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                             BTA_GATT_AUTH_REQ_NONE);
26792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
26802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
26812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
26822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
26832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_gattc_callback
26842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
26852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      This is GATT client callback function used in BTA HH.
26862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
26872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
26882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
26892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
26902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data)
26912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
26922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_DEV_CB *p_dev_cb;
26932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT16          evt;
26942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG
26952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    APPL_TRACE_DEBUG1("bta_hh_gattc_callback event = %d", event);
26962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
26972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data == NULL)
26982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
26992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    switch (event)
27012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
27022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case BTA_GATTC_REG_EVT: /* 0 */
27032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_register_cmpl(&p_data->reg_oper);
27042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
27052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case BTA_GATTC_DEREG_EVT: /* 1 */
27072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_cleanup_disable(p_data->reg_oper.status);
27082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
27092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case BTA_GATTC_OPEN_EVT: /* 2 */
27112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_dev_cb = bta_hh_le_find_dev_cb_by_bda(p_data->open.remote_bda);
27122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_sm_execute(p_dev_cb, BTA_HH_GATT_OPEN_EVT, (tBTA_HH_DATA *)&p_data->open);
27132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
27142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case BTA_GATTC_READ_CHAR_EVT: /* 3 */
27162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case BTA_GATTC_READ_DESCR_EVT: /* 8 */
27172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_dev_cb = bta_hh_le_find_dev_cb_by_conn_id(p_data->read.conn_id);
27182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (event == BTA_GATTC_READ_CHAR_EVT)
27192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                evt = BTA_HH_GATT_READ_CHAR_CMPL_EVT;
27202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            else
27212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                evt = BTA_HH_GATT_READ_DESCR_CMPL_EVT;
27222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_sm_execute(p_dev_cb, evt, (tBTA_HH_DATA *)&p_data->read);
27242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
27252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case BTA_GATTC_WRITE_DESCR_EVT: /* 9 */
27272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case BTA_GATTC_WRITE_CHAR_EVT: /* 4 */
27282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_dev_cb = bta_hh_le_find_dev_cb_by_conn_id(p_data->write.conn_id);
27292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (event == BTA_GATTC_WRITE_CHAR_EVT)
27302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                evt = BTA_HH_GATT_WRITE_CHAR_CMPL_EVT;
27312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            else
27322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                evt = BTA_HH_GATT_WRITE_DESCR_CMPL_EVT;
27332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_sm_execute(p_dev_cb, evt, (tBTA_HH_DATA *)&p_data->write);
27352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
27362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case BTA_GATTC_CLOSE_EVT: /* 5 */
27382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_close(&p_data->close);
27392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
27402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case BTA_GATTC_SEARCH_CMPL_EVT: /* 6 */
27422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_srvc_search_cmpl(&p_data->search_cmpl);
27432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
27442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case BTA_GATTC_SEARCH_RES_EVT: /* 7 */
27462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_search_result(&p_data->srvc_res);
27472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
27482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case BTA_GATTC_NOTIF_EVT: /* 10 */
27522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_input_rpt_notify(&p_data->notify);
27532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
27542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        default:
27552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
27562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
27572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
27582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
27602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
27612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_hid_read_rpt_clt_cfg
27622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
27632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      a test command to read report descriptor client configuration
27642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
27652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
27662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
27672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
27682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_le_hid_read_rpt_clt_cfg(BD_ADDR bd_addr, UINT8 rpt_id)
27692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
27702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_DEV_CB *p_cb = NULL;
27712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_LE_RPT *p_rpt ;
27722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8           index = BTA_HH_IDX_INVALID;
27732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    index = bta_hh_find_cb(bd_addr);
27752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if ((index = bta_hh_find_cb(bd_addr))== BTA_HH_IDX_INVALID)
27762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
27772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR0("unknown device");
27782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
27792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
27802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb = &bta_hh_cb.kdev[index];
27822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_rpt = bta_hh_le_find_rpt_by_idtype(p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].report, p_cb->mode, BTA_HH_RPTT_INPUT, rpt_id);
27842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_rpt == NULL)
27862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
27872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        APPL_TRACE_ERROR0("bta_hh_le_write_rpt: no matching report");
27882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
27892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
27902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_read_char_dscrpt(p_cb,
27922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                               UUID_SERVCLASS_LE_HID,
27932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                               BTA_HH_LE_SRVC_DEF,
27942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                               p_rpt->uuid,
27952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                               p_rpt->inst_id,
27962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                               GATT_UUID_CHAR_CLIENT_CONFIG);
27972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
27992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
28002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return;
28012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
28022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
28032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
28042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_search_scps
28052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
28062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      discovery scan parameter service if act as report host, otherwise
28072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  finish LE connection.
28082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
28092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
28102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
28112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
28122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_search_scps(tBTA_HH_DEV_CB *p_cb)
28132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
28142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBT_UUID        pri_srvc;
28152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
28162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if ( p_cb->mode == BTA_HH_PROTO_RPT_MODE)
28172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
28182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->disc_active  |= BTA_HH_LE_DISC_SCPS;
28192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* start  service discovery for Scan Parameter service */
28202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        pri_srvc.len        = LEN_UUID_16;
28212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        pri_srvc.uu.uuid16  = UUID_SERVCLASS_SCAN_PARAM;
28222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
28232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        BTA_GATTC_ServiceSearchRequest(p_cb->conn_id, &pri_srvc);
28242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
28252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
28262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_open_cmpl(p_cb);
28272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
28282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
28292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
28302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_search_scps_chars
28312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
28322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      find ScPS optional characteristics scan refresh
28332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
28342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
28352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
28362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
28372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_search_scps_chars(tBTA_HH_DEV_CB *p_cb)
28382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
28392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATT_SRVC_ID   srvc_id;
28402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBT_UUID            char_cond;
28412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_CHAR_ID  char_result;
28422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATT_CHAR_PROP prop;
28432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
28442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->scps_supported = TRUE;
28452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_SCAN_PARAM, &srvc_id);
28462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
28472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    char_cond.len   = LEN_UUID_16;
28482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    char_cond.uu.uuid16 = GATT_UUID_SCAN_REFRESH;
28492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
28502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* look for scan refresh */
28512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (BTA_GATTC_GetFirstChar( p_cb->conn_id,
28522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                &srvc_id,
28532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                &char_cond,
28542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                &char_result,
28552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                &prop) == BTA_GATT_OK)
28562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
28572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (prop & BTA_GATT_CHAR_PROP_BIT_NOTIFY)
28582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_cb->scps_notify |= BTA_HH_LE_SCPS_NOTIFY_SPT;
28592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
28602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_cb->scps_notify = BTA_HH_LE_SCPS_NOTIFY_NONE;
28612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
28622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
28632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
28642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
28652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
28662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
28672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_register_scpp_notif
28682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
28692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      register scan parameter refresh notitication complete
28702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
28712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
28722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
28732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
28742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
28752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_register_scpp_notif(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATT_STATUS status)
28762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
28772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8               sec_flag=0;
28782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_GATTC_CHAR_ID  char_id;
28792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
28802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* if write scan parameter sucessful */
28812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* if bonded and notification is not enabled, configure the client configuration */
28822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (status == BTA_GATT_OK &&
28832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        (p_dev_cb->scps_notify & BTA_HH_LE_SCPS_NOTIFY_SPT) != 0 &&
28842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        (p_dev_cb->scps_notify & BTA_HH_LE_SCPS_NOTIFY_ENB) == 0)
28852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
28862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        BTM_GetSecurityFlags(p_dev_cb->addr, &sec_flag);
28872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if ((sec_flag & BTM_SEC_FLAG_LKEY_KNOWN))
28882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
28892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (bta_hh_le_write_char_clt_cfg (p_dev_cb,
28902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                              BTA_HH_SCPP_INST_DEF,
28912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                              UUID_SERVCLASS_SCAN_PARAM,
28922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                              BTA_HH_SCPP_INST_DEF,
28932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                              GATT_UUID_SCAN_REFRESH,
28942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                              BTA_GATT_CLT_CONFIG_NOTIFICATION))
28952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
28962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                bta_hh_le_fill_16bits_srvc_id(TRUE, BTA_HH_SCPP_INST_DEF, UUID_SERVCLASS_SCAN_PARAM, &char_id.srvc_id);
28972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                bta_hh_le_fill_16bits_char_id(BTA_HH_SCPP_INST_DEF, GATT_UUID_SCAN_REFRESH, &char_id.char_id);
28982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
28992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                BTA_GATTC_RegisterForNotifications(bta_hh_cb.gatt_if,
29002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                   p_dev_cb->addr,
29012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                                   &char_id);
29022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                return;
29032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
29042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
29052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
29062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_register_scpp_notif_cmpl(p_dev_cb, status);
29072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
29082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
29092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
29102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_le_register_scpp_notif_cmpl
29112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
29122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      action function to register scan parameter refresh notitication
29132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
29142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Parameters:
29152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
29162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
29172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_le_register_scpp_notif_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATT_STATUS status)
29182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
29192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_CBDATA      cback_data ;
29202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT16              cb_evt = p_dev_cb->w4_evt;
29212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
29222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (status == BTA_GATT_OK)
29232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_dev_cb->scps_notify = (BTA_HH_LE_SCPS_NOTIFY_ENB | BTA_HH_LE_SCPS_NOTIFY_SPT);
29242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
29252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    cback_data.handle  = p_dev_cb->hid_handle;
29262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    cback_data.status = (status == BTA_GATT_OK)? BTA_HH_OK : BTA_HH_ERR;
29272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_dev_cb->w4_evt = 0;
29282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    (* bta_hh_cb.p_cback)(cb_evt, (tBTA_HH *)&cback_data);
29292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
29302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
29312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
29322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
29332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
29342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
29352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
29362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2937