modemTask.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705
  1. #include "includes.h"
  2. #include "socket.h"
  3. int g_iCSQ=-1;
  4. YUNYINGSHANG_DEF thisYunYingShang=CHINA_NONE;
  5. unsigned char g_ucModemTaskEn=0;
  6. unsigned char modemInitStatus=0;
  7. unsigned char g_ucCardStatus=0;
  8. unsigned char modemInitReady=0;//0模块没开始初始化 1模块初始化成功 2模块初始化失败
  9. static char ChekCardCnt=0;
  10. char CardStatue=0x11;
  11. unsigned char SIMSelect;
  12. unsigned int TTSPlayTick=0;
  13. char SendAT[50];
  14. char WaitAT1[30];
  15. char WaitAT2[30];
  16. typedef enum{
  17. MINI_WAT_START,
  18. MINI_GET_MODULE,
  19. MINI_GET_POC_VER,
  20. MINI_GET_POC_CODE,
  21. MINI_GET_CARD,
  22. MINI_GET_IMEI,
  23. MINI_PLY_ICCID,
  24. MINI_POC_PARA,
  25. MINI_SET_TONES,
  26. MINI_READ_SPKLV,
  27. MINI_GET_SIMSELECT,
  28. MINI_SET_MICLV,
  29. MINI_SET_TTSPARM,
  30. MINI_SET_GPSPARM,
  31. MINI_CHEAK_HEADSET,
  32. }M_INIT_STATUS;
  33. static unsigned char initStatus;
  34. static unsigned short timeOut;
  35. static unsigned char PocGetTypeCnt=0;
  36. void SpeakTTSVoice(void)
  37. {
  38. int len,timeout,i;
  39. char ttsMessage[20*4];
  40. //SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  41. unsigned char codeType=ENCODE_UNICODE;
  42. if(newPara.ttsMessage[0]==0) return;
  43. len=strlen(newPara.ttsMessage);
  44. len = len+(8-len%8);//8倍数
  45. if(newPara.ttsCodeType==TTS_UNICODE)
  46. {
  47. codeType=ENCODE_UNICODEBigend;
  48. for(i=0;i<len;i+=4){
  49. ttsMessage[i]=newPara.ttsMessage[i+2];
  50. ttsMessage[i+1]=newPara.ttsMessage[i+3];
  51. ttsMessage[i+2]=newPara.ttsMessage[i];
  52. ttsMessage[i+3]=newPara.ttsMessage[i+1];
  53. printf("%c",ttsMessage[i]);
  54. printf("%c",ttsMessage[i+1]);
  55. printf("%c",ttsMessage[i+2]);
  56. printf("%c",ttsMessage[i+3]);
  57. }
  58. ttsMessage[len-1]=0;
  59. printf("\r\n");
  60. }else if(newPara.ttsCodeType==TTS_GBK) codeType=ENCODE_ASCII;
  61. MeSpeak(codeType,ttsMessage);
  62. }
  63. void mInitSwitchStatus(unsigned char status){
  64. timeOut=10;//5秒
  65. initStatus=status;
  66. snprintf(WaitAT2, sizeof(WaitAT2), "@#@");
  67. switch(initStatus){
  68. case MINI_WAT_START:
  69. timeOut=60;//只有模块启动时时间才要长些这里设置为30秒//60
  70. SlwTrace(INF, "WaitModemRun..",1);
  71. snprintf(SendAT, sizeof(SendAT), "ATE0\r\n");
  72. snprintf(WaitAT1, sizeof(WaitAT1), "OK");
  73. snprintf(WaitAT2, sizeof(WaitAT2), "+POC:START");
  74. break;
  75. case MINI_GET_MODULE:
  76. SlwTrace(INF, "GetModemModule..",1);
  77. snprintf(SendAT, sizeof(SendAT), "ATI\r\n");
  78. snprintf(WaitAT1, sizeof(WaitAT1), "SV");
  79. break;
  80. case MINI_GET_POC_VER:
  81. timeOut=4;
  82. SlwTrace(INF, "GetPocVersion..",1);
  83. if(PocGetTypeCnt==0){
  84. snprintf(SendAT, sizeof(SendAT), "AT+POC_VER?\r\n");
  85. snprintf(WaitAT1, sizeof(WaitAT1), "+POC_VER:");
  86. }
  87. else {
  88. snprintf(SendAT, sizeof(SendAT), "AT+POC=version\r\n");
  89. snprintf(WaitAT1, sizeof(WaitAT1), "+POC:BROAD");
  90. }
  91. break;
  92. case MINI_GET_POC_CODE:
  93. SlwTrace(INF, "GetPocCode..",1);
  94. snprintf(SendAT, sizeof(SendAT), "AT+POC=40000000\r\n");
  95. snprintf(WaitAT1, sizeof(WaitAT1), "+POC:400000000");
  96. break;
  97. case MINI_GET_CARD:
  98. SlwTrace(INF, "GetCardStatus..",1);
  99. snprintf(SendAT, sizeof(SendAT), "AT+CPIN?\r\n");
  100. snprintf(WaitAT1, sizeof(WaitAT1), "+CPIN: READY");
  101. break;
  102. case MINI_GET_IMEI:
  103. SlwTrace(INF, "GetIMEI..",1);
  104. snprintf(SendAT, sizeof(SendAT), "AT+LSHIMEI\r\n");
  105. snprintf(WaitAT1, sizeof(WaitAT1), "+LSHIMEI:");
  106. break;
  107. case MINI_PLY_ICCID:
  108. SlwTrace(INF, "GetICCID..",1);
  109. snprintf(SendAT, sizeof(SendAT), "AT+ICCID\r\n");
  110. snprintf(WaitAT1, sizeof(WaitAT1), "^SCID:");
  111. break;
  112. case MINI_POC_PARA:
  113. SlwTrace(INF, "GetPOCPara..",1);
  114. snprintf(SendAT, sizeof(SendAT), "AT+POC=020000\r\n");
  115. snprintf(WaitAT1, sizeof(WaitAT1), "+POC:02");
  116. break;
  117. case MINI_SET_TONES:
  118. SlwTrace(INF, "SetTones..",1);
  119. if(newPara.KeySound!=0){
  120. snprintf(SendAT, sizeof(SendAT), "AT+TONES=1\r\n");
  121. snprintf(WaitAT1, sizeof(WaitAT1), "+TONES:1");
  122. }else {
  123. snprintf(SendAT, sizeof(SendAT), "AT+TONES=0\r\n");
  124. snprintf(WaitAT1, sizeof(WaitAT1), "+TONES:0");
  125. }
  126. break;
  127. case MINI_READ_SPKLV:
  128. SlwTrace(INF, "SetCLVL..",1);
  129. snprintf(SendAT, sizeof(SendAT), "AT+CLVL?\r\n");
  130. snprintf(WaitAT1, sizeof(WaitAT1), "+CLVL:");
  131. break;
  132. //MINI_GET_SIMSELECT
  133. case MINI_GET_SIMSELECT:
  134. SlwTrace(INF, "GetSIMSelect..",1);
  135. snprintf(SendAT, sizeof(SendAT), "AT+SIMCROSS?\r\n");
  136. snprintf(WaitAT1, sizeof(WaitAT1), "+SIMCROSS:");
  137. break;
  138. //newPara.Miclv
  139. case MINI_SET_MICLV:
  140. SlwTrace(INF, "SetMIClv..",1);
  141. //+CACCP: "07000b00" newPara.Miclv
  142. snprintf(SendAT, sizeof(SendAT), "AT+CACCP=2,1,6,\"%02x00%02x00\"\r\n",newPara.Miclv/16,newPara.Miclv%16);
  143. snprintf(WaitAT1, sizeof(WaitAT1), "+CACCP:");
  144. break;
  145. //AT+LSHTTSPARAM=3000,106,100 设置TTS 音量 语调 语速
  146. // +LSHTTSPARAM:3000,106,100
  147. case MINI_SET_TTSPARM:
  148. SlwTrace(INF, "SetTTSPARAM..",1);
  149. snprintf(SendAT, sizeof(SendAT), "AT+LSHTTSPARAM=3000,106,100\r\n");//32768
  150. snprintf(WaitAT1, sizeof(WaitAT1), "OK");
  151. break;
  152. //MINI_SET_GPSPARM
  153. case MINI_SET_GPSPARM:
  154. SlwTrace(INF, "Set_SET_GPSPARM..",1);
  155. snprintf(SendAT, sizeof(SendAT), "AT+GPS?\r\n");
  156. snprintf(WaitAT1, sizeof(WaitAT1), "+GPS:O");//+GPS:ON +GPS:OFF
  157. break;
  158. case MINI_CHEAK_HEADSET:
  159. SlwTrace(INF, "CHEAK_HEADSET..",1);
  160. snprintf(SendAT, sizeof(SendAT), "AT+HEADSET?\r\n");
  161. snprintf(WaitAT1, sizeof(WaitAT1), "+HEADSET:");//+GPS:ON
  162. break;
  163. }
  164. }
  165. short ModemInitAckHandler(unsigned char result){
  166. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  167. char buf[20];
  168. char *msg=(char *)pMsg->MsgData;
  169. short ret=0;
  170. static char FirstInitTTS=0;
  171. switch(initStatus){
  172. case MINI_WAT_START:
  173. if(result==1){
  174. SlwTrace(INF, "ModemStart...",1);
  175. ModemSendAt("ATE0\r\n");
  176. mInitSwitchStatus(MINI_GET_POC_VER);
  177. }else ret=-1;
  178. break;
  179. case MINI_GET_POC_VER:
  180. if(result!=1) {
  181. PocGetTypeCnt++;
  182. if(PocGetTypeCnt==1){
  183. mInitSwitchStatus(MINI_GET_POC_VER);//
  184. break;
  185. }
  186. else if(PocGetTypeCnt==2){
  187. hgs_poc_type=POC_NULL;
  188. SlwTrace(INF, "GetPocVer fail",1);
  189. }
  190. }
  191. else{
  192. if(PocGetTypeCnt==0)hgs_poc_type=POC_OWN;
  193. else if(PocGetTypeCnt==1){
  194. hgs_poc_type=POC_BND;
  195. ModemSendAt("AT+LSPA=1\r\n");
  196. }
  197. getPocVersion(msg,hgs_poc_type);
  198. }
  199. PocGetTypeCnt=0;
  200. mInitSwitchStatus(MINI_SET_TTSPARM);
  201. break;
  202. case MINI_SET_TTSPARM:
  203. if(result != 1) SlwTrace(INF, "SetTTSPARAM fail",1);
  204. else SlwTrace(INF, "SetTTSPARAM OK",1);
  205. //mInitSwitchStatus(MINI_SET_MICLV);
  206. if(hgs_poc_type==POC_OWN)mInitSwitchStatus(MINI_CHEAK_HEADSET);//
  207. else {
  208. mInitSwitchStatus(MINI_GET_MODULE);
  209. }
  210. break;
  211. case MINI_SET_MICLV://目前未使用
  212. if(result != 1) SlwTrace(INF, "SET_MICLV fail",1);
  213. else SlwTrace(INF, "SET_MICLV OK",1);
  214. mInitSwitchStatus(MINI_CHEAK_HEADSET);
  215. break;
  216. case MINI_CHEAK_HEADSET:
  217. if(result != 1) SlwTrace(INF, "CHEAK_HEADSET fail",1);
  218. else{
  219. SlwTrace(INF, "CHEAK_HEADSET OK",1);
  220. if(msg[9]=='0'){
  221. sutPocStatus.HeadSetPtt=1;
  222. ModemSendAt("AT+AUDCH=1,3\r\n");
  223. }
  224. else if(msg[9]=='1')ModemSendAt("AT+AUDCH=0,0\r\n");
  225. }
  226. mInitSwitchStatus(MINI_GET_MODULE);
  227. break;
  228. case MINI_GET_MODULE:
  229. if(result != 1) SlwTrace(INF, "GetModemModule fail",1);
  230. else getModemModule(msg);
  231. uTimerHardDly(100);
  232. HeadsetProcess();
  233. mInitSwitchStatus(MINI_GET_SIMSELECT);
  234. break;
  235. case MINI_GET_SIMSELECT:
  236. if(result != 1) SlwTrace(INF, "GetSIMSelect fail",1);
  237. else SIMSelect=atoi(&msg[10]);
  238. if(hgs_poc_type==POC_OWN)mInitSwitchStatus(MINI_SET_TONES);
  239. else mInitSwitchStatus(MINI_READ_SPKLV);
  240. break;
  241. case MINI_SET_TONES:
  242. if(result != 1) SlwTrace(INF, "SetTones fail",1);
  243. else SlwTrace(INF, "SetTones_Ok",1);
  244. mInitSwitchStatus(MINI_READ_SPKLV);
  245. break;
  246. case MINI_READ_SPKLV:
  247. //+CLVL:60
  248. if(result!=1) SlwTrace(INF, "ReadSpkLv fail",1);
  249. else{
  250. newPara.VolumLv=atoi(&msg[6])/10;
  251. printf("VolumLv=%d\r\n",newPara.VolumLv);
  252. }
  253. TTSPlayTick=uSysTickGet()+500;//5S后 才播报TONE音
  254. if(hgs_poc_type==POC_BND){
  255. g_uiGpsStat=0;
  256. newPara.gpsTimeIndex=0;
  257. snprintf(buf,sizeof(buf),"AT+POC=ttsvol=%d\r\n",newPara.VolumLv);
  258. ModemSendAt(buf);
  259. SpeakerCtrl(1);
  260. if(newPara.KeySound==0)ModemSendAt("AT+POC=tonevol=0\r\n");
  261. else {
  262. //ModemSendAt("AT+POC=tonevol=%d\r\n",newPara.VolumLv);
  263. snprintf(buf,sizeof(buf),"AT+POC=tonevol=%d\r\n",newPara.VolumLv);
  264. ModemSendAt(buf);
  265. }
  266. mInitSwitchStatus(MINI_GET_CARD);
  267. }else {
  268. mInitSwitchStatus(MINI_SET_GPSPARM);
  269. }
  270. if(FirstInitTTS==0){
  271. SpeakTTSVoice();
  272. FirstInitTTS=1;
  273. }
  274. break;
  275. case MINI_SET_GPSPARM:
  276. if(result!=1) SlwTrace(INF, "GetGPSstatue fail",1);
  277. else {
  278. if(msg[6]=='N'){
  279. if(!g_uiGpsStat){
  280. ModemSendAt("AT+GPS=\"OFF\"\r\n");
  281. //AT+VIBCTRL
  282. ModemSendAt("AT+VIBCTRL=\"POWER\",\"OFF\"\r\n");
  283. printf("close GPS--%d\r\n",g_uiGpsStat);
  284. }
  285. }else{
  286. if(g_uiGpsStat){
  287. ModemSendAt("AT+GPS=\"ON\"\r\n");
  288. ModemSendAt("AT+VIBCTRL=\"POWER\",\"ON\"\r\n");
  289. printf("open GPS--%d\r\n",g_uiGpsStat);
  290. }
  291. }
  292. SlwTrace(INF, "Seting GPS",1);
  293. }
  294. if(g_uiGpsStat)ModemSendAt("AT+GPSANT=1\r\n");
  295. if(hgs_poc_type==POC_OWN)mInitSwitchStatus(MINI_GET_POC_CODE);
  296. else mInitSwitchStatus(MINI_GET_CARD);
  297. break;
  298. case MINI_GET_POC_CODE:
  299. if(result!=1) SlwTrace(INF, "GetPocCode fail",1);
  300. else getPocCode(msg);
  301. CardStatue=0x11;
  302. mInitSwitchStatus(MINI_GET_CARD);
  303. break;
  304. case MINI_GET_CARD:
  305. switch(ChekCardCnt){
  306. case 0:
  307. if(result != 1)CardStatue&=0x10;
  308. else {
  309. goto CARDREDY;
  310. }
  311. SIMSelect=!SIMSelect;
  312. snprintf(buf,sizeof(buf),"AT+SIMCROSS=%d\r\n",SIMSelect);
  313. ModemSendAt(buf);
  314. uTimerHardDly(100);
  315. ret=-3;
  316. ChekCardCnt=1;
  317. sutPocStatus.modemRstFlag=1;
  318. break;
  319. case 1:
  320. ChekCardCnt=0;
  321. if(result != 1){
  322. CardStatue&=0x01;
  323. ret=-2;
  324. break;
  325. }
  326. CARDREDY:
  327. SlwTrace(INF, "Card Ready",1);
  328. if(hgs_poc_type==POC_OWN)mInitSwitchStatus(MINI_POC_PARA);
  329. else {
  330. ModemSendAt("AT+POC=open,1,1\r\n");
  331. ret=1;
  332. }
  333. break;
  334. }
  335. break;
  336. case MINI_POC_PARA:
  337. if(result != 1) SlwTrace(INF, "GetPocPara fail",1);
  338. else ModemSetPocPara(msg,pMsg->MsgLen);
  339. ModemApnConfig();
  340. // ModemSendAt("AT+ROUTE=0,1\r\n");//打开POClog
  341. ret=1;
  342. break;
  343. }
  344. return ret;
  345. }
  346. PT_THREAD (ptModemInitTask(struct pt *pt))
  347. {
  348. static timer_t ptTimer;
  349. static unsigned char intCmd;
  350. static unsigned char status;
  351. static short i,t;
  352. short ret;
  353. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  354. PT_BEGIN(pt);
  355. while(1){
  356. M_RESTART:
  357. SlwTrace(INF,"ModemInit...",1);
  358. memset((unsigned char *)&sutPocStatus, 0, sizeof(SUT_POC_STATUS));
  359. SetLedIndicator(IndNoNet);
  360. sutPocStatus.modemRstFlag=0;
  361. modemInitReady=0;
  362. modemInitStatus=0;
  363. MsgQueueSet();
  364. MODEM_RESET_HIGH;
  365. PTTimerStart(&pt_timerPool, &ptTimer, 300);
  366. PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
  367. MODEM_RESET_LOW;
  368. PTTimerStart(&pt_timerPool, &ptTimer, 300);
  369. PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
  370. MODEM_PWREN_HIGH;
  371. PTTimerStart(&pt_timerPool, &ptTimer, 200);
  372. PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
  373. mInitSwitchStatus(MINI_WAT_START);
  374. modemInitReady=1;
  375. sutPocStatus.ModemPowerOn=1;
  376. SEND_WAIT_PRO:
  377. status=0;
  378. for(i=0;i<timeOut;i++){//共等60*500=30000ms
  379. ModemSendAt(SendAT);
  380. t=25;//以下等20*25=500ms
  381. while(t--){
  382. if(g_ucEnterGTNow!=0||USBSeletCt>1) goto INIT_DONE;//使得GT可以直接跳出初始化过程 //或者升级模块模式直接跳转
  383. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))){
  384. //printf("Ack:%s",pMsg->MsgData);调试
  385. if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:8B0002")) SpeakerEnable();//wjl
  386. else if(0==ModemStrCmp((char *)pMsg->MsgData,"+POC:8B0000")) SpeakerDisable();//wjl
  387. if(0==ModemStrCmp((char *)pMsg->MsgData,WaitAT1) ||
  388. 0==ModemStrCmp((char *)pMsg->MsgData,WaitAT2)){
  389. status=1;
  390. goto SEND_GET_RET;
  391. }
  392. }else{
  393. PTTimerStart(&pt_timerPool, &ptTimer, 2);
  394. PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
  395. }
  396. }
  397. }
  398. SEND_GET_RET:
  399. ret=ModemInitAckHandler(status);
  400. //ret=-1;
  401. if(ret ==0) goto SEND_WAIT_PRO;
  402. else if(ret<0){//模块启动失败/卡不在
  403. if(ret==-1){
  404. SlwTrace(INF, "ModemInitTimeout GT Mode",1);
  405. EnterGTMode();
  406. }else if(ret==-2){
  407. SlwTrace(INF, "insert card error----",1);
  408. sutPocStatus.loginResult=4;
  409. }
  410. }
  411. INIT_DONE:
  412. //初始化完成
  413. modemInitStatus=1;//可以消耗模块消息队列了
  414. g_ucModemTaskEn=1;
  415. while(1){
  416. if(sutPocStatus.modemRstFlag !=0) goto M_RESTART;
  417. //sutPocStatus.ModemInactiveCt=0; /****************V113守护进程BUG********/
  418. PTTimerStart(&pt_timerPool, &ptTimer, 100);//100
  419. PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
  420. }
  421. }
  422. PT_END(pt);
  423. }
  424. void InfoTick(void){
  425. static unsigned int tick;
  426. if(g_ucEnterGTNow) return;
  427. if(uTimerExpired(&tick)){
  428. uTimerStart(&tick, 500);
  429. printf("Info:Auth[%d],GT[%d],MI[%d],UI[%d] \r\n",sutGpsInfo.isGpsAuthOk,g_ucEnterGTNow,modemInitStatus,sutUIstatus.Status);
  430. }
  431. }
  432. static void AtHandle(char *msg);
  433. void ModemATProcess(void){
  434. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  435. if(modemInitStatus==0) return;
  436. while(1){
  437. pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData));
  438. if(pMsg->MsgLen>0){
  439. if(g_ucEnterGTNow!=0||USBSeletCt>1) continue;//如果进入GT模式,不需要处理模块消息了
  440. SlwTrace(INF, (char *)pMsg->MsgData,0);
  441. sutPocStatus.ModemInactiveCt=0;
  442. if(pMsg->MsgData[0]=='+' || pMsg->MsgData[0] == '^'){
  443. if(1 == PocHandle((char *)pMsg->MsgData)) continue;
  444. AtHandle((char *)pMsg->MsgData);
  445. }else if(pMsg->MsgData[0]=='$'&&pMsg->MsgData[3]=='R'&&pMsg->MsgData[5]=='C'){
  446. process_gps_data((char*)&pMsg->MsgData[7],pMsg->MsgLen);
  447. sutGpsInfo.isGpsWork=1;
  448. }
  449. continue;
  450. }else if(pMsg->MsgLen<0){
  451. SlwTrace(INF, "QueueF1",1);
  452. continue;
  453. }
  454. break;
  455. }
  456. }
  457. void ModemLedCtl(void){
  458. if(g_ucModemTaskEn==0||g_ucEnterGTNow!=0) return;
  459. if(0==sutPocStatus.Logined)SetLedIndicator(IndNoNet);
  460. else if(sutPocStatus.Speaker>0)SetLedIndicator(IndRX);
  461. else if(sutPocStatus.Mic>0 )SetLedIndicator(IndTX);
  462. else SetLedIndicator(IndStandby);
  463. }
  464. static void AtHandle(char *pMsg)
  465. {
  466. int csq;
  467. short targetIndex;
  468. unsigned char tempSocket,i,temp;
  469. unsigned short tempLen;
  470. char buf[80]="\r\n";
  471. char bufTemp[3];
  472. char buf3[40];
  473. static char Timerequest=0;
  474. STATUE ipStatus;
  475. if(0==ModemStrCmp(pMsg,"^SYSINFO:")){
  476. if(pMsg[15]!=','){
  477. netshowvalue=atoi(&pMsg[15]);
  478. }else{
  479. netshowvalue=atoi(&pMsg[16]);
  480. }
  481. }else if(0==ModemStrCmp(pMsg,"+CSQ:"))
  482. {
  483. g_iCSQ=atoi(&pMsg[6]);
  484. }else if(0==ModemStrCmp(pMsg,"+POC_PPP:")){
  485. if(pMsg[9]=='1') netPPP=OPEN;
  486. else netPPP=CLOSE;
  487. if(0==Timerequest&&netPPP==OPEN){
  488. Timerequest=1;
  489. ModemSendAt("AT+CCLK?\r\n");
  490. }
  491. }else if(0==ModemStrCmp(pMsg,"+POC:npong,"))
  492. {
  493. if(pMsg[11]=='1'){
  494. netPPP=OPEN;
  495. }
  496. else netPPP=CLOSE;
  497. if(0==Timerequest&&netPPP==OPEN){
  498. Timerequest=1;
  499. ModemSendAt("AT+CCLK?\r\n");
  500. }
  501. }
  502. else if(0==ModemStrCmp(pMsg,"+TCPSTATUS:")){
  503. tcpSocketStatusUpdate(pMsg[11],pMsg[13],0);
  504. }else if(0==ModemStrCmp(pMsg,"+TCPRECV:")){//+TCPRECV:0,2,31
  505. if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ":", 1,1))){
  506. tempSocket = atoi(&pMsg[targetIndex]);//找到socket
  507. if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ",",1,1))){
  508. tempLen = atoi(&pMsg[targetIndex]);
  509. if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ",",1,2))){
  510. tcpSocketRecv(tempSocket, &pMsg[targetIndex], tempLen);
  511. }
  512. }
  513. }
  514. }else if(0==ModemStrCmp(pMsg,"+TCPOPEN:")){
  515. tcpSocketStatusUpdate(pMsg[9],pMsg[11],0);
  516. }else if(0==ModemStrCmp(pMsg, "+TCPCLOSE:")){//主动关掉或者服务器关掉都是这样
  517. tcpSocketStatusUpdate(pMsg[10],NULL,1);
  518. }else if(0==ModemStrCmp(pMsg, "+CCLK:"))
  519. {
  520. ModemGetTime(pMsg);
  521. }else if(0==ModemStrCmp(pMsg, "^MODE:"))
  522. {//^MODE: 9 与下面位置不一,模块问题
  523. //^MODE:2 与上面位置不一,模块问题
  524. if(pMsg[6] == ' ') bufTemp[0]=pMsg[7];
  525. else bufTemp[0]=pMsg[6];
  526. snprintf(buf, sizeof(buf), "[Mode %c]", bufTemp[0]);
  527. switch(bufTemp[0])
  528. {
  529. case 0x30:strcat(buf, "No server");break;
  530. case 0x32:strcat(buf, "CDMA Mode");break;
  531. case 0x33:strcat(buf, "GSM");break;
  532. case 0x34:strcat(buf, "TD-SCDMA/EVDO");break;
  533. case 0x35:strcat(buf, "WCDMA");break;
  534. case 0x39:strcat(buf, "LTE");break;
  535. default:strcat(buf, "Unknow");break;
  536. }
  537. SlwTrace(INF, buf, 1);
  538. }else if(0==ModemStrCmp(pMsg, "+POC:START"))
  539. {
  540. sutPocStatus.modemRstFlag=1;
  541. sutPocStatus.ModemInactiveCt=0;//当模块重启后重新计数串口通讯异常计数器
  542. }
  543. else if(0==ModemStrCmp(pMsg, "+GGIP:"))
  544. { //GSPIP返回
  545. //+GPIP:183.131.13.10
  546. chekPipGip(pMsg,1);
  547. //strcpy(gSocket.socketList[0].Ip,showGIP);//
  548. }else if(0==ModemStrCmp(pMsg, "+GPIP:"))
  549. {
  550. chekPipGip(pMsg,0);
  551. }else if(0==ModemStrCmp(pMsg, "+FOTA:")){
  552. FotaStatusProcess(pMsg+6);
  553. uTimerStart(&fotaTick,10);
  554. }else if(0==ModemStrCmp(pMsg, "+POC:WAKEUP")){
  555. enableDataSend();
  556. }else if(0==ModemStrCmp(pMsg, "+UDP:")){
  557. GetPwrMode(pMsg+5);
  558. }else if(0==ModemStrCmp(pMsg, "+AUDCH"))//
  559. {
  560. }else if(0==ModemStrCmp(pMsg,"+CTEC:"))
  561. {
  562. tempnetshowvalue=atoi(&pMsg[7]);
  563. if(newPara.netMode!=tempnetshowvalue){
  564. snprintf(buf,sizeof(buf),"AT+CTEC=%d,%d\r\n",tempnetshowvalue,newPara.netMode);
  565. ModemSendAt(buf);
  566. }
  567. }else if(0==ModemStrCmp(pMsg,"+COPS")){
  568. //netshowvalue=atoi(&pMsg[FindContentByChar( pMsg,',',3)]);
  569. netshowvalue=atoi(FindContentByChar(pMsg,',',3,buf));
  570. }else if(0==ModemStrCmp(pMsg,"+HEADSET:"))
  571. {
  572. InternalHeadSet(atoi(&pMsg[9]));
  573. }
  574. }
  575. void InternalHeadSet(char type)
  576. {
  577. switch(type)
  578. {
  579. case 0:
  580. sutPocStatus.HeadSetPtt=1;
  581. ModemSendAt("AT+AUDCH=1,3\r\n");
  582. break;
  583. case 1:
  584. sutPocStatus.HeadSetPtt=0;
  585. ModemSendAt("AT+AUDCH=0,0\r\n");
  586. break;
  587. case 2:
  588. ModemSendAt("AT+POC=0B0000\r\n");
  589. break;
  590. case 3:
  591. ModemSendAt("AT+POC=0C0000\r\n");
  592. break;
  593. }
  594. }
  595. char *FindContentByChar( char *src,char c, char index,char *dest)
  596. {
  597. char i;
  598. char j=0;
  599. char *p=dest;
  600. for(i=0;i<strlen(src);i++)
  601. {
  602. if(src[i]==c)j++;
  603. if(j==index){
  604. p=&src[i+1];
  605. return p;
  606. }
  607. }
  608. }
  609. void chekPipGip(char *src,char type)
  610. {
  611. char buf[40];
  612. char *p;
  613. p=src+6;
  614. if(!type)snprintf(buf,sizeof(buf),"+GPIP:%s\r\n",showPIP);
  615. else snprintf(buf,sizeof(buf),"+GGIP:%s\r\n",showGIP);
  616. if(strlen(src)<9||(0==ModemStrCmp(src, "+GGIP:0.0.0.0"))||(0==strcmp(src,buf))||(0==ModemStrCmp(src, "+GPIP:0.0.0.0")))return ;
  617. if(!type){
  618. memcpy(showPIP,p,strlen(p)-2);
  619. showPIP[strlen(p)-2]=0;
  620. printf("get new PIP====%s\r\n",showPIP);
  621. }else{
  622. memcpy(showGIP,p,strlen(p)-2);
  623. showGIP[strlen(p)-2]=0;
  624. printf("get new GIP====%s\r\n",showGIP);
  625. strcpy(gSocket.socketList[0].Ip,showGIP);
  626. }
  627. }