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 *********************************************************************************************************/
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 平台回复终端心跳的响应
浙公网安备 33010602011771号