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 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains functions for processing AT commands and results. 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 24ffa5c93d455f33af1be3b04d39520413dc24afd5Zhihai Xu#include "bt_target.h" 25ffa5c93d455f33af1be3b04d39520413dc24afd5Zhihai Xu#include "bt_types.h" 26ffa5c93d455f33af1be3b04d39520413dc24afd5Zhihai Xu#include "gki.h" 27ffa5c93d455f33af1be3b04d39520413dc24afd5Zhihai Xu#include "bd.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_api.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_int.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_at.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_api.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "utl.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 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 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* ring timeout */ 432154e12efeec88780933d47b3c3686ff9f6fe84dZhihai Xu#define BTA_AG_RING_TOUT 5000 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 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* clip type constants */ 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CLIP_TYPE_MIN 128 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CLIP_TYPE_MAX 175 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CLIP_TYPE_DEFAULT 129 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CLIP_TYPE_VOIP 255 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AG_MULTI_RESULT_INCLUDED) && (BTA_AG_MULTI_RESULT_INCLUDED == TRUE) 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_AT_MULTI_LEN 2 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define AT_SET_RES_CB(res_cb, c, p, i) {res_cb.code = c; res_cb.p_arg = p; res_cb.int_arg = i;} 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* type for AT result code block */ 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 code; 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p_arg; 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT16 int_arg; 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTA_AG_RESULT_CB; 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* type for multiple AT result codes block */ 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_result; 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_RESULT_CB res_cb[BTA_AG_AT_MULTI_LEN]; 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTA_AG_MULTI_RESULT_CB; 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* enumeration of HSP AT commands matches HSP command interpreter table */ 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HS_CMD_CKPD, 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HS_CMD_VGS, 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HS_CMD_VGM 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* enumeration of HFP AT commands matches HFP command interpreter table */ 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_A, 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_D, 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_VGS, 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_VGM, 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_CCWA, 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_CHLD, 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_CHUP, 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_CIND, 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_CLIP, 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_CMER, 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_VTS, 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_BINP, 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_BLDN, 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_BVRA, 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_BRSF, 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_NREC, 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_CNUM, 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_BTRH, 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_CLCC, 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_COPS, 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_CMEE, 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_BIA, 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_CBC, 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_BCC, 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_BCS, 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_HF_CMD_BAC 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT command interpreter table for HSP */ 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_AT_CMD bta_ag_hsp_cmd[] = 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CKPD", BTA_AG_AT_SET, BTA_AG_AT_INT, 200, 200}, 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+VGS", BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 15}, 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+VGM", BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 15}, 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"", BTA_AG_AT_NONE, BTA_AG_AT_STR, 0, 0} 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT command interpreter table for HFP */ 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_AT_CMD bta_ag_hfp_cmd[] = 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"A", BTA_AG_AT_NONE, BTA_AG_AT_STR, 0, 0}, 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"D", (BTA_AG_AT_NONE | BTA_AG_AT_FREE), BTA_AG_AT_STR, 0, 0}, 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+VGS", BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 15}, 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+VGM", BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 15}, 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CCWA", BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 1}, 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Consider CHLD as str to take care of indexes for ECC */ 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CHLD", (BTA_AG_AT_SET | BTA_AG_AT_TEST), BTA_AG_AT_STR, 0, 4}, 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CHUP", BTA_AG_AT_NONE, BTA_AG_AT_STR, 0, 0}, 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CIND", (BTA_AG_AT_READ | BTA_AG_AT_TEST), BTA_AG_AT_STR, 0, 0}, 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CLIP", BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 1}, 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CMER", BTA_AG_AT_SET, BTA_AG_AT_STR, 0, 0}, 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+VTS", BTA_AG_AT_SET, BTA_AG_AT_STR, 0, 0}, 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+BINP", BTA_AG_AT_SET, BTA_AG_AT_INT, 1, 1}, 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+BLDN", BTA_AG_AT_NONE, BTA_AG_AT_STR, 0, 0}, 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+BVRA", BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 1}, 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+BRSF", BTA_AG_AT_SET, BTA_AG_AT_INT, 0, BTA_AG_CMD_MAX_VAL}, 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+NREC", BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 0}, 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CNUM", BTA_AG_AT_NONE, BTA_AG_AT_STR, 0, 0}, 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+BTRH", (BTA_AG_AT_READ | BTA_AG_AT_SET), BTA_AG_AT_INT, 0, 2}, 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CLCC", BTA_AG_AT_NONE, BTA_AG_AT_STR, 0, 0}, 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+COPS", (BTA_AG_AT_READ | BTA_AG_AT_SET), BTA_AG_AT_STR, 0, 0}, 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CMEE", BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 1}, 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+BIA", BTA_AG_AT_SET, BTA_AG_AT_STR, 0, 20}, 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CBC", BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 100}, 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+BCC", BTA_AG_AT_NONE, BTA_AG_AT_STR, 0, 0}, 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+BCS", BTA_AG_AT_SET, BTA_AG_AT_INT, 0, BTA_AG_CMD_MAX_VAL}, 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+BAC", BTA_AG_AT_SET, BTA_AG_AT_STR, 0, 0}, 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"", BTA_AG_AT_NONE, BTA_AG_AT_STR, 0, 0} 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT result code table element */ 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const char *p_res; /* AT result string */ 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 fmt; /* whether argument is int or string */ 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTA_AG_RESULT; 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT result code argument types */ 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_FMT_NONE, /* no argument */ 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_FMT_INT, /* integer argument */ 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_FMT_STR /* string argument */ 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* enumeration of AT result codes, matches constant table */ 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_OK, 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_ERROR, 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_RING, 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_VGS, 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_VGM, 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_CCWA, 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_CHLD, 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_CIND, 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_CLIP, 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_CIEV, 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_BINP, 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_BVRA, 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_BRSF, 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_BSIR, 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_CNUM, 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_BTRH, 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_CLCC, 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_COPS, 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_CMEE, 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_BCS, 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_UNAT 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_HSP_RESULT_REPLACE_COLON) && (BTA_HSP_RESULT_REPLACE_COLON == TRUE) 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define COLON_IDX_4_VGSVGM 4 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT result code constant table (Indexed by result code) */ 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_RESULT bta_ag_result_tbl[] = 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"OK", BTA_AG_RES_FMT_NONE}, 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"ERROR", BTA_AG_RES_FMT_NONE}, 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"RING", BTA_AG_RES_FMT_NONE}, 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+VGS: ", BTA_AG_RES_FMT_INT}, 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+VGM: ", BTA_AG_RES_FMT_INT}, 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CCWA: ", BTA_AG_RES_FMT_STR}, 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CHLD: ", BTA_AG_RES_FMT_STR}, 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CIND: ", BTA_AG_RES_FMT_STR}, 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CLIP: ", BTA_AG_RES_FMT_STR}, 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CIEV: ", BTA_AG_RES_FMT_STR}, 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+BINP: ", BTA_AG_RES_FMT_STR}, 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+BVRA: ", BTA_AG_RES_FMT_INT}, 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+BRSF: ", BTA_AG_RES_FMT_INT}, 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+BSIR: ", BTA_AG_RES_FMT_INT}, 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CNUM: ", BTA_AG_RES_FMT_STR}, 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+BTRH: ", BTA_AG_RES_FMT_INT}, 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CLCC: ", BTA_AG_RES_FMT_STR}, 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+COPS: ", BTA_AG_RES_FMT_STR}, 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+CME ERROR: ", BTA_AG_RES_FMT_INT}, 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"+BCS: ", BTA_AG_RES_FMT_INT}, 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project {"", BTA_AG_RES_FMT_STR} 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_AT_CMD *bta_ag_at_tbl[BTA_AG_NUM_IDX] = 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_hsp_cmd, 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_hfp_cmd 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* callback event lookup table for HSP */ 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_EVT bta_ag_hsp_cb_evt[] = 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_CKPD_EVT, /* BTA_AG_HS_CMD_CKPD */ 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SPK_EVT, /* BTA_AG_HS_CMD_VGS */ 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_MIC_EVT /* BTA_AG_HS_CMD_VGM */ 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* callback event lookup table for HFP (Indexed by command) */ 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_EVT bta_ag_hfp_cb_evt[] = 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_A_EVT, /* BTA_AG_HF_CMD_A */ 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_D_EVT, /* BTA_AG_HF_CMD_D */ 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SPK_EVT, /* BTA_AG_HF_CMD_VGS */ 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_MIC_EVT, /* BTA_AG_HF_CMD_VGM */ 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_HF_CMD_CCWA */ 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_CHLD_EVT, /* BTA_AG_HF_CMD_CHLD */ 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_CHUP_EVT, /* BTA_AG_HF_CMD_CHUP */ 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_CIND_EVT, /* BTA_AG_HF_CMD_CIND */ 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_HF_CMD_CLIP */ 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_HF_CMD_CMER */ 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_VTS_EVT, /* BTA_AG_HF_CMD_VTS */ 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_BINP_EVT, /* BTA_AG_HF_CMD_BINP */ 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_BLDN_EVT, /* BTA_AG_HF_CMD_BLDN */ 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_BVRA_EVT, /* BTA_AG_HF_CMD_BVRA */ 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_HF_CMD_BRSF */ 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_NREC_EVT, /* BTA_AG_HF_CMD_NREC */ 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_CNUM_EVT, /* BTA_AG_HF_CMD_CNUM */ 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_BTRH_EVT, /* BTA_AG_HF_CMD_BTRH */ 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_CLCC_EVT, /* BTA_AG_HF_CMD_CLCC */ 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_COPS_EVT, /* BTA_AG_HF_CMD_COPS */ 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_HF_CMD_CMEE */ 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_HF_CMD_BIA */ 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_CBC_EVT, /* BTA_AG_HF_CMD_CBC */ 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_HF_CMD_BCC */ 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_BCS_EVT, /* BTA_AG_HF_CMD_BCS */ 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_AT_BAC_EVT /* BTA_AG_HF_CMD_BAC */ 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* translation of API result code values to internal values */ 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 bta_ag_trans_result[] = 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_VGS, /* BTA_AG_SPK_RES */ 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_VGM, /* BTA_AG_MIC_RES */ 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_BSIR, /* BTA_AG_INBAND_RING_RES */ 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_CIND, /* BTA_AG_CIND_RES */ 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_BINP, /* BTA_AG_BINP_RES */ 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_CIEV, /* BTA_AG_IND_RES */ 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_BVRA, /* BTA_AG_BVRA_RES */ 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_CNUM, /* BTA_AG_CNUM_RES */ 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_BTRH, /* BTA_AG_BTRH_RES */ 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_CLCC, /* BTA_AG_CLCC_RES */ 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_COPS, /* BTA_AG_COPS_RES */ 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_IN_CALL_RES */ 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_IN_CALL_CONN_RES */ 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_CCWA, /* BTA_AG_CALL_WAIT_RES */ 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_OUT_CALL_ORIG_RES */ 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_OUT_CALL_ALERT_RES */ 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_OUT_CALL_CONN_RES */ 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_CALL_CANCEL_RES */ 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_END_CALL_RES */ 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_IN_CALL_HELD_RES */ 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_RES_UNAT /* BTA_AG_UNAT_RES */ 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* callsetup indicator value lookup table */ 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 bta_ag_callsetup_ind_tbl[] = 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_SPK_RES */ 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_MIC_RES */ 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_INBAND_RING_RES */ 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_CIND_RES */ 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_BINP_RES */ 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_IND_RES */ 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_BVRA_RES */ 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_CNUM_RES */ 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_BTRH_RES */ 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_CLCC_RES */ 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* BTA_AG_COPS_RES */ 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_CALLSETUP_INCOMING, /* BTA_AG_IN_CALL_RES */ 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_CALLSETUP_NONE, /* BTA_AG_IN_CALL_CONN_RES */ 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_CALLSETUP_INCOMING, /* BTA_AG_CALL_WAIT_RES */ 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_CALLSETUP_OUTGOING, /* BTA_AG_OUT_CALL_ORIG_RES */ 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_CALLSETUP_ALERTING, /* BTA_AG_OUT_CALL_ALERT_RES */ 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_CALLSETUP_NONE, /* BTA_AG_OUT_CALL_CONN_RES */ 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_CALLSETUP_NONE, /* BTA_AG_CALL_CANCEL_RES */ 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_CALLSETUP_NONE, /* BTA_AG_END_CALL_RES */ 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_CALLSETUP_NONE /* BTA_AG_IN_CALL_HELD_RES */ 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_send_result 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an AT result code. 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_send_result(tBTA_AG_SCB *p_scb, UINT8 code, char *p_arg, 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT16 int_arg) 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char buf[BTA_AG_AT_MAX_LEN + 16]; 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p = buf; 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len; 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE) 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(buf, NULL, sizeof(buf)); 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* init with \r\n */ 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = '\r'; 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = '\n'; 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* copy result code string */ 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRCPY_S(p, sizeof(buf), bta_ag_result_tbl[code].p_res); 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_HSP_RESULT_REPLACE_COLON) && (BTA_HSP_RESULT_REPLACE_COLON == TRUE) 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->conn_service == BTA_AG_HSP) 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If HSP then ":"symbol should be changed as "=" for HSP compatibility */ 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(code) 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_RES_VGS: 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_RES_VGM: 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(*(p+COLON_IDX_4_VGSVGM) == ':') 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE) 359e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("[HSP] ':'symbol is changed as '=' for HSP compatibility"); 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #endif 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *(p+COLON_IDX_4_VGSVGM) = '='; 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += strlen(bta_ag_result_tbl[code].p_res); 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* copy argument if any */ 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_result_tbl[code].fmt == BTA_AG_RES_FMT_INT) 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += utl_itoa((UINT16) int_arg, p); 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (bta_ag_result_tbl[code].fmt == BTA_AG_RES_FMT_STR) 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRCPY_S(p, sizeof(buf), p_arg); 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += strlen(p_arg); 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* finish with \r\n */ 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = '\r'; 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = '\n'; 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE) 385e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_send_result: %s", buf); 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send to RFCOMM */ 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project PORT_WriteData(p_scb->conn_handle, buf, (UINT16) (p - buf), &len); 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AG_MULTI_RESULT_INCLUDED) && (BTA_AG_MULTI_RESULT_INCLUDED == TRUE) 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_send_multi_result 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send multiple AT result codes. 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_send_multi_result(tBTA_AG_SCB *p_scb, tBTA_AG_MULTI_RESULT_CB *m_res_cb) 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char buf[BTA_AG_AT_MAX_LEN * BTA_AG_AT_MULTI_LEN + 16]; 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p = buf; 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len; 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 res_idx = 0; 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if((!m_res_cb) || (m_res_cb->num_result == 0) || (m_res_cb->num_result > BTA_AG_AT_MULTI_LEN)) 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 412e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("m_res_cb is NULL or num_result is out of range."); 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE) 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(buf, NULL, sizeof(buf)); 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while(res_idx < m_res_cb->num_result) 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* init with \r\n */ 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = '\r'; 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = '\n'; 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* copy result code string */ 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRCPY_S(p, sizeof(buf), bta_ag_result_tbl[m_res_cb->res_cb[res_idx].code].p_res); 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += strlen(bta_ag_result_tbl[m_res_cb->res_cb[res_idx].code].p_res); 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* copy argument if any */ 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_result_tbl[m_res_cb->res_cb[res_idx].code].fmt == BTA_AG_RES_FMT_INT) 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += utl_itoa((UINT16) m_res_cb->res_cb[res_idx].int_arg, p); 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (bta_ag_result_tbl[m_res_cb->res_cb[res_idx].code].fmt == BTA_AG_RES_FMT_STR) 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRCPY_S(p, sizeof(buf), m_res_cb->res_cb[res_idx].p_arg); 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += strlen(m_res_cb->res_cb[res_idx].p_arg); 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* finish with \r\n */ 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = '\r'; 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = '\n'; 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res_idx++; 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE) 449e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("send_result: %s", buf); 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send to RFCOMM */ 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project PORT_WriteData(p_scb->conn_handle, buf, (UINT16) (p - buf), &len); 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_send_ok 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an OK result code. 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_send_ok(tBTA_AG_SCB *p_scb) 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, BTA_AG_RES_OK, NULL, 0); 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_send_error 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an ERROR result code. 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** errcode - used to send verbose errocode 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_send_error(tBTA_AG_SCB *p_scb, INT16 errcode) 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If HFP and extended audio gateway error codes are enabled */ 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->conn_service == BTA_AG_HFP && p_scb->cmee_enabled) 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, BTA_AG_RES_CMEE, NULL, errcode); 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, BTA_AG_RES_ERROR, NULL, 0); 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_send_ind 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an indicator CIEV result code. 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_send_ind(tBTA_AG_SCB *p_scb, UINT16 id, UINT16 value, BOOLEAN on_demand) 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char str[12]; 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p = str; 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the indicator is masked out, just return */ 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mandatory indicators can not be masked out. */ 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->bia_masked_out & ((UINT32)1 << id)) && 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((id != BTA_AG_IND_CALL) && (id != BTA_AG_IND_CALLSETUP) && (id != BTA_AG_IND_CALLHELD))) 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Ensure we do not send duplicate indicators if not requested by app */ 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If it was requested by app, transmit CIEV even if it is duplicate. */ 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (id == BTA_AG_IND_CALL) 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((value == p_scb->call_ind) && (on_demand == FALSE)) 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->call_ind = (UINT8)value; 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((id == BTA_AG_IND_CALLSETUP) && (on_demand == FALSE)) 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (value == p_scb->callsetup_ind) 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->callsetup_ind = (UINT8)value; 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((id == BTA_AG_IND_SERVICE) && (on_demand == FALSE)) 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (value == p_scb->service_ind) 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->service_ind = (UINT8)value; 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((id == BTA_AG_IND_SIGNAL) && (on_demand == FALSE)) 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (value == p_scb->signal_ind) 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->signal_ind = (UINT8)value; 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((id == BTA_AG_IND_ROAM) && (on_demand == FALSE)) 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (value == p_scb->roam_ind) 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->roam_ind = (UINT8)value; 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((id == BTA_AG_IND_BATTCHG) && (on_demand == FALSE)) 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (value == p_scb->battchg_ind) 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->battchg_ind = (UINT8)value; 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((id == BTA_AG_IND_CALLHELD) && (on_demand == FALSE)) 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call swap could result in sending callheld=1 multiple times */ 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((value != 1) && (value == p_scb->callheld_ind)) 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->callheld_ind = (UINT8)value; 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->cmer_enabled) 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += utl_itoa(id, p); 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = ','; 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_itoa(value, p); 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, BTA_AG_RES_CIEV, str, 0); 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_parse_cmer 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Parse AT+CMER parameter string. 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if parsed ok, FALSE otherwise. 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_ag_parse_cmer(char *p_s, BOOLEAN *p_enabled) 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT16 n[4] = {-1, -1, -1, -1}; 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p; 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < 4; i++) 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* skip to comma delimiter */ 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (p = p_s; *p != ',' && *p != 0; p++); 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get integer value */ 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p = 0; 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project n[i] = utl_str2int(p_s); 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_s = p + 1; 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_s == 0) 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* process values */ 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (n[0] < 0 || n[3] < 0) 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 if ((n[0] == 3) && ((n[3] == 1) || (n[3] == 0))) 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_enabled = (BOOLEAN) n[3]; 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_parse_chld 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Parse AT+CHLD parameter string. 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Returns idx (1-7), or 0 if ECC not enabled or idx doesn't exist 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 bta_ag_parse_chld(tBTA_AG_SCB *p_scb, char *p_s) 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 retval = 0; 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT16 idx = -1; 6375cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_scb); 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_s[1] != 0) 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* p_idxstr++; point to beginning of call number */ 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project idx = utl_str2int(&p_s[1]); 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (idx != -1 && idx < 255) 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project retval = (UINT8)idx; 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (retval); 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_parse_bac 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Parse AT+BAC parameter string. 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Returns bitmap of supported codecs. 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_AG_PEER_CODEC bta_ag_parse_bac(tBTA_AG_SCB *p_scb, char *p_s) 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_PEER_CODEC retval = BTA_AG_CODEC_NONE; 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 uuid_codec; 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN cont = FALSE; /* Continue processing */ 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p; 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while(p_s) 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* skip to comma delimiter */ 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(p = p_s; *p != ',' && *p != 0; p++); 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get integre value */ 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (*p != 0) 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p = 0; 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cont = TRUE; 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cont = FALSE; 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_codec = utl_str2int(p_s); 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(uuid_codec) 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UUID_CODEC_CVSD: retval |= BTA_AG_CODEC_CVSD; break; 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UUID_CODEC_MSBC: retval |= BTA_AG_CODEC_MSBC; break; 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 687e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Unknown Codec UUID(%d) received", uuid_codec); 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTA_AG_CODEC_NONE; 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (cont) 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_s = p + 1; 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (retval); 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_process_unat_res 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Process the unat response data and remove extra carriage return 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** and line feed 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_process_unat_res(char *unat_result) 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 str_leng; 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i = 0; 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 j = 0; 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 pairs_of_nl_cr; 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char trim_data[BTA_AG_AT_MAX_LEN]; 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project str_leng = strlen(unat_result); 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If no extra CR and LF, just return */ 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(str_leng < 4) 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Remove the carriage return and left feed */ 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while(unat_result[0] =='\r' && unat_result[1] =='\n' 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && unat_result[str_leng-2] =='\r' && unat_result[str_leng-1] =='\n') 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pairs_of_nl_cr = 1; 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=0;i<(str_leng-4*pairs_of_nl_cr);i++) 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project trim_data[j++] = unat_result[i+pairs_of_nl_cr*2]; 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Add EOF */ 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project trim_data[j] = '\0'; 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project str_leng = str_leng - 4; 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S(unat_result, BTA_AG_AT_MAX_LEN+1, trim_data,str_leng+1); 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i=0; 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project j=0; 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(str_leng <4) 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_inband_enabled 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Determine whether in-band ring can be used. 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_ag_inband_enabled(tBTA_AG_SCB *p_scb) 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if feature is enabled and no other scbs connected */ 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->inband_enabled && !bta_ag_other_scb_open(p_scb)) 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_send_call_inds 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send call and callsetup indicators. 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_send_call_inds(tBTA_AG_SCB *p_scb, tBTA_AG_RES result) 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 call = p_scb->call_ind; 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 callsetup; 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set new call and callsetup values based on BTA_AgResult */ 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project callsetup = bta_ag_callsetup_ind_tbl[result]; 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == BTA_AG_END_CALL_RES) 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project call = BTA_AG_CALL_INACTIVE; 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (result == BTA_AG_IN_CALL_CONN_RES || result == BTA_AG_OUT_CALL_CONN_RES 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || result == BTA_AG_IN_CALL_HELD_RES) 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project call = BTA_AG_CALL_ACTIVE; 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project call = p_scb->call_ind; 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send indicator function tracks if the values have actually changed */ 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ind(p_scb, BTA_AG_IND_CALL, call, FALSE); 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ind(p_scb, BTA_AG_IND_CALLSETUP, callsetup, FALSE); 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_at_hsp_cback 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description AT command processing callback for HSP. 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_hsp_cback(tBTA_AG_SCB *p_scb, UINT16 cmd, UINT8 arg_type, 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p_arg, INT16 int_arg) 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_VAL val; 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 829e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type, 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int_arg, p_arg); 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send OK */ 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.hdr.handle = bta_ag_scb_to_idx(p_scb); 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.hdr.app_id = p_scb->app_id; 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.num = (UINT16) int_arg; 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S(val.str, sizeof(val.str), p_arg, BTA_AG_AT_MAX_LEN); 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.str[BTA_AG_AT_MAX_LEN] = 0; 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call callback with event */ 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_ag_cb.p_cback)(bta_ag_hsp_cb_evt[cmd], (tBTA_AG *) &val); 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_at_hfp_cback 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description AT command processing callback for HFP. 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_hfp_cback(tBTA_AG_SCB *p_scb, UINT16 cmd, UINT8 arg_type, 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p_arg, INT16 int_arg) 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_VAL val; 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_EVT event; 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *ag_scb; 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 i, ind_id; 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 bia_masked_out; 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_PEER_CODEC codec_type, codec_sent; 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 867e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("HFP AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type, 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int_arg, p_arg); 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.hdr.handle = bta_ag_scb_to_idx(p_scb); 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.hdr.app_id = p_scb->app_id; 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.num = int_arg; 8732cb90bc58fc075ec2f814ada5ae8f728380566c1Nitin Srivastava bdcpy(val.bd_addr, p_scb->peer_addr); 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S(val.str, sizeof(val.str), p_arg, BTA_AG_AT_MAX_LEN); 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.str[BTA_AG_AT_MAX_LEN] = 0; 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = bta_ag_hfp_cb_evt[cmd]; 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (cmd) 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_A: 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_VGS: 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_VGM: 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_CHUP: 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_CBC: 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send OK */ 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_BLDN: 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Do not send OK, App will send error or OK depending on 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** last dial number enabled or not */ 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_D: 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Do not send OK for Dial cmds 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Let application decide whether to send OK or ERROR*/ 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if mem dial cmd, make sure string contains only digits */ 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_arg[0] == '>') 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!utl_isintstr(p_arg+1)) 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_DSTR); 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_arg[0] == 'V') /* ATDV : Dial VoIP Call */ 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We do not check string. Code will be added later if needed. */ 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!((p_scb->peer_features & BTA_AG_PEER_FEAT_VOIP) && (p_scb->features & BTA_AG_FEAT_VOIP))) 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If dial cmd, make sure string contains only dial digits 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Dial digits are 0-9, A-C, *, #, + */ 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!utl_isdialstr(p_arg)) 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_DSTR); 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_CCWA: 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store setting */ 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->ccwa_enabled = (BOOLEAN) int_arg; 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send OK */ 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_CHLD: 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (arg_type == BTA_AG_AT_TEST) 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* don't call callback */ 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send CHLD string */ 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Form string based on supported 1.5 feature */ 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->peer_version >= HFP_VERSION_1_5) && 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->features & BTA_AG_FEAT_ECC) && 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->peer_features & BTA_AG_PEER_FEAT_ECC)) 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, BTA_AG_RES_CHLD, p_bta_ag_cfg->chld_val_ecc, 0); 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, BTA_AG_RES_CHLD, p_bta_ag_cfg->chld_val, 0); 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send OK */ 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if service level conn. not already open, now it's open */ 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_svc_conn_open(p_scb, NULL); 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.idx = bta_ag_parse_chld(p_scb, val.str); 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(val.idx && !((p_scb->features & BTA_AG_FEAT_ECC) && (p_scb->peer_features & BTA_AG_PEER_FEAT_ECC))) 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we do not support ECC, but HF is sending us a CHLD with call index*/ 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If it is swap between calls, set call held indicator to 3(out of valid 0-2) 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Application will set it back to 1 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** callheld indicator will be sent across to the peer. */ 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(val.str[0] == '2') 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0, ag_scb = &bta_ag_cb.scb[0]; i < BTA_AG_NUM_SCB; i++, ag_scb++) 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ag_scb->in_use) 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if((ag_scb->call_ind == BTA_AG_CALL_ACTIVE) 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (ag_scb->callsetup_ind == BTA_AG_CALLSETUP_NONE)) 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ag_scb->callheld_ind = BTA_AG_CALLHELD_NOACTIVE + 1; 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Do not send OK. Let app decide after parsing the val str */ 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* bta_ag_send_ok(p_scb); */ 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_CIND: 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (arg_type == BTA_AG_AT_TEST) 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* don't call callback */ 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send CIND string, send OK */ 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, BTA_AG_RES_CIND, p_bta_ag_cfg->cind_info, 0); 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_CLIP: 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store setting, send OK */ 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->clip_enabled = (BOOLEAN) int_arg; 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_CMER: 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if parsed ok store setting, send OK */ 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_parse_cmer(p_arg, &p_scb->cmer_enabled)) 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if service level conn. not already open and our features and 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** peer features do not have 3-way, service level conn. now open 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_scb->svc_conn && 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !((p_scb->features & BTA_AG_FEAT_3WAY) && (p_scb->peer_features & BTA_AG_PEER_FEAT_3WAY))) 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_svc_conn_open(p_scb, NULL); 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR); 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_VTS: 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check argument */ 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (strlen(p_arg) == 1) 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR); 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_BINP: 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if feature not set don't call callback, send ERROR */ 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_scb->features & BTA_AG_FEAT_VTAG)) 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_BVRA: 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if feature not supported don't call callback, send ERROR. App will send OK */ 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_scb->features & BTA_AG_FEAT_VREC)) 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_BRSF: 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store peer features */ 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_features = (UINT16) int_arg; 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send BRSF, send OK */ 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, BTA_AG_RES_BRSF, NULL, 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (INT16) (p_scb->features & BTA_AG_BSRF_FEAT_SPEC)); 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_NREC: 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if feature send OK, else don't call callback, send ERROR */ 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->features & BTA_AG_FEAT_ECNR) 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_BTRH: 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if feature send BTRH, send OK:, else don't call callback, send ERROR */ 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->features & BTA_AG_FEAT_BTRH) 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If set command; send response and notify app */ 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (arg_type == BTA_AG_AT_SET) 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0, ag_scb = &bta_ag_cb.scb[0]; i < BTA_AG_NUM_SCB; i++, ag_scb++) 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ag_scb->in_use) 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(ag_scb, BTA_AG_RES_BTRH, NULL, int_arg); 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Read Command */ 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.num = BTA_AG_BTRH_READ; 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_COPS: 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (arg_type == BTA_AG_AT_SET) 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* don't call callback */ 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send OK */ 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_CMEE: 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->features & BTA_AG_FEAT_EXTERR) 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store setting */ 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cmee_enabled = (BOOLEAN) int_arg; 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send OK */ 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* don't call callback */ 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_BIA: 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* don't call callback */ 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bia_masked_out = p_scb->bia_masked_out; 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Parse the indicator mask */ 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0, ind_id = 1; (val.str[i] != 0) && (ind_id <= 20); i++, ind_id++) 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (val.str[i] == ',') 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project continue; 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (val.str[i] == '0') 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bia_masked_out |= ((UINT32)1 << ind_id); 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (val.str[i] == '1') 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bia_masked_out &= ~((UINT32)1 << ind_id); 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i++; 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (val.str[i] != 0) && (val.str[i] != ',') ) 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (val.str[i] == 0) 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->bia_masked_out = bia_masked_out; 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok (p_scb); 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error (p_scb, BTA_AG_ERR_INVALID_INDEX); 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_CNUM: 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_CLCC: 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!(p_scb->features & BTA_AG_FEAT_ECS)) 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = 0; 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_BAC: 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store available codecs from the peer */ 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if((p_scb->peer_features & BTA_AG_PEER_FEAT_CODEC) && (p_scb->features & BTA_AG_FEAT_CODEC)) 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_codecs = bta_ag_parse_bac(p_scb, p_arg); 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_updated = TRUE; 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->peer_codecs & BTA_AG_CODEC_MSBC) 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_codec = UUID_CODEC_MSBC; 1199e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Received AT+BAC, updating sco codec to MSBC"); 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_codec = UUID_CODEC_CVSD; 1204e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Received AT+BAC, updating sco codec to CVSD"); 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 120666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* The above logic sets the stack preferred codec based on local and peer codec 120766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie capabilities. This can be overridden by the application depending on its preference 120866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie using the bta_ag_setcodec API. We send the peer_codecs to the application. */ 120966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie val.num = p_scb->peer_codecs; 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Received BAC while in codec negotiation. */ 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_ag_cb.sco.state == BTA_AG_SCO_CODEC_ST) && (bta_ag_cb.sco.p_curr_scb == p_scb)) 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_codec_negotiate (p_scb); 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_codecs = BTA_AG_CODEC_NONE; 1219e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Unexpected CMD:AT+BAC, Codec Negotiation is not supported"); 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_BCS: 122466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie bta_ag_send_ok(p_scb); 122566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stop cn timer */ 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&p_scb->cn_timer); 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(int_arg) 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UUID_CODEC_CVSD: codec_type = BTA_AG_CODEC_CVSD; break; 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UUID_CODEC_MSBC: codec_type = BTA_AG_CODEC_MSBC; break; 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1234e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Unknown codec_uuid %d", int_arg); 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project codec_type = 0xFFFF; 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->codec_fallback) 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project codec_sent = BTA_AG_CODEC_CVSD; 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project codec_sent = p_scb->sco_codec; 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(codec_type == codec_sent) 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_codec_nego(p_scb, TRUE); 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_codec_nego(p_scb, FALSE); 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 124966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* send final codec info to callback */ 125066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie val.num = codec_sent; 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_HF_CMD_BCC: 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_open(p_scb, NULL); 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 12600856d9c0a662d78ab0f68e6e0df1721ab43dbb45Sunny Kapdi bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call callback */ 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event != 0) 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_ag_cb.p_cback)(event, (tBTA_AG *) &val); 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_at_err_cback 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description AT command parser error callback. 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_err_cback(tBTA_AG_SCB *p_scb, BOOLEAN unknown, char *p_arg) 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_VAL val; 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(unknown && (!strlen(p_arg))) 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1287e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Empty AT cmd string received"); 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if unknown AT command and configured to pass these to app */ 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (unknown && (p_scb->features & BTA_AG_FEAT_UNAT)) 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.hdr.handle = bta_ag_scb_to_idx(p_scb); 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.hdr.app_id = p_scb->app_id; 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.num = 0; 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S(val.str, sizeof(val.str), p_arg, BTA_AG_AT_MAX_LEN); 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project val.str[BTA_AG_AT_MAX_LEN] = 0; 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_ag_cb.p_cback)(BTA_AG_AT_UNAT_EVT, (tBTA_AG *) &val); 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_hsp_result 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle API result for HSP connections. 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_hsp_result(tBTA_AG_SCB *p_scb, tBTA_AG_API_RESULT *p_result) 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 code = bta_ag_trans_result[p_result->result]; 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1322e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_hsp_result : res = %d", p_result->result); 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(p_result->result) 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SPK_RES: 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_MIC_RES: 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, code, NULL, p_result->data.num); 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_IN_CALL_RES: 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell sys to stop av if any */ 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if sco already opened or no inband ring send ring now */ 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_sco_is_open(p_scb) || !bta_ag_inband_enabled(p_scb) || 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->features & BTA_AG_FEAT_NOSCO)) 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ring(p_scb, (tBTA_AG_DATA *) p_result); 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else open sco, send ring after sco opened */ 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HSPv1.2: AG shall not send RING if using in-band ring tone. */ 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->hsp_version >= HSP_VERSION_1_2) 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->post_sco = BTA_AG_POST_SCO_NONE; 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->post_sco = BTA_AG_POST_SCO_RING; 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result); 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_IN_CALL_CONN_RES: 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_OUT_CALL_ORIG_RES: 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if incoming call connected stop ring timer */ 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->result == BTA_AG_IN_CALL_CONN_RES) 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&p_scb->act_timer); 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_scb->features & BTA_AG_FEAT_NOSCO)) 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if audio connected to this scb open sco */ 13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb)) 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result); 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else if no audio at call close sco */ 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE) 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result); 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_END_CALL_RES: 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stop ring timer */ 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&p_scb->act_timer); 13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco */ 13825738f83aeb59361a0a2eda2460113f6dc919427The 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)) 13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result); 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if av got suspended by this call, let it resume. */ 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_unuse(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_INBAND_RING_RES: 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->inband_enabled = p_result->data.state; 1395e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("inband_enabled set to %d", p_scb->inband_enabled); 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_UNAT_RES: 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.ok_flag != BTA_AG_OK_ERROR) 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.str[0] != 0) 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, code, p_result->data.str, 0); 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.ok_flag == BTA_AG_OK_DONE) 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR); 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ignore all others */ 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 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** 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_hfp_result 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle API result for HFP connections. 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_hfp_result(tBTA_AG_SCB *p_scb, tBTA_AG_API_RESULT *p_result) 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 code = bta_ag_trans_result[p_result->result]; 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1435e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_hfp_result : res = %d", p_result->result); 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(p_result->result) 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SPK_RES: 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_MIC_RES: 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, code, NULL, p_result->data.num); 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_IN_CALL_RES: 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell sys to stop av if any */ 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store caller id string. 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * append type info at the end. 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * make sure a valid type info is passed. 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * otherwise add 129 as default type */ 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_result->data.num < BTA_AG_CLIP_TYPE_MIN) || (p_result->data.num > BTA_AG_CLIP_TYPE_MAX)) 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.num != BTA_AG_CLIP_TYPE_VOIP) 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_result->data.num = BTA_AG_CLIP_TYPE_DEFAULT; 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1458e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("CLIP type :%d", p_result->data.num); 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->clip[0] = 0; 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.str[0] != 0) 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sprintf(p_scb->clip,"%s,%d", p_result->data.str, p_result->data.num); 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send callsetup indicator */ 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->post_sco == BTA_AG_POST_SCO_CALL_END) 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Need to sent 2 callsetup IND's(Call End and Incoming call) after SCO close. */ 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->post_sco = BTA_AG_POST_SCO_CALL_END_INCALL; 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_call_inds(p_scb, p_result->result); 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if sco already opened or no inband ring send ring now */ 14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_sco_is_open(p_scb) || !bta_ag_inband_enabled(p_scb) || 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->features & BTA_AG_FEAT_NOSCO)) 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ring(p_scb, (tBTA_AG_DATA *) p_result); 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else open sco, send ring after sco opened */ 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->post_sco = BTA_AG_POST_SCO_RING; 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result); 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_IN_CALL_CONN_RES: 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stop ring timer */ 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&p_scb->act_timer); 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if sco not opened and we need to open it, open sco first 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** then send indicators 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb) && 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !bta_ag_sco_is_open(p_scb) && !(p_scb->features & BTA_AG_FEAT_NOSCO)) 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->post_sco = BTA_AG_POST_SCO_CALL_CONN; 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result); 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else if sco open and we need to close it, close sco first 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** then send indicators 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE && 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_is_open(p_scb) && !(p_scb->features & BTA_AG_FEAT_NOSCO)) 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->post_sco = BTA_AG_POST_SCO_CALL_CONN; 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result); 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else send indicators now */ 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_call_inds(p_scb, p_result->result); 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_IN_CALL_HELD_RES: 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stop ring timer */ 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&p_scb->act_timer); 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_call_inds(p_scb, p_result->result); 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_OUT_CALL_ORIG_RES: 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if sco open and we need to close it, close sco first 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** then send indicators; else send indicators now 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE && 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_is_open(p_scb) && !(p_scb->features & BTA_AG_FEAT_NOSCO)) 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->post_sco = BTA_AG_POST_SCO_CALL_ORIG; 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result); 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_call_inds(p_scb, p_result->result); 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb) && 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !(p_scb->features & BTA_AG_FEAT_NOSCO)) 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result); 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_OUT_CALL_ALERT_RES: 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send indicators */ 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_call_inds(p_scb, p_result->result); 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb) && 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !(p_scb->features & BTA_AG_FEAT_NOSCO)) 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result); 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_OUT_CALL_CONN_RES: 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send indicators */ 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_call_inds(p_scb, p_result->result); 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open or close sco */ 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_scb->features & BTA_AG_FEAT_NOSCO)) 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb)) 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result); 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE) 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result); 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_CALL_CANCEL_RES: 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send indicators */ 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_call_inds(p_scb, p_result->result); 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_END_CALL_RES: 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stop ring timer */ 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&p_scb->act_timer); 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if sco open, close sco then send indicator values */ 15845738f83aeb59361a0a2eda2460113f6dc919427The 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)) 15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->post_sco = BTA_AG_POST_SCO_CALL_END; 15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result); 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_scb->post_sco == BTA_AG_POST_SCO_CALL_END_INCALL) 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco closing for outgoing call because of incoming call */ 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send only callsetup end indicator after sco close */ 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->post_sco = BTA_AG_POST_SCO_CALL_END; 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_call_inds(p_scb, p_result->result); 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if av got suspended by this call, let it resume. */ 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_unuse(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_INBAND_RING_RES: 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->inband_enabled = p_result->data.state; 1606e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("inband_enabled set to %d", p_scb->inband_enabled); 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, code, NULL, p_result->data.state); 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_CIND_RES: 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store local values */ 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->call_ind = p_result->data.str[0] - '0'; 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->callsetup_ind = p_result->data.str[2] - '0'; 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->service_ind = p_result->data.str[4] - '0'; 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->signal_ind = p_result->data.str[6] - '0'; 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->roam_ind = p_result->data.str[8] - '0'; 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->battchg_ind = p_result->data.str[10] - '0'; 1618e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("cind call:%d callsetup:%d", p_scb->call_ind, p_scb->callsetup_ind); 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, code, p_result->data.str, 0); 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_BINP_RES: 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_CNUM_RES: 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_CLCC_RES: 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_COPS_RES: 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.ok_flag != BTA_AG_OK_ERROR) 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.str[0] != 0) 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, code, p_result->data.str, 0); 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.ok_flag == BTA_AG_OK_DONE) 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, p_result->data.errcode); 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_UNAT_RES: 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.ok_flag != BTA_AG_OK_ERROR) 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.str[0] != 0) 16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_process_unat_res(p_result->data.str); 1651e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("BTA_AG_RES :%s",p_result->data.str); 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, code, p_result->data.str, 0); 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.ok_flag == BTA_AG_OK_DONE) 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, p_result->data.errcode); 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_CALL_WAIT_RES: 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->ccwa_enabled) 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, code, p_result->data.str, 0); 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_call_inds(p_scb, p_result->result); 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_IND_RES: 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ind(p_scb, p_result->data.ind.id, p_result->data.ind.value, FALSE); 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_BVRA_RES: 16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, code, NULL, p_result->data.state); 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_BTRH_RES: 16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.ok_flag != BTA_AG_OK_ERROR) 16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Don't respond to read if not in response & hold state */ 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.num != BTA_AG_BTRH_NO_RESP) 16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, code, NULL, p_result->data.num); 16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* In case of a response to a read request we need to send OK */ 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_result->data.ok_flag == BTA_AG_OK_DONE) 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_ok(p_scb); 16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_error(p_scb, p_result->data.errcode); 16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_result 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle API result. 17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_result(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->conn_service == BTA_AG_HSP) 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_hsp_result(p_scb, &p_data->api_result); 17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_hfp_result(p_scb, &p_data->api_result); 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_send_bcs 17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send +BCS AT command to peer. 17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_send_bcs(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 codec_uuid; 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->codec_fallback) 17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project codec_uuid = UUID_CODEC_CVSD; 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(p_scb->sco_codec) 17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_CODEC_NONE: codec_uuid = UUID_CODEC_CVSD; break; 17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_CODEC_CVSD: codec_uuid = UUID_CODEC_CVSD; break; 17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_CODEC_MSBC: codec_uuid = UUID_CODEC_MSBC; break; 17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1753e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_ag_send_bcs: unknown codec %d, use CVSD", p_scb->sco_codec); 17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project codec_uuid = UUID_CODEC_CVSD; 17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send +BCS */ 176066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie APPL_TRACE_DEBUG("send +BCS codec is %d", codec_uuid); 17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, BTA_AG_RES_BCS, NULL, codec_uuid); 17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_send_ring 17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send RING result code to peer. 17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_send_ring(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17785cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 17795cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AG_MULTI_RESULT_INCLUDED) && (BTA_AG_MULTI_RESULT_INCLUDED == TRUE) 17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_MULTI_RESULT_CB m_res_cb; 17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->conn_service == BTA_AG_HFP && p_scb->clip_enabled && p_scb->clip[0] != 0) 17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&m_res_cb, NULL, sizeof(tBTA_AG_MULTI_RESULT_CB)); 17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project m_res_cb.num_result = 2; 17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AT_SET_RES_CB(m_res_cb.res_cb[0], BTA_AG_RES_RING, NULL, 0) 17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AT_SET_RES_CB(m_res_cb.res_cb[1], BTA_AG_RES_CLIP, p_scb->clip, 0) 17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_multi_result(p_scb, &m_res_cb); 17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send RING ONLY */ 17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, BTA_AG_RES_RING, NULL, 0); 17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send RING */ 18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, BTA_AG_RES_RING, NULL, 0); 18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if HFP and clip enabled and clip data send CLIP */ 18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->conn_service == BTA_AG_HFP && p_scb->clip_enabled && p_scb->clip[0] != 0) 18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_result(p_scb, BTA_AG_RES_CLIP, p_scb->clip, 0); 18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* restart ring timer */ 18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_start_timer(&p_scb->act_timer, BTA_AG_RING_TOUT_EVT, BTA_AG_RING_TOUT); 18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1814