modemTask.c 19 KB

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