diff src/g23m-fad/tcpip/include/atp_cmd.h @ 174:90eb61ecd093

src/g23m-fad: initial import from TCS3.2/LoCosto
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 12 Oct 2016 05:40:46 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-fad/tcpip/include/atp_cmd.h	Wed Oct 12 05:40:46 2016 +0000
@@ -0,0 +1,1343 @@
+/*******************************************************************************
+ *
+ * File Name : atp_cmd.h
+ *
+ * External definition for commands supported by ATP
+ *
+ * (C) Texas Instruments, all rights reserved
+ *
+ * Version number  : 0.1      Date : 7-Marsh-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_general.h"
+#include "rvf_api.h"
+#include "atp_config.h"
+#include "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.      */
+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; // Number of exit character that have been previously received
+  UINT8 *escape_sequence_tmp_buffer_p[MAX_NB_OF_CHARACTER_FOR_END_SEQUENCE]; // Used as temp buffer by the escape sequence algo
+  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).                 | */
+/* |__________________|_____|_____________|_________|_________________________| */
+/*                                                                              */
+/* 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', \
+                          '\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', \
+                          '\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_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_RESULT_CODE_LAST_OFFSET_V0 (ATP_PLUS_VGS_OFFSET_V0 + 0x04)
+
+/* 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_RESULT_CODE_LAST_OFFSET_V1 (ATP_PLUS_VGS_OFFSET_V1 + 0x04)
+
+/* Related structures.                                                          */
+typedef enum
+{
+  ATP_RESULT_CODE_NOT_DEFINED = (0x00000000),
+  ATP_BASIC_RESULT_CODE,
+  ATP_EXTENDED_RESULT_CODE,
+  ATP_CONNECT_TXT_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_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_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;
+
+/************************************ 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; \
+      *(dial_string_length_p) = 0x00; \
+      while (*(cmd_line_p) != termination_char) \
+      { \
+        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'); \
+    }
+
+/************************** 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
+