4G接电信平台

4G接电信平台,实现tcp透传功能:

系统ucosiii,其中网络处理代码如下:

   1 /*****************************************************************************
   2  * FILE NAME   gsm.c
   3  * DESCRIPTION:    
   4  * Copyright   : PGST Technologies Ltd.
   5  * All Rights  Reserved
   6  * Author: Milo lu
   7  * Copyright (c) 2021, PGST Technologies Ltd.
   8  *
   9  * All rights reserved.
  10 -* ****************************************************************************/
  11 #include "main.h"
  12 #include "includes.h"
  13 #include <my.h>
  14 #include <my_string.h>
  15 #include <stdlib.h>
  16 
  17 #include "para.h"
  18 #include "wavplay.h"
  19 
  20 #include "protocol.h"
  21 #include "Encoder.h"
  22 #include "Parser_Bxi.h"
  23 #include "crc16.h"
  24 #include "my_enum.h"
  25 #include "caption.h"
  26 #include "gsm.h"
  27 
  28 
  29 
  30 //=======================================\
  31 Public external variable declaration\
  32 =========================================/
  33 extern flag_e gflag;
  34 extern u32 g_CurrentTransmit_buf[];
  35 extern u16 EnLength;
  36 extern uint16_t g16_package_length;
  37 extern char encodingString[];
  38 extern TyReadTypeDef_t TyReadTypeDef;
  39 extern STRU_LEARN struLearn;
  40 extern u8 show_uplink_downlink_icon;
  41 //================================\
  42 Public variable declaration\
  43 ==================================/
  44 SequenceNumber_e sequence_number_req;
  45 SequenceNumber_e sequence_number_res;
  46 u8 tmr_clock_test;
  47 
  48 u8 g_M25_M26_specific;
  49 u8 g_Version_M25MAR01A11=0;
  50 u8 ec200n_dk = 0;
  51 //u8 NoAckResponse_Count;
  52 
  53 OS_EVENT *msg_gsm_parse;
  54 
  55 volatile u16 tmrRecord;
  56 volatile ENUM_AUDIO_MODE audio_mode;
  57 
  58 #if WReadCounter_Enable
  59 u8 g_u8_WReadCounter;
  60 #endif
  61 #if PK
  62 u32 TestSignal_24H_Timer_sec = 0;   /* default value is 0, when network registered, it will start counting TestSignal_24H_Timer_sec=1 */
  63 #endif
  64 
  65 //=================================\
  66 Private variable declaration\
  67 ===================================/
  68 Registered_e Registered_On_Network=UNKNOWN;
  69 
  70 const static s8 USA_ICCID[] = "01";
  71 //const static s8 IRELAND_ICCID[]= "35";
  72 const static s8 UK_ICCID[]= "44";
  73 const static s8 CHINA_ICCID[]="86";
  74 const static s8 CANADA_ICCID[]  = "30";
  75 const static s8 NETHERLANDS_ICCID[] = "31";
  76 const static s8 ATT_ICCID[]="89011";
  77 
  78 const static s8 AT_ATT_CGDCONT[]="wyless.com.attz";
  79 const static s8 AT_NETHERLANDS[]="gneroaming.net";
  80 const static s8 AT_USA_CGDCONT[]="telargo.t-mobile.com";
  81 const static s8 AT_IRELAND_CGDCONT[]="wyless.net";
  82 const static s8 AT_UK_CGDCONT[]="o2.wyless.net";
  83 const static s8 AT_CHINA_CGDCONT[]= "CMNET";
  84 const static s8 AT_CANADA_CGDCONT[]= "gne.apn";
  85 const static s8 AT_CHINA_UNICOM[]="UNINET";//988601,06,09
  86 
  87 static TcpTx_e  My_TcpTx = TCP_IDLE;
  88 static u8 Timer_index=0;
  89 static u16 Remote_index=0;
  90 static u16 Detector_index=0;
  91 //=================================\
  92 Private variable declaration\
  93 ===================================/
  94 const STRU_AT struAtNetwork[] =         /* Network signal check, request per 6second */
  95 {
  96     { "AT\r",RET_OK,1,10},
  97     { "AT+CSQ\r",RET_OK,2,2},            /* check signal quality */
  98     { "AT+CGREG?\r",RET_OK,2,2},            /* Check network registration status */
  99     { "AT+CEREG?\r",RET_OK,2,2},            /* Check network registration status */
 100     { NULL, NULL, 0, 0},
 101 };
 102 
 103 const STRU_AT struAtInit[] = 
 104 {
 105     { "ATE0\r",RET_OK,1,2},
 106 //    { "AT+CMGF=1\r",RET_OK,1,60},       /* Message format configuration: 1=Text */
 107     //{ "AT+CLIP=1\r",RET_OK,1,60},       /* Mobile terminating call indication */
 108 //    { "AT+CNMI=2,1\r",RET_OK,2,60},     /* SMS Event reporting configuration */
 109 //    { "AT+CMGL=\"ALL\"\r",RET_OK,5,60}, /* List all message */
 110     { NULL, NULL, 0, 0},
 111 };
 112 const STRU_AT AT_UC15_INIT_UART[] =     /* not used for ec200s module */
 113 {
 114     { "AT+QCFG=\"vbatt\",2,4400,0\r",RET_OK,1,2},
 115     { "AT+QURCCFG=\"urcport\",\"uart1\"\r",RET_OK,1,2},
 116 //    { "AT+QCFG=\"amrcodec\",7\r",RET_OK,1,2},
 117 //    { "AT+QRCH=0\r",RET_OK,1,2},
 118 //    { "AT+QMIC=1,8192,8192\r",RET_OK,2,2},        /* range:0~65535,default value:8192 all */
 119     { NULL, NULL, 0, 0},
 120 };
 121 const STRU_AT AT_EC200S_EC25_INIT_UART[] = 
 122 {
 123     { "AT+QURCCFG=\"urcport\",\"uart1\"\r",RET_OK,2,6}, /* urc configuration*/
 124     { NULL, NULL, 0, 0},
 125 };
 126 
 127 const STRU_AT struAtSetAscii[] = 
 128 {
 129     { "AT+CSCS=\"GSM\"\r",RET_OK,1,2},    /* TE character set: GSM alphabet */
 130     { "AT+CSMP=,,,0\r",RET_OK,1,2},        /* Set SMS Text Mode Parameters */
 131     { NULL, NULL, 0, 0},
 132 };
 133 const STRU_AT struM25_AtSetAscii[] = 
 134 {
 135     { "AT+CSCS=\"GSM\"\r",RET_OK,1,2},    /* TE character set: GSM alphabet */
 136     //{ "AT+CSMP=,,,0\r",RET_OK,1,2},        /* Set SMS Text Mode Parameters */
 137     { "AT+CSMP=17,71,0,0\r",RET_OK,1,2},        /* Set SMS Text Mode Parameters */
 138     { NULL, NULL, 0, 0},
 139 };
 140 const STRU_AT struAtSetHz[] =
 141 {
 142     { "AT+CSCS=\"UCS2\"\r",RET_OK,1,2},
 143     { "AT+CSMP=,,,8\r",RET_OK,1,2},
 144     
 145     { NULL, NULL, 0, 0},
 146 };
 147 const STRU_AT struM25_AtSetHz[] =
 148 {
 149     { "AT+CSCS=\"UCS2\"\r",RET_OK,1,2},
 150     { "AT+CSMP=49,167,0,25\r",RET_OK,1,2},
 151     
 152     { NULL, NULL, 0, 0},
 153 };
 154 const STRU_AT struAtCallOut[]=
 155 {
 156     { "ATH\r",RET_OK,5,10},                 /* Hang up */
 157     { "AT+QSIDET=0\r",RET_OK,2,6},          /* Set the Side Tone Gain in Current Mode */
 158     //{ "AT+QTONEDET=0\r",RET_OK,2,6},
 159     //{"AT+QAUDSW=1\r",RET_OK,2,6},
 160     { "AT+QTONEDET=1\r",RET_OK,2,6},        /* Enable DTMF */
 161     { NULL, NULL, 0, 0},
 162 };
 163 const STRU_AT struAtCallOut_SIMCom[]=
 164 {
 165     { "AT+CLVL=15\r",RET_OK,2,6},   /* 0-15 */
 166     { "AT+DDET=1\r",RET_OK,2,6},    /* Enable DTMF */
 167     { NULL, NULL, 0, 0},
 168 };
 169 const STRU_AT struAtCallOut_SIMCom7[]=
 170 {
 171     { "AT+CMICGAIN=7\r",RET_OK,2,6},   /* mic = 0-7 */
 172     { "AT+COUTGAIN=7\r",RET_OK,2,6},   /* spk = 0-7 */
 173     { NULL, NULL, 0, 0},
 174 };
 175 const STRU_AT struAtCallOut_M26[]=  /* not used for ec200s module */
 176 {
 177     { "AT+QAUDCH=0\r",RET_OK,2,6},  /* change the voice channel:1=main,1=earphone,2=hands-free channel*/
 178     { "AT+QMIC=0,5\r",RET_OK,2,6},
 179     { "AT+CLVL=50\r",RET_OK,2,6},   /* 0-100 */
 180     { "AT+QAPS=1,4,0,\"248.253.2218.31.57351.31.400.0.80.4325.99.0.8223.0.0.8192\"\r",RET_OK,2,6 },
 181     { NULL, NULL, 0, 0},
 182 };
 183 const STRU_AT struAtCallOut_M25[]=            /* not used for ec200s module */
 184 {
 185     { "AT+QAUDCH=0\r",RET_OK,2,6},
 186     { "AT+QMIC=0,3\r",RET_OK,2,6},        /* 0-15*/
 187     { "AT+CLVL=60\r",RET_OK,2,6},        /* 0-100 */
 188     { NULL, NULL, 0, 0},
 189 };
 190 const STRU_AT struAtCallOut_UC15[]=         /*not used for ec200s module */
 191 {
 192     { "AT+QAUDPATH=0\r",RET_OK,2,6},        /* change the voice channel:1=main,1=earphone,2=hands-free channel*/
 193     { "AT+QMIC=1,8192,8192\r",RET_OK,2,6},  /* range:0~65535,default value:8192 all (1024) */
 194     { "AT+CLVL=3\r",RET_OK,2,6},            /* range:0~7,default value:3 */
 195     { NULL, NULL, 0, 0},
 196 };
 197 const STRU_AT struAtCallOut_EC25[]=
 198 {
 199     { "AT+QDAI=3\r",RET_OK,2,6},
 200     { "AT+CLVL=3\r",RET_OK,2,6},
 201     { "AT+QAUDMOD=2\r",RET_OK,2,6},
 202     { "AT+QMIC=8192,8192\r",RET_OK,2,6},
 203     { "AT+QRXGAIN=60000\r",RET_OK,2,6},
 204     { "AT+QEEC=0,2048\r",RET_OK,2,6},
 205     { "AT+QEEC=5,14\r",RET_OK,2,6},
 206     { "AT+QEEC=10,160\r",RET_OK,2,6},
 207     { "AT+QEEC=21,25000\r",RET_OK,2,6},
 208     { "AT+QEEC=22,6000\r",RET_OK,2,6},
 209     { "AT+QEEC=33,768\r",RET_OK,2,6},
 210     { NULL, NULL, 0, 0},
 211 };
 212 const STRU_AT struAtCallOut_EC200S[]=
 213 {   
 214     #if HW_25==1
 215     #else
 216     //{ "AT+QDAI=3\r",RET_OK,2,6},            /* Digital Audio Interface Configuration:Analog output (for our default audio codec ALC5616) */
 217     #endif
 218     { "AT+CLVL=4\r",RET_OK,2,6},            /* Loudspeaker volume level selection: 0-3-5 */
 219     { "AT+QAUDMOD=0\r",RET_OK,2,6},         /* Set Audio Mode:2=Echo canceller, noise suppressor, digital gain and calibration parameter for Speaker */
 220     //{ "AT+QMIC=8192\r",RET_OK,2,6},       /* Set Uplink Gains of MIC */
 221     { NULL, NULL, 0, 0},
 222 };
 223 
 224 const STRU_AT AT_RECORD_MIC_UC15 = { "AT+QMIC=1,1024,1024\r",RET_OK,2,6};   /* not used for ec200s module!-- range:0~65535,default value:8192 all */
 225 const STRU_AT AT_RECORD_MIC_EC25 = { "AT+QMIC=60000,60000\r",RET_OK,2,2};
 226 const STRU_AT AT_RECORD_MIC_EC200S = { "AT+QMIC=60000\r",RET_OK,2,2};       /* Set Uplink Gains of MIC: 8192 */
 227 
 228 const STRU_AT struAtSendDtmf[] =
 229 {
 230     { "AT+VTD=1,500\r",RET_OK,2,2},                /* Sets the duration of DTMF tones */
 231     { "AT+VTS=#\r",RET_OK,2,2},                    /* Used to send ASCII characters which cause MSC to transmit DTMF tones to a remote subscriber */
 232     { NULL, NULL, 0, 0},
 233 };
 234 
 235 const STRU_AT AT_GET_FIRMWARE_CGMR = {"AT+CGMR\r",VERSION_OK,2,2};
 236 const STRU_AT AT_GET_FIRMWARE = {"AT+GMR\r",VERSION_OK,2,2};    /* firmware version */
 237 const STRU_AT AT_GET_CGSN = {"AT+CGSN=1\r",RET_OK,2,2};         /* IMEI number */
 238 const STRU_AT AT_GET_IMEI = {"AT+GSN\r",RET_OK,2,2};            /* IMEI number */
 239 
 240 const STRU_AT AT_GET_IMSI = {"AT+CIMI\r\n",RET_OK,1,5};            /* Return IMSI number */
 241 const STRU_AT AT_GET_NCCID = {"AT+NCCID\r\n",RET_OK,1,5};        /* Return ICCID number means SIM card inser,or no sim car */
 242 const STRU_AT AT_GET_ICCID = {"AT+CCID\r\n",RET_OK,1,5};        /* Return ICCID number means SIM card inser,or no sim car */
 243 const STRU_AT AT_GET_CICCID = {"AT+CICCID\r\n",RET_OK,1,5};        /* Return ICCID number means SIM card inser,or no sim car */
 244 
 245 #ifdef    M26
 246 /***for M26*******************************************************************/
 247 const STRU_AT AT_UC15_CONTEXT = {"AT+QIACT=1\r",RET_OK,30,60};          /* active a PDP context */
 248 const STRU_AT AT_UC15_CHECK_CONTEXT = {"AT+QIACT?\r",RET_CONNECT,1,1};  /* check PDP context */
 249 
 250 const STRU_AT struAtSendPlay_M26[] =         /* not used for ec200s module */
 251 {
 252     {"AT+QFLST=\"RAM:play.amr\"\r",RET_QFLST,2,2},
 253     {"AT+QPSND=1,\"RAM:play.amr\",1,7,0\r",RET_OK,1,1},
 254     { NULL, NULL, 0, 0},
 255 };
 256 const STRU_AT PLAY_SIMCom7ToRemote[] =         /* not used for ec200s module */
 257 {
 258     {"AT+FSLS\r",RET_QFLST,2,2},
 259     {"AT+CCMXPLAY=\"C:/re.wav\",1,0\r",RET_OK,1,1},/*play record to remote */
 260     { NULL, NULL, 0, 0},
 261 };
 262 
 263 //para:1=mode,2=name,3=channel,4=volume
 264 const STRU_AT AT_PLAY_SIMCom={"AT+CMEDPLAY=1,\"record.amr\",0,100\r",RET_OK,1,1};   /*play record */
 265 //AT+CCMXPLAY="C:/recording.wav",0,0-----//play the recorded file“C:/recording.wav”
 266 const STRU_AT AT_PLAY_SIMCom7={"AT+CCMXPLAY=\"C:/re.wav\",0,0\r",RET_OK,1,1};   /*play record to local */
 267 //AT+CCMXPLAY="C:/3034.amr",1,0----//play “C:/3034.amr” to the remote
 268 
 269 const STRU_AT struAtSendPlay_UC15[] =        /* not used for ec200s module */
 270 {
 271     {"AT+QFLST=\"UFS:play.wav\"\r",RET_QFLST,2,2},
 272     {"AT+QPSND=1,\"UFS:play.wav\",0,1\r",RET_OK,2,2},
 273     { NULL, NULL, 0, 0},
 274 };
 275 const STRU_AT struAtSendPlay0_EC200S_EC25[] =
 276 {
 277     {"AT+QFLST=\"record0.wav\"\r",RET_QFLST,2,2},        /* list the file "record0.wav" */
 278     {"AT+QPSND=1,\"record0.wav\",0,1,0\r",RET_OK,2,2},    /* Play back the audio files during voice call. */
 279     { NULL, NULL, 0, 0},
 280 };
 281 const STRU_AT struAtSendPlay1_EC200S_EC25[] =
 282 {
 283     {"AT+QFLST=\"record1.wav\"\r",RET_QFLST,2,2},        /* list the file "record1.wav" */
 284     {"AT+QPSND=1,\"record1.wav\",0,1,0\r",RET_OK,2,2},    /* Play back the audio files during voice call. */
 285     { NULL, NULL, 0, 0},
 286 };
 287 const STRU_AT struAtSendPlay0_EC200n[] =
 288 {
 289     {"AT+QFLST=\"record0.amr\"\r",RET_QFLST,2,2},        /* list the file "record0.wav" */
 290     {"AT+QPSND=1,\"record0.amr\",0,1,0\r",RET_OK,2,2},    /* Play back the audio files during voice call. */
 291     { NULL, NULL, 0, 0},
 292 };
 293 const STRU_AT struAtSendPlay1_EC200n[] =
 294 {
 295     {"AT+QFLST=\"record1.amr\"\r",RET_QFLST,2,2},        /* list the file "record1.wav" */
 296     {"AT+QPSND=1,\"record1.amr\",0,1,0\r",RET_OK,2,2},    /* Play back the audio files during voice call. */
 297     { NULL, NULL, 0, 0},
 298 };
 299 
 300 const STRU_AT struAtTcpConfig_M26[] =    /* not used for ec200s module */
 301 {
 302     { "AT+QIDEACT\r",RET_OK,45,45},        /* Deactivate a PDP context */    
 303     { "AT+QIFGCNT=0\r",RET_OK,2,2},
 304     { "AT+QIMUX=0\r",RET_OK,2,2},        /* AT+QIMUX 0 do not support mux sockets */
 305     { "AT+QIMODE=0\r",RET_OK,2,2},
 306     { "AT+QIDNSIP=0\r",RET_OK,2,2},
 307     { "AT+QIHEAD=1\r",RET_OK,2,2},
 308     { NULL, NULL, 0, 0},
 309 };
 310 const STRU_AT AT_Deactivate_a_PDP_context[] =    /*  (default) */
 311 {
 312     { "AT+QIDEACT=1\r",RET_OK,45,45},    /* Deactivate a PDP context:AT+QIDEACT=<contextID> */
 313     { NULL, NULL, 0, 0},
 314 };
 315 const STRU_AT Deactivate_a_PDP_context_SIMCom[] =
 316 {
 317     { "AT+CIPSHUT\r",SHUT_OK,45,45},    /* Deactivate a PDP context:AT+QIDEACT=<contextID> */
 318     //{ "AT+CIPHEAD=1\r",RET_OK,2,2},
 319     { "AT+QIHEAD=1\r",RET_OK,2,2},
 320     { NULL, NULL, 0, 0},
 321 };
 322 const STRU_AT Deactivate_a_PDP_context_SIMCom4[] =
 323 {
 324     { "AT+CGACT?\r",RET_OK,5,5},                /* read PDP context; response= +CGACT: [<cid>,<state> */
 325     { "AT+CGACT=1,1\r",RET_OK,2,2},             /* PDP context active; response= OK */
 326     { "AT+NSOCR=DGRAM,6,0,1\r",RET_OK,2,2},     /* Set up TCP Client Connection; response= OK */
 327     { NULL, NULL, 0, 0},
 328 };
 329 const STRU_AT Deactivate_a_PDP_context_SIMCom7[] =
 330 {
 331     { "AT+CGACT?\r",RET_OK,5,5},        /* read PDP context; response= +CGACT: [<cid>,<state> */
 332     { "AT+CGACT=1,1\r",RET_OK,2,2},     /* PDP context active; response= OK */
 333     { "AT+NETOPEN\r",RET_OK,2,2},       /* Set up TCP Client Connection; response= OK */
 334     { "at+ipaddr\r",RET_OK,2,2},        /* read ip address; response= OK */
 335     { NULL, NULL, 0, 0},
 336 };
 337 /*******************************************
 338 **        Close a socket service 
 339 ********************************************/
 340 const STRU_AT struAtCloseConnect_M26[] =    /* not used for ec200s module */
 341 {
 342     { "AT+QICLOSE\r",RET_OK,1,10},        /* M26:When AT+QIMUX=0, after establishing TCP or UDP connection, close connection as below */
 343     { "AT+QICLOSE=1\r",RET_OK,1,10},
 344     { "AT+QICLOSE=2\r",RET_OK,1,10},
 345     { NULL, NULL, 0, 0},
 346 };
 347 const STRU_AT struAtCloseConnect_SIMCom[] =    /* not used for ec200s module */
 348 {
 349     { "AT+CIPSHUT\r",SHUT_OK,1,10},
 350     { NULL, NULL, 0, 0},
 351 };
 352 const STRU_AT struAtCloseConnect_SIMCom7[] =    /* not used for ec200s module */
 353 {
 354     { "AT+CIPCLOSE=0\r",SHUT_OK,1,10},          /* response = +CIPCLOSE: <link_num>,<err> */
 355     { NULL, NULL, 0, 0},
 356 };
 357 const STRU_AT AT_Close_Socket_PDP_Context[] =    /* default */
 358 {
 359     { "AT+QICLOSE=0\r",RET_OK,1,10},        /*close socketID 0*/
 360     { "AT+QIDEACT=1\r",RET_OK,40,40},        /* Deactivate PDP ContextID 1 */
 361     { "AT+QICLOSE=2\r",RET_OK,1,10},
 362     { NULL, NULL, 0, 0},
 363 };
 364 
 365 const STRU_AT struAtTcpAck_M26[] =        /* not used for ec200s module */
 366 {
 367     { "AT+QISACK\r",RET_TCP_ACK,1,30},
 368     { "AT+QISACK=1\r",RET_TCP_ACK,1,30},
 369     { "AT+QISACK=2\r",RET_TCP_ACK,1,30},
 370     { NULL, NULL, 0, 0},
 371 };
 372 const STRU_AT struAtTcpAck_UC15[] =            /* default */
 373 {
 374     { "AT+QISEND=0,0\r",RET_TCP_ACK,1,30},    /* TCPIP: send data,socket_id=0,data length=0 */
 375     { "AT+QISACK=1\r",RET_TCP_ACK,1,30},    /* check data sent, socket_id=1 */
 376     { "AT+QISACK=2\r",RET_TCP_ACK,1,30},    /* check data sent, socket_id=2 */
 377     { NULL, NULL, 0, 0},
 378 };
 379 const STRU_AT struAtTcpAck_SIMCom[]=        //AT+CIPACK
 380 {
 381     { "AT+CIPACK\r",RET_TCP_ACK,1,30},
 382     { "AT+CIPACK=1\r",RET_TCP_ACK,1,30},
 383     { "AT+CIPACK=2\r",RET_TCP_ACK,1,30},
 384     { NULL, NULL, 0, 0},
 385 };
 386 const STRU_AT struAtTcpAck_SIMCom7[]=        //AT+CIPACK
 387 {
 388     { "AT+CIPACK=0\r",RET_TCP_ACK,1,30},
 389     { "AT+CIPACK=1\r",RET_TCP_ACK,1,30},
 390     { "AT+CIPACK=2\r",RET_TCP_ACK,1,30},
 391     { NULL, NULL, 0, 0},
 392 };
 393 const STRU_AT struAtNetworkTime_M26[] =        /* not used for ec200s module */
 394 {
 395     { "AT+CTZU=2\r",RET_OK,1,2},
 396     { "AT+QNITZ=1\r",RET_OK,1,2},
 397     { "AT+QLTS\r",RET_QLTS,2,10},
 398     { NULL, NULL, 0, 0},
 399 };
 400 /*const STRU_AT struAtNetworkTime_UC15[] =    // * not used for ec200s module (default) *
 401 {
 402     { "AT+CTZU=1\r",RET_OK,1,2},
 403     { "AT+QLTS\r",RET_QLTS,2,10},
 404     { NULL, NULL, 0, 0},
 405 };*/
 406 const STRU_AT struAtNetworkTime_Default[] =    /* for ec200s module */
 407 {
 408     { "AT+CTZU=1\r",RET_OK,1,2},    /* Automatic Time Zone Update */
 409     { "AT+QLTS\r",RET_QLTS,2,10},   /* Obtain the Latest Time Synchronized Through Network */
 410     { NULL, NULL, 0, 0},
 411 };
 412 
 413 
 414 //const STRU_AT AT_QFLST_EC200S_EC25 = {"AT+QFDEL=?\r",RET_OK,2,2};
 415 
 416 
 417 
 418 #else
 419 /***for huawei*******************************************************************/
 420 const STRU_AT struAtTcpConfig_MG323[]=
 421 {
 422     { "AT+CGATT?\r",RET_CGATT,2,60},
 423     { "AT%ETCPIP\r",RET_OK,60,120},
 424     { "AT%IOMODE=1,2\r",RET_OK,1,2},
 425     { NULL, NULL, 0, 0},
 426 };
 427 
 428 const STRU_AT struAtCloseConnect_MG323[] =
 429 {
 430     { "AT%IPCLOSE=1\r",RET_OK,5,5},
 431     { "AT%IPCLOSE=2\r",RET_OK,5,5},
 432     { "AT%IPCLOSE=3\r",RET_OK,5,5},
 433     { NULL, NULL, 0, 0},
 434 };
 435 #endif
 436 
 437 /*********************************************************************************************************
 438     variable declaration
 439 *********************************************************************************************************/
 440 STRU_GSM struGsm;
 441 static u32 at_return_result = 0;
 442 volatile u8 pgsGsm;
 443 /*********************************************************************************************************
 444     function declaration
 445 *********************************************************************************************************/
 446 SYS_ERR at_cmd_return( const STRU_AT *at );
 447 
 448 
 449 /*********************************************************************************************************
 450 ** Function name:    gsm_usart2_init
 451 ** Descriptions:    serial port initialization: baud rate = 115200 bit/s, PB10=TX,PB11=RX
 452 ** input parameters:    none
 453 ** Output parameters:    
 454 ** Returned value:    
 455 *********************************************************************************************************/
 456 void gsm_usart2_init()
 457 {
 458     GPIO_InitType  GPIO_InitStructure;
 459     usart_init( USART_ID2,115200 );
 460     RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE); /* Enable the GPIOA Clock */
 461     
 462     GPIO_InitStructure.Pin = GPIO_PIN_1|GPIO_PIN_11;
 463     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 464     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 465     GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
 466 }
 467 /*********************************************************************************************************
 468 ** Function name:    gsm_power_down
 469 ** Descriptions:    GSM Main power cut off for 1500 ticks
 470 ** input parameters:    none
 471 ** Output parameters:    NONE
 472 ** Returned value:    none
 473 *********************************************************************************************************/
 474 void gsm_power_cycle()
 475 {
 476 //    OS_ERR err;
 477     
 478     GSM_MAIN_PWR(0);
 479     OSTimeDly( 1500);//,OS_OPT_TIME_PERIODIC,&err );
 480     GSM_MAIN_PWR(1);
 481     OSTimeDly( 1000);//,OS_OPT_TIME_PERIODIC,&err );
 482 }
 483 /*********************************************************************************************************
 484 ** Function name:    gsm_power_on
 485 ** Descriptions:    GSM Power ON(for MG323:TERM_ON_PIN Pull down for 750ms
 486 ** if failed to power on, power cycle.
 487 ** input parameters:    none
 488 ** Output parameters:    NONE
 489 ** Returned value:    SYS_ERR_OK or SYS_ERR_AT_FAIL.
 490 *********************************************************************************************************/
 491 SYS_ERR gsm_power_on()
 492 {
 493     SYS_ERR err;
 494     u8 ctr;
 495     const STRU_AT strAt = {"AT\r",RET_OK,1,5};                    /* echo off */
 496     const STRU_AT struAt = {"ATE0\r",RET_OK,1,15};                    /* echo off */
 497     //const STRU_AT AT_GET_SIM_STAT = {"AT+QSIMSTAT?\r",RET_OK,1,3};    /* SIM card insertion status */
 498     //const STRU_AT AT_GET_ICCID = {"AT+CCID\r\n",RET_OK,1,5};        /* Return ICCID number means SIM card inser,or no sim car */
 499     //const STRU_AT AT_GET_CICCID = {"AT+CICCID\r\n",RET_OK,1,8};        /* Return ICCID number means SIM card inser,or no sim car */
 500     const STRU_AT AT_Ver = {"AT+CGMR\r",VERSION_OK,1,5};            /* version */
 501     const STRU_AT AT_ProductInfo = {"ATI\r",RET_OK,1,1};            /* version */
 502     
 503     ctr = 3;
 504     GSM_MAIN_PWR(1);        //power on
 505     OSTimeDly(1000);       //delay for power stable
 506     GSM_PWR_KEY(1);            /* power key on */
 507     OSTimeDly(2000);//OSTimeDly( 750);//,OS_OPT_TIME_PERIODIC,&err );
 508     GSM_PWR_KEY(0);            /* power key down */
 509     OSTimeDly(1000);//OSTimeDly( 5000);//,OS_OPT_TIME_PERIODIC,&err );
 510     while(ctr--)
 511     {
 512         err = at_cmd_return(&strAt);
 513         if( err == SYS_ERR_AT_FAIL )
 514         {
 515             continue;
 516         }
 517         err = at_cmd_return(&struAt);
 518         at_cmd_return(&AT_Ver);         //read module version,this command for SIMCom module, does not need to check the result.
 519         
 520         OSTimeDly(10);
 521         at_cmd_return(&AT_ProductInfo); /* The command delivers a product information text */
 522         
 523         OSTimeDly(10);//OSTimeDly( 500);//,OS_OPT_TIME_PERIODIC,&err );
 524         err = at_cmd_return(&struAt);
 525         if(err == SYS_ERR_OK )
 526         {
 527             struGsm.status |= GSM_STAT_NO_SIM;
 528             return SYS_ERR_OK;
 529         }
 530     }
 531     return SYS_ERR_AT_FAIL;
 532 }
 533 /*********************************************************************************************************
 534 ** Function name:    gsm_power_down
 535 ** Descriptions:    GSM power down(for MG323:TERM_ON_PIN pull down.)
 536 ** if failed to power on, power cycle.
 537 ** input parameters:    none
 538 ** Output parameters:    NONE
 539 ** Returned value:    SYS_ERR_OK or SYS_ERR_AT_FAIL.
 540 *********************************************************************************************************/
 541 SYS_ERR gsm_power_down()
 542 {
 543     //OS_ERR err;
 544     const STRU_AT struAt = {"AT\r",RET_OK,1,5};        /* at test */
 545     u8 ctr;
 546     
 547     GSM_PWR_KEY(1);                                    /* power key on */
 548     OSTimeDly( 2000);//,OS_OPT_TIME_PERIODIC,&err );
 549     GSM_PWR_KEY(0);                                    /* power key down */
 550     OSTimeDly( 2000);//,OS_OPT_TIME_PERIODIC,&err );
 551     ctr = 30;
 552     while(ctr--)
 553     {
 554         if( at_cmd_return(&struAt) == SYS_ERR_AT_FAIL )
 555         {
 556             GSM_MAIN_PWR(0);                      // main power off
 557             OSTimeDly( 20000);//,OS_OPT_TIME_PERIODIC,&err );
 558             return SYS_ERR_OK;
 559         }
 560         OSTimeDly( 1000);//,OS_OPT_TIME_PERIODIC,&err );
 561     }
 562     return SYS_ERR_AT_FAIL;
 563 }
 564 /*********************************************************************************************************
 565 ** Function name:    at_cmd_return
 566 ** Descriptions:    send a at cmd and wait for correct response
 567 ** input parameters:    STRU_AT
 568 ** Output parameters:    NONE
 569 ** Returned value:    SYS_ERR_OK, cmd transmit ok, or return SYS_ERR_AT_FAIL
 570 *********************************************************************************************************/
 571 SYS_ERR at_cmd_return( const STRU_AT *at )
 572 {
 573     //OS_MSG_SIZE size;
 574     INT8U  err;
 575     u32 *msg;
 576     u8 ctr;
 577     u32 time_start;
 578     
 579     ctr = at->time_total;///at->timeout;
 580     while(ctr--)
 581     {
 582         usart_send_str( USART3,at->command );
 583         #if gsm_debug
 584         printf("\r\n%s",at->command);
 585         #endif
 586         time_start = OSTimeGet();//&err);
 587         while(OSTimeGet()-time_start < at->timeout*1000)
 588         {
 589             msg = OSQPend( msg_gsm_parse,1000,&err );    /* task pend: wait for response */
 590             if( err == OS_ERR_NONE && (*msg&at->result) != 0 ) return SYS_ERR_OK;    /* get response */
 591             OSTimeDly( 10);                                    /* error */
 592         }
 593     }
 594     return SYS_ERR_AT_FAIL;
 595 }
 596 /*********************************************************************************************************
 597 ** Function name:    at_cmd_list_return
 598 ** Descriptions:    send a list of at cmds,
 599 ** input parameters:    lists_at_cmds
 600 ** Output parameters:    NONE
 601 ** Returned value:    SYS_ERR_OK all of at cmds are ok, or return SYS_ERR_AT_FAIL.
 602 *********************************************************************************************************/
 603 SYS_ERR at_cmd_list_return( const STRU_AT *at )
 604 {
 605     while( at->command != NULL )
 606     {
 607         if( at_cmd_return(at) != SYS_ERR_OK ) 
 608         {
 609             return SYS_ERR_AT_FAIL;
 610         }
 611         at++;    /* next at cmd */
 612     }
 613     return SYS_ERR_OK;
 614 }
 615 /*********************************************************************************************************
 616 ** Function name:    check_network_stat
 617 ** Descriptions:    read csq & creg status
 618 ** input parameters:    
 619 ** Output parameters:    NONE
 620 ** Returned value:    
 621 *********************************************************************************************************/
 622 SYS_ERR check_network_stat()
 623 {
 624     const STRU_AT *at;
 625     static u8 cntCregFail = 0,k;
 626     
 627     if( ( struGsm.task&(GSM_TASK_PLAY|GSM_TASK_RECORD|GSM_TASK_SAVE_RECORD) ) != 0 ) return SYS_ERR_OK;
 628     
 629     at = &struAtNetwork[0];
 630     if(at_cmd_return(at) != SYS_ERR_OK)
 631     {
 632         cntCregFail = 0;
 633         return SYS_ERR_AT_FAIL;                /* reset now */
 634     }
 635     #if 0
 636     const STRU_AT struAtNetwork[] =         /* Network signal check, request per 6second */
 637     {
 638         { "AT\r",RET_OK,1,10},
 639         { "AT+CSQ\r",RET_OK,2,2},            /* check signal quality */
 640         { "AT+CGREG?\r",RET_OK,2,2},        /* Check network registration status */
 641         { "AT+CEREG?\r",RET_OK,2,2},        /* Check network registration status */
 642         { NULL, NULL, 0, 0},
 643     };
 644     #endif
 645     k=1;
 646     at = &struAtNetwork[1];
 647     while(k)
 648     {
 649         if(at_cmd_return(at) != SYS_ERR_OK)        /* check CSQ*/
 650         {
 651             if(++cntCregFail >= 90)                /* normal 6s once time, 90*6/60=9 mins no sign,network failed. */
 652             {
 653                 cntCregFail = 0;
 654                 return SYS_ERR_AT_FAIL;
 655             }
 656         }
 657         else
 658         {
 659             if(k!=2)
 660             {
 661                 if(g_M25_M26_specific==4)
 662                 {
 663                     at = &struAtNetwork[3];
 664                 }
 665                 else
 666                 {
 667                     at = &struAtNetwork[2];
 668                 }
 669                 k=2;
 670             }
 671             else 
 672             {
 673                 k=0;
 674             }
 675             cntCregFail = 0;
 676         }
 677     }
 678     return SYS_ERR_OK;
 679 }
 680 /*********************************************************************************************************
 681 ** Function name:    gsm_at_init
 682 ** Descriptions:    
 683 ** input parameters:    
 684 ** Output parameters:    NONE
 685 ** Returned value: 
 686 *********************************************************************************************************/
 687 SYS_ERR gsm_at_init( ENUM_MODULE module )
 688 {
 689     /*
 690     { "ATE0\r",RET_OK,1,2},
 691     { "AT+CMGF=1\r",RET_OK,1,60},        Message format configuration: 1=Text /
 692     { "AT+CLIP=1\r",RET_OK,1,60},        Mobile terminating call indication /
 693     { "AT+CNMI=2,1\r",RET_OK,2,60},      SMS Event reporting configuration /
 694     { "AT+CMGL=\"ALL\"\r",RET_OK,5,60},  List all message /
 695     { NULL, NULL, 0, 0},
 696     */
 697     const STRU_AT *at = &struAtInit[0];
 698     if( at_cmd_list_return(at) != SYS_ERR_OK ) return SYS_ERR_AT_FAIL;
 699     
 700     if( module == MODULE_UC15 )
 701     {
 702         return at_cmd_list_return( &AT_UC15_INIT_UART[0] );
 703     }else if(( module == MODULE_EC200S )||(module == MODULE_EC25))
 704     {
 705     /*
 706     { "AT+QURCCFG=\"urcport\",\"uart1\"\r",RET_OK,2,6},  urc configuration
 707     { NULL, NULL, 0, 0},
 708     */
 709         return at_cmd_list_return( &AT_EC200S_EC25_INIT_UART[0] );
 710     }
 711     return SYS_ERR_OK;
 712 }
 713 /*********************************************************************************************************
 714 ** Function name:    gsm_save_record
 715 ** Descriptions:    
 716 ** input parameters:    
 717 ** Output parameters:    
 718 ** Returned value:    
 719 *********************************************************************************************************/
 720 SYS_ERR gsm_save_record( ENUM_MODULE module )
 721 {
 722     OS_CPU_SR cpu_sr=0;
 723     const STRU_AT AT_QFLST[] =
 724     {
 725         {"AT+QFLST=\"RAM:record.amr\"\r",RET_QFLST,1,1},    /* m26 module:list the record.arm file in RAM */
 726         {"AT+QFLST=\"UFS:record.wav\"\r",RET_QFLST,2,2},    /* uc15 module:list the record.wav file in UFS */
 727         {"AT+QFLST=\"*\"\r",RET_QFLST,2,2},                    /* ec200s module:list all of files  in UFS */
 728         {"AT+QFLST=\"*\"\r",RET_QFLST,2,2},
 729     };
 730 
 731     const STRU_AT AT_UC15_SAVE_RECORD = {"AT+QFMOV=\"UFS:record.wav\",\"UFS:play.wav\",1,1\r",RET_OK,3,3};    /* not used for ec200s module */
 732     #if WReadCounter_Enable
 733     const STRU_AT AT_QFOPEN_M26 = {"AT+QFOPEN=\"RAM:record.amr\",2,3128\r",RET_QFOPEN,1,1};                
 734     #else
 735     const STRU_AT AT_QFOPEN_M26 = {"AT+QFOPEN=\"RAM:record.amr\",2,16384\r",RET_QFOPEN,1,1};                
 736     #endif
 737     
 738     /* if .amr file exist? and get the file lenth if exist */
 739     if(g_M25_M26_specific==2)
 740     {
 741         ;;
 742     }
 743     else if(g_M25_M26_specific==3)
 744     {
 745         ;;
 746     }
 747     else if( at_cmd_return( &AT_QFLST[module] ) != SYS_ERR_OK ) 
 748     {
 749         return SYS_ERR_AT_FAIL;
 750     }
 751     
 752     if( module == MODULE_UC15 )
 753     {
 754         if( at_cmd_return( &AT_UC15_SAVE_RECORD ) != SYS_ERR_OK ) return SYS_ERR_AT_FAIL;
 755     }
 756     else if ((module == MODULE_EC200S)||(module == MODULE_EC25))
 757     {
 758         if (struParaSet.dat.record_audio[0].IsRecord == RECORD_RECORDING)
 759         {
 760             struParaSet.dat.record_audio[0].IsRecord = RECORD_RECORDED;
 761             struParaSet.dat.record_audio[1].IsRecord = RECORD_NULL;
 762         }
 763         else if (struParaSet.dat.record_audio[1].IsRecord == RECORD_RECORDING)
 764         {
 765             struParaSet.dat.record_audio[1].IsRecord = RECORD_RECORDED;
 766             struParaSet.dat.record_audio[0].IsRecord = RECORD_NULL;
 767         }
 768     }
 769     else if(g_M25_M26_specific==2)
 770     {
 771         struGsm.amr.total = 1000;
 772     }
 773     else if(g_M25_M26_specific==3)
 774     {
 775         struGsm.amr.total = 1000;
 776     }
 777     else
 778     {
 779 //        OS_ERR err;
 780         char *p;
 781         u8 i;
 782         STRU_AT struAt = {NULL,RET_QFREAD,3,3};
 783         //if(g_M25_M26_specific==0)
 784             if( at_cmd_return( &AT_QFOPEN_M26 ) != SYS_ERR_OK ) return SYS_ERR_AT_FAIL;        /* get filehandle */
 785         //else
 786             //if( at_cmd_return( &AT_QFOPEN_M25 ) != SYS_ERR_OK ) return SYS_ERR_AT_FAIL;        /* get filehandle */
 787 
 788         task_global |= TASK_GLOBAL_ERASE_ENCODE;
 789         while( task_global&TASK_GLOBAL_ERASE_ENCODE ) OSTimeDly( 100);//,OS_OPT_TIME_DLY,&err );
 790         p = mymalloc(64);
 791         #if WReadCounter_Enable
 792         g_u8_WReadCounter = 0;
 793         #endif
 794         for( i=0;i<struGsm.amr.total/PAGE_SIZE+((struGsm.amr.total%PAGE_SIZE)?1:0);i++ )
 795         {
 796             /* read one block */
 797             //CPU_SR_ALLOC();
 798             OS_ENTER_CRITICAL();
 799             pStruUsartGsm->timeout = 20;
 800             OS_EXIT_CRITICAL();
 801             sprintf( p,"AT+QFREAD=%d,%d\r",struGsm.amr.filehandle,PAGE_SIZE );
 802             struAt.command = p;
 803             if( at_cmd_return( &struAt ) != SYS_ERR_OK )
 804             {
 805                 break;
 806             }
 807             OS_ENTER_CRITICAL();
 808             pStruUsartGsm->timeout = 5;    // 5
 809             OS_EXIT_CRITICAL();
 810             
 811             struGsm.amr.page = i;
 812             #if WReadCounter_Enable
 813             g_u8_WReadCounter++;
 814             #endif
 815             task_global |= TASK_GLOBAL_WRITE_AUDIO;
 816             while( task_global&TASK_GLOBAL_WRITE_AUDIO ) OSTimeDly( 100);//,OS_OPT_TIME_DLY,&err );
 817         }
 818         /* !!!close file */
 819         sprintf( p,"AT+QFCLOSE=%d\r",struGsm.amr.filehandle );
 820         struAt.command = p;
 821         struAt.result = RET_OK;
 822         at_cmd_return( &struAt );
 823         myfree(p);
 824     }
 825     
 826     /* save the lenth of record file */
 827     struParaSet.dat.audio_file_len = struGsm.amr.total;
 828     task_global |= TASK_GLOBAL_WR_PARA_SET;
 829     
 830     return SYS_ERR_OK;
 831 }
 832 /*********************************************************************************************************
 833 ** Function name:    gsm_audio_record
 834 ** Descriptions:    
 835 ** input parameters:    
 836 ** Output parameters:    
 837 ** Returned value:    
 838 *********************************************************************************************************/
 839 SYS_ERR gsm_audio_record( ENUM_MODULE module )
 840 {
 841     /*
 842     for amr format: 40.8KB ver 1m
 843     record.amr
 844     */
 845 //    OS_ERR err;
 846     
 847     /* 
 848     { "AT+QFLDS=\"UFS\"\r",RET_OK,2,6},
 849     return:+QFLDS: <free_size>,<total_size>
 850     EC200S:+QFLDS: 6582272,6938624 (Byte) 
 851     */
 852     
 853     const STRU_AT AT_QFDEL_EC200S_EC25 = {"AT+QFDEL=\"*\"\r",RET_OK,2,2};  /* delete all files in UFS,Not include catalogue */    
 854     const STRU_AT AT_QFDEL0_EC25 = {"AT+QFDEL=\"record0.wav\"\r",RET_OK,2,2};
 855     const STRU_AT AT_QFDEL1_EC25 = {"AT+QFDEL=\"record1.wav\"\r",RET_OK,2,2};
 856     const STRU_AT AT_QFDEL0_EC200S = {"AT+QFDEL=\"UFS:record0.wav\"\r",RET_OK,2,2};/* delete a file in UFS */
 857     const STRU_AT AT_QFDEL1_EC200S = {"AT+QFDEL=\"UFS:record1.wav\"\r",RET_OK,2,2};/* Delete a file in UFS */
 858     const STRU_AT AT_QFDEL0_EC200n = {"AT+QFDEL=\"UFS:record0.amr\"\r",RET_OK,2,2};/* delete a file in UFS */
 859     const STRU_AT AT_QFDEL1_EC200n = {"AT+QFDEL=\"UFS:record1.amr\"\r",RET_OK,2,2};/* Delete a file in UFS */
 860     const STRU_AT AT_QFLST_EC200S_EC25 = {"AT+QFLST=\"*\"\r",RET_OK,2,2};          /* list All files in UFS */
 861     
 862     const STRU_AT AT_START_RECORD0_EC200S = {"AT+QAUDRD=1,\"record0.wav\",13,1\r",RET_OK,2,2};/* Record a Media file in wav format,store it in UFS,Name as record0 */
 863     const STRU_AT AT_START_RECORD1_EC200S = {"AT+QAUDRD=1,\"record1.wav\",13,1\r",RET_OK,2,2};/* Record a Media file in wav format,store it in UFS,Name as record1 */
 864     const STRU_AT AT_AUDIO_PLAYBACK0_EC200S = {"AT+QAUDPLAY=\"record0.wav\",0\r",RET_OK,2,2};/* Play the medio file,not repeat,volume is 7 */
 865     const STRU_AT AT_AUDIO_PLAYBACK1_EC200S = {"AT+QAUDPLAY=\"record1.wav\",0\r",RET_OK,2,2};/* Play the medio file,not repeat,volume is 7 */
 866     
 867     const STRU_AT AT_START_RECORD0_EC200n = {"AT+QAUDRD=1,\"record0.amr\",13\r",RET_OK,2,2};/* Record a Media file in wav format,store it in UFS,Name as record0 */
 868     const STRU_AT AT_START_RECORD1_EC200n = {"AT+QAUDRD=1,\"record1.amr\",13\r",RET_OK,2,2};/* Record a Media file in wav format,store it in UFS,Name as record1 */
 869     const STRU_AT AT_AUDIO_PLAYBACK0_EC200n = {"AT+QAUDPLAY=\"record0.amr\",0\r",RET_OK,2,2};/* Play the medio file,not repeat,volume is 7 */
 870     const STRU_AT AT_AUDIO_PLAYBACK1_EC200n = {"AT+QAUDPLAY=\"record1.amr\",0\r",RET_OK,2,2};/* Play the medio file,not repeat,volume is 7 */
 871     
 872     const STRU_AT AT_START_RECORD0_EC25 = {"AT+QAUDRD=1,\"record0.wav\",13,0\r",RET_OK,2,2};
 873     const STRU_AT AT_START_RECORD1_EC25 = {"AT+QAUDRD=1,\"record1.wav\",13,0\r",RET_OK,2,2};
 874     const STRU_AT AT_AUDIO_PLAYBACK0_EC25 = {"AT+QPSND=1,\"record0.wav\",0,0,1\r",RET_OK,2,2};
 875     const STRU_AT AT_AUDIO_PLAYBACK1_EC25 = {"AT+QPSND=1,\"record1.wav\",0,0,1\r",RET_OK,2,2};
 876     
 877     const STRU_AT AT_QFDEL_UC15 = {"AT+QFDEL=\"UFS:record.wav\"\r",RET_OK,2,2};
 878     const STRU_AT AT_START_RECORD_UC15 = {"AT+QAUDRD=1,\"UFS:record.wav\",13,0\r",RET_OK,2,2};
 879     const STRU_AT AT_QFLST_UC15 = {"AT+QFLST=\"UFS:*\"\r",RET_OK,2,2};                /* list files */
 880     const STRU_AT AT_AUDIO_PLAYBACK_UC15 = {"AT+QPSND=1,\"UFS:record.wav\",0\r",RET_OK,2,2};
 881 
 882     const STRU_AT AT_QFDEL_M26 = {"AT+QFDEL=\"RAM:record.amr\"\r",RET_OK,1,1};
 883     const STRU_AT AT_START_RECORD_M26 = {"AT+QAUDRD=1,\"RAM:record.amr\"\r",RET_OK,1,1};
 884     //------------------ M25 -----------------------------
 885     const STRU_AT AT_START_RECORD_M25 = {"AT+QAUDRD=1,\"RAM:record.amr\",3,1\r",RET_OK,1,1};
 886     
 887     const STRU_AT AT_QFLST_M26 = {"AT+QFLST=\"RAM:*\"\r",RET_OK,1,1};                /* list files */
 888     
 889     
 890     //------------------- SIMCom -------------------------
 891     const STRU_AT AT_QFDEL_SIMCom = {NULL,NULL,0,0};//{"AT+CFSDFILE=0,\"record.amr\"",RET_OK,2,2};    /* delete */
 892     const STRU_AT AT_START_RECORD_SIMCom = {"AT+SRD=2\r",RET_OK,1,1};   /* record */
 893     const STRU_AT AT_STOP_RECORD_SIMCom = {"AT+SRD=3\r",RET_OK,2,2};    /* record stop */
 894     const STRU_AT AT_QFLST_SIMCom = {"AT+CFSLFILE\r",RET_OK,1,1};       /* list files */
 895     
 896     
 897     const STRU_AT AT_QFDEL_SIMCom7 = {NULL,NULL,0,0};//{"AT+FSDEL=\"re.wav\"\r",RET_OK,1,1};    /* delete; AT+FSDEL=<filename> */
 898     const STRU_AT AT_START_RECORD_SIMCom7 = {" AT+CREC=1,\"C:/re.wav\"\r",RET_OK,1,1};   /* record */
 899     const STRU_AT AT_STOP_RECORD_SIMCom7 = {"AT+CREC=0\r",RET_OK,2,2};      /* record stop */
 900     const STRU_AT AT_QFLST_SIMCom7 = {"AT+FSLS\r",RET_OK,2,2};              /* list files */
 901     
 902     
 903     
 904     const STRU_AT AT_AUDIO_PLAYBACK_M26 = {"AT+QAUDPLAY=\"RAM:record.amr\",0,60,0\r",RET_OK,1,1};
 905 
 906     const STRU_AT AT_STOP_RECORD = {"AT+QAUDRD=0\r",RET_OK,2,2};
 907 
 908     //const STRU_AT AT_QSIDET = { "AT+QSIDET=8192\r",RET_OK,2,2};
 909     
 910     SYS_ERR result;
 911     const STRU_AT *del,*record,*lst,*playback,*stop;
 912     
 913     /********** load at commands *******************/
 914     if(g_M25_M26_specific==2)
 915     {
 916         del = &AT_QFDEL_SIMCom;
 917         record = &AT_START_RECORD_SIMCom;
 918         lst = &AT_QFLST_SIMCom;
 919         playback = &AT_PLAY_SIMCom;
 920         stop = &AT_STOP_RECORD_SIMCom;
 921     }
 922     else if(g_M25_M26_specific==3)
 923     {
 924         del = &AT_QFDEL_SIMCom7;
 925         record = &AT_START_RECORD_SIMCom7;
 926         lst = &AT_QFLST_SIMCom7;
 927         playback = &AT_PLAY_SIMCom7;
 928         stop = &AT_STOP_RECORD_SIMCom7;
 929     }
 930     else if( module == MODULE_M26 )
 931     {
 932         del = &AT_QFDEL_M26;
 933         if((g_M25_M26_specific==0) || (g_Version_M25MAR01A11==0)) // 1=for version=higher than 07
 934         //if(1)                       //for version=07
 935         {
 936             record = &AT_START_RECORD_M26;
 937         }
 938         else  
 939         {
 940             record = &AT_START_RECORD_M25;
 941         }
 942         lst = &AT_QFLST_M26;
 943         playback = &AT_AUDIO_PLAYBACK_M26;
 944         stop = &AT_STOP_RECORD;
 945     }
 946     else if (module == MODULE_EC200S)
 947     {
 948         at_cmd_return( &AT_RECORD_MIC_EC200S);  /* mic configuration: cmd="AT+QMIC=8192\r"  Set Uplink Gains of MIC: 8192  */
 949         //del = &AT_QFDEL0_EC200S;                /* delete cmd:"AT+QFDEL=\"UFS:record0.wav\"\r" */
 950         //record = &AT_START_RECORD0_EC200S;      /* record cmd:"AT+QAUDRD=1,\"UFS: record0.wav\",13,1\r" */
 951         //lst = &AT_QFLST_EC200S_EC25;                 /* listed cmd:"AT+QFLST=\"*\"\r" */
 952         //playback = &AT_AUDIO_PLAYBACK0_EC200S;  /* played cmd:"AT+QAUDPLAY=\"record0.wav\",0,7\r" */
 953         stop = &AT_STOP_RECORD;
 954     }
 955     else if (module == MODULE_EC25)
 956     {
 957         at_cmd_return( &AT_RECORD_MIC_EC25);
 958         //del = &AT_QFDEL0_EC25;
 959         //record = &AT_START_RECORD0_EC25;
 960         //lst = &AT_QFLST_EC200S_EC25;
 961         //playback = &AT_AUDIO_PLAYBACK0_EC25;
 962         stop = &AT_STOP_RECORD;
 963     }
 964     else
 965     {
 966         at_cmd_return( &AT_RECORD_MIC_UC15 );
 967         
 968         del = &AT_QFDEL_UC15;
 969         record = &AT_START_RECORD_UC15;
 970         lst = &AT_QFLST_UC15;
 971         playback = &AT_AUDIO_PLAYBACK_UC15;
 972         stop = &AT_STOP_RECORD;
 973     }
 974     
 975     if ((module == MODULE_EC200S)||(module == MODULE_EC25))
 976     {
 977         lst = &AT_QFLST_EC200S_EC25;
 978         if (struParaSet.dat.record_audio[0].IsRecord == RECORD_NULL && struParaSet.dat.record_audio[1].IsRecord == RECORD_NULL)
 979         {
 980             del = &AT_QFDEL_EC200S_EC25;                /* "AT+QFDEL=\"*\"\r",files both did not record, record file0 */
 981             if(module == MODULE_EC25)
 982             {
 983                 record = &AT_START_RECORD0_EC25;
 984                 playback = &AT_AUDIO_PLAYBACK0_EC25;
 985             }
 986             else
 987             {
 988                 if(ec200n_dk==1)
 989                 {
 990                     record = &AT_START_RECORD0_EC200n;
 991                     playback = &AT_AUDIO_PLAYBACK0_EC200n;
 992                 }
 993                 else
 994                 {
 995                     record = &AT_START_RECORD0_EC200S;
 996                     playback = &AT_AUDIO_PLAYBACK0_EC200S;
 997                 }
 998             }
 999             struParaSet.dat.record_audio[0].IsRecord = RECORD_RECORDING;
1000         }
1001         else if (struParaSet.dat.record_audio[0].IsRecord == RECORD_NULL && struParaSet.dat.record_audio[1].IsRecord == RECORD_RECORDED)
1002         {
1003             if(module == MODULE_EC25)
1004             {
1005                 del = &AT_QFDEL0_EC25;
1006                 record = &AT_START_RECORD0_EC25;
1007                 playback = &AT_AUDIO_PLAYBACK0_EC25;
1008             }
1009             else if(ec200n_dk==1)
1010             {
1011                 del = &AT_QFDEL0_EC200n;            /* file1 recorded, record file0 */
1012                 record = &AT_START_RECORD0_EC200n;
1013                 playback = &AT_AUDIO_PLAYBACK0_EC200n;
1014             }
1015             else
1016             {
1017                 del = &AT_QFDEL0_EC200S;            /* file1 recorded, record file0 */
1018                 record = &AT_START_RECORD0_EC200S;
1019                 playback = &AT_AUDIO_PLAYBACK0_EC200S;
1020             }
1021             struParaSet.dat.record_audio[0].IsRecord = RECORD_RECORDING;
1022         }
1023         else if (struParaSet.dat.record_audio[0].IsRecord == RECORD_RECORDING)
1024         {
1025             if(module == MODULE_EC25)
1026             {
1027                 del = &AT_QFDEL0_EC25;
1028                 record = &AT_START_RECORD0_EC25;
1029                 playback = &AT_AUDIO_PLAYBACK0_EC25;
1030             }
1031             else if(ec200n_dk==1)
1032             {
1033                 del = &AT_QFDEL0_EC200n;            /* file0 is recording, record file0 */
1034                 record = &AT_START_RECORD0_EC200n;
1035                 playback = &AT_AUDIO_PLAYBACK0_EC200n;
1036             }
1037             else
1038             {
1039                 del = &AT_QFDEL0_EC200S;            /* file0 is recording, record file0 */
1040                 record = &AT_START_RECORD0_EC200S;
1041                 playback = &AT_AUDIO_PLAYBACK0_EC200S;
1042             }
1043             struParaSet.dat.record_audio[0].IsRecord = RECORD_RECORDING;
1044         }
1045         else if (struParaSet.dat.record_audio[0].IsRecord == RECORD_RECORDED)
1046         {
1047             if(module == MODULE_EC25)
1048             {
1049                 del = &AT_QFDEL1_EC25;
1050                 record = &AT_START_RECORD1_EC25;
1051                 playback = &AT_AUDIO_PLAYBACK1_EC25;
1052             }
1053             else if(ec200n_dk==1)
1054             {
1055                 del = &AT_QFDEL1_EC200n;            /* file0 is recorded, record flie1 */
1056                 record = &AT_START_RECORD1_EC200n;
1057                 playback = &AT_AUDIO_PLAYBACK1_EC200n;
1058             }
1059             else
1060             {
1061                 del = &AT_QFDEL1_EC200S;            /* file0 is recorded, record flie1 */
1062                 record = &AT_START_RECORD1_EC200S;
1063                 playback = &AT_AUDIO_PLAYBACK1_EC200S;
1064             }
1065             struParaSet.dat.record_audio[1].IsRecord = RECORD_RECORDING;
1066         }
1067         else
1068         {
1069             del = &AT_QFDEL_EC200S_EC25;                /* else delete all files, record file0 */
1070             if(module == MODULE_EC25)
1071             {
1072                 record = &AT_START_RECORD0_EC25;
1073                 playback = &AT_AUDIO_PLAYBACK0_EC25;
1074             }
1075             else if(ec200n_dk==1)
1076             {
1077                 record = &AT_START_RECORD0_EC200n;
1078                 playback = &AT_AUDIO_PLAYBACK0_EC200n;
1079             }
1080             else
1081             {
1082                 record = &AT_START_RECORD0_EC200S;
1083                 playback = &AT_AUDIO_PLAYBACK0_EC200S;
1084             }
1085             struParaSet.dat.record_audio[0].IsRecord = RECORD_RECORDING;
1086         }
1087         task_global |= TASK_GLOBAL_WR_PARA_SET;
1088     }
1089     
1090     at_cmd_return( del );
1091     at_cmd_return( lst );
1092 
1093     set_audio_mode( AUDIO_MODE_RECORD );        /* hardware circuit configuration */
1094     
1095     pgsGsm = PGS_GSM_RECORD;
1096     tmrRecord = struParaSet.dat.record_duration*1000/10;
1097     at_cmd_return( record );                    /* start record audio file */
1098     while( tmrRecord )                            /* decrease per 10ms */
1099     {
1100         if((struGsm.task&GSM_TASK_RECORD) == 0)
1101         {
1102             at_cmd_return( stop );            /* stop record:"AT+QAUDRD=0\r" */
1103             OSTimeDly( 100);//,OS_OPT_TIME_PERIODIC,&err );
1104             return result;
1105         }
1106         OSTimeDly( 10);//,OS_OPT_TIME_PERIODIC,&err );
1107     }
1108     at_cmd_return( stop );            /* stop "AT+QAUDRD=0\r" */
1109     OSTimeDly( 2000);//,OS_OPT_TIME_PERIODIC,&err );
1110     
1111     /* playback */
1112     at_cmd_return( lst );
1113     tmrRecord = struParaSet.dat.record_duration*1000/10;
1114     pgsGsm = PGS_GSM_PLAY;
1115     at_cmd_return( playback );
1116     set_audio_mode( AUDIO_MODE_PLAYBACK_ONSITE );
1117     while( tmrRecord ) OSTimeDly( 10);//,OS_OPT_TIME_PERIODIC,&err );
1118     
1119     return result;
1120 }
1121 /*********************************************************************************************************
1122 ** Function name:    gsm_file_to_voice_call
1123 ** Descriptions:    audio file to voice call
1124 ** input parameters:    
1125 ** Output parameters:    
1126 ** Returned value:    
1127 *********************************************************************************************************/
1128 SYS_ERR gsm_file_to_voice_call( ENUM_MODULE module )
1129 {
1130 //    OS_ERR err;
1131     SYS_ERR result;
1132     
1133     const STRU_AT AT_AUDIO_PLAY[] = 
1134     {
1135         {"AT+QAUDPLAY=\"RAM:play.amr\",0,60,0\r",RET_OK,1,1},    /* not used for ec200s module. not repeat,volume=100,channel=0 */
1136         {"AT+QPSND=1,\"UFS:play.wav\",0\r",RET_OK,2,2},            /* Play Audio File and Send it to the Remote in Call */
1137         {NULL,0,0,0},
1138         {NULL,0,0,0},
1139     };
1140     
1141     const STRU_AT AT_AUDIO_PLAY0_EC200S_EC25 = {"AT+QPSND=1,\"record0.wav\",0,0,1\r",RET_OK,2,2};
1142     const STRU_AT AT_AUDIO_PLAY1_EC200S_EC25 = {"AT+QPSND=1,\"record1.wav\",0,0,1\r",RET_OK,2,2};
1143     const STRU_AT AT_AUDIO_PLAY0_EC200n = {"AT+QPSND=1,\"record0.amr\",0,0,1\r",RET_OK,2,2};
1144     const STRU_AT AT_AUDIO_PLAY1_EC200n = {"AT+QPSND=1,\"record1.amr\",0,0,1\r",RET_OK,2,2};
1145     //const STRU_AT AT_AUDIO_PLAY0_EC200n = {"AT+QAUDPLAY=\"record0.amr\",0\r",RET_OK,2,2};/* Play the medio file,not repeat,volume is 7 */
1146     //const STRU_AT AT_AUDIO_PLAY1_EC200n = {"AT+QAUDPLAY=\"record1.amr\",0\r",RET_OK,2,2};/* Play the medio file,not repeat,volume is 7 */
1147     
1148     if ((module == MODULE_EC200S)||(module == MODULE_EC25))
1149     {
1150         if (struParaSet.dat.record_audio[0].IsRecord == RECORD_RECORDED)
1151         {
1152             if(ec200n_dk==1)
1153             {
1154                 result = at_cmd_return( &AT_AUDIO_PLAY0_EC200n );
1155             }
1156             else
1157             {
1158                 result = at_cmd_return( &AT_AUDIO_PLAY0_EC200S_EC25 );
1159             }
1160         }
1161         else if (struParaSet.dat.record_audio[1].IsRecord == RECORD_RECORDED)
1162         {
1163             if(ec200n_dk==1)
1164             {
1165                 result = at_cmd_return( &AT_AUDIO_PLAY1_EC200n );
1166             }
1167             else
1168             {
1169                 result = at_cmd_return( &AT_AUDIO_PLAY1_EC200S_EC25 );
1170             }
1171         }
1172         else 
1173         {
1174             if(ec200n_dk==1)
1175             {
1176                 result = at_cmd_return( &AT_AUDIO_PLAY0_EC200n );
1177             }
1178             else
1179             {
1180                 result = at_cmd_return( &AT_AUDIO_PLAY0_EC200S_EC25 );
1181             }
1182         }
1183             
1184     }
1185     else if(g_M25_M26_specific==2)
1186     {
1187         result = at_cmd_return( &AT_PLAY_SIMCom );
1188     }
1189     else if(g_M25_M26_specific==3)
1190     {
1191         result = at_cmd_return( &AT_PLAY_SIMCom7);
1192     }
1193     else
1194     {
1195         result = at_cmd_return( &AT_AUDIO_PLAY[module] );
1196     }
1197     tmrRecord = struParaSet.dat.record_duration*1000/10;
1198     pgsGsm = PGS_GSM_PLAY;
1199     while( tmrRecord )
1200     {
1201         set_audio_mode( AUDIO_MODE_PLAYBACK_ONSITE );
1202         OSTimeDly( 10);//,OS_OPT_TIME_PERIODIC,&err );
1203     }
1204     return result;
1205 }
1206 /*********************************************************************************************************
1207 ** Function name:    gsm_audio_read
1208 ** Descriptions:    list audio file from gsm flash memory
1209 ** input parameters:    
1210 ** Output parameters:    
1211 ** Returned value:    
1212 *********************************************************************************************************/
1213 SYS_ERR gsm_audio_read( ENUM_MODULE module )
1214 {
1215     SYS_ERR Result;
1216     u8 index;
1217     const STRU_AT AT_QFLST_READ[] =
1218     {
1219         {"AT+QFLST=\"record0.wav\"\r",RET_QFLST,4,8},
1220         {"AT+QFLST=\"record1.wav\"\r",RET_QFLST,4,8},
1221         {"AT+QFLST\r",RET_QFLST,4,8},
1222     };
1223     #if WReadCounter_Enable
1224     if(g_u8_WReadCounter==0)
1225     #else
1226     if(struParaSet.dat.audio_file_len == 0 ) 
1227     #endif
1228     {
1229         printf("struParaSet.dat.audio_file_len=0 return gsm_audio_read.\r");
1230         return SYS_ERR_AT_FAIL;
1231     }
1232     
1233     if( module == MODULE_UC15 )
1234     {
1235         /* UC15 :MCU flash move to module is unnecessary */
1236         if( at_cmd_return( &struAtSendPlay_UC15[0] ) != SYS_ERR_OK )
1237         {
1238             struParaSet.dat.audio_file_len = 0;
1239             task_global |= TASK_GLOBAL_WR_PARA_SET;
1240             return SYS_ERR_AT_FAIL;
1241         }
1242     }
1243     else if(( module == MODULE_EC200S )||(module == MODULE_EC25))
1244     {
1245         if (struParaSet.dat.record_audio[0].IsRecord == RECORD_RECORDED) 
1246         {
1247             index = 0;         /* if file0 is recorded, list file0 */
1248         }
1249         else if (struParaSet.dat.record_audio[1].IsRecord == RECORD_RECORDED) 
1250         {
1251             index = 1;
1252         }    /* if file0 did not record,and file1 is recorded,list file1 */
1253         else                                                                            /* if both files did not record, return failed */
1254         {
1255             index = 0;
1256             struParaSet.dat.audio_file_len = 0;
1257             task_global |= TASK_GLOBAL_WR_PARA_SET;
1258             return SYS_ERR_AT_FAIL;
1259         }
1260         if(ec200n_dk==1)
1261         {
1262             index = 2;
1263         }
1264         Result = at_cmd_return( &AT_QFLST_READ[index]);
1265         if( Result != SYS_ERR_OK )                      /* list file which is recorded. */
1266         {     
1267             struParaSet.dat.audio_file_len = 0;
1268             task_global |= TASK_GLOBAL_WR_PARA_SET;
1269             return SYS_ERR_AT_FAIL;
1270         }
1271     }
1272     else if(g_M25_M26_specific==2)
1273     {
1274         ;;
1275     }
1276     else if(g_M25_M26_specific==3)
1277     {
1278         ;;
1279     }
1280     else    /* for ec200s is not used */
1281     {
1282 //        OS_ERR err;
1283         char *p;
1284         u16 i;
1285         u16 remain;
1286         STRU_AT struAt = {NULL,RET_CONNECT,3,3};
1287         const STRU_AT AT_QFDEL_PLAY = {"AT+QFDEL=\"RAM:play.amr\"\r",RET_OK,2,2};
1288         #if WReadCounter_Enable
1289         const STRU_AT AT_QFOPEN_PLAY = {"AT+QFOPEN=\"RAM:play.amr\",0,3128\r",RET_QFOPEN,1,1};/* Open the file named <filename> in RAM. If the file does not exist, then create it, and set the max length of the file with value 1024. If the file exists in RAM, just open it, and ignore the length 1024. */ 
1290         #else
1291         const STRU_AT AT_QFOPEN_PLAY = {"AT+QFOPEN=\"RAM:play.amr\",0,16384\r",RET_QFOPEN,1,1};/* Open the file named <filename> in RAM. If the file does not exist, then create it, and set the max length of the file with value 1024. If the file exists in RAM, just open it, and ignore the length 1024. */ 
1292         #endif
1293         at_cmd_return( &AT_QFDEL_PLAY );
1294         /* get filehandle */
1295         //if(g_M25_M26_specific==0)
1296             if( at_cmd_return( &AT_QFOPEN_PLAY ) != SYS_ERR_OK ) return SYS_ERR_AT_FAIL;
1297         //else
1298             //if( at_cmd_return( &AT_QFOPEN_PLAY_M25 ) != SYS_ERR_OK ) return SYS_ERR_AT_FAIL;
1299             
1300         struGsm.amr.total = struParaSet.dat.audio_file_len;
1301         if( struGsm.amr.total > PAGE_SIZE*(9) )
1302         {
1303             struGsm.amr.total = PAGE_SIZE*(9);
1304         }
1305         
1306         p = mymalloc(64);
1307         struAt.command = p;
1308         remain = struGsm.amr.total;
1309         #if WReadCounter_Enable
1310 //        printf("g_u8_WReadCounter=%d\n",g_u8_WReadCounter);
1311 //        for(i=0;i<g_u8_WReadCounter;i++)
1312         #else
1313         for( i=0;i<struGsm.amr.total/PAGE_SIZE+((struGsm.amr.total%PAGE_SIZE)?1:0);i++ )
1314         #endif
1315         {
1316             /* read one block */
1317             struGsm.amr.page = i;
1318             task_global |= TASK_GLOBAL_READ_AUDIO;
1319             while( task_global&TASK_GLOBAL_READ_AUDIO ) OSTimeDly( 10);//,OS_OPT_TIME_PERIODIC,&err );
1320             
1321             struAt.result = RET_CONNECT;
1322             sprintf( p,"AT+QFWRITE=%d,%d\r",struGsm.amr.filehandle,(remain>=PAGE_SIZE)?(PAGE_SIZE):(remain) );
1323             at_cmd_return( &struAt );                /* wait connenct ack */
1324             
1325             struAt.result = RET_OK;
1326             *p = 0;
1327             usart_send_bytes( USART3,(u8*)struGsm.amr.buf,(remain>=PAGE_SIZE)?(PAGE_SIZE):(remain) );
1328             at_cmd_return( &struAt );
1329             remain -= PAGE_SIZE;
1330         }
1331         struAt.result = RET_OK;
1332         sprintf( p,"AT+QFSEEK=%d,0,0\r",struGsm.amr.filehandle );
1333         at_cmd_return( &struAt );
1334         sprintf( p,"AT+QFREAD=%d\r",struGsm.amr.filehandle );
1335         at_cmd_return( &struAt );
1336         sprintf( p,"AT+QFCLOSE=%d\r",struGsm.amr.filehandle );
1337         at_cmd_return( &struAt );
1338         myfree(p);
1339     }
1340     
1341     return SYS_ERR_OK;
1342 }
1343 /*********************************************************************************************************
1344 ** Function name:    gsm_set_clock
1345 ** Descriptions:    get time from network
1346 { "AT+CTZU=1\r",RET_OK,1,2},    / Automatic Time Zone Update /
1347 { "AT+QLTS\r",RET_QLTS,2,10},   / Obtain the Latest Time Synchronized Through Network /
1348 { NULL, NULL, 0, 0},
1349 ** input parameters:    
1350 ** Output parameters:    
1351 ** Returned value:    
1352 *********************************************************************************************************/
1353 SYS_ERR gsm_set_clock( char *domain,ENUM_MODULE module )
1354 {
1355     SYS_ERR result;
1356     char *p;
1357     STRU_AT struAt = {NULL,RET_OK,1,2};
1358     
1359     const STRU_AT *at1;
1360     const STRU_AT at_cclk = {"AT+CCLK?\r",RET_OK,1,2};/* Query the local time */
1361     
1362     const STRU_AT CNTP[] =        /* not used for ec200s module */
1363     {
1364         {"at+cgreg?\r",RET_OK,1,5},
1365         { "AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r",RET_OK,1,2},
1366         { "AT+SAPBR=1,1\r",RET_OK,2,2},                     //PPP
1367         { "AT+CNTPCID=1\r",RET_OK,2,2},                     //CID
1368         { NULL, NULL, 0, 0},
1369     };
1370     
1371     /*STRU_AT CNTP_en[] =
1372     {
1373         { "AT+CNTP=\"ntp1.aliyun.com\",00\r",RET_OK,2,2},
1374         { "AT+CNTP\r",RET_NTP,2,2},
1375         { NULL, NULL, 0, 0},
1376     };
1377     const STRU_AT CNTP_ch[] =
1378     {
1379         { "AT+CNTP=\"ntp1.aliyun.com\",32\r",RET_OK,2,2},
1380         { "AT+CNTP\r",RET_NTP,2,2},
1381         { NULL, NULL, 0, 0},
1382     };*/
1383     STRU_AT CNTP_at[] =
1384     {
1385         { "AT+CNTP\r",RET_NTP,2,2},
1386         { NULL, NULL, 0, 0},
1387     };
1388     /*
1389     等cgreg返回0,1后,AT+CNTP="ntp1.aliyun.com",32 设置东8区, 
1390     然后发AT+CNTP返回+CNTP: 0 代表同步成功
1391     */
1392     /* Query the local time 
1393     const STRU_AT CNTP_ENG = {"AT+CNTP=\"ntp1.aliyun.com\",00\r",RET_OK,1,2};
1394     const STRU_AT CNTP_CHN = {"AT+CNTP=\"ntp1.aliyun.com\",32\r",RET_OK,1,2};*/
1395     const STRU_AT struAtNetworkTime_SIMCom7670[] =    /* for ec200s module */
1396     {
1397         { "AT+CNTP\r",RET_NTP,5,5},     /* +CNTP: 0 */
1398         { "AT+CTZU=1\r",RET_OK,5,5},    /* Automatic Time Zone Update */
1399         { "AT+CTZR=1\r",RET_OK,5,5},    /* Automatic Time Zone Update */
1400         { NULL, NULL, 0, 0},
1401     };
1402     
1403     p = mymalloc(64);
1404     struAt.command = p;
1405     sprintf( p,"AT+CNTP=\"ntp1.aliyun.com\",%d\r",(struParaSet.dat.time_zone<<2)/10);
1406     
1407     /*** Get time from network ***/
1408     if(g_M25_M26_specific==2)
1409     {
1410         at1 = &CNTP[0];
1411     }
1412     else if(g_M25_M26_specific==3)
1413     {
1414         result = at_cmd_return( &struAt );
1415         if(result !=SYS_ERR_OK)
1416         {
1417             myfree(p);
1418             return SYS_ERR_AT_FAIL;
1419         }
1420         at1 = &struAtNetworkTime_SIMCom7670[0];
1421     }
1422     else if( module == MODULE_M26 )
1423     {
1424         at1 = &struAtNetworkTime_M26[0];
1425     }
1426     else
1427     {
1428         at1 = &struAtNetworkTime_Default[0];
1429     }
1430     if( at_cmd_list_return(at1) != SYS_ERR_OK )
1431     {
1432         myfree(p);
1433         return SYS_ERR_AT_FAIL;
1434     }
1435     if(g_M25_M26_specific==2)
1436     {
1437         result = at_cmd_return( &struAt );
1438         if( result != SYS_ERR_OK )
1439         {
1440             myfree(p);
1441             return SYS_ERR_AT_FAIL;
1442         }
1443         if( at_cmd_list_return(CNTP_at) != SYS_ERR_OK )
1444         {
1445             myfree(p);
1446             return SYS_ERR_AT_FAIL;
1447         }
1448     }
1449     result = at_cmd_return( &at_cclk );        /* get network clock now */
1450     myfree(p);
1451     return result;
1452 }
1453 /*********************************************************************************************************
1454 ** Function name:    gsm_set_tcp_config
1455 ** Descriptions:    TCP/IP context Configuration
1456 ** input parameters:    
1457 ** Output parameters:    
1458 ** Returned value:    
1459 *********************************************************************************************************/
1460 SYS_ERR gsm_set_tcp_config(ENUM_MODULE module )
1461 {
1462     const STRU_AT *at;
1463     
1464     STRU_AT struAt = {NULL,RET_OK,2,2};
1465     
1466     char *p;
1467     s8 *apn;
1468     SYS_ERR result;
1469     
1470     //========================== APN =============================
1471     p = mymalloc(32);
1472     if(!strncmp((const char*)struGsm.iccid,(const char*)ATT_ICCID,5))//the first five digital
1473     {
1474         //89011
1475         apn = (s8*)AT_ATT_CGDCONT;
1476     }
1477     else if(!strncmp((const char*)&struGsm.iccid[2],(const char*)CHINA_ICCID,2))
1478     {
1479         //china 898601,898606,898609
1480         if((struGsm.iccid[4]=='0')&&(struGsm.iccid[5]=='1'||struGsm.iccid[5]=='6'||struGsm.iccid[5]=='9'))//for China Unicom-apn=scuiot
1481         {
1482             apn = (s8*)AT_CHINA_UNICOM;
1483         }
1484         else
1485         {
1486             apn= (s8*)AT_CHINA_CGDCONT;
1487         }
1488     }
1489     else if(!strncmp((const char*)&struGsm.iccid[2],(const char*)USA_ICCID,2))
1490     {
1491         //USA 01
1492         apn= (s8*)AT_USA_CGDCONT;
1493     }
1494     else if(!strncmp((const char*)&struGsm.iccid[2],(const char*)UK_ICCID,2))
1495     {
1496         //Europe 44
1497         apn= (s8*)AT_UK_CGDCONT;
1498     }
1499     else if(!strncmp((const char*)&struGsm.iccid[2],(const char*)CANADA_ICCID,2))
1500     {
1501         //canada 30
1502         apn= (s8*)AT_CANADA_CGDCONT;
1503     }
1504     else if(!strncmp((const char*)&struGsm.iccid[2],(const char*)NETHERLANDS_ICCID,2))
1505     {
1506         //Netherlands 31
1507         apn= (s8*)AT_NETHERLANDS;
1508     }
1509     else 
1510     {
1511         //35 
1512         apn= (s8*)AT_IRELAND_CGDCONT;
1513     }
1514     
1515     if( module == MODULE_UC15 || module == MODULE_EC200S || module == MODULE_EC25)
1516     {
1517         sprintf( p,"AT+QICSGP=1,1,\"%s\",\"\",\"\",1\r",apn );/* Configure parameters of a TCP/IP context */
1518     }
1519     else if(g_M25_M26_specific==3 || g_M25_M26_specific==4)
1520     {
1521         sprintf( p,"AT+CGDCONT=1,\"IP\",\"%s\"\r",apn );
1522     }
1523     else
1524     {
1525         sprintf( p,"AT+QICSGP=1,\"%s\"\r",apn );
1526     }
1527     
1528     
1529     struAt.command = p;
1530     result = at_cmd_return(&struAt);
1531     
1532     //===================== close all of socket =========================
1533     if (g_M25_M26_specific==2)
1534     {
1535         at = Deactivate_a_PDP_context_SIMCom;
1536     }
1537     else if(g_M25_M26_specific == 3)
1538     {
1539         at = Deactivate_a_PDP_context_SIMCom7;
1540     }
1541     else if(g_M25_M26_specific==4)
1542     {
1543         at = Deactivate_a_PDP_context_SIMCom4;
1544     }
1545     else if( module == MODULE_M26 )
1546     {
1547         at = &struAtTcpConfig_M26[0];
1548     }
1549     else
1550     {
1551         at = &AT_Deactivate_a_PDP_context[0];
1552     }
1553     result = at_cmd_list_return(at);
1554     myfree(p);
1555     return result;
1556 }
1557 /*********************************************************************************************************
1558 ** Function name:    gsm_set_tcp_connect
1559 ** Descriptions:    Activate a PDP context, then login the server via IP address and port.
1560 ** contextID=1,socketID=0,
1561 ** input parameters:    
1562 ** Output parameters:    
1563 ** Returned value:    
1564 *********************************************************************************************************/
1565 SYS_ERR gsm_set_tcp_connect( u8 index,u8 mode,STRU_IP *ip,ENUM_MODULE module )
1566 {
1567     const char *CHANNEL_MODE[] = {"TCP","UDP"};
1568     STRU_AT struAt = {NULL,RET_CONNECT,45,45};
1569     char *p;
1570     SYS_ERR result;
1571     
1572     if( module == MODULE_UC15 || module == MODULE_EC200S || module == MODULE_EC25 )
1573     {
1574         if( at_cmd_return(&AT_UC15_CHECK_CONTEXT) != SYS_ERR_OK )    /* check PDP context */
1575         {
1576             /* Query the state of context and activate PDP context if deactivated */
1577             result = at_cmd_return(&AT_UC15_CONTEXT);                /* active a PDP context, context_id=1:"AT+QIACT=1\r" */
1578             if( result != SYS_ERR_OK ) return result;
1579         }
1580     }
1581     
1582     p = mymalloc(64);
1583     #ifdef    M26
1584     if( module == MODULE_UC15 || module == MODULE_EC200S || module == MODULE_EC25)
1585     {
1586         /* Set up TCP Client Connection and Enter into Direct Push Mode,connectID=1 
1587         AT+QIOPEN=<contextID>,<connectID>,<service_type>,"<IP_address>/<domain_name>",<remote_port>[,<local_port>[,<access_mode>]]*/
1588         sprintf( p,"AT+QIOPEN=1,0,\"%s\",\"%s\",%u,0,1\r",CHANNEL_MODE[mode],ip->address,ip->port );
1589         //test *6666*90116,62,42,223,2001*
1590         //p="AT+QIOPEN=1,0,\"TCP\",\"116.62.42.223\",2001,0,1\r";
1591     }
1592     else if(g_M25_M26_specific==3)
1593     {
1594         sprintf( p,"AT+CIPOPEN=0,\"%s\",\"%s\",%u\r",CHANNEL_MODE[mode],ip->address,ip->port );
1595     }
1596     else
1597     {
1598         sprintf( p,"AT+QIOPEN=\"%s\",\"%s\",%u\r",CHANNEL_MODE[mode],ip->address,ip->port );
1599     }
1600     #else
1601     sprintf( p,"AT%%IPOPENX=%u,\"%s\",\"%s\",%s\r",channnel,CHANNEL_MODE[mode],ip,port );
1602     #endif
1603     
1604     struAt.command = p;
1605     result = at_cmd_return(&struAt);
1606     myfree(p);
1607     return result;
1608 }
1609 /*********************************************************************************************************
1610 ** Function name:    gsm_close_connect
1611 ** Descriptions:    close socket,deactive PDP contect
1612 **    { "AT+QICLOSE=0\r",RET_OK,1,10},    AT+QICLOSE=<connectID>[,<timeout>]
1613 **    { "AT+QIDEACT=1\r",RET_OK,40,40},   AT+QIDEACT=<contextID>
1614 **    { "AT+QICLOSE=2\r",RET_OK,1,10},    AT+QICLOSE=<connectID>[,<timeout>]
1615 **    { NULL, NULL, 0, 0},
1616 ** input parameters:    close connect all if <index> is 0xff
1617 ** Output parameters:    NONE
1618 ** Returned value:    
1619 *********************************************************************************************************/
1620 SYS_ERR gsm_close_connect( u8 index,ENUM_MODULE module )
1621 {
1622     const STRU_AT *at;
1623     
1624     if( index == 0xff )
1625     {
1626         #ifdef M26
1627         if(g_M25_M26_specific==2)
1628         {
1629             at = &struAtCloseConnect_SIMCom[0];
1630         }
1631         else if(g_M25_M26_specific==3)
1632         {
1633             at = &struAtCloseConnect_SIMCom7[0];
1634         }
1635         else if( module == MODULE_M26 )
1636         {
1637             at = &struAtCloseConnect_M26[0];
1638         }
1639         else 
1640         {
1641             at = &AT_Close_Socket_PDP_Context[0];
1642         }
1643         #else
1644         at = &struAtCloseConnect_MG323[0];
1645         #endif
1646         return at_cmd_list_return( at );
1647     }
1648     else
1649     {
1650         #ifdef M26
1651         if(g_M25_M26_specific==2)
1652         {
1653             at = &struAtCloseConnect_SIMCom[0];
1654         }
1655         else if(g_M25_M26_specific==3)
1656         {
1657             at = &struAtCloseConnect_SIMCom7[0];
1658         }
1659         else if( module == MODULE_M26 )
1660         {
1661             at = &struAtCloseConnect_M26[index];
1662         }
1663         else
1664         {
1665             at_cmd_return( &AT_Close_Socket_PDP_Context[1] );    //  AT+QIDEACT=1
1666             at = &AT_Close_Socket_PDP_Context[index];
1667         }
1668         #else
1669         at = &struAtCloseConnect_MG323[index];
1670         #endif
1671         return at_cmd_return(at);
1672     }
1673 }
1674 /*********************************************************************************************************
1675 ** Function name:    gsm_check_tcp_ack
1676 ** Descriptions:    AT+QISEND=<connectID>,<send_length>: Send data to index channel
1677 **     { "AT+QISEND=0,0\r",RET_TCP_ACK,1,30},     TCPIP: send data,socket_id=0,data length=0 
1678 **    { "AT+QISACK=1\r",RET_TCP_ACK,1,30},     check data sent, socket_id=1 
1679 **    { "AT+QISACK=2\r",RET_TCP_ACK,1,30},     check data sent, socket_id=2 
1680 **    { NULL, NULL, 0, 0},
1681 ** input parameters:    
1682 ** Output parameters:    
1683 ** Returned value:    
1684 *********************************************************************************************************/
1685 SYS_ERR gsm_check_tcp_ack( u8 index,ENUM_MODULE module )
1686 {
1687     const STRU_AT *at;
1688     #ifdef M26
1689     if(g_M25_M26_specific==2)
1690     {
1691         at = &struAtTcpAck_SIMCom[index];
1692     }
1693     else if(g_M25_M26_specific==3)
1694     {
1695         at = &struAtTcpAck_SIMCom7[index];               // +CIPACK: 10,10,5
1696     }
1697     else if( module == MODULE_M26 )
1698     {
1699         at = &struAtTcpAck_M26[index];
1700     }
1701     else 
1702     {
1703         at = &struAtTcpAck_UC15[index];
1704     }
1705     return at_cmd_return(at);
1706     #else
1707     const char TCP_ACK[] = {"AT%TXSTATE?\r"};
1708     #endif
1709 }
1710 #if 0
1711 /*********************************************************************************************************
1712 ** Function name:    gsm_tcp_send
1713 ** Descriptions:    AT+QISEND=<connectID>,<send_length>: Send the length of data to index channel
1714 ** input parameters:    index=connectID,len=length of data send
1715 ** Output parameters:    
1716 ** Returned value:    
1717 *********************************************************************************************************/
1718 SYS_ERR gsm_tcp_send( u8 index,u8 *buf,u16 len,ENUM_MODULE module )
1719 {
1720     STRU_AT struAt = {NULL,RET_LARGE,5,5};
1721     char *p;
1722     SYS_ERR result;
1723     #if gsm_debug
1724     u16 i;
1725     #endif
1726     p = mymalloc(32);
1727     if( module == MODULE_UC15 || module == MODULE_EC200S || module == MODULE_EC25)
1728     {
1729         sprintf( p,"AT+QISEND=%u,%u\r",index,len );
1730     }
1731     else if(g_M25_M26_specific==3)
1732     {
1733         sprintf( p,"AT+CIPSEND=%u,%u\r",index,len );
1734     }
1735     else
1736     {
1737         sprintf( p,"AT+QISEND=%u\r",len );
1738     }
1739     
1740     struAt.command = p;
1741     result = at_cmd_return( &struAt );
1742     myfree( p );
1743     if( result != SYS_ERR_OK ) 
1744     {
1745         return result;        /* response '>',then start send data bytes */
1746     }
1747     usart_send_bytes( USART3,(u8*)buf,len );
1748     #if gsm_debug
1749     for( i = 0; i < len; i++ )
1750     {
1751         printf("%02X", buf[i]);
1752     }
1753     printf("\n");
1754     #endif
1755     
1756     return SYS_ERR_OK;
1757 }
1758 #endif
1759 SYS_ERR gsm_send_topic( u8 index,u16 len,ENUM_MODULE module ){
1760     STRU_AT struAt = {NULL,RET_LARGE,5,5};
1761     char *p;
1762     SYS_ERR result;
1763     p = mymalloc(32);
1764     if( module == MODULE_UC15 || module == MODULE_EC200S || module == MODULE_EC25)
1765     {
1766         sprintf( p,"AT+QISEND=%u,%u\r",index,len );
1767     }
1768     else if(g_M25_M26_specific==3)
1769     {
1770         sprintf( p,"AT+CIPSEND=%u,%u\r",index,len );
1771     }
1772     else
1773     {
1774         sprintf( p,"AT+QISEND=%u\r",len );
1775     }
1776     
1777     struAt.command = p;
1778     result = at_cmd_return( &struAt );/* response '>',then start send data bytes */
1779     myfree( p );
1780     return result;
1781 }
1782 void Modem_Put_Hex(u8 *s, u16 Length)
1783 {
1784     u8 *p=s;
1785     u16 i=0;
1786     i=Length;
1787     while(i--)
1788     {
1789         USART_SendData(USART3, *s++);
1790         while(USART_GetFlagStatus(USART3,USART_FLAG_TXC)==RESET);
1791     }
1792     #if gsm_debug
1793     printf("MCU: ");
1794     for(i=0;i<Length;i++)
1795     {
1796         printf("%02x",p[i]);
1797     }
1798     printf("\n");
1799     #endif
1800 }
1801 /**
1802  02
1803 000b
1804 1010062f0066f4b4c0b447
1805 */
1806 void Modem_put_data(u8*s,u16 Length)
1807 {
1808     #if gsm_debug
1809     u8 *p;
1810     u8 *p2;
1811     #endif
1812     
1813     u8 topic[3];
1814     u16 i;
1815     //FOR AEPCloud: 0x02+2bytes length
1816     topic[0]=0x02;
1817     topic[1]=Length>>8;
1818     topic[2]=Length;
1819     
1820     #if gsm_debug
1821     p=s;
1822     p2 = topic;
1823     #endif
1824     
1825     for(i=0;i<Length+3;i++)
1826     {
1827         if(i < 3)
1828         {
1829             USART_SendData(USART3, topic[i]);
1830         }
1831         else
1832         {
1833             USART_SendData(USART3, *s++);
1834         }
1835         while(USART_GetFlagStatus(USART3,USART_FLAG_TXC)==RESET);
1836     }
1837     #if gsm_debug
1838     printf("MCU: ");
1839     for(i=0;i<Length+3;i++)
1840     {
1841         if(i < 3)
1842         {
1843             printf("%02x",*p2++);
1844         }
1845         else
1846         {
1847             printf("%02x",*p++);
1848         }
1849     }
1850     printf("\n");
1851     #endif
1852 }
1853 
1854 /*********************************************************************************************************
1855 ** Function name:    gsm_enet_d2s_pulse
1856 ** Descriptions:    send data via connectID_0
1857 ** input parameters:    
1858 ** Output parameters:    
1859 ** Returned value:    
1860 *********************************************************************************************************/
1861 SYS_ERR gsm_enet_tcp_send( u8 *buf,u16 len,u32 ack,ENUM_MODULE module,bool pura_data )
1862 {
1863     INT32U time_start;
1864     INT8U err;
1865     u32 *msg; 
1866     u8 temp;
1867     u16 k;
1868     
1869     temp = 3;
1870     while( temp-- ) // repeat 3 times
1871     {
1872         if(pura_data){
1873             k=len;
1874         }
1875         else{
1876             k = len+3;
1877         }
1878         if(gsm_send_topic(TCP_INDEX_ENET,k,struGsm.module)!=SYS_ERR_OK)
1879         {
1880             return SYS_ERR_TCP_ACK_FAIL;
1881         }
1882         if( ack == 0 )
1883         {
1884             return SYS_ERR_OK;
1885         }
1886         if(pura_data){
1887             Modem_Put_Hex(buf,len);
1888         }
1889         else{
1890             Modem_put_data(buf,len);
1891         }
1892         time_start = OSTimeGet();
1893         while( OSTimeGet()-time_start < 10*1000 )
1894         {
1895             msg = OSQPend( msg_gsm_parse,1000,&err );  /* task pending, wait for response */
1896             if( err == OS_ERR_NONE )
1897             {
1898                 if( ( *msg&ack ) != 0 )
1899                 {
1900                     return SYS_ERR_OK;
1901                 }
1902             }
1903             OSTimeDly( 1000);
1904             
1905             if( ( struGsm.status&GSM_STAT_TCP_CONNECT ) == 0 ) 
1906             {
1907                 return SYS_ERR_AT_FAIL;
1908             }
1909         }
1910     }
1911     return SYS_ERR_AT_FAIL;
1912 }
1913 
1914 /*********************************************************************************************************
1915 ** Function name:    gsm_delete_sms
1916 ** Descriptions:    AT+CMGD=<index>[,<delflag>]
1917 ** <index> Integer type value in the range of location numbers supported by the associated memory.
1918 ** <delflag> 0 Delete the message specified in <index>
1919 ** 1 Delete all read messages from <mem1> storage
1920 ** 2 Delete all read messages from <mem1> storage and sent mobile originated messages
1921 ** 3 Delete all read messages, sent and unsent mobile originated messages from 
1922 ** <mem1> storage
1923 ** 4 Delete all messages from <mem1> storage
1924 **
1925 ** input parameters:    index
1926 ** Output parameters:    NONE
1927 ** Returned value:    
1928 *********************************************************************************************************/
1929 SYS_ERR gsm_delete_sms( u8 index )
1930 {
1931 //    const STRU_AT *at = &struAtInit[4];        /* list all sms undeleted */
1932     STRU_AT struAt = {NULL,RET_OK,5,5};
1933     char *p;
1934     SYS_ERR result;
1935     
1936     p = mymalloc(32);
1937     struAt.command = p;
1938     sprintf( p,"AT+CMGD=%u\r",index );        /* delete the message from index */
1939     result= at_cmd_return(&struAt);
1940 //    result= at_cmd_return(at);                /* CMGL list all of the message */
1941     myfree(p);
1942     return result;
1943 }
1944 /*********************************************************************************************************
1945 ** Function name:    gsm_hangup
1946 ** Descriptions:    
1947 ** input parameters:    
1948 ** Output parameters:    
1949 ** Returned value:    
1950 *********************************************************************************************************/
1951 SYS_ERR gsm_hangup()
1952 {
1953     const STRU_AT *at = &struAtCallOut[0];    /* ATH hangup call */
1954     STRU_AT struAt = {"AT+CHUP\r",RET_OK,1,1};
1955     if(g_M25_M26_specific==3)
1956     {
1957         at_cmd_return(&struAt);
1958     }
1959     return at_cmd_return(at);               /* "ATH\r" */
1960 }
1961 /*********************************************************************************************************
1962 ** Function name:    gsm_read_sms
1963 ** Descriptions:    AT+CMGR=<index>
1964 ** input parameters:    index
1965 ** Output parameters:    NONE
1966 ** Returned value:    
1967 *********************************************************************************************************/
1968 SYS_ERR gsm_read_sms( u8 index )
1969 {
1970     const STRU_AT *at;
1971     STRU_AT struAt = {NULL,RET_OK,5,10};
1972     char *p;
1973     SYS_ERR result;
1974     
1975     #if 0
1976     const STRU_AT *at = &struAtSetAscii[0];
1977     #else
1978     /* unicode mode read: source number and content of sms are unicode all */
1979     if(g_M25_M26_specific==0)
1980         at = &struAtSetHz[0];
1981     else
1982         at = &struM25_AtSetHz[0];
1983     #endif
1984     at_cmd_list_return(at);
1985     
1986     p = mymalloc(32);
1987     struAt.command = p;
1988     sprintf( p,"AT+CMGR=%u\r",index );
1989     result = at_cmd_return(&struAt);
1990     result = gsm_delete_sms( index );
1991     myfree(p);
1992     return result;
1993 }
1994 /*********************************************************************************************************
1995 ** Function name:    gsm_send_sms
1996 ** Descriptions:    if content is Chinese, need to change to unicode format
1997 ** input parameters:    cn=1=Chinese,target=phone number,content=message content
1998 ** Output parameters:    
1999 ** Returned value:
2000 *********************************************************************************************************/
2001 SYS_ERR gsm_send_sms( u8 cn,char *target,char *content )
2002 {
2003     const STRU_AT *at;
2004     STRU_AT struAt = {NULL,RET_LARGE,5,5};
2005     char *p;
2006     char *ptr;
2007     SYS_ERR result;
2008     
2009     /*
2010     at+cscs="gsm"
2011     OK
2012     AT+CSMP=,,,0
2013     OK
2014     at+cmgs="13602692091"
2015     > test^Z
2016 
2017     +CMGS: 210
2018 
2019     OK
2020     
2021     at+cscs="ucs2"
2022     OK
2023     AT+CSMP=,,,8
2024     OK
2025     at+cmgs="00310033003600300032003600390032003000390031"
2026     > 6D4B8BD5^Z
2027 
2028     +CMGS: 211
2029 
2030     OK
2031     */
2032     
2033     if( cn ) 
2034     {
2035         if(g_M25_M26_specific==0)
2036             at = &struAtSetHz[0];
2037         else
2038             at = &struM25_AtSetHz[0];
2039     }
2040     else 
2041     {
2042         if(g_M25_M26_specific==0)
2043             at = &struAtSetAscii[0];
2044         else 
2045             at = &struM25_AtSetAscii[0];
2046     }
2047     if( at_cmd_list_return(at) != SYS_ERR_OK ) return SYS_ERR_AT_FAIL;
2048     
2049     p = mymalloc( 128 );
2050     if( cn ) { ascii_2_unicode( p+32,target );ptr=p+32; }        /* if it's Chinese,need to change to unicode */
2051     else ptr = target;
2052     sprintf( p,"AT+CMGS=\"%s\"\r",ptr );
2053     struAt.command = p;
2054     at_cmd_return( &struAt );               /* it will response '<',then you can send message */
2055     
2056     usart_send_str( USART3,content );
2057     #if gsm_debug
2058     printf( "%s\r\n",content );
2059     #endif
2060     strcpy( p,"\x1a" );                        /* send by ctl+z */
2061     struAt.result = RET_CMGS;
2062     struAt.timeout = 15;
2063     struAt.time_total = 15;
2064     result = at_cmd_return( &struAt );
2065     myfree(p);
2066     
2067     return result;
2068 }
2069 /*********************************************************************************************************
2070 ** Function name:    gsm_call_handle
2071 ** Descriptions:    
2072 ** input parameters:    call in @<mode> set and call out @<mode> reset
2073 ** Output parameters:    
2074 ** Returned value:
2075 *********************************************************************************************************/
2076 SYS_ERR gsm_call_handle( char *target,u8 mode,ENUM_MODULE module )
2077 {
2078     const STRU_AT AT_QPSND_STOP = {"AT+QPSND=0\r",RET_OK,1,1};
2079     
2080     char *p;
2081     INT32U time_start;
2082     //OS_MSG_SIZE size;
2083     INT8U err;
2084     u32 *result;
2085     SYS_ERR at_result;
2086     u8 connect;
2087     const char AT_ATA[] = {"ATA\r"};        /* Answer an Incoming Call */
2088     const char AT_CLCC[] = {"AT+CLCC\r"};   /* List current calls of ME */
2089     const STRU_AT *at;
2090     u8 ctr_clcc;
2091     STRU_AT struAt = {NULL,RET_OK,5,10};
2092     u8 temp;
2093     
2094     if( ( mode&CALL_MODE_OUT ) != 0 )
2095     {
2096         /* hang up if call out */
2097         if( gsm_hangup() != SYS_ERR_OK ) return SYS_ERR_AT_FAIL;
2098     }
2099     
2100     //DTMF configuration
2101     if(g_M25_M26_specific==2)
2102     {
2103         ;;  //default enable
2104     }
2105     else if(g_M25_M26_specific==3)
2106     {
2107         ;;  //default enable
2108     }
2109     else
2110     {
2111         at = &struAtCallOut[1];
2112         if( at_cmd_list_return( at ) != SYS_ERR_OK ) 
2113         {
2114             return SYS_ERR_AT_FAIL;
2115         }
2116     }
2117     
2118     /** set Loudspeaker volume level,mic,etc.. option ***/
2119     switch(module)
2120     {
2121         case MODULE_M26:
2122         {
2123             if(g_M25_M26_specific==0)
2124             {
2125                 at = &struAtCallOut_M26[0];
2126             }
2127             else if(g_M25_M26_specific==2)
2128             {
2129                 at = &struAtCallOut_SIMCom[0];
2130             }
2131             else if(g_M25_M26_specific==3)
2132             {
2133                 at = &struAtCallOut_SIMCom7[0];
2134             }
2135             else at = &struAtCallOut_M25[0];
2136             break;
2137         }
2138         case MODULE_UC15:
2139         {
2140             at = &struAtCallOut_UC15[0];
2141             break;
2142         }
2143         case MODULE_EC200S:
2144         {
2145             at = &struAtCallOut_EC200S[0];
2146             break;
2147         }
2148         case MODULE_EC25:
2149         {
2150             at = &struAtCallOut_EC25[0];
2151             break;
2152         }
2153         default:
2154         {
2155             at = &struAtCallOut_UC15[0];
2156             break;
2157         }
2158     }
2159     
2160     if( at_cmd_list_return( at ) != SYS_ERR_OK ) 
2161     {
2162         return SYS_ERR_AT_FAIL;
2163     }
2164     
2165     if( ( mode&CALL_MODE_OUT ) == 0 )
2166     {
2167         /* call in and answer */
2168         struAt.command = (char *)AT_ATA;
2169         if( at_cmd_return(&struAt) != SYS_ERR_OK ) return SYS_ERR_AT_FAIL;
2170     }
2171     
2172     connect = 0;
2173     p = mymalloc(64);
2174     
2175     if( ( mode&CALL_MODE_OUT ) != 0 )
2176     {
2177         sprintf( p,"ATD%s;\r",target ); /* dialing */
2178         struAt.command = p;
2179         at_cmd_return( &struAt );
2180     }
2181 
2182     ctr_clcc = 0;
2183     struGsm.dtmf = 0;
2184     time_start = OSTimeGet();
2185     while( OSTimeGet()-time_start < 30*60*1000 )
2186     {
2187         if( ( struGsm.status&GSM_STAT_DISARM ) != 0 ) break;        /* disarmed when calling */
2188         struAt.command = (char *)AT_CLCC;
2189         usart_send_str( USART3,struAt.command );            /* "AT+CLCC\r", CLCC check,list current calls */
2190         result = OSQPend( msg_gsm_parse,1000,&err );  /* task pend,wait for response */
2191         if( err == OS_ERR_NONE )
2192         {
2193             if( ( *result&RET_NO_CARRIER ) != 0 ) break;        /* NO CARRIER/BUSY/NO DIALTONE */
2194             
2195             
2196             if( ( *result&RET_OK ) != 0 )
2197             {
2198                 if( ( *result&RET_CLCC ) == 0 )
2199                 {    
2200                     if( ++ctr_clcc >= 4 ) break;
2201                 }
2202                 else ctr_clcc = 0;
2203             }
2204             if( ( *result&RET_CALL_CONNECT ) != 0 ) struGsm.status |= GSM_STAT_CALL_CONNECT;
2205             
2206             if( ( *result&RET_VOICE_CONNECT ) != 0 && connect == 0 )
2207             {   
2208                 connect = 1;
2209                 struGsm.status |= GSM_STAT_VOICE_CONNECT;
2210                 
2211                 if( ( mode&CALL_MODE_PLAY_PRESS ) != 0 )
2212                 {
2213                     struGsm.status |= GSM_STAT_DTMF_CTRL;
2214                     OSTimeDly( 1000);//,OS_OPT_TIME_PERIODIC,&err );
2215                     
2216                     set_audio_mode( AUDIO_MODE_WAVPLAY_INCALL );
2217                     set_music_play_task( "alarm" );
2218                     struPlayWav.channel = DAC_CHANNEL_TO_MIC;
2219                     delay_wait_wav_play_over();
2220                     
2221                     if( ( mode&CALL_MODE_OUT ) != 0 )
2222                     {
2223                         /* play alarming segment only in call-out alarming mode */
2224                         /* play audio file and send it to remote in call */
2225                         //at = (module==MODULE_M26)?(&struAtSendPlay_M26[0]):((module==MODULE_EC200S)?(&struAtSendPlay0_EC200S_EC25[0]):(&struAtSendPlay_UC15[0]));
2226                         switch(module)
2227                         {
2228                             case MODULE_M26:
2229                             {
2230                                 if(g_M25_M26_specific == 3)
2231                                 {
2232                                     at = &PLAY_SIMCom7ToRemote[0];
2233                                 }
2234                                 else
2235                                 {
2236                                     at = &struAtSendPlay_M26[0];
2237                                 }
2238                                 break;
2239                             }
2240                             case MODULE_UC15:
2241                             {
2242                                 at = &struAtSendPlay_UC15[0];
2243                                 break;
2244                             }
2245                             case MODULE_EC200S:
2246                             case MODULE_EC25:
2247                             {
2248                                 if(struParaSet.dat.record_audio[1].IsRecord == RECORD_RECORDED)
2249                                 {
2250                                     if(ec200n_dk==1)
2251                                     {
2252                                         at = &struAtSendPlay1_EC200n[0];
2253                                     }
2254                                     else
2255                                     {
2256                                         at = &struAtSendPlay1_EC200S_EC25[0];
2257                                     }
2258                                 }
2259                                 else
2260                                 {
2261                                     if(ec200n_dk==1)
2262                                     {
2263                                         at = &struAtSendPlay0_EC200n[0];
2264                                     }
2265                                     else
2266                                     {
2267                                         at = &struAtSendPlay0_EC200S_EC25[0];
2268                                     }
2269                                 }
2270                                 break;
2271                             }
2272                             default:
2273                             {
2274                                 at = &struAtSendPlay_UC15[0];
2275                                 break;
2276                             }
2277                         }
2278                         /*if (module==MODULE_EC200S && struParaSet.dat.record_audio[1].IsRecord == RECORD_RECORDED)
2279                         {    
2280                             at = &struAtSendPlay1_EC200S_EC25[0];
2281                         }*/
2282                         if( struParaSet.dat.audio_file_len != 0 && at_cmd_list_return(at) == SYS_ERR_OK )
2283                         {
2284                             /* must cut off the alarming beep channel to mic */
2285                             set_audio_mode( AUDIO_MODE_PLAYBACK_INCALL );
2286                             OSTimeDly( struParaSet.dat.record_duration*1000);//,OS_OPT_TIME_PERIODIC,&err );
2287                              at_cmd_return(&AT_QPSND_STOP);
2288                         //    printf("\r\nT5");
2289                         }
2290                         
2291                         /* play alarm wav to monitor */
2292                         set_audio_mode( AUDIO_MODE_WAVPLAY_INCALL );
2293                         set_speak_play_task( (ENUM_WAV_SEG)struGsm.alarm_target.content );
2294                         struPlayWav.channel = DAC_CHANNEL_TO_MIC;        /* wav to mic */
2295                         delay_wait_wav_play_over();
2296                     }
2297                     
2298                     OSTimeDly( 1000);//,OS_OPT_TIME_PERIODIC,&err ); /* delay is necessary!!! */
2299                     set_speak_play_task( WAV_PRESS );
2300                     struPlayWav.channel = DAC_CHANNEL_TO_MIC;        /* wav to mic */
2301                 }
2302             }
2303         }
2304         /* restore talking mode */
2305         if( struPlayWav.status_play_wav == STAT_PLAY_FREE )
2306         {
2307             if( connect != 0 || ( pgsGsm == PGS_GSM_USER_CALL && (struGsm.status&GSM_STAT_CALL_CONNECT) != 0 ) )
2308                 set_audio_mode( AUDIO_MODE_INCALL );
2309         }
2310         
2311         temp = 100;
2312         while(temp--)
2313         {
2314             if( struGsm.dtmf != 0 )
2315             {
2316                 /*The command is used to send ASCII characters which cause MSC to transmit DTMF tones to a remote 
2317                   subscriber. It can only be operated in voice call.*/
2318                 sprintf( p,"AT+VTS=%c\r",struGsm.dtmf );/*AT+VTS=<dtmfstring>[,<duration>] */
2319                 struAt.command = p;
2320                 at_cmd_return( &struAt );
2321                 struGsm.dtmf = 0;
2322             }
2323             OSTimeDly( 10);//,OS_OPT_TIME_PERIODIC,&err );
2324         }
2325     }
2326     at_result = gsm_hangup();                    /* ATH again */
2327     struGsm.status &= ~(GSM_STAT_CALL_CONNECT|GSM_STAT_VOICE_CONNECT|GSM_STAT_USER_MONITOR|GSM_STAT_DTMF_CTRL);
2328     myfree(p);
2329     if( connect != 0 ) return SYS_ERR_CONNECTED;
2330     return at_result;
2331 }
2332 
2333 /*********************************************************************************************************
2334 ** Function name:    OS_gsm_msg_queue_create
2335 ** Descriptions:    CREATE A MESSAGE QUEUE
2336 ** input parameters:
2337 ** Output parameters:    NONE
2338 ** Returned value:    
2339 *********************************************************************************************************/
2340 void *MyArrayOfMsg[1];
2341 void gsm_usart_init(void)
2342 {
2343     msg_gsm_parse = OSQCreate( MyArrayOfMsg, sizeof( MyArrayOfMsg ) );
2344 }
2345 /*********************************************************************************************************
2346 ** Function name:    get_gsm_level
2347 ** Descriptions:    rssi to 6 copies: 0-5
2348 ** input parameters:    NONE
2349 ** Output parameters:    NONE
2350 ** Returned value:    
2351 *********************************************************************************************************/
2352 u8 get_gsm_level( u8 rssi )
2353 {
2354     if( rssi <= 2 || rssi == 99 ) return 0;
2355     else if( rssi >= 14 ) return 5;
2356     else if( rssi >= 12 ) return 4;
2357     else if( rssi >= 8 ) return 3;
2358     else if( rssi >= 5 ) return 2;
2359     else return 1;
2360 }
2361 /*unsigned char cal_crc(unsigned char *vptr, unsigned char len)
2362 {
2363   const unsigned char *data = vptr;
2364   unsigned int crc = 0;
2365   int i, j;
2366   for (j = len; j; j--, data++) 
2367   {
2368     crc ^= (*data << 8);
2369     for (i = 8; i; i--) 
2370     {
2371       if (crc & 0x8000)
2372         crc ^= (unsigned int)(0x1070 << 3);
2373       crc <<= 1;
2374     }
2375   }
2376   return (unsigned char)(crc >> 8);
2377 }
2378 */
2379 /*********************************************************************************************************
2380 ** Function name:    gsm_parse
2381 ** Descriptions:    GSM data parase
2382 ** input parameters:    *p
2383 ** Output parameters:    gsm
2384 ** Returned value:    a message to a queue
2385 *********************************************************************************************************/
2386 u32 gsm_parse( const char *p,STRU_GSM *gsm )
2387 {
2388     u32 l;
2389     u32 result = 0;
2390     u8 temp;
2391     u16 t;
2392 //    s16 tim_zone,min;
2393 //    u8 leap_year;
2394     /* unique device id */
2395     union
2396     {
2397         u32 udi;
2398         u8  udi_buf[4];
2399     }UDI_para;
2400     
2401     char *pstr,*pstr2;
2402     char *p1,*p2;
2403     ///static u8 ring_counter = 0;
2404     
2405     struct tm utc;//,struGMT8;
2406 //    time_t t1,t2;
2407     
2408     pstr = mymalloc(32*4);
2409     pstr2 = mymalloc(32);
2410     
2411     if(strstr(p,"NORMAL POWER DOWN\r\n") != NULL)
2412     {
2413         
2414     }
2415     if( strstr( p,"OK\r\n" ) != NULL )
2416     {
2417         result |= RET_OK;        /* received 'OK'*/
2418     }
2419     if( strstr( p,"ERROR\r\n" ) != NULL ) 
2420     {
2421         result |= RET_ERROR;    /* received 'ERROR'*/
2422     }
2423     if(g_M25_M26_specific==3)
2424     {
2425         if(strstr(p,"+CNTP: 0") != NULL)
2426         {
2427             result |= RET_NTP;
2428         }
2429     }
2430     else
2431     {
2432         if(strstr(p,"+CNTP: 1") != NULL)
2433         {
2434             result |= RET_NTP;
2435         }
2436     }
2437     
2438     if(strstr(p,"+CPIN: SIM REMOVED") != NULL)
2439     {
2440         struGsm.status |= GSM_STAT_NO_SIM;
2441     }
2442     else if(strstr(p,"+CME ERROR: SIM not inserted")!=NULL)
2443     {
2444         struGsm.status |= GSM_STAT_NO_SIM;
2445     }
2446     
2447     if(strstr(p,"SHUT OK") != NULL)
2448     {
2449         result |= SHUT_OK;
2450     }
2451     
2452     //+CIPCLOSE: <link_num>,<err>; e.g = +CIPCLOSE: 0,0
2453     if(strstr(p,"+CIPCLOSE: 0,0") != NULL)
2454     {
2455         result |= SHUT_OK;
2456     }
2457     if(strstr(p,"+NETCLOSE") != NULL)
2458     {
2459         result = SHUT_OK;
2460     }
2461     
2462     p1 = strstr( p,"+CREG:" );
2463     if( p1 != NULL && getsubstr2( p1,',','\r',pstr ) != 0 )
2464     {
2465         temp = atoi(pstr);
2466         if( temp == 1 || temp == 5 )
2467         {
2468             gsm->status |= GSM_STAT_CREG;   /* Registered, home network */
2469 #if PK
2470             if(TestSignal_24H_Timer_sec == 0) //network registered, timer start.
2471                 TestSignal_24H_Timer_sec=1;
2472 #endif
2473             result |= RET_OK;
2474         }
2475         else
2476         {
2477             gsm->status &= ~GSM_STAT_CREG;  /* Registered Failed */
2478             result |= RET_ERROR;
2479         }
2480     }
2481     p1 = strstr( p,"+CGREG:" );
2482     if( p1 != NULL && getsubstr2( p1,',','\r',pstr ) != 0 )
2483     {
2484         temp = atoi(pstr);
2485         if( temp == 1 || temp == 5 )
2486         {
2487             gsm->status |= GSM_STAT_CREG;   /* Registered, home network */
2488             result |= RET_OK;
2489         }
2490         else
2491         {
2492             gsm->status &= ~GSM_STAT_CREG;  /* Registered Failed */
2493             result |= RET_ERROR;
2494         }
2495     }
2496     /* +CEREG: 0,1 */
2497     p1 = strstr(p,"+CEREG:");
2498     if(p1!=NULL && getsubstr2( p1,',','\r',pstr ))
2499     {
2500         temp = atoi(pstr);
2501         if( temp == 1 || temp == 5 )
2502         {
2503             gsm->status |= GSM_STAT_CREG;   /* Registered, home network */
2504             result |= RET_OK;
2505         }
2506         else
2507         {
2508             gsm->status &= ~GSM_STAT_CREG;  /* Registered Failed */
2509             result |= RET_ERROR;
2510         }
2511     }
2512     
2513     /*+CSQ: 13,99*/
2514     p1 = strstr( p,"+CSQ:" );
2515     if( p1 != NULL && getsubstr2( p1,':',',',pstr ) != 0 )
2516     {
2517         temp = atoi(pstr);  /*get rssi*/
2518         if(struParaSet.dat.KeepaliveIntervalTimeU16==0 || struParaSet.dat.KeepaliveIntervalTimeU16>600){
2519             if(TyReadTypeDef.NetworkRssiU8Status>temp){
2520                 if(TyReadTypeDef.NetworkRssiU8Status-temp>5){
2521                     gflag.fReport1Status |= fNetworkRssiU8StatusRes;
2522                 }
2523             }
2524             else if(temp-TyReadTypeDef.NetworkRssiU8Status>5){
2525                 gflag.fReport1Status |= fNetworkRssiU8StatusRes;
2526             }
2527         }
2528         TyReadTypeDef.NetworkRssiU8Status = temp;
2529         gsm->rssi = temp;
2530         result |= ( temp > 0 && temp < 99 )?RET_OK:RET_ERROR;   /* less 0 or high 99: return ERROR */
2531     }
2532     
2533     /*
2534     +CCLK: "16/05/03,06:00:16+00"
2535     +CCLK: "15/01/28,09:15:43"
2536     +CCLK: "16/05/15,15:37:07"
2537     */
2538     p1 = strstr( p,"+CCLK:" );  /* yy/MM/dd,hh:mm:ss:zz  zz=time zone */
2539     if( p1 != NULL && getsubstr2( p1,'"','"',pstr ) >= 17  )
2540     {
2541         sprintf( pstr2,"%.2s%.2s%.2s",pstr+6,pstr+3,pstr );
2542         l = atof((const char*)pstr2);        /* src:DDMMYY */
2543         
2544         utc.tm_mday=l/10000;
2545         utc.tm_mon=(l/100)%100-1;        /* month is 0-11 in ANSI-C */
2546         utc.tm_year=l%100+2000;
2547         
2548         if( utc.tm_year >= 2017 )
2549         {
2550             sprintf( pstr2,"%.2s%.2s%.2s",pstr+9,pstr+12,pstr+15 );
2551             l = atof((const char*)pstr2);        /* src:hhmmss */
2552             utc.tm_hour=l/10000;        
2553             utc.tm_min=(l/100)%100;
2554             utc.tm_sec=l%100;
2555             
2556             OS_CPU_SR cpu_sr=0;// CPU_SR_ALLOC();
2557             OS_ENTER_CRITICAL();//CPU_CRITICAL_ENTER();
2558             # if 0
2559             #if GET_CLOCK_BY_NTP
2560             get_local_time( &utc,&struGMT8,(struParaSet.dat.time_zone*60/10)*60 );
2561             #else
2562             /* test */
2563             //get_local_time( &utc,&struGMT8,atoi(pstr+17)*15*60 );
2564             #endif
2565             //t1 = Time_ConvCalendarToUnix(struGMT8);
2566             //t2 = Time_ConvCalendarToUnix(calendar);
2567             //t1 = (t1>=t2)?(t1-t2):(t2-t1);
2568             //if( t1 >= 5 )
2569             //{
2570             
2571             if((utc.tm_year%4==0&&utc.tm_year%100!=0)||(utc.tm_year%400==0))
2572             {
2573                 leap_year = 1;
2574             }
2575             else
2576             {
2577                 leap_year = 0;
2578             }
2579             
2580             if((g_M25_M26_specific!=3) && (g_M25_M26_specific!=2))
2581             {
2582                 tim_zone = atoi(pstr+17);       // time zone
2583                 #if gsm_debug
2584                 printf("utc: %02u-%02u-%02u %02u:%02u:%02u +%02d\r\n",utc.tm_year,utc.tm_mon,utc.tm_mday,utc.tm_hour,utc.tm_min,utc.tm_sec,tim_zone);
2585                 #endif
2586                 
2587                 min = tim_zone*15%60;           // time zone => minute
2588                 utc.tm_min += min;
2589                 tim_zone = tim_zone*15/60;      // time zone => hour
2590                 
2591                 utc.tm_hour += tim_zone;
2592                 if(utc.tm_min >= 60)
2593                 {
2594                     utc.tm_min = 1;
2595                     utc.tm_hour++;
2596                 }
2597             }
2598             if(utc.tm_hour > 24)
2599             {
2600                 utc.tm_hour = utc.tm_hour - 24;
2601                 utc.tm_mday++;
2602                 if(utc.tm_mon==2)
2603                 {
2604                     if(leap_year==1)
2605                     {
2606                         if(utc.tm_mday>29)
2607                         {
2608                             utc.tm_mday = 1;
2609                             utc.tm_mon++;
2610                         }
2611                     }
2612                     else
2613                     {
2614                         if(utc.tm_mday>28)
2615                         {
2616                             utc.tm_mday = 1;
2617                             utc.tm_mon++;
2618                         }
2619                     }
2620                 }
2621                 else if(utc.tm_mon==1 || utc.tm_mon==3 || utc.tm_mon==5 || utc.tm_mon==7 || utc.tm_mon==8 || utc.tm_mon==10 || utc.tm_mon==12)
2622                 {
2623                     if(utc.tm_mday>31)
2624                     {
2625                         utc.tm_mday=1;
2626                         utc.tm_mon++;
2627                         if( utc.tm_mon==13)
2628                         {
2629                             utc.tm_mon=1;
2630                             utc.tm_year++;
2631                         }
2632                     }
2633                 }
2634                 else if(utc.tm_mon==4 || utc.tm_mon==6 || utc.tm_mon==9 || utc.tm_mon==11)
2635                 {
2636                     if(utc.tm_mday>30)
2637                     {
2638                         utc.tm_mday=1;
2639                         utc.tm_mon++;
2640                     }
2641                 }
2642             }
2643             else if(utc.tm_hour < 0)
2644             {
2645                 utc.tm_hour = utc.tm_hour + 24;
2646                 utc.tm_mday--;
2647                 if(utc.tm_mday<0)
2648                 {
2649                     if(utc.tm_mon==1)
2650                     {
2651                         utc.tm_year--;
2652                         utc.tm_mon=12;
2653                         utc.tm_mday=31;
2654                     }
2655                     else
2656                     {
2657                         utc.tm_mon--;
2658                         if(utc.tm_mon==2)
2659                         {
2660                             if(leap_year==1)
2661                             {
2662                                 utc.tm_mday=29;
2663                             }
2664                             else
2665                             {
2666                                 utc.tm_mday=28;
2667                             }
2668                         }
2669                         else if(utc.tm_mon==3 || utc.tm_mon==5 || utc.tm_mon==7 || utc.tm_mon==8 || utc.tm_mon==10 || utc.tm_mon==12)
2670                         {
2671                             utc.tm_mday=31;
2672                         }
2673                         else if(utc.tm_mon==4 || utc.tm_mon==6 || utc.tm_mon==9 || utc.tm_mon==11)
2674                         {
2675                             utc.tm_mday=30;
2676                         }
2677                     }
2678                 }
2679             }
2680             #endif
2681             Time_SetCalendarTime(utc,0);
2682             OS_EXIT_CRITICAL();//CPU_CRITICAL_EXIT();
2683         }
2684     }
2685     
2686     /*+CGATT: 1*/
2687     p1 = strstr( p,"+CGATT:" ); /*+CGATT: <state>*/
2688     if( p1 != NULL && getsubstr2( p1,':','\r',pstr ) != 0 )
2689     {
2690         if( atoi(pstr) == 1 )
2691         {
2692             result |= RET_CGATT;
2693         }
2694     }
2695     
2696     /* +CMTI: "SM",2 */
2697     p1 =  strstr( p,"+CMTI:" ); /* SMS received */
2698     if( p1 != NULL && getsubstr2( p1,',',0x0d,pstr ) != 0 )
2699     {
2700           gsm->sms_index = atoi(pstr);    /* get index of sms */
2701         gsm->task |= GSM_TASK_CMGR;
2702         gsm->task |= GSM_TASK_CMGD;
2703     }
2704     
2705     /*
2706     Chinese:1234mz领航卫士2楼
2707     +CMGR: "REC UNREAD","+8613602692091","","2016/03/14 16:36:01+32"
2708     0031003200330034006D007A9886822A536B58EB0032697C
2709     
2710     ascii:
2711     +CMGR: "REC UNREAD","+8613602692091","","2016/04/08 15:28:47+32"
2712     *6666*5113602692091,0,1*
2713     +CMGR: "REC UNREAD","+8613602692091","","2016/05/18 13:43:25+32"
2714     0031003200330034006D007A9886822A536B58EB0032697C
2715     OK
2716     
2717     +CMGR: "REC UNREAD","002B0038003600310033003600300032003600390032003000390031","","2017/01/13 10:13:08+32"
2718     003100320033003400400020005B00DF0028003D005300530029002C00C40028003D00410045002900D60028003D004F0045002900DC0028003D004F00550029005D0020
2719     */
2720     p1 = strstr( p,"+CMGR:" );  /* SMS Read */
2721     if( p1 != NULL )
2722     {
2723         t = getsubstr( 1,p1,pstr );     /* get the phone number */
2724         if( t >= 2+3*4 && *pstr == '"' && byte_ascii_2_hex( pstr+1 ) == 0 && byte_ascii_2_hex( pstr+5 ) == 0 )
2725         {
2726             /* get the source number of sms and digits >= 3 */
2727             p2= strrchr( pstr,'"' );
2728             if( p2 > pstr )
2729             {
2730                 *p2 = 0;
2731                 pstr[(PHONE_LEN-1)*4+2] = 0;
2732                 if(gsm->module == MODULE_EC200S)
2733                 {
2734                     if (strncmp(pstr, "\"002B00380036", 13))
2735                     {
2736                         unicode_2_ascii( gsm->target.phone,pstr+1,0 );
2737                     }
2738                     else
2739                     {
2740                         unicode_2_ascii( gsm->target.phone,pstr+13,0 );
2741                     }
2742                 }
2743                 else
2744                 {
2745                     unicode_2_ascii( gsm->target.phone,pstr+1,0 );
2746                 }
2747             }
2748         }
2749         else
2750         {
2751             // source number is ascii
2752             pstr[(PHONE_LEN-1)+2] = 0;
2753             if( getsubstr2( pstr,'"','"',pstr2 ) >= 3 )
2754             {
2755                 strcpy( gsm->target.phone,pstr2 );
2756             }
2757         }
2758         
2759         p2 = strchr( p1,'\n' );
2760         if( p2 != NULL )
2761         {
2762             p2++;
2763             p1 = strchr( p2,'\r' );
2764             if( p1 > p2 && p1-p2 >= (4+1+1)*4 )
2765             {
2766                 /* 
2767                 1234#1
2768                 1234@xxxxxxxxxxxxxxxxxxx    
2769                 *6666*AAxxxx*...
2770                 */
2771                 *p1 = 0;
2772                 unicode_2_ascii( pstr,p2,5 );        /* get start character */
2773                 
2774                 temp = SMS_CMD_MODE_NULL;
2775                 /* get the SMS format */
2776                 if( *pstr == '*' ) temp = SMS_CMD_MODE_SETTING;
2777                 else if( pstr[4] == '#' || pstr[4] == '@' ) temp = pstr[4];
2778                 if( temp != SMS_CMD_MODE_NULL )
2779                 {
2780                     
2781                     parse_cmd( (ENUM_SMS_CMD_MODE)temp,p2,&struParaSet,gsm );   /* paraser the message */
2782                 }
2783             }
2784         }
2785     }
2786     
2787     /*
2788     +CMGL: 1,"REC READ","10658139122352500148",,"15/12/19,10:50:12+32"
2789     0068007400740070003A002F002F0079002E00310030003000380036002E0063006E0....
2790     */
2791     p1 = strstr( p,"+CMGL:" );  /* SMS list */
2792     if( p1 != NULL && getsubstr2( p1,':',',',pstr ) != 0 )
2793     {
2794         gsm->sms_index = atoi(pstr);    /* get the index SMS in memory */
2795         gsm->task |= GSM_TASK_CMGD;
2796     }
2797     
2798     if( strstr( p,"\r\n>" ) != NULL ) result |= RET_LARGE;  /* received '<' character */
2799     if( strstr( p,"+CMGS:" ) != NULL ) result |= RET_CMGS;  /* received the response of send short message */
2800     
2801     /*
2802     +CLCC: 1,0,2,0,0,"13602692091",129,""   //dialing
2803     OK
2804     +CLCC: 1,0,3,0,0,"13602692091",129,""   //dialing alerting
2805     OK
2806     +CLCC: 1,0,0,0,0,"13602692091",129,""   //dialing active
2807     OK
2808     NO CARRIER                              //be hand up
2809     at+clcc                                 //End, none return
2810     OK
2811     */
2812     p1 = strstr( p,"+CLCC: 1,1,0,1,0,\"\",128" );   /* Mobile terminated (MT) call */
2813     if( p1 != NULL )
2814     {
2815         delete_string( p1 , strlen("+CLCC: 1,1,0,1,0,\"\",128"));
2816     }
2817     p1 = strstr( p,"+CLCC:" );
2818     if(GSM_TASK_INCALL_CHECK & gsm->task)
2819     {
2820         if( p1 != NULL && getsubstr2( p1,'"','"',pstr ) >= 3 )
2821         {
2822             if( get_phone_if_saved( pstr,&struParaSet ) == 0 )  /* check the phone of incomming if it's the one stored in memory before */
2823             {
2824                 gsm->task |= GSM_TASK_HANGUP;   /* if it's not the stored in memory, hang up it */
2825             }
2826             else 
2827             {
2828                 gsm->task |= GSM_TASK_CALL_IN;  /* answer it */
2829             }
2830         }
2831         gsm->task &=~ GSM_TASK_INCALL_CHECK;
2832     }
2833     else if( p1 != NULL && getsubstr( 2,p1,pstr ) == 1 )
2834     {
2835         result |= RET_CLCC;
2836         if( *pstr == '3' ) 
2837         {
2838             result |= RET_CALL_CONNECT;
2839         }
2840         else if( *pstr == '0' ) 
2841         {
2842             result |= RET_VOICE_CONNECT;
2843         }
2844     }
2845     if( strstr( p,"BUSY" ) != NULL ) result |= RET_NO_CARRIER;          /* dailing is busy */
2846     if( strstr( p,"NO CARRIER" ) != NULL ) result |= RET_NO_CARRIER;
2847     if( strstr( p,"NO DIALTONE" ) != NULL ) result |= RET_NO_CARRIER;
2848     //if( ( result&RET_NO_CARRIER ) != 0 ) ring_counter = 0;
2849     
2850     /*
2851     +QTONEDET: 49   48~57:0~9    42:*    35:#
2852     +QTONEDET: 51
2853     
2854     +CLCC: 1,0,3,0,0,"13602692091",129,""
2855     OK
2856     +QTONEDET: 50
2857     
2858     +QTONEDET: 69,100
2859     */
2860     p1 = strstr( p,"+QTONEDET:" );  /* DTMF code */
2861     if( p1 != NULL && getsubstr2( p1,':','\r',pstr ) >= 1 && (gsm->status&GSM_STAT_DTMF_CTRL) != 0 )
2862     {
2863         t = atoi( pstr );
2864         if( t >= 48 && t <= 57 ) t -= 48;        /* 0~9 */
2865         else if( t >= 65 && t <= 68 ) t -= 65+0x0A;    /* A~D */
2866         else if( t == 42 ) t = 0x0E;            /* * */
2867         else t = 0x0F;                    /* # */
2868         dtmf_ctrl_handle( t );
2869     }
2870     else
2871     {
2872         p1 = strstr( p,"DTMF: " );  /* DTMF code */
2873         if(p1 != NULL)
2874         {
2875             getsubstr2( p1,':','\r',pstr );
2876             t = atoi( pstr );
2877             dtmf_ctrl_handle( t );
2878         }
2879     }
2880     
2881     p1 = strstr(p,"RING");
2882     if( p1 != NULL )
2883     {
2884         #if HA
2885         gsm->task |= GSM_TASK_HANGUP;
2886         #else
2887         gsm->task |= GSM_TASK_DETECTED_INCALL;
2888         #endif
2889     }
2890     
2891     if( pgsGsm == PGS_GSM_GET_FIRMWARE && (result&RET_OK) != 0 )    /* firmware version response */
2892     {
2893         result &= ~RET_OK;
2894         p1 = strstr( p,M26_MODULE_REVISION );
2895         p2 = strstr( p,BC26_MODULE_REVISION );
2896         
2897         if( p1 != NULL || p2 != NULL)
2898         {
2899             gsm->module = MODULE_M26;
2900             g_M25_M26_specific = 0;
2901             strcpy( gsm->firmware,GENERATION_2G );
2902             if( p1 == NULL ) p1 = p2;            // p1 for getting the revision
2903         }
2904         else if ((p1 = strstr( p,EC200S_MODULE_REVISION )) != NULL)
2905         {
2906             gsm->module = MODULE_EC200S;
2907             strcpy( gsm->firmware,GENERATION_4G );
2908         }
2909         else if ((p1 = strstr( p,EC200N_MODULE_REVISION )) != NULL)
2910         {
2911             gsm->module = MODULE_EC200S;
2912             ec200n_dk = 1;
2913             strcpy( gsm->firmware,GENERATION_4G );
2914         }
2915         else if ((p1 = strstr( p,EC25_MODULE_REVISION )) != NULL)
2916         {
2917             gsm->module = MODULE_EC25;
2918             strcpy( gsm->firmware,GENERATION_4G );
2919         }
2920         //M25MAR01A11
2921         else if((p1 = strstr( p,"M25MAR01A11" )) != NULL)
2922         {
2923             gsm->module = MODULE_M26;
2924             g_M25_M26_specific = 1;
2925             g_Version_M25MAR01A11 = 1;
2926             strcpy( gsm->firmware,GENERATION_2G );
2927         }
2928         else if((p1 = strstr( p,M25_MODULE_REVISION )) != NULL)
2929         {
2930             gsm->module = MODULE_M26;
2931             g_M25_M26_specific = 1;
2932             g_Version_M25MAR01A11 = 0;
2933             
2934             strcpy( gsm->firmware,GENERATION_2G );
2935         }
2936         else if(strstr( p,SIMComR805C_REVISION ) != NULL)
2937         {
2938             gsm->module = MODULE_M26;
2939             g_M25_M26_specific = 2;
2940             g_Version_M25MAR01A11 = 0;
2941             p1 = strstr(p,"Revision: ");
2942             strcpy( gsm->firmware,GENERATION_2G );
2943         }
2944         else if(strstr( p,SIMComA7670_REVERSION ) != NULL)
2945         {
2946             gsm->module = MODULE_M26;
2947             g_M25_M26_specific = 3;
2948             g_Version_M25MAR01A11 = 0;
2949             p1 = strstr(p," ");
2950             strcpy( gsm->firmware,GENERATION_4G );
2951         }
2952         else if(strstr(p,SIMComA7680_REVERSION) !=NULL)
2953         {
2954             gsm->module = MODULE_M26;
2955             g_M25_M26_specific = 3;
2956             g_Version_M25MAR01A11 = 0;
2957             p1 = strstr(p,":");
2958             p1++;
2959             strcpy( gsm->firmware,GENERATION_4G );
2960         }
2961         else if((p1=strstr(p,SIMComY7025_REVUSUIB)) != NULL)
2962         {
2963             gsm->module=MODULE_NB;
2964             g_M25_M26_specific=4;
2965             strcpy(gsm->firmware,GENERATION_NB);
2966         }
2967         else
2968         {
2969             p1 = strstr( p,UC15_MODULE_REVISION );
2970             if( p1 != NULL )
2971             {
2972                 gsm->module = MODULE_UC15;
2973                 strcpy( gsm->firmware,GENERATION_3G );
2974             }
2975         }
2976         
2977         if( p1 != NULL )
2978         {
2979             p2 = strchr( p1,'\r' );
2980             if( p2 != NULL )
2981             {
2982                 strncpy( pstr,p1,p2-p1 );
2983                 pstr[p2-p1] = 0;
2984                 pstr[32-1] = 0;
2985                 strcat( gsm->firmware,pstr );   /* get the firmware version */
2986                 result |= VERSION_OK;            /* a valid revision received */
2987             }
2988         }
2989     }
2990     else
2991     {
2992         p1 = strstr(p,"Revision: ");
2993         if( p1 != NULL )
2994         {
2995             if((p1 = strstr( p,SIMComR805C_REVISION )) != NULL)
2996             {
2997                 //gsm->module = MODULE_M26;
2998                 g_M25_M26_specific = 2;
2999                 g_Version_M25MAR01A11 = 0;
3000                 //strcpy( gsm->firmware,GENERATION_2G );
3001                 result |= VERSION_OK;
3002             }
3003         }
3004         //AT+CGMR
3005         //+CGMR: A011B04A7670M6
3006         p1 = strstr(p,"+CGMR: ");
3007         if( p1 != NULL )
3008         {
3009             if((p1 = strstr( p,SIMComA7670_REVERSION )) != NULL)
3010             {
3011                 g_M25_M26_specific = 3;
3012                 g_Version_M25MAR01A11 = 0;
3013                 result |= VERSION_OK;
3014             }
3015         }
3016         else if(strstr(p,"Y7025")!=NULL)
3017         {
3018             g_M25_M26_specific=4;
3019             result |= VERSION_OK;
3020         }
3021     }
3022     
3023     if( pgsGsm == PGS_GSM_GET_IMEI && (result&RET_OK) != 0 )
3024     {
3025         /*
3026         AT+CGSN=1
3027         +CGSN:869600051637335
3028         OK
3029         */
3030         if(strstr(p,"+CGSN:")!=NULL)
3031         {
3032             if( getsubstr2( (char*)p,':','\r',pstr ) >= 15 )
3033             {
3034                 pstr[20-1] = 0;
3035                 strcpy( gsm->imei,pstr );
3036                 printf("imei=%s\n",gsm->imei);
3037                 gflag.fReport1Status |= fImeiNumberArrayStatusRes;
3038                 //if((struParaSet.dat.id/100000) != 9)
3039                 {
3040                     t = calculateChecksum((unsigned char*)gsm->imei,0,15);
3041                     UDI_para.udi = t;
3042                     UDI_para.udi*=10;
3043                     UDI_para.udi += (gsm->imei[14]-'0');
3044                     UDI_para.udi &= 0x000fffff;
3045                     if(UDI_para.udi != struParaSet.dat.id)
3046                     {
3047                         struParaSet.dat.id = UDI_para.udi;
3048                         strusParaSet_WriteIntoFlash_08072000();
3049                     }
3050                 }
3051             }
3052         }
3053         /*
3054         AT+GSN
3055         862151030097636
3056         OK
3057         */
3058         else if( getsubstr2( (char*)p,'\n','\r',pstr ) >= 15 )
3059         {
3060             pstr[20-1] = 0;
3061             strcpy( gsm->imei,pstr );       //get IMEI number
3062             gflag.fReport1Status |= fImeiNumberArrayStatusRes;
3063             //if((struParaSet.dat.id/100000) != 9)
3064             {
3065                 t = calculateChecksum((unsigned char*)gsm->imei,0,15);
3066                 UDI_para.udi = t;
3067                 UDI_para.udi*=10;
3068                 UDI_para.udi += (gsm->imei[14]-'0');
3069                 UDI_para.udi &= 0x000fffff;
3070                 if(UDI_para.udi != struParaSet.dat.id)
3071                 {
3072                     struParaSet.dat.id = UDI_para.udi;
3073                     strusParaSet_WriteIntoFlash_08072000();
3074                 }
3075             }
3076         }
3077     }
3078     if( pgsGsm == PGS_GSM_GET_IMSI && (result&RET_OK) != 0 )
3079     {
3080         /*
3081         AT+CIMI
3082         862151030097636
3083         OK
3084         */
3085         if( getsubstr2( (char*)p,'\n','\r',pstr ) >= 15 )
3086         {
3087             pstr[16] = 0;
3088             strcpy( gsm->imsi,pstr );       //get imsi number
3089             gsm->status |= GSM_STAT_IMSI;
3090         }
3091     }
3092     if( pgsGsm == PGS_GSM_GET_ICCID && (result&RET_OK) != 0 )
3093     {
3094         /*
3095         AT+CCID //query(U)SIM's CCID number: 898600220909A0206023
3096         +CCID: "898600220909A0206023"
3097         OK
3098         */
3099         p1 = strstr(p,"+CCID:");
3100         p2 = strstr(p,"+ICCID: ");
3101         if(p1!=NULL)
3102         {
3103             getsubstr2( (char*)p,'"','"',pstr );
3104             strcpy( gsm->iccid,pstr );          //get ICCID number
3105             printf("iccid=%s\n",pstr);
3106             gflag.fReport1Status |= fSimIccidNumberArrayStatusRes;
3107             gsm->status &=~GSM_STAT_NO_SIM;
3108         }
3109         else if(p2!=NULL)
3110         {
3111             if(getsubstr2( (char*)p2,' ','\n',pstr )>19)
3112             {
3113                 strcpy( gsm->iccid,pstr );          //get ICCID number:+ICCID: 89860478102071528575
3114                 gsm->iccid[strlen(pstr)-1]=0;
3115                 printf("iccid%d=%s\n",strlen(pstr),pstr);
3116                 gflag.fReport1Status |= fSimIccidNumberArrayStatusRes;
3117                 gsm->status &=~GSM_STAT_NO_SIM;
3118             }
3119         }
3120         /*
3121         AT+NCCID
3122         +NCCID:898604B61522C0001129
3123         OK
3124         */
3125         else if(strstr(p,"+NCCID:") != NULL)
3126         {
3127             if( getsubstr2( (char*)p,':','\r',pstr ) >= 19)
3128             {
3129                 strcpy( gsm->iccid,pstr );          //get ICCID number:+ICCID: 89860478102071528575
3130                 gsm->iccid[strlen(pstr)-1]=0;
3131                 printf("iccid%d=%s\n",strlen(pstr),pstr);
3132                 gflag.fReport1Status |= fSimIccidNumberArrayStatusRes;
3133                 gsm->status &=~GSM_STAT_NO_SIM;
3134             }
3135         }
3136         else if( getsubstr2( (char*)p,'\n','\r',pstr ) >= 19)
3137         {
3138             strcpy( gsm->iccid,pstr );          //get ICCID number
3139             printf("iccid=%s\n",pstr);
3140             gflag.fReport1Status |= fSimIccidNumberArrayStatusRes;
3141             gsm->status &=~GSM_STAT_NO_SIM;
3142         }
3143         
3144     }
3145     /*
3146     AT+QSIMSTAT?
3147     +QSIMSTAT: <enable>,<inserted_status>
3148     OK
3149     */
3150     p1 = strstr( p,"+QSIMSTAT:" );
3151     if( p1 != NULL && getsubstr( 1,p1,pstr ) == 1 && *pstr != '1' )
3152     {
3153         gsm->status |= GSM_STAT_NO_SIM;
3154     }
3155 
3156     if (pgsGsm == PGS_GSM_RECORD)
3157     {
3158         /*p1 = strstr( p,"+QFLST:" );
3159         if( p1 != NULL && getsubstr2( '\"','\"',pstr )  >= 1 )
3160         {
3161             ////gsm->amr.total = atoi(pstr);
3162             result |= RET_QFLST;
3163             printf("\r\n%s", pstr);
3164         }*/
3165     }
3166     
3167     p1 = strstr( p,"+CIPOPEN: " );  //  +CIPOPEN: 0,0
3168     if( p1 != NULL )
3169     {
3170         getsubstr2( p1,',','\r',pstr );
3171         t = atoi( pstr );
3172         if(t == 0)
3173         {
3174             printf("TCP online\n");
3175             result&=~RET_ERROR;
3176             result |= RET_CONNECT;
3177         }
3178         else if(t==2 || t==1)   //network failure or network not open
3179         {
3180             gsm->status &=~ GSM_STAT_TCP_CONFIG;
3181         }
3182     }
3183     
3184     if( pgsGsm == PGS_GSM_SAVE_RECORD || pgsGsm == PGS_GSM_READ_RECORD || pgsGsm == PGS_GSM_AUDIO_ALARM )
3185     {
3186         /*
3187         AT+QFLST="RAM:record.amr"
3188         +QFLST: "RAM:record.amr",3548,512000
3189         OK
3190         AT+QFLST="UFS:play.wav"
3191         +QFLST: "play.wav",155244        //for UC15
3192         */
3193         p1 = strstr( p,"+QFLST:" );
3194         if( p1 != NULL && getsubstr( 1,p1,pstr )  >= 1 )
3195         {
3196             gsm->amr.total = atoi(pstr);
3197             result |= RET_QFLST;
3198         }
3199         /*
3200         AT+FSLS
3201         +FSLS: FILES:
3202         re.wav
3203         OK
3204         */
3205         p1 = strstr( p,"+FSLS: " );
3206         if( p1 != NULL )
3207         {
3208             if(strstr( p,"re.wav") != NULL)
3209             {
3210                 result |= RET_QFLST;
3211             }
3212         }
3213         
3214         /*
3215         AT+QFOPEN="RAM:record.amr",2
3216         +QFOPEN: 265144
3217         OK
3218         */
3219         p1 = strstr( p,"+QFOPEN:" );
3220         if( p1 != NULL && getsubstr2( p1,':','\r',pstr ) >= 1 )
3221         {
3222             gsm->amr.filehandle = atoi(pstr);
3223             result |= RET_QFOPEN;
3224         }
3225         
3226         p1 = strstr( p,"CONNECT" );
3227         if( p1 != NULL )
3228         {
3229             result |= RET_CONNECT;
3230             if( getsubstr2( p1,' ','\r',pstr ) >= 1 )
3231             {
3232                 p2 = strchr( p1,'\n' );
3233                 if( p2 != NULL )
3234                 {
3235                     p2++;
3236                     t = atoi( pstr );
3237                     if( t > AMR_BLOCK_LEN ) t = AMR_BLOCK_LEN;
3238                     memcpy( gsm->amr.buf,p2,t );
3239                 }
3240                 result |= RET_QFREAD;
3241             }
3242         }
3243     }
3244     /*
3245     +QLTS: ""                //none--network failed
3246     +QLTS: "17/08/10,07:52:21+32,0"
3247     */
3248     p1 = strstr( p,"+QLTS:" );
3249     if( p1 != NULL && getsubstr2( p1,'"','"',pstr ) >= 17 )
3250     {
3251         result |= RET_QLTS;
3252     }
3253     
3254     if( strstr( p,"+PDP DEACT\r\n" ) != NULL || strstr( p,"DEACT OK\r\n" ) != NULL ) 
3255     {
3256         gsm->status &= ~GSM_STAT_TCP_CONFIG;
3257     }
3258     if( strstr( p,"CONNECT OK\r\n" ) != NULL || strstr( p,"ALREAY CONNECT\r\n" ) != NULL )
3259     {
3260         result |= RET_CONNECT;
3261     }
3262     
3263     if( gsm->module == MODULE_UC15 || gsm->module == MODULE_EC200S || gsm->module == MODULE_EC25 )
3264     {
3265         /*
3266         AT+QIACT? //Query the state of context.
3267         +QIACT: 1,1,1,"10.7.157.1"
3268         OK
3269         
3270         +QIOPEN: <connectID>,<err>
3271         <err> is 0 when service is started successfully, else
3272         <err> is not 0.
3273         AT+QIOPEN=1,0,"TCP","116.62.42.223",2001,0,1
3274         OK
3275         +QIOPEN: 0,0
3276         */
3277         p1 = strstr( p,"+QIACT:" );
3278         if( p1 != NULL && getsubstr( 1,p1,pstr ) == 1 && atoi(pstr) == 1 )
3279         {
3280             result |= RET_CONNECT;
3281         }
3282         
3283         p1 = strstr( p,"+QIOPEN:" );
3284         if( p1 != NULL && getsubstr( 1,p1,pstr ) >= 1 && atoi(pstr) == 0 )
3285         {
3286             result |= RET_CONNECT;
3287         }
3288     }
3289     //+IPCLOSE: 0,1 NETWORK CLOSED UNEXPECTEDLY
3290     if(strstr(p,"+IPCLOSE: 0") != NULL)
3291     {
3292         gsm->status &= ~(GSM_STAT_TCP_CONNECT+GSM_STAT_TCP_CONFIG);
3293     }
3294     if( strstr( p,"CLOSED\r\n" ) != NULL ) 
3295     {
3296         gsm->status &= ~GSM_STAT_TCP_CONNECT;
3297     }
3298     //+IP ERROR: Network is already opened
3299     if(strstr(p,"+IP ERROR: Network is already opened"))
3300     {
3301         result &=~ RET_ERROR;
3302         result |= RET_OK;
3303     }
3304     if( gsm->module == MODULE_UC15 || gsm->module == MODULE_EC200S || gsm->module == MODULE_EC25 )
3305     {
3306         p1 = strstr( p,"+QISEND:" );
3307         if( p1 != NULL && getsubstr2( p1,':',',',pstr ) >= 1 )
3308         {
3309             if( atoi(pstr) != 0 && getsubstr( 2,p1,pstr ) >= 1 && atoi( pstr ) == 0 ) result |= RET_TCP_ACK;
3310         }
3311     }
3312     else
3313     {
3314         p1 = strstr( p,"+QISACK:" );
3315         if( p1 != NULL && getsubstr2( p1,':',',',pstr ) >= 1 )
3316         {
3317             if( atoi(pstr) != 0 && getsubstr( 2,p1,pstr ) >= 1 && atoi( pstr ) == 0 ) result |= RET_TCP_ACK;
3318         }
3319         //+CIPACK: <sent_data_size>,<ack_data_size>,<recv_data_size>; e.g= +CIPACK: 10,10,5 /OK
3320         p1 = strstr( p,"+CIPACK: " );
3321         if( p1 != NULL)
3322         {
3323             result |= RET_TCP_ACK;
3324         }
3325     }
3326     //+CIPSEND: 0,23,23
3327     p1 = strstr(p,"+CIPSEND: ");
3328     if(p1 != NULL)
3329     {
3330         if(fDeleteSpecificDetectorsU16CfgRes&g_CurrentTransmit_buf[SENDING_CFG])
3331         {
3332             if(struParaSet.dat.delete_all_sub_response&2)
3333             {
3334                 struParaSet.dat.delete_all_sub_response&=~2;
3335                 task_global |= TASK_GLOBAL_WR_PARA_SET;
3336             }
3337         }
3338         if(fDeleteSpecificRemotesU16CfgRes&g_CurrentTransmit_buf[SENDING_CFG])
3339         {
3340             if(struParaSet.dat.delete_all_sub_response&1)
3341             {
3342                 struParaSet.dat.delete_all_sub_response&=~1;
3343                 task_global |= TASK_GLOBAL_WR_PARA_SET;
3344             }
3345         }
3346         g_CurrentTransmit_buf[SENDING_CFG] &=~ g_CurrentTransmit_buf[RESPONSE_CFG];
3347         
3348         g_CurrentTransmit_buf[SENDING_STATUS] &=~ g_CurrentTransmit_buf[RESPONSE_STATUS];
3349         
3350         result |= RET_SEND_OK;
3351     }
3352     /*
3353     +RECEIVE: 0, 18    
3354     
3355     IPD18:    
3356     
3357     UC15:
3358     +QIURC: “recv”,0,4    //Receive data from remote server.
3359     test
3360     +QIURC: "recv",0,18    //<CR><LF>
3361     */
3362     if( gsm->module == MODULE_UC15 || gsm->module == MODULE_EC200S || gsm->module == MODULE_EC25 )
3363     {
3364         p1 = strstr( p,"+QIURC: \"recv\"" );
3365         if( p1 != NULL && getsubstr( 2,p1,pstr ) >= 1 )
3366         {
3367             p2 = strchr( p1,'\n' );
3368             if( p2 != NULL )
3369             {
3370                 p2++;
3371                 t = atoi( pstr );
3372                 Protocol_Analysis((u8*)p2,t);
3373             }
3374         }
3375     }
3376     else
3377     {
3378         p1 = strstr( p,"+IPD" );
3379         if( p1 != NULL)                     // && getsubstr2( p1,'D',':',pstr ) >= 1 )
3380         {
3381             if(g_M25_M26_specific==3)   //+IPD16
3382             {
3383                 if(getsubstr2( p1,'D','\r',pstr ) >= 1)
3384                 {
3385                     t = atoi( pstr );       //length of data received
3386                     
3387                     p2 = strchr( p1,'\n' );
3388                     printf("length = %d\n",t);
3389                     p2++;
3390                     for(l=0;l<t;l++)
3391                     {
3392                         printf("%02x",p2[l]);
3393                     }
3394                     printf("\n");   //1010032101005a20
3395                     Protocol_Analysis((u8*)p2,t);
3396                 }
3397             }
3398         }
3399     }
3400     /*================================================================================*/
3401     
3402     myfree(pstr);
3403     myfree(pstr2);
3404     return result;
3405 }
3406 /*********************************************************************************************************
3407 ** Function name:    gsm_usart_handle
3408 ** Descriptions:    GSM DATA Detector
3409 ** input parameters:    NONE
3410 ** Output parameters:    NONE
3411 ** Returned value:    
3412 *********************************************************************************************************/
3413 void gsm_usart_handle(void)
3414 {
3415     u8 *p;
3416     u16 t;
3417     
3418 //    CPU_SR_ALLOC();
3419     t = get_usart_buffer( pStruUsartGsm,&p );
3420     if( t != 0 )
3421     {
3422         #if gsm_debug
3423         printf("\r\n%s",p);
3424 //        printf( "\r\nram used:%u%%\r\n",mem_perused() );
3425         #endif
3426         at_return_result = gsm_parse((char *)p,&struGsm);
3427         
3428         if( at_return_result != 0 && (at_return_result&RET_ERROR) == 0 )
3429         {
3430             OSQFlush( msg_gsm_parse );
3431             OSQPost( msg_gsm_parse,( void * ) &at_return_result );
3432         }
3433         myfree(p);
3434     }
3435 }
3436 /*********************************************************************************************************
3437 ** Function name:    gsm_task_init
3438 ** Descriptions:    
3439 ** input parameters:    NONE
3440 ** Output parameters:    NONE
3441 ** Returned value:    
3442 *********************************************************************************************************/
3443 void gsm_task_init(void)
3444 {
3445     struGsm.reset = 1;
3446     
3447     gflag.fReport1Status = fDeviceUidArrayStatusRes+fHardwareVersionU8StatusRes+fSoftwareVersionU8StatusRes;
3448     gflag.fReportCfg = (fMarsterLanguageU8CfgRes+fArmDisarmSoundSwitchU8CfgRes+fVoiceSoundSwitchU8CfgRes+fAlarmSoundSwitchU8CfgRes+fAlarmPropelSwitchU8CfgRes+fKeypadLockSwitchU8CfgRes+fKeypadToneSwitchU8CfgRes+fKeypadBacklightSwitchU8CfgRes);
3449 }
3450 
3451 //===========================================\
3452             Get Zone address\
3453 //===========================================/
3454 u16 get_zone_address_from_zoneNo(u16 zoneNo,u8 IsRemoteType)
3455 {
3456     u16 i;
3457     u16 addr_index=0;
3458     
3459     for(i=0;i<DETECTOR_MAX+EOL_ZONE_NUM;i++)
3460     {
3461         if(my_detector.dat.detector[i].null==0xaa && my_detector.dat.detector[i].setting.number==zoneNo)
3462         {
3463             if(IsRemoteType==1) 
3464             {
3465                 if(my_detector.dat.detector[i].setting.classification==EVENT_RMT)
3466                 {
3467                     addr_index=i+1;
3468                     break;
3469                 }
3470             }
3471             else if(my_detector.dat.detector[i].setting.classification!=EVENT_RMT)
3472             {
3473                 addr_index=i+1;
3474                 break;
3475             }
3476         }
3477     }
3478     return addr_index;
3479 }
3480 /****************************************************************
3481 ** Function name:    gsm_task
3482 ** Descriptions:    
3483 ** input parameters:    NONE
3484 ** Output parameters:    NONE
3485 ** Returned value:    
3486 *****************************************************************/
3487 static u32 keepalive_ticks=0;
3488 void gsm_task(void)
3489 {
3490     static u32 baudrate_sel=115200;
3491     static u8 ctr_tcp_connect;
3492     static bool m_b_variable=false;
3493     DataUint32TypeDef m32;
3494     u16 i,j,k;
3495     char *p;
3496 //    bool TCP_Busy;
3497 #if PK
3498     static u8 index_phone = 0;
3499 #endif
3500     //u8 temp;
3501     SYS_ERR result;
3502     const STRU_AT *at;
3503     STRU_GSM *gsm = &struGsm;
3504     
3505 //    TCP_Busy = (TyReadTypeDef.RegistedU8Status==2 && (g_CurrentTransmit_buf[SENDING_CFG]||g_CurrentTransmit_buf[SENDING_STATUS]||gflag.fReport1Status||gflag.fReportCfg))?true:false;
3506     
3507     if( gsm->reset != 0 )
3508     {
3509         gsm->status &= (GSM_STAT_AT_OK|GSM_STAT_IP_OK);
3510         TyReadTypeDef.RegistedU8Status = 0;
3511         gsm->rssi = 0;
3512         if( ( gsm->status&GSM_STAT_AT_OK ) != 0 )
3513         {
3514             gsm_power_down();
3515             gsm->status &= ~GSM_STAT_AT_OK;
3516         }
3517         printf("usart init:baudrate=%d\n",baudrate_sel);
3518         USART_DeInit(USART3);
3519         usart_init(USART_ID2,baudrate_sel);
3520         if( gsm_power_on() == SYS_ERR_OK )
3521         {
3522             if(gsm->module == MODULE_EC200S)
3523             {
3524                 //Every time reset module, loudspeaker will be set as default,so we need to change it to what we set before.
3525 //                usart_send_str( USART3,"AT+CLVL=3\r" );            /* Loudspeaker volume level selection: 0-3-5 */
3526             }
3527             gsm->reset = 0;
3528             gsm->status |= (GSM_STAT_AT_OK|GSM_BAUDRATE);
3529         }
3530         else if(GSM_BAUDRATE&gsm->status)
3531         {
3532             ;
3533         }
3534         else if(baudrate_sel==115200)
3535         {
3536             baudrate_sel=9600;
3537         }
3538         else
3539         {
3540             baudrate_sel=115200;
3541         }
3542         tmr_clock_test = 3;
3543         
3544         ctr_tcp_connect = 0;
3545 //        ctr_tcp_send = 0;
3546     }
3547     else if( ( gsm->status&GSM_STAT_FIREWARE ) == 0 )
3548     {   /* get firmware and IMEI numbers */
3549         pgsGsm = PGS_GSM_GET_FIRMWARE;
3550         if(g_M25_M26_specific==2 || g_M25_M26_specific==3 || g_M25_M26_specific==4)
3551         {
3552             at = &AT_GET_FIRMWARE_CGMR;
3553         }
3554         else
3555         {
3556             at = &AT_GET_FIRMWARE;
3557         }
3558         if( at_cmd_return( at ) != SYS_ERR_OK )
3559         {
3560             gsm->reset = 1;
3561         }
3562         pgsGsm = PGS_GSM_GET_IMEI;
3563         if(g_M25_M26_specific==4)
3564         {
3565             at = &AT_GET_CGSN;
3566         }
3567         else
3568         {
3569             at = &AT_GET_IMEI;
3570         }
3571         at_cmd_return(at);
3572 //        if(gsm->module == MODULE_EC200S)
3573 //        {
3574 //            usart_send_str( USART3,"AT+CLVL=3\r" );            /* Loudspeaker volume level selection: 0-3-5 */
3575 //        }
3576         pgsGsm = PGS_GSM_FREE;
3577         gsm->status |= GSM_STAT_FIREWARE;
3578     }
3579     #if GPRS_F==0
3580     else if( !(gsm->status&GSM_STAT_AMR) && g_M25_M26_specific!=4 )
3581     {
3582         pgsGsm = PGS_GSM_READ_RECORD;
3583         gsm_audio_read( gsm->module );
3584         pgsGsm = PGS_GSM_FREE;
3585         gsm->status |= GSM_STAT_AMR;
3586     }
3587     else if( (gsm->task&GSM_TASK_SAVE_RECORD)!=0 && g_M25_M26_specific!=4)
3588     {
3589         pgsGsm = PGS_GSM_SAVE_RECORD;
3590         gsm_save_record( gsm->module );
3591         pgsGsm = PGS_GSM_FREE;
3592         gsm->task &= ~GSM_TASK_SAVE_RECORD;
3593     }
3594     else if( ( gsm->task&GSM_TASK_RECORD )!=0 && g_M25_M26_specific!=4)
3595     {
3596         switch(gsm->module)
3597         {
3598             case MODULE_M26:
3599             {
3600                 if(g_M25_M26_specific==0)
3601                 {
3602                     at = &struAtCallOut_M26[0];
3603                 }
3604                 else if(g_M25_M26_specific==3)
3605                 {
3606                     at = &struAtCallOut_SIMCom7[0];
3607                 }
3608                 else at = &struAtCallOut_M25[0];
3609                 break;
3610             }
3611             case MODULE_UC15:
3612             {
3613                 at = &struAtCallOut_UC15[0];
3614                 break;
3615             }
3616             case MODULE_EC200S:
3617             {
3618                 at = &struAtCallOut_EC200S[0];
3619                 break;
3620             }
3621             case MODULE_EC25:
3622             {
3623                 at = &struAtCallOut_EC25[0];
3624                 break;
3625             }
3626             default:
3627             {
3628                 at = &struAtCallOut_UC15[0];
3629                 break;
3630             }
3631         }
3632         if(g_M25_M26_specific==2);          /* SIMCom used default setting */
3633         else if(g_M25_M26_specific==3)     /* default setting for A7670 module */
3634         {
3635             at_cmd_list_return( at );      /* configuration mic & loudspeaker option */
3636         }
3637         else at_cmd_list_return( at );      /* configuration mic & loudspeaker option */
3638         gsm_audio_record( gsm->module );    /* audio file record */
3639         gsm->uc15_played = 1;
3640         pgsGsm = PGS_GSM_FREE;
3641         gsm->task &= ~GSM_TASK_RECORD;
3642     }
3643     else if( ( gsm->task&GSM_TASK_PLAY )!=0 && g_M25_M26_specific!=4)
3644     {
3645         gsm->task &= ~GSM_TASK_PLAY;
3646         gsm_file_to_voice_call( gsm->module );  /* audio file to voice call */
3647         gsm->uc15_played = 1;
3648         pgsGsm = PGS_GSM_FREE;
3649     }
3650     #endif
3651     else if( (gsm->status&GSM_STAT_CREG)==0 || (gsm->task&GSM_TASK_CREG )!=0 )
3652     {
3653         gsm->task &= ~GSM_TASK_CREG;
3654         result = check_network_stat();
3655         if(result != SYS_ERR_OK ) /* get the csq and creg status */
3656         {
3657             gsm->reset = 1;
3658         }
3659         else if(gsm->status&GSM_STAT_NO_SIM)
3660         {
3661         Registered_On_Network = UNKNOWN;
3662             pgsGsm = PGS_GSM_GET_ICCID;
3663             if(g_M25_M26_specific==3)
3664             {
3665                 at = &AT_GET_CICCID;
3666             }
3667             else if(g_M25_M26_specific==4)
3668             {
3669                 at =&AT_GET_NCCID;
3670             }
3671             else
3672             {
3673                 at =&AT_GET_ICCID;
3674             }
3675             at_cmd_return(at);
3676             pgsGsm = PGS_GSM_FREE;
3677         }
3678         else if(!(gsm->status & GSM_STAT_IMSI))
3679         {
3680             pgsGsm = PGS_GSM_GET_IMSI;
3681             at = &AT_GET_IMSI;
3682             at_cmd_return(at);
3683             pgsGsm = PGS_GSM_FREE;
3684         }
3685     }
3686     else if( ( gsm->task&GSM_TASK_ENET_ACK ) != 0 )
3687     {
3688         gsm->task &= ~GSM_TASK_ENET_ACK;
3689     }
3690     else if( (gsm->status&GSM_STAT_INIT )==0 && g_M25_M26_specific!=4)
3691     {
3692         if( gsm_at_init( gsm->module ) == SYS_ERR_OK ) 
3693         {
3694             gsm->status |= GSM_STAT_INIT;
3695         }
3696         else gsm->reset = 1;
3697         
3698         if( ( struParaSet.dat.enable&APP_ENABLE_GSM_TIME ) != 0 )
3699         {
3700             if( gsm_set_clock( struParaSet.dat.ntp_domain,gsm->module ) == SYS_ERR_OK )
3701             {
3702                 tmr_clock_test = 3;
3703             }
3704         }
3705     }
3706     #if GPRS_F==0
3707     else if( ( gsm->task&GSM_TASK_HANGUP ) != 0 && g_M25_M26_specific!=4)
3708     {
3709         gsm->task &= ~GSM_TASK_HANGUP;
3710         gsm_hangup();
3711     }
3712     else if((gsm->task&GSM_TASK_CALL_IN) && !TCP_Busy && g_M25_M26_specific!=4)
3713     {
3714         OS_CPU_SR cpu_sr=0;
3715         OS_ENTER_CRITICAL();
3716         gsm->task &= ~GSM_TASK_CALL_IN;
3717         gsm->status &= ~GSM_STAT_DISARM;
3718         pgsGsm = PGS_GSM_AUDIO_ALARM;
3719         OS_EXIT_CRITICAL();
3720         gsm_call_handle( gsm->alarm_target.phone,CALL_MODE_PLAY_PRESS,gsm->module );
3721         pgsGsm = PGS_GSM_FREE;
3722     }
3723     else if( (gsm->task&GSM_TASK_DETECTED_INCALL) != 0 && g_M25_M26_specific!=4)
3724     {
3725         gsm->task &=~ GSM_TASK_DETECTED_INCALL;
3726         usart_send_str( USART3,"AT+CLCC\r" );
3727         gsm->task |= GSM_TASK_INCALL_CHECK;
3728     }
3729     else if( ( gsm->task&GSM_TASK_CMGR ) != 0 && g_M25_M26_specific!=4)
3730     {
3731         gsm->task &= ~GSM_TASK_CMGR;
3732         gsm_read_sms( gsm->sms_index );     /* read SMS */
3733     }
3734     else if( ( gsm->task&GSM_TASK_CMGD ) != 0 && g_M25_M26_specific!=4)
3735     {
3736         gsm->task &= ~GSM_TASK_CMGD;
3737         gsm_delete_sms( gsm->sms_index );   /* Delete SMS */
3738     }
3739     else if(gsm->task&GSM_TASK_SMS_ALARM && g_M25_M26_specific!=4)
3740     {
3741         OS_CPU_SR cpu_sr = 0;
3742         OS_ENTER_CRITICAL();//CPU_CRITICAL_ENTER();               /* SMS Send */
3743         gsm->task &= ~GSM_TASK_SMS_ALARM;
3744         pgsGsm = PGS_GSM_SMS_ALARM;
3745         OS_EXIT_CRITICAL();//CPU_CRITICAL_EXIT();
3746         if( get_visible_num( gsm->alarm_target.phone ) >= 3 )
3747         {
3748             p = mymalloc( 512 );
3749             OSTimeDly( 500);//,OS_OPT_TIME_PERIODIC,&err );
3750             get_hz_alarm_sms( &struParaSet,(char*)gsm->alarm_target.ptr,p );
3751             if( if_event_with_zone( gsm->alarm_target.event ) != 0 )
3752             {
3753                 strcat( p,UNICODE_ZONE[language] );
3754                 #if RAMZONE==1
3755                 sprintf( p+500,"%02u",struRunning.alarming_zone_number[gsm->alarm_target.event] );
3756                 #else
3757                 sprintf( p+500,"%02u",struParaRunning.alarming_zone_number[gsm->alarm_target.event] );
3758                 #endif
3759                 ascii_2_unicode( p+strlen(p),p+500 );
3760             }
3761 //            p[280] = 0;
3762             gsm_send_sms( 1,gsm->alarm_target.phone,p );
3763             myfree( p );
3764         }
3765         pgsGsm = PGS_GSM_FREE;
3766     }
3767 #if PK
3768     else if( (gsm->task & GSM_TASK_TEST_SIGNAL) != 0 )
3769     {
3770         if( pgsGsm == PGS_GSM_FREE
3771         && ( struGsm.task&(GSM_TASK_SMS_ALARM|GSM_TASK_AUDIO_ALARM) ) == 0 
3772         && ( ( struGsm.status&GSM_STAT_TCP_CONNECT ) == 0 || ( struGsm.task&GSM_TASK_ENET_ALARM ) == 0 ) )
3773         {
3774             pgsGsm = PGS_GSM_SMS_ALARM;
3775             if( ( struParaSet.dat.phone[index_phone].mode&PHONE_SMS_ENABLE ) != 0 && get_visible_num( struParaSet.dat.phone[index_phone].phone ) >= 3 )
3776             {
3777                 gsm_send_sms( 0,struParaSet.dat.phone[index_phone].phone,"Test Signal." );
3778             }
3779         }
3780         if(index_phone++ >= PHONE_MAX)
3781         {
3782             TestSignal_24H_Timer_sec = 1;
3783             index_phone=0;
3784             gsm->task &=~ GSM_TASK_TEST_SIGNAL;
3785         }
3786         pgsGsm = PGS_GSM_FREE;
3787     }
3788 #endif
3789     else if( ( gsm->task&GSM_TASK_SMS_ECHO ) != 0 && g_M25_M26_specific!=4)
3790     {
3791         gsm->task &= ~GSM_TASK_SMS_ECHO;    /* SMS ech */
3792         pgsGsm = PGS_GSM_SMS_ECHO;
3793         if( get_visible_num( gsm->target.phone ) >= 3 )
3794         {
3795             switch( gsm->target.content )
3796             {
3797                 case ECHO_CONST_HANZI:
3798                 p = mymalloc( 280+1 );
3799                 get_hz_alarm_sms( &struParaSet,(char*)gsm->target.ptr,p );
3800                 gsm_send_sms( 1,gsm->target.phone,p );
3801                 myfree( p );
3802                 break;
3803                 
3804                 case ECHO_PHONE:
3805                 case ECHO_DELAY:
3806                 case ECHO_ENABLE:
3807                 case ECHO_DETECTOR_LEARNED:
3808                 case ECHO_SYSTEM:
3809                 case ECHO_SYSTEM2:
3810                 p = mymalloc( 192 );
3811                 get_para_echo_sms( (ENUM_CMD_ECHO)gsm->target.content,p );
3812                 gsm_send_sms( 0,gsm->target.phone,p );
3813                 myfree( p );
3814                 break;
3815                 
3816                 default:
3817                 break;
3818             }
3819         }
3820         pgsGsm = PGS_GSM_FREE;
3821     }
3822     else if(gsm->task&GSM_TASK_AGPS)            /* not used */
3823     {
3824         gsm->task &= ~GSM_TASK_AGPS;
3825     }
3826     else if((gsm->task&GSM_TASK_USER_CALL) && !TCP_Busy && g_M25_M26_specific!=4)    /* call  handle */
3827     {
3828         OS_CPU_SR cpu_sr=0;
3829         OS_ENTER_CRITICAL();//CPU_CRITICAL_ENTER();
3830         gsm->task &= ~GSM_TASK_USER_CALL;
3831         gsm->status &= ~GSM_STAT_DISARM;
3832         pgsGsm = PGS_GSM_USER_CALL;
3833         OS_EXIT_CRITICAL();//CPU_CRITICAL_EXIT();
3834         gsm_call_handle( gsm->user_call_phone,CALL_MODE_OUT,gsm->module );    /* call out @mode=0 */
3835         pgsGsm = PGS_GSM_FREE;
3836     }
3837     else if((gsm->task&GSM_TASK_AUDIO_ALARM) && !TCP_Busy && g_M25_M26_specific!=4)    /* audio alarm */
3838     {
3839         OS_CPU_SR cpu_sr=0;
3840         OS_ENTER_CRITICAL();//CPU_CRITICAL_ENTER();
3841         gsm->task &= ~GSM_TASK_AUDIO_ALARM;
3842         gsm->status &= ~GSM_STAT_DISARM;
3843         pgsGsm = PGS_GSM_AUDIO_ALARM;
3844         OS_EXIT_CRITICAL();//CPU_CRITICAL_EXIT();
3845         if( gsm_call_handle( gsm->alarm_target.phone,CALL_MODE_OUT|CALL_MODE_PLAY_PRESS,gsm->module ) == SYS_ERR_CONNECTED )
3846         {
3847             OSTimeDly( 5000);//,OS_OPT_TIME_PERIODIC,&err );    /* delay 5s to avoid call in time */
3848         }
3849         pgsGsm = PGS_GSM_FREE;
3850     }
3851     #endif
3852     else if( ( gsm->status&GSM_STAT_IP_OK ) != 0 )
3853     {
3854         if(( gsm->status&GSM_STAT_TCP_CONFIG ) == 0)              // APN CONFIGURATION
3855         {
3856             if( gsm_set_tcp_config(gsm->module ) == SYS_ERR_OK)
3857             {
3858                 gsm->status |= GSM_STAT_TCP_CONFIG;                 //next step logon the server
3859                 gsm->status &= ~GSM_STAT_TCP_CONNECT;
3860             }
3861             else gsm->reset = 1;
3862         }
3863         else if(( gsm->status&GSM_STAT_TCP_CONNECT ) == 0)        // LOGON TCP SERVER
3864         {
3865             TyReadTypeDef.RegistedU8Status=1;
3866             if(gsm_set_tcp_connect( TCP_INDEX_ENET,TCP_MODE_TCP,&struParaSet.dat.gprs_ip,gsm->module ) == SYS_ERR_OK)
3867             {
3868 //                NoAckResponse_Count = 0;
3869                 ctr_tcp_connect = 0;
3870                 My_TcpTx = TCP_IDLE;
3871                 if(Registered_On_Network != LOGIN_OK){
3872                     gflag.fReport1Status |= (fRegistedU8StatusRes|fProvisioningCmdStatus);
3873                 }
3874                 TyReadTypeDef.RegistedU8Status = 2;
3875                 gsm->task |= GSM_TASK_ENET_PULSE;
3876                 gsm->status |= GSM_STAT_TCP_CONNECT;
3877             }
3878             else
3879             {
3880                 if( ++ctr_tcp_connect >= 20 )
3881                 {
3882                     gsm->reset = 1;
3883                 }
3884                 else
3885                 {
3886                     gsm_close_connect( TCP_INDEX_ENET,gsm->module );
3887                     gsm->status &= ~GSM_STAT_TCP_CONNECT;
3888                 }
3889             }
3890             if(m_b_variable){
3891                 m_b_variable = false;
3892             }
3893         }
3894         else                                                    // TCP SERVICE ONLINE
3895         {
3896             switch(My_TcpTx)
3897             {
3898                 case TCP_IDLE:
3899                 {
3900 #if AEP_F_==1
3901                     if(Registered_On_Network != LOGIN_OK)
3902                     {
3903                         EnLength = 0;
3904                         m_b_variable = true;
3905                         AEP_ProvisioningReq();
3906                         printf("provistion request:%d\n",EnLength);
3907                         My_TcpTx = TCP_UPLINK_PACKAGE;
3908                         break;
3909                     }else
3910 #endif
3911                      if(g_CurrentTransmit_buf[SENDING_CFG]||g_CurrentTransmit_buf[SENDING_STATUS])
3912                     {
3913                         g_CurrentTransmit_buf[RESPONSE_STATUS] = 0;
3914                         g_CurrentTransmit_buf[RESPONSE_CFG]       = 0;
3915                         My_TcpTx = TCP_MESSAGE_PAYLOAD;
3916                     }
3917                     else if(fProvisioningCmdStatus & gflag.fReport1Status)
3918                     {
3919                         g_CurrentTransmit_buf[SENDING_STATUS] = fProvisioningCmdStatus;
3920                         gflag.fReport1Status &=~ fProvisioningCmdStatus;
3921                     }
3922                     /*else if(fImeiNumberArrayStatusRes & gflag.fReport1Status)
3923                     {
3924                         g_CurrentTransmit_buf[SENDING_STATUS] = fImeiNumberArrayStatusRes;
3925                         gflag.fReport1Status &=~ fImeiNumberArrayStatusRes;
3926                     }*/
3927                     else if(gflag.fReport1Status || gflag.fReportCfg)
3928                     {
3929                         g_CurrentTransmit_buf[SENDING_STATUS] = gflag.fReport1Status;
3930                         g_CurrentTransmit_buf[SENDING_CFG]    = gflag.fReportCfg;
3931                         gflag.fReport1Status = 0;
3932                         gflag.fReportCfg = 0;
3933                     }
3934                     else if(struParaSet.dat.delete_all_sub_response&3)
3935                     {
3936                         if(struParaSet.dat.delete_all_sub_response&1)
3937                         {
3938                             TyReadTypeDef.DeleteSpecificRemotesU16 = 0xffff;
3939                             gflag.fReportCfg |= fDeleteSpecificRemotesU16CfgRes;
3940                         }
3941                         if(struParaSet.dat.delete_all_sub_response&2)
3942                         {
3943                             TyReadTypeDef.DeleteSpecificDetectorsU16 = 0xffff;
3944                             gflag.fReportCfg |= fDeleteSpecificDetectorsU16CfgRes;
3945                         }
3946                     }
3947                     #if AEP_F_==1
3948                     else if(f1HeartBeatSend & gflag.flag1)
3949                     {
3950 //                        printf("NoAckResponse_Count=%d\n",NoAckResponse_Count);
3951 //                        NoAckResponse_Count++;
3952                         EnLength = 0;
3953                         m_b_variable = true;
3954                         AEP_HeartBeat();
3955                         My_TcpTx = TCP_UPLINK_PACKAGE;
3956                         gflag.flag1 &=~ f1HeartBeatSend;
3957                     }
3958                     #else
3959                     else if(keepalive_ticks++ >= struParaSet.dat.KeepaliveIntervalTimeU16*100)
3960                     {
3961                         gflag.fReport1Status |= (fAckRequestCmdStatus|fNetworkRssiU8StatusRes);
3962                         keepalive_ticks = 0;
3963                     }
3964                     #endif
3965                     break;
3966                 }
3967                 case TCP_MESSAGE_PAYLOAD:
3968                 {
3969                     EnLength = 0;
3970 #if     CMD_F_== 1
3971                         //========================== commands ======================
3972                         //------------------- provisioning -------------
3973                         if(fProvisioningCmdStatus &g_CurrentTransmit_buf[SENDING_STATUS])
3974                         {
3975                             Provisioning_Request();
3976                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fProvisioningCmdStatus;
3977                         }
3978                         //------------------- ack ----------------------
3979                         if(fAckResponseCmdStatus & g_CurrentTransmit_buf[SENDING_STATUS])        //response
3980                         {
3981                             Send_SingleID_Packet(AckResponseID);
3982                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fAckResponseCmdStatus;
3983                         }
3984                         if(fAckRequestCmdStatus & g_CurrentTransmit_buf[SENDING_STATUS])        //request
3985                         {
3986 //                            printf("NoAckResponse_Count=%d\n",NoAckResponse_Count);
3987 //                            NoAckResponse_Count++;
3988                             Send_SingleID_Packet(AckRequestID);
3989                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fAckRequestCmdStatus;
3990                         }
3991                         //---------------- sequence number -------------
3992                         if(fAckSeqResponseCmdStatus & g_CurrentTransmit_buf[SENDING_STATUS])    //response
3993                         {
3994                             SendSequenceNumberResponse(sequence_number_res.Value);
3995                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fAckSeqResponseCmdStatus;
3996                         }
3997                         if(fAckSeqRequestCmdStatus & g_CurrentTransmit_buf[SENDING_STATUS])        //request
3998                         {
3999                             SendSequenceNumberRequest(sequence_number_req.Value);
4000                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fAckSeqRequestCmdStatus;
4001                         }
4002 #endif
4003 #if     CFG_F_== 1
4004                         //================== configuration response =====================
4005                         if(fDeviceServerIpAddressArrayCfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4006                         {
4007                             g16_package_length = strlen((const char*)struParaSet.dat.gprs_ip.address);
4008                             Read_ConfigCharArrayValue_Responses(DeviceServerIpAddressArrayCfgID, (uint8_t*)struParaSet.dat.gprs_ip.address);
4009                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fDeviceServerIpAddressArrayCfgRes;
4010                         }
4011                         if(fAlarmPhoneNumbersArrayCfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4012                         {
4013                             p = mymalloc(64);
4014                             if(TyReadTypeDef.AlarmPhoneNumbersArray!=0)   //report specific phone
4015                             {
4016                                 if(struParaSet.dat.phone[TyReadTypeDef.AlarmPhoneNumbersArray-1].phone[0]!=0)    //the phone numbers are valid
4017                                 {
4018                                     k = strlen((const char*)struParaSet.dat.phone[TyReadTypeDef.AlarmPhoneNumbersArray-1].phone);
4019                                     if(k < PHONE_LEN)
4020                                     {
4021                                         p[0]=TyReadTypeDef.AlarmPhoneNumbersArray;                         //number of phone
4022                                         g16_package_length = k+1;
4023                                         strcpy((char*)(p+1), struParaSet.dat.phone[TyReadTypeDef.AlarmPhoneNumbersArray-1].phone);    //phone number
4024                                         Read_ConfigCharArrayValue_Responses(DeviceServerIpAddressArrayCfgID,(uint8_t*)p);
4025                                     }
4026                                 }
4027                                 TyReadTypeDef.AlarmPhoneNumbersArray = 0;
4028                             }
4029                             else                                                    //report all phone
4030                             {
4031                                 for(j=0;j<PHONE_MAX;j++)
4032                                 {
4033                                     if(struParaSet.dat.phone[j].phone[0]!=0)
4034                                     {
4035                                         k = strlen((const char*)struParaSet.dat.phone[j].phone);
4036                                         if(k < PHONE_LEN)
4037                                         {
4038                                             p[0]=j+1;                                        //number of phone
4039                                             g16_package_length = k+1;
4040                                             strcpy((char*)(p+1), struParaSet.dat.phone[j].phone);    //phone number
4041                                             Read_ConfigCharArrayValue_Responses(DeviceServerIpAddressArrayCfgID,(uint8_t*) p);
4042                                         }
4043                                     }
4044                                 }
4045                             }
4046                             myfree(p);
4047                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fAlarmPhoneNumbersArrayCfgRes;
4048                         }
4049                         if(fAlarmMessageArrayCfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4050                         {
4051                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fAlarmMessageArrayCfgRes;
4052                         }
4053                         if(fLoginResponseU8CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4054                         {
4055                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fLoginResponseU8CfgRes;
4056                         }
4057                         if(fMarsterModeU8CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4058                         {
4059                             if(f1Muffing_APP&gflag.flag1)
4060                             {
4061                                 k=0;
4062                                 gflag.flag1 &=~ f1Muffing_APP;
4063                             }
4064                             else if(struParaRunning.remote1==APP_RMT_ARM)
4065                             {
4066                                 k=1;
4067                             }
4068                             else if(struParaRunning.remote1==APP_RMT_DISARM)
4069                             {
4070                                 k=0;
4071                             }
4072                             else
4073                             {
4074                                 k=struParaRunning.remote1;
4075                             }
4076                             Read_ConfigValueU8_Responses(MarsterModeU8CfgID,k);
4077                             
4078                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fMarsterModeU8CfgRes;
4079                         }
4080                         if(fArmDisarmSoundSwitchU8CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4081                         {
4082                             k = (struParaSet.dat.enable&APP_ENABLE_ARM_VOICE)?1:0;
4083                             Read_ConfigValueU8_Responses(ArmDisarmSoundSwitchU8CfgID,k);
4084                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fArmDisarmSoundSwitchU8CfgRes;
4085                         }
4086                         if(fVoiceSoundSwitchU8CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4087                         {
4088                             k = (struParaSet.dat.enable&APP_ENABLE_HUMAN_VOICE)?1:0;
4089                             Read_ConfigValueU8_Responses(VoiceSoundSwitchU8CfgID,k);
4090                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fVoiceSoundSwitchU8CfgRes;
4091                         }
4092                         if(fAlarmSoundSwitchU8CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4093                         {
4094                             k = (struParaSet.dat.enable&APP_ENABLE_ALARM_VOICE)?1:0;
4095                             Read_ConfigValueU8_Responses(AlarmSoundSwitchU8CfgID,k);
4096                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fAlarmSoundSwitchU8CfgRes;
4097                         }
4098                         if(fAlarmPropelSwitchU8CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4099                         {
4100                             k = (struParaSet.dat.enable&APP_ENABLE_ARM_SMS)?1:0;
4101                             Read_ConfigValueU8_Responses(AlarmPropelSwitchU8CfgID,k);
4102                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fAlarmPropelSwitchU8CfgRes;
4103                         }
4104                         if(fDeviceStateU8CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4105                         {
4106                             k = struParaSet.dat.master_state;
4107                             Read_ConfigValueU8_Responses(DeviceStateU8CfgID,k);
4108                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fDeviceStateU8CfgRes;
4109                         }
4110                         if(fAddSubAdminModeU8CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4111                         {
4112                             k = 0;
4113                             j = struLearn.duration;
4114                             if(j!=0)
4115                             {
4116                                 if(struLearn.setting.classification == EVENT_RMT)
4117                                 {
4118                                     k=1;
4119                                 }
4120                                 else if(struLearn.setting.classification == EVENT_RFID)
4121                                 {
4122                                     k=3;
4123                                 }
4124                                 else
4125                                 {
4126                                     k=2;
4127                                 }
4128                             }
4129                             Read_ConfigValueU8_Responses(AddSubAdminModeU8CfgID,k);
4130                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fAddSubAdminModeU8CfgRes;
4131                         }
4132                         if(fVoiceVolumeU8CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4133                         {
4134                             Read_ConfigValueU8_Responses(AlarmSoundSwitchU8CfgID,struParaSet.dat.VoiceVolumeU8);
4135                             //Read_ConfigValueU8_Responses(AlarmSoundSwitchU8CfgID,15);
4136                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fVoiceVolumeU8CfgRes;
4137                         }
4138                         if(fDoorbellVolumeU8CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4139                         {
4140                             Read_ConfigValueU8_Responses(DoorbellVolumeU8CfgID,struParaSet.dat.DoorbellVolumeU8);
4141                             //Read_ConfigValueU8_Responses(DoorbellVolumeU8CfgID,15);
4142                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fDoorbellVolumeU8CfgRes;
4143                         }
4144                         if(fAlarmVolumeU8CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4145                         {
4146                             Read_ConfigValueU8_Responses(AlarmVolumeU8CfgID,struParaSet.dat.AlarmVolumeU8);
4147                             //Read_ConfigValueU8_Responses(AlarmVolumeU8CfgID,15);
4148                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fAlarmVolumeU8CfgRes;
4149                         }
4150                         if(fKeypadLockSwitchU8CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4151                         {
4152                             k = (struParaSet.dat.enable&APP_ENABLE_KEYPAD_LOCK)?1:0;
4153                             Read_ConfigValueU8_Responses(KeypadLockSwitchU8CfgID,k);
4154                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fKeypadLockSwitchU8CfgRes;
4155                         }
4156                         if(fKeypadToneSwitchU8CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4157                         {
4158                             k = (struParaSet.dat.enable&APP_ENABLE_KEYPAD_TONE)?1:0;
4159                             Read_ConfigValueU8_Responses(KeypadToneSwitchU8CfgID,k);
4160                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fKeypadToneSwitchU8CfgRes;
4161                         }
4162                         if(fWinDoorOpenAlertSwitchU8CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4163                         {
4164                             k = (struParaSet.dat.enable&APP_ENABLE_DOOR_OPEN)?1:0;
4165                             Read_ConfigValueU8_Responses(WinDoorOpenAlertSwitchU8CfgID,k);
4166                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fWinDoorOpenAlertSwitchU8CfgRes;
4167                         }
4168                         if(fKeypadBacklightSwitchU8CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4169                         {
4170                             k = struParaSet.dat.enable&APP_ENABLE_KEYPAD_BL?1:0;
4171                             Read_ConfigValueU8_Responses(KeypadBacklightSwitchU8CfgID,k);
4172                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fKeypadBacklightSwitchU8CfgRes;
4173                         }
4174                         if(fMarsterLanguageU8CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4175                         {
4176                             k = struParaSet.dat.language;
4177                             Read_ConfigValueU8_Responses(MarsterLanguageU8CfgID,k);
4178                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fMarsterLanguageU8CfgRes;
4179                         }
4180                         if(fDeviceServerIpPortU16CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4181                         {
4182                             k = struParaSet.dat.gprs_ip.port;
4183                             Read_ConfigValueU16_Responses(DeviceServerIpPortU16CfgID,k);
4184                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fDeviceServerIpPortU16CfgRes;
4185                         }
4186                         if(fArmedDelayTimeU16CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4187                         {
4188                             k = struParaSet.dat.delay_exit;
4189                             Read_ConfigValueU16_Responses(ArmedDelayTimeU16CfgID,k);
4190                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fArmedDelayTimeU16CfgRes;
4191                         }
4192                         if(fAlarmedDelayTimeU16CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4193                         {
4194                             k = struParaSet.dat.delay_entry;
4195                             Read_ConfigValueU16_Responses(AlarmedDelayTimeU16CfgID,k);
4196                             g_CurrentTransmit_buf[RESPONSE_CFG] |=fAlarmedDelayTimeU16CfgRes;
4197                         }
4198                         if(fAlarmTimeoutU16CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4199                         {
4200                             k = struParaSet.dat.delay_horn;
4201                             Read_ConfigValueU16_Responses(AlarmTimeoutU16CfgID,k);
4202                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fAlarmTimeoutU16CfgRes;
4203                         }
4204                         if(fKeepaliveIntervalTimeU16CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4205                         {
4206                             k = struParaSet.dat.KeepaliveIntervalTimeU16;
4207                             Read_ConfigValueU16_Responses(KeepaliveIntervalTimeU16CfgID,k);
4208                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fKeepaliveIntervalTimeU16CfgRes;
4209                         }
4210                         if(fDeleteSpecificRemotesU16CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4211                         {
4212                             Read_ConfigValueU16_Responses(DeleteSpecificRemotesU16CfgID,TyReadTypeDef.DeleteSpecificRemotesU16);    //0=none delete,0xffff=delete all of remotes
4213                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fDeleteSpecificRemotesU16CfgRes;
4214                         }
4215                         if(fDeleteSpecificDetectorsU16CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4216                         {
4217                             Read_ConfigValueU16_Responses(DeleteSpecificDetectorsU16CfgID,TyReadTypeDef.DeleteSpecificDetectorsU16);//=noe delete,0xffff=delete all of detctors
4218                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fDeleteSpecificDetectorsU16CfgRes;
4219                         }
4220                         if(fSystemPasswordsU32CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4221                         {
4222                             k = struParaSet.dat.engineer_pwd;
4223                             m32.long_value = 0;
4224                             //1234%1000=
4225                             m32.value[3] = struParaSet.dat.engineer_pwd%10000/1000 +'0';     //thousand
4226                             m32.value[2] = struParaSet.dat.engineer_pwd%1000/100 +'0';     //hundred
4227                             m32.value[1] = struParaSet.dat.engineer_pwd%100/10 +'0';     //ten
4228                             m32.value[0] = struParaSet.dat.engineer_pwd%10 +'0';     //one
4229                             
4230                             Read_ConfigValueU32_Responses(SystemPasswordsU32CfgID,m32.long_value);
4231                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fSystemPasswordsU32CfgRes;
4232                         }
4233                         if(fUserPasswordsU32CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4234                         {
4235                             k = struParaSet.dat.user_pwd;
4236                             m32.long_value = 0;
4237                             m32.value[3] = struParaSet.dat.user_pwd%10000/1000 +'0';     //thousand
4238                             m32.value[2] = struParaSet.dat.user_pwd%1000/100 +'0';     //hundred
4239                             m32.value[1] = struParaSet.dat.user_pwd%100/10 +'0';     //ten
4240                             m32.value[0] = struParaSet.dat.user_pwd%10 +'0';    //one
4241                             
4242                             Read_ConfigValueU32_Responses(UserPasswordsU32CfgID,m32.long_value);
4243                             g_CurrentTransmit_buf[RESPONSE_CFG] |=  fUserPasswordsU32CfgRes;
4244                         }
4245                         if(fHijackPasswordsU32CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4246                         {
4247                             k = struParaSet.dat.HijackPasswordsU16;
4248                             m32.long_value = 0;
4249                             m32.value[3] = struParaSet.dat.HijackPasswordsU16%10000/1000 +'0';     //thousand
4250                             m32.value[2] = struParaSet.dat.HijackPasswordsU16%1000/100 +'0';     //hundred
4251                             m32.value[1] = struParaSet.dat.HijackPasswordsU16%100/10 +'0';     //ten
4252                             m32.value[0] = struParaSet.dat.HijackPasswordsU16%10 +'0';    //one
4253                             Read_ConfigValueU32_Responses(HijackPasswordsU32CfgID,m32.long_value);
4254                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fHijackPasswordsU32CfgRes;
4255                         }
4256                         if(fDetectorConfigurationU32CfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4257                         {
4258                             j=TyReadTypeDef.DetectorConfigurationU32>>16;
4259                             i = 0;
4260                             Read_ConfigValueU32_Responses(DetectorConfigurationU32CfgID,TyReadTypeDef.DetectorConfigurationU32);
4261                             
4262                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fDetectorConfigurationU32CfgRes;
4263                         }
4264 #endif
4265 #if     STS_F_== 1
4266                         //========================== status =============================
4267                         if(fDeviceUidArrayStatusRes & g_CurrentTransmit_buf[SENDING_STATUS])
4268                         {
4269                             p=mymalloc(8);
4270                             m32.long_value=struParaSet.dat.id;        //get id
4271                             for(i=0;i<6;i++)            //id to string
4272                             {
4273                                 j = m32.long_value&0xf;
4274                                 m32.long_value>>=4;
4275                                 if(j<=9)
4276                                     p[i] = j+'0';
4277                                 else
4278                                     p[i]= j+55;
4279                             }
4280                             g16_package_length = i;
4281                             Read_StatusCharArrayValue_Responses(DeviceUidArrayStatusID,(uint8_t*)p);
4282                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fDeviceUidArrayStatusRes;
4283                             myfree(p);
4284                         }
4285                         if(fImeiNumberArrayStatusRes & g_CurrentTransmit_buf[SENDING_STATUS])
4286                         {
4287                             g16_package_length = strlen((const char *)struGsm.imei);// GsmData.cTelitIMEI);
4288                             Read_StatusCharArrayValue_Responses(ImeiNumberArrayStatusID,(uint8_t*)struGsm.imei);// GsmData.cTelitIMEI);
4289                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fImeiNumberArrayStatusRes;
4290                         }
4291                         if(fSimIccidNumberArrayStatusRes & g_CurrentTransmit_buf[SENDING_STATUS])
4292                         {
4293                             g16_package_length = strlen((const char *)struGsm.iccid);// GsmData.cSimICCID);
4294                             Read_StatusCharArrayValue_Responses(SimIccidNumberArrayStatusID,(uint8_t*)struGsm.iccid);// GsmData.cSimICCID);
4295                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fSimIccidNumberArrayStatusRes;
4296                         }
4297                         if(fZoneAlertContextArrayStatusRes & g_CurrentTransmit_buf[SENDING_STATUS])
4298                         {
4299                             k = TyReadTypeDef.ZoneAlertContextArrayStatus.zoneNumber;
4300                             j = get_zone_address_from_zoneNo(k,0);
4301                             
4302                             if(j != 0)          //zone address is valid
4303                             {
4304                                 p=mymalloc(16);
4305                                 i=0;
4306                                 p[i++]= k>>8;    //zone number high bye
4307                                 p[i++]= k;        //zone number low byte
4308                                 
4309                                 p[i++]= 0;      //zone ID highest byte
4310                                 p[i++]= my_detector.dat.detector[j-1].addr[2];
4311                                 p[i++]= my_detector.dat.detector[j-1].addr[1];
4312                                 p[i++]= my_detector.dat.detector[j-1].addr[0];  //zone ID lowest byte
4313                                 p[i++] = my_detector.dat.detector[j-1].setting.classification;
4314                                 g16_package_length = i;
4315                                 Read_StatusCharArrayValue_Responses(ZoneAlertContextArrayStatusID, (u8*)p);
4316                             }
4317                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fZoneAlertContextArrayStatusRes;
4318                         }
4319                         if(fWinDoorOpenAlertArrayStatusRes & g_CurrentTransmit_buf[SENDING_STATUS])
4320                         {
4321                             k = TyReadTypeDef.WinDoorOpenAlertArrayStatus.zoneNumber;
4322                             j=get_zone_address_from_zoneNo(k,0);
4323                             
4324                             if(j != 0)          //zone address is valid
4325                             {
4326                                 p=mymalloc(16);
4327                                 i=0;
4328                                 p[i++]= k>>8;    //zone number high bye
4329                                 p[i++]= k;        //zone number low byte
4330                                 p[i++]= 0;//my_detector.dat.detector[j-1].setting.classification;
4331                                 p[i++]= my_detector.dat.detector[j-1].addr[2];
4332                                 p[i++]= my_detector.dat.detector[j-1].addr[1];
4333                                 p[i++]= my_detector.dat.detector[j-1].addr[0];  //zone ID lowest byte
4334                                 p[i++]=TyReadTypeDef.WinDoorOpenAlertArrayStatus.status;
4335                                 g16_package_length = i;
4336                                 Read_StatusCharArrayValue_Responses(ZoneAlertContextArrayStatusID, (u8*)p);
4337                             }
4338                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fWinDoorOpenAlertArrayStatusRes;
4339                         }
4340                         if(fRegistedU8StatusRes & g_CurrentTransmit_buf[SENDING_STATUS])
4341                         {
4342                             Read_StatusU8Value_Responses(RegistedU8StatusID, TyReadTypeDef.RegistedU8Status);
4343                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fRegistedU8StatusRes;
4344                         }
4345                         if(fMainPowerSupplyU8StatusRes & g_CurrentTransmit_buf[SENDING_STATUS])
4346                         {
4347                             Read_StatusU8Value_Responses(MainPowerSupplyU8StatusID, TyReadTypeDef.MainPowerSupplyU8Status);
4348                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fMainPowerSupplyU8StatusRes;
4349                         }
4350                         if(fBatterySupplyU8StatusRes & g_CurrentTransmit_buf[SENDING_STATUS])
4351                         {
4352                             Read_StatusU8Value_Responses(BatterySupplyU8StatusID, TyReadTypeDef.BatterySupplyU8Status);
4353                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fBatterySupplyU8StatusRes;
4354                         }
4355                         if(fHardwareVersionU8StatusRes & g_CurrentTransmit_buf[SENDING_STATUS])
4356                         {
4357                             Read_StatusU8Value_Responses(HardwareVersionU8StatusID, HARDWARE_VER);
4358                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fHardwareVersionU8StatusRes;
4359                         }
4360                         if(fSoftwareVersionU8StatusRes & g_CurrentTransmit_buf[SENDING_STATUS])
4361                         {
4362                             Read_StatusU8Value_Responses(SoftwareVersionU8StatusID, SOFTWARE_VER);
4363                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fSoftwareVersionU8StatusRes;
4364                         }
4365                         if(fNetworkRssiU8StatusRes & g_CurrentTransmit_buf[SENDING_STATUS])
4366                         {
4367                             Read_StatusU8Value_Responses(NetworkRssiU8StatusID,TyReadTypeDef.NetworkRssiU8Status);
4368                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fNetworkRssiU8StatusRes;
4369                         }
4370                         /*if(fAlertEventU8StatusRes & g_CurrentTransmit_buf[SENDING_STATUS])
4371                         {
4372                             Read_StatusU8Value_Responses(AlertEventU8StatusID, TyReadTypeDef.AlertEventU8Status);
4373                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fAlertEventU8StatusRes;
4374                         }*/
4375                         if(fBatteryVoltageU16StatusRes & g_CurrentTransmit_buf[SENDING_STATUS])
4376                         {
4377                             Read_StatusU16Value_Responses(BatteryVoltageU16StatusID, TyReadTypeDef.BatteryVoltageU16Status);
4378                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fBatteryVoltageU16StatusRes;
4379                         }
4380                         if(fLocationTimestampU32StatusRes & g_CurrentTransmit_buf[SENDING_STATUS])
4381                         {
4382                             extern struct tm calendar;
4383                             TyReadTypeDef.LocationTimestampU32Status.Bit.year = calendar.tm_year-2000;
4384                             TyReadTypeDef.LocationTimestampU32Status.Bit.month = calendar.tm_mon+1;
4385                             TyReadTypeDef.LocationTimestampU32Status.Bit.day = calendar.tm_mday;
4386                             TyReadTypeDef.LocationTimestampU32Status.Bit.hour = calendar.tm_hour;
4387                             TyReadTypeDef.LocationTimestampU32Status.Bit.minute = calendar.tm_min;
4388                             TyReadTypeDef.LocationTimestampU32Status.Bit.second = calendar.tm_sec;
4389                             printf("time=0x%08x\n",TyReadTypeDef.LocationTimestampU32Status.value);
4390                             Read_StatusU32Value_Responses(LocationTimestampU32StatusID, TyReadTypeDef.LocationTimestampU32Status.value);
4391                             g_CurrentTransmit_buf[RESPONSE_STATUS] |= fLocationTimestampU32StatusRes;
4392                         }
4393 #endif
4394 #if     IDN_F_== 1
4395                         //================== below must be payload independently ----------------------
4396                         if(fTimerAttributyArrayCfgRes & g_CurrentTransmit_buf[SENDING_CFG])
4397                         {
4398                             if(TyReadTypeDef.TimerReportNumber!=0)  //report specific timer
4399                             {
4400                                 Timer_index = TyReadTypeDef.TimerReportNumber-1;
4401                             }
4402                             if(Timer_index==0)
4403                             {
4404                                 gflag.flag1 &=~ f1TimerExist;
4405                             }
4406                             p = mymalloc(8);
4407                             for( ;Timer_index < TIMER_NUM;Timer_index++)
4408                             {
4409                                 k = struParaSet.dat.TIMR[Timer_index].workOption;
4410                                 
4411                                 if((k >=T_DISARM || k <=T_SOS)  && struParaSet.dat.TIMR[Timer_index].hour<24 && struParaSet.dat.TIMR[Timer_index].minute<60)
4412                                 {
4413                                     if(!(f1TimerExist & gflag.flag1))
4414                                     {
4415                                         gflag.flag1 |= f1TimerExist;
4416                                     }
4417                                     p[0] = Timer_index+1;                            //timer number 1-254
4418                                     p[1] = struParaSet.dat.TIMR[Timer_index].wday;  //working day
4419                                     p[2] = struParaSet.dat.TIMR[Timer_index].hour;
4420                                     p[3] = struParaSet.dat.TIMR[Timer_index].minute;
4421                                     p[4] = struParaSet.dat.TIMR[Timer_index].workOption;
4422                                     g16_package_length = 5;
4423                                     Read_ConfigCharArrayValue_Responses(TimerAttributyArrayCfgID,(u8*)p);
4424                                     if(EnLength >= 200)
4425                                     {
4426                                         break;
4427                                     }
4428                                 }
4429                                 if(TyReadTypeDef.TimerReportNumber != 0)
4430                                 {
4431                                     Timer_index = TIMER_NUM;
4432                                     break;
4433                                 }
4434                             }
4435                             if(Timer_index >= TIMER_NUM)
4436                             {
4437                                 if(!(f1TimerExist & gflag.flag1))                       //no timer
4438                                 {
4439                                     p[0] = 0;
4440                                     g16_package_length = 1;
4441                                     Read_ConfigCharArrayValue_Responses(TimerAttributyArrayCfgID,(u8*)p);
4442                                 }
4443                                 g_CurrentTransmit_buf[RESPONSE_CFG] |= fTimerAttributyArrayCfgRes;
4444                                 Timer_index = 0;
4445                             }
4446                             myfree(p);
4447                         }
4448                         if((fZoneRenamArrayCfgRes&g_CurrentTransmit_buf[SENDING_CFG]) && !EnLength)
4449                         {
4450                             p= mymalloc(128);
4451                             i=0;
4452                             if(TyReadTypeDef.zoneRenameCfg.zone_num!=0)
4453                             {
4454                                 k=TyReadTypeDef.zoneRenameCfg.zone_num;
4455                                 p[i++]=(k<<8);
4456                                 p[i++]=k;
4457                                 k=TyReadTypeDef.zoneRenameCfg.name_len;
4458                                 if(k>=60)
4459                                 {
4460                                     k=0;
4461                                 }
4462                                 p[i++]=k;
4463                                 for(j=0;j<k;j++)
4464                                 {
4465                                     p[i++]=TyReadTypeDef.zoneRenameCfg.zone_name[j];
4466                                 }
4467                                 k=TyReadTypeDef.zoneRenameCfg.stall_len;
4468                                 if(k>=60)
4469                                 {
4470                                     k=0;
4471                                 }
4472                                 p[i++]=k;
4473                                 for(j=0;j<k;j++)
4474                                 {
4475                                     p[i++]=TyReadTypeDef.zoneRenameCfg.stall_name[j];
4476                                 }
4477                             }
4478                             else
4479                             {
4480                                 p[i++]=0;
4481                                 p[i++]=0;
4482                                 p[i++]=0;
4483                                 p[i++]=0;
4484                             }
4485                             g16_package_length = i;
4486                             Read_ConfigCharArrayValue_Responses(ZoneInformationRenameID,(u8*)p);
4487                             g_CurrentTransmit_buf[RESPONSE_CFG] |= fZoneRenamArrayCfgRes;
4488                         }
4489                         if((fNewRemoteAddedArrayStatus & g_CurrentTransmit_buf[SENDING_STATUS])&&(EnLength==0))
4490                         {
4491                             p= mymalloc(250);
4492                             if(TyReadTypeDef.NewRemoteNumber != 0)  //report specific remote ?
4493                             {
4494                                 k = get_zone_address_from_zoneNo(TyReadTypeDef.NewRemoteNumber,1);
4495                                 if(k==0)     //the remote not exist
4496                                 {
4497                                     p[0] = 0;
4498                                     p[1] = 0;
4499                                     g16_package_length = 2;
4500                                 }
4501                                 else
4502                                 {
4503                                     i=0;
4504                                     //No.
4505                                     p[i++]=(u8)TyReadTypeDef.NewRemoteNumber>>8; //remote number
4506                                     p[i++]=(u8)TyReadTypeDef.NewRemoteNumber;
4507                                     //ID
4508                                     p[i++]=0;
4509                                     p[i++]=my_detector.dat.detector[k-1].addr[2];
4510                                     p[i++]=my_detector.dat.detector[k-1].addr[1];
4511                                     p[i++]=my_detector.dat.detector[k-1].addr[0];
4512                                     g16_package_length = i;
4513                                 }
4514                                 Read_StatusCharArrayValue_Responses(NewRemoteAddedArrayStatusID,(u8*)p);
4515                                 g_CurrentTransmit_buf[RESPONSE_STATUS] |= fNewRemoteAddedArrayStatus;
4516                             }
4517                             else                                    //Report all remotes
4518                             {
4519                                 if(Remote_index==0) //start with no device
4520                                 {
4521                                     gflag.flag1&=~f1RemoteExist;
4522                                 }
4523                                 i=0;                //number of bytes
4524                                 for(;Remote_index <DETECTOR_MAX;Remote_index++)
4525                                 {
4526                                     if(my_detector.dat.detector[Remote_index].null==0xaa)
4527                                     {
4528                                         if(my_detector.dat.detector[Remote_index].setting.classification==EVENT_RMT)
4529                                         {
4530                                             if(i >= 200)        //each time should be less than 200 bytes.
4531                                             {
4532                                                 Remote_index--; //byters overflow, report it next time.
4533                                                 break;
4534                                             }
4535                                             //No.
4536                                             p[i++]=(u8)my_detector.dat.detector[Remote_index].setting.number>>8;
4537                                             p[i++]=(u8)my_detector.dat.detector[Remote_index].setting.number;
4538                                             //ID
4539                                             p[i++]=0;
4540                                             p[i++]=my_detector.dat.detector[Remote_index].addr[2];
4541                                             p[i++]=my_detector.dat.detector[Remote_index].addr[1];
4542                                             p[i++]=my_detector.dat.detector[Remote_index].addr[0];
4543                                         }
4544                                     }
4545                                 }
4546                                 if(i!=0)            //number of bytes
4547                                 {
4548                                     gflag.flag1|=f1RemoteExist;
4549                                     g16_package_length = i;
4550                                     Read_StatusCharArrayValue_Responses(NewRemoteAddedArrayStatusID,(u8*)p);
4551                                 }
4552                                 else if(!(gflag.flag1&f1RemoteExist))
4553                                 {
4554                                     p[0] = 0;
4555                                     p[1] = 0;
4556                                     g16_package_length = 2;
4557                                     Read_StatusCharArrayValue_Responses(NewRemoteAddedArrayStatusID,(u8*)p);
4558                                 }
4559                                 if(Remote_index>=DETECTOR_MAX)
4560                                 {
4561                                     g_CurrentTransmit_buf[RESPONSE_STATUS] |= fNewRemoteAddedArrayStatus;
4562                                     Remote_index = 0;
4563                                 }
4564                             }
4565                             myfree(p);
4566                         }
4567                         if((fNewDetectorAddedArrayStatus & g_CurrentTransmit_buf[SENDING_STATUS])&&(EnLength==0))
4568                         {
4569                             p=mymalloc(250);
4570                             if(TyReadTypeDef.NewDetectorNumber!=0)  //report specific detector?
4571                             {
4572                                 k = get_zone_address_from_zoneNo(TyReadTypeDef.NewDetectorNumber,0);
4573                                 if(k==0)        //the detector no exist
4574                                 {
4575                                     p[0] = 0;
4576                                     p[1] = 0;
4577                                     g16_package_length = 2;
4578                                 }
4579                                 else
4580                                 {
4581                                     i=0;
4582                                     //No.
4583                                     p[i++]=(u8)TyReadTypeDef.NewDetectorNumber>>8;
4584                                     p[i++]=(u8)TyReadTypeDef.NewDetectorNumber;
4585                                     //ID
4586                                     p[i++]=0;
4587                                     p[i++]=my_detector.dat.detector[k-1].addr[2];
4588                                     p[i++]=my_detector.dat.detector[k-1].addr[1];
4589                                     p[i++]=my_detector.dat.detector[k-1].addr[0];
4590                                     //TRIGGER
4591                                     printf("mode=%d,",my_detector.dat.detector[k-1].setting.mode);
4592                                     p[i++]=my_detector.dat.detector[k-1].setting.mode;
4593                                     //TYPE
4594                                     printf("type=%d\n",my_detector.dat.detector[k-1].setting.classification);
4595                                     p[i++]=my_detector.dat.detector[k-1].setting.classification;
4596                                     g16_package_length = i;
4597                                 }
4598                                 Read_StatusCharArrayValue_Responses(NewDetectorAddedArrayStatusID,(u8*)p);
4599                                 g_CurrentTransmit_buf[RESPONSE_STATUS] |= fNewDetectorAddedArrayStatus;
4600                             }
4601                             else                                    //report all detectors
4602                             {
4603                                 if(Detector_index==0)   //start with no device
4604                                 {
4605                                     gflag.flag1&=~f1DetectorExist;
4606                                 }
4607                                 i=0;    //number of bytes
4608                                 for(;Detector_index<(DETECTOR_MAX+EOL_ZONE_NUM);Detector_index++)
4609                                 {
4610                                     if(my_detector.dat.detector[Detector_index].null==0xaa)
4611                                     {
4612                                         if(my_detector.dat.detector[Detector_index].setting.classification!=EVENT_RMT && my_detector.dat.detector[Detector_index].setting.number<(DETECTOR_MAX+EOL_ZONE_NUM+1))
4613                                         {
4614                                             if(i >= 200)        //each time should be less than 200 bytes.
4615                                             {
4616                                                 Detector_index--; //byters overflow, report it next time.
4617                                                 break;
4618                                             }
4619                                             //No.
4620                                             printf("number=%d,",my_detector.dat.detector[Detector_index].setting.number);
4621                                             p[i++]=(u8)(my_detector.dat.detector[Detector_index].setting.number>>8);
4622                                             p[i++]=(u8)my_detector.dat.detector[Detector_index].setting.number;
4623                                             //ID
4624                                             printf("ID=00%02x%02x%02x,",my_detector.dat.detector[Detector_index].addr[2],my_detector.dat.detector[Detector_index].addr[1],my_detector.dat.detector[Detector_index].addr[0]);
4625                                             p[i++]=0;
4626                                             p[i++]=my_detector.dat.detector[Detector_index].addr[2];
4627                                             p[i++]=my_detector.dat.detector[Detector_index].addr[1];
4628                                             p[i++]=my_detector.dat.detector[Detector_index].addr[0];
4629                                             //TRIGGER
4630                                             printf("mode=%d,",my_detector.dat.detector[Detector_index].setting.mode);
4631                                             p[i++]=my_detector.dat.detector[Detector_index].setting.mode;
4632                                             //TYPE
4633                                             printf("type=%d\n",my_detector.dat.detector[Detector_index].setting.classification);
4634                                             p[i++]=my_detector.dat.detector[Detector_index].setting.classification;
4635                                         }
4636                                     }
4637                                 }
4638                                 if(i!=0)
4639                                 {
4640                                     g16_package_length = i;
4641                                     Read_StatusCharArrayValue_Responses(NewDetectorAddedArrayStatusID,(u8*)p);
4642                                 }
4643                                 else if(!(gflag.flag1&f1DetectorExist))
4644                                 {
4645                                     p[0] = 0;
4646                                     p[1] = 0;
4647                                     g16_package_length = 2;
4648                                     Read_StatusCharArrayValue_Responses(NewDetectorAddedArrayStatusID,(u8*)p);
4649                                 }
4650                                 if(Detector_index >= (DETECTOR_MAX+EOL_ZONE_NUM))
4651                                 {
4652                                     g_CurrentTransmit_buf[RESPONSE_STATUS] |= fNewDetectorAddedArrayStatus;
4653                                     Detector_index = 0;
4654                                 }
4655                             }
4656                             myfree(p);
4657                         }
4658 #endif
4659                         My_TcpTx = TCP_UPLINK_PACKAGE;
4660                     break;
4661                 }
4662                 case TCP_UPLINK_PACKAGE:
4663                 {
4664                     if(EnLength != 0)   // any data to send? yes, send topic first
4665                     {
4666                         show_uplink_downlink_icon|=0xf0;
4667                         result = gsm_enet_tcp_send((u8*)encodingString,EnLength,RET_SEND_OK,gsm->module,m_b_variable);
4668                         m_b_variable = false;
4669                         
4670                         if( result == SYS_ERR_OK )
4671                         {
4672                             ctr_tcp_connect = 0;
4673                             if(Registered_On_Network == LOGIN_OK){
4674                                 OSTimeDly( 100);
4675                                 My_TcpTx = TCP_IDLE;
4676                             }
4677                             else{
4678                                 k = 0;
4679                                 do
4680                                 {
4681                                     OSTimeDly( 100);
4682                                     
4683                                     if(Registered_On_Network == LOGIN_OK) 
4684                                     {
4685                                         break;
4686                                     }
4687                                     else if(k++>=90){   //timeout
4688                                         My_TcpTx = TCP_ERROR;
4689                                         break;
4690                                     }
4691                                 }while(1);
4692                             }
4693                         }
4694                         else
4695                         {
4696                             My_TcpTx = TCP_ERROR;
4697                         }
4698                     }
4699                     else
4700                     {
4701                         g_CurrentTransmit_buf[0]=0;
4702                         g_CurrentTransmit_buf[1]=0;
4703                         g_CurrentTransmit_buf[2]=0;
4704                         g_CurrentTransmit_buf[3]=0;
4705                         My_TcpTx = TCP_IDLE;
4706                     }
4707                     break;
4708                 }
4709                 case TCP_ERROR:
4710                 {
4711                     if(ctr_tcp_connect++ >= 5)
4712                     {
4713                         gsm->reset = 1;
4714                     }
4715                     else
4716                     {
4717                         My_TcpTx = TCP_IDLE;
4718                     }
4719                     break;
4720                 }
4721             }
4722         }
4723         #if 0
4724         else if( ( gsm->task&(GSM_TASK_ENET_PULSE|GSM_TASK_ENET_ALARM) ) != 0 )
4725         {
4726             p = mymalloc( 64 );
4727             if( ( gsm->task&GSM_TASK_ENET_ALARM ) != 0 )
4728             {
4729                 pgsGsm = PGS_GSM_TCP_ALARM;
4730                 temp = enet_d2s_alarm_cmd( (u8*)p,gsm );    /* data encoding */
4731             }
4732             else
4733             {
4734                 /* ENET heart beat */
4735                 pgsGsm = PGS_GSM_TCP_PULSE;
4736                 temp = enet_d2s_pulse_cmd( (u8*)p );        /* heart beat encoding */
4737                 
4738             }
4739             result = gsm_enet_tcp_send( (u8*)p,temp,RET_S2D_ACK,gsm->module );    /* send data */
4740             if( result == SYS_ERR_OK )
4741             {
4742                 ctr_tcp_send = 0;
4743                 if( pgsGsm == PGS_GSM_TCP_ALARM )
4744                 {
4745                     gsm->gsm_enet_executed = 1;        
4746                     gsm->task &= ~GSM_TASK_ENET_ALARM;
4747                 }
4748                 else gsm->task &= ~GSM_TASK_ENET_PULSE;
4749             }
4750             else
4751             {
4752                 if( ++ctr_tcp_send >= 20 ) gsm->reset = 1;
4753                 else
4754                 {
4755                     gsm_close_connect( TCP_INDEX_ENET,gsm->module );
4756                     gsm->status &= ~GSM_STAT_TCP_CONNECT;
4757                 }
4758             }
4759             myfree( p );
4760             pgsGsm = PGS_GSM_FREE;
4761         }
4762         #endif
4763     }
4764 }
4765 /*********************************************************************************************************
4766     gsm timer callback 1 second
4767 *********************************************************************************************************/
4768 void gsm_task_time_callback(void)
4769 {
4770     STRU_GSM *gsm = &struGsm;
4771     static u32 tmrCreg = 0;
4772     
4773     tmrCreg++;
4774     if( tmrCreg%35 == 0 ) {
4775         gsm->task |= GSM_TASK_CREG;
4776         
4777         #if AEP_F_
4778         if(!(f1HeartBeatSend & gflag.flag1)){
4779             gflag.flag1 |= f1HeartBeatSend;
4780         }
4781         #endif
4782         
4783     }
4784     #if AEP_F_
4785     if(struParaSet.dat.KeepaliveIntervalTimeU16)
4786     {
4787         if((fAckRequestCmdStatus & gflag.fReport1Status)==0)
4788         {
4789             if(keepalive_ticks < struParaSet.dat.KeepaliveIntervalTimeU16)
4790             {
4791                 keepalive_ticks++;
4792             }
4793             else
4794             {
4795                 keepalive_ticks = 0;
4796                 gflag.fReport1Status |= (fAckRequestCmdStatus|fNetworkRssiU8StatusRes);
4797             }
4798         }
4799     }
4800     #endif
4801     if( tmrCreg >= 24*60*60 )
4802     {
4803         tmrCreg = 0;
4804         gsm->status &= ~GSM_STAT_INIT;
4805     }
4806     
4807 }
4808 /*********************************************************************************************************
4809    END FILE
4810 *********************************************************************************************************/
gsm.c
 1 https://www.ctwing.cn/sbjr/70
 2 l  消息格式
 3 应用层数据报文以1个字节的类型字段作为分割,平台支持登录、心跳、上下行业务数据等消息类型。消息携带的参数必须包含两个字节的参数长度。
 4 
 5 透传设备:
 6 
 7 消息类型    类型描述            消息格式                                    备注
 8 ---------------------------------------------------------------------------------------------------------------------------------------
 9 0x01        登录请求        0x01 +deviceId_length(2字节)              deviceId是由产品ID和设备编号拼接而成的字符串
10                             +deviceId   +password_length              password由平台生成,在设备管理业务可以查看; ** version固定1.0**
11                             (2字节) +password +version_length
12                             (2字节) +version                       
13 ---------------------------------------------------------------------------------------------------------------------------------------
14 0x02        上行数据报文    0x02 +数据长度(2字节)+业务数据
15 ---------------------------------------------------------------------------------------------------------------------------------------
16 0x03       下行数据报文     0x03 +数据长度(2字节)+业务数据
17 ---------------------------------------------------------------------------------------------------------------------------------------
18 0x04        心跳            0x04                                      平台心跳周期为5分钟,设备需在5分钟内发送心跳报文
19 ---------------------------------------------------------------------------------------------------------------------------------------
20 0x05        登录响应        0x05+结果码(2字节)                       登录结果: 0 成功 1 未知错误 2 设备未注册 
21                                                                       3 设备认证失败 4 设备已登录
22 ---------------------------------------------------------------------------------------------------------------------------------------
23 0x06        心跳响应        0x06                                      平台回复终端心跳的响应

 

posted on 2025-11-26 19:08  Milo_lu  阅读(9)  评论(0)    收藏  举报

导航