15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2004-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * BTA AG AT command interpreter. 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_at.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "utl.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_at_init 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Initialize the AT command parser control block. 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_init(tBTA_AG_AT_CB *p_cb) 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_cmd_buf = NULL; 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->cmd_pos = 0; 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_at_reinit 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Re-initialize the AT command parser control block. This 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** function resets the AT command parser state and frees 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** any GKI buffer. 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_reinit(tBTA_AG_AT_CB *p_cb) 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->p_cmd_buf != NULL) 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_cb->p_cmd_buf); 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_cmd_buf = NULL; 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->cmd_pos = 0; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_process_at 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Parse AT commands. This function will take the input 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** character string and parse it for AT commands according to 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the AT command table passed in the control block. 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_process_at(tBTA_AG_AT_CB *p_cb) 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 idx; 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 arg_type; 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p_arg; 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT16 int_arg = 0; 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* loop through at command table looking for match */ 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (idx = 0; p_cb->p_at_tbl[idx].p_cmd[0] != 0; idx++) 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!utl_strucmp(p_cb->p_at_tbl[idx].p_cmd, p_cb->p_cmd_buf)) 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if there is a match; verify argument type */ 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->p_at_tbl[idx].p_cmd[0] != 0) 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start of argument is p + strlen matching command */ 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_arg = p_cb->p_cmd_buf + strlen(p_cb->p_at_tbl[idx].p_cmd); 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if no argument */ 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_arg[0] == 0) 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project arg_type = BTA_AG_AT_NONE; 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else if arg is '?' and it is last character */ 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_arg[0] == '?' && p_arg[1] == 0) 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we have a read */ 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project arg_type = BTA_AG_AT_READ; 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else if arg is '=' */ 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_arg[0] == '=' && p_arg[1] != 0) 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_arg[1] == '?' && p_arg[2] == 0) 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we have a test */ 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project arg_type = BTA_AG_AT_TEST; 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we have a set */ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project arg_type = BTA_AG_AT_SET; 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* skip past '=' */ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_arg++; 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else it is freeform argument */ 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project arg_type = BTA_AG_AT_FREE; 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if arguments match command capabilities */ 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((arg_type & p_cb->p_at_tbl[idx].arg_type) != 0) 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if it's a set integer check max, min range */ 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (arg_type == BTA_AG_AT_SET && 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_at_tbl[idx].fmt == BTA_AG_AT_INT) 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int_arg = utl_str2int(p_arg); 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (int_arg < (INT16) p_cb->p_at_tbl[idx].min || 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int_arg > (INT16) p_cb->p_at_tbl[idx].max) 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* arg out of range; error */ 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->p_err_cback)(p_cb->p_user, FALSE, NULL); 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->p_cmd_cback)(p_cb->p_user, idx, arg_type, p_arg, int_arg); 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->p_cmd_cback)(p_cb->p_user, idx, arg_type, p_arg, int_arg); 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else error */ 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->p_err_cback)(p_cb->p_user, FALSE, NULL); 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else no match call error callback */ 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->p_err_cback)(p_cb->p_user, TRUE, p_cb->p_cmd_buf); 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_at_parse 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Parse AT commands. This function will take the input 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** character string and parse it for AT commands according to 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the AT command table passed in the control block. 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_parse(tBTA_AG_AT_CB *p_cb, char *p_buf, UINT16 len) 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i = 0; 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char* p_save; 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->p_cmd_buf == NULL) 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_cmd_buf = (char *) GKI_getbuf(p_cb->cmd_max_len); 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->cmd_pos = 0; 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < len;) 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_cb->cmd_pos < p_cb->cmd_max_len-1 && i < len) 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Skip null characters between AT commands. */ 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_cb->cmd_pos == 0) && (p_buf[i] == 0)) 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i++; 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project continue; 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_cmd_buf[p_cb->cmd_pos] = p_buf[i++]; 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( p_cb->p_cmd_buf[p_cb->cmd_pos] == '\r' || p_cb->p_cmd_buf[p_cb->cmd_pos] == '\n') 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_cmd_buf[p_cb->cmd_pos] = 0; 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_cb->cmd_pos > 2) && 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_cb->p_cmd_buf[0] == 'A' || p_cb->p_cmd_buf[0] == 'a') && 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_cb->p_cmd_buf[1] == 'T' || p_cb->p_cmd_buf[1] == 't')) 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_save = p_cb->p_cmd_buf; 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_cmd_buf += 2; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_process_at(p_cb); 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_cmd_buf = p_save; 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->cmd_pos = 0; 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if( p_cb->p_cmd_buf[p_cb->cmd_pos] == 0x1A || p_cb->p_cmd_buf[p_cb->cmd_pos] == 0x1B ) 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_cmd_buf[++p_cb->cmd_pos] = 0; 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->p_err_cback)(p_cb->p_user, TRUE, p_cb->p_cmd_buf); 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->cmd_pos = 0; 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ++p_cb->cmd_pos; 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (i < len) 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->cmd_pos = 0; 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 244