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