12e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*****************************************************************************
22e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
32e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**  Name:          srvc_eng.c
42e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
52e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**  Description:   this file contains the main Device Information Service over GATT
62e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                 server/client and request handling functions.
72e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
82e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**  Copyright (c) 2008-2011, Broadcom Corp., All Rights Reserved.
92e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**  Broadcom Bluetooth Core. Proprietary and confidential.
102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach******************************************************************************/
112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "bt_target.h"
132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "gatt_api.h"
152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "gatt_int.h"
162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "srvc_eng_int.h"
172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BLE_INCLUDED == TRUE
192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach//#if DIS_INCLUDED == TRUE
212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "srvc_dis_int.h"
222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach//#endif
232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#include "srvc_battery_int.h"
242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void srvc_eng_s_request_cback (UINT16 conn_id, UINT32 trans_id, UINT8 op_code, tGATTS_DATA *p_data);
262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void srvc_eng_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, tGATT_DISCONN_REASON reason);
272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void srvc_eng_c_cmpl_cback (UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status, tGATT_CL_COMPLETE *p_data);
282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic tGATT_CBACK srvc_gatt_cback =
302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    srvc_eng_connect_cback,
322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    srvc_eng_c_cmpl_cback,
332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    NULL,
342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    NULL,
352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    srvc_eng_s_request_cback
362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach} ;
372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/* type for action functions */
382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachtypedef void (*tSRVC_ENG_C_CMPL_ACTION)(tSRVC_CLCB *p_clcb, tGATTC_OPTYPE op,
392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                    tGATT_STATUS status, tGATT_CL_COMPLETE *p_data);
402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachconst tSRVC_ENG_C_CMPL_ACTION srvc_eng_c_cmpl_act[SRVC_ID_MAX] =
422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    dis_c_cmpl_cback,
442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach};
452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtSRVC_ENG_CB srvc_eng_cb;
472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         srvc_eng_find_conn_id_by_bd_addr
512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      The function searches all LCB with macthing bd address
532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          total number of clcb found.
552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachUINT16 srvc_eng_find_conn_id_by_bd_addr(BD_ADDR bda)
582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8 i_clcb;
602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tSRVC_CLCB    *p_clcb = NULL;
612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i_clcb = 0, p_clcb= srvc_eng_cb.clcb; i_clcb < SRVC_MAX_APPS; i_clcb++, p_clcb++)
632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_clcb->in_use && p_clcb->connected && !memcmp(p_clcb->bda, bda, BD_ADDR_LEN))
652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return p_clcb->conn_id;
672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return GATT_INVALID_CONN_ID;
712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         srvc_eng_find_clcb_by_bd_addr
762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      The function searches all LCBs with macthing bd address.
782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          Pointer to the found link conenction control block.
802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtSRVC_CLCB *srvc_eng_find_clcb_by_bd_addr(BD_ADDR bda)
832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8 i_clcb;
852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tSRVC_CLCB    *p_clcb = NULL;
862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i_clcb = 0, p_clcb= srvc_eng_cb.clcb; i_clcb < SRVC_MAX_APPS; i_clcb++, p_clcb++)
882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_clcb->in_use && p_clcb->connected && !memcmp(p_clcb->bda, bda, BD_ADDR_LEN))
902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return p_clcb;
922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return NULL;
962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         srvc_eng_find_clcb_by_conn_id
1002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      The function searches all LCBs with macthing connection ID.
1022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          Pointer to the found link conenction control block.
1042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
1062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtSRVC_CLCB *srvc_eng_find_clcb_by_conn_id(UINT16 conn_id)
1072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
1082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8 i_clcb;
1092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tSRVC_CLCB    *p_clcb = NULL;
1102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
1112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i_clcb = 0, p_clcb= srvc_eng_cb.clcb; i_clcb < SRVC_MAX_APPS; i_clcb++, p_clcb++)
1122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
1132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_clcb->in_use && p_clcb->connected && p_clcb->conn_id == conn_id)
1142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
1152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return p_clcb;
1162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
1172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
1182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
1192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return NULL;
1202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
1212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
1222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         srvc_eng_find_clcb_by_conn_id
1242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      The function searches all LCBs with macthing connection ID.
1262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          Pointer to the found link conenction control block.
1282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
1302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachUINT8 srvc_eng_find_clcb_idx_by_conn_id(UINT16 conn_id)
1312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
1322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8 i_clcb;
1332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tSRVC_CLCB    *p_clcb = NULL;
1342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
1352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i_clcb = 0, p_clcb= srvc_eng_cb.clcb; i_clcb < SRVC_MAX_APPS; i_clcb++, p_clcb++)
1362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
1372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_clcb->in_use && p_clcb->connected && p_clcb->conn_id == conn_id)
1382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
1392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return i_clcb;
1402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
1412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
1422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
1432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return SRVC_MAX_APPS;
1442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
1452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
1462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         srvc_eng_clcb_alloc
1482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      The function allocates a GATT profile  connection link control block
1502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns           NULL if not found. Otherwise pointer to the connection link block.
1522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
1542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtSRVC_CLCB *srvc_eng_clcb_alloc (UINT16 conn_id, BD_ADDR bda)
1552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
1562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8                   i_clcb = 0;
1572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tSRVC_CLCB      *p_clcb = NULL;
1582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
1592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i_clcb = 0, p_clcb= srvc_eng_cb.clcb; i_clcb < SRVC_MAX_APPS; i_clcb++, p_clcb++)
1602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
1612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (!p_clcb->in_use)
1622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
1632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_clcb->in_use      = TRUE;
1642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_clcb->conn_id     = conn_id;
1652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            p_clcb->connected   = TRUE;
1662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            memcpy (p_clcb->bda, bda, BD_ADDR_LEN);
1672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
1682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
1692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
1702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return p_clcb;
1712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
1722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
1732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         srvc_eng_clcb_dealloc
1752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      The function deallocates a GATT profile  connection link control block
1772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns           NTrue the deallocation is successful
1792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
1802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
1812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachBOOLEAN srvc_eng_clcb_dealloc (UINT16 conn_id)
1822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
1832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8                   i_clcb = 0;
1842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tSRVC_CLCB      *p_clcb = NULL;
1852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
1862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    for (i_clcb = 0, p_clcb= srvc_eng_cb.clcb; i_clcb < SRVC_MAX_APPS; i_clcb++, p_clcb++)
1872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
1882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_clcb->in_use && p_clcb->connected && (p_clcb->conn_id == conn_id))
1892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
1902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            memset(p_clcb, 0, sizeof(tSRVC_CLCB));
1912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return TRUE;
1922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
1932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
1942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return FALSE;
1952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
1962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
1972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**   Service Engine Server Attributes Database Read/Read Blob Request process
1982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
1992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachUINT8 srvc_eng_process_read_req (UINT8 clcb_idx, tGATT_READ_REQ *p_data, tGATTS_RSP *p_rsp, tGATT_STATUS *p_status)
2002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
2012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tGATT_STATUS    status = GATT_NOT_FOUND;
2022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8       act = SRVC_ACT_RSP;
2032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_data->is_long)
2052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_rsp->attr_value.offset = p_data->offset;
2062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_rsp->attr_value.handle = p_data->handle;
2082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (dis_valid_handle_range(p_data->handle))
2102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        act = dis_read_attr_value(clcb_idx, p_data->handle, &p_rsp->attr_value, p_data->is_long, p_status);
2112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else if (battery_valid_handle_range(p_data->handle))
2132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        act = battery_s_read_attr_value(clcb_idx, p_data->handle, &p_rsp->attr_value, p_data->is_long, p_status);
2142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
2162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        *p_status = status;
2172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return act;
2182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
2192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
2202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**   Service Engine Server Attributes Database write Request process
2212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
2222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachUINT8 srvc_eng_process_write_req (UINT8 clcb_idx, tGATT_WRITE_REQ *p_data, tGATTS_RSP *p_rsp, tGATT_STATUS *p_status)
2232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
2242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8       act = SRVC_ACT_RSP;
2252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (dis_valid_handle_range(p_data->handle))
2272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
2282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        act = dis_write_attr_value(p_data, p_status);
2292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
2302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else if (battery_valid_handle_range(p_data->handle))
2312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
2322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        act = battery_s_write_attr_value(clcb_idx, p_data, p_status);
2332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
2342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
2352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        *p_status = GATT_NOT_FOUND;
2362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return act;
2382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
2392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
2412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         srvc_eng_s_request_cback
2432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      GATT DIS attribute access request callback.
2452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void.
2472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
2492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void srvc_eng_s_request_cback (UINT16 conn_id, UINT32 trans_id, tGATTS_REQ_TYPE type,
2502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                        tGATTS_DATA *p_data)
2512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
2522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8       status = GATT_INVALID_PDU;
2532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tGATTS_RSP  rsp_msg ;
2542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8       act = SRVC_ACT_IGNORE;
2552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8   clcb_idx = srvc_eng_find_clcb_idx_by_conn_id(conn_id);
2562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    GATT_TRACE_EVENT1("srvc_eng_s_request_cback : recv type (0x%02x)", type);
2582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    memset(&rsp_msg, 0, sizeof(tGATTS_RSP));
2602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    srvc_eng_cb.clcb[clcb_idx].trans_id = trans_id;
2622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    switch (type)
2642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
2652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATTS_REQ_TYPE_READ:
2662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            act = srvc_eng_process_read_req(clcb_idx, &p_data->read_req, &rsp_msg, &status);
2672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
2682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATTS_REQ_TYPE_WRITE:
2702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            act = srvc_eng_process_write_req(clcb_idx, &p_data->write_req, &rsp_msg, &status);
2712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (!p_data->write_req.need_rsp)
2722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                act = SRVC_ACT_IGNORE;
2732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
2742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATTS_REQ_TYPE_WRITE_EXEC:
2762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            GATT_TRACE_EVENT0("Ignore GATT_REQ_EXEC_WRITE/WRITE_CMD" );
2772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
2782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        case GATTS_REQ_TYPE_MTU:
2802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            GATT_TRACE_EVENT1("Get MTU exchange new mtu size: %d", p_data->mtu);
2812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
2822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        default:
2842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            GATT_TRACE_EVENT1("Unknown/unexpected LE GAP ATT request: 0x%02x", type);
2852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            break;
2862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
2872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    srvc_eng_cb.clcb[clcb_idx].trans_id = 0;
2892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (act == SRVC_ACT_RSP)
2912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        GATTS_SendRsp (conn_id, trans_id, status, &rsp_msg);
2922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
2952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
2982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
2992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         srvc_eng_c_cmpl_cback
3002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Client operation complete callback.
3022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
3042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
3062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void srvc_eng_c_cmpl_cback (UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status,
3072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                   tGATT_CL_COMPLETE *p_data)
3082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
3092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tSRVC_CLCB   *p_clcb = srvc_eng_find_clcb_by_conn_id(conn_id);
3102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    GATT_TRACE_EVENT2 ("srvc_eng_c_cmpl_cback() - op_code: 0x%02x  status: 0x%02x ", op, status);
3122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_clcb == NULL)
3142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
3152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        GATT_TRACE_ERROR0("srvc_eng_c_cmpl_cback received for unknown connection");
3162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
3172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
3182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_clcb->cur_srvc_id != SRVC_ID_NONE &&
3202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_clcb->cur_srvc_id <= SRVC_ID_MAX)
3212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        srvc_eng_c_cmpl_act[p_clcb->cur_srvc_id - 1](p_clcb, op, status, p_data);
3222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
3232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
3262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         srvc_eng_connect_cback
3282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Gatt profile connection callback.
3302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
3322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
3342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void srvc_eng_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
3352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                        BOOLEAN connected, tGATT_DISCONN_REASON reason)
3362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
3372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    GATT_TRACE_EVENT5 ("srvc_eng_connect_cback: from %08x%04x connected:%d conn_id=%d reason = 0x%04x",
3382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                       (bda[0]<<24)+(bda[1]<<16)+(bda[2]<<8)+bda[3],
3392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                       (bda[4]<<8)+bda[5], connected, conn_id, reason);
3402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (connected)
3422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
3432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (srvc_eng_clcb_alloc(conn_id, bda) == NULL)
3442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
3452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            GATT_TRACE_ERROR0 ("srvc_eng_connect_cback: no_resource");
3462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            return;
3472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
3482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
3492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
3502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
3512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        srvc_eng_clcb_dealloc(conn_id);
3522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
3532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
3552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
3562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         srvc_eng_c_cmpl_cback
3582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Client operation complete callback.
3602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
3622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
3642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachBOOLEAN srvc_eng_request_channel (BD_ADDR remote_bda, UINT8 srvc_id )
3652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
3662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    BOOLEAN set = TRUE;
3672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tSRVC_CLCB  *p_clcb = srvc_eng_find_clcb_by_bd_addr(remote_bda);
3682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3692e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_clcb == NULL)
3702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_clcb = srvc_eng_clcb_alloc(0, remote_bda);
3712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_clcb && p_clcb->cur_srvc_id == SRVC_ID_NONE)
3732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_clcb->cur_srvc_id = srvc_id;
3742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
3752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        set = FALSE;
3762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return set;
3782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
3792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
3802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         srvc_eng_release_channel
3822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Client operation complete callback.
3842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
3862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
3872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
3882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid srvc_eng_release_channel (UINT16 conn_id)
3892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
3902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tSRVC_CLCB *p_clcb =  srvc_eng_find_clcb_by_conn_id(conn_id);
3912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_clcb->cur_srvc_id = SRVC_ID_NONE;
3932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* check pending request */
3952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    //if (p_clcb->pend_req == NULL)
3962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        GATT_Disconnect(p_clcb->conn_id);
3972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
3982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
3992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
4002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         srvc_eng_init
4012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
4022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      Initializa the GATT Service engine.
4032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
4042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
4052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre EisenbachtGATT_STATUS srvc_eng_init (void)
4062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
4072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBT_UUID          app_uuid = {LEN_UUID_16, {UUID_SERVCLASS_DEVICE_INFO}};
4082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (srvc_eng_cb.enabled)
4102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
4112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        GATT_TRACE_ERROR0("DIS already initalized");
4122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
4132e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
4142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
4152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        memset(&srvc_eng_cb, 0, sizeof(tDIS_CB));
4162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* Create a GATT profile service */
4182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        srvc_eng_cb.gatt_if = GATT_Register(&app_uuid, &srvc_gatt_cback);
4192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        GATT_StartIf(srvc_eng_cb.gatt_if);
4202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        GATT_TRACE_DEBUG1 ("Srvc_Init:  gatt_if=%d  ", srvc_eng_cb.gatt_if);
4222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        srvc_eng_cb.enabled = TRUE;
4242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach//#if DIS_INCLUDED == TRUE
4252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        dis_cb.dis_read_uuid_idx = 0xff;
4262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach//#endif
4272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
4282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    return GATT_SUCCESS;
4292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
4302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid srvc_sr_rsp(UINT8 clcb_idx, tGATT_STATUS st, tGATTS_RSP *p_rsp)
4322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
4332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (srvc_eng_cb.clcb[clcb_idx].trans_id != 0)
4342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
4352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        GATTS_SendRsp(srvc_eng_cb.clcb[clcb_idx].conn_id,
4362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                  srvc_eng_cb.clcb[clcb_idx].trans_id,
4372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                  st,
4382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                  p_rsp);
4392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        srvc_eng_cb.clcb[clcb_idx].trans_id = 0;
4412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
4422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
4432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid srvc_sr_notify(BD_ADDR remote_bda, UINT16 handle, UINT16 len, UINT8 *p_value)
4442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
4452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT16 conn_id = srvc_eng_find_conn_id_by_bd_addr(remote_bda);
4462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (conn_id != GATT_INVALID_CONN_ID)
4482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
4492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        GATTS_HandleValueNotification( conn_id, handle, len, p_value);
4502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
4512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
4522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
4542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
4562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
457