FreeCalypso > hg > ffs-editor
diff src/cs/services/atp/atp_cmd.h @ 0:92470e5d0b9e
src: partial import from FC Selenite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 15 May 2020 01:28:16 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cs/services/atp/atp_cmd.h Fri May 15 01:28:16 2020 +0000 @@ -0,0 +1,1447 @@ +/******************************************************************************** + * + * File Name : atp_cmd.h + * + * External definition for commands supported by ATP + * + * (C) Texas Instruments, all rights reserved + * + * Version number : 0.1 - 03-03-2000 + * + * History : 0.1 - Created by E. Baissus + * + * Author : Eric Baissus : e-baissus@ti.com + * + * (C) Copyright 2000 by Texas Instruments Incorporated, All Rights Reserved + * + ********************************************************************************/ +#include "rv/rv_general.h" +#include "rvf/rvf_api.h" +#include "atp/atp_config.h" +#include "atp/atp_api.h" + +#include <stdlib.h> + +#ifndef ATP_CMD_H +#define ATP_CMD_H + + +/************************** LOCAL DCE-DTE PORT CONTROL **************************/ +/* */ +/* Define the number of word needed to mask the commands executed by the ATP. */ +#define NB_WORD_OF_DCE_CMD_MASK (0x01) + +/* Define the default command line termination character (See ITU-T */ +/* Recommendation V.250 ter page 21). */ +#define ATP_CR_CHARACTER ('\x0D') + +/* Define the default response formatting character (See ITU-T Recommendation */ +/* V.250 ter page 22). */ +#define ATP_LF_CHARACTER ('\x0A') + +/* Define the default command line editing character (See ITU-T Recommendation */ +/* V.250 ter page 22). */ +#define ATP_BS_CHARACTER ('\x08') + +/* Define the escape sequence (See ITU-T Recommendation V.250 ter page 24). */ +#define MAX_NB_OF_CHARACTER_FOR_END_SEQUENCE (0x03) + +static const char ATP_ESCAPE_SEQUENCE[] = "+++"; + +/* Define the command echo (See ITU-T Recommendation V.250 ter page 23). */ +typedef enum +{ + ECHO_OFF = 0x00000000, + ECHO_ON +} T_ATP_ECHO_MODE; + +/* Define the result code suppression (See ITU-T Recommendation V.250 ter page */ +/* 23). */ +typedef enum +{ + RESULT_CODE_ON = 0x00000000, + RESULT_CODE_OFF +} T_ATP_RESULT_CODE_MODE; + +/* Define the DCE response format (See ITU-T Recommendation V.250 ter page 24). */ +typedef enum +{ + ATP_VERBOSE_0 = 0x00000000, + ATP_VERBOSE_1 +} T_ATP_VERBOSE_MODE; + +/* Define the structure used to store information related to DCE handling. Note */ +/* that 'nb_plus_received' indicates the number of escape characters that have */ +/* been previously received (refer to 'escape_sequence_tmp_buffer_p'). */ +typedef UINT16 T_ATP_DCE_MASK[NB_WORD_OF_DCE_CMD_MASK]; + +typedef struct +{ + char cr_character; + char lf_character; + char bs_character; + char escape_sequence[MAX_NB_OF_CHARACTER_FOR_END_SEQUENCE]; + T_ATP_ECHO_MODE echo_mode; + T_ATP_RESULT_CODE_MODE result_code_mode; + T_ATP_VERBOSE_MODE verbose_mode; + T_ATP_DCE_MASK dce_mask; + UINT8 nb_plus_received; + UINT8 *escape_sequence_tmp_buffer_p[MAX_NB_OF_CHARACTER_FOR_END_SEQUENCE]; + UINT8 length_of_escape_sequence_tmp_buffer_p[MAX_NB_OF_CHARACTER_FOR_END_SEQUENCE]; +} T_ATP_DCE_INFO; + + +/********************************** AT COMMANDS *********************************/ +/* */ +/* Define all supported AT commands. */ +/* __________________________________________________________________________ */ +/* | | | | | */ +/* | Binary code | Len | Command | Description | */ +/* |___________________|_____|_________|______________________________________| */ +/* | | | | | */ +/* | ATP_ATA_NB | 1 | ATA | Answer. | */ +/* | ATP_ATD_NB | 1 | ATD | Dial. | */ +/* | ATP_ATE_NB | 1 | ATE | Command echo. | */ +/* | ATP_ATH_NB | 1 | ATH | Hook control. | */ +/* | ATP_ATI_NB | 1 | ATI | Request Identification Information | */ +/* | ATP_ATL_NB | 1 | ATL | Monitor speaker loudness. | */ +/* | ATP_ATM_NB | 1 | ATM | Monitor speaker mode. | */ +/* | ATP_ATO_NB | 1 | ATO | Return to online data state. | */ +/* | ATP_ATP_NB | 1 | ATP | Select pulse dialling. | */ +/* | ATP_ATQ_NB | 1 | ATQ | Result code suppression. | */ +/* | ATP_ATS0_NB | 2 | ATS0 | Automatic answer. | */ +/* | ATP_ATS10_NB | 3 | ATS10 | Automatic disconnect delay. | */ +/* | ATP_ATS3_NB | 2 | ATS3 | Command line termination character. | */ +/* | ATP_ATS4_NB | 2 | ATS4 | Response formatting character. | */ +/* | ATP_ATS5_NB | 2 | ATS5 | Command line editing character. | */ +/* | ATP_ATS6_NB | 2 | ATS6 | Pause before blind dialling. | */ +/* | ATP_ATS7_NB | 2 | ATS7 | Connection completion timeout. | */ +/* | ATP_ATS8_NB | 2 | ATS8 | Comma dial modifier time. | */ +/* | ATP_ATT_NB | 1 | ATT | Select tone dialling. | */ +/* | ATP_ATV_NB | 1 | ATV | DCE response format. | */ +/* | ATP_ATX_NB | 1 | ATX | Result code selection and call | */ +/* | | | | progress monitoring control. | */ +/* | ATP_ATZ_NB | 1 | ATZ | Reset to default configuration. | */ +/* | ATP_AT_AND_C_NB | 2 | AT&C | Circuit 109 (received line signal | */ +/* | | | | detector) behavior. | */ +/* | ATP_AT_AND_D_NB | 2 | AT&D | Circuit 108 (data terminal ready) | */ +/* | | | | behavior. | */ +/* | ATP_AT_AND_F_NB | 2 | AT&F | Set to factory defined | */ +/* | | | | configuration. | */ +/* |___________________|_____|_________|______________________________________| */ +/* | | | | | */ +/* |ATP_AT_PLUS_CKPD_NB| 5 | AT+CKPD | Keypad control command (See GSM TS | */ +/* | | | | 07.07, Section 8.7). For <keys>, the | */ +/* | | | | value of 200 indicates the button on | */ +/* | | | | the headset being pushed. The <time> | */ +/* | | | | and <pause> parameters have no | */ +/* | | | | meaning in the headset profile. | */ +/* |ATP_AT_PLUS_FDR_NB | 4 | AT+FDR | Receive a page. | */ +/* |ATP_AT_PLUS_FDT_NB | 4 | AT+FDT | Send a page. | */ +/* |ATP_AT_PLUS_FKS_NB | 4 | AT+FKS | Session termination. | */ +/* |ATP_AT_PLUS_GMI_NB | 4 | AT+GMI | Request manufacturer identification. | */ +/* |ATP_AT_PLUS_GMM_NB | 4 | AT+GMM | Request model identification. | */ +/* |ATP_AT_PLUS_GMR_NB | 4 | AT+GMR | Request revision identification. | */ +/* |ATP_AT_PLUS_GCAP_NB| 5 | AT+GCAP | Request complete capabilities list. | */ +/* |ATP_AT_PLUS_VGM_NB | 4 | AT+VGM | Command issued by the HS to report | */ +/* | | | | the current microphone gain level | */ +/* | | | | setting to the AG (See Headset | */ +/* | | | | Specification, Section 4.7.3). | */ +/* |ATP_AT_PLUS_VGS_NB | 4 | AT+VGS | Command issued by the HS to report | */ +/* | | | | the current speaker gain level | */ +/* | | | | setting to the AG (See Headset | */ +/* | | | | Specification, Section 4.7.3). | */ +/* |___________________|_____|_________|______________________________________| */ +/* */ +/* Define the command line prefix "AT" (See ITU-T Recommendation V.250 ter page */ +/* page 4). */ +#define ATP_AT_PREFIX ("AT") +#define ATP_AT_PREFIX_LEN (0x02) + +/* Text codes for AT commands. */ +static const char ATP_AT_TXT_TABLE[] = {'A', \ + 'D', \ + 'E', \ + 'H', \ + 'I', \ + 'L', \ + 'M', \ + 'O', \ + 'P', \ + 'Q', \ + 'S', '0', \ + 'S', '1', '0', \ + 'S', '3', \ + 'S', '4', \ + 'S', '5', \ + 'S', '6', \ + 'S', '7', \ + 'S', '8', \ + 'T', \ + 'V', \ + 'X', \ + 'Z', \ + '&', 'C', \ + '&', 'D', \ + '&', 'F', \ + '+', 'C', 'K', 'P', 'D', \ + '+', 'F', 'D', 'R', \ + '+', 'F', 'D', 'T', \ + '+', 'F', 'K', 'S', \ + '+', 'G', 'M', 'I', \ + '+', 'G', 'M', 'M', \ + '+', 'G', 'M', 'R', \ + '+', 'G', 'C', 'A', 'P', \ + '+', 'V', 'G', 'M', \ + '+', 'V', 'G', 'S', \ + '\xFF'}; + +/* Binary related codes. */ +typedef enum +{ + ATP_ATA_NB = (0x00000000), + ATP_ATD_NB, + ATP_ATE_NB, + ATP_ATH_NB, + ATP_ATI_NB, + ATP_ATL_NB, + ATP_ATM_NB, + ATP_ATO_NB, + ATP_ATP_NB, + ATP_ATQ_NB, + ATP_ATS0_NB, + ATP_ATS10_NB, + ATP_ATS3_NB, + ATP_ATS4_NB, + ATP_ATS5_NB, + ATP_ATS6_NB, + ATP_ATS7_NB, + ATP_ATS8_NB, + ATP_ATT_NB, + ATP_ATV_NB, + ATP_ATX_NB, + ATP_ATZ_NB, + ATP_AT_AND_C_NB, + ATP_AT_AND_D_NB, + ATP_AT_AND_F_NB, + ATP_AT_PLUS_CKPD_NB, + ATP_AT_PLUS_FDR_NB, + ATP_AT_PLUS_FDT_NB, + ATP_AT_PLUS_FKS_NB, + ATP_AT_PLUS_GMI_NB, + ATP_AT_PLUS_GMM_NB, + ATP_AT_PLUS_GMR_NB, + ATP_AT_PLUS_GCAP_NB, + ATP_AT_PLUS_VGM_NB, + ATP_AT_PLUS_VGS_NB, + ATP_MAX_NB_OF_AT_COMMANDS +} T_ATP_BINARY_AT_COMMANDS; + +/* Related offsets. */ +#define ATP_ATA_OFFSET (0x00) +#define ATP_ATD_OFFSET (ATP_ATA_OFFSET + 0x01) +#define ATP_ATE_OFFSET (ATP_ATD_OFFSET + 0x01) +#define ATP_ATH_OFFSET (ATP_ATE_OFFSET + 0x01) +#define ATP_ATI_OFFSET (ATP_ATH_OFFSET + 0x01) +#define ATP_ATL_OFFSET (ATP_ATI_OFFSET + 0x01) +#define ATP_ATM_OFFSET (ATP_ATL_OFFSET + 0x01) +#define ATP_ATO_OFFSET (ATP_ATM_OFFSET + 0x01) +#define ATP_ATP_OFFSET (ATP_ATO_OFFSET + 0x01) +#define ATP_ATQ_OFFSET (ATP_ATP_OFFSET + 0x01) +#define ATP_ATS0_OFFSET (ATP_ATQ_OFFSET + 0x01) +#define ATP_ATS10_OFFSET (ATP_ATS0_OFFSET + 0x02) +#define ATP_ATS3_OFFSET (ATP_ATS10_OFFSET + 0x03) +#define ATP_ATS4_OFFSET (ATP_ATS3_OFFSET + 0x02) +#define ATP_ATS5_OFFSET (ATP_ATS4_OFFSET + 0x02) +#define ATP_ATS6_OFFSET (ATP_ATS5_OFFSET + 0x02) +#define ATP_ATS7_OFFSET (ATP_ATS6_OFFSET + 0x02) +#define ATP_ATS8_OFFSET (ATP_ATS7_OFFSET + 0x02) +#define ATP_ATT_OFFSET (ATP_ATS8_OFFSET + 0x02) +#define ATP_ATV_OFFSET (ATP_ATT_OFFSET + 0x01) +#define ATP_ATX_OFFSET (ATP_ATV_OFFSET + 0x01) +#define ATP_ATZ_OFFSET (ATP_ATX_OFFSET + 0x01) +#define ATP_AT_AND_C_OFFSET (ATP_ATZ_OFFSET + 0x01) +#define ATP_AT_AND_D_OFFSET (ATP_AT_AND_C_OFFSET + 0x02) +#define ATP_AT_AND_F_OFFSET (ATP_AT_AND_D_OFFSET + 0x02) +#define ATP_AT_PLUS_CKPD_OFFSET (ATP_AT_AND_F_OFFSET + 0x02) +#define ATP_AT_PLUS_FDR_OFFSET (ATP_AT_PLUS_CKPD_OFFSET + 0x05) +#define ATP_AT_PLUS_FDT_OFFSET (ATP_AT_PLUS_FDR_OFFSET + 0x04) +#define ATP_AT_PLUS_FKS_OFFSET (ATP_AT_PLUS_FDT_OFFSET + 0x04) +#define ATP_AT_PLUS_GMI_OFFSET (ATP_AT_PLUS_FKS_OFFSET + 0x04) +#define ATP_AT_PLUS_GMM_OFFSET (ATP_AT_PLUS_GMI_OFFSET + 0x04) +#define ATP_AT_PLUS_GMR_OFFSET (ATP_AT_PLUS_GMM_OFFSET + 0x04) +#define ATP_AT_PLUS_GCAP_OFFSET (ATP_AT_PLUS_GMR_OFFSET + 0x04) +#define ATP_AT_PLUS_VGM_OFFSET (ATP_AT_PLUS_GCAP_OFFSET + 0x05) +#define ATP_AT_PLUS_VGS_OFFSET (ATP_AT_PLUS_VGM_OFFSET + 0x04) +#define ATP_AT_LAST_OFFSET (ATP_AT_PLUS_VGS_OFFSET + 0x04) + +/* Related structures. */ +typedef enum +{ + ATP_CMD_NOT_DEFINED = (0x00000000), + ATP_NO_PARAM, + ATP_BASIC_PARAM, + ATP_DIAL_PARAM, + ATP_S_PARAM, + ATP_NO_EXTENDED_PARAM, + ATP_SINGLE_EXTENDED_PARAM, + ATP_PLUS_CKPD_PARAM +} T_ATP_CMD_FORMAT; + +#define ATP_ATA_PARAM (ATP_NO_PARAM) +#define ATP_ATD_PARAM (ATP_DIAL_PARAM) +#define ATP_ATE_PARAM (ATP_BASIC_PARAM) +#define ATP_ATH_PARAM (ATP_BASIC_PARAM) +#define ATP_ATI_PARAM (ATP_BASIC_PARAM) +#define ATP_ATL_PARAM (ATP_BASIC_PARAM) +#define ATP_ATM_PARAM (ATP_BASIC_PARAM) +#define ATP_ATO_PARAM (ATP_BASIC_PARAM) +#define ATP_ATP_PARAM (ATP_NO_PARAM) +#define ATP_ATQ_PARAM (ATP_BASIC_PARAM) +#define ATP_ATS0_PARAM (ATP_S_PARAM) +#define ATP_ATS10_PARAM (ATP_S_PARAM) +#define ATP_ATS3_PARAM (ATP_S_PARAM) +#define ATP_ATS4_PARAM (ATP_S_PARAM) +#define ATP_ATS5_PARAM (ATP_S_PARAM) +#define ATP_ATS6_PARAM (ATP_S_PARAM) +#define ATP_ATS7_PARAM (ATP_S_PARAM) +#define ATP_ATS8_PARAM (ATP_S_PARAM) +#define ATP_ATT_PARAM (ATP_NO_PARAM) +#define ATP_ATV_PARAM (ATP_BASIC_PARAM) +#define ATP_ATX_PARAM (ATP_BASIC_PARAM) +#define ATP_ATZ_PARAM (ATP_BASIC_PARAM) +#define ATP_AT_AND_C_PARAM (ATP_BASIC_PARAM) +#define ATP_AT_AND_D_PARAM (ATP_BASIC_PARAM) +#define ATP_AT_AND_F_PARAM (ATP_BASIC_PARAM) +#define ATP_AT_PLUS_CKPD_PARAM (ATP_PLUS_CKPD_PARAM) +#define ATP_AT_PLUS_FDR_PARAM (ATP_NO_EXTENDED_PARAM) +#define ATP_AT_PLUS_FDT_PARAM (ATP_NO_EXTENDED_PARAM) +#define ATP_AT_PLUS_FKS_PARAM (ATP_NO_EXTENDED_PARAM) +#define ATP_AT_PLUS_GMI_PARAM (ATP_NO_EXTENDED_PARAM) +#define ATP_AT_PLUS_GMM_PARAM (ATP_NO_EXTENDED_PARAM) +#define ATP_AT_PLUS_GMR_PARAM (ATP_NO_EXTENDED_PARAM) +#define ATP_AT_PLUS_GCAP_PARAM (ATP_NO_EXTENDED_PARAM) +#define ATP_AT_PLUS_VGM_PARAM (ATP_SINGLE_EXTENDED_PARAM) +#define ATP_AT_PLUS_VGS_PARAM (ATP_SINGLE_EXTENDED_PARAM) + +#define ATP_AT_OFFSET_COLUMN (0x00) +#define ATP_AT_PARAM_COLUMN (0x01) + +static const UINT8 ATP_AT_INFO[ATP_MAX_NB_OF_AT_COMMANDS + 0x01][0x02] \ + = {{ATP_ATA_OFFSET, ATP_ATA_PARAM}, \ + {ATP_ATD_OFFSET, ATP_ATD_PARAM}, \ + {ATP_ATE_OFFSET, ATP_ATE_PARAM}, \ + {ATP_ATH_OFFSET, ATP_ATH_PARAM}, \ + {ATP_ATI_OFFSET, ATP_ATI_PARAM}, \ + {ATP_ATL_OFFSET, ATP_ATL_PARAM}, \ + {ATP_ATM_OFFSET, ATP_ATM_PARAM}, \ + {ATP_ATO_OFFSET, ATP_ATO_PARAM}, \ + {ATP_ATP_OFFSET, ATP_ATP_PARAM}, \ + {ATP_ATQ_OFFSET, ATP_ATQ_PARAM}, \ + {ATP_ATS0_OFFSET, ATP_ATS0_PARAM}, \ + {ATP_ATS10_OFFSET, ATP_ATS10_PARAM}, \ + {ATP_ATS3_OFFSET, ATP_ATS3_PARAM}, \ + {ATP_ATS4_OFFSET, ATP_ATS4_PARAM}, \ + {ATP_ATS5_OFFSET, ATP_ATS5_PARAM}, \ + {ATP_ATS6_OFFSET, ATP_ATS6_PARAM}, \ + {ATP_ATS7_OFFSET, ATP_ATS7_PARAM}, \ + {ATP_ATS8_OFFSET, ATP_ATS8_PARAM}, \ + {ATP_ATT_OFFSET, ATP_ATT_PARAM}, \ + {ATP_ATV_OFFSET, ATP_ATV_PARAM}, \ + {ATP_ATX_OFFSET, ATP_ATX_PARAM}, \ + {ATP_ATZ_OFFSET, ATP_ATZ_PARAM}, \ + {ATP_AT_AND_C_OFFSET, ATP_AT_AND_C_PARAM}, \ + {ATP_AT_AND_D_OFFSET, ATP_AT_AND_D_PARAM}, \ + {ATP_AT_AND_F_OFFSET, ATP_AT_AND_F_PARAM}, \ + {ATP_AT_PLUS_CKPD_OFFSET, ATP_AT_PLUS_CKPD_PARAM}, \ + {ATP_AT_PLUS_FDR_OFFSET, ATP_AT_PLUS_FDR_PARAM}, \ + {ATP_AT_PLUS_FDT_OFFSET, ATP_AT_PLUS_FDT_PARAM}, \ + {ATP_AT_PLUS_FKS_OFFSET, ATP_AT_PLUS_FKS_PARAM}, \ + {ATP_AT_PLUS_GMI_OFFSET, ATP_AT_PLUS_GMI_PARAM}, \ + {ATP_AT_PLUS_GMM_OFFSET, ATP_AT_PLUS_GMM_PARAM}, \ + {ATP_AT_PLUS_GMR_OFFSET, ATP_AT_PLUS_GMR_PARAM}, \ + {ATP_AT_PLUS_GCAP_OFFSET, ATP_AT_PLUS_GCAP_PARAM}, \ + {ATP_AT_PLUS_VGM_OFFSET, ATP_AT_PLUS_VGM_PARAM}, \ + {ATP_AT_PLUS_VGS_OFFSET, ATP_AT_PLUS_VGS_PARAM}, \ + {ATP_AT_LAST_OFFSET, ATP_CMD_NOT_DEFINED}}; + +/* Define the maximum length (text format) of <numbers> appearing in basic */ +/* syntax commands. */ +/* - <number> (up to 65535). */ +#define MAX_BASIC_CMD_PARAM_LEN (0x05) + +/* Define the structure associated with basic syntax commands (except for the */ +/* D and S commands). The format of such commands is <command>[<number>], where */ +/* <number> may be a string of one or more characters from "0" through "9" */ +/* representing the decimal integer value (See ITU-T Recommendation V.250 ter */ +/* page 5). */ +typedef struct +{ + UINT16 number; +} T_ATP_BASIC_CMD; + +/* Define all basic syntax commands do not expext any <number>. */ +/* __________________________________________________________________________ */ +/* | | | | | */ +/* | Binary code | Len | Command | Description | */ +/* |___________________|_____|_________|______________________________________| */ +/* | | | | | */ +/* | ATP_ATA_NB | 1 | ATA | Answer. | */ +/* | ATP_ATP_NB | 1 | ATP | Select pulse dialling. | */ +/* | ATP_ATT_NB | 1 | ATT | Select tone dialling. | */ +/* |___________________|_____|_________|______________________________________| */ +/* */ +/* Define all other basic syntax commands. */ +/* __________________________________________________________________________ */ +/* | | | | | */ +/* | Binary code | Len | Command | Description | */ +/* |___________________|_____|_________|______________________________________| */ +/* | | | | | */ +/* | ATP_ATE_NB | 1 | ATE | Command echo. | */ +/* | ATP_ATH_NB | 1 | ATH | Hook control. | */ +/* | ATP_ATI_NB | 1 | ATI | Request Identification Information | */ +/* | ATP_ATL_NB | 1 | ATL | Monitor speaker loudness. | */ +/* | ATP_ATM_NB | 1 | ATM | Monitor speaker mode. | */ +/* | ATP_ATO_NB | 1 | ATO | Return to online data state. | */ +/* | ATP_ATQ_NB | 1 | ATQ | Result code suppression. | */ +/* | ATP_ATV_NB | 1 | ATV | DCE response format. | */ +/* | ATP_ATX_NB | 1 | ATX | Result code selection and call | */ +/* | | | | progress monitoring control. | */ +/* | ATP_ATZ_NB | 1 | ATZ | Reset to default configuration. | */ +/* | ATP_AT_AND_C_NB | 2 | AT&C | Circuit 109 (received line signal | */ +/* | | | | detector) behavior. | */ +/* | ATP_AT_AND_D_NB | 2 | AT&D | Circuit 108 (data terminal ready) | */ +/* | | | | behavior. | */ +/* | ATP_AT_AND_F_NB | 2 | AT&F | Set to factory defined | */ +/* | | | | configuration. | */ +/* |___________________|_____|_________|______________________________________| */ +typedef T_ATP_BASIC_CMD T_ATP_ATE_PARAM; +typedef T_ATP_BASIC_CMD T_ATP_ATH_PARAM; +typedef T_ATP_BASIC_CMD T_ATP_ATI_PARAM; +typedef T_ATP_BASIC_CMD T_ATP_ATL_PARAM; +typedef T_ATP_BASIC_CMD T_ATP_ATM_PARAM; +typedef T_ATP_BASIC_CMD T_ATP_ATO_PARAM; +typedef T_ATP_BASIC_CMD T_ATP_ATQ_PARAM; +typedef T_ATP_BASIC_CMD T_ATP_ATV_PARAM; +typedef T_ATP_BASIC_CMD T_ATP_ATX_PARAM; +typedef T_ATP_BASIC_CMD T_ATP_ATZ_PARAM; +typedef T_ATP_BASIC_CMD T_ATP_AT_AND_C_PARAM; +typedef T_ATP_BASIC_CMD T_ATP_AT_AND_D_PARAM; +typedef T_ATP_BASIC_CMD T_ATP_AT_AND_F_PARAM; + +/* Define the maximum number of characters appearing in the <dial_string>. */ +#define MAX_DIAL_STRING_LEN (30) + +/* Define the structure associated with "Dial" command whose format is */ +/* D[<dial_string>][;] (See ITU-T Recommendation V.250 ter page 31). Note that */ +/* all characters appearing on the same command line after D are considered */ +/* part of the call addressing information to be signalled to the network, or */ +/* modifiers used to control the signalling process, up to a semicolon */ +/* character or the end of the command line. If the <dial_string> is terminated */ +/* by a semicolon, the DCE does not start the call origination procedure, but */ +/* instead returns to command state after completion of the signalling of call */ +/* addressing information to the network. */ +typedef struct +{ + char dial_string_p[MAX_DIAL_STRING_LEN]; + UINT8 dial_string_length; + enum + { + DATA_CALL = 0x00000000, + VOICE_CALL + } call_type; +} T_ATP_DIAL; + +/* Define all dial commands. */ +/* __________________________________________________________________________ */ +/* | | | | | */ +/* | Binary code | Len | Command | Description | */ +/* |___________________|_____|_________|______________________________________| */ +/* | | | | | */ +/* | ATP_ATD_NB | 1 | ATD | Dial. | */ +/* |___________________|_____|_________|______________________________________| */ +typedef T_ATP_DIAL T_ATP_ATD_PARAM; + +/* Define the maximum length (text format) of <values> appearing in */ +/* S-parameters. */ +/* - '=' + <value> (up to 65535). */ +#define MAX_S_PARAM_LEN (0x06) + +/* Define the structure associated with S-parameters. Formats of such commands */ +/* are S<parameter_number>? and S<parameter_number>=[<value>], where <value> */ +/* shall consist of a decimal constant (See ITU-T Recommendation V.250 ter */ +/* pages 5 and 6). */ +typedef struct +{ + enum + { + READ_S_PARAM = 0x00000001, + SET_S_PARAM + } s_operator; + UINT16 value; +} T_ATP_S_PARAM; + +/* Define all S-parameters. */ +/* __________________________________________________________________________ */ +/* | | | | | */ +/* | Binary code | Len | Command | Description | */ +/* |___________________|_____|_________|______________________________________| */ +/* | | | | | */ +/* | ATP_ATS0_NB | 2 | ATS0 | Automatic answer. | */ +/* | ATP_ATS10_NB | 3 | ATS10 | Automatic disconnect delay. | */ +/* | ATP_ATS3_NB | 2 | ATS3 | Command line termination character. | */ +/* | ATP_ATS4_NB | 2 | ATS4 | Response formatting character. | */ +/* | ATP_ATS5_NB | 2 | ATS5 | Command line editing character. | */ +/* | ATP_ATS6_NB | 2 | ATS6 | Pause before blind dialling. | */ +/* | ATP_ATS7_NB | 2 | ATS7 | Connection completion timeout. | */ +/* | ATP_ATS8_NB | 2 | ATS8 | Comma dial modifier time. | */ +/* |___________________|_____|_________|______________________________________| */ +typedef T_ATP_S_PARAM T_ATP_ATS0_PARAM; +typedef T_ATP_S_PARAM T_ATP_ATS10_PARAM; +typedef T_ATP_S_PARAM T_ATP_ATS3_PARAM; +typedef T_ATP_S_PARAM T_ATP_ATS4_PARAM; +typedef T_ATP_S_PARAM T_ATP_ATS5_PARAM; +typedef T_ATP_S_PARAM T_ATP_ATS6_PARAM; +typedef T_ATP_S_PARAM T_ATP_ATS7_PARAM; +typedef T_ATP_S_PARAM T_ATP_ATS8_PARAM; + +/* Define operators dedicated to extended syntax commands. "=" is used to set */ +/* the indicated extended syntax command to a new value (See ITU-T */ +/* Recommendation V.250 ter page 8). Note that if no value is given, the */ +/* extended syntax command specified may be set to 0. "?" is used to read the */ +/* current value of the indicated extended syntax command (See ITU-T */ +/* Recommendation V.250 ter page 9). "=?" is used to test whether the extended */ +/* syntax command is implemented in the DCE. */ +typedef enum +{ + NO_SUBPARAMETER = 0x00000000, + READ_EXTENDED_CMD, + SET_EXTENDED_CMD, + TEST_EXTENDED_CMD +} T_ATP_EXTENDED_OPERATOR; + +/* Define the maximum length (text format) of extended syntax commands that */ +/* have no subparameter. */ +/* - '=?'. */ +#define MAX_NO_SUBPARAMETER_LEN (0x02) + +/* Define the structure associated with extended syntax commands that have no */ +/* subparameter. Formats of such commands are +<name> and +<name>=?, where */ +/* <name> may be a string of one or sixteen characters selected from the */ +/* following set (See ITU-T Recommendation V.250 ter page 6): */ +/* "A" through "Z", */ +/* "0" through "9", */ +/* "!", "%", "-", ".", "/", ":" and "_". */ +typedef struct +{ + T_ATP_EXTENDED_OPERATOR extended_operator; +} T_ATP_NO_SUBPARAMETER; + +/* Define all extended syntax commands do not expext any <value>. */ +/* __________________________________________________________________________ */ +/* | | | | | */ +/* | Binary code | Len | Command | Description | */ +/* |___________________|_____|_________|______________________________________| */ +/* | | | | | */ +/* |ATP_AT_PLUS_FDR_NB | 4 | AT+FDR | Receive a page. | */ +/* |ATP_AT_PLUS_FDT_NB | 4 | AT+FDT | Send a page. | */ +/* |ATP_AT_PLUS_FKS_NB | 4 | AT+FKS | Session termination. | */ +/* |ATP_AT_PLUS_GMI_NB | 4 | AT+GMI | Request manufacturer identification. | */ +/* |ATP_AT_PLUS_GMM_NB | 4 | AT+GMM | Request model identification. | */ +/* |ATP_AT_PLUS_GMR_NB | 4 | AT+GMR | Request revision identification. | */ +/* |ATP_AT_PLUS_GCAP_NB| 5 | AT+GCAP | Request complete capabilities list. | */ +/* |___________________|_____|_________|______________________________________| */ +typedef T_ATP_NO_SUBPARAMETER T_ATP_AT_PLUS_FDR_PARAM; +typedef T_ATP_NO_SUBPARAMETER T_ATP_AT_PLUS_FDT_PARAM; +typedef T_ATP_NO_SUBPARAMETER T_ATP_AT_PLUS_FKS_PARAM; +typedef T_ATP_NO_SUBPARAMETER T_ATP_AT_PLUS_GMI_PARAM; +typedef T_ATP_NO_SUBPARAMETER T_ATP_AT_PLUS_GMM_PARAM; +typedef T_ATP_NO_SUBPARAMETER T_ATP_AT_PLUS_GMR_PARAM; +typedef T_ATP_NO_SUBPARAMETER T_ATP_AT_PLUS_GCAP_PARAM; + +/* Define the maximum length (text format) of <values> appearing in extended */ +/* syntax commands whose subparameter is a numeric constant. */ +/* - '=' + <value> (up to 65535). */ +#define MAX_SINGLE_SUBPARAMETER_LEN (0x06) + +/* Define the structure associated with extended syntax commands whose */ +/* subparameter is a numeric constant. Formats of such commands are +<name>?, */ +/* +<name>[=<value>] and and +<name>=?, where <name> may be a string of one or */ +/* sixteen characters selected from the following set (See ITU-T Recommendation */ +/* V.250 ter page 6): */ +/* "A" through "Z", */ +/* "0" through "9", */ +/* "!", "%", "-", ".", "/", ":" and "_". */ +/* */ +/* <value> shall consist of a numeric constant (See ITU-T Recommendation V.250 */ +/* ter page 6). */ +/* Some additional commands may follow an extended syntax command on the same */ +/* command line if a semicolon is inserted after the preceding extended command */ +/* as a separator. The semicolon is not necessary when the extended syntax */ +/* command is the last command on the command line (See ITU-T Recommendation */ +/* V.250 ter page 9). Besides, extended syntax commands may appear on the same */ +/* command line after a basic syntax command without a separator, in the same */ +/* manner as concatenation of basic syntax commands. */ +typedef struct +{ + T_ATP_EXTENDED_OPERATOR extended_operator; + UINT16 value; +} T_ATP_SINGLE_SUBPARAMETER; + +/* Define all extended syntax commands whose subparameter is a numeric */ +/* constant. */ +/* __________________________________________________________________________ */ +/* | | | | | */ +/* | Binary code | Len | Command | Description | */ +/* |___________________|_____|_________|______________________________________| */ +/* | | | | meaning in the headset profile. | */ +/* |ATP_AT_PLUS_VGM_NB | 4 | AT+VGM | Command issued by the HS to report | */ +/* | | | | the current microphone gain level | */ +/* | | | | setting to the AG (See Headset | */ +/* | | | | Specification, Section 4.7.3). | */ +/* |ATP_AT_PLUS_VGS_NB | 4 | AT+VGS | Command issued by the HS to report | */ +/* | | | | the current speaker gain level | */ +/* | | | | setting to the AG (See Headset | */ +/* | | | | Specification, Section 4.7.3). | */ +/* |___________________|_____|_________|______________________________________| */ +typedef T_ATP_SINGLE_SUBPARAMETER T_ATP_AT_PLUS_VGM_PARAM; +typedef T_ATP_SINGLE_SUBPARAMETER T_ATP_AT_PLUS_VGS_PARAM; + +/* Define the maximum number of keys appearing in the <keys>. */ +#define MAX_NB_OF_KEYS (5) + +/* Define the maximum length (text format) of the <compound_value> appearing in */ +/* keypad control commands. */ +/* - "=" + """ + MAX_NB_OF_KEYS * [";" + <keys> (up to 65535) + ";"] + """ + */ +/* + "," + <time> (up to 65535) */ +/* + "," + <pause> (up to 65535). */ +#define MAX_CKPD_PARAM_LEN (0x0F + MAX_NB_OF_KEYS * 0x07) + +/* Define the structure associated with the extended syntax command +CKPD. */ +/* Formats of such command are +<name>=<keys>[,<time>[,<pause>]] and +<name>=?, */ +/* where <name> may be a string of one or sixteen characters selected from the */ +/* following set (See ITU-T Recommendation V.250 ter page 6): */ +/* "A" through "Z", */ +/* "0" through "9", */ +/* "!", "%", "-", ".", "/", ":" and "_". */ +/* */ +/* <keys> shall consist of a string constant (See ETS 300 916 (GSM 07.07) */ +/* Version 5.8.1 page 62). */ +/* <time> and <pause> shall consist of numeric constants in tenths of a second */ +/* (See ETS 300 916 (GSM 07.07) Version 5.8.1 page 62). */ +/* Some additional commands may follow an extended syntax command on the same */ +/* command line if a semicolon is inserted after the preceding extended command */ +/* as a separator. The semicolon is not necessary when the extended syntax */ +/* command is the last command on the command line (See ITU-T Recommendation */ +/* V.250 ter page 9). Besides, extended syntax commands may appear on the same */ +/* command line after a basic syntax command without a separator, in the same */ +/* manner as concatenation of basic syntax commands. */ +typedef struct +{ + T_ATP_EXTENDED_OPERATOR extended_operator; + UINT16 keys[MAX_NB_OF_KEYS]; + UINT8 nb_keys; + UINT16 time; + UINT16 pause; +} T_ATP_PLUS_CKPD; + +/* Define all extended syntax commands. */ +/* __________________________________________________________________________ */ +/* | | | | | */ +/* | Binary code | Len | Command | Description | */ +/* |___________________|_____|_________|______________________________________| */ +/* | | | | | */ +/* |ATP_AT_PLUS_CKPD_NB| 5 | AT+CKPD | Keypad control command (See GSM TS | */ +/* | | | | 07.07, Section 8.7). For <keys>, the | */ +/* | | | | value of 200 indicates the button on | */ +/* | | | | the headset being pushed. The <time> | */ +/* | | | | and <pause> parameters have no | */ +/* | | | | meaning in the headset profile. | */ +/* |___________________|_____|_________|______________________________________| */ +typedef T_ATP_PLUS_CKPD T_ATP_AT_PLUS_CKPD_PARAM; + +/* Define the default time value. */ +#define DEFAULT_TIME (0x0000) + +/* Define an unspecified time value. */ +#define TIME_DO_NOT_CARE (0x0000) + +/* Define the default pause value. */ +#define DEFAULT_PAUSE (0x0000) + +/* Define an unspecified pause value. */ +#define PAUSE_DO_NOT_CARE (0x0000) + + +/********************************* RESULT CODES *********************************/ +/* */ +/* Define all supported result codes. */ +/* */ +/* __________________________________________________________________________ */ +/* | | | | | | */ +/* | Binary code | Len | Result code | Numeric | Description | */ +/* |_____________________|_____|_____________|_________|______________________| */ +/* | | | | | | */ +/* | ATP_OK_NB | 2 | OK | 0 | Acknoledges | */ +/* | | | | | execution of a | */ +/* | | | | | command. | */ +/* | ATP_CONNECT_NB | 7 | CONNECT | 1 | A connection has | */ +/* | | | | | been established. | */ +/* | ATP_RING_NB | 4 | RING | 2 | Incoming call | */ +/* | | | | | detected. | */ +/* | ATP_NO_CARRIER_NB | 10 | NO CARRIER | 3 | The connection has | */ +/* | | | | | been terminated or | */ +/* | | | | | the attempt to | */ +/* | | | | | establish a | */ +/* | | | | | connection failed. | */ +/* | ATP_ERROR_NB | 5 | ERROR | 4 | Problem with | */ +/* | | | | | processing the | */ +/* | | | | | command line. | */ +/* | ATP_NO_DIALTONE_NB | 11 | NO DIALTONE | 6 | No dial tone | */ +/* | | | | | detected. | */ +/* | ATP_BUSY_NB | 4 | BUSY | 7 | Busy signal | */ +/* | | | | | detected. | */ +/* | ATP_NO_ANSWER_NB | 9 | NO ANSWER | 8 | '@' dial modifier | */ +/* | | | | | was used, but remote | */ +/* | | | | | ringing followed by | */ +/* | | | | | 5 seconds of silence | */ +/* | | | | | was not detected | */ +/* | | | | | before expiration of | */ +/* | | | | | the connection | */ +/* | | | | | timer. | */ +/* |_____________________|_____|_____________|_________|______________________| */ +/* | | | | | | */ +/* | ATP_CONNECT_TXT_NB | 7 | CONNECT | X | A connection has | */ +/* | | | | | been established. | */ +/* |_____________________|_____|_____________|_________|______________________| */ +/* | | | | | | */ +/* | ATP_PLUS_VGM_NB | 4 | +VGM | X | Unsolicited result | */ +/* | | | | | code issued by the | */ +/* | | | | | AG to set the | */ +/* | | | | | microphone gain of | */ +/* | | | | | the HS (See Headset | */ +/* | | | | | Specification, | */ +/* | | | | | Section 4.7.3). | */ +/* | ATP_PLUS_VGS_NB | 4 | +VGS | X | Unsolicited result | */ +/* | | | | | code issued by the | */ +/* | | | | | AG to set the | */ +/* | | | | | speaker gain of the | */ +/* | | | | | HS (See Headset | */ +/* | | | | | Specification, | */ +/* | | | | | Section 4.7.3). | */ +/* |_____________________|_____|_____________|_________|______________________| */ +/* | | | | | | */ +/* |ATP_PLUS_CME_ERROR_NB| 11 | +CME ERROR: | X | Final result code | */ +/* | | | | | similar to the | */ +/* | | | | | regular ERROR result | */ +/* | | | | | code (See GSM TS | */ +/* | | | | | 07.07, Section 9.2). | */ +/* |_____________________|_____|_____________|_________|______________________| */ +/* | | | | | | */ +/* |ATP_PLUS_CMS_ERROR_NB| 11 | +CMS ERROR: | X | Final result code | */ +/* | | | | | that indicates an | */ +/* | | | | | error related to | */ +/* | | | | | mobile equipment or | */ +/* | | | | | network (See GSM TS | */ +/* | | | | | 07.05, Section | */ +/* | | | | | 3.2.5). | */ +/* |_____________________|_____|_____________|_________|______________________| */ +/* */ +/* Define the length of <CR><LF> headers of information responses (See ETS 300 */ +/* 916 (GSM 07.07) Version 4.1 page 13). */ +#define ATP_RESULT_CODE_HEADER_LEN (0x02) + +/* Text codes for result codes (verbose responses disabled). */ +static const char ATP_RESULT_CODE_TXT_TABLE_V0[] = {'0', \ + '1', \ + '2', \ + '3', \ + '4', \ + '6', \ + '7', \ + '8', \ + 'C', 'O', 'N', 'N', 'E', 'C', 'T', \ + '+', 'V', 'G', 'M', \ + '+', 'V', 'G', 'S', \ + '+', 'C', 'M', 'E', ' ', 'E', 'R', 'R', 'O', 'R', ':', \ + '+', 'C', 'M', 'S', ' ', 'E', 'R', 'R', 'O', 'R', ':', \ + '\xFF'}; + +/* Text codes for result codes (verbose responses enabled). */ +static const char ATP_RESULT_CODE_TXT_TABLE_V1[] = {'O', 'K', \ + 'C', 'O', 'N', 'N', 'E', 'C', 'T', \ + 'R', 'I', 'N', 'G', \ + 'N', 'O', ' ', 'C', 'A', 'R', 'R', 'I', 'E', 'R', \ + 'E', 'R', 'R', 'O', 'R', \ + 'N', 'O', ' ', 'D', 'I', 'A', 'L', 'T', 'O', 'N', 'E', \ + 'B', 'U', 'S', 'Y', \ + 'N', 'O', ' ', 'A', 'N', 'S', 'W', 'E', 'R', \ + 'C', 'O', 'N', 'N', 'E', 'C', 'T', \ + '+', 'V', 'G', 'M', \ + '+', 'V', 'G', 'S', \ + '+', 'C', 'M', 'E', ' ', 'E', 'R', 'R', 'O', 'R', ':', \ + '+', 'C', 'M', 'S', ' ', 'E', 'R', 'R', 'O', 'R', ':', \ + '\xFF'}; + +/* Binary related codes. */ +typedef enum +{ + ATP_OK_NB = (0x00000000), + ATP_CONNECT_NB, + ATP_RING_NB, + ATP_NO_CARRIER_NB, + ATP_ERROR_NB, + ATP_NO_DIALTONE_NB = (0x00000006), + ATP_BUSY_NB, + ATP_NO_ANSWER_NB, + ATP_CONNECT_TXT_NB, + ATP_PLUS_VGM_NB, + ATP_PLUS_VGS_NB, + ATP_PLUS_CME_ERROR_NB, + ATP_PLUS_CMS_ERROR_NB, + ATP_MAX_NB_OF_RESULT_CODES +} T_ATP_BINARY_RESULT_CODES; + +/* Related offsets (verbose responses disabled). */ +#define ATP_OK_OFFSET_V0 (0x00) +#define ATP_CONNECT_OFFSET_V0 (ATP_OK_OFFSET_V0 + 0x01) +#define ATP_RING_OFFSET_V0 (ATP_CONNECT_OFFSET_V0 + 0x01) +#define ATP_NO_CARRIER_OFFSET_V0 (ATP_RING_OFFSET_V0 + 0x01) +#define ATP_ERROR_OFFSET_V0 (ATP_NO_CARRIER_OFFSET_V0 + 0x01) +#define ATP_NO_DIALTONE_OFFSET_V0 (ATP_ERROR_OFFSET_V0 + 0x01) +#define ATP_BUSY_OFFSET_V0 (ATP_NO_DIALTONE_OFFSET_V0 + 0x01) +#define ATP_NO_ANSWER_OFFSET_V0 (ATP_BUSY_OFFSET_V0 + 0x01) +#define ATP_CONNECT_TXT_OFFSET_V0 (ATP_NO_ANSWER_OFFSET_V0 + 0x01) +#define ATP_PLUS_VGM_OFFSET_V0 (ATP_CONNECT_TXT_OFFSET_V0 + 0x07) +#define ATP_PLUS_VGS_OFFSET_V0 (ATP_PLUS_VGM_OFFSET_V0 + 0x04) +#define ATP_PLUS_CME_ERROR_OFFSET_V0 (ATP_PLUS_VGS_OFFSET_V0 + 0x04) +#define ATP_PLUS_CMS_ERROR_OFFSET_V0 (ATP_PLUS_CME_ERROR_OFFSET_V0 + 0x0B) +#define ATP_RESULT_CODE_LAST_OFFSET_V0 (ATP_PLUS_CMS_ERROR_OFFSET_V0 + 0x0B) + +/* Related offsets (verbose responses enabled). */ +#define ATP_OK_OFFSET_V1 (0x00) +#define ATP_CONNECT_OFFSET_V1 (ATP_OK_OFFSET_V1 + 0x02) +#define ATP_RING_OFFSET_V1 (ATP_CONNECT_OFFSET_V1 + 0x07) +#define ATP_NO_CARRIER_OFFSET_V1 (ATP_RING_OFFSET_V1 + 0x04) +#define ATP_ERROR_OFFSET_V1 (ATP_NO_CARRIER_OFFSET_V1 + 0x0A) +#define ATP_NO_DIALTONE_OFFSET_V1 (ATP_ERROR_OFFSET_V1 + 0x05) +#define ATP_BUSY_OFFSET_V1 (ATP_NO_DIALTONE_OFFSET_V1 + 0x0B) +#define ATP_NO_ANSWER_OFFSET_V1 (ATP_BUSY_OFFSET_V1 + 0x04) +#define ATP_CONNECT_TXT_OFFSET_V1 (ATP_NO_ANSWER_OFFSET_V1 + 0x09) +#define ATP_PLUS_VGM_OFFSET_V1 (ATP_CONNECT_TXT_OFFSET_V1 + 0x07) +#define ATP_PLUS_VGS_OFFSET_V1 (ATP_PLUS_VGM_OFFSET_V1 + 0x04) +#define ATP_PLUS_CME_ERROR_OFFSET_V1 (ATP_PLUS_VGS_OFFSET_V1 + 0x04) +#define ATP_PLUS_CMS_ERROR_OFFSET_V1 (ATP_PLUS_CME_ERROR_OFFSET_V1 + 0x0B) +#define ATP_RESULT_CODE_LAST_OFFSET_V1 (ATP_PLUS_CMS_ERROR_OFFSET_V1 + 0x0B) + +/* Related structures. */ +typedef enum +{ + ATP_RESULT_CODE_NOT_DEFINED = (0x00000000), + ATP_BASIC_RESULT_CODE, + ATP_EXTENDED_RESULT_CODE, + ATP_CONNECT_TXT_RESULT_CODE, + ATP_PLUS_ERROR_RESULT_CODE +} T_ATP_RESULT_CODE_FORMAT; + +#define ATP_OK_PARAM (ATP_BASIC_RESULT_CODE) +#define ATP_CONNECT_PARAM (ATP_BASIC_RESULT_CODE) +#define ATP_RING_PARAM (ATP_BASIC_RESULT_CODE) +#define ATP_NO_CARRIER_PARAM (ATP_BASIC_RESULT_CODE) +#define ATP_ERROR_PARAM (ATP_BASIC_RESULT_CODE) +#define ATP_NO_DIALTONE_PARAM (ATP_BASIC_RESULT_CODE) +#define ATP_BUSY_PARAM (ATP_BASIC_RESULT_CODE) +#define ATP_NO_ANSWER_PARAM (ATP_BASIC_RESULT_CODE) +#define ATP_CONNECT_TXT_PARAM (ATP_CONNECT_TXT_RESULT_CODE) +#define ATP_PLUS_VGM_PARAM (ATP_EXTENDED_RESULT_CODE) +#define ATP_PLUS_VGS_PARAM (ATP_EXTENDED_RESULT_CODE) +#define ATP_PLUS_CME_ERROR_PARAM (ATP_PLUS_ERROR_RESULT_CODE) +#define ATP_PLUS_CMS_ERROR_PARAM (ATP_PLUS_ERROR_RESULT_CODE) + +#define ATP_RESULT_OFFSET_V0_COLUMN (0x00) +#define ATP_RESULT_OFFSET_V1_COLUMN (0x01) +#define ATP_RESULT_PARAM_COLUMN (0x02) + +static const UINT8 ATP_RESULT_CODE_INFO[ATP_MAX_NB_OF_RESULT_CODES + 0x01][0x03] \ + = {{ATP_OK_OFFSET_V0, ATP_OK_OFFSET_V1, ATP_OK_PARAM}, \ + {ATP_CONNECT_OFFSET_V0, ATP_CONNECT_OFFSET_V1, ATP_CONNECT_PARAM}, \ + {ATP_RING_OFFSET_V0, ATP_RING_OFFSET_V1, ATP_RING_PARAM}, \ + {ATP_NO_CARRIER_OFFSET_V0, ATP_NO_CARRIER_OFFSET_V1, ATP_NO_CARRIER_PARAM}, \ + {ATP_ERROR_OFFSET_V0, ATP_ERROR_OFFSET_V1, ATP_ERROR_PARAM}, \ + {ATP_NO_DIALTONE_OFFSET_V0, ATP_NO_DIALTONE_OFFSET_V1, ATP_RESULT_CODE_NOT_DEFINED}, \ + {ATP_NO_DIALTONE_OFFSET_V0, ATP_NO_DIALTONE_OFFSET_V1, ATP_NO_DIALTONE_PARAM}, \ + {ATP_BUSY_OFFSET_V0, ATP_BUSY_OFFSET_V1, ATP_BUSY_PARAM}, \ + {ATP_NO_ANSWER_OFFSET_V0, ATP_NO_ANSWER_OFFSET_V1, ATP_NO_ANSWER_PARAM}, \ + {ATP_CONNECT_TXT_OFFSET_V0, ATP_CONNECT_TXT_OFFSET_V1, ATP_CONNECT_TXT_PARAM}, \ + {ATP_PLUS_VGM_OFFSET_V0, ATP_PLUS_VGM_OFFSET_V1, ATP_PLUS_VGM_PARAM}, \ + {ATP_PLUS_VGS_OFFSET_V0, ATP_PLUS_VGS_OFFSET_V1, ATP_PLUS_VGS_PARAM}, \ + {ATP_PLUS_CME_ERROR_OFFSET_V0, ATP_PLUS_CME_ERROR_OFFSET_V1, ATP_PLUS_CME_ERROR_PARAM}, \ + {ATP_PLUS_CMS_ERROR_OFFSET_V0, ATP_PLUS_CMS_ERROR_OFFSET_V1, ATP_PLUS_CMS_ERROR_PARAM}, \ + {ATP_RESULT_CODE_LAST_OFFSET_V0, ATP_RESULT_CODE_LAST_OFFSET_V1, ATP_RESULT_CODE_NOT_DEFINED}}; + +/* Define the maximum extended result code parameter length: */ +/* - '=' + <value> (up to 65535). */ +#define MAX_SINGLE_RESULT_CODE_VALUE_LEN (0x06) + +/* Define the structure associated with extended result codes. The format of */ +/* such result codes is <result_code>[=<value>] (See Headset Specification, */ +/* Section 4.7.3). <value> shall consist of a numeric constant. */ +typedef struct +{ + UINT16 value; +} T_ATP_SINGLE_RESULT_CODE_VALUE; + +/* Define all extended syntax result codes. */ +/* __________________________________________________________________________ */ +/* | | | | | | */ +/* | Binary code | Len | Result code | Numeric | Description | */ +/* |__________________|_____|_____________|_________|_________________________| */ +/* | | | | | | */ +/* | ATP_PLUS_VGM_NB | 4 | +VGM | X | Unsolicited result code | */ +/* | | | | | issued by the AG to set | */ +/* | | | | | the microphone gain of | */ +/* | | | | | the HS (See Headset | */ +/* | | | | | Specification, Section | */ +/* | | | | | 4.7.3). | */ +/* | ATP_PLUS_VGS_NB | 4 | +VGS | X | Unsolicited result code | */ +/* | | | | | issued by the AG to set | */ +/* | | | | | the speaker gain of the | */ +/* | | | | | HS (See Headset | */ +/* | | | | | Specification, Section | */ +/* | | | | | 4.7.3). | */ +/* |__________________|_____|_____________|_________|_________________________| */ +typedef T_ATP_SINGLE_RESULT_CODE_VALUE T_ATP_PLUS_VGM_PARAM; +typedef T_ATP_SINGLE_RESULT_CODE_VALUE T_ATP_PLUS_VGS_PARAM; + +/* Define the maximum number of characters appearing in the <text>. */ +/* - '=' + <value> (up to 65535). */ +#define MAX_CONNECT_TXT_LEN (MAX_SINGLE_RESULT_CODE_VALUE_LEN) + +/* Define the structure associated with CONNECT<text> result code whose format */ +/* is CONNECT <text> (See ITU-T Recommendation V.250 ter page 11). <text> */ +/* should specify the baudrate (1200, 2400, 4800, 9600 ...). */ +/* __________________________________________________________________________ */ +/* | | | | | | */ +/* | Binary code | Len | Result code | Numeric | Description | */ +/* |__________________|_____|_____________|_________|_________________________| */ +/* | | | | | | */ +/* |ATP_CONNECT_TXT_NB| 7 | CONNECT | X | A connection has been | */ +/* | | | | | established. | */ +/* |__________________|_____|_____________|_________|_________________________| */ +typedef T_ATP_SINGLE_RESULT_CODE_VALUE T_ATP_CONNECT_TXT_PARAM; + +/* Define the maximum number of characters appearing in the <error>. */ +#define MAX_PLUS_ERROR_LEN (30) + +/* Define the structure associated with <error> result code whose format is */ +/* either +CME ERROR: <error> (See See GSM TS 07.07, Section 9.2) or +CMS */ +/* ERROR: <error> (See GSM TS 07.05, Section 3.2.5)). */ +/* __________________________________________________________________________ */ +/* | | | | | | */ +/* | Binary code | Len | Result code | Numeric | Description | */ +/* |_____________________|_____|_____________|_________|______________________| */ +/* | | | | | | */ +/* |ATP_PLUS_CME_ERROR_NB| 11 | +CME ERROR: | X | Final result code | */ +/* | | | | | similar to the | */ +/* | | | | | regular ERROR result | */ +/* | | | | | code (See GSM TS | */ +/* | | | | | 07.07, Section 9.2). | */ +/* |_____________________|_____|_____________|_________|______________________| */ +/* | | | | | | */ +/* |ATP_PLUS_CMS_ERROR_NB| 11 | +CMS ERROR: | X | Final result code | */ +/* | | | | | that indicates an | */ +/* | | | | | error related to | */ +/* | | | | | mobile equipment or | */ +/* | | | | | network (See GSM TS | */ +/* | | | | | 07.05, Section | */ +/* | | | | | 3.2.5). | */ +/* |_____________________|_____|_____________|_________|______________________| */ +typedef struct +{ + char error_p[MAX_PLUS_ERROR_LEN]; + UINT8 error_length; +} T_ATP_PLUS_ERROR_RESULT_CODE; + + +/************************************ MACROS ************************************/ +/* */ +/* Define a macro used to compare the first "count" characters of the two */ +/* buffers "reference" and "buffer". The comparison is not case sensitive. Note */ +/* that the "reference" must be in all caps. Therefore, the gap between */ +/* alphabetic lower-case characters and their upper-case equivalents is 0x20 */ +/* (See CCITT T.50 (1992), International Reference Alphabet). */ +/* */ +/* Prototype: */ +/* ATP_MEM_I_CMP (T_ATP_TXT_CMD reference, */ +/* T_ATP_TXT_CMD buffer, */ +/* UINT8 count, */ +/* BOOLEAN *equal); */ +#define ATP_MEM_I_CMP(reference, \ + buffer, \ + count, \ + equal) \ + { \ + UINT8 nb_byte = 0x00; \ + while ((nb_byte < (count)) && \ + (((buffer)[nb_byte] == (reference)[nb_byte]) || \ + (((buffer)[nb_byte] >= 'a') && \ + ((buffer)[nb_byte] <= 'z') && \ + ((reference)[nb_byte] == ((buffer)[nb_byte] - '\x20'))))) \ + { \ + nb_byte++; \ + } \ + *(equal) = (BOOLEAN) ((nb_byte == (count)) ? (TRUE) : (FALSE)); \ + } + +/* Define a macro used to compare the first "count" characters of the two */ +/* buffers "reference" and "buffer". The comparison is not case sensitive. */ +/* Besides, space characters are ignored and may be used freely for formatting */ +/* purposes (See ITU-T Recommendation V.250 ter page 4). Note that the */ +/* "reference" must be in all caps. Therefore, the gap between alphabetic */ +/* lower-case characters and their upper-case equivalents is 0x20 (See CCITT */ +/* T.50 (1992), International Reference Alphabet). */ +/* */ +/* Prototype: */ +/* ATP_MEM_SP_I_CMP (T_ATP_TXT_CMD reference, */ +/* T_ATP_TXT_CMD buffer, */ +/* UINT8 *count, */ +/* BOOLEAN *equal); */ +#define ATP_MEM_SP_I_CMP(reference, \ + buffer, \ + count, \ + equal) \ + { \ + UINT8 nb_byte_ref = 0x00; \ + UINT8 nb_byte_buf = 0x00; \ + while ((nb_byte_ref < *(count)) && \ + (((buffer)[nb_byte_buf] == '\x20') || \ + ((buffer)[nb_byte_buf] == (reference)[nb_byte_ref]) || \ + (((buffer)[nb_byte_buf] >= 'a') && \ + ((buffer)[nb_byte_buf] <= 'z') && \ + ((reference)[nb_byte_ref] == ((buffer)[nb_byte_buf] - '\x20'))))) \ + { \ + if ((buffer)[nb_byte_buf++] == '\x20') \ + { \ + continue; \ + } \ + nb_byte_ref++; \ + } \ + *(equal) = (BOOLEAN) ((nb_byte_ref == *(count)) ? (TRUE) : (FALSE)); \ + *(count) = nb_byte_buf; \ + } + + +/************************ MACROS DEDICATED TO AT COMMANDS ***********************/ +/* */ +/* Define a macro used to get the <number> of basic syntax commands. Note that */ +/* <number> may be a string of one or more characters from "0" through "9" */ +/* representing the decimal integer value (See ITU-T Recommendation V.250 ter */ +/* page 5). Besides, if <number> is missing, the "initial_value" is assumed. */ +/* */ +/* Prototype: */ +/* ATP_GET_NUMBER (T_ATP_TXT_CMD cmd_line_p, */ +/* UINT16 *number_p, */ +/* const char initial_value); */ +#define ATP_GET_NUMBER(cmd_line_p, \ + number_p, \ + initial_value) \ + { \ + char nb_value_p[0x05] = {'\x00','\x00','\x00','\x00','\x00'}; \ + UINT8 nb_digit = 0x00; \ + for (*nb_value_p = initial_value; \ + ((*(cmd_line_p) >= '0') && (*(cmd_line_p) <= '9')) || \ + (*(cmd_line_p) == ' '); \ + (cmd_line_p)++) \ + { \ + if (((*(cmd_line_p) == '0') && (nb_digit == 0x00)) || \ + (*(cmd_line_p) == ' '))\ + { \ + continue; \ + } \ + nb_value_p[nb_digit++] = *(cmd_line_p); \ + } \ + *(number_p) = (UINT16) atoi (nb_value_p); \ + } + +/* Define a macro used to get the <dial_string> of dial (See ITU-T */ +/* Recommendation V.250 ter page 31). All characters appearing on the same */ +/* command line after D are considered part of the call addressing information */ +/* to be signalled to the network, or modifiers used to control the signalling */ +/* process, up to a semicolon character or the end of the command line. If the */ +/* <dial_string> is terminated by a semicolon, the DCE does not start the call */ +/* origination procedure, but instead returns to command state after completion */ +/* of the signalling of call addressing information to the network. */ +/* */ +/* Prototype: */ +/* ATP_GET_DIAL_STRING (T_ATP_TXT_CMD cmd_line_p, */ +/* T_ATP_TXT_CMD dial_string_p, */ +/* UINT8 *dial_string_length_p, */ +/* UINT8 *call_type_p, */ +/* const char termination_char); */ +#define ATP_GET_DIAL_STRING(cmd_line_p, \ + dial_string_p, \ + dial_string_length_p, \ + call_type_p, \ + termination_char) \ + { \ + *(call_type_p) = DATA_CALL; \ + for (*(dial_string_length_p) = 0x00; \ + (*(cmd_line_p) != termination_char) && \ + (*(dial_string_length_p) < MAX_DIAL_STRING_LEN); \ + (*(dial_string_length_p))++) \ + { \ + if (*(cmd_line_p) == ';') \ + { \ + *(call_type_p) = VOICE_CALL; \ + break; \ + } \ + (dial_string_p)[*(dial_string_length_p)] = *(cmd_line_p)++; \ + } \ + } + +/* Define a macro used to get operators such as "=", "?" or "=?". */ +/* */ +/* Prototype: */ +/* ATP_GET_OPERATOR (T_ATP_TXT_CMD cmd_line_p, */ +/* T_ATP_EXTENDED_OPERATOR *s_operator_p); */ +#define ATP_GET_OPERATOR(cmd_line_p, \ + s_operator_p) \ + { \ + for (*(s_operator_p) = 0x00; \ + ((*(cmd_line_p) == '=') || (*(cmd_line_p) == '?') || \ + (*(cmd_line_p) == ' ')); \ + (cmd_line_p)++) \ + { \ + switch (*(cmd_line_p)) \ + { \ + case '?': \ + { \ + *(s_operator_p) += 0x01; \ + break; \ + } \ + case '=': \ + { \ + *(s_operator_p) += 0x02; \ + break; \ + } \ + default: \ + { \ + break; \ + } \ + } \ + } \ + } + +/* Define a macro used to get the <value> of S-parameters. Note that <value> */ +/* shall consist of a decimal constant (See ITU-T Recommendation V.250 ter page */ +/* 6). */ +/* */ +/* Prototype: */ +/* ATP_GET_PARAMETER_VALUE (T_ATP_TXT_CMD cmd_line_p, */ +/* T_ATP_EXTENDED_OPERATOR *s_operator_p, */ +/* UINT16 *value_p); */ +#define ATP_GET_PARAMETER_VALUE(cmd_line_p, \ + s_operator_p, \ + value_p) \ + { \ + ATP_GET_OPERATOR((cmd_line_p), \ + (s_operator_p)); \ + ATP_GET_NUMBER((cmd_line_p), \ + (value_p), \ + '0'); \ + } + +/* Define a macro used to proceed with subsequent commands that might follow an */ +/* extended syntax command (See ITU-T Recommendation V.250 ter page 9). */ +/* */ +/* Prototype: */ +/* ATP_GET_ADDITIONAL_CMD (T_ATP_TXT_CMD cmd_line_p, */ +/* const char termination_char); */ +#define ATP_GET_ADDITIONAL_CMD(cmd_line_p, \ + termination_char) \ + { \ + while (*(cmd_line_p) != termination_char) \ + { \ + if (*(cmd_line_p)++ == ';') \ + { \ + break; \ + } \ + } \ + } + +/* Define a macro used to get the <value> of extended syntax commands. Note */ +/* that <value> shall consist of either a numeric constant or a string constant */ +/* (See ITU-T Recommendation V.250 ter page 6). However, only numeric constants */ +/* are supported for now. */ +/* */ +/* Prototype: */ +/* ATP_GET_VALUE (T_ATP_TXT_CMD cmd_line_p, */ +/* T_ATP_EXTENDED_OPERATOR *extended_operator_p, */ +/* UINT16 *value_p, */ +/* const char termination_char); */ +#define ATP_GET_VALUE(cmd_line_p, \ + extended_operator_p, \ + value_p, \ + termination_char) \ + { \ + ATP_GET_OPERATOR((cmd_line_p), \ + (extended_operator_p)); \ + ATP_GET_NUMBER((cmd_line_p), \ + (value_p), \ + '0'); \ + ATP_GET_ADDITIONAL_CMD((cmd_line_p), \ + (termination_char)); \ + } + +/* Define a macro used to get the <keys> of keypad control command. Note that */ +/* <keys> shall consist of a string constant (See ETS 300 916 (GSM 07.07) */ +/* Version 5.8.1 page 62). Note also that <keys> is a string of characters */ +/* representing keys (See See ETS 300 916 (GSM 07.07) Version 5.8.1 page 62). */ +/* Colon character followed by one character can be used to indicate a */ +/* manufacturer specific key not listed here. All characters from a semicolon */ +/* character to the next single semicolon character are treated as alpha */ +/* entries and are not converted to key equivalents. All semicolon characters */ +/* inside alpha entries should be duplicated in the DTE. Pause characters "W" */ +/* and "w" can be used to pause between key pressings for a time specified by */ +/* <pause>. */ +/* */ +/* Prototype: */ +/* ATP_GET_KEYS (T_ATP_TXT_CMD cmd_line_p, */ +/* T_ATP_AT_PLUS_CKPD_PARAM *ckpd_param_p, */ +/* const char termination_char); */ +#define ATP_GET_KEYS(cmd_line_p, \ + ckpd_param_p, \ + termination_char) \ + { \ + ATP_GET_NUMBER((cmd_line_p), \ + &((ckpd_param_p)->keys[0x00]), \ + '0'); \ + (ckpd_param_p)->nb_keys = 0x01; \ + ATP_GET_ADDITIONAL_CMD((cmd_line_p), \ + (termination_char)); \ + } +// { \ +// UINT8 nb_keys = 0x00; \ +// while (*(cmd_line_p) != termination_char) \ +// { \ +// if (*(cmd_line_p)++ == '\"') \ +// { \ +// break; \ +// } \ +// } \ +// while (*(cmd_line_p) != termination_char) \ +// { \ +// switch (*(cmd_line_p)++) \ +// { \ +// case ' ': \ +// { \ +// continue; \ +// } \ +// case ';': \ +// { \ +// ATP_GET_NUMBER((cmd_line_p), \ +// &((ckpd_param_p)->keys[nb_keys]), \ +// '0'); \ +// nb_keys++; \ +// while (*(cmd_line_p) != termination_char) \ +// { \ +// if (*(cmd_line_p)++ == ';') \ +// { \ +// break; \ +// } \ +// } \ +// continue; \ +// } \ +// case ':': \ +// { \ +// while (*(cmd_line_p) != termination_char) \ +// { \ +// if (*(cmd_line_p)++ == ':') \ +// { \ +// break; \ +// } \ +// } \ +// continue; \ +// } \ +// case '\"': \ +// { \ +// break; \ +// } \ +// default: \ +// { \ +// (ckpd_param_p)->keys[nb_keys] = (UINT16) (*(cmd_line_p - 0x01)); \ +// nb_keys++; \ +// continue; \ +// } \ +// } \ +// break; \ +// } \ +// (ckpd_param_p)->nb_keys = nb_keys; \ +// } + +/* Define a macro used to proceed with subsequent numeric and string values */ +/* that might appear in a compound value (See ITU-T Recommendation V.250 ter */ +/* page 7). */ +/* */ +/* Prototype: */ +/* ATP_GET_ADDITIONAL_VALUE (T_ATP_TXT_CMD cmd_line_p, */ +/* const char termination_char); */ +#define ATP_GET_ADDITIONAL_VALUE(cmd_line_p, \ + termination_char) \ + { \ + while (*(cmd_line_p) != termination_char) \ + { \ + switch (*(cmd_line_p)) \ + { \ + case ',': \ + { \ + cmd_line_p++; \ + } \ + case ';': \ + { \ + break; \ + } \ + default: \ + { \ + cmd_line_p++; \ + continue; \ + } \ + } \ + break; \ + } \ + } + +/* Define a macro used to get the <keys>,<time> and <pause> of keypad control */ +/* command. Note that <keys> shall consist of a string constant and <time> and */ +/* <pause> shall consist of numeric constants in tenths of a second (See ETS */ +/* 300 916 (GSM 07.07) Version 5.8.1 page 62). */ +/* */ +/* Prototype: */ +/* ATP_GET_CKPD_PARAM (T_ATP_TXT_CMD cmd_line_p, */ +/* T_ATP_AT_PLUS_CKPD_PARAM *ckpd_param_p, */ +/* const char termination_char); */ +#define ATP_GET_CKPD_PARAM(cmd_line_p, \ + ckpd_param_p, \ + termination_char) \ + { \ + ATP_GET_OPERATOR((cmd_line_p), \ + &((ckpd_param_p)->extended_operator)); \ + ATP_GET_KEYS((cmd_line_p), \ + (ckpd_param_p), \ + (termination_char)); \ + ATP_GET_ADDITIONAL_VALUE((cmd_line_p), \ + (termination_char)); \ + ATP_GET_NUMBER((cmd_line_p), \ + &((ckpd_param_p)->time), \ + '0'); \ + ATP_GET_ADDITIONAL_VALUE((cmd_line_p), \ + (termination_char)); \ + ATP_GET_NUMBER((cmd_line_p), \ + &((ckpd_param_p)->pause), \ + '0'); \ + ATP_GET_ADDITIONAL_CMD((cmd_line_p), \ + (termination_char)); \ + } + + +/************************ MACRO DEDICATED TO RESULT CODES ***********************/ +/* */ +/* Define a macro used to get the <value> associated with extended result codes */ +/* (See Headset Specification, Section 4.7.3). Note that <value> shall consist */ +/* of a numeric constant. */ +/* */ +/* Prototype: */ +/* ATP_GET_RESULT_CODE_VALUE (T_ATP_TXT_CMD cmd_line_p, */ +/* UINT16 *value_p); */ +#define ATP_GET_RESULT_CODE_VALUE(cmd_line_p, \ + value_p) \ + { \ + UINT8 result_operator = 0x00; \ + ATP_GET_OPERATOR((cmd_line_p), \ + &result_operator); \ + ATP_GET_NUMBER((cmd_line_p), \ + (value_p), \ + '0'); \ + } + +/* Define a macro used to get the <text> associated with CONNECT <text> result */ +/* code (See ITU-T Recommendation V.250 ter page 11). */ +/* */ +/* Prototype: */ +/* ATP_GET_CONNECT_TXT (T_ATP_TXT_CMD cmd_line_p, */ +/* UINT16 *value_p); */ +#define ATP_GET_CONNECT_TXT(cmd_line_p, \ + value_p) \ + { \ + ATP_GET_NUMBER((cmd_line_p), \ + (value_p), \ + '0'); \ + } + +/* Define a macro used to get the <error> of +CME ERROR (See See GSM TS 07.07, */ +/* Section 9.2) and +CMS ERROR (See GSM TS 07.05, Section 3.2.5)) result codes. */ +/* */ +/* Prototype: */ +/* ATP_PLUS_ERROR_STRING (T_ATP_TXT_CMD cmd_line_p, */ +/* T_ATP_TXT_CMD error_p, */ +/* UINT8 *error_length_p, */ +/* const char termination_char); */ +#define ATP_PLUS_ERROR_STRING(cmd_line_p, \ + error_p, \ + error_length_p, \ + termination_char) \ + { \ + for (*(error_length_p) = 0x00; \ + (*(cmd_line_p) != termination_char) && \ + (*(error_length_p) < MAX_PLUS_ERROR_LEN); \ + (*(error_length_p))++) \ + { \ + (error_p)[*(error_length_p)] = *(cmd_line_p)++; \ + } \ + } + + +/************************** MACRO DEDICATED TO RAW DATA *************************/ +/* */ +/* Define a macro used to get the length of unknown commands from raw data, */ +/* <CR> not included. Note that all characters appearing on the same command */ +/* line are considered part of the unknown command, up to the end of the */ +/* command line. */ +/* */ +/* Prototype: */ +/* ATP_GET_UNKNOWN_CMD_LEN (T_ATP_TXT_CMD cmd_line_p, */ +/* UINT8 *cmd_length_p); */ +/* const char termination_char); */ +#define ATP_GET_UNKNOWN_CMD_LEN(cmd_line_p, \ + cmd_length_p, \ + termination_char) \ + { \ + for (*(cmd_length_p) = 0x00; \ + (cmd_line_p)[*(cmd_length_p)] != termination_char; \ + (*(cmd_length_p))++) \ + { \ + } \ + } + +/* Define a macro used to get the length of unknown AT commands from raw data, */ +/* <CR> or semicolon not included. Note that all characters appearing on the */ +/* same command line are considered part of the unknown command, up to a */ +/* semicolon character or the end of the command line. */ +/* */ +/* Prototype: */ +/* ATP_GET_UNKNOWN_AT_CMD_LEN (T_ATP_TXT_CMD cmd_line_p, */ +/* UINT8 *cmd_length_p); */ +/* const char termination_char); */ +#define ATP_GET_UNKNOWN_AT_CMD_LEN(cmd_line_p, \ + cmd_length_p, \ + termination_char) \ + { \ + for (*(cmd_length_p) = 0x00; \ + ((cmd_line_p)[*(cmd_length_p)] != termination_char) && \ + ((cmd_line_p)[*(cmd_length_p)] != ';'); \ + (*(cmd_length_p))++) \ + { \ + } \ + } + +#endif \ No newline at end of file