modemTask.c 19 KB

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