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