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