13fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/****************************************************************************** 23fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 31025687c6679608fe9df918f37011414ffc72b62Hemant Gupta * Copyright (c) 2014 The Android Open Source Project 41025687c6679608fe9df918f37011414ffc72b62Hemant Gupta * Copyright (C) 2003-2012 Broadcom Corporation 53fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 63fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * Licensed under the Apache License, Version 2.0 (the "License"); 73fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * you may not use this file except in compliance with the License. 83fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * You may obtain a copy of the License at: 93fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * http://www.apache.org/licenses/LICENSE-2.0 113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * Unless required by applicable law or agreed to in writing, software 133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * distributed under the License is distributed on an "AS IS" BASIS, 143fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 153fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * See the License for the specific language governing permissions and 163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * limitations under the License. 173fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta ******************************************************************************/ 191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include <string.h> 201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include <stdio.h> 211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include <errno.h> 221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bta_hf_client_api.h" 231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bta_hf_client_int.h" 241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "port_api.h" 253fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* Uncomment to enable AT traffic dumping */ 271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* #define BTA_HF_CLIENT_AT_DUMP 1 */ 283fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* minimum length of AT event */ 301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_AT_EVENT_MIN_LEN 3 313fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* timeout for AT response */ 331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_AT_TIMEOUT 29989 341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* timeout for AT hold timer */ 361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_AT_HOLD_TIMEOUT 41 373fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 383fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/****************************************************************************** 393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** DATA TYPES AND CONTAINERS 413fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta*******************************************************************************/ 431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* BRSF: store received values here */ 441025687c6679608fe9df918f37011414ffc72b62Hemant Guptaextern tBTA_HF_CLIENT_CB bta_hf_client_cb; 451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/****************************************************************************** 471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** SUPPORTED EVENT MESSAGES 481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta*******************************************************************************/ 491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* CIND: supported indicator names */ 511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_INDICATOR_BATTERYCHG "battchg" 521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_INDICATOR_SIGNAL "signal" 531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_INDICATOR_SERVICE "service" 541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_INDICATOR_CALL "call" 551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_INDICATOR_ROAM "roam" 561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_INDICATOR_CALLSETUP "callsetup" 571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_INDICATOR_CALLHELD "callheld" 581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* CIND: represents each indicators boundaries */ 601025687c6679608fe9df918f37011414ffc72b62Hemant Guptatypedef struct 611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char* name; 631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT8 min; 641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT8 max; 651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT8 namelen; 661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} tBTA_HF_CLIENT_INDICATOR; 671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_AT_SUPPORTED_INDICATOR_COUNT 7 691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* CIND: storage room for indicators value range and their statuses */ 711025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic const tBTA_HF_CLIENT_INDICATOR bta_hf_client_indicators[BTA_HF_CLIENT_AT_SUPPORTED_INDICATOR_COUNT] = 721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* name | min | max | name length - used by parser */ 741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta {BTA_HF_CLIENT_INDICATOR_BATTERYCHG, 0, 5, sizeof(BTA_HF_CLIENT_INDICATOR_BATTERYCHG)}, 751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta {BTA_HF_CLIENT_INDICATOR_SIGNAL, 0, 5, sizeof(BTA_HF_CLIENT_INDICATOR_SIGNAL)}, 761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta {BTA_HF_CLIENT_INDICATOR_SERVICE, 0, 1, sizeof(BTA_HF_CLIENT_INDICATOR_SERVICE)}, 771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta {BTA_HF_CLIENT_INDICATOR_CALL, 0, 1, sizeof(BTA_HF_CLIENT_INDICATOR_CALL)}, 781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta {BTA_HF_CLIENT_INDICATOR_ROAM, 0, 1, sizeof(BTA_HF_CLIENT_INDICATOR_ROAM)}, 791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta {BTA_HF_CLIENT_INDICATOR_CALLSETUP, 0, 3, sizeof(BTA_HF_CLIENT_INDICATOR_CALLSETUP)}, 801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta {BTA_HF_CLIENT_INDICATOR_CALLHELD, 0, 2, sizeof(BTA_HF_CLIENT_INDICATOR_CALLHELD)} 811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta}; 821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* +VGM/+VGS - gain min/max values */ 841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_VGS_MIN 0 851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_VGS_MAX 15 861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_VGM_MIN 0 871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_VGM_MAX 15 881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 891025687c6679608fe9df918f37011414ffc72b62Hemant GuptaUINT32 service_index = 0; 901025687c6679608fe9df918f37011414ffc72b62Hemant GuptaBOOLEAN service_availability = TRUE; 911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* helper functions for handling AT commands queueing */ 921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 931025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_clear_queued_at(void) 943fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tBTA_HF_CLIENT_AT_QCMD *cur = bta_hf_client_cb.scb.at_cb.queued_cmd; 961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tBTA_HF_CLIENT_AT_QCMD *next; 971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta while (cur != NULL) { 991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta next = cur->next; 1001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta GKI_freebuf(cur); 1011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta cur = next; 1021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 1031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.queued_cmd = NULL; 1053fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 1063fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1071025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_queue_at(tBTA_HF_CLIENT_AT_CMD cmd, const char *buf, UINT16 buf_len) 1081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 1091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tBTA_HF_CLIENT_AT_QCMD *new_cmd; 1101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 111e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 1121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if ((new_cmd = (tBTA_HF_CLIENT_AT_QCMD *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_AT_QCMD))) != NULL) 1141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 1151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta new_cmd->cmd = cmd; 1161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta new_cmd->buf_len = buf_len; 1171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta new_cmd->next = NULL; 1181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta memcpy(new_cmd->buf, buf, buf_len); 1191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.at_cb.queued_cmd != NULL) 1211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 1221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tBTA_HF_CLIENT_AT_QCMD *qcmd = bta_hf_client_cb.scb.at_cb.queued_cmd; 1231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta while (qcmd->next != NULL) 1251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta qcmd = qcmd->next; 1261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta qcmd->next = new_cmd; 1281025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 1291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 1301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 1311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.queued_cmd = new_cmd; 1321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 1331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 1341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 1351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1361025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_at_resp_timer_cback (TIMER_LIST_ENT *p_tle) 1371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 1381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (p_tle) 1391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 1401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.resp_timer_on = FALSE; 1411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 142e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("HFPClient: AT response timeout, disconnecting"); 1431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_sm_execute(BTA_HF_CLIENT_API_CLOSE_EVT, NULL); 1451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 1461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 1471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1481025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_stop_at_resp_timer(void) 1491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 1501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.at_cb.resp_timer_on) 1511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 1521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.resp_timer_on = FALSE; 1531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_sys_stop_timer (&bta_hf_client_cb.scb.at_cb.resp_timer); 1541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 1551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 1561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1571025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_start_at_resp_timer(void) 1581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 1591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.at_cb.resp_timer_on) 1601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 1611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_sys_stop_timer (&bta_hf_client_cb.scb.at_cb.resp_timer); 1621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 1631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.resp_timer.p_cback = (TIMER_CBACK*)&bta_hf_client_at_resp_timer_cback; 1651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_sys_start_timer(&bta_hf_client_cb.scb.at_cb.resp_timer, 0, BTA_HF_CLIENT_AT_TIMEOUT); 1661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.resp_timer_on = TRUE; 1671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 1681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1691025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_send_at(tBTA_HF_CLIENT_AT_CMD cmd, char *buf, UINT16 buf_len) 1701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 1711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if ((bta_hf_client_cb.scb.at_cb.current_cmd == BTA_HF_CLIENT_AT_NONE || 1721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.svc_conn == FALSE) && 1731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.hold_timer_on == FALSE) 1741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 1751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT16 len; 1761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#ifdef BTA_HF_CLIENT_AT_DUMP 178e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %.*s", __FUNCTION__, buf_len - 1, buf); 1791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#endif 1801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.current_cmd = cmd; 1821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta PORT_WriteData(bta_hf_client_cb.scb.conn_handle, buf, buf_len, &len); 1831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_start_at_resp_timer(); 1851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 1871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 1881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_queue_at(cmd, buf, buf_len); 1901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 1911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1921025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_send_queued_at(void) 1931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 1941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tBTA_HF_CLIENT_AT_QCMD *cur = bta_hf_client_cb.scb.at_cb.queued_cmd; 1951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tBTA_HF_CLIENT_AT_QCMD *next; 1961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 197e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 1981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (cur != NULL) 2001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 2011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta next = cur->next; 2021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(cur->cmd, cur->buf, cur->buf_len); 2041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta GKI_freebuf(cur); 2061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.queued_cmd = next; 2081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 2091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 2101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2111025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_at_hold_timer_cback(TIMER_LIST_ENT *p_tle) 2121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 213e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 2141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (p_tle) 2161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 2171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.hold_timer_on = FALSE; 2181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_queued_at(); 2191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 2201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 2211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2221025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_stop_at_hold_timer(void) 2231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 224e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 2251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.at_cb.hold_timer_on) 2271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 2281025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.hold_timer_on = FALSE; 2291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_sys_stop_timer (&bta_hf_client_cb.scb.at_cb.hold_timer); 2301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 2311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 2321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2331025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_start_at_hold_timer(void) 2343fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 2351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta TIMER_LIST_ENT *timer = &bta_hf_client_cb.scb.at_cb.hold_timer; 2361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 237e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 2381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.at_cb.hold_timer_on) 2403fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 2411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_sys_stop_timer (timer); 2423fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 2431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta timer->p_cback = (TIMER_CBACK*)&bta_hf_client_at_hold_timer_cback; 2451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_sys_start_timer(timer, 0, BTA_HF_CLIENT_AT_HOLD_TIMEOUT); 2461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.hold_timer_on = TRUE; 2473fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 2481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2493fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/****************************************************************************** 2503fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** COMMON AT EVENT HANDLING FUNCTIONS 2523fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Receives data (strings, ints, etc.) from the parser and processes this data. 2541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** No buffer parsing is being done here. 2551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta*******************************************************************************/ 2561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2571025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_ok() 2583fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 259e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 2601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_stop_at_resp_timer(); 2621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (!bta_hf_client_cb.scb.svc_conn) 2643fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 2651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_slc_seq(FALSE); 2661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 2671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 2681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta switch(bta_hf_client_cb.scb.at_cb.current_cmd) 2701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 2711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTA_HF_CLIENT_AT_BIA: 2721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTA_HF_CLIENT_AT_BCC: 2731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta break; 2741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTA_HF_CLIENT_AT_BCS: 2751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_start_at_hold_timer(); 2761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.current_cmd = BTA_HF_CLIENT_AT_NONE; 2771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 2781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTA_HF_CLIENT_AT_CLIP: //last cmd is post slc seq 2791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.send_at_reply == FALSE) 2801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 2811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.send_at_reply = TRUE; 2821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 2831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta break; 2841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTA_HF_CLIENT_AT_NONE: 2851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_stop_at_hold_timer(); 2861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta break; 2871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta default: 2881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.send_at_reply) 2891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 2901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_at_result(BTA_HF_CLIENT_AT_RESULT_OK, 0); 2911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 2923fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta break; 2933fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 2943fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.current_cmd = BTA_HF_CLIENT_AT_NONE; 2961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_queued_at(); 2981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 2991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 3001025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_error(tBTA_HF_CLIENT_AT_RESULT_TYPE type, UINT16 cme) 3011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 302e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %u %u", __FUNCTION__, type, cme); 3031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 3041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_stop_at_resp_timer(); 3051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 3061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (!bta_hf_client_cb.scb.svc_conn) 3073fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 3081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_slc_seq(TRUE); 3091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 3101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 3113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta switch(bta_hf_client_cb.scb.at_cb.current_cmd) 3131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 3141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTA_HF_CLIENT_AT_BIA: 3151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta break; 3161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTA_HF_CLIENT_AT_BCC: 3171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTA_HF_CLIENT_AT_BCS: 3181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cback_sco(BTA_HF_CLIENT_AUDIO_CLOSE_EVT); 3191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta break; 3201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTA_HF_CLIENT_AT_CLIP: //last cmd is post slc seq 3211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.send_at_reply == FALSE) 3223fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 3231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.send_at_reply = TRUE; 3243fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 3251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta break; 3261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta default: 3271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.send_at_reply) 3283fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 3291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_at_result(type, cme); 3303fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 3311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta break; 3321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 3331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 3341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.current_cmd = BTA_HF_CLIENT_AT_NONE; 3351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 3361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_queued_at(); 3371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 3381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 3391025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_ring() 3401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 341e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 3421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_evt_val(BTA_HF_CLIENT_RING_INDICATION,0); 3431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 3441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 3451025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_brsf(UINT32 value) 3461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 347e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s 0x%x", __FUNCTION__, value); 3481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.peer_features = value; 3491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 3501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 3511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* handles a single indicator descriptor - registers it for value changing events */ 3521025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_cind_list_item(char *name, UINT32 min, UINT32 max, UINT32 index) 3531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 3541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 3551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT8 i = 0; 3561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 357e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %lu.%s <%lu:%lu>", __FUNCTION__, index, name, min, max); 3581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 3591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* look for a matching indicator on list of supported ones */ 3601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta for(i = 0; i < BTA_HF_CLIENT_AT_SUPPORTED_INDICATOR_COUNT; i++) 3611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 3621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (strcmp(name,BTA_HF_CLIENT_INDICATOR_SERVICE) == 0) 3633fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 3641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta service_index = index; 3653fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 3661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* look for a match - search one sign further than indicators name to check for string end */ 3671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* It will distinguish 'callheld' which could be matched by strncmp as 'call'. */ 3681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (strncmp(name, bta_hf_client_indicators[i].name, bta_hf_client_indicators[i].namelen) != 0) 3691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta continue; 3701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 3711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* index - enumerates value position in the incoming sequence */ 3721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* if name matches one of the known indicators, add its incoming position */ 3731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* to lookup table for easy value->indicator matching later, when only values come */ 3741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.indicator_lookup[index] = i; 3751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 3761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 3771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 3781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 3791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 3801025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_cind_value(UINT32 index, UINT32 value) 3811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 382e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s index: %u value: %u", __FUNCTION__, index, value); 3831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 3841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (index >= BTA_HF_CLIENT_AT_INDICATOR_COUNT) 3851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 3861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 3871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 3883fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (service_index == index) 3901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 3911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (value == 0) 3923fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 3931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta service_availability = FALSE; 3943fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 3953fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta else 3963fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 3971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta service_availability = TRUE; 3983fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 3993fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 4001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.at_cb.indicator_lookup[index] == -1) 4013fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 4021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 4033fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 4041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 4051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* get the real array index from lookup table */ 4061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta index = bta_hf_client_cb.scb.at_cb.indicator_lookup[index]; 4071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 4081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* Ignore out of range values */ 4091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(value > bta_hf_client_indicators[index].max || 4101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta value < bta_hf_client_indicators[index].min) 4111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 4121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 4131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 4141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 4151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* tBTA_HF_CLIENT_IND_TYPE match index in bta_hf_client_indicators */ 4161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_ind(index, value); 4173fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 4183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 4191025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_chld(UINT32 mask) 4201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 421e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s 0x%x", __FUNCTION__, mask); 4221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 4231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.chld_features |= mask; 4241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 4251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 4261025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_ciev(UINT32 index, UINT32 value) 4273fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 4281025687c6679608fe9df918f37011414ffc72b62Hemant Gupta INT8 realind = -1; 4291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 430e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s index: %u value: %u", __FUNCTION__, index, value); 4313fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 4321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(index == 0 || index >= BTA_HF_CLIENT_AT_INDICATOR_COUNT) 4333fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 4341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 4353fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 4363fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 4371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta realind = bta_hf_client_cb.scb.at_cb.indicator_lookup[index - 1]; 4381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 4391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(realind >= 0 && realind < BTA_HF_CLIENT_AT_SUPPORTED_INDICATOR_COUNT) 4403fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 4411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* get the real in-array index from lookup table by index it comes at */ 4421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* if there is no bug it should automatically be correctly calculated */ 4431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(value > bta_hf_client_indicators[realind].max || value < bta_hf_client_indicators[realind].min) 4443fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 4451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 4461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 4473fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 4481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* tBTA_HF_CLIENT_IND_TYPE match index in bta_hf_client_indicators */ 4491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_ind(realind, value); 4501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 4511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 4523fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 4531025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_bcs(UINT32 codec) 4541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 455e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %u", __FUNCTION__, codec); 4561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 4571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (codec == BTM_SCO_CODEC_CVSD || 4581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta (codec == BTM_SCO_CODEC_MSBC && bta_hf_client_cb.msbc_enabled == TRUE)) 4591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 4601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.negotiated_codec = codec; 4611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at_bcs(codec); 4621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 4631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 4641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 4651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.negotiated_codec = BTM_SCO_CODEC_CVSD; 4661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at_bac(); 4671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 4681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 4691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 4701025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_bsir(UINT32 provided) 4711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 472e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %u", __FUNCTION__, provided); 4731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 4741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_evt_val(BTA_HF_CLIENT_BSIR_EVT, provided); 4751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 4761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 4771025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_cmeerror(UINT32 code) 4781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 4791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_CME, code); 4801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 4811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 4821025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_vgm(UINT32 value) 4831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 484e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %lu", __FUNCTION__, value); 4851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 4861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(value <= BTA_HF_CLIENT_VGM_MAX) 4871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 4881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_evt_val(BTA_HF_CLIENT_MIC_EVT, value); 4891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 4901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 4911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 4921025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_vgs(UINT32 value) 4931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 494e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %lu", __FUNCTION__, value); 4951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 4961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(value <= BTA_HF_CLIENT_VGS_MAX) 4971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 4981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_evt_val(BTA_HF_CLIENT_SPK_EVT, value); 4991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 5001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 5013fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 5021025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_bvra(UINT32 value) 5031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 504e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %lu", __FUNCTION__, value); 5051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (value > 1) 5071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 5081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 5091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 5101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_evt_val(BTA_HF_CLIENT_VOICE_REC_EVT, value); 5121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 5131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5141025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_clip(char *numstr, UINT32 type) 5151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 516e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %u %s", __FUNCTION__, type, numstr); 5171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_clip(numstr); 5191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 5201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5211025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_ccwa(char *numstr, UINT32 type) 5221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 523e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %u %s", __FUNCTION__, type, numstr); 5241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_ccwa(numstr); 5261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 5271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5281025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_cops(char *opstr, UINT32 mode) 5291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 530e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %u %s", __FUNCTION__, mode, opstr); 5311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_operator_name(opstr); 5331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 5341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5351025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_binp(char *numstr) 5361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 537e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %s", __FUNCTION__, numstr); 5381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_binp(numstr); 5401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 5411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5421025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_clcc(UINT16 idx, UINT16 dir, UINT16 status, UINT16 mode, UINT16 mpty, char *numstr, UINT16 type) 5431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 544e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s idx: %u dir: %u status: %u mode: %u mpty: %u", 5451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta __FUNCTION__, idx, dir, status, mode, mpty); 5461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (numstr) 5481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 549e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s number: %s type: %u", __FUNCTION__, numstr, type); 5503fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 5511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_clcc(idx, dir, status, mpty, numstr); 5531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 5541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5551025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_cnum( char *numstr, UINT16 type, UINT16 service) 5561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 557e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s number: %s type: %u service: %u", __FUNCTION__, numstr, type, service); 5581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* TODO: should number be modified according to type? */ 5601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cnum(numstr, service); 5613fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 5623fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 5631025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_handle_btrh( UINT16 code) 5641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 565e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %lu", __FUNCTION__, code); 5661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_evt_val(BTA_HF_CLIENT_BTRH_EVT, code); 5681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 5691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/****************************************************************************** 5711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** 5721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** COMMON AT EVENTS PARSING FUNCTIONS 5731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** 5741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta*******************************************************************************/ 5751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* Check if prefix match and skip spaces if any */ 5771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define AT_CHECK_EVENT(buf, event) \ 5781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (strncmp("\r\n"event, buf,sizeof("\r\n"event) - 1) != 0) return buf; \ 5791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf += sizeof("\r\n"event) - 1; \ 5801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta while (*buf == ' ') buf++; 5811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* check for <cr><lf> and forward buffer if match */ 5831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define AT_CHECK_RN(buf) \ 5841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (strncmp("\r\n", buf, sizeof("\r\n") - 1) != 0) { \ 585e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s missing end <cr><lf>", __FUNCTION__); \ 5861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL;} \ 5871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf += sizeof("\r\n") - 1; 5881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* skip rest of AT string up to <cr> */ 5901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define AT_SKIP_REST(buf) while(*buf != '\r') buf++; 5911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5921025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_ok(char *buffer) 5931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 5941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "OK"); 5951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 5961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_ok(); 5981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 5991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 6001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 6011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6021025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_error(char *buffer) 6031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 6041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "ERROR"); 6051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 6061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_ERROR, 0); 6081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 6101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 6111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6121025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_ring(char *buffer) 6131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 6141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "RING"); 6151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 6161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_ring(); 6181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 6201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 6211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* generic uint32 parser */ 6231025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_uint32(char *buffer, void (*handler_callback)(UINT32)) 6241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 6251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT32 value; 6261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int res; 6271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int offset; 6281025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta res = sscanf(buffer, "%u%n", &value, &offset); 6301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (res < 1) 6311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 6321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 6331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 6341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer += offset; 6361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 6381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta handler_callback(value); 6401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 6411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 6421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6431025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_brsf(char *buffer) 6441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 6451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+BRSF:"); 6461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_brsf); 6481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 6491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6501025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_cind_values(char *buffer) 6511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 6521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* value and its position */ 6531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT16 index = 0; 6541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT32 value = 0; 6551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int offset; 6571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int res; 6581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta while((res = sscanf(buffer, "%u%n", &value, &offset)) > 0) 6601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 6611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* decides if its valid index and value, if yes stores it */ 6621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_cind_value(index, value); 6631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer += offset; 6651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* check if more values are present */ 6671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (*buffer != ',') 6681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 6691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta break; 6701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 6711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta index++; 6731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer++; 6741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 6751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (res > 0) 6771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 6781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 6791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 6801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 6811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 6831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 6841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6851025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_cind_list(char *buffer) 6861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 6871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int offset; 6881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char name[129]; 6891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT32 min, max; 6901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT32 index = 0; 6911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int res; 6921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta while ((res = sscanf(buffer, "(\"%128[^\"]\",(%u%*[-,]%u))%n", name, &min, &max, &offset)) > 2) 6941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 6951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_cind_list_item(name, min, max, index); 6961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer += offset; 6971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta index++; 6981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (*buffer != ',') 7001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 7011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta break; 7021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 7031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer++; 7051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 7061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (res > 2) 7081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 7091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 7101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 7111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 7121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 7141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 7151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7161025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_cind(char *buffer) 7171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 7181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+CIND:"); 7191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(*buffer == '(') 7211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return bta_hf_client_parse_cind_list(buffer); 7221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return bta_hf_client_parse_cind_values(buffer); 7241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 7251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7261025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_chld(char *buffer) 7271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 7281025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+CHLD:"); 7291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (*buffer != '(') 7311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 7321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 7331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 7341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer++; 7361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta while(*buffer != '\0') 7381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 7391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(strncmp("0",buffer, 1) == 0) 7401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 7411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_REL); 7421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer++; 7431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 7441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else if(strncmp("1x",buffer, 2) == 0) 7451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 7461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_REL_X); 7471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer += 2; 7481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 7491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else if(strncmp("1",buffer, 1) == 0) 7501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 7511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_REL_ACC); 7521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer++; 7531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 7541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else if(strncmp("2x",buffer, 2) == 0) 7551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 7561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_PRIV_X); 7571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer += 2; 7581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 7591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else if(strncmp("2",buffer, 1) == 0) 7601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 7611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_HOLD_ACC); 7621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer++; 7631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 7641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else if(strncmp("3",buffer, 1) == 0) 7651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 7661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_MERGE); 7671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer++; 7681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 7691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else if(strncmp("4",buffer, 1) == 0) 7701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 7711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_MERGE_DETACH); 7721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer++; 7731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 7741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 7751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 7761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 7771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 7781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (*buffer == ',') 7801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 7811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer++; 7821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta continue; 7831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 7841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (*buffer == ')') 7861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 7871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer++; 7881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta break; 7891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 7901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 7921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 7931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 7951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 7971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 7981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7991025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_ciev(char *buffer) 8001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 8011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT32 index, value; 8021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int res; 8031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int offset; 8041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+CIEV:"); 8061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta res = sscanf(buffer, "%u,%u%n", &index, &value, &offset); 8081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(res < 2) 8091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 8101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 8111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 8121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer += offset; 8141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 8161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_ciev(index, value); 8181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 8191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 8201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8211025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_bcs(char *buffer) 8221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 8231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+BCS:"); 8241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_bcs); 8261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 8271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8281025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_bsir(char *buffer) 8291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 8301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+BSIR:"); 8311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_bsir); 8331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 8341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8351025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_cmeerror(char *buffer) 8361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 8371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+CME ERROR:"); 8381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_cmeerror); 8401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 8411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8421025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_vgm(char *buffer) 8431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 8441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+VGM:"); 8451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_vgm); 8471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 8481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8491025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_vgme(char *buffer) 8501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 8511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+VGM="); 8521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_vgm); 8541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 8551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8561025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_vgs(char *buffer) 8571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 8581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+VGS:"); 8591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_vgs); 8611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 8621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8631025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_vgse(char *buffer) 8641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 8651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+VGS="); 8661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_vgs); 8681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 8691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8701025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_bvra(char *buffer) 8711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 8721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+BVRA:"); 8731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_bvra); 8751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 8761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8771025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_clip(char *buffer) 8781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 8791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* spec forces 32 chars, plus \0 here */ 8801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char number[33]; 8811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT32 type = 0; 8821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int res; 8831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int offset; 8841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+CLIP:"); 8861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* there might be something more after %lu but HFP doesn't care */ 8881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta res = sscanf(buffer, "\"%32[^\"]\",%u%n", number, &type, &offset); 8891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(res < 2) 8901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 8911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 8921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 8931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer += offset; 8951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_SKIP_REST(buffer); 8971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 8981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 8991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_clip(number, type); 9011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 9021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 9031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* in HFP context there is no difference between ccwa and clip */ 9051025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_ccwa(char *buffer) 9061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 9071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* ac to spec 32 chars max, plus \0 here */ 9081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char number[33]; 9091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT32 type = 0; 9101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int res ; 9111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int offset; 9121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+CCWA:"); 9141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* there might be something more after %lu but HFP doesn't care */ 9161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta res = sscanf(buffer, "\"%32[^\"]\",%u%n", number, &type, &offset); 9171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(res < 2) 9181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 9191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 9201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 9211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer += offset; 9231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_SKIP_REST(buffer); 9251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 9271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9281025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_ccwa(number, type); 9291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 9301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 9311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9321025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_cops(char *buffer) 9331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 9341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT8 mode; 9351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* spec forces 16 chars max, plus \0 here */ 9361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char opstr[17]; 9371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int res; 9381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int offset; 9391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+COPS:"); 9411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* TODO: Not sure if operator string actually can contain escaped " char inside */ 9431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta res = sscanf(buffer, "%hhi,0,\"%16[^\"]\"%n", &mode, opstr, &offset); 9441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(res < 2) 9451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 9461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 9471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 9481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer += offset; 9501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_SKIP_REST(buffer); 9521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 9541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_cops(opstr, mode); 9561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 9571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 9581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9591025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_binp(char *buffer) 9601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 9611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* HFP only supports phone number as BINP data */ 9621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* phone number is 32 chars plus one for \0*/ 9631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char numstr[33]; 9641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int res; 9651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int offset; 9661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+BINP:"); 9681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta res = sscanf(buffer, "\"%32[^\"]\"\r\n%n", numstr, &offset); 9701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(res < 1) 9711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 9721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 9731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 9741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer += offset; 9761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* some phones might sent type as well, just skip it */ 9781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_SKIP_REST(buffer); 9791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 9811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_binp(numstr); 9831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 9841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 9851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9861025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_clcc(char *buffer) 9871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 9881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT16 idx, dir, status, mode, mpty; 9891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char numstr[33]; /* spec forces 32 chars, plus one for \0*/ 9901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT16 type; 9911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int res; 9921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int offset; 9931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+CLCC:"); 9951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 9961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta res = sscanf(buffer, "%hu,%hu,%hu,%hu,%hu%n", 9971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta &idx, &dir, &status, &mode, &mpty, &offset); 9981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (res < 5) 9991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 10001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 10011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 10021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer += offset; 10041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* check optional part */ 10061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (*buffer == ',') 10071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 10081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int res2; 10091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta res2 = sscanf(buffer, ",\"%32[^\"]\",%hu%n", numstr, &type, &offset); 10111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (res2 < 0) 10121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 10131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 10141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 10151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (res2 == 0) 10171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 10181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta res2 = sscanf(buffer, ",\"\",%hu%n", &type, &offset); 10191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (res < 0) 10201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 10211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 10221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 10231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* numstr is not matched in second attempt, correct this */ 10251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta res2++; 10261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta numstr[0] = '\0'; 10271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 10281025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (res2 < 2) 10301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 10311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 10321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 10331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta res += res2; 10351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer += offset; 10361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 10371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 10391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(res > 6) 10411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 10421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* we also have last two optional parameters */ 10431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_clcc(idx, dir, status, mode, mpty, numstr, type); 10441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 10451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 10461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 10471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* we didn't get the last two parameters */ 10481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_clcc(idx, dir, status, mode, mpty, NULL, 0); 10491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 10501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 10521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 10531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10541025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_cnum(char *buffer) 10551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 10561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char numstr[33]; /* spec forces 32 chars, plus one for \0*/ 10571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT16 type; 10581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT16 service = 0; /* 0 in case this optional parameter is not being sent */ 10591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int res; 10601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int offset; 10611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+CNUM:"); 10631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta res = sscanf(buffer, ",\"%32[^\"]\",%hu,,%hu%n", numstr, &type, &service, &offset); 10651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(res < 0) 10661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 10671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 10681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 10691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (res == 0) 10711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 10721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta res = sscanf(buffer, ",\"\",%hu,,%hu%n", &type, &service, &offset); 10731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (res < 0) 10741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 10751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 10761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 10771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* numstr is not matched in second attempt, correct this */ 10791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta res++; 10801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta numstr[0] = '\0'; 10811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 10821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (res < 3) 10841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 10851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 10861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 10871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer += offset; 10891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 10911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* service is optional */ 10931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(res == 2) 10941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 10951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_cnum(numstr, type, service); 10961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 10971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 10981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 10991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (service != 4 && service != 5) 11001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 11011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 11021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 11031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_cnum(numstr, type, service); 11051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 11061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 11071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11081025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_btrh(char *buffer) 11091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 11101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT16 code = 0; 11111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int res; 11121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int offset; 11131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "+BTRH:"); 11151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta res = sscanf(buffer, "%hu%n", &code, &offset); 11171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(res < 1) 11181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 11191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 11201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 11211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer += offset; 11231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 11251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_btrh(code); 11271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 11281025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 11291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11301025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_busy(char *buffer) 11311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 11321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "BUSY"); 11331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 11341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_BUSY, 0); 11361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 11381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 11391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11401025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_delayed(char *buffer) 11411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 11421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "DELAYED"); 11431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 11441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_DELAY, 0); 11461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 11481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 11491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11501025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_no_carrier(char *buffer) 11511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 11521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "NO CARRIER"); 11531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 11541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_NO_CARRIER, 0); 11561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 11581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 11591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11601025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_no_answer(char *buffer) 11611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 11621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "NO ANSWER"); 11631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 11641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_NO_ANSWER, 0); 11661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 11681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 11691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11701025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_parse_blacklisted(char *buffer) 11711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 11721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_EVENT(buffer, "BLACKLISTED"); 11731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta AT_CHECK_RN(buffer); 11741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_BLACKLISTED, 0); 11761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 11781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 11791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11801025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic char *bta_hf_client_skip_unknown(char *buffer) 11811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 11821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *start; 11831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *tmp; 11841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tmp = strstr(buffer, "\r\n"); 11861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (tmp == NULL) 11871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 11881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 11891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 11901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer += 2; 11921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta start = buffer; 11931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tmp = strstr(buffer, "\r\n"); 11951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (tmp == NULL) 11961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 11971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return NULL; 11981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 11991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 12001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buffer = tmp + 2; 12011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1202e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %.*s", __FUNCTION__, buffer - start - 2, start); 12031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 12041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return buffer; 12051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 12061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 12071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 12081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/****************************************************************************** 12091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** SUPPORTED EVENT MESSAGES 12101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta*******************************************************************************/ 12111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 12121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* returned values are as follow: 12131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta * != NULL && != buf : match and parsed ok 12141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta * == NULL : match but parse failed 12151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta * != NULL && == buf : no match 12161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta */ 12171025687c6679608fe9df918f37011414ffc72b62Hemant Guptatypedef char* (*tBTA_HF_CLIENT_PARSER_CALLBACK)(char*); 12181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 12191025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic const tBTA_HF_CLIENT_PARSER_CALLBACK bta_hf_client_parser_cb[] = 12201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 12211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_ok, 12221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_error, 12231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_ring, 12241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_brsf, 12251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_cind, 12261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_ciev, 12271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_chld, 12281025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_bcs, 12291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_bsir, 12301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_cmeerror, 12311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_vgm, 12321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_vgme, 12331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_vgs, 12341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_vgse, 12351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_bvra, 12361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_clip, 12371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_ccwa, 12381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_cops, 12391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_binp, 12401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_clcc, 12411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_cnum, 12421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_btrh, 12431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_busy, 12441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_delayed, 12451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_no_carrier, 12461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_no_answer, 12471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_parse_blacklisted, 12481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_skip_unknown 12491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta}; 12501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 12511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/* calculate supported event list length */ 12521025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic const UINT16 bta_hf_client_psraser_cb_count = 12531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta sizeof(bta_hf_client_parser_cb) / sizeof(bta_hf_client_parser_cb[0]); 12541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 12551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#ifdef BTA_HF_CLIENT_AT_DUMP 12561025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_dump_at(void) 12571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 12581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char dump[(4 * BTA_HF_CLIENT_AT_PARSER_MAX_LEN) + 1]; 12591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *p1, *p2; 12601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 12611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta p1 = bta_hf_client_cb.scb.at_cb.buf; 12621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta p2 = dump; 12631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 12641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta while (*p1 != '\0') 12651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 12661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (*p1 == '\r') 12671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 12681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta strlcpy(p2, "<cr>", 4); 12691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta p2 += 4; 12701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 12711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else if (*p1 == '\n') 12721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 12731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta strlcpy(p2, "<lf>", 4); 12741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta p2 += 4; 12751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 12761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 12771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 12781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta *p2 = *p1; 12791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta p2++; 12801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 12811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta p1++; 12821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 12831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 12841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta *p2 = '\0'; 12851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1286e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %s", __FUNCTION__, dump); 12871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 12881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#endif 12891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 12901025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_at_parse_start(void) 12911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 12921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *buf = bta_hf_client_cb.scb.at_cb.buf; 12931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1294e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 12951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 12961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#ifdef BTA_HF_CLIENT_AT_DUMP 12971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_dump_at(); 12981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#endif 12991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 13001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta while(*buf != '\0') 13011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 13021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int i; 13031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *tmp = NULL; 13041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 13051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta for(i = 0; i < bta_hf_client_psraser_cb_count; i++) 13061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 13071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tmp = bta_hf_client_parser_cb[i](buf); 13081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (tmp == NULL) 13091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 1310e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("HFPCient: AT event/reply parsing failed, skipping"); 13111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tmp = bta_hf_client_skip_unknown(buf); 13121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta break; 13131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 13141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 13151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* matched or unknown skipped, if unknown failed tmp is NULL so 13161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta this is also handled */ 13171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (tmp != buf) 13181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 13191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = tmp; 13201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta break; 13211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 13221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 13231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 13241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* could not skip unknown (received garbage?)... disconnect */ 13251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (tmp == NULL) 13261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 1327e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("HFPCient: could not skip unknown AT event, disconnecting"); 13281025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_at_reset(); 13291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_sm_execute(BTA_HF_CLIENT_API_CLOSE_EVT, NULL); 13301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 13311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 13321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 13331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = tmp; 13341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 13351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 13361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 13371025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic BOOLEAN bta_hf_client_check_at_complete(void) 13381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 13391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta BOOLEAN ret = FALSE; 13401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tBTA_HF_CLIENT_AT_CB *at_cb = &bta_hf_client_cb.scb.at_cb; 13411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 13421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (at_cb->offset >= BTA_HF_CLIENT_AT_EVENT_MIN_LEN) 13431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 13441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (at_cb->buf[at_cb->offset - 2] == '\r' && at_cb->buf[at_cb->offset - 1] == '\n') 13451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 13461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta ret = TRUE; 13471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 13481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 13491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1350e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %d", __FUNCTION__, ret); 13511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 13521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return ret; 13531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 13541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 13551025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_at_clear_buf(void) 13561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 13571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta memset(bta_hf_client_cb.scb.at_cb.buf, 0, sizeof(bta_hf_client_cb.scb.at_cb.buf)); 13581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.offset = 0; 13591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 13601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 13611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/****************************************************************************** 13621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** 13631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** MAIN PARSING FUNCTION 13641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** 13651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** 13661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta*******************************************************************************/ 13671025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_at_parse(char *buf, unsigned int len) 13681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 1369e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s offset: %u len: %u", __FUNCTION__, bta_hf_client_cb.scb.at_cb.offset, len); 13701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 13711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (len + bta_hf_client_cb.scb.at_cb.offset > BTA_HF_CLIENT_AT_PARSER_MAX_LEN) 13721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 13731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char tmp_buff[BTA_HF_CLIENT_AT_PARSER_MAX_LEN]; 13741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta unsigned int tmp = bta_hf_client_cb.scb.at_cb.offset; 13751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta unsigned int space_left = BTA_HF_CLIENT_AT_PARSER_MAX_LEN - bta_hf_client_cb.scb.at_cb.offset; 13761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1377e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s overrun, trying to recover", __FUNCTION__); 13781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 13791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* fill up parser buffer */ 13801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta memcpy(bta_hf_client_cb.scb.at_cb.buf + bta_hf_client_cb.scb.at_cb.offset, buf, space_left); 13811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta len -= space_left; 13821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf += space_left; 13831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.offset += space_left; 13841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 13851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* find end of last complete command before proceeding */ 13861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta while(bta_hf_client_check_at_complete() == FALSE) 13871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 13881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.at_cb.offset == 0) { 1389e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("HFPClient: AT parser buffer overrun, disconnecting"); 13901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 13911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_at_reset(); 13921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_sm_execute(BTA_HF_CLIENT_API_CLOSE_EVT, NULL); 13931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 13941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 13951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 13961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.offset--; 13971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 13981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 13991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* cut buffer to complete AT event and keep cut data */ 14001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tmp += space_left - bta_hf_client_cb.scb.at_cb.offset; 14011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta memcpy(tmp_buff, bta_hf_client_cb.scb.at_cb.buf + bta_hf_client_cb.scb.at_cb.offset, tmp); 14021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.buf[bta_hf_client_cb.scb.at_cb.offset] = '\0'; 14031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* parse */ 14051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_at_parse_start(); 14061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_at_clear_buf(); 14071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* recover cut data */ 14091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta memcpy(bta_hf_client_cb.scb.at_cb.buf, tmp_buff, tmp); 14101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.offset += tmp; 14111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 14121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta memcpy(bta_hf_client_cb.scb.at_cb.buf + bta_hf_client_cb.scb.at_cb.offset, buf, len); 14141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.offset += len; 14151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* If last event is complete, parsing can be started */ 14171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_check_at_complete() == TRUE) 14181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 14191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_at_parse_start(); 14201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_at_clear_buf(); 14211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 14221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 14231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14241025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_brsf(void) 14251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 14261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char buf[BTA_HF_CLIENT_AT_MAX_LEN]; 14271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int at_len; 14281025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1429e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 14301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta at_len = snprintf(buf, sizeof(buf), "AT+BRSF=%u\r", bta_hf_client_cb.scb.features); 14321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_BRSF , buf, at_len); 14341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 14351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14361025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_bac(void) 14371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 14381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *buf; 14391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1440e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 14411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.msbc_enabled) 14431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 14441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+BAC=1,2\r"; 14451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 14461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 14471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 14481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+BAC=1\r"; 14491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 14501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_BAC, buf, strlen(buf)); 14521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 14531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14541025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_bcs(UINT32 codec) 14551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 14561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char buf[BTA_HF_CLIENT_AT_MAX_LEN]; 14571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int at_len; 14581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1459e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 14601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta at_len = snprintf(buf, sizeof(buf), "AT+BCS=%u\r", codec); 14621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_BCS, buf, at_len); 14641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 14651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14661025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_cind(BOOLEAN status) 14671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 14681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *buf; 14691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tBTA_HF_CLIENT_AT_CMD cmd; 14701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1471e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 14721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (status) 14741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 14751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+CIND?\r"; 14761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta cmd = BTA_HF_CLIENT_AT_CIND_STATUS; 14771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 14781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 14791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 14801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+CIND=?\r"; 14811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta cmd = BTA_HF_CLIENT_AT_CIND; 14821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 14831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(cmd, buf, strlen(buf)); 14851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 14861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14871025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_cmer(BOOLEAN activate) 14881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 14891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *buf; 14901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1491e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 14921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (activate) 14941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+CMER=3,0,0,1\r"; 14951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 14961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+CMER=3,0,0,0\r"; 14971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 14981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_CMER, buf, strlen(buf)); 14991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 15001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15011025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_chld(char cmd, UINT32 idx) 15021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 15031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char buf[BTA_HF_CLIENT_AT_MAX_LEN]; 15041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int at_len; 15051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1506e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 15071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (idx > 0) 15091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta at_len = snprintf(buf, sizeof(buf), "AT+CHLD=%c%u\r", cmd, idx); 15101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 15111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta at_len = snprintf(buf, sizeof(buf), "AT+CHLD=%c\r", cmd); 15121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_CHLD, buf, at_len); 15141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 15151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15161025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_clip(BOOLEAN activate) 15171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 15181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *buf; 15191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1520e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 15211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (activate) 15231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+CLIP=1\r"; 15241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 15251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+CLIP=0\r"; 15261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_CLIP, buf, strlen(buf)); 15281025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 15291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15301025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_ccwa(BOOLEAN activate) 15311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 15321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *buf; 15331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1534e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 15351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (activate) 15371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+CCWA=1\r"; 15381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 15391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+CCWA=0\r"; 15401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_CCWA, buf, strlen(buf)); 15421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 15431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15451025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_cmee(BOOLEAN activate) 15461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 15471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *buf; 15481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1549e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 15501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (activate) 15521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+CMEE=1\r"; 15531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 15541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+CMEE=0\r"; 15551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_CMEE, buf, strlen(buf)); 15571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 15581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15591025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_cops(BOOLEAN query) 15601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 15611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *buf; 15621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1563e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 15641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (!service_availability) 15661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 1567e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Skip AT+COPS no service"); 15681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 15691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 15701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (query) 15711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+COPS?\r"; 15721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 15731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+COPS=3,0\r"; 15741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_COPS, buf, strlen(buf)); 15761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 15771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15781025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_clcc(void) 15791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 15801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *buf; 15811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1582e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 15831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+CLCC\r"; 15851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_CLCC, buf, strlen(buf)); 15871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 15881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15891025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_bvra(BOOLEAN enable) 15901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 15911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *buf; 15921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1593e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 15941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 15951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (enable) 15961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+BVRA=1\r"; 15971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 15981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+BVRA=0\r"; 15991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_BVRA, buf, strlen(buf)); 16011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 16021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16031025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_vgs(UINT32 volume) 16041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 16051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char buf[BTA_HF_CLIENT_AT_MAX_LEN]; 16061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int at_len; 16071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1608e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 16091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta at_len = snprintf(buf, sizeof(buf), "AT+VGS=%u\r", volume); 16111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_VGS, buf, at_len); 16131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 16141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16151025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_vgm(UINT32 volume) 16161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 16171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char buf[BTA_HF_CLIENT_AT_MAX_LEN]; 16181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int at_len; 16191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1620e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 16211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta at_len = snprintf(buf, sizeof(buf), "AT+VGM=%u\r", volume); 16231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_VGM, buf, at_len); 16251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 16261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16271025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_atd(char *number, UINT32 memory) 16281025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 16291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char buf[BTA_HF_CLIENT_AT_MAX_LEN]; 16301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int at_len; 16311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1632e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 16331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (number[0] != '\0') 16351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 16361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta at_len = snprintf(buf, sizeof(buf), "ATD%s;\r", number); 16371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 16381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 16391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 16401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta at_len = snprintf(buf, sizeof(buf), "ATD>%u;\r", memory); 16411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 16421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_ATD, buf, at_len); 16441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 16451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16461025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_bldn(void) 16471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 16481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *buf; 16491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1650e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 16511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+BLDN\r"; 16531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_BLDN, buf, strlen(buf)); 16551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 16561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16571025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_ata(void) 16581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 16591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *buf; 16601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1661e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 16621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "ATA\r"; 16641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_ATA, buf, strlen(buf)); 16661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 16671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16681025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_chup(void) 16691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 16701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *buf; 16711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1672e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 16731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+CHUP\r"; 16751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_CHUP, buf, strlen(buf)); 16771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 16781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16791025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_btrh(BOOLEAN query, UINT32 val) 16801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 16811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char buf[BTA_HF_CLIENT_AT_MAX_LEN]; 16821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int at_len; 16831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1684e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 16851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (query == TRUE) 16871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 16881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta at_len = snprintf(buf, sizeof(buf), "AT+BTRH?\r"); 16891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 16901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 16911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 16921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta at_len = snprintf(buf, sizeof(buf), "AT+BTRH=%u\r", val); 16931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 16941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_BTRH, buf, at_len); 16961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 16971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 16981025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_vts(char code) 16991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 17001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char buf[BTA_HF_CLIENT_AT_MAX_LEN]; 17011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int at_len; 17021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1703e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 17041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta at_len = snprintf(buf, sizeof(buf), "AT+VTS=%c\r", code); 17061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_VTS, buf, at_len); 17081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 17091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17101025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_bcc(void) 17111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 17121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *buf; 17131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1714e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 17151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+BCC\r"; 17171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_BCC, buf, strlen(buf)); 17191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 17201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17211025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_cnum(void) 17221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 17231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *buf; 17241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1725e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 17261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (!service_availability) 17281025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 1729e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Skip AT+CNUM no Service"); 17301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 17311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 17321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+CNUM\r"; 17331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_CNUM, buf, strlen(buf)); 17351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 17361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17371025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_nrec(void) 17381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 17391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char *buf; 17401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1741e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 17421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (!(bta_hf_client_cb.scb.peer_features & BTA_HF_CLIENT_PEER_FEAT_ECNR)) 17441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 1745e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Remote does not support NREC."); 17461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 17471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 17481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf = "AT+NREC=0\r"; 17501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_NREC, buf, strlen(buf)); 17521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 17531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17541025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_binp(UINT32 action) 17551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 17561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char buf[BTA_HF_CLIENT_AT_MAX_LEN]; 17571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int at_len; 17581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1759e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 17601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta at_len = snprintf(buf, sizeof(buf), "AT+BINP=%u\r", action); 17621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_BINP, buf, at_len); 17641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 17651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17661025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_send_at_bia(void) 17671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 17681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta char buf[BTA_HF_CLIENT_AT_MAX_LEN]; 17691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int at_len; 17701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int i; 17711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1772e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s", __FUNCTION__); 17731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.peer_version < HFP_VERSION_1_6) 17741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 1775e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Remote does not Support AT+BIA"); 17761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 17771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 17781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta at_len = snprintf(buf, sizeof(buf), "AT+BIA="); 17801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta for(i = 0; i < BTA_HF_CLIENT_AT_INDICATOR_COUNT; i++) 17821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 17831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int sup = bta_hf_client_cb.scb.at_cb.indicator_lookup[i] == -1 ? 0 : 1; 17841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta at_len += snprintf(buf + at_len, sizeof(buf) - at_len, "%u,", sup); 17861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 17871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta buf[at_len - 1] = '\r'; 17891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_send_at(BTA_HF_CLIENT_AT_BIA, buf, at_len); 17911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 17921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17931025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_at_init(void) 17941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 17951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta memset(&bta_hf_client_cb.scb.at_cb, 0, sizeof(tBTA_HF_CLIENT_AT_CB)); 17961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_at_reset(); 17971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 17981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 17991025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_at_reset(void) 18001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{ 18011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int i; 18021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 18031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_stop_at_resp_timer(); 18041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_stop_at_hold_timer(); 18051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 18061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_clear_queued_at(); 18071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 18081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_at_clear_buf(); 18091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 18101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta for (i = 0; i < BTA_HF_CLIENT_AT_INDICATOR_COUNT; i++) 18111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 18121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.indicator_lookup[i] = -1; 18131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 18141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 18151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.at_cb.current_cmd = BTA_HF_CLIENT_AT_NONE; 18161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 1817