modemTask.c 21 KB

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