btif_hf.c revision cc35559160745c60b42ae182002a59337d844d09
13af1f3b9220733f5e3a76fe38fbc397974678234Brian/****************************************************************************** 23af1f3b9220733f5e3a76fe38fbc397974678234Brian * 33af1f3b9220733f5e3a76fe38fbc397974678234Brian * Copyright (C) 2009-2012 Broadcom Corporation 43af1f3b9220733f5e3a76fe38fbc397974678234Brian * 53af1f3b9220733f5e3a76fe38fbc397974678234Brian * Licensed under the Apache License, Version 2.0 (the "License"); 63af1f3b9220733f5e3a76fe38fbc397974678234Brian * you may not use this file except in compliance with the License. 73af1f3b9220733f5e3a76fe38fbc397974678234Brian * You may obtain a copy of the License at: 83af1f3b9220733f5e3a76fe38fbc397974678234Brian * 93af1f3b9220733f5e3a76fe38fbc397974678234Brian * http://www.apache.org/licenses/LICENSE-2.0 103af1f3b9220733f5e3a76fe38fbc397974678234Brian * 113af1f3b9220733f5e3a76fe38fbc397974678234Brian * Unless required by applicable law or agreed to in writing, software 123af1f3b9220733f5e3a76fe38fbc397974678234Brian * distributed under the License is distributed on an "AS IS" BASIS, 133af1f3b9220733f5e3a76fe38fbc397974678234Brian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 143af1f3b9220733f5e3a76fe38fbc397974678234Brian * See the License for the specific language governing permissions and 153af1f3b9220733f5e3a76fe38fbc397974678234Brian * limitations under the License. 163af1f3b9220733f5e3a76fe38fbc397974678234Brian * 173af1f3b9220733f5e3a76fe38fbc397974678234Brian ******************************************************************************/ 183af1f3b9220733f5e3a76fe38fbc397974678234Brian 193af1f3b9220733f5e3a76fe38fbc397974678234Brian/************************************************************************************ 203af1f3b9220733f5e3a76fe38fbc397974678234Brian * 213af1f3b9220733f5e3a76fe38fbc397974678234Brian * Filename: btif_hf.c 223af1f3b9220733f5e3a76fe38fbc397974678234Brian * 233af1f3b9220733f5e3a76fe38fbc397974678234Brian * Description: Handsfree Profile Bluetooth Interface 243af1f3b9220733f5e3a76fe38fbc397974678234Brian * 253af1f3b9220733f5e3a76fe38fbc397974678234Brian * 263af1f3b9220733f5e3a76fe38fbc397974678234Brian ***********************************************************************************/ 273af1f3b9220733f5e3a76fe38fbc397974678234Brian 28af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca#include <hardware/bluetooth.h> 29af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca#include <hardware/bt_hf.h> 30af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca#include <stdlib.h> 313af1f3b9220733f5e3a76fe38fbc397974678234Brian 323af1f3b9220733f5e3a76fe38fbc397974678234Brian#define LOG_TAG "BTIF_HF" 333af1f3b9220733f5e3a76fe38fbc397974678234Brian#include "btif_common.h" 343af1f3b9220733f5e3a76fe38fbc397974678234Brian#include "btif_util.h" 35abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "btif_profile_queue.h" 364f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 374f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "bd.h" 385b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#include "bta_ag_api.h" 39c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca 40c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca/************************************************************************************ 413af1f3b9220733f5e3a76fe38fbc397974678234Brian** Constants & Macros 426acd63a4980951727939c0dd545a0324965b3834José Fonseca************************************************************************************/ 43d3eb25c575464bed7dbfc8be4717d85cb2928ec1Brian#ifndef BTIF_HSAG_SERVICE_NAME 448f0a331040fc6fa700ab2c5f96061844a2289599Jon TURNEY#define BTIF_HSAG_SERVICE_NAME ("Headset Gateway") 458f0a331040fc6fa700ab2c5f96061844a2289599Jon TURNEY#endif 468f0a331040fc6fa700ab2c5f96061844a2289599Jon TURNEY 47d3eb25c575464bed7dbfc8be4717d85cb2928ec1Brian#ifndef BTIF_HFAG_SERVICE_NAME 480d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#define BTIF_HFAG_SERVICE_NAME ("Handsfree Gateway") 490d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#endif 500d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 510d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#ifndef BTIF_HF_SERVICES 526512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin#define BTIF_HF_SERVICES (BTA_HSP_SERVICE_MASK | BTA_HFP_SERVICE_MASK ) 530d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#endif 540d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 550d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#ifndef BTIF_HF_SERVICE_NAMES 560d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#define BTIF_HF_SERVICE_NAMES {BTIF_HSAG_SERVICE_NAME , BTIF_HFAG_SERVICE_NAME} 570d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#endif 5879a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin 5979a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin#ifndef BTIF_HF_SECURITY 6079a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin#define BTIF_HF_SECURITY (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT) 610d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#endif 620d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 630d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#ifndef BTIF_HF_FEATURES 646512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin#define BTIF_HF_FEATURES ( BTA_AG_FEAT_3WAY | \ 650d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian BTA_AG_FEAT_ECNR | \ 666512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin BTA_AG_FEAT_REJECT | \ 676512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin BTA_AG_FEAT_ECS | \ 680d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian BTA_AG_FEAT_EXTERR | \ 690d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian BTA_AG_FEAT_BTRH | \ 7079a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin BTA_AG_FEAT_VREC | \ 7179a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin BTA_AG_FEAT_UNAT) 7279a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin#endif 730d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 740d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#define BTIF_HF_CALL_END_TIMEOUT 6 750d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 760d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#define BTIF_HF_INVALID_IDX -1 770d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 780d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/* Number of BTIF-HF control blocks */ 793af1f3b9220733f5e3a76fe38fbc397974678234Brian#define BTIF_HF_NUM_CB 2 803af1f3b9220733f5e3a76fe38fbc397974678234Brian 81062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin/* Max HF clients supported from App */ 825961732c1b59403b4e736fa354a64d4a0e5d8af2MichalUINT16 btif_max_hf_clients = -1; 835961732c1b59403b4e736fa354a64d4a0e5d8af2Michal 845961732c1b59403b4e736fa354a64d4a0e5d8af2Michal/* HF app ids for service registration */ 853af1f3b9220733f5e3a76fe38fbc397974678234Briantypedef enum { 863af1f3b9220733f5e3a76fe38fbc397974678234Brian BTIF_HF_ID_1 = 0, 873af1f3b9220733f5e3a76fe38fbc397974678234Brian BTIF_HF_ID_2, 88062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin#if (BTIF_HF_NUM_CB == 3) 895961732c1b59403b4e736fa354a64d4a0e5d8af2Michal BTIF_HF_ID_3 905961732c1b59403b4e736fa354a64d4a0e5d8af2Michal#endif 915961732c1b59403b4e736fa354a64d4a0e5d8af2Michal} bthf_hf_id_t; 923af1f3b9220733f5e3a76fe38fbc397974678234Brian 933af1f3b9220733f5e3a76fe38fbc397974678234BrianUINT16 bthf_hf_id[BTIF_HF_NUM_CB] = {BTIF_HF_ID_1, BTIF_HF_ID_2, 94fe36bc0c41ee7fd3aa7b364a8301d50613644f71Stéphane Marchesin #if (BTIF_HF_NUM_CB == 3) 95062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin BTIF_HF_ID_3 96062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin #endif 97062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin }; 98062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin 99062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin/************************************************************************************ 100062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin** Local type definitions 101fe36bc0c41ee7fd3aa7b364a8301d50613644f71Stéphane Marchesin************************************************************************************/ 102062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin 103062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin/************************************************************************************ 104062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin** Static variables 105062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin************************************************************************************/ 106062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesinstatic bthf_callbacks_t *bt_hf_callbacks = NULL; 107062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesinstatic int hf_idx = BTIF_HF_INVALID_IDX; 1083af1f3b9220733f5e3a76fe38fbc397974678234Brian 1090d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#define CHECK_BTHF_INIT() if (bt_hf_callbacks == NULL)\ 1105ac22877c98f4934cced4d42b9ec87245f266967Brian {\ 1115ac22877c98f4934cced4d42b9ec87245f266967Brian BTIF_TRACE_WARNING1("BTHF: %s: BTHF not initialized", __FUNCTION__);\ 1125ac22877c98f4934cced4d42b9ec87245f266967Brian return BT_STATUS_NOT_READY;\ 1135ac22877c98f4934cced4d42b9ec87245f266967Brian }\ 1145ac22877c98f4934cced4d42b9ec87245f266967Brian else\ 1155ac22877c98f4934cced4d42b9ec87245f266967Brian {\ 1165ac22877c98f4934cced4d42b9ec87245f266967Brian BTIF_TRACE_EVENT1("BTHF: %s", __FUNCTION__);\ 1175ac22877c98f4934cced4d42b9ec87245f266967Brian } 1185ac22877c98f4934cced4d42b9ec87245f266967Brian 1195ac22877c98f4934cced4d42b9ec87245f266967Brian#define CHECK_BTHF_SLC_CONNECTED() if (bt_hf_callbacks == NULL)\ 1205ac22877c98f4934cced4d42b9ec87245f266967Brian {\ 1215ac22877c98f4934cced4d42b9ec87245f266967Brian BTIF_TRACE_WARNING1("BTHF: %s: BTHF not initialized", __FUNCTION__);\ 1225ac22877c98f4934cced4d42b9ec87245f266967Brian return BT_STATUS_NOT_READY;\ 1235ac22877c98f4934cced4d42b9ec87245f266967Brian }\ 124c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian else if (btif_hf_cb.state != BTHF_CONNECTION_STATE_SLC_CONNECTED)\ 125c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian {\ 126c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian BTIF_TRACE_WARNING2("BTHF: %s: SLC connection not up. state=%s", __FUNCTION__, dump_hf_conn_state(btif_hf_cb.state));\ 127c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian return BT_STATUS_NOT_READY;\ 1280d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian }\ 129c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian else\ 1300d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian {\ 1316512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin BTIF_TRACE_EVENT1("BTHF: %s", __FUNCTION__);\ 1326512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin } 133c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 1346512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin/* BTIF-HF control block to map bdaddr to BTA handle */ 1356512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesintypedef struct _btif_hf_cb 1366512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin{ 1376512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin UINT16 handle; 1385ac22877c98f4934cced4d42b9ec87245f266967Brian bt_bdaddr_t connected_bda; 139c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian bthf_connection_state_t state; 1400d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian bthf_vr_state_t vr_state; 1410d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian tBTA_AG_PEER_FEAT peer_feat; 1420d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian int num_active; 1430d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian int num_held; 144af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca struct timespec call_end_timestamp; 1450d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian struct timespec connected_timestamp; 146af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca bthf_call_state_t call_setup_state; 1470e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal} btif_hf_cb_t; 148af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca 1499791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonsecastatic btif_hf_cb_t btif_hf_cb[BTIF_HF_NUM_CB]; 150974c49ed176de55aadb335a2956ef5dfec774a23Stephane Marchesin 1515b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca 152af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca/************************************************************************************ 15396c9b39a6a9553573fcbdb5fd6db0e9d59768442Jakob Bornecrantz** Static functions 1549791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca************************************************************************************/ 155af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca 1560d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/************************************************************************************ 1570d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian** Externs 1580d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian************************************************************************************/ 159abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin 160abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin/************************************************************************************ 161abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Functions 162abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin************************************************************************************/ 163abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin 164abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin/******************************************************************************* 165abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** 166abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Function is_connected 167abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** 168abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Description Internal function to check if HF is connected 169abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** 170abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Returns TRUE if connected 171abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** 172abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin*******************************************************************************/ 173abb436526974bd090853c0927ece0839f9143393Stéphane Marchesinstatic BOOLEAN is_connected(bt_bdaddr_t *bd_addr) 1740d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{ 1753af1f3b9220733f5e3a76fe38fbc397974678234Brian int i; 1763af1f3b9220733f5e3a76fe38fbc397974678234Brian for (i = 0; i < btif_max_hf_clients; ++i) 1773af1f3b9220733f5e3a76fe38fbc397974678234Brian { 1783af1f3b9220733f5e3a76fe38fbc397974678234Brian if (((btif_hf_cb[i].state == BTHF_CONNECTION_STATE_CONNECTED) || 1793af1f3b9220733f5e3a76fe38fbc397974678234Brian (btif_hf_cb[i].state == BTHF_CONNECTION_STATE_SLC_CONNECTED)) && 1803af1f3b9220733f5e3a76fe38fbc397974678234Brian ((bd_addr == NULL) || (bdcmp(bd_addr->address, 1812bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin btif_hf_cb[i].connected_bda.address) == 0))) 182abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin return TRUE; 1833af1f3b9220733f5e3a76fe38fbc397974678234Brian } 18491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell return FALSE; 18596ad8a36003a21180ad6b61aa0b7d7c9452b3449Jakob Bornecrantz} 1863af1f3b9220733f5e3a76fe38fbc397974678234Brian 18791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell/******************************************************************************* 1883af1f3b9220733f5e3a76fe38fbc397974678234Brian** 18991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell** Function btif_hf_idx_by_bdaddr 1903af1f3b9220733f5e3a76fe38fbc397974678234Brian** 1913af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description Internal function to get idx by bdaddr 1923af1f3b9220733f5e3a76fe38fbc397974678234Brian** 1933af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns idx 1943af1f3b9220733f5e3a76fe38fbc397974678234Brian** 1953af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/ 1963af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic int btif_hf_idx_by_bdaddr(bt_bdaddr_t *bd_addr) 1973af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 1983af1f3b9220733f5e3a76fe38fbc397974678234Brian int i; 1993af1f3b9220733f5e3a76fe38fbc397974678234Brian for (i = 0; i < btif_max_hf_clients; ++i) 2003af1f3b9220733f5e3a76fe38fbc397974678234Brian { 2013af1f3b9220733f5e3a76fe38fbc397974678234Brian if ((bdcmp(bd_addr->address, 2023af1f3b9220733f5e3a76fe38fbc397974678234Brian btif_hf_cb[i].connected_bda.address) == 0)) 2033af1f3b9220733f5e3a76fe38fbc397974678234Brian return i; 2043af1f3b9220733f5e3a76fe38fbc397974678234Brian } 205d3eb25c575464bed7dbfc8be4717d85cb2928ec1Brian return BTIF_HF_INVALID_IDX; 2064901410293b35ac6bb4759142b50fcc0be8a1b25Brian} 2074901410293b35ac6bb4759142b50fcc0be8a1b25Brian 20837cf13ed9a429c755f121daa1776b1b30a985ab3Brian/******************************************************************************* 209f69b5c56feb60791bad27d491ee9592238d4efb0Brian** 21037cf13ed9a429c755f121daa1776b1b30a985ab3Brian** Function callstate_to_callsetup 211d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin** 212d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin** Description Converts HAL call state to BTA call setup indicator value 213d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin** 214d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin** Returns BTA call indicator value 215d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin** 216d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin*******************************************************************************/ 217f69b5c56feb60791bad27d491ee9592238d4efb0Brianstatic UINT8 callstate_to_callsetup(bthf_call_state_t call_state) 218f69b5c56feb60791bad27d491ee9592238d4efb0Brian{ 219f69b5c56feb60791bad27d491ee9592238d4efb0Brian UINT8 call_setup = 0; 220f69b5c56feb60791bad27d491ee9592238d4efb0Brian if (call_state == BTHF_CALL_STATE_INCOMING) 221f69b5c56feb60791bad27d491ee9592238d4efb0Brian call_setup = 1; 222f69b5c56feb60791bad27d491ee9592238d4efb0Brian if (call_state == BTHF_CALL_STATE_DIALING) 223f69b5c56feb60791bad27d491ee9592238d4efb0Brian call_setup = 2; 224f69b5c56feb60791bad27d491ee9592238d4efb0Brian if (call_state == BTHF_CALL_STATE_ALERTING) 225f69b5c56feb60791bad27d491ee9592238d4efb0Brian call_setup = 3; 226f69b5c56feb60791bad27d491ee9592238d4efb0Brian 22737cf13ed9a429c755f121daa1776b1b30a985ab3Brian return call_setup; 22837cf13ed9a429c755f121daa1776b1b30a985ab3Brian} 22937cf13ed9a429c755f121daa1776b1b30a985ab3Brian 23037cf13ed9a429c755f121daa1776b1b30a985ab3Brian/******************************************************************************* 23137cf13ed9a429c755f121daa1776b1b30a985ab3Brian** 232e9259ad0d7f674a1f2f9156ba0baeedc0e7d0d54Brian** Function send_at_result 233abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** 234abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Description Send AT result code (OK/ERROR) 235abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** 236abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Returns void 237abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** 238ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin*******************************************************************************/ 239ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesinstatic void send_at_result(UINT8 ok_flag, UINT16 errcode, int idx) 240ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin{ 241ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin tBTA_AG_RES_DATA ag_res; 242ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin memset (&ag_res, 0, sizeof (ag_res)); 243ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin 244ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin ag_res.ok_flag = ok_flag; 24537cf13ed9a429c755f121daa1776b1b30a985ab3Brian if (ok_flag == BTA_AG_OK_ERROR) 24637cf13ed9a429c755f121daa1776b1b30a985ab3Brian { 24737cf13ed9a429c755f121daa1776b1b30a985ab3Brian ag_res.errcode = errcode; 24837cf13ed9a429c755f121daa1776b1b30a985ab3Brian } 2493af1f3b9220733f5e3a76fe38fbc397974678234Brian 2503af1f3b9220733f5e3a76fe38fbc397974678234Brian BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_UNAT_RES, &ag_res); 2516c29be9f41470b22c87ef571e10b5a9824800608Brian} 252c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 253c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian/******************************************************************************* 2546c29be9f41470b22c87ef571e10b5a9824800608Brian** 2553af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function send_indicator_update 2563af1f3b9220733f5e3a76fe38fbc397974678234Brian** 2573af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description Send indicator update (CIEV) 2583af1f3b9220733f5e3a76fe38fbc397974678234Brian** 2593af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns void 2603af1f3b9220733f5e3a76fe38fbc397974678234Brian** 2613af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/ 2623af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic void send_indicator_update (UINT16 indicator, UINT16 value) 2633af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 264b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell tBTA_AG_RES_DATA ag_res; 26591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell 26691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA)); 26791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell ag_res.ind.id = indicator; 26891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell ag_res.ind.value = value; 26941b3fcbf0404bc4a4f6588c0feef553bb65d4440Brian 2702154d1c5ac0bb37614ef00bed766e49635b519e8Brian BTA_AgResult(BTA_AG_HANDLE_ALL, BTA_AG_IND_RES, &ag_res); 2712154d1c5ac0bb37614ef00bed766e49635b519e8Brian} 2722154d1c5ac0bb37614ef00bed766e49635b519e8Brian 2732154d1c5ac0bb37614ef00bed766e49635b519e8Brianvoid clear_phone_state_multihf(int idx) 27491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell{ 275da253319f9e5d37d9c55b975ef9328545a3ac9b4Keith Whitwell btif_hf_cb[idx].call_setup_state = BTHF_CALL_STATE_IDLE; 2762154d1c5ac0bb37614ef00bed766e49635b519e8Brian btif_hf_cb[idx].num_active = btif_hf_cb[idx].num_held = 0; 2772154d1c5ac0bb37614ef00bed766e49635b519e8Brian} 27856ee132f9671f70ff2b3ee04659beac0dfc6126dKeith Whitwell 27937cf13ed9a429c755f121daa1776b1b30a985ab3Brian/******************************************************************************* 28037cf13ed9a429c755f121daa1776b1b30a985ab3Brian** 28137cf13ed9a429c755f121daa1776b1b30a985ab3Brian** Function btif_hf_latest_connected_idx 28291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell** 28337cf13ed9a429c755f121daa1776b1b30a985ab3Brian** Description Returns idx for latest connected HF 284de33b0dd231d646cbbc7ba6c25bf6dd04a96cd86Stéphane Marchesin** 2855d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin** Returns int 286de33b0dd231d646cbbc7ba6c25bf6dd04a96cd86Stéphane Marchesin** 2873af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/ 2883af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic int btif_hf_latest_connected_idx() 2893af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 2903af1f3b9220733f5e3a76fe38fbc397974678234Brian struct timespec now, conn_time_delta; 2910d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian int latest_conn_idx = BTIF_HF_INVALID_IDX, i; 2920d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 2930d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian clock_gettime(CLOCK_MONOTONIC, &now); 2943af1f3b9220733f5e3a76fe38fbc397974678234Brian conn_time_delta.tv_sec = now.tv_sec; 2953af1f3b9220733f5e3a76fe38fbc397974678234Brian 2962bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin for (i = 0; i < btif_max_hf_clients; i++) 2973af1f3b9220733f5e3a76fe38fbc397974678234Brian { 2985b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell if (btif_hf_cb[i].state == BTHF_CONNECTION_STATE_SLC_CONNECTED) 2993af1f3b9220733f5e3a76fe38fbc397974678234Brian { 300d0bca086ab6d032909e9a429720fea297c536f97Brian if ((now.tv_sec - btif_hf_cb[i].connected_timestamp.tv_sec) 3015b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell < conn_time_delta.tv_sec) 302d0bca086ab6d032909e9a429720fea297c536f97Brian { 303d0bca086ab6d032909e9a429720fea297c536f97Brian conn_time_delta.tv_sec = 304d0bca086ab6d032909e9a429720fea297c536f97Brian now.tv_sec - btif_hf_cb[i].connected_timestamp.tv_sec; 305d0bca086ab6d032909e9a429720fea297c536f97Brian latest_conn_idx = i; 306d0bca086ab6d032909e9a429720fea297c536f97Brian } 307d0bca086ab6d032909e9a429720fea297c536f97Brian } 308d0bca086ab6d032909e9a429720fea297c536f97Brian } 309d0bca086ab6d032909e9a429720fea297c536f97Brian return latest_conn_idx; 310d0bca086ab6d032909e9a429720fea297c536f97Brian} 3113af1f3b9220733f5e3a76fe38fbc397974678234Brian 3123af1f3b9220733f5e3a76fe38fbc397974678234Brian/******************************************************************************* 3135b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell** 3143af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function btif_hf_check_if_slc_connected 3153af1f3b9220733f5e3a76fe38fbc397974678234Brian** 3163af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description Returns BT_STATUS_SUCCESS if SLC is up for any HF 3173af1f3b9220733f5e3a76fe38fbc397974678234Brian** 3183af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns bt_status_t 3193af1f3b9220733f5e3a76fe38fbc397974678234Brian** 3203af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/ 3213af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t btif_hf_check_if_slc_connected() 3223af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 3233af1f3b9220733f5e3a76fe38fbc397974678234Brian if (bt_hf_callbacks == NULL) 3243af1f3b9220733f5e3a76fe38fbc397974678234Brian { 3252bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin BTIF_TRACE_WARNING1("BTHF: %s: BTHF not initialized", __FUNCTION__); 3263af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_NOT_READY; 3273af1f3b9220733f5e3a76fe38fbc397974678234Brian } 3285b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell else 3293af1f3b9220733f5e3a76fe38fbc397974678234Brian { 3303af1f3b9220733f5e3a76fe38fbc397974678234Brian int i; 3313af1f3b9220733f5e3a76fe38fbc397974678234Brian for (i = 0; i < btif_max_hf_clients; i++) 3323af1f3b9220733f5e3a76fe38fbc397974678234Brian { 3333af1f3b9220733f5e3a76fe38fbc397974678234Brian if ((btif_hf_cb[i].state == BTHF_CONNECTION_STATE_SLC_CONNECTED)) 3343af1f3b9220733f5e3a76fe38fbc397974678234Brian { 3353af1f3b9220733f5e3a76fe38fbc397974678234Brian BTIF_TRACE_EVENT2("BTHF: %s: slc connected for idx = %d", 3363af1f3b9220733f5e3a76fe38fbc397974678234Brian __FUNCTION__, i); 3373af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_SUCCESS; 3383af1f3b9220733f5e3a76fe38fbc397974678234Brian } 3393af1f3b9220733f5e3a76fe38fbc397974678234Brian } 3403af1f3b9220733f5e3a76fe38fbc397974678234Brian BTIF_TRACE_WARNING1("BTHF: %s: No SLC connection up", __FUNCTION__); 3413af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_NOT_READY; 3423af1f3b9220733f5e3a76fe38fbc397974678234Brian } 3433af1f3b9220733f5e3a76fe38fbc397974678234Brian} 3443af1f3b9220733f5e3a76fe38fbc397974678234Brian 3453af1f3b9220733f5e3a76fe38fbc397974678234Brian/***************************************************************************** 3463af1f3b9220733f5e3a76fe38fbc397974678234Brian** Section name (Group of functions) 3473af1f3b9220733f5e3a76fe38fbc397974678234Brian*****************************************************************************/ 3483af1f3b9220733f5e3a76fe38fbc397974678234Brian 3493af1f3b9220733f5e3a76fe38fbc397974678234Brian/***************************************************************************** 3503af1f3b9220733f5e3a76fe38fbc397974678234Brian** 3513af1f3b9220733f5e3a76fe38fbc397974678234Brian** btif hf api functions (no context switch) 3523af1f3b9220733f5e3a76fe38fbc397974678234Brian** 3533af1f3b9220733f5e3a76fe38fbc397974678234Brian*****************************************************************************/ 354776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 355776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 3563af1f3b9220733f5e3a76fe38fbc397974678234Brian/******************************************************************************* 3573af1f3b9220733f5e3a76fe38fbc397974678234Brian** 358776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul** Function btif_hf_upstreams_evt 359776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul** 360776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul** Description Executes HF UPSTREAMS events in btif context 3613af1f3b9220733f5e3a76fe38fbc397974678234Brian** 3623af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns void 363776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul** 364776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul*******************************************************************************/ 365776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paulstatic void btif_hf_upstreams_evt(UINT16 event, char* p_param) 3663af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 3673af1f3b9220733f5e3a76fe38fbc397974678234Brian tBTA_AG *p_data = (tBTA_AG *)p_param; 368776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul bdstr_t bdstr; 3693af1f3b9220733f5e3a76fe38fbc397974678234Brian bt_bdaddr_t addr; 3703af1f3b9220733f5e3a76fe38fbc397974678234Brian int idx = p_data->hdr.handle - 1; 371776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul 3723af1f3b9220733f5e3a76fe38fbc397974678234Brian BTIF_TRACE_DEBUG2("%s: event=%s", __FUNCTION__, dump_hf_event(event)); 3733af1f3b9220733f5e3a76fe38fbc397974678234Brian 374776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul switch (event) 3753af1f3b9220733f5e3a76fe38fbc397974678234Brian { 3763af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTA_AG_ENABLE_EVT: 3773af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTA_AG_DISABLE_EVT: 3783af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 3793af1f3b9220733f5e3a76fe38fbc397974678234Brian 3803af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTA_AG_REGISTER_EVT: 381e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin btif_hf_cb[idx].handle = p_data->reg.hdr.handle; 382527235223abd8b64908b0c21311567e6c7d9920dStéphane Marchesin BTIF_TRACE_DEBUG2("%s: BTA_AG_REGISTER_EVT," 383e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin "btif_hf_cb.handle = %d", __FUNCTION__, btif_hf_cb[idx].handle); 384e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin break; 385e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin 386e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin case BTA_AG_OPEN_EVT: 387e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin if (p_data->open.status == BTA_AG_SUCCESS) 388e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin { 389e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin bdcpy(btif_hf_cb[idx].connected_bda.address, 390e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin p_data->open.bd_addr); 391e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin btif_hf_cb[idx].state = BTHF_CONNECTION_STATE_CONNECTED; 392e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin btif_hf_cb[idx].peer_feat = 0; 393e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin clear_phone_state_multihf(idx); 394e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin } 395e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin else if (btif_hf_cb[idx].state == BTHF_CONNECTION_STATE_CONNECTING) 396e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin { 397e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin btif_hf_cb[idx].state = BTHF_CONNECTION_STATE_DISCONNECTED; 398e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin } 399e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin else 400e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin { 401e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin BTIF_TRACE_WARNING4("%s: AG open failed, but another device connected. status=%d state=%d connected device=%s", 402e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin __FUNCTION__, p_data->open.status, btif_hf_cb[idx].state, 403e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin bd2str(&btif_hf_cb[idx].connected_bda, &bdstr)); 404e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin break; 405e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin } 406e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin 407e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb[idx].state, 4083af1f3b9220733f5e3a76fe38fbc397974678234Brian &btif_hf_cb[idx].connected_bda); 4093af1f3b9220733f5e3a76fe38fbc397974678234Brian 4103af1f3b9220733f5e3a76fe38fbc397974678234Brian if (btif_hf_cb[idx].state == BTHF_CONNECTION_STATE_DISCONNECTED) 4113af1f3b9220733f5e3a76fe38fbc397974678234Brian bdsetany(btif_hf_cb[idx].connected_bda.address); 4123af1f3b9220733f5e3a76fe38fbc397974678234Brian 4133af1f3b9220733f5e3a76fe38fbc397974678234Brian if (p_data->open.status != BTA_AG_SUCCESS) 4142bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin btif_queue_advance(); 415abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin break; 416abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin 4173af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTA_AG_CLOSE_EVT: 4187d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell btif_hf_cb[idx].connected_timestamp.tv_sec = 0; 41991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell btif_hf_cb[idx].state = BTHF_CONNECTION_STATE_DISCONNECTED; 4203af1f3b9220733f5e3a76fe38fbc397974678234Brian BTIF_TRACE_DEBUG3("%s: BTA_AG_CLOSE_EVT," 4213af1f3b9220733f5e3a76fe38fbc397974678234Brian "idx = %d, btif_hf_cb.handle = %d", __FUNCTION__, idx, 422abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin btif_hf_cb[idx].handle); 4233af1f3b9220733f5e3a76fe38fbc397974678234Brian HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb[idx].state, 4243af1f3b9220733f5e3a76fe38fbc397974678234Brian &btif_hf_cb[idx].connected_bda); 4257d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell bdsetany(btif_hf_cb[idx].connected_bda.address); 4263af1f3b9220733f5e3a76fe38fbc397974678234Brian btif_hf_cb[idx].peer_feat = 0; 4273af1f3b9220733f5e3a76fe38fbc397974678234Brian clear_phone_state_multihf(idx); 4283af1f3b9220733f5e3a76fe38fbc397974678234Brian hf_idx = btif_hf_latest_connected_idx(); 429e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin /* If AG_OPEN was received but SLC was not setup in a specified time (10 seconds), 430e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin ** then AG_CLOSE may be received. We need to advance the queue here 4313af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 4323af1f3b9220733f5e3a76fe38fbc397974678234Brian btif_queue_advance(); 4333af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 4343af1f3b9220733f5e3a76fe38fbc397974678234Brian 4353af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTA_AG_CONN_EVT: 4363af1f3b9220733f5e3a76fe38fbc397974678234Brian clock_gettime(CLOCK_MONOTONIC, 4373af1f3b9220733f5e3a76fe38fbc397974678234Brian &btif_hf_cb[idx].connected_timestamp); 4383af1f3b9220733f5e3a76fe38fbc397974678234Brian BTIF_TRACE_DEBUG2("%s: BTA_AG_CONN_EVT, idx = %d ", 4393af1f3b9220733f5e3a76fe38fbc397974678234Brian __FUNCTION__, idx); 4403af1f3b9220733f5e3a76fe38fbc397974678234Brian btif_hf_cb[idx].peer_feat = p_data->conn.peer_feat; 4412bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin btif_hf_cb[idx].state = BTHF_CONNECTION_STATE_SLC_CONNECTED; 442abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin hf_idx = btif_hf_latest_connected_idx(); 443abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin 4443af1f3b9220733f5e3a76fe38fbc397974678234Brian HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb[idx].state, 4453af1f3b9220733f5e3a76fe38fbc397974678234Brian &btif_hf_cb[idx].connected_bda); 4463af1f3b9220733f5e3a76fe38fbc397974678234Brian btif_queue_advance(); 4473af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 4483af1f3b9220733f5e3a76fe38fbc397974678234Brian 449abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin case BTA_AG_AUDIO_OPEN_EVT: 450abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin hf_idx = idx; 451abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin HAL_CBACK(bt_hf_callbacks, audio_state_cb, BTHF_AUDIO_STATE_CONNECTED, 4523af1f3b9220733f5e3a76fe38fbc397974678234Brian &btif_hf_cb[idx].connected_bda); 4533af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 4543af1f3b9220733f5e3a76fe38fbc397974678234Brian 4557d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell case BTA_AG_AUDIO_CLOSE_EVT: 4563af1f3b9220733f5e3a76fe38fbc397974678234Brian HAL_CBACK(bt_hf_callbacks, audio_state_cb, BTHF_AUDIO_STATE_DISCONNECTED, 4573af1f3b9220733f5e3a76fe38fbc397974678234Brian &btif_hf_cb[idx].connected_bda); 4583af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 4593af1f3b9220733f5e3a76fe38fbc397974678234Brian 4603af1f3b9220733f5e3a76fe38fbc397974678234Brian /* BTA auto-responds, silently discard */ 4613af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTA_AG_SPK_EVT: 46220839b37ed61b044d6224c0e373ce10d74be4f3dBrian case BTA_AG_MIC_EVT: 46320839b37ed61b044d6224c0e373ce10d74be4f3dBrian HAL_CBACK(bt_hf_callbacks, volume_cmd_cb, 46420839b37ed61b044d6224c0e373ce10d74be4f3dBrian (event == BTA_AG_SPK_EVT) ? BTHF_VOLUME_TYPE_SPK : 46520839b37ed61b044d6224c0e373ce10d74be4f3dBrian BTHF_VOLUME_TYPE_MIC, p_data->val.num, 4662bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin &btif_hf_cb[idx].connected_bda); 467abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin break; 468abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin 46920839b37ed61b044d6224c0e373ce10d74be4f3dBrian case BTA_AG_AT_A_EVT: 4702bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin if ((btif_hf_cb[0].num_held + btif_hf_cb[0].num_active) == 0) 47120839b37ed61b044d6224c0e373ce10d74be4f3dBrian hf_idx = idx; 47220839b37ed61b044d6224c0e373ce10d74be4f3dBrian else 47320839b37ed61b044d6224c0e373ce10d74be4f3dBrian BTIF_TRACE_DEBUG0("Donot set hf_idx for ATA since already in a call"); 47420839b37ed61b044d6224c0e373ce10d74be4f3dBrian 47520839b37ed61b044d6224c0e373ce10d74be4f3dBrian HAL_CBACK(bt_hf_callbacks, answer_call_cmd_cb, 4767d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell &btif_hf_cb[idx].connected_bda); 4777d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell break; 47820839b37ed61b044d6224c0e373ce10d74be4f3dBrian 479abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin /* Java needs to send OK/ERROR for these commands */ 48020839b37ed61b044d6224c0e373ce10d74be4f3dBrian case BTA_AG_AT_BLDN_EVT: 48120839b37ed61b044d6224c0e373ce10d74be4f3dBrian case BTA_AG_AT_D_EVT: 4820d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if ((btif_hf_cb[0].num_held + btif_hf_cb[0].num_active) == 0) 4830d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian hf_idx = idx; 4840d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian else 4850d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian BTIF_TRACE_DEBUG0("Donot set hf_idx for BLDN/D since already in a call"); 4860d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 487cc78eb63cdc0022684ca6816f258ea4492431916Stéphane Marchesin HAL_CBACK(bt_hf_callbacks, dial_call_cmd_cb, 4880d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian (event == BTA_AG_AT_D_EVT) ? p_data->val.str : NULL, 4890d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian &btif_hf_cb[idx].connected_bda); 4900d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian break; 49179a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin 4923af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTA_AG_AT_CHUP_EVT: 4933af1f3b9220733f5e3a76fe38fbc397974678234Brian HAL_CBACK(bt_hf_callbacks, hangup_call_cmd_cb, 4942bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin &btif_hf_cb[idx].connected_bda); 495abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin break; 4963af1f3b9220733f5e3a76fe38fbc397974678234Brian 4973af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTA_AG_AT_CIND_EVT: 4983af1f3b9220733f5e3a76fe38fbc397974678234Brian HAL_CBACK(bt_hf_callbacks, cind_cmd_cb, 4993af1f3b9220733f5e3a76fe38fbc397974678234Brian &btif_hf_cb[idx].connected_bda); 5003af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5013af1f3b9220733f5e3a76fe38fbc397974678234Brian 5023af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTA_AG_AT_VTS_EVT: 503abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin HAL_CBACK(bt_hf_callbacks, dtmf_cmd_cb, p_data->val.str[0], 5043af1f3b9220733f5e3a76fe38fbc397974678234Brian &btif_hf_cb[idx].connected_bda); 5053af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5067d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell 5073af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTA_AG_AT_BVRA_EVT: 5083af1f3b9220733f5e3a76fe38fbc397974678234Brian HAL_CBACK(bt_hf_callbacks, vr_cmd_cb, 5093af1f3b9220733f5e3a76fe38fbc397974678234Brian (p_data->val.num == 1) ? BTHF_VR_STATE_STARTED : 5103af1f3b9220733f5e3a76fe38fbc397974678234Brian BTHF_VR_STATE_STOPPED, &btif_hf_cb[idx].connected_bda); 5113af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 512abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin 5133af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTA_AG_AT_NREC_EVT: 5143af1f3b9220733f5e3a76fe38fbc397974678234Brian HAL_CBACK(bt_hf_callbacks, nrec_cmd_cb, 5156ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller (p_data->val.num == 1) ? BTHF_NREC_START : BTHF_NREC_STOP, 5166ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller &btif_hf_cb[idx].connected_bda); 5176ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller break; 5186ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller 5196ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller /* TODO: Add a callback for CBC */ 5206ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller case BTA_AG_AT_CBC_EVT: 5216ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller break; 5226ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller 5236ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller case BTA_AG_AT_CKPD_EVT: 5246ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller HAL_CBACK(bt_hf_callbacks, key_pressed_cmd_cb, 5256ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller &btif_hf_cb[idx].connected_bda); 5266ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller break; 5276ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller 5286ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller /* Java needs to send OK/ERROR for these commands */ 5296ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller case BTA_AG_AT_CHLD_EVT: 5306ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller HAL_CBACK(bt_hf_callbacks, chld_cmd_cb, atoi(p_data->val.str), 5313af1f3b9220733f5e3a76fe38fbc397974678234Brian &btif_hf_cb[idx].connected_bda); 532abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin break; 533abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin 534abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin case BTA_AG_AT_CLCC_EVT: 535c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin HAL_CBACK(bt_hf_callbacks, clcc_cmd_cb, 5367d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell &btif_hf_cb[idx].connected_bda); 537c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin break; 5383af1f3b9220733f5e3a76fe38fbc397974678234Brian 5393af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTA_AG_AT_COPS_EVT: 5403af1f3b9220733f5e3a76fe38fbc397974678234Brian HAL_CBACK(bt_hf_callbacks, cops_cmd_cb, 5413af1f3b9220733f5e3a76fe38fbc397974678234Brian &btif_hf_cb[idx].connected_bda); 542abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin break; 5433af1f3b9220733f5e3a76fe38fbc397974678234Brian 5443af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTA_AG_AT_UNAT_EVT: 5453af1f3b9220733f5e3a76fe38fbc397974678234Brian HAL_CBACK(bt_hf_callbacks, unknown_at_cmd_cb, p_data->val.str, 5463af1f3b9220733f5e3a76fe38fbc397974678234Brian &btif_hf_cb[idx].connected_bda); 5473af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5480e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal 5493af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTA_AG_AT_CNUM_EVT: 5503af1f3b9220733f5e3a76fe38fbc397974678234Brian HAL_CBACK(bt_hf_callbacks, cnum_cmd_cb, 5513af1f3b9220733f5e3a76fe38fbc397974678234Brian &btif_hf_cb[idx].connected_bda); 5523af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 553175adf0776d8df066a908b06055f243bd1325a34Stéphane Marchesin 5543af1f3b9220733f5e3a76fe38fbc397974678234Brian /* TODO: Some of these commands may need to be sent to app. For now respond with error */ 5553af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTA_AG_AT_BINP_EVT: 5563af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTA_AG_AT_BTRH_EVT: 5573af1f3b9220733f5e3a76fe38fbc397974678234Brian send_at_result(BTA_AG_OK_ERROR, BTA_AG_ERR_OP_NOT_SUPPORTED, idx); 5583af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5593af1f3b9220733f5e3a76fe38fbc397974678234Brian 5603af1f3b9220733f5e3a76fe38fbc397974678234Brian 5613af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 5623af1f3b9220733f5e3a76fe38fbc397974678234Brian BTIF_TRACE_WARNING2("%s: Unhandled event: %d", __FUNCTION__, event); 5633af1f3b9220733f5e3a76fe38fbc397974678234Brian break; 5643af1f3b9220733f5e3a76fe38fbc397974678234Brian } 5653af1f3b9220733f5e3a76fe38fbc397974678234Brian} 5663af1f3b9220733f5e3a76fe38fbc397974678234Brian 5673af1f3b9220733f5e3a76fe38fbc397974678234Brian/******************************************************************************* 5683af1f3b9220733f5e3a76fe38fbc397974678234Brian** 5693af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function bte_hf_evt 5703af1f3b9220733f5e3a76fe38fbc397974678234Brian** 5713af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description Switches context from BTE to BTIF for all HF events 5723af1f3b9220733f5e3a76fe38fbc397974678234Brian** 5733af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns void 5743af1f3b9220733f5e3a76fe38fbc397974678234Brian** 5753af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/ 5763af1f3b9220733f5e3a76fe38fbc397974678234Brian 5773af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic void bte_hf_evt(tBTA_AG_EVT event, tBTA_AG *p_data) 5787d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell{ 5793af1f3b9220733f5e3a76fe38fbc397974678234Brian bt_status_t status; 5803af1f3b9220733f5e3a76fe38fbc397974678234Brian int param_len = 0; 5813af1f3b9220733f5e3a76fe38fbc397974678234Brian 5823af1f3b9220733f5e3a76fe38fbc397974678234Brian /* TODO: BTA sends the union members and not tBTA_AG. If using param_len=sizeof(tBTA_AG), we get a crash on memcpy */ 5833af1f3b9220733f5e3a76fe38fbc397974678234Brian if (BTA_AG_REGISTER_EVT == event) 584811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin param_len = sizeof(tBTA_AG_REGISTER); 585811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin else if (BTA_AG_OPEN_EVT == event) 586811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin param_len = sizeof(tBTA_AG_OPEN); 587811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin else if (BTA_AG_CONN_EVT == event) 588811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin param_len = sizeof(tBTA_AG_CONN); 589811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin else if ( (BTA_AG_CLOSE_EVT == event) || (BTA_AG_AUDIO_OPEN_EVT == event) || (BTA_AG_AUDIO_CLOSE_EVT == event)) 590811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin param_len = sizeof(tBTA_AG_HDR); 591811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin else if (p_data) 592811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin param_len = sizeof(tBTA_AG_VAL); 593811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin 594811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin /* switch context to btif task context (copy full union size for convenience) */ 595811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin status = btif_transfer_context(btif_hf_upstreams_evt, (uint16_t)event, (void*)p_data, param_len, NULL); 5962292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 597abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin /* catch any failed context transfers */ 598abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status); 5992292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin} 6002292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 6012292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 6022292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin/******************************************************************************* 6032292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** 6042292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** Function btif_in_hf_generic_evt 6052292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** 6062292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** Description Processes generic events to be sent to JNI that are not triggered from the BTA. 6073af1f3b9220733f5e3a76fe38fbc397974678234Brian** Always runs in BTIF context 608abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** 6093af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns void 6103af1f3b9220733f5e3a76fe38fbc397974678234Brian** 6113af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/ 612abb436526974bd090853c0927ece0839f9143393Stéphane Marchesinstatic void btif_in_hf_generic_evt(UINT16 event, char *p_param) 6133af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 6143af1f3b9220733f5e3a76fe38fbc397974678234Brian int idx = btif_hf_idx_by_bdaddr((bt_bdaddr_t *)p_param); 6153af1f3b9220733f5e3a76fe38fbc397974678234Brian 616abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin BTIF_TRACE_EVENT2("%s: event=%d", __FUNCTION__, event); 617abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin switch (event) { 6183af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTIF_HFP_CB_AUDIO_CONNECTING: 6193af1f3b9220733f5e3a76fe38fbc397974678234Brian { 6203af1f3b9220733f5e3a76fe38fbc397974678234Brian HAL_CBACK(bt_hf_callbacks, audio_state_cb, BTHF_AUDIO_STATE_CONNECTING, 6217d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell &btif_hf_cb[idx].connected_bda); 6223af1f3b9220733f5e3a76fe38fbc397974678234Brian } break; 6233af1f3b9220733f5e3a76fe38fbc397974678234Brian default: 6243af1f3b9220733f5e3a76fe38fbc397974678234Brian { 6253af1f3b9220733f5e3a76fe38fbc397974678234Brian BTIF_TRACE_WARNING2("%s : Unknown event 0x%x", __FUNCTION__, event); 6263af1f3b9220733f5e3a76fe38fbc397974678234Brian } 627abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin break; 628abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin } 6293af1f3b9220733f5e3a76fe38fbc397974678234Brian} 6303af1f3b9220733f5e3a76fe38fbc397974678234Brian 6313af1f3b9220733f5e3a76fe38fbc397974678234Brian 6323af1f3b9220733f5e3a76fe38fbc397974678234Brian/******************************************************************************* 6333af1f3b9220733f5e3a76fe38fbc397974678234Brian** 6343af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function btif_hf_init 6353af1f3b9220733f5e3a76fe38fbc397974678234Brian** 6363af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description initializes the hf interface 6377d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell** 6383af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns bt_status_t 6393af1f3b9220733f5e3a76fe38fbc397974678234Brian** 6403af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/ 6413af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t init( bthf_callbacks_t* callbacks, int max_hf_clients) 6423af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 6435e49ec339df1d23b1f1790c49c9f102098f42c0dBrian BTIF_TRACE_EVENT1("%s", __FUNCTION__); 6445e49ec339df1d23b1f1790c49c9f102098f42c0dBrian int i; 6455e49ec339df1d23b1f1790c49c9f102098f42c0dBrian 6465e49ec339df1d23b1f1790c49c9f102098f42c0dBrian bt_hf_callbacks = callbacks; 6473af1f3b9220733f5e3a76fe38fbc397974678234Brian 648abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin /* Invoke the enable service API to the core to set the appropriate service_id 6493af1f3b9220733f5e3a76fe38fbc397974678234Brian * Internally, the HSP_SERVICE_ID shall also be enabled if HFP is enabled (phone) 6503af1f3b9220733f5e3a76fe38fbc397974678234Brian * othwerwise only HSP is enabled (tablet) 6513af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 6527d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell#if (defined(BTIF_HF_SERVICES) && (BTIF_HF_SERVICES & BTA_HFP_SERVICE_MASK)) 6533af1f3b9220733f5e3a76fe38fbc397974678234Brian btif_enable_service(BTA_HFP_SERVICE_ID); 6543af1f3b9220733f5e3a76fe38fbc397974678234Brian#else 6553af1f3b9220733f5e3a76fe38fbc397974678234Brian btif_enable_service(BTA_HSP_SERVICE_ID); 6563af1f3b9220733f5e3a76fe38fbc397974678234Brian#endif 6573af1f3b9220733f5e3a76fe38fbc397974678234Brian 658abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin memset(&btif_hf_cb, 0, sizeof(btif_hf_cb)); 6593af1f3b9220733f5e3a76fe38fbc397974678234Brian btif_max_hf_clients = max_hf_clients; 6603af1f3b9220733f5e3a76fe38fbc397974678234Brian BTIF_TRACE_DEBUG1("btif_max_hf_clients = %d", btif_max_hf_clients); 6613af1f3b9220733f5e3a76fe38fbc397974678234Brian for (i = 0; i < btif_max_hf_clients; i++) 662abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin { 6633af1f3b9220733f5e3a76fe38fbc397974678234Brian clear_phone_state_multihf(i); 6643af1f3b9220733f5e3a76fe38fbc397974678234Brian } 6653af1f3b9220733f5e3a76fe38fbc397974678234Brian 66641b3fcbf0404bc4a4f6588c0feef553bb65d4440Brian return BT_STATUS_SUCCESS; 667abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin} 6683af1f3b9220733f5e3a76fe38fbc397974678234Brian 6693af1f3b9220733f5e3a76fe38fbc397974678234Brian/******************************************************************************* 6700235b3252100eda553babea42c014445358a2985Brian** 6710235b3252100eda553babea42c014445358a2985Brian** Function connect 6720235b3252100eda553babea42c014445358a2985Brian** 6730235b3252100eda553babea42c014445358a2985Brian** Description connect to headset 6740235b3252100eda553babea42c014445358a2985Brian** 675e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin** Returns bt_status_t 676e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin** 6773af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/ 6783af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t connect_int(bt_bdaddr_t *bd_addr, uint16_t uuid) 679db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol{ 680c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin CHECK_BTHF_INIT(); 681c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin int i; 682c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin for (i = 0; i < btif_max_hf_clients;) 6830e57b66fa1d7f4317f20571f19fd2ceb3593f04fStéphane Marchesin { 6840e57b66fa1d7f4317f20571f19fd2ceb3593f04fStéphane Marchesin if (((btif_hf_cb[i].state == BTHF_CONNECTION_STATE_CONNECTED) || 685c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin (btif_hf_cb[i].state == BTHF_CONNECTION_STATE_SLC_CONNECTED))) 686c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin i++; 687c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin else 688c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin break; 689c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin } 690c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin 691c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin if (i == btif_max_hf_clients) 692db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol return BT_STATUS_BUSY; 693db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol 6943af1f3b9220733f5e3a76fe38fbc397974678234Brian if (!is_connected(bd_addr)) 695abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin { 6963af1f3b9220733f5e3a76fe38fbc397974678234Brian btif_hf_cb[i].state = BTHF_CONNECTION_STATE_CONNECTING; 6973af1f3b9220733f5e3a76fe38fbc397974678234Brian bdcpy(btif_hf_cb[i].connected_bda.address, bd_addr->address); 6983af1f3b9220733f5e3a76fe38fbc397974678234Brian 6997d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell BTA_AgOpen(btif_hf_cb[i].handle, btif_hf_cb[i].connected_bda.address, 7003af1f3b9220733f5e3a76fe38fbc397974678234Brian BTIF_HF_SECURITY, BTIF_HF_SERVICES); 7013af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_SUCCESS; 7023af1f3b9220733f5e3a76fe38fbc397974678234Brian } 7033af1f3b9220733f5e3a76fe38fbc397974678234Brian 7043af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_BUSY; 705abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin} 7063af1f3b9220733f5e3a76fe38fbc397974678234Brian 7073af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t connect( bt_bdaddr_t *bd_addr ) 7083af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 7093af1f3b9220733f5e3a76fe38fbc397974678234Brian CHECK_BTHF_INIT(); 7103af1f3b9220733f5e3a76fe38fbc397974678234Brian return btif_queue_connect(UUID_SERVCLASS_AG_HANDSFREE, bd_addr, connect_int); 7113af1f3b9220733f5e3a76fe38fbc397974678234Brian} 7123af1f3b9220733f5e3a76fe38fbc397974678234Brian 7133af1f3b9220733f5e3a76fe38fbc397974678234Brian/******************************************************************************* 7143af1f3b9220733f5e3a76fe38fbc397974678234Brian** 7153af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function disconnect 7163af1f3b9220733f5e3a76fe38fbc397974678234Brian** 7173af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description disconnect from headset 7183af1f3b9220733f5e3a76fe38fbc397974678234Brian** 7193af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns bt_status_t 7203af1f3b9220733f5e3a76fe38fbc397974678234Brian** 7213af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/ 7223af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t disconnect( bt_bdaddr_t *bd_addr ) 7233af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 7243af1f3b9220733f5e3a76fe38fbc397974678234Brian CHECK_BTHF_INIT(); 7253af1f3b9220733f5e3a76fe38fbc397974678234Brian 7263af1f3b9220733f5e3a76fe38fbc397974678234Brian int idx = btif_hf_idx_by_bdaddr(bd_addr); 7273af1f3b9220733f5e3a76fe38fbc397974678234Brian 7283af1f3b9220733f5e3a76fe38fbc397974678234Brian if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX)) 7297d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell { 7303af1f3b9220733f5e3a76fe38fbc397974678234Brian BTA_AgClose(btif_hf_cb[idx].handle); 7313af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_SUCCESS; 7323af1f3b9220733f5e3a76fe38fbc397974678234Brian } 7333af1f3b9220733f5e3a76fe38fbc397974678234Brian 7343af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_FAIL; 7353af1f3b9220733f5e3a76fe38fbc397974678234Brian} 7363af1f3b9220733f5e3a76fe38fbc397974678234Brian 7373af1f3b9220733f5e3a76fe38fbc397974678234Brian/******************************************************************************* 738abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** 739abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Function connect_audio 740abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** 7413af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description create an audio connection 7423af1f3b9220733f5e3a76fe38fbc397974678234Brian** 7433af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns bt_status_t 7443af1f3b9220733f5e3a76fe38fbc397974678234Brian** 7453af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/ 7463af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t connect_audio( bt_bdaddr_t *bd_addr ) 7473af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 7483af1f3b9220733f5e3a76fe38fbc397974678234Brian CHECK_BTHF_INIT(); 7493af1f3b9220733f5e3a76fe38fbc397974678234Brian 7503af1f3b9220733f5e3a76fe38fbc397974678234Brian int idx = btif_hf_idx_by_bdaddr(bd_addr); 7513af1f3b9220733f5e3a76fe38fbc397974678234Brian 7523af1f3b9220733f5e3a76fe38fbc397974678234Brian if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX)) 7533af1f3b9220733f5e3a76fe38fbc397974678234Brian { 7543af1f3b9220733f5e3a76fe38fbc397974678234Brian BTA_AgAudioOpen(btif_hf_cb[idx].handle); 7557d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell 7563af1f3b9220733f5e3a76fe38fbc397974678234Brian /* Inform the application that the audio connection has been initiated successfully */ 7573af1f3b9220733f5e3a76fe38fbc397974678234Brian btif_transfer_context(btif_in_hf_generic_evt, BTIF_HFP_CB_AUDIO_CONNECTING, 7583af1f3b9220733f5e3a76fe38fbc397974678234Brian (char *)bd_addr, sizeof(bt_bdaddr_t), NULL); 7593af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_SUCCESS; 760abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin } 7613af1f3b9220733f5e3a76fe38fbc397974678234Brian 7623af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_FAIL; 7633af1f3b9220733f5e3a76fe38fbc397974678234Brian} 764abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin 7653af1f3b9220733f5e3a76fe38fbc397974678234Brian/******************************************************************************* 7663af1f3b9220733f5e3a76fe38fbc397974678234Brian** 7673af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function disconnect_audio 768abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** 769abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Description close the audio connection 7703af1f3b9220733f5e3a76fe38fbc397974678234Brian** 7713af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns bt_status_t 7723af1f3b9220733f5e3a76fe38fbc397974678234Brian** 7733af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/ 7743af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t disconnect_audio( bt_bdaddr_t *bd_addr ) 7753af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 7763af1f3b9220733f5e3a76fe38fbc397974678234Brian CHECK_BTHF_INIT(); 7773af1f3b9220733f5e3a76fe38fbc397974678234Brian 7783af1f3b9220733f5e3a76fe38fbc397974678234Brian int idx = btif_hf_idx_by_bdaddr(bd_addr); 7793af1f3b9220733f5e3a76fe38fbc397974678234Brian 7803af1f3b9220733f5e3a76fe38fbc397974678234Brian if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX)) 7817d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell { 7823af1f3b9220733f5e3a76fe38fbc397974678234Brian BTA_AgAudioClose(btif_hf_cb[idx].handle); 7833af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_SUCCESS; 7843af1f3b9220733f5e3a76fe38fbc397974678234Brian } 7853af1f3b9220733f5e3a76fe38fbc397974678234Brian 786abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin return BT_STATUS_FAIL; 7873af1f3b9220733f5e3a76fe38fbc397974678234Brian} 7883af1f3b9220733f5e3a76fe38fbc397974678234Brian 7893af1f3b9220733f5e3a76fe38fbc397974678234Brian/******************************************************************************* 790abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** 7913af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function start_voice_recognition 7923af1f3b9220733f5e3a76fe38fbc397974678234Brian** 7932bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin** Description start voice recognition 7942bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin** 7952bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin** Returns bt_status_t 7963af1f3b9220733f5e3a76fe38fbc397974678234Brian** 797abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin*******************************************************************************/ 798abb436526974bd090853c0927ece0839f9143393Stéphane Marchesinstatic bt_status_t start_voice_recognition(bt_bdaddr_t *bd_addr) 7993af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 8003af1f3b9220733f5e3a76fe38fbc397974678234Brian CHECK_BTHF_INIT(); 8013af1f3b9220733f5e3a76fe38fbc397974678234Brian 8023af1f3b9220733f5e3a76fe38fbc397974678234Brian int idx = btif_hf_idx_by_bdaddr(bd_addr); 8033af1f3b9220733f5e3a76fe38fbc397974678234Brian 8043af1f3b9220733f5e3a76fe38fbc397974678234Brian if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX)) 8053af1f3b9220733f5e3a76fe38fbc397974678234Brian { 8063af1f3b9220733f5e3a76fe38fbc397974678234Brian if (btif_hf_cb[idx].peer_feat & BTA_AG_PEER_FEAT_VREC) 8073af1f3b9220733f5e3a76fe38fbc397974678234Brian { 8083af1f3b9220733f5e3a76fe38fbc397974678234Brian tBTA_AG_RES_DATA ag_res; 8093af1f3b9220733f5e3a76fe38fbc397974678234Brian memset(&ag_res, 0, sizeof(ag_res)); 8103af1f3b9220733f5e3a76fe38fbc397974678234Brian ag_res.state = 1; 8113af1f3b9220733f5e3a76fe38fbc397974678234Brian BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_BVRA_RES, &ag_res); 8123af1f3b9220733f5e3a76fe38fbc397974678234Brian 8137d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell return BT_STATUS_SUCCESS; 8143af1f3b9220733f5e3a76fe38fbc397974678234Brian } 8153af1f3b9220733f5e3a76fe38fbc397974678234Brian else 81679a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin { 81744e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca return BT_STATUS_UNSUPPORTED; 81844e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca } 81944e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca } 82079a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin 8213af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_NOT_READY; 822abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin} 8233af1f3b9220733f5e3a76fe38fbc397974678234Brian 8243af1f3b9220733f5e3a76fe38fbc397974678234Brian/******************************************************************************* 8253af1f3b9220733f5e3a76fe38fbc397974678234Brian** 8267d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell** Function stop_voice_recognition 8272292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** 8283af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description stop voice recognition 8293af1f3b9220733f5e3a76fe38fbc397974678234Brian** 8303af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns bt_status_t 8313af1f3b9220733f5e3a76fe38fbc397974678234Brian** 832abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin*******************************************************************************/ 8333af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t stop_voice_recognition(bt_bdaddr_t *bd_addr) 8343af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 8353af1f3b9220733f5e3a76fe38fbc397974678234Brian CHECK_BTHF_INIT(); 8367d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell 8373af1f3b9220733f5e3a76fe38fbc397974678234Brian int idx = btif_hf_idx_by_bdaddr(bd_addr); 8383af1f3b9220733f5e3a76fe38fbc397974678234Brian 8393af1f3b9220733f5e3a76fe38fbc397974678234Brian if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX)) 8403af1f3b9220733f5e3a76fe38fbc397974678234Brian { 8413af1f3b9220733f5e3a76fe38fbc397974678234Brian if (btif_hf_cb[idx].peer_feat & BTA_AG_PEER_FEAT_VREC) 842abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin { 8433af1f3b9220733f5e3a76fe38fbc397974678234Brian tBTA_AG_RES_DATA ag_res; 8443af1f3b9220733f5e3a76fe38fbc397974678234Brian memset(&ag_res, 0, sizeof(ag_res)); 8453af1f3b9220733f5e3a76fe38fbc397974678234Brian ag_res.state = 0; 8463af1f3b9220733f5e3a76fe38fbc397974678234Brian BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_BVRA_RES, &ag_res); 8473af1f3b9220733f5e3a76fe38fbc397974678234Brian 8483af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_SUCCESS; 849062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin } 8503af1f3b9220733f5e3a76fe38fbc397974678234Brian else 851062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin { 8523af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_UNSUPPORTED; 8533af1f3b9220733f5e3a76fe38fbc397974678234Brian } 8543af1f3b9220733f5e3a76fe38fbc397974678234Brian } 8553af1f3b9220733f5e3a76fe38fbc397974678234Brian 8563af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_NOT_READY; 8573af1f3b9220733f5e3a76fe38fbc397974678234Brian} 8583af1f3b9220733f5e3a76fe38fbc397974678234Brian 8593af1f3b9220733f5e3a76fe38fbc397974678234Brian/******************************************************************************* 8603af1f3b9220733f5e3a76fe38fbc397974678234Brian** 8613af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function volume_control 8623af1f3b9220733f5e3a76fe38fbc397974678234Brian** 8633af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description volume control 8643af1f3b9220733f5e3a76fe38fbc397974678234Brian** 8655b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell** Returns bt_status_t 8663af1f3b9220733f5e3a76fe38fbc397974678234Brian** 8673af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/ 8683af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t volume_control(bthf_volume_type_t type, int volume, 8693af1f3b9220733f5e3a76fe38fbc397974678234Brian bt_bdaddr_t *bd_addr) 8703af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 8713af1f3b9220733f5e3a76fe38fbc397974678234Brian CHECK_BTHF_INIT(); 8723af1f3b9220733f5e3a76fe38fbc397974678234Brian 8733af1f3b9220733f5e3a76fe38fbc397974678234Brian int idx = btif_hf_idx_by_bdaddr(bd_addr); 8743af1f3b9220733f5e3a76fe38fbc397974678234Brian 8753af1f3b9220733f5e3a76fe38fbc397974678234Brian tBTA_AG_RES_DATA ag_res; 8763af1f3b9220733f5e3a76fe38fbc397974678234Brian memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA)); 8773af1f3b9220733f5e3a76fe38fbc397974678234Brian if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX)) 8783af1f3b9220733f5e3a76fe38fbc397974678234Brian { 8793af1f3b9220733f5e3a76fe38fbc397974678234Brian ag_res.num = volume; 8803af1f3b9220733f5e3a76fe38fbc397974678234Brian BTA_AgResult(btif_hf_cb[idx].handle, 8813af1f3b9220733f5e3a76fe38fbc397974678234Brian (type == BTHF_VOLUME_TYPE_SPK) ? BTA_AG_SPK_RES : BTA_AG_MIC_RES, 8823af1f3b9220733f5e3a76fe38fbc397974678234Brian &ag_res); 8837d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell return BT_STATUS_SUCCESS; 8843af1f3b9220733f5e3a76fe38fbc397974678234Brian } 8853af1f3b9220733f5e3a76fe38fbc397974678234Brian 886062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin return BT_STATUS_FAIL; 8873af1f3b9220733f5e3a76fe38fbc397974678234Brian} 8883af1f3b9220733f5e3a76fe38fbc397974678234Brian 8893af1f3b9220733f5e3a76fe38fbc397974678234Brian/******************************************************************************* 8903af1f3b9220733f5e3a76fe38fbc397974678234Brian** 8913af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function device_status_notification 8923af1f3b9220733f5e3a76fe38fbc397974678234Brian** 8933af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description Combined device status change notification 8943af1f3b9220733f5e3a76fe38fbc397974678234Brian** 8953af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns bt_status_t 8963af1f3b9220733f5e3a76fe38fbc397974678234Brian** 8973af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/ 8987d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwellstatic bt_status_t device_status_notification(bthf_network_state_t ntk_state, 8993af1f3b9220733f5e3a76fe38fbc397974678234Brian bthf_service_type_t svc_type, int signal, int batt_chg) 9003af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 901062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin CHECK_BTHF_INIT(); 9023af1f3b9220733f5e3a76fe38fbc397974678234Brian 9033af1f3b9220733f5e3a76fe38fbc397974678234Brian if (is_connected(NULL)) 9043af1f3b9220733f5e3a76fe38fbc397974678234Brian { 9052292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin /* send all indicators to BTA. 9062292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin ** BTA will make sure no duplicates are sent out 907abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin */ 908abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin send_indicator_update(BTA_AG_IND_SERVICE, 9092292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin (ntk_state == BTHF_NETWORK_STATE_AVAILABLE) ? 1 : 0); 9102292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin send_indicator_update(BTA_AG_IND_ROAM, 9112292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin (svc_type == BTHF_SERVICE_TYPE_HOME) ? 0 : 1); 9122292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin send_indicator_update(BTA_AG_IND_SIGNAL, signal); 9132292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin send_indicator_update(BTA_AG_IND_BATTCHG, batt_chg); 9142292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin return BT_STATUS_SUCCESS; 9152292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin } 9162292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9172292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin return BT_STATUS_SUCCESS; 9182292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin} 9192292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9202292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin/******************************************************************************* 9212292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** 9222292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** Function cops_response 9232292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** 9242292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** Description Response for COPS command 9252292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** 9262292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** Returns bt_status_t 9272292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** 9282292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin*******************************************************************************/ 9292292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesinstatic bt_status_t cops_response(const char *cops, bt_bdaddr_t *bd_addr) 9302292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin{ 9313af1f3b9220733f5e3a76fe38fbc397974678234Brian CHECK_BTHF_INIT(); 9323af1f3b9220733f5e3a76fe38fbc397974678234Brian 9332292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin int idx = btif_hf_idx_by_bdaddr(bd_addr); 934abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin 93520839b37ed61b044d6224c0e373ce10d74be4f3dBrian if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX)) 93620839b37ed61b044d6224c0e373ce10d74be4f3dBrian { 9373af1f3b9220733f5e3a76fe38fbc397974678234Brian tBTA_AG_RES_DATA ag_res; 938abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin 9393af1f3b9220733f5e3a76fe38fbc397974678234Brian /* Format the response */ 9403af1f3b9220733f5e3a76fe38fbc397974678234Brian sprintf (ag_res.str, "0,0,\"%s\"", cops); 9413af1f3b9220733f5e3a76fe38fbc397974678234Brian ag_res.ok_flag = BTA_AG_OK_DONE; 9423af1f3b9220733f5e3a76fe38fbc397974678234Brian 9433af1f3b9220733f5e3a76fe38fbc397974678234Brian BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_COPS_RES, &ag_res); 9440e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal return BT_STATUS_SUCCESS; 9453af1f3b9220733f5e3a76fe38fbc397974678234Brian } 9463af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_FAIL; 9473af1f3b9220733f5e3a76fe38fbc397974678234Brian} 9483af1f3b9220733f5e3a76fe38fbc397974678234Brian 9493af1f3b9220733f5e3a76fe38fbc397974678234Brian/******************************************************************************* 9503af1f3b9220733f5e3a76fe38fbc397974678234Brian** 9513af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function cind_response 9523af1f3b9220733f5e3a76fe38fbc397974678234Brian** 9533af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description Response for CIND command 9543af1f3b9220733f5e3a76fe38fbc397974678234Brian** 9553af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns bt_status_t 9563af1f3b9220733f5e3a76fe38fbc397974678234Brian** 9573af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/ 9583af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t cind_response(int svc, int num_active, int num_held, 9593af1f3b9220733f5e3a76fe38fbc397974678234Brian bthf_call_state_t call_setup_state, 9603af1f3b9220733f5e3a76fe38fbc397974678234Brian int signal, int roam, int batt_chg, 9613af1f3b9220733f5e3a76fe38fbc397974678234Brian bt_bdaddr_t *bd_addr) 9623af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 9633af1f3b9220733f5e3a76fe38fbc397974678234Brian CHECK_BTHF_INIT(); 9643af1f3b9220733f5e3a76fe38fbc397974678234Brian 9653af1f3b9220733f5e3a76fe38fbc397974678234Brian int idx = btif_hf_idx_by_bdaddr(bd_addr); 9663af1f3b9220733f5e3a76fe38fbc397974678234Brian 9673af1f3b9220733f5e3a76fe38fbc397974678234Brian if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX)) 9683af1f3b9220733f5e3a76fe38fbc397974678234Brian { 9693af1f3b9220733f5e3a76fe38fbc397974678234Brian tBTA_AG_RES_DATA ag_res; 9703af1f3b9220733f5e3a76fe38fbc397974678234Brian 9713af1f3b9220733f5e3a76fe38fbc397974678234Brian memset (&ag_res, 0, sizeof (ag_res)); 9723af1f3b9220733f5e3a76fe38fbc397974678234Brian /* per the errata 2043, call=1 implies atleast one call is in progress (active/held) 9733af1f3b9220733f5e3a76fe38fbc397974678234Brian ** https://www.bluetooth.org/errata/errata_view.cfm?errata_id=2043 9747d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell **/ 9753af1f3b9220733f5e3a76fe38fbc397974678234Brian sprintf (ag_res.str, "%d,%d,%d,%d,%d,%d,%d", 9763af1f3b9220733f5e3a76fe38fbc397974678234Brian (num_active + num_held) ? 1 : 0, /* Call state */ 9773af1f3b9220733f5e3a76fe38fbc397974678234Brian callstate_to_callsetup(call_setup_state), /* Callsetup state */ 9783af1f3b9220733f5e3a76fe38fbc397974678234Brian svc, /* network service */ 9793af1f3b9220733f5e3a76fe38fbc397974678234Brian signal, /* Signal strength */ 9802292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin roam, /* Roaming indicator */ 9812292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin batt_chg, /* Battery level */ 982abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin ((num_held == 0) ? 0 : ((num_active == 0) ? 2 : 1))); /* Call held */ 9832292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 9842292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_CIND_RES, &ag_res); 9853af1f3b9220733f5e3a76fe38fbc397974678234Brian 986abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin return BT_STATUS_SUCCESS; 9873af1f3b9220733f5e3a76fe38fbc397974678234Brian } 9883af1f3b9220733f5e3a76fe38fbc397974678234Brian 98920839b37ed61b044d6224c0e373ce10d74be4f3dBrian return BT_STATUS_FAIL; 99020839b37ed61b044d6224c0e373ce10d74be4f3dBrian} 991abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin 99220839b37ed61b044d6224c0e373ce10d74be4f3dBrian/******************************************************************************* 99320839b37ed61b044d6224c0e373ce10d74be4f3dBrian** 9942292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** Function formatted_at_response 995468c2c08414f0ad07e2c2c2a98506f6390124963Stéphane Marchesin** 996abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Description Pre-formatted AT response, typically in response to unknown AT cmd 997abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** 9980f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin** Returns bt_status_t 9990f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin** 10000f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin*******************************************************************************/ 10012292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesinstatic bt_status_t formatted_at_response(const char *rsp, bt_bdaddr_t *bd_addr) 10022292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin{ 10032292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin CHECK_BTHF_INIT(); 10040f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin tBTA_AG_RES_DATA ag_res; 10050f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin int idx = btif_hf_idx_by_bdaddr(bd_addr); 10060f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 10070f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX)) 10082292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin { 10090f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin /* Format the response and send */ 10100f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin memset (&ag_res, 0, sizeof (ag_res)); 10110f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin strncpy(ag_res.str, rsp, BTA_AG_AT_MAX_LEN); 10120f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_UNAT_RES, &ag_res); 10130f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 10140f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin return BT_STATUS_SUCCESS; 10152292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin } 10160f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 10170f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin return BT_STATUS_FAIL; 10180f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin} 10190f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin 10202292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin/******************************************************************************* 10210f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin** 10222292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** Function at_response 10232292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** 1024abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Description ok/error response 10252292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** 10262292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** Returns bt_status_t 10272292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** 10282292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin*******************************************************************************/ 10292292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesinstatic bt_status_t at_response(bthf_at_response_t response_code, 10302292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin int error_code, bt_bdaddr_t *bd_addr) 10312292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin{ 10322292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin CHECK_BTHF_INIT(); 10332292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 10342292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin int idx = btif_hf_idx_by_bdaddr(bd_addr); 10352292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 10362292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX)) 10372292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin { 10382292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin send_at_result((response_code == BTHF_AT_RESPONSE_OK) ? BTA_AG_OK_DONE 10392292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin : BTA_AG_OK_ERROR, error_code, idx); 10402292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin return BT_STATUS_SUCCESS; 10412292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin } 10422292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 10432292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 10442292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin return BT_STATUS_FAIL; 10452292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin} 10462292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 10470f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin/******************************************************************************* 10480f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin** 10493af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function clcc_response 1050abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** 1051abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Description response for CLCC command 10523af1f3b9220733f5e3a76fe38fbc397974678234Brian** Can be iteratively called for each call index. Call index 10533af1f3b9220733f5e3a76fe38fbc397974678234Brian** of 0 will be treated as NULL termination (Completes response) 10543af1f3b9220733f5e3a76fe38fbc397974678234Brian** 10557d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell** Returns bt_status_t 10563af1f3b9220733f5e3a76fe38fbc397974678234Brian** 10573af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/ 10583af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t clcc_response(int index, bthf_call_direction_t dir, 10593af1f3b9220733f5e3a76fe38fbc397974678234Brian bthf_call_state_t state, bthf_call_mode_t mode, 10603af1f3b9220733f5e3a76fe38fbc397974678234Brian bthf_call_mpty_type_t mpty, const char *number, 1061abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin bthf_call_addrtype_t type, bt_bdaddr_t *bd_addr) 10623af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 10633af1f3b9220733f5e3a76fe38fbc397974678234Brian CHECK_BTHF_INIT(); 10642292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 1065abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin int idx = btif_hf_idx_by_bdaddr(bd_addr); 10662292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin 10672292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX)) 10683af1f3b9220733f5e3a76fe38fbc397974678234Brian { 1069abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin tBTA_AG_RES_DATA ag_res; 10703af1f3b9220733f5e3a76fe38fbc397974678234Brian int xx; 10713af1f3b9220733f5e3a76fe38fbc397974678234Brian 1072ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol memset (&ag_res, 0, sizeof (ag_res)); 1073abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin 1074ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol /* Format the response */ 1075ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol if (index == 0) 10763af1f3b9220733f5e3a76fe38fbc397974678234Brian { 10773af1f3b9220733f5e3a76fe38fbc397974678234Brian ag_res.ok_flag = BTA_AG_OK_DONE; 10783af1f3b9220733f5e3a76fe38fbc397974678234Brian } 10793af1f3b9220733f5e3a76fe38fbc397974678234Brian else 10803af1f3b9220733f5e3a76fe38fbc397974678234Brian { 10813af1f3b9220733f5e3a76fe38fbc397974678234Brian BTIF_TRACE_EVENT6("clcc_response: [%d] dir %d state %d mode %d number = %s type = %d", 10823af1f3b9220733f5e3a76fe38fbc397974678234Brian index, dir, state, mode, number, type); 1083abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin xx = sprintf (ag_res.str, "%d,%d,%d,%d,%d", 1084abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin index, dir, state, mode, mpty); 10853af1f3b9220733f5e3a76fe38fbc397974678234Brian 10863af1f3b9220733f5e3a76fe38fbc397974678234Brian if (number) 10873af1f3b9220733f5e3a76fe38fbc397974678234Brian { 10883af1f3b9220733f5e3a76fe38fbc397974678234Brian if ((type == BTHF_CALL_ADDRTYPE_INTERNATIONAL) && (*number != '+')) 10893af1f3b9220733f5e3a76fe38fbc397974678234Brian sprintf (&ag_res.str[xx], ",\"+%s\",%d", number, type); 10903af1f3b9220733f5e3a76fe38fbc397974678234Brian else 10913af1f3b9220733f5e3a76fe38fbc397974678234Brian sprintf (&ag_res.str[xx], ",\"%s\",%d", number, type); 10923af1f3b9220733f5e3a76fe38fbc397974678234Brian } 10933af1f3b9220733f5e3a76fe38fbc397974678234Brian } 10943af1f3b9220733f5e3a76fe38fbc397974678234Brian BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_CLCC_RES, &ag_res); 10957d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell 10963af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_SUCCESS; 10973af1f3b9220733f5e3a76fe38fbc397974678234Brian } 10983af1f3b9220733f5e3a76fe38fbc397974678234Brian 10993af1f3b9220733f5e3a76fe38fbc397974678234Brian return BT_STATUS_FAIL; 11003af1f3b9220733f5e3a76fe38fbc397974678234Brian} 11013af1f3b9220733f5e3a76fe38fbc397974678234Brian 11023af1f3b9220733f5e3a76fe38fbc397974678234Brian/******************************************************************************* 1103af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca** 110420839b37ed61b044d6224c0e373ce10d74be4f3dBrian** Function phone_state_change 11053af1f3b9220733f5e3a76fe38fbc397974678234Brian** 11063af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description notify of a call state change 11073af1f3b9220733f5e3a76fe38fbc397974678234Brian** number & type: valid only for incoming & waiting call 11083af1f3b9220733f5e3a76fe38fbc397974678234Brian** 11093af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns bt_status_t 11103af1f3b9220733f5e3a76fe38fbc397974678234Brian** 11113af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/ 11122bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 11132bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinstatic bt_status_t phone_state_change(int num_active, int num_held, bthf_call_state_t call_setup_state, 11142bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin const char *number, bthf_call_addrtype_t type) 11153af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 1116c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian tBTA_AG_RES res = 0xff; 11172bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin tBTA_AG_RES_DATA ag_res; 11182bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin bt_status_t status = BT_STATUS_SUCCESS; 11192bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin BOOLEAN activeCallUpdated = FALSE; 11202bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin int idx, i; 11212bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 11222bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin /* hf_idx is index of connected HS that sent ATA/BLDN, 11232bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin otherwise index of latest connected HS */ 11242bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin if (hf_idx != BTIF_HF_INVALID_IDX) 11252bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin idx = hf_idx; 11263af1f3b9220733f5e3a76fe38fbc397974678234Brian else 11272bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin idx = btif_hf_latest_connected_idx(); 11282bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 11292bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin BTIF_TRACE_DEBUG1("phone_state_change: idx = %d", idx); 11302bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 11312bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin /* Check if SLC is connected */ 11322bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin if (btif_hf_check_if_slc_connected() != BT_STATUS_SUCCESS) 11332bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin return BT_STATUS_NOT_READY; 11342bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 11352bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin BTIF_TRACE_DEBUG6("phone_state_change: num_active=%d [prev: %d] num_held=%d[prev: %d]" 11362bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin " call_setup=%s [prev: %s]", num_active, btif_hf_cb[idx].num_active, 1137c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian num_held, btif_hf_cb[idx].num_held, dump_hf_call_state(call_setup_state), 11382bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin dump_hf_call_state(btif_hf_cb[idx].call_setup_state)); 11392bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 11402bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin /* if all indicators are 0, send end call and return */ 11412bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin if (num_active == 0 && num_held == 0 && call_setup_state == BTHF_CALL_STATE_IDLE) 11422bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin { 11432bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin BTIF_TRACE_DEBUG1("%s: Phone on hook", __FUNCTION__); 11442bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 11452bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin /* record call termination timestamp if there was an active/held call or 11462bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin callsetup state > BTHF_CALL_STATE_IDLE */ 11472bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin if ((btif_hf_cb[idx].call_setup_state != BTHF_CALL_STATE_IDLE ) || 11482bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin (btif_hf_cb[idx].num_active) ||(btif_hf_cb[idx].num_held)) 11492bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin { 11500235b3252100eda553babea42c014445358a2985Brian BTIF_TRACE_DEBUG1("%s: Record call termination timestamp", __FUNCTION__); 11512bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin clock_gettime(CLOCK_MONOTONIC, &btif_hf_cb[0].call_end_timestamp); 11522bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin } 11533af1f3b9220733f5e3a76fe38fbc397974678234Brian BTA_AgResult (BTA_AG_HANDLE_ALL, BTA_AG_END_CALL_RES, NULL); 11542bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin hf_idx = BTIF_HF_INVALID_IDX; 11552bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 11562bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin /* if held call was present, reset that as well */ 11572bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin if (btif_hf_cb[idx].num_held) 11582bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin send_indicator_update(BTA_AG_IND_CALLHELD, 0); 11592bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 11602bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin goto update_call_states; 11612bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin } 11622bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 1163c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian /* active state can change when: 11642bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ** 1. an outgoing/incoming call was answered 11652bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ** 2. an held was resumed 11663af1f3b9220733f5e3a76fe38fbc397974678234Brian ** 3. without callsetup notifications, call became active 11672bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ** (3) can happen if call is active and a headset connects to us 11682bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ** 11692bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ** In the case of (3), we will have to notify the stack of an active 11702bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ** call, instead of sending an indicator update. This will also 11712bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ** force the SCO to be setup. Handle this special case here prior to 11722bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ** call setup handling 11732bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin */ 11742bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin if ( (num_active == 1) && (btif_hf_cb[idx].num_active == 0) && (btif_hf_cb[idx].num_held == 0) 11752bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin && (btif_hf_cb[idx].call_setup_state == BTHF_CALL_STATE_IDLE) ) 11762bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin { 11772bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin BTIF_TRACE_DEBUG1("%s: Active call notification received without call setup update", 11782bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin __FUNCTION__); 11792bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 11802bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA)); 11812bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ag_res.audio_handle = btif_hf_cb[idx].handle; 11822bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin res = BTA_AG_OUT_CALL_CONN_RES; 1183c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian BTA_AgResult(BTA_AG_HANDLE_ALL, res, &ag_res); 1184c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian activeCallUpdated = TRUE; 1185c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1186c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 11872bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin /* Ringing call changed? */ 11883af1f3b9220733f5e3a76fe38fbc397974678234Brian if (call_setup_state != btif_hf_cb[idx].call_setup_state) 11893af1f3b9220733f5e3a76fe38fbc397974678234Brian { 11902bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin BTIF_TRACE_DEBUG3("%s: Call setup states changed. old: %s new: %s", 11912bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin __FUNCTION__, dump_hf_call_state(btif_hf_cb[idx].call_setup_state), 11922bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin dump_hf_call_state(call_setup_state)); 11932bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA)); 11942bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 11952bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin switch (call_setup_state) 11963af1f3b9220733f5e3a76fe38fbc397974678234Brian { 11972bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin case BTHF_CALL_STATE_IDLE: 11982bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin { 11992bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin switch (btif_hf_cb[idx].call_setup_state) 12002bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin { 12012bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin case BTHF_CALL_STATE_INCOMING: 12022bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin if (num_active > btif_hf_cb[idx].num_active) 12032bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin { 12042bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin res = BTA_AG_IN_CALL_CONN_RES; 12052bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin ag_res.audio_handle = btif_hf_cb[idx].handle; 12062bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin } 12072bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin else if (num_held > btif_hf_cb[idx].num_held) 12082bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin res = BTA_AG_IN_CALL_HELD_RES; 12092bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin else 12102bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin res = BTA_AG_CALL_CANCEL_RES; 12112bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin break; 12122bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin case BTHF_CALL_STATE_DIALING: 12133af1f3b9220733f5e3a76fe38fbc397974678234Brian case BTHF_CALL_STATE_ALERTING: 12143af1f3b9220733f5e3a76fe38fbc397974678234Brian if (num_active > btif_hf_cb[idx].num_active) 12153af1f3b9220733f5e3a76fe38fbc397974678234Brian { 12160d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian ag_res.audio_handle = BTA_AG_HANDLE_SCO_NO_CHANGE; 12170d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian res = BTA_AG_OUT_CALL_CONN_RES; 1218c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 12190d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian else 12200d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian res = BTA_AG_CALL_CANCEL_RES; 1221abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin break; 12220d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian default: 1223c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian BTIF_TRACE_ERROR1("%s: Incorrect Call setup state transition", __FUNCTION__); 12240d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian status = BT_STATUS_PARM_INVALID; 1225c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian break; 1226c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 1227c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } break; 1228c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 1229c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian case BTHF_CALL_STATE_INCOMING: 1230c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian if (num_active || num_held) 1231c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian res = BTA_AG_CALL_WAIT_RES; 1232c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian else 1233c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian res = BTA_AG_IN_CALL_RES; 12345d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin if (number) 12355d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin { 1236abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin int xx = 0; 1237abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin if ((type == BTHF_CALL_ADDRTYPE_INTERNATIONAL) && (*number != '+')) 1238abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin xx = sprintf (ag_res.str, "\"+%s\"", number); 1239c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian else 12400d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian xx = sprintf (ag_res.str, "\"%s\"", number); 12410d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian ag_res.num = type; 12420d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12430d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (res == BTA_AG_CALL_WAIT_RES) 12440d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian sprintf(&ag_res.str[xx], ",%d", type); 12450d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 12460d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian break; 12470d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian case BTHF_CALL_STATE_DIALING: 12480d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian ag_res.audio_handle = btif_hf_cb[idx].handle; 12490d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian res = BTA_AG_OUT_CALL_ORIG_RES; 12500235b3252100eda553babea42c014445358a2985Brian break; 12510d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian case BTHF_CALL_STATE_ALERTING: 12520d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* if we went from idle->alert, force SCO setup here. dialing usually triggers it */ 12530d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (btif_hf_cb[idx].call_setup_state == BTHF_CALL_STATE_IDLE) 12540d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian ag_res.audio_handle = btif_hf_cb[idx].handle; 12550d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian res = BTA_AG_OUT_CALL_ALERT_RES; 12560d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian break; 12570d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian default: 12580d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian BTIF_TRACE_ERROR1("%s: Incorrect new ringing call state", __FUNCTION__); 12595ac22877c98f4934cced4d42b9ec87245f266967Brian status = BT_STATUS_PARM_INVALID; 12600d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian break; 12610d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 12620d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian BTIF_TRACE_DEBUG3("%s: Call setup state changed. res=%d, audio_handle=%d", __FUNCTION__, res, ag_res.audio_handle); 12630d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12640d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (res) 12650d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian BTA_AgResult(BTA_AG_HANDLE_ALL, res, &ag_res); 1266c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 12675961732c1b59403b4e736fa354a64d4a0e5d8af2Michal /* if call setup is idle, we have already updated call indicator, jump out */ 12685961732c1b59403b4e736fa354a64d4a0e5d8af2Michal if (call_setup_state == BTHF_CALL_STATE_IDLE) 12690d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian { 12700d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* check & update callheld */ 12715d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin if ((num_held > 0) && (num_active > 0)) 12720d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian send_indicator_update(BTA_AG_IND_CALLHELD, 1); 12730d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian goto update_call_states; 12740d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 12750d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 12760d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12770d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA)); 12780d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12790d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* per the errata 2043, call=1 implies atleast one call is in progress (active/held) 12800d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian ** https://www.bluetooth.org/errata/errata_view.cfm?errata_id=2043 12810d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian ** Handle call indicator change 12820d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian **/ 12830d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (!activeCallUpdated && ((num_active + num_held) != 12840d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian (btif_hf_cb[idx].num_active + btif_hf_cb[idx].num_held)) ) 12850d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian { 12860d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian BTIF_TRACE_DEBUG3("%s: Active call states changed. old: %d new: %d", __FUNCTION__, btif_hf_cb[idx].num_active, num_active); 12870d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian send_indicator_update(BTA_AG_IND_CALL, ((num_active + num_held) > 0) ? 1 : 0); 1288c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian } 12890d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12900d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* Held Changed? */ 12915ac22877c98f4934cced4d42b9ec87245f266967Brian if (num_held != btif_hf_cb[idx].num_held) 12925ac22877c98f4934cced4d42b9ec87245f266967Brian { 12930d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian BTIF_TRACE_DEBUG3("%s: Held call states changed. old: %d new: %d", 12940d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian __FUNCTION__, btif_hf_cb[idx].num_held, num_held); 12950d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian send_indicator_update(BTA_AG_IND_CALLHELD, ((num_held == 0) ? 0 : ((num_active == 0) ? 2 : 1))); 12960d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 12970d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 12980d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian /* Calls Swapped? */ 12990d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if ( (call_setup_state == btif_hf_cb[idx].call_setup_state) && 13000d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian (num_active && num_held) && 13010d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian (num_active == btif_hf_cb[idx].num_active) && 13028e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin (num_held == btif_hf_cb[idx].num_held) ) 1303c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian { 13048e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin BTIF_TRACE_DEBUG1("%s: Calls swapped", __FUNCTION__); 13058e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin send_indicator_update(BTA_AG_IND_CALLHELD, 1); 13068e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin } 1307c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 13088e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesinupdate_call_states: 13090d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian for (i = 0; i < btif_max_hf_clients; i++) 13108e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin { 13118e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin btif_hf_cb[i].num_active = num_active; 13128e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin btif_hf_cb[i].num_held = num_held; 13138e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin btif_hf_cb[i].call_setup_state = call_setup_state; 131479a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin } 13155ac22877c98f4934cced4d42b9ec87245f266967Brian return status; 13168e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin} 13178e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin 13188e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin 13198e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin/******************************************************************************* 13203af1f3b9220733f5e3a76fe38fbc397974678234Brian** 13218e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin** Function btif_hf_call_terminated_recently 132279a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin** 13235ac22877c98f4934cced4d42b9ec87245f266967Brian** Description Checks if a call has been terminated 13245ac22877c98f4934cced4d42b9ec87245f266967Brian** 13250d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian** Returns bt_status_t 13260d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian** 13270d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian*******************************************************************************/ 13280d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7BrianBOOLEAN btif_hf_call_terminated_recently() 13295961732c1b59403b4e736fa354a64d4a0e5d8af2Michal{ 13300d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian struct timespec now; 13310d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 13320d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian clock_gettime(CLOCK_MONOTONIC, &now); 13330d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian if (now.tv_sec < btif_hf_cb[0].call_end_timestamp.tv_sec + 13340d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian BTIF_HF_CALL_END_TIMEOUT) 13350d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian { 13360d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian return TRUE; 13370d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 13383af1f3b9220733f5e3a76fe38fbc397974678234Brian else 13393af1f3b9220733f5e3a76fe38fbc397974678234Brian { 13403af1f3b9220733f5e3a76fe38fbc397974678234Brian btif_hf_cb[0].call_end_timestamp.tv_sec = 0; 13410d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian return FALSE; 13423af1f3b9220733f5e3a76fe38fbc397974678234Brian } 13433af1f3b9220733f5e3a76fe38fbc397974678234Brian} 1344f69b5c56feb60791bad27d491ee9592238d4efb0Brian 13454901410293b35ac6bb4759142b50fcc0be8a1b25Brian/******************************************************************************* 134637cf13ed9a429c755f121daa1776b1b30a985ab3Brian** 13473af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function cleanup 13483af1f3b9220733f5e3a76fe38fbc397974678234Brian** 134937cf13ed9a429c755f121daa1776b1b30a985ab3Brian** Description Closes the HF interface 135037cf13ed9a429c755f121daa1776b1b30a985ab3Brian** 135137cf13ed9a429c755f121daa1776b1b30a985ab3Brian** Returns bt_status_t 135237cf13ed9a429c755f121daa1776b1b30a985ab3Brian** 135337cf13ed9a429c755f121daa1776b1b30a985ab3Brian*******************************************************************************/ 135437cf13ed9a429c755f121daa1776b1b30a985ab3Brianstatic void cleanup( void ) 13553af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 13563af1f3b9220733f5e3a76fe38fbc397974678234Brian BTIF_TRACE_EVENT1("%s", __FUNCTION__); 13573af1f3b9220733f5e3a76fe38fbc397974678234Brian 13583af1f3b9220733f5e3a76fe38fbc397974678234Brian if (bt_hf_callbacks) 13590d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian { 1360c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian btif_disable_service(BTA_HFP_SERVICE_ID); 1361c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian bt_hf_callbacks = NULL; 13620d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian } 136398b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter} 1364c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 13659726947b681225a5a438eaa7cb70c5fa36ce85eaBrian Paulstatic const bthf_interface_t bthfInterface = { 13663af1f3b9220733f5e3a76fe38fbc397974678234Brian sizeof(bthfInterface), 1367c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian init, 1368c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian connect, 1369c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian disconnect, 1370c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian connect_audio, 137198b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter disconnect_audio, 137298b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter start_voice_recognition, 13739f0acfe1384d3236ac30ffca4be96e9531d2e876Jakob Bornecrantz stop_voice_recognition, 137498b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter volume_control, 137598b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter device_status_notification, 137698b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter cops_response, 137798b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter cind_response, 137898b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter formatted_at_response, 137998b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter at_response, 138098b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter clcc_response, 13819726947b681225a5a438eaa7cb70c5fa36ce85eaBrian Paul phone_state_change, 13822bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin cleanup, 13830d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian}; 13840d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 13850d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/******************************************************************************* 13862bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin** 1387ef1fa4467f269e70f9f42764d6bfaffdee27cd6aStéphane Marchesin** Function btif_hf_execute_service 1388ef1fa4467f269e70f9f42764d6bfaffdee27cd6aStéphane Marchesin** 1389ef1fa4467f269e70f9f42764d6bfaffdee27cd6aStéphane Marchesin** Description Initializes/Shuts down the service 1390ef1fa4467f269e70f9f42764d6bfaffdee27cd6aStéphane Marchesin** 13910d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian** Returns BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise 1392** 1393*******************************************************************************/ 1394bt_status_t btif_hf_execute_service(BOOLEAN b_enable) 1395{ 1396 char * p_service_names[] = BTIF_HF_SERVICE_NAMES; 1397 int i; 1398 if (b_enable) 1399 { 1400 /* Enable and register with BTA-AG */ 1401 BTA_AgEnable (BTA_AG_PARSE, bte_hf_evt); 1402 for (i = 0; i < btif_max_hf_clients; i++) 1403 { 1404 BTA_AgRegister(BTIF_HF_SERVICES, BTIF_HF_SECURITY, 1405 BTIF_HF_FEATURES, p_service_names, bthf_hf_id[i]); 1406 } 1407 } 1408 else { 1409 /* De-register AG */ 1410 for (i = 0; i < btif_max_hf_clients; i++) 1411 { 1412 BTA_AgDeregister(btif_hf_cb[i].handle); 1413 } 1414 /* Disable AG */ 1415 BTA_AgDisable(); 1416 } 1417 return BT_STATUS_SUCCESS; 1418} 1419 1420/******************************************************************************* 1421** 1422** Function btif_hf_get_interface 1423** 1424** Description Get the hf callback interface 1425** 1426** Returns bthf_interface_t 1427** 1428*******************************************************************************/ 1429const bthf_interface_t *btif_hf_get_interface() 1430{ 1431 BTIF_TRACE_EVENT1("%s", __FUNCTION__); 1432 return &bthfInterface; 1433} 1434