16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/******************************************************************************
26ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
36ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  Copyright (C) 2004-2012 Broadcom Corporation
46ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  Licensed under the Apache License, Version 2.0 (the "License");
66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  you may not use this file except in compliance with the License.
76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  You may obtain a copy of the License at:
86ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  http://www.apache.org/licenses/LICENSE-2.0
106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  Unless required by applicable law or agreed to in writing, software
126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  distributed under the License is distributed on an "AS IS" BASIS,
136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  See the License for the specific language governing permissions and
156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  limitations under the License.
166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/
186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/******************************************************************************
206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  This file contains functions for processing AT commands and results.
226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/
24e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_api.h"
26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_sys.h"
27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_ag_api.h"
28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_ag_int.h"
29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_ag_at.h"
30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "port_api.h"
31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "utl.h"
32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <stdio.h>
33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h>
34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*****************************************************************************
36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**  Constants
37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*****************************************************************************/
38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* ring timeout */
40fed66f7b66d29da466e2e67befe3238e7ed8fc6aRavi Nagarajan#define BTA_AG_RING_TOUT        10000
41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define BTA_AG_CMD_MAX_VAL      32767  /* Maximum value is signed 16-bit value */
43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
45e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* clip type constants */
476ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach#define BTA_AG_CLIP_TYPE_MIN        128
486ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach#define BTA_AG_CLIP_TYPE_MAX        175
49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define BTA_AG_CLIP_TYPE_DEFAULT    129
50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define BTA_AG_CLIP_TYPE_VOIP       255
51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if defined(BTA_AG_MULTI_RESULT_INCLUDED) && (BTA_AG_MULTI_RESULT_INCLUDED == TRUE)
536ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach#define BTA_AG_AT_MULTI_LEN            2
54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define AT_SET_RES_CB(res_cb, c, p, i) {res_cb.code = c; res_cb.p_arg = p; res_cb.int_arg = i;}
55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* type for AT result code block */
57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachtypedef struct
58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8 code;
60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    char *p_arg;
61e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    INT16 int_arg;
62e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} tBTA_AG_RESULT_CB;
63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* type for multiple AT result codes block */
65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachtypedef struct
66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8 num_result;
68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTA_AG_RESULT_CB res_cb[BTA_AG_AT_MULTI_LEN];
69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} tBTA_AG_MULTI_RESULT_CB;
70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* enumeration of HSP AT commands matches HSP command interpreter table */
73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachenum
74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HS_CMD_CKPD,
766ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_HS_CMD_VGS,
77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HS_CMD_VGM
78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach};
79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* enumeration of HFP AT commands matches HFP command interpreter table */
81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachenum
82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
836ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_HF_CMD_A,
846ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_HF_CMD_D,
856ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_HF_CMD_VGS,
866ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_HF_CMD_VGM,
87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_CCWA,
88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_CHLD,
89e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_CHUP,
90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_CIND,
91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_CLIP,
92e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_CMER,
936ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_HF_CMD_VTS,
94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_BINP,
95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_BLDN,
96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_BVRA,
97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_BRSF,
98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_NREC,
99e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_CNUM,
100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_BTRH,
101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_CLCC,
102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_COPS,
103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_CMEE,
104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_BIA,
105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_CBC,
106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_BCC,
107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_BCS,
108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_HF_CMD_BAC
109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach};
110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* AT command interpreter table for HSP */
112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst tBTA_AG_AT_CMD bta_ag_hsp_cmd[] =
113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CKPD",   BTA_AG_AT_SET,                      BTA_AG_AT_INT, 200, 200},
115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+VGS",    BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,  15},
116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+VGM",    BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,  15},
117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"",        BTA_AG_AT_NONE,                     BTA_AG_AT_STR,   0,   0}
118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach};
119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* AT command interpreter table for HFP */
121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst tBTA_AG_AT_CMD bta_ag_hfp_cmd[] =
122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"A",       BTA_AG_AT_NONE,                     BTA_AG_AT_STR,   0,   0},
124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"D",       (BTA_AG_AT_NONE | BTA_AG_AT_FREE),  BTA_AG_AT_STR,   0,   0},
125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+VGS",    BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,  15},
126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+VGM",    BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,  15},
127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CCWA",   BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,   1},
128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Consider CHLD as str to take care of indexes for ECC */
129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CHLD",   (BTA_AG_AT_SET | BTA_AG_AT_TEST),   BTA_AG_AT_STR,   0,   4},
130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CHUP",   BTA_AG_AT_NONE,                     BTA_AG_AT_STR,   0,   0},
131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CIND",   (BTA_AG_AT_READ | BTA_AG_AT_TEST),  BTA_AG_AT_STR,   0,   0},
132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CLIP",   BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,   1},
133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CMER",   BTA_AG_AT_SET,                      BTA_AG_AT_STR,   0,   0},
134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+VTS",    BTA_AG_AT_SET,                      BTA_AG_AT_STR,   0,   0},
135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+BINP",   BTA_AG_AT_SET,                      BTA_AG_AT_INT,   1,   1},
136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+BLDN",   BTA_AG_AT_NONE,                     BTA_AG_AT_STR,   0,   0},
137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+BVRA",   BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,   1},
138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+BRSF",   BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,   BTA_AG_CMD_MAX_VAL},
139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+NREC",   BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,   0},
140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CNUM",   BTA_AG_AT_NONE,                     BTA_AG_AT_STR,   0,   0},
141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+BTRH",   (BTA_AG_AT_READ | BTA_AG_AT_SET),   BTA_AG_AT_INT,   0,   2},
142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CLCC",   BTA_AG_AT_NONE,                     BTA_AG_AT_STR,   0,   0},
143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+COPS",   (BTA_AG_AT_READ | BTA_AG_AT_SET),   BTA_AG_AT_STR,   0,   0},
144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CMEE",   BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,   1},
145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+BIA",    BTA_AG_AT_SET,                      BTA_AG_AT_STR,   0,   20},
146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CBC",    BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,   100},
147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+BCC",    BTA_AG_AT_NONE,                     BTA_AG_AT_STR,   0,   0},
148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+BCS",    BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,   BTA_AG_CMD_MAX_VAL},
149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+BAC",    BTA_AG_AT_SET,                      BTA_AG_AT_STR,   0,   0},
150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"",        BTA_AG_AT_NONE,                     BTA_AG_AT_STR,   0,   0}
151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach};
152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* AT result code table element */
154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachtypedef struct
155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    const char  *p_res;         /* AT result string */
157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8       fmt;            /* whether argument is int or string */
158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} tBTA_AG_RESULT;
159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* AT result code argument types */
161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachenum
162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_FMT_NONE,       /* no argument */
164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_FMT_INT,        /* integer argument */
165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_FMT_STR         /* string argument */
166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach};
167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* enumeration of AT result codes, matches constant table */
169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachenum
170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_OK,
172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_ERROR,
173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_RING,
174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_VGS,
175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_VGM,
176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_CCWA,
177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_CHLD,
178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_CIND,
179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_CLIP,
180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_CIEV,
181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_BINP,
182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_BVRA,
183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_BRSF,
184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_BSIR,
185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_CNUM,
186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_BTRH,
187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_CLCC,
188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_COPS,
189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_CMEE,
190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_BCS,
191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_UNAT
192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach};
193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if defined(BTA_HSP_RESULT_REPLACE_COLON) && (BTA_HSP_RESULT_REPLACE_COLON == TRUE)
1956ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach#define COLON_IDX_4_VGSVGM    4
196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* AT result code constant table  (Indexed by result code) */
198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst tBTA_AG_RESULT bta_ag_result_tbl[] =
199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"OK",      BTA_AG_RES_FMT_NONE},
201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"ERROR",   BTA_AG_RES_FMT_NONE},
202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"RING",    BTA_AG_RES_FMT_NONE},
203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+VGS: ",  BTA_AG_RES_FMT_INT},
204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+VGM: ",  BTA_AG_RES_FMT_INT},
205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CCWA: ", BTA_AG_RES_FMT_STR},
206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CHLD: ", BTA_AG_RES_FMT_STR},
207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CIND: ", BTA_AG_RES_FMT_STR},
208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CLIP: ", BTA_AG_RES_FMT_STR},
209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CIEV: ", BTA_AG_RES_FMT_STR},
210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+BINP: ", BTA_AG_RES_FMT_STR},
211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+BVRA: ", BTA_AG_RES_FMT_INT},
212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+BRSF: ", BTA_AG_RES_FMT_INT},
213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+BSIR: ", BTA_AG_RES_FMT_INT},
214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CNUM: ", BTA_AG_RES_FMT_STR},
215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+BTRH: ", BTA_AG_RES_FMT_INT},
216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CLCC: ", BTA_AG_RES_FMT_STR},
217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+COPS: ", BTA_AG_RES_FMT_STR},
218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+CME ERROR: ", BTA_AG_RES_FMT_INT},
219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"+BCS: ",  BTA_AG_RES_FMT_INT},
220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {"",        BTA_AG_RES_FMT_STR}
221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach};
222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst tBTA_AG_AT_CMD *bta_ag_at_tbl[BTA_AG_NUM_IDX] =
224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bta_ag_hsp_cmd,
226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bta_ag_hfp_cmd
227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach};
228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* callback event lookup table for HSP */
230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst tBTA_AG_EVT bta_ag_hsp_cb_evt[] =
2316ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach{
232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_AT_CKPD_EVT,     /* BTA_AG_HS_CMD_CKPD */
233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_SPK_EVT,         /* BTA_AG_HS_CMD_VGS */
234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_MIC_EVT          /* BTA_AG_HS_CMD_VGM */
235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach};
236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* callback event lookup table for HFP  (Indexed by command) */
238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst tBTA_AG_EVT bta_ag_hfp_cb_evt[] =
239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_AT_A_EVT,        /* BTA_AG_HF_CMD_A */
2416ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_AT_D_EVT,        /* BTA_AG_HF_CMD_D */
2426ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_SPK_EVT,         /* BTA_AG_HF_CMD_VGS */
2436ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_MIC_EVT,         /* BTA_AG_HF_CMD_VGM */
244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    0,                      /* BTA_AG_HF_CMD_CCWA */
245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_AT_CHLD_EVT,     /* BTA_AG_HF_CMD_CHLD */
246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_AT_CHUP_EVT,     /* BTA_AG_HF_CMD_CHUP */
247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_AT_CIND_EVT,     /* BTA_AG_HF_CMD_CIND */
248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    0,                      /* BTA_AG_HF_CMD_CLIP */
249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    0,                      /* BTA_AG_HF_CMD_CMER */
2506ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_AT_VTS_EVT,      /* BTA_AG_HF_CMD_VTS */
251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_AT_BINP_EVT,     /* BTA_AG_HF_CMD_BINP */
252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_AT_BLDN_EVT,     /* BTA_AG_HF_CMD_BLDN */
253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_AT_BVRA_EVT,     /* BTA_AG_HF_CMD_BVRA */
254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    0,                      /* BTA_AG_HF_CMD_BRSF */
255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_AT_NREC_EVT,     /* BTA_AG_HF_CMD_NREC */
256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_AT_CNUM_EVT,     /* BTA_AG_HF_CMD_CNUM */
257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_AT_BTRH_EVT,     /* BTA_AG_HF_CMD_BTRH */
258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_AT_CLCC_EVT,     /* BTA_AG_HF_CMD_CLCC */
259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_AT_COPS_EVT,     /* BTA_AG_HF_CMD_COPS */
260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    0,                      /* BTA_AG_HF_CMD_CMEE */
261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    0,                      /* BTA_AG_HF_CMD_BIA */
262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_AT_CBC_EVT,      /* BTA_AG_HF_CMD_CBC */
263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    0,                      /* BTA_AG_HF_CMD_BCC */
264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_AT_BCS_EVT,      /* BTA_AG_HF_CMD_BCS */
265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_AT_BAC_EVT       /* BTA_AG_HF_CMD_BAC */
266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach};
267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* translation of API result code values to internal values */
269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst UINT8 bta_ag_trans_result[] =
270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
2716ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_RES_VGS,     /* BTA_AG_SPK_RES */
2726ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_RES_VGM,     /* BTA_AG_MIC_RES */
2736ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_RES_BSIR,    /* BTA_AG_INBAND_RING_RES */
2746ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_RES_CIND,    /* BTA_AG_CIND_RES */
2756ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_RES_BINP,    /* BTA_AG_BINP_RES */
2766ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_RES_CIEV,    /* BTA_AG_IND_RES */
2776ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_RES_BVRA,    /* BTA_AG_BVRA_RES */
2786ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_RES_CNUM,    /* BTA_AG_CNUM_RES */
2796ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_RES_BTRH,    /* BTA_AG_BTRH_RES */
2806ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_RES_CLCC,    /* BTA_AG_CLCC_RES */
2816ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_RES_COPS,    /* BTA_AG_COPS_RES */
2826ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                  /* BTA_AG_IN_CALL_RES */
2836ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                  /* BTA_AG_IN_CALL_CONN_RES */
2846ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_RES_CCWA,    /* BTA_AG_CALL_WAIT_RES */
2856ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                  /* BTA_AG_OUT_CALL_ORIG_RES */
286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    0,                  /* BTA_AG_OUT_CALL_ALERT_RES */
2876ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                  /* BTA_AG_OUT_CALL_CONN_RES */
2886ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                  /* BTA_AG_CALL_CANCEL_RES */
2896ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                  /* BTA_AG_END_CALL_RES */
2906ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                  /* BTA_AG_IN_CALL_HELD_RES */
291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_RES_UNAT     /* BTA_AG_UNAT_RES */
292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach};
293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* callsetup indicator value lookup table */
295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst UINT8 bta_ag_callsetup_ind_tbl[] =
296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
2976ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                          /* BTA_AG_SPK_RES */
2986ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                          /* BTA_AG_MIC_RES */
2996ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                          /* BTA_AG_INBAND_RING_RES */
3006ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                          /* BTA_AG_CIND_RES */
3016ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                          /* BTA_AG_BINP_RES */
3026ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                          /* BTA_AG_IND_RES */
3036ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                          /* BTA_AG_BVRA_RES */
3046ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                          /* BTA_AG_CNUM_RES */
3056ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                          /* BTA_AG_BTRH_RES */
3066ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                          /* BTA_AG_CLCC_RES */
3076ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    0,                          /* BTA_AG_COPS_RES */
3086ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_CALLSETUP_INCOMING,  /* BTA_AG_IN_CALL_RES */
3096ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_CALLSETUP_NONE,      /* BTA_AG_IN_CALL_CONN_RES */
3106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_CALLSETUP_INCOMING,  /* BTA_AG_CALL_WAIT_RES */
3116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_CALLSETUP_OUTGOING,  /* BTA_AG_OUT_CALL_ORIG_RES */
312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTA_AG_CALLSETUP_ALERTING,  /* BTA_AG_OUT_CALL_ALERT_RES */
3136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_CALLSETUP_NONE,      /* BTA_AG_OUT_CALL_CONN_RES */
3146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_CALLSETUP_NONE,      /* BTA_AG_CALL_CANCEL_RES */
3156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_CALLSETUP_NONE,      /* BTA_AG_END_CALL_RES */
3166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    BTA_AG_CALLSETUP_NONE       /* BTA_AG_IN_CALL_HELD_RES */
3176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach};
318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_send_result
322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Send an AT result code.
3246ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_ag_send_result(tBTA_AG_SCB *p_scb, UINT8 code, char *p_arg,
330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                               INT16 int_arg)
331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    char    buf[BTA_AG_AT_MAX_LEN + 16];
333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    char    *p = buf;
334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16  len;
335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE)
337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memset(buf, NULL, sizeof(buf));
338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* init with \r\n */
340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    *p++ = '\r';
341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    *p++ = '\n';
342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* copy result code string */
344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BCM_STRCPY_S(p, sizeof(buf), bta_ag_result_tbl[code].p_res);
345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if defined(BTA_HSP_RESULT_REPLACE_COLON) && (BTA_HSP_RESULT_REPLACE_COLON == TRUE)
346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if(p_scb->conn_service == BTA_AG_HSP)
347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* If HSP then ":"symbol should be changed as "=" for HSP compatibility */
349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        switch(code)
350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_RES_VGS:
352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_RES_VGM:
353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if(*(p+COLON_IDX_4_VGSVGM) == ':')
354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                #if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE)
356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                APPL_TRACE_DEBUG0("[HSP] ':'symbol is changed as '=' for HSP compatibility");
3576ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach                #endif
358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                *(p+COLON_IDX_4_VGSVGM) = '=';
359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
3636ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach#endif
364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p += strlen(bta_ag_result_tbl[code].p_res);
365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* copy argument if any */
367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (bta_ag_result_tbl[code].fmt == BTA_AG_RES_FMT_INT)
368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p += utl_itoa((UINT16) int_arg, p);
370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else if (bta_ag_result_tbl[code].fmt == BTA_AG_RES_FMT_STR)
372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BCM_STRCPY_S(p, sizeof(buf), p_arg);
374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p += strlen(p_arg);
375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* finish with \r\n */
378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    *p++ = '\r';
379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    *p++ = '\n';
380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE)
382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    APPL_TRACE_DEBUG1("bta_ag_send_result: %s", buf);
3836ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach#endif
384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* send to RFCOMM */
386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    PORT_WriteData(p_scb->conn_handle, buf, (UINT16) (p - buf), &len);
387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if defined(BTA_AG_MULTI_RESULT_INCLUDED) && (BTA_AG_MULTI_RESULT_INCLUDED == TRUE)
390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_send_multi_result
393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
394e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Send multiple AT result codes.
3956ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
400e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_ag_send_multi_result(tBTA_AG_SCB *p_scb, tBTA_AG_MULTI_RESULT_CB *m_res_cb)
401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    char    buf[BTA_AG_AT_MAX_LEN * BTA_AG_AT_MULTI_LEN + 16];
403e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    char    *p = buf;
404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16  len;
405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8   res_idx = 0;
406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if((!m_res_cb) || (m_res_cb->num_result == 0) || (m_res_cb->num_result > BTA_AG_AT_MULTI_LEN))
408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
409e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        APPL_TRACE_DEBUG0("m_res_cb is NULL or num_result is out of range.");
410e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
4126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE)
414e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memset(buf, NULL, sizeof(buf));
415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
416e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
417e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    while(res_idx < m_res_cb->num_result)
418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* init with \r\n */
420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        *p++ = '\r';
421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        *p++ = '\n';
4226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* copy result code string */
424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BCM_STRCPY_S(p, sizeof(buf), bta_ag_result_tbl[m_res_cb->res_cb[res_idx].code].p_res);
425e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p += strlen(bta_ag_result_tbl[m_res_cb->res_cb[res_idx].code].p_res);
4266ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* copy argument if any */
428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (bta_ag_result_tbl[m_res_cb->res_cb[res_idx].code].fmt == BTA_AG_RES_FMT_INT)
429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p += utl_itoa((UINT16) m_res_cb->res_cb[res_idx].int_arg, p);
431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else if (bta_ag_result_tbl[m_res_cb->res_cb[res_idx].code].fmt == BTA_AG_RES_FMT_STR)
433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
434e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            BCM_STRCPY_S(p, sizeof(buf), m_res_cb->res_cb[res_idx].p_arg);
435e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p += strlen(m_res_cb->res_cb[res_idx].p_arg);
436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
4376ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* finish with \r\n */
439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        *p++ = '\r';
440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        *p++ = '\n';
4416ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        res_idx++;
443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE)
446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    APPL_TRACE_DEBUG1("send_result: %s", buf);
4476ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach#endif
448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* send to RFCOMM */
450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    PORT_WriteData(p_scb->conn_handle, buf, (UINT16) (p - buf), &len);
451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
452e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
454e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
455e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_send_ok
457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
458e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Send an OK result code.
4596ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
463e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
464e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_ag_send_ok(tBTA_AG_SCB *p_scb)
465e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
466e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bta_ag_send_result(p_scb, BTA_AG_RES_OK, NULL, 0);
467e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
468e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
469e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
470e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
471e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_send_error
472e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
473e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Send an ERROR result code.
474e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                      errcode - used to send verbose errocode
4756ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
477e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_ag_send_error(tBTA_AG_SCB *p_scb, INT16 errcode)
481e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If HFP and extended audio gateway error codes are enabled */
483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_scb->conn_service == BTA_AG_HFP && p_scb->cmee_enabled)
484e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        bta_ag_send_result(p_scb, BTA_AG_RES_CMEE, NULL, errcode);
485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        bta_ag_send_result(p_scb, BTA_AG_RES_ERROR, NULL, 0);
487e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
489e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_send_ind
492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
493e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Send an indicator CIEV result code.
4946ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
498e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
499e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_ag_send_ind(tBTA_AG_SCB *p_scb, UINT16 id, UINT16 value, BOOLEAN on_demand)
500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    char    str[12];
502e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    char    *p = str;
503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If the indicator is masked out, just return */
505e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Mandatory indicators can not be masked out. */
506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((p_scb->bia_masked_out & ((UINT32)1 << id)) &&
507e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        ((id != BTA_AG_IND_CALL) && (id != BTA_AG_IND_CALLSETUP) && (id != BTA_AG_IND_CALLHELD)))
508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
509e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
510e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Ensure we do not send duplicate indicators if not requested by app */
511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If it was requested by app, transmit CIEV even if it is duplicate. */
512e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (id == BTA_AG_IND_CALL)
513e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
514e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if ((value == p_scb->call_ind) && (on_demand == FALSE))
515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
516e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
517e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_scb->call_ind = (UINT8)value;
518e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((id == BTA_AG_IND_CALLSETUP) && (on_demand == FALSE))
521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (value == p_scb->callsetup_ind)
523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
524e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_scb->callsetup_ind = (UINT8)value;
526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
527e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
528072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan    if ((id == BTA_AG_IND_SERVICE) && (on_demand == FALSE))
529072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan    {
530072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan        if (value == p_scb->service_ind)
531072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan            return;
532072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan
533072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan        p_scb->service_ind = (UINT8)value;
534072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan    }
535072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan    if ((id == BTA_AG_IND_SIGNAL) && (on_demand == FALSE))
536072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan    {
537072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan        if (value == p_scb->signal_ind)
538072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan            return;
539072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan
540072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan        p_scb->signal_ind = (UINT8)value;
541072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan    }
542072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan    if ((id == BTA_AG_IND_ROAM) && (on_demand == FALSE))
543072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan    {
544072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan        if (value == p_scb->roam_ind)
545072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan            return;
546072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan
547072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan        p_scb->roam_ind = (UINT8)value;
548072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan    }
549072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan    if ((id == BTA_AG_IND_BATTCHG) && (on_demand == FALSE))
550072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan    {
551072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan        if (value == p_scb->battchg_ind)
552072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan            return;
553072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan
554072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan        p_scb->battchg_ind = (UINT8)value;
555072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan    }
556072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan
557e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((id == BTA_AG_IND_CALLHELD) && (on_demand == FALSE))
558e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
559c02b3a558e7789dcd73bcabf5a90f24fee327364Ravi Nagarajan        /* call swap could result in sending callheld=1 multiple times */
560c02b3a558e7789dcd73bcabf5a90f24fee327364Ravi Nagarajan        if ((value != 1) && (value == p_scb->callheld_ind))
561e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
562e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
563e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_scb->callheld_ind = (UINT8)value;
564e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
565e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
566e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_scb->cmer_enabled)
567e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
568e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p += utl_itoa(id, p);
569e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        *p++ = ',';
570e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        utl_itoa(value, p);
571e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        bta_ag_send_result(p_scb, BTA_AG_RES_CIEV, str, 0);
572e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
573e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
574e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
575e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
576e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
577e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_parse_cmer
578e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
579e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Parse AT+CMER parameter string.
5806ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
582e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          TRUE if parsed ok, FALSE otherwise.
583e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
584e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic BOOLEAN bta_ag_parse_cmer(char *p_s, BOOLEAN *p_enabled)
586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
587e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    INT16   n[4] = {-1, -1, -1, -1};
588e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    int     i;
589e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    char    *p;
590e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
591e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for (i = 0; i < 4; i++)
592e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
593e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* skip to comma delimiter */
594e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        for (p = p_s; *p != ',' && *p != 0; p++);
595e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
596e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* get integer value */
597e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        *p = 0;
598e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        n[i] = utl_str2int(p_s);
599e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_s = p + 1;
600e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (p_s == 0)
601e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
602e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
603e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
604e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
605e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* process values */
607e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (n[0] < 0 || n[3] < 0)
608e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
609e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return FALSE;
610e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
611e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
612e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((n[0] == 3) && ((n[3] == 1) || (n[3] == 0)))
613e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
614e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        *p_enabled = (BOOLEAN) n[3];
615e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
616e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
617e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return TRUE;
618e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
619e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
620e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
621e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
622e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_parse_chld
623e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
624e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Parse AT+CHLD parameter string.
6256ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
626e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
627e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          Returns idx (1-7), or 0 if ECC not enabled or idx doesn't exist
628e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
629e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
630e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic UINT8 bta_ag_parse_chld(tBTA_AG_SCB *p_scb, char *p_s)
631e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
632e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8   retval = 0;
633e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    INT16   idx = -1;
634e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
635e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_s[1] != 0)
636e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
637e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* p_idxstr++;  point to beginning of call number */
638e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        idx = utl_str2int(&p_s[1]);
639e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (idx != -1 && idx < 255)
640e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            retval = (UINT8)idx;
641e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
6426ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
643e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (retval);
644e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
645e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
646e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_WBS_INCLUDED == TRUE )
647e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
648e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
649e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_parse_bac
650e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
651e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Parse AT+BAC parameter string.
6526ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
653e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          Returns bitmap of supported codecs.
654e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
655e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
656e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic tBTA_AG_PEER_CODEC bta_ag_parse_bac(tBTA_AG_SCB *p_scb, char *p_s)
657e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
658e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTA_AG_PEER_CODEC  retval = BTA_AG_CODEC_NONE;
659e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16  uuid_codec;
660e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BOOLEAN cont = FALSE;       /* Continue processing */
661e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    char *p;
662e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
663e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    while(p_s)
6646ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    {
665e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* skip to comma delimiter */
666e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        for(p = p_s; *p != ',' && *p != 0; p++);
667e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
668e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* get integre value */
669e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (*p != 0)
670e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
671e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            *p = 0;
672e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            cont = TRUE;
673e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
674e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
675e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            cont = FALSE;
676e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
677e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        uuid_codec = utl_str2int(p_s);
678e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        switch(uuid_codec)
679e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
680e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            case UUID_CODEC_CVSD:   retval |= BTA_AG_CODEC_CVSD;     break;
681e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            case UUID_CODEC_MSBC:   retval |= BTA_AG_CODEC_MSBC;     break;
682e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            default:
683e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                APPL_TRACE_ERROR1("Unknown Codec UUID(%d) received", uuid_codec);
684e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                return BTA_AG_CODEC_NONE;
685e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
686e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
687e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (cont)
688e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_s = p + 1;
689e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
690e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
691e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
692e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
693e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (retval);
694e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
695e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
696e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
697e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
698e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
699e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_process_unat_res
700e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
701e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Process the unat response data and remove extra carriage return
702e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  and line feed
7036ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
704e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
705e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
708e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
709e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_ag_process_unat_res(char *unat_result)
710e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
711e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8   str_leng;
712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8   i = 0;
713e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8   j = 0;
714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8   pairs_of_nl_cr;
715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    char    trim_data[BTA_AG_AT_MAX_LEN];
716e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
7186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
719e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    str_leng = strlen(unat_result);
720e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
721e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If no extra CR and LF, just return */
722e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if(str_leng < 4)
723e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
7246ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
7256ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    /* Remove the carriage return and left feed */
7266ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    while(unat_result[0] =='\r' && unat_result[1] =='\n'
727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        && unat_result[str_leng-2] =='\r' && unat_result[str_leng-1] =='\n')
728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
729e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        pairs_of_nl_cr = 1;
730e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        for (i=0;i<(str_leng-4*pairs_of_nl_cr);i++)
731e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
732e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            trim_data[j++] = unat_result[i+pairs_of_nl_cr*2];
7336ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        }
734e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Add EOF */
735e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        trim_data[j] = '\0';
736e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        str_leng = str_leng - 4;
737e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BCM_STRNCPY_S(unat_result, BTA_AG_AT_MAX_LEN+1, trim_data,str_leng+1);
738e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        i=0;
739e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        j=0;
7406ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
741e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if(str_leng <4)
742e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
7436ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
7446ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
745e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
746e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return;
747e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
748e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
749e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
750e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
751e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
752e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_inband_enabled
753e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
754e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Determine whether in-band ring can be used.
7556ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
756e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
757e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
758e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
759e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
760e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN bta_ag_inband_enabled(tBTA_AG_SCB *p_scb)
761e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
762e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* if feature is enabled and no other scbs connected */
763e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_scb->inband_enabled && !bta_ag_other_scb_open(p_scb))
764e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
765e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return TRUE;
766e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
767e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
768e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
769e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return FALSE;
770e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
771e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
772e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
773e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
774e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
775e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_send_call_inds
776e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
777e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Send call and callsetup indicators.
7786ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
779e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
780e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
781e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
782e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
783e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_ag_send_call_inds(tBTA_AG_SCB *p_scb, tBTA_AG_RES result)
784e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
785e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8 call = p_scb->call_ind;
786e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8 callsetup;
787e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
788e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* set new call and callsetup values based on BTA_AgResult */
789e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    callsetup = bta_ag_callsetup_ind_tbl[result];
790e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
791e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (result == BTA_AG_END_CALL_RES)
792e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
793e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        call = BTA_AG_CALL_INACTIVE;
794e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
7956ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    else if (result == BTA_AG_IN_CALL_CONN_RES || result == BTA_AG_OUT_CALL_CONN_RES
796e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach             || result == BTA_AG_IN_CALL_HELD_RES)
797e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
798e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        call = BTA_AG_CALL_ACTIVE;
799e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
800e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
801e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
802e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        call = p_scb->call_ind;
803e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
804e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
805e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Send indicator function tracks if the values have actually changed */
806e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bta_ag_send_ind(p_scb, BTA_AG_IND_CALL, call, FALSE);
807e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bta_ag_send_ind(p_scb, BTA_AG_IND_CALLSETUP, callsetup, FALSE);
808e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
809e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
810e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
811e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
812e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_at_hsp_cback
813e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
814e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      AT command processing callback for HSP.
8156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
816e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
817e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
818e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
819e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
820e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_ag_at_hsp_cback(tBTA_AG_SCB *p_scb, UINT16 cmd, UINT8 arg_type,
821e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                char *p_arg, INT16 int_arg)
822e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
8236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    tBTA_AG_VAL val;
824e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
825e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    APPL_TRACE_DEBUG4("AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type,
826e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                      int_arg, p_arg);
827e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
828e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* send OK */
829e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bta_ag_send_ok(p_scb);
830e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
831e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    val.hdr.handle = bta_ag_scb_to_idx(p_scb);
832e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    val.hdr.app_id = p_scb->app_id;
833e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    val.num = (UINT16) int_arg;
834e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BCM_STRNCPY_S(val.str, sizeof(val.str), p_arg, BTA_AG_AT_MAX_LEN);
835e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    val.str[BTA_AG_AT_MAX_LEN] = 0;
836e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
837e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* call callback with event */
838e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    (*bta_ag_cb.p_cback)(bta_ag_hsp_cb_evt[cmd], (tBTA_AG *) &val);
839e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
840e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
841e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
842e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
843e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_at_hfp_cback
844e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
845e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      AT command processing callback for HFP.
8466ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
847e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
848e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
849e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
850e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
851e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_ag_at_hfp_cback(tBTA_AG_SCB *p_scb, UINT16 cmd, UINT8 arg_type,
852e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                char *p_arg, INT16 int_arg)
853e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
8546ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    tBTA_AG_VAL     val;
855e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTA_AG_EVT   event;
856e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTA_AG_SCB     *ag_scb;
857e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT32          i, ind_id;
858e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT32          bia_masked_out;
859e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_WBS_INCLUDED == TRUE )
860e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTA_AG_PEER_CODEC  codec_type, codec_sent;
861e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
862e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
863e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    APPL_TRACE_DEBUG4("HFP AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type,
864e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                      int_arg, p_arg);
865e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
866e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    val.hdr.handle = bta_ag_scb_to_idx(p_scb);
867e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    val.hdr.app_id = p_scb->app_id;
868e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    val.num = int_arg;
869e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BCM_STRNCPY_S(val.str, sizeof(val.str), p_arg, BTA_AG_AT_MAX_LEN);
870e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    val.str[BTA_AG_AT_MAX_LEN] = 0;
871e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
872e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    event = bta_ag_hfp_cb_evt[cmd];
873e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
874e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    switch (cmd)
875e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
876e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_A:
8776ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        case BTA_AG_HF_CMD_VGS:
8786ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        case BTA_AG_HF_CMD_VGM:
879e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_CHUP:
880e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_CBC:
881e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* send OK */
882e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_ag_send_ok(p_scb);
883e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
884e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
885e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_BLDN:
8866ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach            /* Do not send OK, App will send error or OK depending on
887e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            ** last dial number enabled or not */
888e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
889e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
890e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_D:
891e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* Do not send OK for Dial cmds
892e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            ** Let application decide whether to send OK or ERROR*/
893e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
894e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* if mem dial cmd, make sure string contains only digits */
895e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if(p_arg[0] == '>')
896e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
897e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if(!utl_isintstr(p_arg+1))
898e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
899e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    event = 0;
900e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_DSTR);
901e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
902e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
903e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else if (p_arg[0] == 'V')   /* ATDV : Dial VoIP Call */
904e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
905e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* We do not check string. Code will be added later if needed. */
906e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if(!((p_scb->peer_features & BTA_AG_PEER_FEAT_VOIP) && (p_scb->features & BTA_AG_FEAT_VOIP)))
907e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
908e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    event = 0;
909e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
910e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
911e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
912e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* If dial cmd, make sure string contains only dial digits
913e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            ** Dial digits are 0-9, A-C, *, #, + */
914e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
915e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
916e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if(!utl_isdialstr(p_arg))
917e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
918e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    event = 0;
919e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_DSTR);
920e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
921e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
922e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
923e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
924e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_CCWA:
925e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* store setting */
926e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_scb->ccwa_enabled = (BOOLEAN) int_arg;
927e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
928e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* send OK */
929e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_ag_send_ok(p_scb);
930e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
931e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
932e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_CHLD:
933e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (arg_type == BTA_AG_AT_TEST)
934e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
935e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* don't call callback */
936e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                event = 0;
937e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
938e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* send CHLD string */
939e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* Form string based on supported 1.5 feature */
940e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if ((p_scb->peer_version >= HFP_VERSION_1_5) &&
941e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    (p_scb->features & BTA_AG_FEAT_ECC) &&
942e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    (p_scb->peer_features & BTA_AG_PEER_FEAT_ECC))
943e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_send_result(p_scb, BTA_AG_RES_CHLD, p_bta_ag_cfg->chld_val_ecc, 0);
944e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                else
945e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_send_result(p_scb, BTA_AG_RES_CHLD, p_bta_ag_cfg->chld_val, 0);
946e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
947e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* send OK */
948e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_ok(p_scb);
949e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
950e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* if service level conn. not already open, now it's open */
951e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_svc_conn_open(p_scb, NULL);
9526ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
953e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
954e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
955e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
956e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                val.idx = bta_ag_parse_chld(p_scb, val.str);
957e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
958e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if(val.idx && !((p_scb->features & BTA_AG_FEAT_ECC) && (p_scb->peer_features & BTA_AG_PEER_FEAT_ECC)))
959e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
960e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    /* we do not support ECC, but HF is sending us a CHLD with call index*/
961e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    event = 0;
9626ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach                    bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
963e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
964e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
965e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                else
966e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
967e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
968e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* If it is swap between calls, set call held indicator to 3(out of valid 0-2)
969e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                ** Application will set it back to 1
970e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                ** callheld indicator will be sent across to the peer. */
971e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if(val.str[0] == '2')
9726ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach                {
973e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    for (i = 0, ag_scb = &bta_ag_cb.scb[0]; i < BTA_AG_NUM_SCB; i++, ag_scb++)
974e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    {
975e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        if (ag_scb->in_use)
976e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        {
9776ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach                            if((ag_scb->call_ind == BTA_AG_CALL_ACTIVE)
978e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                && (ag_scb->callsetup_ind == BTA_AG_CALLSETUP_NONE))
979e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                ag_scb->callheld_ind = BTA_AG_CALLHELD_NOACTIVE + 1;
980e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        }
981e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    }
982e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
983e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
9846ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
985e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* Do not send OK. Let app decide after parsing the val str */
986e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* bta_ag_send_ok(p_scb); */
987e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
988e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
989e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
990e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_CIND:
991e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (arg_type == BTA_AG_AT_TEST)
992e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
993e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* don't call callback */
994e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                event = 0;
995e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
996e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* send CIND string, send OK */
997e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_result(p_scb, BTA_AG_RES_CIND, p_bta_ag_cfg->cind_info, 0);
998e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_ok(p_scb);
999e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1000e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1001e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1002e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_CLIP:
1003e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* store setting, send OK */
1004e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_scb->clip_enabled = (BOOLEAN) int_arg;
1005e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_ag_send_ok(p_scb);
1006e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1007e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1008e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_CMER:
1009e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* if parsed ok store setting, send OK */
1010e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (bta_ag_parse_cmer(p_arg, &p_scb->cmer_enabled))
1011e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1012e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_ok(p_scb);
1013e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1014e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* if service level conn. not already open and our features and
1015e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                ** peer features do not have 3-way, service level conn. now open
1016e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                */
1017e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (!p_scb->svc_conn &&
1018e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    !((p_scb->features & BTA_AG_FEAT_3WAY) && (p_scb->peer_features & BTA_AG_PEER_FEAT_3WAY)))
1019e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1020e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_svc_conn_open(p_scb, NULL);
1021e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1022e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1023e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1024e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1025e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR);
1026e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1027e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1028e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1029e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_VTS:
1030e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* check argument */
1031e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (strlen(p_arg) == 1)
1032e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1033e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_ok(p_scb);
1034e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1035e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1036e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1037e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                event = 0;
1038e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR);
1039e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1040e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1041e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1042e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_BINP:
1043e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* if feature not set don't call callback, send ERROR */
1044e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (!(p_scb->features & BTA_AG_FEAT_VTAG))
1045e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1046e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                event = 0;
1047e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
1048e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1049e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1050e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1051e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_BVRA:
1052f2b7dab37bdd8736b9ffb2b8e99e77236850b81cRavi Nagarajan            /* if feature not supported don't call callback, send ERROR. App will send OK */
1053f2b7dab37bdd8736b9ffb2b8e99e77236850b81cRavi Nagarajan            if (!(p_scb->features & BTA_AG_FEAT_VREC))
1054e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1055e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                event = 0;
1056e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
1057e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1058e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1059e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1060e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_BRSF:
1061e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* store peer features */
1062e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_scb->peer_features = (UINT16) int_arg;
1063e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1064e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* send BRSF, send OK */
1065e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_ag_send_result(p_scb, BTA_AG_RES_BRSF, NULL,
1066e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                               (INT16) (p_scb->features & BTA_AG_BSRF_FEAT_SPEC));
1067e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_ag_send_ok(p_scb);
1068e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1069e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1070e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_NREC:
1071e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* if feature send OK, else don't call callback, send ERROR */
1072e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_scb->features & BTA_AG_FEAT_ECNR)
1073e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1074e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_ok(p_scb);
1075e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1076e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1077e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1078e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                event = 0;
1079e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
1080e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1081e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1082e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1083e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_BTRH:
1084e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* if feature send BTRH, send OK:, else don't call callback, send ERROR */
1085e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_scb->features & BTA_AG_FEAT_BTRH)
1086e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1087e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* If set command; send response and notify app */
1088e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (arg_type == BTA_AG_AT_SET)
1089e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1090e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    for (i = 0, ag_scb = &bta_ag_cb.scb[0]; i < BTA_AG_NUM_SCB; i++, ag_scb++)
1091e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    {
1092e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        if (ag_scb->in_use)
1093e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        {
1094e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                            bta_ag_send_result(ag_scb, BTA_AG_RES_BTRH, NULL, int_arg);
1095e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        }
1096e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    }
1097e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_send_ok(p_scb);
1098e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1099e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                else /* Read Command */
1100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    val.num = BTA_AG_BTRH_READ;
1102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                event = 0;
1107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
1108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_COPS:
1112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (arg_type == BTA_AG_AT_SET)
1113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* don't call callback */
1115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                event = 0;
1116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* send OK */
1118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_ok(p_scb);
1119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_CMEE:
1123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_scb->features & BTA_AG_FEAT_EXTERR)
1124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* store setting */
1126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_scb->cmee_enabled = (BOOLEAN) int_arg;
1127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* send OK */
1129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_ok(p_scb);
1130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
1134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* don't call callback */
1136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            event = 0;
1137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_BIA:
1140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* don't call callback */
1141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            event = 0;
1142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bia_masked_out = p_scb->bia_masked_out;
1144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* Parse the indicator mask */
1146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            for (i = 0, ind_id = 1; (val.str[i] != 0) && (ind_id <= 20); i++, ind_id++)
1147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (val.str[i] == ',')
1149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    continue;
1150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (val.str[i] == '0')
1152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bia_masked_out |= ((UINT32)1 << ind_id);
1153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                else if (val.str[i] == '1')
1154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bia_masked_out &= ~((UINT32)1 << ind_id);
1155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                else
1156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    break;
1157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                i++;
1159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if ( (val.str[i] != 0) && (val.str[i] != ',') )
1160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    break;
1161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (val.str[i] == 0)
1163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_scb->bia_masked_out = bia_masked_out;
1165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_ok (p_scb);
1166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_error (p_scb, BTA_AG_ERR_INVALID_INDEX);
1169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_CNUM:
1172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_CLCC:
1174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if(!(p_scb->features & BTA_AG_FEAT_ECS))
1175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                event = 0;
1177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
1178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
11806ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
1181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_WBS_INCLUDED == TRUE )
1182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_BAC:
1183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_ag_send_ok(p_scb);
1184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* store available codecs from the peer */
1186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if((p_scb->peer_features & BTA_AG_PEER_FEAT_CODEC) && (p_scb->features & BTA_AG_FEAT_CODEC))
1187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_scb->peer_codecs = bta_ag_parse_bac(p_scb, p_arg);
1189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_scb->codec_updated = TRUE;
1190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (p_scb->peer_codecs & BTA_AG_CODEC_MSBC)
1192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    p_scb->sco_codec = UUID_CODEC_MSBC;
1194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    APPL_TRACE_DEBUG0("Received AT+BAC, updating sco codec to MSBC");
1195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                else
1197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    p_scb->sco_codec = UUID_CODEC_CVSD;
11996ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach                    APPL_TRACE_DEBUG0("Received AT+BAC, updating sco codec to CVSD");
1200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* Received BAC while in codec negotiation. */
1203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if ((bta_ag_cb.sco.state == BTA_AG_SCO_CODEC_ST) && (bta_ag_cb.sco.p_curr_scb == p_scb))
1204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_codec_negotiate (p_scb);
1206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_scb->peer_codecs = BTA_AG_CODEC_NONE;
1211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                APPL_TRACE_ERROR0("Unexpected CMD:AT+BAC, Codec Negotiation is not supported");
1212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_BCS:
1216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* stop cn timer */
1217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_sys_stop_timer(&p_scb->cn_timer);
1218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            switch(int_arg)
1220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                case UUID_CODEC_CVSD:   codec_type = BTA_AG_CODEC_CVSD;     break;
1222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                case UUID_CODEC_MSBC:   codec_type = BTA_AG_CODEC_MSBC;     break;
1223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                default:
1224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    APPL_TRACE_ERROR1("Unknown codec_uuid %d", int_arg);
1225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    codec_type = 0xFFFF;
1226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    break;
1227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_scb->codec_fallback)
1230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                codec_sent = BTA_AG_CODEC_CVSD;
1231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                codec_sent = p_scb->sco_codec;
1233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if(codec_type == codec_sent)
1235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_sco_codec_nego(p_scb, TRUE);
1236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_sco_codec_nego(p_scb, FALSE);
12386ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
1239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_ag_send_ok(p_scb);
1240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_HF_CMD_BCC:
1243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_ag_send_ok(p_scb);
1244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_ag_sco_open(p_scb, NULL);
1245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        default:
1249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* call callback */
1253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (event != 0)
1254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        (*bta_ag_cb.p_cback)(event, (tBTA_AG *) &val);
1256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_at_err_cback
1262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      AT command parser error callback.
12646ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
1265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
1267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_ag_at_err_cback(tBTA_AG_SCB *p_scb, BOOLEAN unknown, char *p_arg)
1270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
12716ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    tBTA_AG_VAL     val;
1272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if(unknown && (!strlen(p_arg)))
1274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        APPL_TRACE_DEBUG0("Empty AT cmd string received");
1276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        bta_ag_send_ok(p_scb);
1277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
1278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* if unknown AT command and configured to pass these to app */
1281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (unknown && (p_scb->features & BTA_AG_FEAT_UNAT))
1282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        val.hdr.handle = bta_ag_scb_to_idx(p_scb);
1284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        val.hdr.app_id = p_scb->app_id;
1285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        val.num = 0;
1286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BCM_STRNCPY_S(val.str, sizeof(val.str), p_arg, BTA_AG_AT_MAX_LEN);
1287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        val.str[BTA_AG_AT_MAX_LEN] = 0;
1288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        (*bta_ag_cb.p_cback)(BTA_AG_AT_UNAT_EVT, (tBTA_AG *) &val);
1289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
1291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
1293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_hsp_result
1299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Handle API result for HSP connections.
13016ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
1302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
1304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_ag_hsp_result(tBTA_AG_SCB *p_scb, tBTA_AG_API_RESULT *p_result)
1307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8 code = bta_ag_trans_result[p_result->result];
1309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    APPL_TRACE_DEBUG1("bta_ag_hsp_result : res = %d", p_result->result);
1311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    switch(p_result->result)
1313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_SPK_RES:
1315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_MIC_RES:
1316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_ag_send_result(p_scb, code, NULL, p_result->data.num);
1317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_IN_CALL_RES:
1320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* tell sys to stop av if any */
1321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
1322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* if sco already opened or no inband ring send ring now */
1324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (bta_ag_sco_is_open(p_scb) || !bta_ag_inband_enabled(p_scb) ||
1325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                (p_scb->features & BTA_AG_FEAT_NOSCO))
1326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_ring(p_scb, (tBTA_AG_DATA *) p_result);
1328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* else open sco, send ring after sco opened */
1330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* HSPv1.2: AG shall not send RING if using in-band ring tone. */
1333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (p_scb->hsp_version >= HSP_VERSION_1_2)
1334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    p_scb->post_sco = BTA_AG_POST_SCO_NONE;
1335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                else
1336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    p_scb->post_sco = BTA_AG_POST_SCO_RING;
13376ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
1338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
1339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_IN_CALL_CONN_RES:
1343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_OUT_CALL_ORIG_RES:
1344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* if incoming call connected stop ring timer */
1345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_result->result == BTA_AG_IN_CALL_CONN_RES)
1346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_sys_stop_timer(&p_scb->act_timer);
1348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (!(p_scb->features & BTA_AG_FEAT_NOSCO))
1351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* if audio connected to this scb open sco */
1353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb))
1354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
1356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1357e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* else if no audio at call close sco */
1358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                else if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE)
1359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
1361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1363e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
13656ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        case BTA_AG_END_CALL_RES:
1366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* stop ring timer */
1367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_sys_stop_timer(&p_scb->act_timer);
13686ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
13696ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach            /* close sco */
1370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if ((bta_ag_sco_is_open(p_scb) || bta_ag_sco_is_opening(p_scb)) && !(p_scb->features & BTA_AG_FEAT_NOSCO))
1371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
1373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* if av got suspended by this call, let it resume. */
1377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_sys_sco_unuse(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
1378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_INBAND_RING_RES:
1382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_scb->inband_enabled = p_result->data.state;
1383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            APPL_TRACE_DEBUG1("inband_enabled set to %d", p_scb->inband_enabled);
1384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_UNAT_RES:
1387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_result->data.ok_flag != BTA_AG_OK_ERROR)
1388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (p_result->data.str[0] != 0)
1390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_send_result(p_scb, code, p_result->data.str, 0);
1392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1394e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (p_result->data.ok_flag == BTA_AG_OK_DONE)
1395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_send_ok(p_scb);
1396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR);
1400e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1403e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        default:
1404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* ignore all others */
1405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1409e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1410e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_hfp_result
1412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Handle API result for HFP connections.
14146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
1415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1416e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
1417e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_ag_hfp_result(tBTA_AG_SCB *p_scb, tBTA_AG_API_RESULT *p_result)
1420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8 code = bta_ag_trans_result[p_result->result];
1422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    APPL_TRACE_DEBUG1("bta_ag_hfp_result : res = %d", p_result->result);
1424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1425e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    switch(p_result->result)
1426e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_SPK_RES:
1428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_MIC_RES:
1429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_ag_send_result(p_scb, code, NULL, p_result->data.num);
1430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_IN_CALL_RES:
1433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* tell sys to stop av if any */
1434e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
14356ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
1436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* store caller id string.
1437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach             * append type info at the end.
1438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach             * make sure a valid type info is passed.
1439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach             * otherwise add 129 as default type */
1440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if ((p_result->data.num < BTA_AG_CLIP_TYPE_MIN) || (p_result->data.num > BTA_AG_CLIP_TYPE_MAX))
1441e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (p_result->data.num != BTA_AG_CLIP_TYPE_VOIP)
1443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    p_result->data.num = BTA_AG_CLIP_TYPE_DEFAULT;
1444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            APPL_TRACE_DEBUG1("CLIP type :%d", p_result->data.num);
1447e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_scb->clip[0] = 0;
1448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_result->data.str[0] != 0)
1449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                sprintf(p_scb->clip,"%s,%d", p_result->data.str, p_result->data.num);
1450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* send callsetup indicator */
1452e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_scb->post_sco == BTA_AG_POST_SCO_CALL_END)
1453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1454e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* Need to sent 2 callsetup IND's(Call End and Incoming call) after SCO close. */
1455e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_scb->post_sco = BTA_AG_POST_SCO_CALL_END_INCALL;
1456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1458e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1459e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_call_inds(p_scb, p_result->result);
1460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* if sco already opened or no inband ring send ring now */
1462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (bta_ag_sco_is_open(p_scb) || !bta_ag_inband_enabled(p_scb) ||
1463e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    (p_scb->features & BTA_AG_FEAT_NOSCO))
1464e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1465e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_send_ring(p_scb, (tBTA_AG_DATA *) p_result);
1466e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1467e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* else open sco, send ring after sco opened */
1468e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                else
1469e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1470e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    p_scb->post_sco = BTA_AG_POST_SCO_RING;
1471e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
1472e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1473e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1474e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1475e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_IN_CALL_CONN_RES:
1477e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* stop ring timer */
1478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_sys_stop_timer(&p_scb->act_timer);
1479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* if sco not opened and we need to open it, open sco first
1481e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            ** then send indicators
1482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            */
1483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb) &&
1484e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                !bta_ag_sco_is_open(p_scb) && !(p_scb->features & BTA_AG_FEAT_NOSCO))
1485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_scb->post_sco = BTA_AG_POST_SCO_CALL_CONN;
1487e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
1488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1489e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* else if sco open and we need to close it, close sco first
1490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            ** then send indicators
1491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            */
1492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE &&
1493e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                     bta_ag_sco_is_open(p_scb) && !(p_scb->features & BTA_AG_FEAT_NOSCO))
1494e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_scb->post_sco = BTA_AG_POST_SCO_CALL_CONN;
1496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
1497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1498e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* else send indicators now */
1499e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_call_inds(p_scb, p_result->result);
1502e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1505e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_IN_CALL_HELD_RES:
1506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* stop ring timer */
1507e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_sys_stop_timer(&p_scb->act_timer);
1508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1509e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_ag_send_call_inds(p_scb, p_result->result);
15106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
1511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
15126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
1513e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_OUT_CALL_ORIG_RES:
1514e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* if sco open and we need to close it, close sco first
1515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            ** then send indicators; else send indicators now
1516e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            */
1517e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE &&
1518e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_sco_is_open(p_scb) && !(p_scb->features & BTA_AG_FEAT_NOSCO))
1519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_scb->post_sco = BTA_AG_POST_SCO_CALL_ORIG;
1521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
1522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1524e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_call_inds(p_scb, p_result->result);
1526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb) &&
1527e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    !(p_scb->features & BTA_AG_FEAT_NOSCO))
1528e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1529e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
1530e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1531e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1532e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1533e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1534e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_OUT_CALL_ALERT_RES:
1535e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* send indicators */
1536e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_ag_send_call_inds(p_scb, p_result->result);
1537793a50c94f27855c9ed8a7a4f8df4c64eb6d4ef5Ravi Nagarajan            if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb) &&
1538793a50c94f27855c9ed8a7a4f8df4c64eb6d4ef5Ravi Nagarajan                !(p_scb->features & BTA_AG_FEAT_NOSCO))
1539793a50c94f27855c9ed8a7a4f8df4c64eb6d4ef5Ravi Nagarajan            {
1540793a50c94f27855c9ed8a7a4f8df4c64eb6d4ef5Ravi Nagarajan                bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
1541793a50c94f27855c9ed8a7a4f8df4c64eb6d4ef5Ravi Nagarajan            }
1542e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1543e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1544e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_OUT_CALL_CONN_RES:
1545e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* send indicators */
1546e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_ag_send_call_inds(p_scb, p_result->result);
1547e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1548e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* open or close sco */
1549e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (!(p_scb->features & BTA_AG_FEAT_NOSCO))
1550e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1551e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb))
1552e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1553e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
1554e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1555e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                else if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE)
1556e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1557e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
1558e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1559e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1560e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1561e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1562e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_CALL_CANCEL_RES:
1563e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* send indicators */
1564e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_ag_send_call_inds(p_scb, p_result->result);
1565e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1566e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
15676ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        case BTA_AG_END_CALL_RES:
1568e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* stop ring timer */
1569e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_sys_stop_timer(&p_scb->act_timer);
1570e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1571e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* if sco open, close sco then send indicator values */
1572e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if ((bta_ag_sco_is_open(p_scb) || bta_ag_sco_is_opening(p_scb)) && !(p_scb->features & BTA_AG_FEAT_NOSCO))
1573e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1574e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_scb->post_sco = BTA_AG_POST_SCO_CALL_END;
1575e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
1576e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1577e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else if (p_scb->post_sco == BTA_AG_POST_SCO_CALL_END_INCALL)
1578e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1579e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* sco closing for outgoing call because of incoming call */
1580e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* Send only callsetup end indicator after sco close */
1581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_scb->post_sco = BTA_AG_POST_SCO_CALL_END;
1582e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1583e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1584e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_call_inds(p_scb, p_result->result);
15866ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
1587e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* if av got suspended by this call, let it resume. */
1588e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_sys_sco_unuse(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
1589e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1590e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1591e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1592e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_INBAND_RING_RES:
1593e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_scb->inband_enabled = p_result->data.state;
1594e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            APPL_TRACE_DEBUG1("inband_enabled set to %d", p_scb->inband_enabled);
15956ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach            bta_ag_send_result(p_scb, code, NULL, p_result->data.state);
1596e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1597e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1598e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_CIND_RES:
1599e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* store local values */
1600e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_scb->call_ind = p_result->data.str[0] - '0';
1601e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_scb->callsetup_ind = p_result->data.str[2] - '0';
1602072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan            p_scb->service_ind = p_result->data.str[4] - '0';
1603072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan            p_scb->signal_ind = p_result->data.str[6] - '0';
1604072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan            p_scb->roam_ind = p_result->data.str[8] - '0';
1605072cb49cdba074895678f63def089e4be1026bb7Ravi Nagarajan            p_scb->battchg_ind = p_result->data.str[10] - '0';
1606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            APPL_TRACE_DEBUG2("cind call:%d callsetup:%d", p_scb->call_ind, p_scb->callsetup_ind);
1607e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
16086ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach            bta_ag_send_result(p_scb, code, p_result->data.str, 0);
16096ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach            bta_ag_send_ok(p_scb);
1610e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1611e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1612e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_BINP_RES:
16136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        case BTA_AG_CNUM_RES:
1614e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_CLCC_RES:
1615e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_COPS_RES:
1616e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_result->data.ok_flag != BTA_AG_OK_ERROR)
1617e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1618e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (p_result->data.str[0] != 0)
1619e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1620e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                   bta_ag_send_result(p_scb, code, p_result->data.str, 0);
1621e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1622e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1623e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (p_result->data.ok_flag == BTA_AG_OK_DONE)
1624e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_send_ok(p_scb);
1625e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1626e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1627e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1628e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_error(p_scb, p_result->data.errcode);
1629e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1630e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1631e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
16326ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
1633e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_UNAT_RES:
1634e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_result->data.ok_flag != BTA_AG_OK_ERROR)
1635e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1636e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (p_result->data.str[0] != 0)
1637e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1638e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_process_unat_res(p_result->data.str);
1639e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    APPL_TRACE_DEBUG1("BTA_AG_RES :%s",p_result->data.str);
1640e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_send_result(p_scb, code, p_result->data.str, 0);
1641e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1642e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1643e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (p_result->data.ok_flag == BTA_AG_OK_DONE)
1644e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_send_ok(p_scb);
1645e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1646e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1647e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1648e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_error(p_scb, p_result->data.errcode);
1649e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1650e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1651e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1652e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_CALL_WAIT_RES:
1653e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_scb->ccwa_enabled)
1654e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1655e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_result(p_scb, code, p_result->data.str, 0);
1656e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1657e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bta_ag_send_call_inds(p_scb, p_result->result);
1658e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1659e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1660e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_IND_RES:
16617ca15ca81eee23a930eecc9f388cc73b4efc1994Ravi Nagarajan            bta_ag_send_ind(p_scb, p_result->data.ind.id, p_result->data.ind.value, FALSE);
1662e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1663e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1664e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_BVRA_RES:
16656ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach            bta_ag_send_result(p_scb, code, NULL, p_result->data.state);
1666e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1667e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1668e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTA_AG_BTRH_RES:
1669e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_result->data.ok_flag != BTA_AG_OK_ERROR)
1670e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1671e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* Don't respond to read if not in response & hold state */
1672e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (p_result->data.num != BTA_AG_BTRH_NO_RESP)
1673e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
16746ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach                    bta_ag_send_result(p_scb, code, NULL, p_result->data.num);
1675e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1676e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1677e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* In case of a response to a read request we need to send OK */
1678e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (p_result->data.ok_flag == BTA_AG_OK_DONE)
1679e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    bta_ag_send_ok(p_scb);
1680e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1681e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
1682e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1683e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bta_ag_send_error(p_scb, p_result->data.errcode);
1684e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1685e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1686e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1687e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach       default:
1688e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1689e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1690e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1691e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1692e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1693e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1694e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1695e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_result
1696e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1697e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Handle API result.
16986ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
1699e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1700e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
1701e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1702e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1703e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_ag_result(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
1704e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1705e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_scb->conn_service == BTA_AG_HSP)
1706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        bta_ag_hsp_result(p_scb, &p_data->api_result);
1708e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1709e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
1710e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1711e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        bta_ag_hfp_result(p_scb, &p_data->api_result);
1712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1713e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1716e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_setcodec
1718e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1719e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Handle API SetCodec
17206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
1721e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1722e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
1723e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1724e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1725e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_ag_setcodec(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
1726e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_WBS_INCLUDED == TRUE )
1728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTA_AG_PEER_CODEC codec_type = p_data->api_setcodec.codec;
17296ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
1730e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Check if the requested codec type is valid */
1731e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if((codec_type != BTA_AG_CODEC_NONE) &&
17326ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach       (codec_type != BTA_AG_CODEC_CVSD) &&
1733e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach       (codec_type != BTA_AG_CODEC_MSBC))
1734e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1735e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        APPL_TRACE_ERROR1("bta_ag_setcodec error: unsupported codec type %d", codec_type);
1736e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
1737e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1738e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1739e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if((p_scb->peer_codecs & codec_type) || (codec_type == BTA_AG_CODEC_NONE) || (codec_type == BTA_AG_CODEC_CVSD))
1740e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1741e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_scb->sco_codec = codec_type;
1742e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_scb->codec_updated = TRUE;
1743e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        APPL_TRACE_DEBUG1("bta_ag_setcodec: Updated codec type %d", codec_type);
1744e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1745e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
1746e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1747e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        APPL_TRACE_ERROR1("bta_ag_setcodec error: unsupported codec type %d", codec_type);
1748e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1749e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1750e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1751e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1752e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1753e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_WBS_INCLUDED == TRUE )
1754e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1755e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1756e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_send_bcs
1757e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1758e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Send +BCS AT command to peer.
17596ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
1760e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
1761e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1762e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1763e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_ag_send_bcs(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
1764e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1765e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16 codec_uuid;
1766e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1767e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_scb->codec_fallback)
1768e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1769e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        codec_uuid = UUID_CODEC_CVSD;
1770e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1771e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
1772e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1773e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        switch(p_scb->sco_codec)
1774e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
1775e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            case BTA_AG_CODEC_NONE:     codec_uuid = UUID_CODEC_CVSD;   break;
1776e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            case BTA_AG_CODEC_CVSD:     codec_uuid = UUID_CODEC_CVSD;   break;
1777e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            case BTA_AG_CODEC_MSBC:     codec_uuid = UUID_CODEC_MSBC;   break;
1778e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            default:
1779e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                APPL_TRACE_ERROR1("bta_ag_send_bcs: unknown codec %d, use CVSD", p_scb->sco_codec);
1780e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                codec_uuid = UUID_CODEC_CVSD;
1781e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                break;
1782e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
1783e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1784e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1785e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* send +BCS */
1786e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bta_ag_send_result(p_scb, BTA_AG_RES_BCS, NULL, codec_uuid);
1787e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1788e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1789e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1790e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1791e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1792e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1793e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         bta_ag_send_ring
1794e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1795e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Send RING result code to peer.
17966ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
1797e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1798e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
1799e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1800e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1801e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_ag_send_ring(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
1802e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1803e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if defined(BTA_AG_MULTI_RESULT_INCLUDED) && (BTA_AG_MULTI_RESULT_INCLUDED == TRUE)
1804e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTA_AG_MULTI_RESULT_CB m_res_cb;
1805e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1806e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_scb->conn_service == BTA_AG_HFP && p_scb->clip_enabled && p_scb->clip[0] != 0)
1807e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1808e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        memset(&m_res_cb, NULL, sizeof(tBTA_AG_MULTI_RESULT_CB));
18096ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
1810e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        m_res_cb.num_result = 2;
1811e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        AT_SET_RES_CB(m_res_cb.res_cb[0], BTA_AG_RES_RING, NULL, 0)
1812e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        AT_SET_RES_CB(m_res_cb.res_cb[1], BTA_AG_RES_CLIP, p_scb->clip, 0)
18136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
1814e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        bta_ag_send_multi_result(p_scb, &m_res_cb);
1815e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1816e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
1817e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1818e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* send RING ONLY */
1819e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        bta_ag_send_result(p_scb, BTA_AG_RES_RING, NULL, 0);
1820e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1821e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
1822e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* send RING */
1823e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bta_ag_send_result(p_scb, BTA_AG_RES_RING, NULL, 0);
1824e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1825e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* if HFP and clip enabled and clip data send CLIP */
1826e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_scb->conn_service == BTA_AG_HFP && p_scb->clip_enabled && p_scb->clip[0] != 0)
1827e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1828e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        bta_ag_send_result(p_scb, BTA_AG_RES_CLIP, p_scb->clip, 0);
1829e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1830e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1831e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1832e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* restart ring timer */
1833e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bta_sys_start_timer(&p_scb->act_timer, BTA_AG_RING_TOUT_EVT, BTA_AG_RING_TOUT);
1834e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1835e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1836e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1837