15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2004-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach#define LOG_TAG "bta_ag_cmd" 2083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach 21549c64d1eb96f8096915a39c2a3447190c851bceMiao Chou#include <ctype.h> 22549c64d1eb96f8096915a39c2a3447190c851bceMiao Chou#include <stdio.h> 23549c64d1eb96f8096915a39c2a3447190c851bceMiao Chou#include <string.h> 24549c64d1eb96f8096915a39c2a3447190c851bceMiao Chou 25ffa5c93d455f33af1be3b04d39520413dc24afd5Zhihai Xu#include "bt_target.h" 26ffa5c93d455f33af1be3b04d39520413dc24afd5Zhihai Xu#include "bt_types.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_api.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_at.h" 29549c64d1eb96f8096915a39c2a3447190c851bceMiao Chou#include "bta_ag_int.h" 30549c64d1eb96f8096915a39c2a3447190c851bceMiao Chou#include "bta_api.h" 31549c64d1eb96f8096915a39c2a3447190c851bceMiao Chou#include "bta_sys.h" 32258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 3383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach#include "osi/include/log.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_api.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "utl.h" 36c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov/* Ring timeout */ 4378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#define BTA_AG_RING_TIMEOUT_MS (5 * 1000) /* 5 seconds */ 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CMD_MAX_VAL 32767 /* Maximum value is signed 16-bit value */ 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB/* Invalid Chld command */ 48c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB#define BTA_AG_INVALID_CHLD 255 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* clip type constants */ 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CLIP_TYPE_MIN 128 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CLIP_TYPE_MAX 175 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CLIP_TYPE_DEFAULT 129 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CLIP_TYPE_VOIP 255 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach#define COLON_IDX_4_VGSVGM 4 57292051c271cd1b2584ffdacd1913c6de13a0f6b6Tom Turney 5883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach/* Local events which will not trigger a higher layer callback */ 59292051c271cd1b2584ffdacd1913c6de13a0f6b6Tom Turneyenum 60292051c271cd1b2584ffdacd1913c6de13a0f6b6Tom Turney{ 6183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach BTA_AG_LOCAL_EVT_FIRST = 0x100, 6283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach BTA_AG_LOCAL_EVT_CCWA, 6383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach BTA_AG_LOCAL_EVT_CLIP, 6483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach BTA_AG_LOCAL_EVT_CMER, 6583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach BTA_AG_LOCAL_EVT_BRSF, 6683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach BTA_AG_LOCAL_EVT_CMEE, 6783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach BTA_AG_LOCAL_EVT_BIA, 6883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach BTA_AG_LOCAL_EVT_BCC, 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT command interpreter table for HSP */ 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_AT_CMD bta_ag_hsp_cmd[] = 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CKPD", BTA_AG_AT_CKPD_EVT, BTA_AG_AT_SET, BTA_AG_AT_INT, 200, 200}, 7583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+VGS", BTA_AG_SPK_EVT, BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 15}, 7683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+VGM", BTA_AG_MIC_EVT, BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 15}, 7783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach /* End-of-table marker used to stop lookup iteration */ 7883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"", 0, 0, 0, 0, 0} 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT command interpreter table for HFP */ 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_AT_CMD bta_ag_hfp_cmd[] = 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"A", BTA_AG_AT_A_EVT, BTA_AG_AT_NONE, BTA_AG_AT_STR, 0, 0}, 8583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"D", BTA_AG_AT_D_EVT, BTA_AG_AT_NONE | BTA_AG_AT_FREE, BTA_AG_AT_STR, 0, 0}, 8683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+VGS", BTA_AG_SPK_EVT, BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 15}, 8783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+VGM", BTA_AG_MIC_EVT, BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 15}, 8883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CCWA", BTA_AG_LOCAL_EVT_CCWA, BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 1}, 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Consider CHLD as str to take care of indexes for ECC */ 9083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CHLD", BTA_AG_AT_CHLD_EVT, BTA_AG_AT_SET | BTA_AG_AT_TEST, BTA_AG_AT_STR, 0, 4}, 9183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CHUP", BTA_AG_AT_CHUP_EVT, BTA_AG_AT_NONE, BTA_AG_AT_STR, 0, 0}, 9283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CIND", BTA_AG_AT_CIND_EVT, BTA_AG_AT_READ | BTA_AG_AT_TEST, BTA_AG_AT_STR, 0, 0}, 9383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CLIP", BTA_AG_LOCAL_EVT_CLIP, BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 1}, 9483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CMER", BTA_AG_LOCAL_EVT_CMER, BTA_AG_AT_SET, BTA_AG_AT_STR, 0, 0}, 9583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+VTS", BTA_AG_AT_VTS_EVT, BTA_AG_AT_SET, BTA_AG_AT_STR, 0, 0}, 9683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BINP", BTA_AG_AT_BINP_EVT, BTA_AG_AT_SET, BTA_AG_AT_INT, 1, 1}, 9783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BLDN", BTA_AG_AT_BLDN_EVT, BTA_AG_AT_NONE, BTA_AG_AT_STR, 0, 0}, 9883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BVRA", BTA_AG_AT_BVRA_EVT, BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 1}, 9983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BRSF", BTA_AG_LOCAL_EVT_BRSF, BTA_AG_AT_SET, BTA_AG_AT_INT, 0, BTA_AG_CMD_MAX_VAL}, 10083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+NREC", BTA_AG_AT_NREC_EVT, BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 0}, 10183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CNUM", BTA_AG_AT_CNUM_EVT, BTA_AG_AT_NONE, BTA_AG_AT_STR, 0, 0}, 10283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BTRH", BTA_AG_AT_BTRH_EVT, BTA_AG_AT_READ | BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 2}, 10383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CLCC", BTA_AG_AT_CLCC_EVT, BTA_AG_AT_NONE, BTA_AG_AT_STR, 0, 0}, 10483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+COPS", BTA_AG_AT_COPS_EVT, BTA_AG_AT_READ | BTA_AG_AT_SET, BTA_AG_AT_STR, 0, 0}, 10583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CMEE", BTA_AG_LOCAL_EVT_CMEE, BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 1}, 10683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BIA", BTA_AG_LOCAL_EVT_BIA, BTA_AG_AT_SET, BTA_AG_AT_STR, 0, 20}, 10783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CBC", BTA_AG_AT_CBC_EVT, BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 100}, 10883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BCC", BTA_AG_LOCAL_EVT_BCC, BTA_AG_AT_NONE, BTA_AG_AT_STR, 0, 0}, 10983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BCS", BTA_AG_AT_BCS_EVT, BTA_AG_AT_SET, BTA_AG_AT_INT, 0, BTA_AG_CMD_MAX_VAL}, 11083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BIND", BTA_AG_AT_BIND_EVT, BTA_AG_AT_SET | BTA_AG_AT_READ | BTA_AG_AT_TEST, BTA_AG_AT_STR, 0, 0}, 11183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BIEV", BTA_AG_AT_BIEV_EVT, BTA_AG_AT_SET, BTA_AG_AT_STR, 0, 0}, 11283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BAC", BTA_AG_AT_BAC_EVT, BTA_AG_AT_SET, BTA_AG_AT_STR, 0, 0}, 11383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach /* End-of-table marker used to stop lookup iteration */ 11483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"", 0, 0, 0, 0, 0} 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT result code table element */ 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach const char *result_string; /* AT result string */ 12183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach size_t result_id; /* Local or BTA result id */ 12283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach UINT8 arg_type; /* whether argument is int or string */ 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTA_AG_RESULT; 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT result code argument types */ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_FMT_NONE, /* no argument */ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_FMT_INT, /* integer argument */ 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_FMT_STR /* string argument */ 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach/* Local AT command result codes not defined in bta_ag_api.h */ 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach BTA_AG_LOCAL_RES_FIRST = 0x0100, 13783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach BTA_AG_LOCAL_RES_OK, 13883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach BTA_AG_LOCAL_RES_ERROR, 13983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach BTA_AG_LOCAL_RES_RING, 14083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach BTA_AG_LOCAL_RES_CLIP, 14183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach BTA_AG_LOCAL_RES_BRSF, 14283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach BTA_AG_LOCAL_RES_CMEE, 14383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach BTA_AG_LOCAL_RES_BCS 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach/* AT result code constant table */ 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_RESULT bta_ag_result_tbl[] = 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"OK", BTA_AG_LOCAL_RES_OK, BTA_AG_RES_FMT_NONE}, 15083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"ERROR", BTA_AG_LOCAL_RES_ERROR, BTA_AG_RES_FMT_NONE}, 15183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"RING", BTA_AG_LOCAL_RES_RING, BTA_AG_RES_FMT_NONE}, 15283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+VGS: ", BTA_AG_SPK_RES, BTA_AG_RES_FMT_INT}, 15383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+VGM: ", BTA_AG_MIC_RES, BTA_AG_RES_FMT_INT}, 15483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CCWA: ", BTA_AG_CALL_WAIT_RES, BTA_AG_RES_FMT_STR}, 15583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CHLD: ", BTA_AG_IN_CALL_HELD_RES,BTA_AG_RES_FMT_STR}, 15683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CIND: ", BTA_AG_CIND_RES, BTA_AG_RES_FMT_STR}, 15783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CLIP: ", BTA_AG_LOCAL_RES_CLIP, BTA_AG_RES_FMT_STR}, 15883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CIEV: ", BTA_AG_IND_RES, BTA_AG_RES_FMT_STR}, 15983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BINP: ", BTA_AG_BINP_RES, BTA_AG_RES_FMT_STR}, 16083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BVRA: ", BTA_AG_BVRA_RES, BTA_AG_RES_FMT_INT}, 16183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BRSF: ", BTA_AG_LOCAL_RES_BRSF, BTA_AG_RES_FMT_INT}, 16283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BSIR: ", BTA_AG_INBAND_RING_RES, BTA_AG_RES_FMT_INT}, 16383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CNUM: ", BTA_AG_CNUM_RES, BTA_AG_RES_FMT_STR}, 16483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BTRH: ", BTA_AG_BTRH_RES, BTA_AG_RES_FMT_INT}, 16583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CLCC: ", BTA_AG_CLCC_RES, BTA_AG_RES_FMT_STR}, 16683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+COPS: ", BTA_AG_COPS_RES, BTA_AG_RES_FMT_STR}, 16783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+CME ERROR: ", BTA_AG_LOCAL_RES_CMEE, BTA_AG_RES_FMT_INT}, 16883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BCS: ", BTA_AG_LOCAL_RES_BCS, BTA_AG_RES_FMT_INT}, 16983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"+BIND: ", BTA_AG_BIND_RES, BTA_AG_RES_FMT_STR}, 17083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {"", BTA_AG_UNAT_RES, BTA_AG_RES_FMT_STR} 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbachstatic const tBTA_AG_RESULT* bta_ag_result_by_code(size_t code) 17483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach{ 17583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach for (size_t i = 0; i != sizeof(bta_ag_result_tbl) / 17683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach sizeof(bta_ag_result_tbl[0]); ++i) 17783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach { 17883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach if (code == bta_ag_result_tbl[i].result_id) 17983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach return &bta_ag_result_tbl[i]; 18083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach } 18183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach return 0; 18283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach} 18383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_AT_CMD *bta_ag_at_tbl[BTA_AG_NUM_IDX] = 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_hsp_cmd, 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_hfp_cmd 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbachtypedef struct 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach size_t result_code; 19383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach size_t indicator; 19483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach} tBTA_AG_INDICATOR_MAP; 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach/* callsetup indicator value lookup table */ 19783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbachconst tBTA_AG_INDICATOR_MAP callsetup_indicator_map[] = 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {BTA_AG_IN_CALL_RES, BTA_AG_CALLSETUP_INCOMING}, 20083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {BTA_AG_CALL_WAIT_RES, BTA_AG_CALLSETUP_INCOMING}, 20183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {BTA_AG_OUT_CALL_ORIG_RES, BTA_AG_CALLSETUP_OUTGOING}, 20283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach {BTA_AG_OUT_CALL_ALERT_RES, BTA_AG_CALLSETUP_ALERTING} 203292051c271cd1b2584ffdacd1913c6de13a0f6b6Tom Turney}; 204292051c271cd1b2584ffdacd1913c6de13a0f6b6Tom Turney 20583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbachstatic size_t bta_ag_indicator_by_result_code(size_t code) 206292051c271cd1b2584ffdacd1913c6de13a0f6b6Tom Turney{ 20783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach for (size_t i = 0; i != sizeof(callsetup_indicator_map) / 20883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach sizeof(callsetup_indicator_map[0]); ++i) 20983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach { 21083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach if (code == callsetup_indicator_map[i].result_code) 21183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach return callsetup_indicator_map[i].indicator; 21283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach } 21383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach return BTA_AG_CALLSETUP_NONE; 21483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach} 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_send_result 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an AT result code. 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 22683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbachstatic void bta_ag_send_result(tBTA_AG_SCB *p_scb, size_t code, char *p_arg, 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT16 int_arg) 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 22983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach const tBTA_AG_RESULT *result = bta_ag_result_by_code(code); 23083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach if (result == 0) 23183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach { 23283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach LOG_ERROR(LOG_TAG, "%s Unable to lookup result for code %zu", __func__, code); 23383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach return; 23483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach } 23583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach 23683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach char buf[BTA_AG_AT_MAX_LEN + 16]; 23783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach char *p = buf; 23883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach memset(buf, 0, sizeof(buf)); 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* init with \r\n */ 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = '\r'; 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = '\n'; 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* copy result code string */ 24583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach strlcpy(p, result->result_string, sizeof(buf) - 2); 24683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach 24783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach if (p_scb->conn_service == BTA_AG_HSP) 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If HSP then ":"symbol should be changed as "=" for HSP compatibility */ 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(code) 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_SPK_RES: 25383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_MIC_RES: 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(*(p+COLON_IDX_4_VGSVGM) == ':') 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *(p+COLON_IDX_4_VGSVGM) = '='; 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach 26283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach p += strlen(result->result_string); 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* copy argument if any */ 26583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach if (result->arg_type == BTA_AG_RES_FMT_INT) 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += utl_itoa((UINT16) int_arg, p); 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach else if (result->arg_type == BTA_AG_RES_FMT_STR) 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27166209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach strcpy(p, p_arg); 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += strlen(p_arg); 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* finish with \r\n */ 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = '\r'; 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = '\n'; 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send to RFCOMM */ 28083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach UINT16 len = 0; 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project PORT_WriteData(p_scb->conn_handle, buf, (UINT16) (p - buf), &len); 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_send_ok 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an OK result code. 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_send_ok(tBTA_AG_SCB *p_scb) 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_OK, NULL, 0); 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_send_error 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an ERROR result code. 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** errcode - used to send verbose errocode 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_send_error(tBTA_AG_SCB *p_scb, INT16 errcode) 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If HFP and extended audio gateway error codes are enabled */ 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->conn_service == BTA_AG_HFP && p_scb->cmee_enabled) 31483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_CMEE, NULL, errcode); 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 31683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_ERROR, NULL, 0); 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_send_ind 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an indicator CIEV result code. 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_send_ind(tBTA_AG_SCB *p_scb, UINT16 id, UINT16 value, BOOLEAN on_demand) 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char str[12]; 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p = str; 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the indicator is masked out, just return */ 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mandatory indicators can not be masked out. */ 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->bia_masked_out & ((UINT32)1 << id)) && 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((id != BTA_AG_IND_CALL) && (id != BTA_AG_IND_CALLSETUP) && (id != BTA_AG_IND_CALLHELD))) 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Ensure we do not send duplicate indicators if not requested by app */ 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If it was requested by app, transmit CIEV even if it is duplicate. */ 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (id == BTA_AG_IND_CALL) 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((value == p_scb->call_ind) && (on_demand == FALSE)) 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->call_ind = (UINT8)value; 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((id == BTA_AG_IND_CALLSETUP) && (on_demand == FALSE)) 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (value == p_scb->callsetup_ind) 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->callsetup_ind = (UINT8)value; 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((id == BTA_AG_IND_SERVICE) && (on_demand == FALSE)) 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (value == p_scb->service_ind) 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->service_ind = (UINT8)value; 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((id == BTA_AG_IND_SIGNAL) && (on_demand == FALSE)) 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (value == p_scb->signal_ind) 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->signal_ind = (UINT8)value; 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((id == BTA_AG_IND_ROAM) && (on_demand == FALSE)) 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (value == p_scb->roam_ind) 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->roam_ind = (UINT8)value; 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((id == BTA_AG_IND_BATTCHG) && (on_demand == FALSE)) 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (value == p_scb->battchg_ind) 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->battchg_ind = (UINT8)value; 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((id == BTA_AG_IND_CALLHELD) && (on_demand == FALSE)) 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call swap could result in sending callheld=1 multiple times */ 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((value != 1) && (value == p_scb->callheld_ind)) 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->callheld_ind = (UINT8)value; 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->cmer_enabled) 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += utl_itoa(id, p); 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = ','; 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_itoa(value, p); 40183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, BTA_AG_IND_RES, str, 0); 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_parse_cmer 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Parse AT+CMER parameter string. 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if parsed ok, FALSE otherwise. 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_ag_parse_cmer(char *p_s, BOOLEAN *p_enabled) 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT16 n[4] = {-1, -1, -1, -1}; 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p; 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < 4; i++) 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* skip to comma delimiter */ 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (p = p_s; *p != ',' && *p != 0; p++); 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get integer value */ 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p = 0; 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project n[i] = utl_str2int(p_s); 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_s = p + 1; 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_s == 0) 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* process values */ 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (n[0] < 0 || n[3] < 0) 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((n[0] == 3) && ((n[3] == 1) || (n[3] == 0))) 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_enabled = (BOOLEAN) n[3]; 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_parse_chld 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Parse AT+CHLD parameter string. 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 457c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB** Returns Returns idx (1-7), 0 if ECC not enabled or BTA_AG_INVALID_CHLD 458c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB if idx doesn't exist/1st character of argument is not a digit 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 bta_ag_parse_chld(tBTA_AG_SCB *p_scb, char *p_s) 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 retval = 0; 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT16 idx = -1; 4655cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_scb); 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 467c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB if (!isdigit(p_s[0])) 468c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB { 469c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB return BTA_AG_INVALID_CHLD; 470c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB } 471c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_s[1] != 0) 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* p_idxstr++; point to beginning of call number */ 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project idx = utl_str2int(&p_s[1]); 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (idx != -1 && idx < 255) 477c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB { 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project retval = (UINT8)idx; 479c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB } 480c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB else 481c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB { 482c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB retval = BTA_AG_INVALID_CHLD; 483c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB } 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (retval); 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_parse_bac 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Parse AT+BAC parameter string. 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Returns bitmap of supported codecs. 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_AG_PEER_CODEC bta_ag_parse_bac(tBTA_AG_SCB *p_scb, char *p_s) 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_PEER_CODEC retval = BTA_AG_CODEC_NONE; 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 uuid_codec; 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN cont = FALSE; /* Continue processing */ 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p; 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while(p_s) 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* skip to comma delimiter */ 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(p = p_s; *p != ',' && *p != 0; p++); 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get integre value */ 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (*p != 0) 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p = 0; 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cont = TRUE; 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cont = FALSE; 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_codec = utl_str2int(p_s); 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(uuid_codec) 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UUID_CODEC_CVSD: retval |= BTA_AG_CODEC_CVSD; break; 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UUID_CODEC_MSBC: retval |= BTA_AG_CODEC_MSBC; break; 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 526e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Unknown Codec UUID(%d) received", uuid_codec); 527f95c12a8e7c3f264b03a51644368ca4232cc3cc4Satish Kodishala break; 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (cont) 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_s = p + 1; 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (retval); 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_process_unat_res 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Process the unat response data and remove extra carriage return 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** and line feed 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_process_unat_res(char *unat_result) 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 str_leng; 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i = 0; 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 j = 0; 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 pairs_of_nl_cr; 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char trim_data[BTA_AG_AT_MAX_LEN]; 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project str_leng = strlen(unat_result); 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If no extra CR and LF, just return */ 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(str_leng < 4) 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Remove the carriage return and left feed */ 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while(unat_result[0] =='\r' && unat_result[1] =='\n' 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && unat_result[str_leng-2] =='\r' && unat_result[str_leng-1] =='\n') 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pairs_of_nl_cr = 1; 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=0;i<(str_leng-4*pairs_of_nl_cr);i++) 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project trim_data[j++] = unat_result[i+pairs_of_nl_cr*2]; 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Add EOF */ 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project trim_data[j] = '\0'; 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project str_leng = str_leng - 4; 58066209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach strlcpy(unat_result, trim_data, str_leng+1); 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i=0; 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project j=0; 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(str_leng <4) 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_inband_enabled 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Determine whether in-band ring can be used. 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_ag_inband_enabled(tBTA_AG_SCB *p_scb) 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if feature is enabled and no other scbs connected */ 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->inband_enabled && !bta_ag_other_scb_open(p_scb)) 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_send_call_inds 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send call and callsetup indicators. 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_send_call_inds(tBTA_AG_SCB *p_scb, tBTA_AG_RES result) 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 call = p_scb->call_ind; 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set new call and callsetup values based on BTA_AgResult */ 63183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach size_t callsetup = bta_ag_indicator_by_result_code(result); 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == BTA_AG_END_CALL_RES) 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project call = BTA_AG_CALL_INACTIVE; 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (result == BTA_AG_IN_CALL_CONN_RES || result == BTA_AG_OUT_CALL_CONN_RES 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || result == BTA_AG_IN_CALL_HELD_RES) 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project call = BTA_AG_CALL_ACTIVE; 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project call = p_scb->call_ind; 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send indicator function tracks if the values have actually changed */ 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ind(p_scb, BTA_AG_IND_CALL, call, FALSE); 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ind(p_scb, BTA_AG_IND_CALLSETUP, callsetup, FALSE); 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_at_hsp_cback 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description AT command processing callback for HSP. 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 66283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbachvoid bta_ag_at_hsp_cback(tBTA_AG_SCB *p_scb, UINT16 command_id, UINT8 arg_type, 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p_arg, INT16 int_arg) 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 66583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach APPL_TRACE_DEBUG("AT cmd:%d arg_type:%d arg:%d arg:%s", command_id, arg_type, 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int_arg, p_arg); 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 67083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach tBTA_AG_VAL val; 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.hdr.handle = bta_ag_scb_to_idx(p_scb); 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.hdr.app_id = p_scb->app_id; 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.num = (UINT16) int_arg; 67466209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach strlcpy(val.str, p_arg, BTA_AG_AT_MAX_LEN); 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call callback with event */ 67783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach (*bta_ag_cb.p_cback)(command_id, (tBTA_AG *) &val); 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 682e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Function bta_ag_find_empty_hf_ind) 683e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 684e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Description This function returns the index of an empty HF indicator 685e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** structure. 686e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 687e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Returns int : index of the empty HF indicator structure or 688e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** -1 if no empty indicator 689e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** is available. 690e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 691e5bed64926d6ae45501617052f90932287da135bMudumba Ananth*******************************************************************************/ 692e5bed64926d6ae45501617052f90932287da135bMudumba Ananthstatic int bta_ag_find_empty_hf_ind(tBTA_AG_SCB *p_scb) 693e5bed64926d6ae45501617052f90932287da135bMudumba Ananth{ 694e5bed64926d6ae45501617052f90932287da135bMudumba Ananth for (int index = 0; index < BTA_AG_MAX_NUM_PEER_HF_IND; index++) 695e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 696e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (p_scb->peer_hf_indicators[index].ind_id == 0) 697e5bed64926d6ae45501617052f90932287da135bMudumba Ananth return index; 698e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 699e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 700e5bed64926d6ae45501617052f90932287da135bMudumba Ananth return -1; 701e5bed64926d6ae45501617052f90932287da135bMudumba Ananth} 702e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 703e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 704e5bed64926d6ae45501617052f90932287da135bMudumba Ananth/******************************************************************************* 705e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 706e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Function bta_ag_find_hf_ind_by_id 707e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 708e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Description This function returns the index of the HF indicator 709e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** structure by the indicator id 710e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 711e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Returns int : index of the HF indicator structure 712e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** -1 if the indicator 713e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** was not found. 714e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 715e5bed64926d6ae45501617052f90932287da135bMudumba Ananth*******************************************************************************/ 716e5bed64926d6ae45501617052f90932287da135bMudumba Ananthstatic int bta_ag_find_hf_ind_by_id(tBTA_AG_HF_IND *p_hf_ind, int size, uint32_t ind_id) 717e5bed64926d6ae45501617052f90932287da135bMudumba Ananth{ 718e5bed64926d6ae45501617052f90932287da135bMudumba Ananth for (int index = 0; index < size; index++) 719e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 720e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (p_hf_ind[index].ind_id == ind_id) 721e5bed64926d6ae45501617052f90932287da135bMudumba Ananth return index; 722e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 723e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 724e5bed64926d6ae45501617052f90932287da135bMudumba Ananth return -1; 725e5bed64926d6ae45501617052f90932287da135bMudumba Ananth} 726e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 727e5bed64926d6ae45501617052f90932287da135bMudumba Ananth/******************************************************************************* 728e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 729e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Function bta_ag_parse_bind_set 730e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 731e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Description Parse AT+BIND set command and save the indicators 732e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 733e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Returns true if successful 734e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 735e5bed64926d6ae45501617052f90932287da135bMudumba Ananth*******************************************************************************/ 736e5bed64926d6ae45501617052f90932287da135bMudumba Ananthstatic bool bta_ag_parse_bind_set(tBTA_AG_SCB *p_scb, tBTA_AG_VAL val) 737e5bed64926d6ae45501617052f90932287da135bMudumba Ananth{ 738e5bed64926d6ae45501617052f90932287da135bMudumba Ananth char *p_token = strtok(val.str, ","); 739e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (p_token == NULL) 740e5bed64926d6ae45501617052f90932287da135bMudumba Ananth return false; 741e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 742e5bed64926d6ae45501617052f90932287da135bMudumba Ananth while (p_token != NULL) 743e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 744e5bed64926d6ae45501617052f90932287da135bMudumba Ananth uint16_t rcv_ind_id = atoi(p_token); 745e5bed64926d6ae45501617052f90932287da135bMudumba Ananth int index = bta_ag_find_empty_hf_ind(p_scb); 746e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (index == -1) 747e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 748e5bed64926d6ae45501617052f90932287da135bMudumba Ananth APPL_TRACE_WARNING("%s Can't save more indicators", __func__); 749e5bed64926d6ae45501617052f90932287da135bMudumba Ananth return false; 750e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 751e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 752e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p_scb->peer_hf_indicators[index].ind_id = rcv_ind_id; 753e5bed64926d6ae45501617052f90932287da135bMudumba Ananth APPL_TRACE_DEBUG("%s peer_hf_ind[%d] = %d", __func__, index, rcv_ind_id); 754e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 755e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p_token = strtok(NULL, ","); 756e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 757e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 758e5bed64926d6ae45501617052f90932287da135bMudumba Ananth return true; 759e5bed64926d6ae45501617052f90932287da135bMudumba Ananth} 760e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 761e5bed64926d6ae45501617052f90932287da135bMudumba Ananth/******************************************************************************* 762e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 763e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Function bta_ag_bind_response 764e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 765e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Description Send response for the AT+BIND command (HFP 1.7) received 766e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** from the headset based on the argument types. 767e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 768e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Returns Void 769e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 770e5bed64926d6ae45501617052f90932287da135bMudumba Ananth*******************************************************************************/ 771e5bed64926d6ae45501617052f90932287da135bMudumba Ananthstatic void bta_ag_bind_response(tBTA_AG_SCB *p_scb, uint8_t arg_type) 772e5bed64926d6ae45501617052f90932287da135bMudumba Ananth{ 773e5bed64926d6ae45501617052f90932287da135bMudumba Ananth char buffer[BTA_AG_AT_MAX_LEN]; 774e5bed64926d6ae45501617052f90932287da135bMudumba Ananth memset(buffer, 0, BTA_AG_AT_MAX_LEN); 775e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 776e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (arg_type == BTA_AG_AT_TEST) 777e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 778e5bed64926d6ae45501617052f90932287da135bMudumba Ananth int index = 0; 779e5bed64926d6ae45501617052f90932287da135bMudumba Ananth buffer[index++] = '('; 780e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 781e5bed64926d6ae45501617052f90932287da135bMudumba Ananth for (uint32_t i = 0; i < bta_ag_local_hf_ind_cfg[0].ind_id; i++) 782e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 783e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (bta_ag_local_hf_ind_cfg[i+1].is_supported == true) 784e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 785e5bed64926d6ae45501617052f90932287da135bMudumba Ananth /* Add ',' from second indicator */ 786e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (index > 1) 787e5bed64926d6ae45501617052f90932287da135bMudumba Ananth buffer[index++] = ','; 788e5bed64926d6ae45501617052f90932287da135bMudumba Ananth sprintf(&buffer[index++], "%d", bta_ag_local_hf_ind_cfg[i+1].ind_id); 789e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 790e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 791e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 792e5bed64926d6ae45501617052f90932287da135bMudumba Ananth buffer[index++] = ')'; 793e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 79483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, BTA_AG_BIND_RES, buffer, 0); 795e5bed64926d6ae45501617052f90932287da135bMudumba Ananth bta_ag_send_ok(p_scb); 796e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 797e5bed64926d6ae45501617052f90932287da135bMudumba Ananth else if (arg_type == BTA_AG_AT_READ) 798e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 799e5bed64926d6ae45501617052f90932287da135bMudumba Ananth char *p = buffer; 800e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 801e5bed64926d6ae45501617052f90932287da135bMudumba Ananth /* bta_ag_local_hf_ind_cfg[0].ind_id is used as BTA_AG_NUM_LOCAL_HF_IND */ 802e5bed64926d6ae45501617052f90932287da135bMudumba Ananth for (uint32_t i = 0; i < bta_ag_local_hf_ind_cfg[0].ind_id; i++) 803e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 804e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (i == BTA_AG_MAX_NUM_LOCAL_HF_IND) 805e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 806e5bed64926d6ae45501617052f90932287da135bMudumba Ananth APPL_TRACE_WARNING("%s No space for more HF indicators", __func__); 807e5bed64926d6ae45501617052f90932287da135bMudumba Ananth break; 808e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 809e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 810e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p_scb->local_hf_indicators[i].ind_id = bta_ag_local_hf_ind_cfg[i+1].ind_id; 811e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p_scb->local_hf_indicators[i].is_supported = bta_ag_local_hf_ind_cfg[i+1].is_supported; 812e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p_scb->local_hf_indicators[i].is_enable = bta_ag_local_hf_ind_cfg[i+1].is_enable; 813e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 814e5bed64926d6ae45501617052f90932287da135bMudumba Ananth int peer_index = bta_ag_find_hf_ind_by_id(p_scb->peer_hf_indicators, 815e5bed64926d6ae45501617052f90932287da135bMudumba Ananth BTA_AG_MAX_NUM_PEER_HF_IND, 816e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p_scb->local_hf_indicators[i].ind_id); 817e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 818e5bed64926d6ae45501617052f90932287da135bMudumba Ananth /* Check whether local and peer sides support this indicator */ 819e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (p_scb->local_hf_indicators[i].is_supported == true && peer_index != -1) 820e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 821e5bed64926d6ae45501617052f90932287da135bMudumba Ananth /* In the format of ind, state */ 822e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p += utl_itoa((uint16_t) p_scb->local_hf_indicators[i].ind_id, p); 823e5bed64926d6ae45501617052f90932287da135bMudumba Ananth *p++ = ','; 824e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p += utl_itoa((uint16_t) p_scb->local_hf_indicators[i].is_enable, p); 825e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 82683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, BTA_AG_BIND_RES, buffer, 0); 827e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 828e5bed64926d6ae45501617052f90932287da135bMudumba Ananth memset(buffer, 0, sizeof(buffer)); 829e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p = buffer; 830e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } else { 831e5bed64926d6ae45501617052f90932287da135bMudumba Ananth /* If indicator is not supported, also set it to disable */ 832e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p_scb->local_hf_indicators[i].is_enable = false; 833e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 834e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 835e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 836e5bed64926d6ae45501617052f90932287da135bMudumba Ananth bta_ag_send_ok(p_scb); 837e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 838e5bed64926d6ae45501617052f90932287da135bMudumba Ananth /* If the service level connection wan't already open, now it's open */ 839e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (!p_scb->svc_conn) 840e5bed64926d6ae45501617052f90932287da135bMudumba Ananth bta_ag_svc_conn_open(p_scb, NULL); 841e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 842e5bed64926d6ae45501617052f90932287da135bMudumba Ananth} 843e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 844e5bed64926d6ae45501617052f90932287da135bMudumba Ananth/******************************************************************************* 845e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 846e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Function bta_ag_parse_biev_response 847e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 848e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Description Send response for AT+BIEV command (HFP 1.7) received from 849e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** the headset based on the argument types. 850e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 851e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Returns true if the response was parsed successfully 852e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 853e5bed64926d6ae45501617052f90932287da135bMudumba Ananth*******************************************************************************/ 854e5bed64926d6ae45501617052f90932287da135bMudumba Ananthstatic bool bta_ag_parse_biev_response(tBTA_AG_SCB *p_scb, tBTA_AG_VAL *val) 855e5bed64926d6ae45501617052f90932287da135bMudumba Ananth{ 856e5bed64926d6ae45501617052f90932287da135bMudumba Ananth char *p_token = strtok(val->str, ","); 857e5bed64926d6ae45501617052f90932287da135bMudumba Ananth uint16_t rcv_ind_id = atoi(p_token); 858e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 859e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p_token = strtok(NULL, ","); 860e5bed64926d6ae45501617052f90932287da135bMudumba Ananth uint16_t rcv_ind_val = atoi(p_token); 861e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 862e5bed64926d6ae45501617052f90932287da135bMudumba Ananth APPL_TRACE_DEBUG("%s BIEV indicator id %d, value %d", __func__, rcv_ind_id, rcv_ind_val); 863e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 864e5bed64926d6ae45501617052f90932287da135bMudumba Ananth /* Check whether indicator ID is valid or not */ 865e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (rcv_ind_id > BTA_AG_NUM_LOCAL_HF_IND) 866e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 867e5bed64926d6ae45501617052f90932287da135bMudumba Ananth APPL_TRACE_WARNING("%s received invalid indicator id %d", __func__, rcv_ind_id); 868e5bed64926d6ae45501617052f90932287da135bMudumba Ananth return false; 869e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 870e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 871e5bed64926d6ae45501617052f90932287da135bMudumba Ananth /* Check this indicator is support or not and enabled or not */ 872e5bed64926d6ae45501617052f90932287da135bMudumba Ananth int local_index = bta_ag_find_hf_ind_by_id(p_scb->local_hf_indicators, 873e5bed64926d6ae45501617052f90932287da135bMudumba Ananth BTA_AG_MAX_NUM_LOCAL_HF_IND, rcv_ind_id); 874e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (local_index == -1 || 875e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p_scb->local_hf_indicators[local_index].is_supported != true || 876e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p_scb->local_hf_indicators[local_index].is_enable != true) 877e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 878e5bed64926d6ae45501617052f90932287da135bMudumba Ananth APPL_TRACE_WARNING("%s indicator id %d not supported or disabled", __func__, rcv_ind_id); 879e5bed64926d6ae45501617052f90932287da135bMudumba Ananth return false; 880e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 881e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 882e5bed64926d6ae45501617052f90932287da135bMudumba Ananth /* For each indicator ID, check whether the indicator value is in range */ 883e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (rcv_ind_val < bta_ag_local_hf_ind_cfg[rcv_ind_id].ind_min_val || 884e5bed64926d6ae45501617052f90932287da135bMudumba Ananth rcv_ind_val > bta_ag_local_hf_ind_cfg[rcv_ind_id].ind_max_val) 885e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 886e5bed64926d6ae45501617052f90932287da135bMudumba Ananth APPL_TRACE_WARNING("%s invalid ind_val %d", __func__, rcv_ind_val); 887e5bed64926d6ae45501617052f90932287da135bMudumba Ananth return false; 888e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 889e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 890e5bed64926d6ae45501617052f90932287da135bMudumba Ananth val->lidx = rcv_ind_id; 891e5bed64926d6ae45501617052f90932287da135bMudumba Ananth val->num = rcv_ind_val; 892e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 893e5bed64926d6ae45501617052f90932287da135bMudumba Ananth return true; 894e5bed64926d6ae45501617052f90932287da135bMudumba Ananth} 895e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 896e5bed64926d6ae45501617052f90932287da135bMudumba Ananth/******************************************************************************* 897e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_at_hfp_cback 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description AT command processing callback for HFP. 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_hfp_cback(tBTA_AG_SCB *p_scb, UINT16 cmd, UINT8 arg_type, 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p_arg, INT16 int_arg) 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_VAL val; 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *ag_scb; 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 i, ind_id; 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 bia_masked_out; 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_PEER_CODEC codec_type, codec_sent; 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 91646d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB if (p_arg == NULL) 91746d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB { 91846d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB APPL_TRACE_ERROR("%s: p_arg is null, send error and return", __func__); 91946d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR); 92046d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB return; 92146d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB } 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 923e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("HFP AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type, 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int_arg, p_arg); 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9261b3e27469d7288b7696a1556b516e8f91c9d6a0fDevin Kim memset(&val, 0, sizeof(tBTA_AG_VAL)); 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.hdr.handle = bta_ag_scb_to_idx(p_scb); 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.hdr.app_id = p_scb->app_id; 929e5bed64926d6ae45501617052f90932287da135bMudumba Ananth val.hdr.status = BTA_AG_SUCCESS; 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.num = int_arg; 9312cb90bc58fc075ec2f814ada5ae8f728380566c1Nitin Srivastava bdcpy(val.bd_addr, p_scb->peer_addr); 93266209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach strlcpy(val.str, p_arg, BTA_AG_AT_MAX_LEN); 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 93483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach /** 93583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach * Unless this this is a local event, by default we'll forward 93683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach * the event code to the application. 93783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach * If |event| is 0 at the end of this function, the application 93883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach * callback is NOT invoked. 93983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach */ 94083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach tBTA_AG_EVT event = 0; 94183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach if (cmd < BTA_AG_LOCAL_EVT_FIRST) 94283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach event = cmd; 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (cmd) 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 94683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_A_EVT: 94783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_SPK_EVT: 94883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_MIC_EVT: 94983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_CHUP_EVT: 95083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_CBC_EVT: 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send OK */ 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 95583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_BLDN_EVT: 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Do not send OK, App will send error or OK depending on 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** last dial number enabled or not */ 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 96083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_D_EVT: 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Do not send OK for Dial cmds 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Let application decide whether to send OK or ERROR*/ 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if mem dial cmd, make sure string contains only digits */ 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_arg[0] == '>') 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!utl_isintstr(p_arg+1)) 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_DSTR); 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_arg[0] == 'V') /* ATDV : Dial VoIP Call */ 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We do not check string. Code will be added later if needed. */ 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!((p_scb->peer_features & BTA_AG_PEER_FEAT_VOIP) && (p_scb->features & BTA_AG_FEAT_VOIP))) 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If dial cmd, make sure string contains only dial digits 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Dial digits are 0-9, A-C, *, #, + */ 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!utl_isdialstr(p_arg)) 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_DSTR); 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 99483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_LOCAL_EVT_CCWA: 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store setting */ 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->ccwa_enabled = (BOOLEAN) int_arg; 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send OK */ 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 100283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_CHLD_EVT: 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (arg_type == BTA_AG_AT_TEST) 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* don't call callback */ 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send CHLD string */ 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Form string based on supported 1.5 feature */ 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->peer_version >= HFP_VERSION_1_5) && 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->features & BTA_AG_FEAT_ECC) && 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->peer_features & BTA_AG_PEER_FEAT_ECC)) 101383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, BTA_AG_IN_CALL_HELD_RES, 101483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach p_bta_ag_cfg->chld_val_ecc, 0); 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 101683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, BTA_AG_IN_CALL_HELD_RES, 101783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach p_bta_ag_cfg->chld_val, 0); 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send OK */ 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if service level conn. not already open, now it's open */ 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_svc_conn_open(p_scb, NULL); 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.idx = bta_ag_parse_chld(p_scb, val.str); 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1029c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB if (val.idx == BTA_AG_INVALID_CHLD) 1030c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB { 1031c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB event = 0; 1032c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 1033c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB break; 1034c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB } 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(val.idx && !((p_scb->features & BTA_AG_FEAT_ECC) && (p_scb->peer_features & BTA_AG_PEER_FEAT_ECC))) 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we do not support ECC, but HF is sending us a CHLD with call index*/ 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If it is swap between calls, set call held indicator to 3(out of valid 0-2) 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Application will set it back to 1 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** callheld indicator will be sent across to the peer. */ 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(val.str[0] == '2') 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0, ag_scb = &bta_ag_cb.scb[0]; i < BTA_AG_NUM_SCB; i++, ag_scb++) 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ag_scb->in_use) 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if((ag_scb->call_ind == BTA_AG_CALL_ACTIVE) 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (ag_scb->callsetup_ind == BTA_AG_CALLSETUP_NONE)) 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ag_scb->callheld_ind = BTA_AG_CALLHELD_NOACTIVE + 1; 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Do not send OK. Let app decide after parsing the val str */ 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* bta_ag_send_ok(p_scb); */ 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 106783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_BIND_EVT: 106883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach APPL_TRACE_DEBUG("%s BTA_AG_AT_BIND_EVT arg_type: %d", __func__, arg_type); 1069e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (arg_type == BTA_AG_AT_SET) 1070e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 1071e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (bta_ag_parse_bind_set(p_scb, val)) 1072e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 1073e5bed64926d6ae45501617052f90932287da135bMudumba Ananth bta_ag_send_ok(p_scb); 1074e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } else { 1075e5bed64926d6ae45501617052f90932287da135bMudumba Ananth event = 0;/* don't call callback */ 1076e5bed64926d6ae45501617052f90932287da135bMudumba Ananth bta_ag_send_error(p_scb, BTA_AG_ERR_INVALID_INDEX); 1077e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 1078e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } else { 1079e5bed64926d6ae45501617052f90932287da135bMudumba Ananth bta_ag_bind_response(p_scb, arg_type); 1080e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 1081e5bed64926d6ae45501617052f90932287da135bMudumba Ananth /* Need not pass this command beyond BTIF.*/ 1082e5bed64926d6ae45501617052f90932287da135bMudumba Ananth /* Stack handles it internally */ 1083e5bed64926d6ae45501617052f90932287da135bMudumba Ananth event = 0;/* don't call callback */ 1084e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 1085e5bed64926d6ae45501617052f90932287da135bMudumba Ananth break; 1086e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 108783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_BIEV_EVT: 1088e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (bta_ag_parse_biev_response(p_scb, &val)) 1089e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 1090e5bed64926d6ae45501617052f90932287da135bMudumba Ananth bta_ag_send_ok(p_scb); 1091e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } else { 1092e5bed64926d6ae45501617052f90932287da135bMudumba Ananth bta_ag_send_error(p_scb, BTA_AG_ERR_INVALID_INDEX); 1093e5bed64926d6ae45501617052f90932287da135bMudumba Ananth /* don't call callback receiving invalid indicator */ 1094e5bed64926d6ae45501617052f90932287da135bMudumba Ananth event = 0; 1095e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 1096e5bed64926d6ae45501617052f90932287da135bMudumba Ananth break; 1097e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 109883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_CIND_EVT: 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (arg_type == BTA_AG_AT_TEST) 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* don't call callback */ 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send CIND string, send OK */ 110583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, BTA_AG_CIND_RES, p_bta_ag_cfg->cind_info, 0); 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 111083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_LOCAL_EVT_CLIP: 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store setting, send OK */ 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->clip_enabled = (BOOLEAN) int_arg; 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 111683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_LOCAL_EVT_CMER: 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if parsed ok store setting, send OK */ 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_parse_cmer(p_arg, &p_scb->cmer_enabled)) 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if service level conn. not already open and our features and 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** peer features do not have 3-way, service level conn. now open 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_scb->svc_conn && 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !((p_scb->features & BTA_AG_FEAT_3WAY) && (p_scb->peer_features & BTA_AG_PEER_FEAT_3WAY))) 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_svc_conn_open(p_scb, NULL); 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR); 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 113783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_VTS_EVT: 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check argument */ 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (strlen(p_arg) == 1) 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR); 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 115083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_BINP_EVT: 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if feature not set don't call callback, send ERROR */ 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_scb->features & BTA_AG_FEAT_VTAG)) 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 115983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_BVRA_EVT: 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if feature not supported don't call callback, send ERROR. App will send OK */ 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_scb->features & BTA_AG_FEAT_VREC)) 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 116883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_LOCAL_EVT_BRSF: 1169ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach { 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store peer features */ 1171e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p_scb->peer_features = (uint16_t) int_arg; 1172ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach 1173ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach tBTA_AG_FEAT features = p_scb->features; 1174ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach if (p_scb->peer_version < HFP_VERSION_1_7) 1175ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach { 1176ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach features &= HFP_1_6_FEAT_MASK; 1177ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach } 1178ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach 1179e5bed64926d6ae45501617052f90932287da135bMudumba Ananth APPL_TRACE_DEBUG("%s BRSF HF: 0x%x, phone: 0x%x", __func__, 1180ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach p_scb->peer_features, features); 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send BRSF, send OK */ 118395ac90b5e8f9b003f15c49d6bd5be5399ffa30c3Andre Eisenbach bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_BRSF, NULL, (int16_t) features); 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 1186ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach } 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 118883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_NREC_EVT: 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if feature send OK, else don't call callback, send ERROR */ 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->features & BTA_AG_FEAT_ECNR) 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 120183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_BTRH_EVT: 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if feature send BTRH, send OK:, else don't call callback, send ERROR */ 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->features & BTA_AG_FEAT_BTRH) 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If set command; send response and notify app */ 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (arg_type == BTA_AG_AT_SET) 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0, ag_scb = &bta_ag_cb.scb[0]; i < BTA_AG_NUM_SCB; i++, ag_scb++) 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ag_scb->in_use) 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 121283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(ag_scb, BTA_AG_BTRH_RES, NULL, int_arg); 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Read Command */ 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.num = BTA_AG_BTRH_READ; 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 122983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_COPS_EVT: 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (arg_type == BTA_AG_AT_SET) 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* don't call callback */ 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send OK */ 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 124083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_LOCAL_EVT_CMEE: 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->features & BTA_AG_FEAT_EXTERR) 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store setting */ 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cmee_enabled = (BOOLEAN) int_arg; 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send OK */ 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* don't call callback */ 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 125783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_LOCAL_EVT_BIA: 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* don't call callback */ 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bia_masked_out = p_scb->bia_masked_out; 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Parse the indicator mask */ 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0, ind_id = 1; (val.str[i] != 0) && (ind_id <= 20); i++, ind_id++) 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (val.str[i] == ',') 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project continue; 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (val.str[i] == '0') 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bia_masked_out |= ((UINT32)1 << ind_id); 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (val.str[i] == '1') 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bia_masked_out &= ~((UINT32)1 << ind_id); 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i++; 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (val.str[i] != 0) && (val.str[i] != ',') ) 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (val.str[i] == 0) 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->bia_masked_out = bia_masked_out; 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok (p_scb); 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error (p_scb, BTA_AG_ERR_INVALID_INDEX); 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 128983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_CNUM_EVT: 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 129183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach 129283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_CLCC_EVT: 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!(p_scb->features & BTA_AG_FEAT_ECS)) 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 130183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_BAC_EVT: 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store available codecs from the peer */ 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if((p_scb->peer_features & BTA_AG_PEER_FEAT_CODEC) && (p_scb->features & BTA_AG_FEAT_CODEC)) 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_codecs = bta_ag_parse_bac(p_scb, p_arg); 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_updated = TRUE; 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->peer_codecs & BTA_AG_CODEC_MSBC) 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_codec = UUID_CODEC_MSBC; 1313e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Received AT+BAC, updating sco codec to MSBC"); 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_codec = UUID_CODEC_CVSD; 1318e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Received AT+BAC, updating sco codec to CVSD"); 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 132066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* The above logic sets the stack preferred codec based on local and peer codec 132166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie capabilities. This can be overridden by the application depending on its preference 132266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie using the bta_ag_setcodec API. We send the peer_codecs to the application. */ 132366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie val.num = p_scb->peer_codecs; 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Received BAC while in codec negotiation. */ 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_ag_cb.sco.state == BTA_AG_SCO_CODEC_ST) && (bta_ag_cb.sco.p_curr_scb == p_scb)) 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_codec_negotiate (p_scb); 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 133265e9c8251cd9f70153861aabe09f8767b82ce434Satish Kodishala p_scb->peer_codecs = BTA_AG_CODEC_CVSD; 1333e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Unexpected CMD:AT+BAC, Codec Negotiation is not supported"); 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 133783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_AT_BCS_EVT: 133866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie bta_ag_send_ok(p_scb); 133978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(p_scb->codec_negotiation_timer); 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(int_arg) 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UUID_CODEC_CVSD: codec_type = BTA_AG_CODEC_CVSD; break; 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UUID_CODEC_MSBC: codec_type = BTA_AG_CODEC_MSBC; break; 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1346e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Unknown codec_uuid %d", int_arg); 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project codec_type = 0xFFFF; 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->codec_fallback) 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project codec_sent = BTA_AG_CODEC_CVSD; 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project codec_sent = p_scb->sco_codec; 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(codec_type == codec_sent) 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_codec_nego(p_scb, TRUE); 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_codec_nego(p_scb, FALSE); 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 136166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* send final codec info to callback */ 136266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie val.num = codec_sent; 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 136583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach case BTA_AG_LOCAL_EVT_BCC: 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_open(p_scb, NULL); 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 13720856d9c0a662d78ab0f68e6e0df1721ab43dbb45Sunny Kapdi bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call callback */ 13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event != 0) 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_ag_cb.p_cback)(event, (tBTA_AG *) &val); 13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_at_err_cback 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description AT command parser error callback. 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_err_cback(tBTA_AG_SCB *p_scb, BOOLEAN unknown, char *p_arg) 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_VAL val; 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(unknown && (!strlen(p_arg))) 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1399e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Empty AT cmd string received"); 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if unknown AT command and configured to pass these to app */ 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (unknown && (p_scb->features & BTA_AG_FEAT_UNAT)) 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.hdr.handle = bta_ag_scb_to_idx(p_scb); 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.hdr.app_id = p_scb->app_id; 1409e5bed64926d6ae45501617052f90932287da135bMudumba Ananth val.hdr.status = BTA_AG_SUCCESS; 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.num = 0; 141166209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach strlcpy(val.str, p_arg, BTA_AG_AT_MAX_LEN); 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_ag_cb.p_cback)(BTA_AG_AT_UNAT_EVT, (tBTA_AG *) &val); 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_hsp_result 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle API result for HSP connections. 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_hsp_result(tBTA_AG_SCB *p_scb, tBTA_AG_API_RESULT *p_result) 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1432e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_hsp_result : res = %d", p_result->result); 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(p_result->result) 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SPK_RES: 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_MIC_RES: 143883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, p_result->result, NULL, p_result->data.num); 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_IN_CALL_RES: 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell sys to stop av if any */ 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if sco already opened or no inband ring send ring now */ 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_sco_is_open(p_scb) || !bta_ag_inband_enabled(p_scb) || 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->features & BTA_AG_FEAT_NOSCO)) 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ring(p_scb, (tBTA_AG_DATA *) p_result); 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else open sco, send ring after sco opened */ 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HSPv1.2: AG shall not send RING if using in-band ring tone. */ 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->hsp_version >= HSP_VERSION_1_2) 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->post_sco = BTA_AG_POST_SCO_NONE; 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->post_sco = BTA_AG_POST_SCO_RING; 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result); 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_IN_CALL_CONN_RES: 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_OUT_CALL_ORIG_RES: 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if incoming call connected stop ring timer */ 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->result == BTA_AG_IN_CALL_CONN_RES) 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 146978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(p_scb->ring_timer); 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_scb->features & BTA_AG_FEAT_NOSCO)) 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if audio connected to this scb open sco */ 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb)) 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result); 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else if no audio at call close sco */ 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE) 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result); 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_END_CALL_RES: 148878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(p_scb->ring_timer); 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco */ 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_ag_sco_is_open(p_scb) || bta_ag_sco_is_opening(p_scb)) && !(p_scb->features & BTA_AG_FEAT_NOSCO)) 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result); 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if av got suspended by this call, let it resume. */ 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_unuse(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_INBAND_RING_RES: 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->inband_enabled = p_result->data.state; 1504e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("inband_enabled set to %d", p_scb->inband_enabled); 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_UNAT_RES: 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.ok_flag != BTA_AG_OK_ERROR) 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.str[0] != 0) 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 151283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, p_result->result, p_result->data.str, 0); 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.ok_flag == BTA_AG_OK_DONE) 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR); 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ignore all others */ 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_hfp_result 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle API result for HFP connections. 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_hfp_result(tBTA_AG_SCB *p_scb, tBTA_AG_API_RESULT *p_result) 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1542e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_hfp_result : res = %d", p_result->result); 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(p_result->result) 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SPK_RES: 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_MIC_RES: 154883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, p_result->result, NULL, p_result->data.num); 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_IN_CALL_RES: 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell sys to stop av if any */ 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store caller id string. 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * append type info at the end. 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * make sure a valid type info is passed. 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * otherwise add 129 as default type */ 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_result->data.num < BTA_AG_CLIP_TYPE_MIN) || (p_result->data.num > BTA_AG_CLIP_TYPE_MAX)) 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.num != BTA_AG_CLIP_TYPE_VOIP) 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_result->data.num = BTA_AG_CLIP_TYPE_DEFAULT; 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1565e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("CLIP type :%d", p_result->data.num); 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->clip[0] = 0; 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.str[0] != 0) 1568549c64d1eb96f8096915a39c2a3447190c851bceMiao Chou snprintf(p_scb->clip, sizeof(p_scb->clip), "%s,%d", p_result->data.str, p_result->data.num); 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send callsetup indicator */ 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->post_sco == BTA_AG_POST_SCO_CALL_END) 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Need to sent 2 callsetup IND's(Call End and Incoming call) after SCO close. */ 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->post_sco = BTA_AG_POST_SCO_CALL_END_INCALL; 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_call_inds(p_scb, p_result->result); 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if sco already opened or no inband ring send ring now */ 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_sco_is_open(p_scb) || !bta_ag_inband_enabled(p_scb) || 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->features & BTA_AG_FEAT_NOSCO)) 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ring(p_scb, (tBTA_AG_DATA *) p_result); 15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else open sco, send ring after sco opened */ 15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->post_sco = BTA_AG_POST_SCO_RING; 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result); 15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_IN_CALL_CONN_RES: 159678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(p_scb->ring_timer); 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15987b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB /* if sco not opened and we need to open it, send indicators first 15997b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB ** then open sco. 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 16017b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB bta_ag_send_call_inds(p_scb, p_result->result); 16027b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB 16037b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB if (!(p_scb->features & BTA_AG_FEAT_NOSCO)) 16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16057b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb)) 16067b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB { 16077b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result); 16087b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB } 16097b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB else if ((p_result->data.audio_handle == BTA_AG_HANDLE_NONE) && 16107b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB bta_ag_sco_is_open(p_scb)) 16117b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB { 16127b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result); 16137b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB } 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_IN_CALL_HELD_RES: 161878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(p_scb->ring_timer); 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_call_inds(p_scb, p_result->result); 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_OUT_CALL_ORIG_RES: 16252d0d790ca98b6c46be085e1e0a3e6d16ebd8cddfMallikarjuna GB bta_ag_send_call_inds(p_scb, p_result->result); 16262d0d790ca98b6c46be085e1e0a3e6d16ebd8cddfMallikarjuna GB if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb) && 16272d0d790ca98b6c46be085e1e0a3e6d16ebd8cddfMallikarjuna GB !(p_scb->features & BTA_AG_FEAT_NOSCO)) 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16292d0d790ca98b6c46be085e1e0a3e6d16ebd8cddfMallikarjuna GB bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result); 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_OUT_CALL_ALERT_RES: 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send indicators */ 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_call_inds(p_scb, p_result->result); 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb) && 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !(p_scb->features & BTA_AG_FEAT_NOSCO)) 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result); 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1643d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB case BTA_AG_MULTI_CALL_RES: 1644d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB /* open SCO at SLC for this three way call */ 1645d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB APPL_TRACE_DEBUG("Headset Connected in three way call"); 1646d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB if (!(p_scb->features & BTA_AG_FEAT_NOSCO)) 1647d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB { 1648d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb)) 1649d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result); 1650d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB else if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE) 1651d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result); 1652d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB } 1653d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB break; 1654d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_OUT_CALL_CONN_RES: 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send indicators */ 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_call_inds(p_scb, p_result->result); 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open or close sco */ 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_scb->features & BTA_AG_FEAT_NOSCO)) 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb)) 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result); 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE) 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result); 16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_CALL_CANCEL_RES: 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send indicators */ 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_call_inds(p_scb, p_result->result); 16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_END_CALL_RES: 167978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(p_scb->ring_timer); 16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if sco open, close sco then send indicator values */ 16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_ag_sco_is_open(p_scb) || bta_ag_sco_is_opening(p_scb)) && !(p_scb->features & BTA_AG_FEAT_NOSCO)) 16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->post_sco = BTA_AG_POST_SCO_CALL_END; 16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result); 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_scb->post_sco == BTA_AG_POST_SCO_CALL_END_INCALL) 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco closing for outgoing call because of incoming call */ 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send only callsetup end indicator after sco close */ 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->post_sco = BTA_AG_POST_SCO_CALL_END; 16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_call_inds(p_scb, p_result->result); 16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if av got suspended by this call, let it resume. */ 16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_unuse(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_INBAND_RING_RES: 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->inband_enabled = p_result->data.state; 1704e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("inband_enabled set to %d", p_scb->inband_enabled); 170583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, p_result->result, NULL, p_result->data.state); 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_CIND_RES: 17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store local values */ 17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->call_ind = p_result->data.str[0] - '0'; 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->callsetup_ind = p_result->data.str[2] - '0'; 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->service_ind = p_result->data.str[4] - '0'; 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->signal_ind = p_result->data.str[6] - '0'; 17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->roam_ind = p_result->data.str[8] - '0'; 17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->battchg_ind = p_result->data.str[10] - '0'; 1716a7ce13feaa2a84ff329f2bbd4ab964f0f6d54f0aMallikarjuna GB p_scb->callheld_ind = p_result->data.str[12] - '0'; 1717e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("cind call:%d callsetup:%d", p_scb->call_ind, p_scb->callsetup_ind); 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 171983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, p_result->result, p_result->data.str, 0); 17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_BINP_RES: 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_CNUM_RES: 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_CLCC_RES: 17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_COPS_RES: 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.ok_flag != BTA_AG_OK_ERROR) 17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.str[0] != 0) 17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 173183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, p_result->result, p_result->data.str, 0); 17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.ok_flag == BTA_AG_OK_DONE) 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, p_result->data.errcode); 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_UNAT_RES: 17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.ok_flag != BTA_AG_OK_ERROR) 17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.str[0] != 0) 17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_process_unat_res(p_result->data.str); 1750e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("BTA_AG_RES :%s",p_result->data.str); 175183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, p_result->result, p_result->data.str, 0); 17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.ok_flag == BTA_AG_OK_DONE) 17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, p_result->data.errcode); 17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_CALL_WAIT_RES: 17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->ccwa_enabled) 17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 176683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, p_result->result, p_result->data.str, 0); 17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_call_inds(p_scb, p_result->result); 17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_IND_RES: 17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ind(p_scb, p_result->data.ind.id, p_result->data.ind.value, FALSE); 17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_BVRA_RES: 177683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, p_result->result, NULL, p_result->data.state); 17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_BTRH_RES: 17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.ok_flag != BTA_AG_OK_ERROR) 17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Don't respond to read if not in response & hold state */ 17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.num != BTA_AG_BTRH_NO_RESP) 17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 178583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, p_result->result, NULL, p_result->data.num); 17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* In case of a response to a read request we need to send OK */ 17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.ok_flag == BTA_AG_OK_DONE) 17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, p_result->data.errcode); 17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1798e5bed64926d6ae45501617052f90932287da135bMudumba Ananth case BTA_AG_BIND_RES: 1799e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 1800e5bed64926d6ae45501617052f90932287da135bMudumba Ananth /* Find whether ind_id is supported by local device or not */ 1801e5bed64926d6ae45501617052f90932287da135bMudumba Ananth int local_index = bta_ag_find_hf_ind_by_id(p_scb->local_hf_indicators, 1802e5bed64926d6ae45501617052f90932287da135bMudumba Ananth BTA_AG_MAX_NUM_LOCAL_HF_IND, p_result->data.ind.id); 1803e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (local_index == -1) 1804e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 1805e5bed64926d6ae45501617052f90932287da135bMudumba Ananth APPL_TRACE_WARNING("%s Invalid HF Indicator ID %d", __func__, 1806e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p_result->data.ind.id); 1807e5bed64926d6ae45501617052f90932287da135bMudumba Ananth return; 1808e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 1809e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 1810e5bed64926d6ae45501617052f90932287da135bMudumba Ananth /* Find whether ind_id is supported by peer device or not */ 1811e5bed64926d6ae45501617052f90932287da135bMudumba Ananth int peer_index = bta_ag_find_hf_ind_by_id(p_scb->peer_hf_indicators, 1812e5bed64926d6ae45501617052f90932287da135bMudumba Ananth BTA_AG_MAX_NUM_PEER_HF_IND, p_result->data.ind.id); 1813e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (peer_index == -1) 1814e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 1815e5bed64926d6ae45501617052f90932287da135bMudumba Ananth APPL_TRACE_WARNING("%s Invalid HF Indicator ID %d", __func__, 1816e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p_result->data.ind.id); 1817e5bed64926d6ae45501617052f90932287da135bMudumba Ananth return; 1818e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } else { 1819e5bed64926d6ae45501617052f90932287da135bMudumba Ananth /* If the current state is different from the one upper layer request 1820e5bed64926d6ae45501617052f90932287da135bMudumba Ananth change current state and send out the result */ 1821e5bed64926d6ae45501617052f90932287da135bMudumba Ananth if (p_scb->local_hf_indicators[local_index].is_enable != p_result->data.ind.on_demand) 1822e5bed64926d6ae45501617052f90932287da135bMudumba Ananth { 1823e5bed64926d6ae45501617052f90932287da135bMudumba Ananth char buffer[BTA_AG_AT_MAX_LEN] = {0}; 1824e5bed64926d6ae45501617052f90932287da135bMudumba Ananth char *p = buffer; 1825e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 1826e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p_scb->local_hf_indicators[local_index].is_enable = p_result->data.ind.on_demand; 1827e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p += utl_itoa(p_result->data.ind.id, p); 1828e5bed64926d6ae45501617052f90932287da135bMudumba Ananth *p++ = ','; 1829e5bed64926d6ae45501617052f90932287da135bMudumba Ananth p += utl_itoa(p_scb->local_hf_indicators[local_index].is_enable, p); 1830e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 183183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, p_result->result, buffer, 0); 1832e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } else { 1833e5bed64926d6ae45501617052f90932287da135bMudumba Ananth APPL_TRACE_DEBUG("%s HF Indicator %d already %s", p_result->data.ind.id, 1834e5bed64926d6ae45501617052f90932287da135bMudumba Ananth (p_result->data.ind.on_demand == true) ? "Enabled" : "Disabled"); 1835e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 1836e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 1837e5bed64926d6ae45501617052f90932287da135bMudumba Ananth break; 1838e5bed64926d6ae45501617052f90932287da135bMudumba Ananth } 1839e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 1840e5bed64926d6ae45501617052f90932287da135bMudumba Ananth default: 18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_result 18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle API result. 18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_result(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->conn_service == BTA_AG_HSP) 18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_hsp_result(p_scb, &p_data->api_result); 18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_hfp_result(p_scb, &p_data->api_result); 18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_send_bcs 18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send +BCS AT command to peer. 18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_send_bcs(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 codec_uuid; 18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->codec_fallback) 18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project codec_uuid = UUID_CODEC_CVSD; 18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(p_scb->sco_codec) 18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_CODEC_NONE: codec_uuid = UUID_CODEC_CVSD; break; 18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_CODEC_CVSD: codec_uuid = UUID_CODEC_CVSD; break; 18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_CODEC_MSBC: codec_uuid = UUID_CODEC_MSBC; break; 18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1893e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_ag_send_bcs: unknown codec %d, use CVSD", p_scb->sco_codec); 18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project codec_uuid = UUID_CODEC_CVSD; 18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send +BCS */ 190066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie APPL_TRACE_DEBUG("send +BCS codec is %d", codec_uuid); 190183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_BCS, NULL, codec_uuid); 19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_send_ring 19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send RING result code to peer. 19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_send_ring(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19185cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 19195cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send RING */ 192183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_RING, NULL, 0); 19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if HFP and clip enabled and clip data send CLIP */ 19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->conn_service == BTA_AG_HFP && p_scb->clip_enabled && p_scb->clip[0] != 0) 19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 192683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_CLIP, p_scb->clip, 0); 19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 192978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov bta_sys_start_timer(p_scb->ring_timer, BTA_AG_RING_TIMEOUT_MS, 193078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTA_AG_RING_TIMEOUT_EVT, bta_ag_scb_to_idx(p_scb)); 19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1932