modemTask.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732
  1. #include "includes.h"
  2. int g_iCSQ=-1;
  3. YUNYINGSHANG_DEF thisYunYingShang=CHINA_NONE;
  4. CODEC_PARAM codec_param;
  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. char SendAT[50];
  10. char WaitAT1[30];
  11. char WaitAT2[30];
  12. typedef enum{
  13. MINI_WAT_START,
  14. MINI_CONFIRM_VER,
  15. MINI_GET_MODULE,
  16. MINI_GET_MVERSION,
  17. MINI_GET_POC_VER,
  18. MINI_GET_POC_CODE,
  19. MINI_SET_TTS_SPEED1,
  20. MINI_SET_TTS_SPEED2,
  21. MINI_SET_SPK_MIC,
  22. MINI_GET_CARD,
  23. MINI_GET_IMEI,
  24. MINI_PLY_ICCID,
  25. MINI_POC_PARA,
  26. MINI_SET_POC_SIMPLE,
  27. MINI_SET_TONES,
  28. MINI_SET_SPKLV,
  29. MINI_SET_MICLV,
  30. }M_INIT_STATUS;
  31. static unsigned char initStatus;
  32. static unsigned char timeOut;
  33. void mInitSwitchStatus(unsigned char status){
  34. char temp=0;
  35. timeOut=10;//5秒
  36. initStatus=status;
  37. snprintf(WaitAT2, sizeof(WaitAT2), "@#@");
  38. switch(initStatus){
  39. case MINI_WAT_START:
  40. timeOut=80;//只有模块启动时时间才要长些这里设置为30秒 /60
  41. SlwTrace(INF, "WaitModemRun..",1);
  42. snprintf(SendAT, sizeof(SendAT), "ATE0\r\n");
  43. snprintf(WaitAT1, sizeof(WaitAT1), "OK");
  44. snprintf(WaitAT2, sizeof(WaitAT2), "+POC:START");
  45. break;
  46. case MINI_CONFIRM_VER:
  47. SlwTrace(INF, "Confirm The Ver..",1);
  48. snprintf(SendAT, sizeof(SendAT), "AT+LSPOCPF?\r\n");
  49. snprintf(WaitAT1, sizeof(WaitAT1), "ERROR");
  50. snprintf(WaitAT2, sizeof(WaitAT2), "+LSPOCPF:");
  51. break;
  52. case MINI_GET_MODULE:
  53. SlwTrace(INF, "GetModemModule..",1);
  54. snprintf(SendAT, sizeof(SendAT), "ATI\r\n");
  55. snprintf(WaitAT1, sizeof(WaitAT1), "SV");
  56. break;
  57. case MINI_GET_MVERSION:
  58. SlwTrace(INF, "GetModemVersion..",1);
  59. snprintf(SendAT, sizeof(SendAT), "AT+LCTSW\r\n");
  60. snprintf(WaitAT1, sizeof(WaitAT1), "InnerVersion:");
  61. break;
  62. case MINI_GET_POC_VER:
  63. SlwTrace(INF, "GetPocVersion..",1);
  64. snprintf(SendAT, sizeof(SendAT), "AT+POC_VER?\r\n");
  65. snprintf(WaitAT1, sizeof(WaitAT1), "+POC_VER:");
  66. break;
  67. case MINI_GET_POC_CODE:
  68. SlwTrace(INF, "GetPocCode..",1);
  69. snprintf(SendAT, sizeof(SendAT), "AT+POC=40000000\r\n");
  70. snprintf(WaitAT1, sizeof(WaitAT1), "+POC:400000000");
  71. break;
  72. case MINI_SET_TTS_SPEED1:
  73. case MINI_SET_TTS_SPEED2:
  74. SlwTrace(INF, "SetTTSSpeed..",1);
  75. ModemSendAt("AT+LSHTTSSPEED=-1,7000\r\n");
  76. snprintf(SendAT, sizeof(SendAT), "AT+LSHTTSSPEED?\r\n");
  77. snprintf(WaitAT1, sizeof(WaitAT1), "+LSHTTSSPEED:");
  78. break;
  79. case MINI_SET_SPK_MIC:
  80. SlwTrace(INF, "SetSpkMic..",1);
  81. SetDefaultSpkMic();
  82. snprintf(SendAT, sizeof(SendAT), "at+syscmd=start_pcm volume\r\n");
  83. if(1) snprintf(WaitAT1, sizeof(WaitAT1), "7 7");//这里1根据实际参数替换吧
  84. else snprintf(WaitAT1, sizeof(WaitAT1), "7 5");
  85. break;
  86. case MINI_GET_CARD:
  87. SlwTrace(INF, "GetCardStatus..",1);
  88. snprintf(SendAT, sizeof(SendAT), "AT+CPIN?\r\n");
  89. snprintf(WaitAT1, sizeof(WaitAT1), "+CPIN: READY");
  90. break;
  91. case MINI_GET_IMEI:
  92. SlwTrace(INF, "GetIMEI..",1);
  93. snprintf(SendAT, sizeof(SendAT), "AT+LSHIMEI\r\n");
  94. snprintf(WaitAT1, sizeof(WaitAT1), "+LSHIMEI:");
  95. break;
  96. case MINI_PLY_ICCID:
  97. SlwTrace(INF, "GetICCID..",1);
  98. snprintf(SendAT, sizeof(SendAT), "AT+ICCID\r\n");
  99. snprintf(WaitAT1, sizeof(WaitAT1), "^SCID:");
  100. break;
  101. case MINI_POC_PARA:
  102. SlwTrace(INF, "GetPOCPara..",1);
  103. snprintf(SendAT, sizeof(SendAT), "AT+POC=020000\r\n");
  104. snprintf(WaitAT1, sizeof(WaitAT1), "+POC:02");
  105. break;
  106. case MINI_SET_POC_SIMPLE:
  107. SlwTrace(INF, "SetPocSMode..",1);
  108. snprintf(SendAT, sizeof(SendAT), "AT+POC=10000020\r\n");
  109. snprintf(WaitAT1, sizeof(WaitAT1), "+POC:10000000");
  110. break;
  111. //+TONES:1
  112. case MINI_SET_TONES:
  113. SlwTrace(INF, "SetTones..",1);
  114. snprintf(SendAT, sizeof(SendAT), "AT+TONES=1\r\n");
  115. snprintf(WaitAT1, sizeof(WaitAT1), "+TONES:1");
  116. break;
  117. //MINI_SET_SPKLV
  118. case MINI_SET_SPKLV:
  119. timeOut=60;
  120. SlwTrace(INF, "SetSpklv",1);
  121. snprintf(SendAT, sizeof(SendAT), "AT+LVL?\r\n");
  122. snprintf(WaitAT1, sizeof(WaitAT1), "+LVL:");
  123. break;
  124. //MINI_SET_MICLV
  125. case MINI_SET_MICLV:
  126. timeOut=60;
  127. SlwTrace(INF, "SetMiclv",1);
  128. snprintf(SendAT, sizeof(SendAT), "AT+MIC?\r\n");
  129. snprintf(WaitAT1, sizeof(WaitAT1), "+MIC:");
  130. break;
  131. }
  132. }
  133. short ModemInitAckHandler(unsigned char result){
  134. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  135. char *msg=(char *)pMsg->MsgData;
  136. short ret=0;
  137. char buf[30];
  138. switch(initStatus){
  139. case MINI_WAT_START:
  140. if(result==1){
  141. SlwTrace(INF, "ModemStart...",1);
  142. ModemSendAt("ATE0\r\n");
  143. mInitSwitchStatus(MINI_CONFIRM_VER);
  144. }else ret=-1;
  145. break;
  146. case MINI_CONFIRM_VER:
  147. if(result != 1) SlwTrace(INF, "GetLCC fail",1); //
  148. else {
  149. if(ModemLCCCheck(msg)) ResetModem();
  150. }
  151. // //暂停POC
  152. // ModemSendAt("AT+POC=050000\r\n"); //
  153. // ret=-1;//天线测试版本
  154. //mInitSwitchStatus(MINI_GET_MODULE);
  155. mInitSwitchStatus(MINI_GET_POC_VER);
  156. break;
  157. case MINI_GET_MODULE:
  158. if(result != 1) SlwTrace(INF, "GetModemModule fail",1);
  159. else getModemModule(msg);
  160. mInitSwitchStatus(MINI_GET_POC_VER);
  161. break;
  162. // case MINI_GET_MVERSION:
  163. // if(result!=1) SlwTrace(INF, "GetModemVer fail",1);
  164. // else getModemVersion(msg);
  165. // mInitSwitchStatus(MINI_GET_POC_VER);
  166. // break;
  167. case MINI_GET_POC_VER:
  168. if(result!=1) SlwTrace(INF, "GetPocVer fail",1);
  169. else{
  170. ModemSendAt("AT+POC=050000\r\n");
  171. getPocVersion(msg);
  172. CheckPocType();
  173. //ModemOwnPocSet();
  174. }
  175. mInitSwitchStatus(MINI_SET_TTS_SPEED1);//();
  176. break;
  177. // case MINI_GET_POC_CODE:
  178. // if(result!=1) SlwTrace(INF, "GetPocCode fail",1);
  179. // else getPocCode(msg);
  180. // mInitSwitchStatus(MINI_SET_TTS_SPEED1);
  181. // break;
  182. case MINI_SET_TTS_SPEED1:
  183. if(result!=1) SlwTrace(INF, "Set TTs fail",1);
  184. else{
  185. if(7000 != atoi(&msg[13])){
  186. mInitSwitchStatus(MINI_SET_TTS_SPEED2);
  187. break;
  188. }else SlwTrace(INF, "SetTTSSpeed Ok",1);
  189. }
  190. mInitSwitchStatus(MINI_SET_SPKLV);
  191. break;
  192. case MINI_SET_SPKLV:
  193. if(result != 1) SlwTrace(INF, "SetSPKlv fail",1);
  194. else {
  195. SetSpkLvProcess(2);
  196. if(newPara.Spklv!=atoi(&msg[7])){
  197. snprintf(buf,sizeof(buf),"AT+LVL=4,%d\r\n",newPara.Spklv);//num
  198. printf(buf);
  199. ModemSendAt(buf);
  200. }
  201. SlwTrace(INF, "SetSPKlv OK",1);
  202. }
  203. // snprintf(buf,sizeof(buf),"AT+MIC=2,%d\r\n",newPara.Miclv);//num
  204. // printf(buf);
  205. // ModemSendAt(buf);
  206. //mInitSwitchStatus(MINI_SET_MICLV);
  207. mInitSwitchStatus(MINI_GET_CARD);
  208. break;
  209. case MINI_SET_MICLV:
  210. if(result != 1) SlwTrace(INF, "SetMiclv fail",1);
  211. else {
  212. if(newPara.Miclv!=atoi(&msg[5])){
  213. snprintf(buf,sizeof(buf),"AT+MIC=2,%d\r\n",newPara.Miclv);//num
  214. printf(buf);
  215. ModemSendAt(buf);
  216. }
  217. SlwTrace(INF, "SetMiclv OK",1);
  218. }
  219. mInitSwitchStatus(MINI_GET_CARD);
  220. break;
  221. case MINI_GET_CARD:
  222. if(result != 1){
  223. ret=-2;
  224. break;
  225. }else{
  226. //SpeakTTSVoice();
  227. SlwTrace(INF, "Card Ready",1);
  228. mInitSwitchStatus(MINI_PLY_ICCID);
  229. }
  230. break;
  231. // case MINI_GET_IMEI:
  232. // if(result != 1) SlwTrace(INF, "GetIMEI fail",1);
  233. // else{
  234. // ModemGetIMEI(msg);
  235. // }
  236. // mInitSwitchStatus(MINI_PLY_ICCID);
  237. // break;
  238. case MINI_PLY_ICCID:
  239. if(result != 1) SlwTrace(INF, "GetICCID fail",1);
  240. else{
  241. ModemGetICCID(msg);
  242. CodecFileInit();
  243. GetMododexWithCard();//后面加上去
  244. }
  245. mInitSwitchStatus(MINI_POC_PARA);
  246. break;
  247. case MINI_POC_PARA:
  248. if(result != 1) SlwTrace(INF, "GetPocPara fail",1);
  249. else ModemSetPocPara(msg,pMsg->MsgLen);
  250. ModemApnConfig();
  251. mInitSwitchStatus(MINI_SET_POC_SIMPLE);
  252. break;
  253. case MINI_SET_POC_SIMPLE:
  254. if(result != 1) SlwTrace(INF, "SetPocSMode fail",1);
  255. else SlwTrace(INF, "SetPocSMode Ok",1);
  256. snprintf(buf,sizeof(buf),"AT+MIC=2,%d\r\n",newPara.Miclv);//
  257. printf(buf);
  258. ModemSendAt(buf);
  259. ModemSendAt("AT+POC=030000\r\n");
  260. ret=1;
  261. break;
  262. }
  263. return ret;
  264. }
  265. PT_THREAD (ptModemInitTask(struct pt *pt))
  266. {
  267. static timer_t ptTimer;
  268. static unsigned char intCmd;
  269. static unsigned char status;
  270. static short i,t;
  271. short ret;
  272. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  273. PT_BEGIN(pt);
  274. while(1){
  275. M_RESTART:
  276. SlwTrace(INF,"ModemInit...",1);
  277. memset((unsigned char *)&sutPocStatus, 0, sizeof(SUT_POC_STATUS));
  278. SetLedIndicator(IndNoNet);
  279. modemInitReady=0;
  280. modemInitStatus=0;
  281. g_iPocVer=0;
  282. MsgQueueSet();
  283. MODEM_RESET_HIGH;
  284. PTTimerStart(&pt_timerPool, &ptTimer, 200);
  285. PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
  286. MODEM_RESET_LOW;
  287. // MODEM_PWRKEY_HIGH;
  288. MODEM_PWREN_HIGH;
  289. PTTimerStart(&pt_timerPool, &ptTimer, 120);
  290. PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
  291. //MODEM_PWRKEY_LOW;
  292. MODEM_PWREN_LOW;
  293. //goto SEND_GET_RET;
  294. mInitSwitchStatus(MINI_WAT_START);
  295. modemInitReady=1;
  296. SEND_WAIT_PRO:
  297. status=0;
  298. for(i=0;i<timeOut;i++){//共等60*500=30000ms
  299. ModemSendAt(SendAT);
  300. t=25;//以下等20*25=500ms
  301. while(t--){
  302. if(g_ucEnterGTNow!=0) goto INIT_DONE;//使得GT可以直接跳出初始化过程
  303. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))){
  304. //printf("Ack:%s",pMsg->MsgData);调试
  305. if(0==ModemStrCmp((char *)pMsg->MsgData,WaitAT1) ||
  306. 0==ModemStrCmp((char *)pMsg->MsgData,WaitAT2)){
  307. //if(sutPocStatus.modemRstFlag !=0) goto M_RESTART;//用于3合一切换版本
  308. status=1;
  309. goto SEND_GET_RET;
  310. }
  311. }else{
  312. PTTimerStart(&pt_timerPool, &ptTimer, 2);
  313. PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
  314. }
  315. }
  316. }
  317. SEND_GET_RET:
  318. ret=ModemInitAckHandler(status);
  319. //ret=-1;
  320. if(ret ==0) goto SEND_WAIT_PRO;
  321. else if(ret<0){//模块启动失败/卡不在
  322. if(ret==-1){
  323. SlwTrace(INF, "ModemInitTimeout GT Mode",1);
  324. EnterGTMode();
  325. }else if(ret==-2){
  326. SlwTrace(INF, "insert card error----",1);
  327. sutPocStatus.loginResult=4;
  328. }
  329. }
  330. INIT_DONE:
  331. //初始化完成
  332. modemInitStatus=1;//可以消耗模块消息队列了
  333. g_ucModemTaskEn=1;
  334. PTTimerStart(&pt_timerPool, &ptTimer, 200);
  335. PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
  336. SpeakTTSVoice();//cat4 配置完音量需要延时方可播报,实属无奈
  337. //ModemSendAt("AT+AUDCH=1\r\n");
  338. while(1){
  339. if(sutPocStatus.modemRstFlag !=0) goto M_RESTART;
  340. sutPocStatus.ModemInactiveCt=0;
  341. PTTimerStart(&pt_timerPool, &ptTimer, 100);//100
  342. PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
  343. }
  344. }
  345. PT_END(pt);
  346. }
  347. void InfoTick(void){
  348. static unsigned int tick;
  349. if(g_ucEnterGTNow) return;
  350. if(uTimerExpired(&tick)){
  351. uTimerStart(&tick, 500);
  352. printf("Info:Auth[%d],GT[%d],MI[%d],UI[%d]\r\n",sutGpsInfo.isGpsAuthOk,g_ucEnterGTNow,modemInitStatus,sutUIstatus.Status);
  353. }
  354. }
  355. static void AtHandle(char *msg);
  356. void ModemATProcess(void){
  357. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  358. if(modemInitStatus==0) return;
  359. while(1){
  360. pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData));
  361. if(pMsg->MsgLen>0){
  362. if(g_ucEnterGTNow!=0) continue;//如果进入GT模式,不需要处理模块消息了
  363. SlwTrace(INF, (char *)pMsg->MsgData,0);
  364. sutPocStatus.ModemInactiveCt=0;
  365. if(pMsg->MsgData[0]=='+' || pMsg->MsgData[0] == '^'){
  366. if(1 == PocHandle((char *)pMsg->MsgData)) continue;
  367. AtHandle((char *)pMsg->MsgData);
  368. }
  369. continue;
  370. }else if(pMsg->MsgLen<0){
  371. SlwTrace(INF, "QueueF1",1);
  372. continue;
  373. }
  374. break;
  375. }
  376. }
  377. void ModemLedCtl(void){
  378. if(g_ucModemTaskEn==0||g_ucEnterGTNow!=0) return;
  379. if(0==sutPocStatus.Logined)SetLedIndicator(IndNoNet);
  380. else if(sutPocStatus.Speaker>0)SetLedIndicator(IndRX);
  381. else if(sutPocStatus.Mic>0 && sutPocStatus.PPTpress>0)SetLedIndicator(IndTX);
  382. else SetLedIndicator(IndStandby);
  383. }
  384. static void AtHandle(char *pMsg)
  385. {
  386. int csq;
  387. short targetIndex;
  388. unsigned char tempSocket,i,temp;
  389. unsigned short tempLen;
  390. char buf[80]="\r\n";
  391. char bufTemp[3];
  392. char buf3[40];
  393. STATUE ipStatus;
  394. if(0==ModemStrCmp(pMsg,"^SYSINFO:")){
  395. if(pMsg[15]!=','){
  396. netshowvalue=atoi(&pMsg[15]);
  397. }else{
  398. netshowvalue=atoi(&pMsg[16]);
  399. }
  400. }else if(0==ModemStrCmp(pMsg,"+CSQ:"))
  401. {
  402. g_iCSQ=atoi(&pMsg[6]);
  403. }else if(0==ModemStrCmp(pMsg,"+MODODREX:")){
  404. Mododrex_Net=atoi(&pMsg[11]);
  405. snprintf(buf3,sizeof(buf3),"Mododrex_Netvalue=%d\r\n",Mododrex_Net);
  406. SlwTrace(INF, buf3,1);
  407. }else if(0==ModemStrCmp(pMsg,"+POC_PPP:")){
  408. if(pMsg[9]=='1') netPPP=OPEN;
  409. else netPPP=CLOSE;
  410. }else if(0==ModemStrCmp(pMsg,"+TCPSTATUS:")){
  411. tcpSocketStatusUpdate(pMsg[11],pMsg[13],0);
  412. }else if(0==ModemStrCmp(pMsg,"+TCPRECV:")){//+TCPRECV:0,2,31
  413. if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ":", 1,1))){
  414. tempSocket = atoi(&pMsg[targetIndex]);//找到socket
  415. if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ",",1,1))){
  416. tempLen = atoi(&pMsg[targetIndex]);
  417. if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ",",1,2))){
  418. tcpSocketRecv(tempSocket, &pMsg[targetIndex], tempLen);
  419. }
  420. }
  421. }
  422. }else if(0==ModemStrCmp(pMsg,"+TCPOPEN:")){
  423. tcpSocketStatusUpdate(pMsg[9],pMsg[11],0);
  424. }else if(0==ModemStrCmp(pMsg, "+TCPCLOSE:")){//主动关掉或者服务器关掉都是这样
  425. tcpSocketStatusUpdate(pMsg[10],NULL,1);
  426. }else if(0==ModemStrCmp(pMsg, "+CCLK:"))
  427. {//+CCLK: "17/09/28,04:48:35"
  428. //+CCLK: "80/01/06,00:10:44"
  429. //+CCLK: "17/10/19,07:22:35"
  430. // g_usModeYTime=atoi(&pMsg[8]);
  431. // g_usModemTime=atoi(&pMsg[11]);
  432. // g_usModeDTime=atoi(&pMsg[14]);
  433. // g_usModeHTime=atoi(&pMsg[17])+8;
  434. // if(g_usModeHTime >= 24) g_usModeHTime -= 24;
  435. // g_usModeMTime=atoi(&pMsg[20]);
  436. // g_usModeSTime=atoi(&pMsg[23]);
  437. // SetTime(g_usModeHTime, g_usModeMTime, g_usModeSTime);//保存下来,以便下次启动,没登陆前可以使用本地时间显示
  438. // SlwTrace(INF, "UpdateTime",1);
  439. }else if(0==ModemStrCmp(pMsg, "^MODE:"))
  440. {//^MODE: 9 与下面位置不一,模块问题
  441. //^MODE:2 与上面位置不一,模块问题
  442. if(pMsg[6] == ' ') bufTemp[0]=pMsg[7];
  443. else bufTemp[0]=pMsg[6];
  444. snprintf(buf, sizeof(buf), "[Mode %c]", bufTemp[0]);
  445. switch(bufTemp[0])
  446. {
  447. case 0x30:strcat(buf, "No server");break;
  448. case 0x32:strcat(buf, "CDMA Mode");break;
  449. case 0x33:strcat(buf, "GSM");break;
  450. case 0x34:strcat(buf, "TD-SCDMA/EVDO");break;
  451. case 0x35:strcat(buf, "WCDMA");break;
  452. case 0x39:strcat(buf, "LTE");break;
  453. default:strcat(buf, "Unknow");break;
  454. }
  455. SlwTrace(INF, buf, 1);
  456. }else if(0==ModemStrCmp(pMsg, "+POC:START"))
  457. {
  458. sutPocStatus.modemRstFlag=1;
  459. sutPocStatus.ModemInactiveCt=0;//当模块重启后重新计数串口通讯异常计数器
  460. }
  461. else if(0==ModemStrCmp(pMsg, "+GGIP:"))
  462. { //GSPIP返回
  463. if(newPara.serList.defaultuse==SER_JIQUN||newPara.serList.defaultuse==SER_IP)chekPipGip(pMsg,1);
  464. }else if(0==ModemStrCmp(pMsg, "+GPIP:"))
  465. {
  466. if(newPara.serList.defaultuse==SER_JIQUN||newPara.serList.defaultuse==SER_IP)chekPipGip(pMsg,0);
  467. }else if(0==ModemStrCmp(pMsg, "+FOTA:")){
  468. FotaStatusProcess(pMsg+6);
  469. uTimerStart(&fotaTick,10);
  470. }else if(0==ModemStrCmp(pMsg, "+POC:WAKEUP")){
  471. enableDataSend();
  472. }else if(0==ModemStrCmp(pMsg, "+UDP:")){
  473. GetPwrMode(pMsg+5);
  474. }else if(0==ModemStrCmp(pMsg, "+AUDCH"))//
  475. {
  476. }else if(0==ModemStrCmp(pMsg,"+CTEC:"))
  477. {
  478. tempnetshowvalue=atoi(&pMsg[7]);
  479. if(newPara.netMode!=tempnetshowvalue){
  480. snprintf(buf,sizeof(buf),"AT+CTEC=%d,%d\r\n",tempnetshowvalue,newPara.netMode);
  481. ModemSendAt(buf);
  482. }
  483. }else if(0==ModemStrCmp(pMsg,"+COPS")){
  484. netshowvalue=atoi(FindContentByChar(pMsg,',',3,buf));
  485. }
  486. }
  487. ////+COPS: 0,2,"46011",7
  488. //char FindContentByChar( char *src,char c, char index)
  489. //{
  490. // char i;
  491. // char j=0;
  492. // for(i=0;i<strlen(src);i++)
  493. // {
  494. // if(src[i]==c)j++;
  495. // if(j==index)
  496. // return i+1;
  497. // }
  498. //}
  499. char *FindContentByChar( char *src,char c, char index,char *dest)
  500. {
  501. char i;
  502. char j=0;
  503. char *p=dest;
  504. for(i=0;i<strlen(src);i++)
  505. {
  506. if(src[i]==c)j++;
  507. if(j==index){
  508. p=&src[i+1];
  509. return p;
  510. }
  511. }
  512. }
  513. void chekPipGip(char *src,char type)
  514. {
  515. char buf[40];
  516. char *p;
  517. p=src+6;
  518. if(!type)snprintf(buf,sizeof(buf),"+GPIP:%s\r\n",showPIP);
  519. else snprintf(buf,sizeof(buf),"+GGIP:%s\r\n",showGIP);
  520. 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 ;
  521. sutGpsInfo.isGpsAuthOk=0;// 重新鉴权
  522. if(!type){
  523. memcpy(showPIP,p,strlen(p)-2);
  524. showPIP[strlen(p)-2]=0;
  525. printf("get new PIP====%s\r\n",showPIP);
  526. }else{
  527. memcpy(showGIP,p,strlen(p)-2);
  528. showGIP[strlen(p)-2]=0;
  529. printf("get new GIP====%s\r\n",showGIP);
  530. strcpy(gSocket.socketList[0].Ip,showGIP);
  531. }
  532. }
  533. void SpeakTTSVoice(void)
  534. {
  535. int len,timeout,i;
  536. char ttsMessage[20*4];
  537. //SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  538. unsigned char codeType=ENCODE_UNICODE;
  539. if(newPara.ttsMessage[0]==0) return;
  540. len=strlen(newPara.ttsMessage);
  541. len = len+(8-len%8);//8倍数
  542. if(newPara.ttsCodeType==TTS_UNICODE)
  543. {
  544. codeType=ENCODE_UNICODEBigend;
  545. for(i=0;i<len;i+=4){
  546. ttsMessage[i]=newPara.ttsMessage[i+2];
  547. ttsMessage[i+1]=newPara.ttsMessage[i+3];
  548. ttsMessage[i+2]=newPara.ttsMessage[i];
  549. ttsMessage[i+3]=newPara.ttsMessage[i+1];
  550. printf("%c",ttsMessage[i]);
  551. printf("%c",ttsMessage[i+1]);
  552. printf("%c",ttsMessage[i+2]);
  553. printf("%c",ttsMessage[i+3]);
  554. }
  555. ttsMessage[len-1]=0;
  556. printf("\r\n");
  557. }else if(newPara.ttsCodeType==TTS_GBK) codeType=ENCODE_ASCII;
  558. MeSpeak(codeType,ttsMessage);
  559. }
  560. char GetCodecFromSrc(char *src, char index,char *name, char *pass)
  561. {
  562. char target[15];
  563. char finalData[62];
  564. char buf[30];
  565. unsigned char tempLen,i,j;
  566. j=0;
  567. index +=1;
  568. snprintf(target, sizeof(target), "CODEC%03d", index);
  569. SlwTrace(INF,target,0);
  570. tempLen=GetParaFromStr(src, target, finalData);
  571. // printf("tempLen==%d\r\n",tempLen);
  572. // SlwTrace(INF,finalData,1);
  573. if(tempLen == 0) return 0;
  574. for(i=0;i<tempLen;i++)
  575. {
  576. if(finalData[i]==',')
  577. {
  578. j=i+1;
  579. finalData[i]=0;
  580. i=tempLen;
  581. }
  582. }
  583. tempLen=strlen(finalData);
  584. if(tempLen>30) tempLen=30;
  585. memcpy(name, finalData, tempLen);
  586. name[tempLen]=0;
  587. sprintf(buf,"===%s",name);
  588. SlwTrace(INF,buf,0);
  589. //
  590. tempLen=strlen(finalData+j);
  591. if(tempLen>30) tempLen=30;
  592. memcpy(pass, finalData+j, tempLen);
  593. pass[tempLen]=0;
  594. sprintf(buf,"===%s",pass);
  595. SlwTrace(INF,buf,1);
  596. return 1;
  597. }
  598. int CodecFileInit(void)
  599. {
  600. int len;
  601. char tempData[40];
  602. char name[10];
  603. char pass[10];
  604. char buf[40];
  605. char CodecFileIndex=0;
  606. int tempLen,i;
  607. char ret=0;
  608. CodecFileIndex=GetFileIndex("codec.ini");
  609. if(CodecFileIndex == -1)
  610. {
  611. printf("No codec.ini file\r\n");
  612. codec_param.CodecNum=0;
  613. return -1;
  614. }
  615. len=GetFileLen(CodecFileIndex);
  616. if(len==0)
  617. {
  618. printf("codec.ini empty\r\n");
  619. return-2;
  620. }
  621. // //读出数据
  622. // if(HgsApnLen > sizeof(tempData))
  623. // {
  624. // printf("codec.ini len=%d,should <=%d\r\n",HgsApnLen,sizeof(tempData));
  625. // HgsApnLen=sizeof(tempData);
  626. // }
  627. //REG_NUM=005;
  628. tempLen=ReadFileData(CodecFileIndex,0,14,(u8*)tempData); //文件,start地址,长度 ,返回数据
  629. tempLen=GetParaFromStr(tempData, "REG_NUM", name);
  630. if(tempLen==0)
  631. {
  632. printf("No 'REG_NUM'\r\n");
  633. return -2;
  634. }else{
  635. codec_param.CodecNum=atoi(name);
  636. if(codec_param.CodecNum>CODEC_NUM){
  637. printf("REG_NUM OVER:%d\r\n", codec_param.CodecNum);
  638. codec_param.CodecNum=0;
  639. return -3;
  640. }
  641. }
  642. printf("REG_NUM:%d\r\n", codec_param.CodecNum);
  643. //读出数据
  644. for(i=0;i<codec_param.CodecNum;i++)
  645. {
  646. tempLen=ReadFileData(CodecFileIndex,14+21*i,21,(u8*)tempData);
  647. //printf("temp====%d\r\n",tempLen);
  648. memcpy(buf,tempData,tempLen);
  649. buf[tempLen]=0;
  650. //SlwTrace(INF,buf,1);
  651. if(0==GetCodecFromSrc(buf, i, name,pass))//tempData
  652. {
  653. //获取失败,恢复默认
  654. SlwTrace(INF,"cant find index\r\n",1);
  655. codec_param.CodecNum=0;
  656. return -4;
  657. }else{
  658. // ret=ModemSetCodec(atoi(name),atoi(pass));
  659. // if(ret!=0)printf("SET CodecErroAddr=%02x\r\n",ret);
  660. sprintf(buf,"AT+CODEC=3,%2x,%4x\r\n",atoi(name),atoi(pass));
  661. ModemSendAt(buf);
  662. }
  663. uTimerHardDly(50);
  664. IWDG_ReloadCounter();
  665. }
  666. return 0;
  667. }