13fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************
23fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
31025687c6679608fe9df918f37011414ffc72b62Hemant Gupta *  Copyright (c) 2014 The Android Open Source Project
45b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski *  Copyright 2003-2012 Broadcom Corporation
53fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
63fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  Licensed under the Apache License, Version 2.0 (the "License");
73fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  you may not use this file except in compliance with the License.
83fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  You may obtain a copy of the License at:
93fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  http://www.apache.org/licenses/LICENSE-2.0
113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  Unless required by applicable law or agreed to in writing, software
133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  distributed under the License is distributed on an "AS IS" BASIS,
143fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  See the License for the specific language governing permissions and
163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  limitations under the License.
173fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta ******************************************************************************/
193fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************
213fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta *  This is the implementation of the API for the handsfree (HF role)
231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta *  subsystem of BTA
243fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
253fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta ******************************************************************************/
263fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
273fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#include <string.h>
28f355ef5a4d7fb667fc57a0dfb60f738d870e252eMyles Watson
291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bta_hf_client_api.h"
301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bta_hf_client_int.h"
3147d68ee6229ccec3deeaaf694fa86438d97333a4Scott James Remnant#include "osi/include/compat.h"
323fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
333fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*****************************************************************************
348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *  External Function Declarations
358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/
361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
373fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_HfClientEnable
408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
41bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * Description      Enable the HF CLient service. It does the following:
42bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal *                  1. Sets the state to initialized (control blocks)
43bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal *                  2. Starts the SDP for the client role (HF)
44bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal *                  3. Starts the RFCOMM server to accept incoming connections
45bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal *                  The function is synchronous and returns with an error code
46bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal *                  if anything went wrong. This should be the first call to the
47bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal *                  API before doing an BTA_HfClientOpen
488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          BTA_SUCCESS if OK, BTA_FAILURE otherwise.
508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
52bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket AgarwaltBTA_STATUS BTA_HfClientEnable(tBTA_HF_CLIENT_CBACK* p_cback, tBTA_SEC sec_mask,
53bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal                               tBTA_HF_CLIENT_FEAT features,
54bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal                               const char* p_service_name) {
55bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  return bta_hf_client_api_enable(p_cback, sec_mask, features, p_service_name);
563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
573fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
583fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_HfClientDisable
618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Disable the HF Client service
638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
67bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwalvoid BTA_HfClientDisable(void) { bta_hf_client_api_disable(); }
683fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
693fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_HfClientOpen
728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
73bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * Description      Opens up a RF connection to the remote device and
74bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal *                  subsequently set it up for a HF SLC
758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
79a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTA_HfClientOpen(const RawAddress& bd_addr, tBTA_SEC sec_mask,
80744eeca761b6d52d4e5fbbfa49c2d2adde0e6981Jakub Pawlowski                      uint16_t* p_handle) {
815eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  APPL_TRACE_DEBUG("%s", __func__);
82cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_HF_CLIENT_API_OPEN* p_buf =
83cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_HF_CLIENT_API_OPEN*)osi_malloc(sizeof(tBTA_HF_CLIENT_API_OPEN));
843fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
85bd3ae7cbf195caf91693046147b34d25b6317485Sanket Agarwal  if (!bta_hf_client_allocate_handle(bd_addr, p_handle)) {
86bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    APPL_TRACE_ERROR("%s: could not allocate handle", __func__);
87bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    return;
88bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  }
89bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal
90cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_HF_CLIENT_API_OPEN_EVT;
91bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  p_buf->hdr.layer_specific = *p_handle;
92744eeca761b6d52d4e5fbbfa49c2d2adde0e6981Jakub Pawlowski  p_buf->bd_addr = bd_addr;
93cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->sec_mask = sec_mask;
94717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
95cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
963fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
973fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
983fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_HfClientClose
1018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Close the current connection to an audio gateway.
1038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  Any current audio connection will also be closed
1048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
109cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_HfClientClose(uint16_t handle) {
110cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
1113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->event = BTA_HF_CLIENT_API_CLOSE_EVT;
113cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->layer_specific = handle;
114717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
115cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
1163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
1173fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
1183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
1198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_HfCllientAudioOpen
1218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Opens an audio connection to the currently connected
1238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                 audio gateway
1248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
129cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_HfClientAudioOpen(uint16_t handle) {
130cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
1313fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
132cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->event = BTA_HF_CLIENT_API_AUDIO_OPEN_EVT;
133cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->layer_specific = handle;
134717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
135cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
1363fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
1373fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
1383fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
1398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_HfClientAudioClose
1418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Close the currently active audio connection to an audio
1438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  gateway. The data connection remains open
1448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
149cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_HfClientAudioClose(uint16_t handle) {
150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
1513fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
152cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->event = BTA_HF_CLIENT_API_AUDIO_CLOSE_EVT;
153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->layer_specific = handle;
154717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
155cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
1563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
1573fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
1583fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
1598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         BTA_HfClientSendAT
1618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      send AT command
1638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
168cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_HfClientSendAT(uint16_t handle, tBTA_HF_CLIENT_AT_CMD_TYPE at,
169cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                        uint32_t val1, uint32_t val2, const char* str) {
170cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_HF_CLIENT_DATA_VAL* p_buf =
171cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      (tBTA_HF_CLIENT_DATA_VAL*)osi_malloc(sizeof(tBTA_HF_CLIENT_DATA_VAL));
172cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
173cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.event = BTA_HF_CLIENT_SEND_AT_CMD_EVT;
174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->uint8_val = at;
175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->uint32_val1 = val1;
176cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->uint32_val2 = val2;
177cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (str) {
179cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    strlcpy(p_buf->str, str, BTA_HF_CLIENT_NUMBER_LEN + 1);
180cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->str[BTA_HF_CLIENT_NUMBER_LEN] = '\0';
181cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
182cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->str[0] = '\0';
183cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
184cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
185cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  p_buf->hdr.layer_specific = handle;
186cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
187cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_sys_sendmsg(p_buf);
1883fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
1895eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal
1905eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal/*******************************************************************************
1915eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *
1925eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Function         BTA_HfClientDumpStatistics
1935eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *
1945eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Description      Dump statistics about the various control blocks
1955eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *                  and other relevant connection statistics
1965eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *
1975eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Returns          Void
1985eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *
1995eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal ******************************************************************************/
2005eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalvoid BTA_HfClientDumpStatistics(int fd) { bta_hf_client_dump_statistics(fd); }
201