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