GpsTask.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712
  1. /********************************************************************************
  2. * File Name: GpsTask.c
  3. * Function Describe:The GpsTask for the system
  4. * Relate Module:
  5. * Explain: Hardware version is HS110C
  6. * Writer: ShiLiangWen
  7. * Date: 2015.4.12
  8. *******************************************************************************/
  9. #define THIS_FILE_ID 16
  10. //--------------------------------------------------------------------------------
  11. #include "includes.h"
  12. SUT_GPS_STATUS sutGpsStatus;
  13. int g_iCSQ=-1;
  14. unsigned int SendFlag=0;
  15. unsigned char sucGpsSentTcpCt=0;//从启动发送到收到计数器
  16. unsigned int heartTickCt=0;
  17. //======================================
  18. static STATUE GpsServerStatus=CLOSE;
  19. /*******************************************************************************
  20. 校验
  21. *******************************************************************************/
  22. unsigned char GetCheck(unsigned char *data, unsigned short datalen)
  23. {
  24. unsigned char ck=0;
  25. int i;
  26. for(i=0;i<datalen;i++){
  27. ck^=data[i];
  28. }
  29. return ck;
  30. }
  31. /*******************************************************************
  32. *GetCSQ
  33. ********************************************************************/
  34. int GetCSQ(char* msg)
  35. {//+CSQ: 29,56
  36. return atoi(&msg[6]);
  37. }
  38. int GetCCSQ(char* msg)
  39. {//+CCSQ: 29,56
  40. return atoi(&msg[7]);
  41. }
  42. /*******************************************************************
  43. *GetPPPStatus
  44. ********************************************************************/
  45. STATUE GetPPPStatus(char *msg)
  46. {//+POC_PPP:0
  47. //+POC_PPP:1
  48. if(msg[9]=='1')
  49. {
  50. sutPocStatus.PPPed=1;
  51. if(++sutPocStatus.PPPedCt>6) sutPocStatus.PPPedCt=8;
  52. return OPEN;
  53. }
  54. else{
  55. if(++sutPocStatus.PPPedCt>6) sutPocStatus.PPPedCt=8;
  56. return CLOSE;
  57. }
  58. }
  59. //检测已打开的socket列表,返回要查询的socket状态
  60. //如果newCheck为1,则根据msg重新判断状态
  61. //如果newCheck为0,则根据静态变量返回状态
  62. //checkSocket, 需要检测的socket(1-10)
  63. STATUE GetIPNewStatus(char *msg, unsigned char newCheck, unsigned char checkSocket)
  64. {//+MIPOPEN:1,2,3,4,5,6,7,8,9,10
  65. static unsigned char socketListStatus[10];//只支持1-10
  66. unsigned char i;
  67. unsigned char socket;
  68. char *ptr;
  69. unsigned char len,size;
  70. size=sizeof(socketListStatus);
  71. ptr = msg+9;
  72. len = strlen(ptr);
  73. if(newCheck)
  74. {
  75. memset(socketListStatus, 1, size);//1默认为在使用
  76. socket = atoi(ptr);//第1个socket值,并不一定是socket1,要检测一下如果都没打开,这指令回来列表是什么
  77. if(socket <= sizeof(socketListStatus))
  78. socketListStatus[socket-1]=0;//有值,则为空闲
  79. for(i=0;i<len;i++)
  80. {
  81. if(ptr[i] == ',')
  82. {//找到一个打开的socket
  83. i++;
  84. socket = atoi(&ptr[i]);
  85. if(socket <= size)
  86. socketListStatus[socket-1]=0;
  87. }
  88. }
  89. }
  90. //判断要检测的socket状态
  91. socket = checkSocket-1;
  92. if(socketListStatus[socket] == 1) return OPEN;
  93. else return CLOSE;
  94. }
  95. /*******************************************************************
  96. *GetIPStatusu
  97. ********************************************************************/
  98. STATUE GetIPNewStatus2(char *msg, unsigned char socketNum)
  99. {//+TCPSTATUS:x:s [socket: status]
  100. //+TCPSTATUS:1:1
  101. STATUE sta=CLOSE;
  102. unsigned char thisSocket;
  103. thisSocket = atoi(&msg[11]);
  104. if(msg[13] == '1') sta = OPEN;
  105. if(thisSocket == socketNum) return sta;
  106. else return CLOSE;
  107. }
  108. /*******************************************************************
  109. *GetCNUM
  110. 返回:0--未获取 1--获取成功
  111. ********************************************************************/
  112. int GetCNUM(void)
  113. {
  114. /*
  115. int timerout=300;
  116. int i,len;
  117. char *msg;
  118. INT8U err;
  119. int ct=100;
  120. while(timerout){
  121. timerout--;
  122. if(++ct>100){
  123. ct=0;
  124. ModemSendAT("AT+CNUM?\r\n");
  125. OSQFlush(ModemQ);
  126. }
  127. msg = (char *)OSQPend(ModemQ, 1, &err);
  128. if(err==OS_ERR_NONE){
  129. if(ModemStrCmp(msg,"+CNUM:")){ //+CNUM:1064910139657
  130. len=strlen(&msg[6]);
  131. if(15==len){
  132. for(i=0;i<13;i++)sutProductPara.CNUM[i]=msg[6+i];
  133. sutNetPara.CNUM[13]=0;
  134. return 1;
  135. }
  136. }
  137. }
  138. }*/
  139. return 0;
  140. }
  141. /*******************************************************************
  142. *GetIPStatus
  143. 返回:0--未获取 1--获取成功
  144. ********************************************************************/
  145. int GetUIMID(void)
  146. {
  147. /*
  148. int timerout=300;
  149. int i,len;
  150. char *msg;
  151. INT8U err;
  152. int ct=100;
  153. while(timerout){
  154. timerout--;
  155. if(++ct>100){
  156. ct=0;
  157. ModemSendAT("AT+CIMI\r\n");
  158. OSQFlush(ModemQ);
  159. }
  160. msg = (char *)OSQPend(ModemQ, 1, &err);
  161. if(err==OS_ERR_NONE){
  162. if(ModemStrCmp(msg,"+CIMI:")){ //+CIMI: 460037590079119
  163. len=strlen(&msg[7]);
  164. if(17==len){
  165. for(i=0;i<15;i++)sutNetPara.UIMID[i]=msg[7+i];
  166. sutNetPara.UIMID[15]=0;
  167. return 1;
  168. }
  169. }
  170. }
  171. }
  172. */
  173. return 0;
  174. }
  175. void GetDNSIP(char *msg)
  176. {
  177. // if(msg[12]!='F' && msg[13]!='a' && msg[14]!='i'){//+ZDNSGETIP: failed
  178. // HigosSendFlag =1;
  179. // HgsConnetFlag=3;
  180. // }else{
  181. // sutGpsStatus.PPPStatus=CLOSE;
  182. // ModemSendAT("AT+ZPPPCLOSE\n\r");
  183. // }
  184. }
  185. void MC8332_GPS_RecvHandle(unsigned char *pMsg,unsigned short tempLen)
  186. {
  187. char buf[20];
  188. char buf2[50];
  189. char result[10];
  190. unsigned short cmd,ackCmd,smsLen;
  191. unsigned char Result,i,buBiaoResponsed;
  192. short targetIndex;
  193. ////////////////////////////////////////////
  194. // char buftest[100];
  195. // char buf22[3];
  196. // for(i=0;i<25;i++)
  197. // {
  198. // sprintf(buf22, "%02x", pMsg[i]);
  199. // strcat(buftest, buf22);
  200. // }
  201. // strcat(buftest, "\r\n");
  202. // SlwTrace(INF, buftest);
  203. ////////////////////////////////////////////
  204. //////////处理布标类型指令
  205. cmd = (pMsg[1]<<8) | (pMsg[2]&0xff);
  206. buBiaoResponsed=1;
  207. sprintf(buf2, "\r\ncmd=%04x", cmd);
  208. SlwTrace(INF, buf2,1);
  209. switch(cmd)
  210. {//布标命令返回
  211. case TS_TERMINAL_REGISTRATION_REPLY://终端注册应答
  212. //7E 8100 000A 000166000016 0250 0100 00 20161118165030 E07E 成功
  213. //7E 8100 0003 000166000016 0251 0100 01 A07E 已注册
  214. Result = pMsg[15];
  215. sprintf(buf2, "result=%02x", Result);
  216. SlwTrace(INF, buf2,1);
  217. switch(Result)
  218. {
  219. case 0://00注册成功
  220. for(i =0; i < 7; i++)
  221. sutNewSegmentPara.AutH[i]=pMsg[16+i];
  222. SaveNewSegmentToFlash();
  223. sprintf(result, "Ok");
  224. break;
  225. case 1://01 车辆已注册
  226. sprintf(result, "Car Exist");break;
  227. case 2://02 无此车辆
  228. sprintf(result, "No car");break;
  229. case 3://03 终端已经被注册
  230. sprintf(result, "Device Exist");break;
  231. case 4://04 数据库无此终端
  232. sprintf(result, "No Record");break;
  233. default://无效值
  234. //统称失败
  235. sprintf(result, "Faile");
  236. break;
  237. }
  238. sprintf(buf2, "[Register]%d %s", Result,result);
  239. SlwTrace(INF, buf2,1);
  240. //注册应答后直接进行一次鉴权
  241. Authentication();
  242. break;
  243. case TS_TEXT_INFORMATION_ISSUED://文本下发
  244. //7E83000005000166000009000001 31323334ED7E
  245. //7e83000005000000000000000001 36323131837e
  246. smsLen = pMsg[3];
  247. smsLen <<= 8;
  248. smsLen &= 0xff00;
  249. smsLen |= pMsg[4];
  250. smsLen -= 1;//去掉后面较验码
  251. if(SMS_SIGNAL_LEN <= smsLen)
  252. smsLen = SMS_SIGNAL_LEN;
  253. memset(sutMess.GBKMess1, 0, sizeof(sutMess.GBKMess1));
  254. memcpy(sutMess.GBKMess1, pMsg+14, smsLen);
  255. sutMess.len = smsLen;
  256. if(sutMess.len > 0)
  257. SetGotNewMessage();
  258. break;
  259. case TS_PLATFORM_UNIVERSAL_ANSWER://通用平台应答
  260. //7E8001000500016600001602400000010201B57E
  261. //buf[0]=0x7e;
  262. //if(-1 != (targetIndex=FindTargetIndex((char *)pMsg, '\r', buf, 1,2)))
  263. targetIndex = tempLen;//这个长度是去掉了两个7E的长度
  264. {
  265. ackCmd=(pMsg[targetIndex-3]<<8) | (pMsg[targetIndex-2]&0xff);
  266. Result = pMsg[targetIndex-1];
  267. sprintf(buf2, "Len=%d,ackCmd=%04x,result=%02x", tempLen,ackCmd,Result);
  268. SlwTrace(INF, buf2,1);
  269. switch(ackCmd)
  270. {
  271. case TS_TERMINAL_AUTHENTICATION://终端鉴权应答
  272. if(Result == 0)
  273. {//鉴权成功
  274. sutGpsInfo.isGpsAuthOk=1;
  275. sprintf(buf2, "[ATH]Ok");
  276. sutGpsInfo.GPS_SecondCnt=60;//鉴权通过后马上可以发位置或心跳
  277. }else
  278. {
  279. sutGpsInfo.isGpsAuthOk=0;
  280. sprintf(buf2, "[ATH]Faile");
  281. }
  282. SlwTrace(INF, buf2,1);
  283. break;
  284. case TS_LOCATION_INFORMATION_REPORTING://位置包应答
  285. SlwTrace(INF, "Location ACK",1);
  286. break;
  287. case TS_TERMINAL_HEARTBEAT://心跳应答
  288. SlwTrace(INF, "HearTick ACK",1);
  289. break;
  290. }
  291. }
  292. break;
  293. case TS_TERMINAL_GPSTIME: //GPS 下发上传时间
  294. sutNewSegmentPara.SendGpsTime=pMsg[13];
  295. printf("sutNewSegmentPara.SendGpsTime=============%d\r\n",sutNewSegmentPara.SendGpsTime);
  296. SaveNewSegmentToFlash();
  297. break;
  298. default:
  299. buBiaoResponsed=0;
  300. break;
  301. }
  302. if(buBiaoResponsed)
  303. g_ucModemSentTcpCt=0;
  304. /////////////处理其它类型指令
  305. }
  306. void AtHandle(char *pMsg)
  307. {
  308. int csq;
  309. short targetIndex;
  310. unsigned char tempSocket,i,temp;
  311. unsigned short tempLen;
  312. char buf[80]="\r\n";
  313. char bufTemp[3];
  314. if(0==ModemStrCmp(pMsg,"+CCSQ:"))
  315. {
  316. UpdateCsqValue(GetCCSQ(pMsg));
  317. }else if(0==ModemStrCmp(pMsg,"+CSQ:"))
  318. {
  319. UpdateCsqValue(GetCSQ(pMsg));
  320. }else if(0==ModemStrCmp(pMsg,"+POC_PPP:")){
  321. sutGpsStatus.PPPStatus=GetPPPStatus(pMsg);
  322. }else if(0==ModemStrCmp(pMsg,"+TCPSTATUS:"))
  323. {//查询指令返回状态
  324. if(tcpControl ==2)//控制配置服务器操作
  325. {
  326. #if(USE_CONFIG_FUN==1)
  327. if(OPEN == GetIPNewStatus2(pMsg,CONFIG_SER_SOCKET)) sutConfig.g_ubConfigTcpStatus = 1;
  328. else
  329. {
  330. if(sutConfig.g_ubConfigTcpStatus) sutConfig.g_ucTcpRetryNum=CONFIG_TCP_RETRY_CNT;
  331. sutConfig.g_ubConfigTcpStatus = 0;
  332. }
  333. #endif
  334. }else
  335. {
  336. GetIPNewStatus2(pMsg,GPS_DATA_SOCKET);
  337. if(tcpControl == 1)
  338. {
  339. sutGpsStatus.IPStatus=GetIPNewStatus2(pMsg,GPS_DATA_SOCKET);
  340. if(sutGpsStatus.IPStatus == CLOSE) sutGpsInfo.isGpsAuthOk=0;//鉴权清掉,再次连接后要重新鉴权
  341. }else if(tcpControl == 0)
  342. {//HGS
  343. if(OPEN == sutGpsStatus.IPStatus)
  344. HgsConnetStatus=1;
  345. }
  346. }
  347. }else if(0==ModemStrCmp(pMsg,"+TCPRECV:")){//+TCPRECV:0,2,31
  348. if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ":", 1,1)))
  349. {
  350. tempSocket = atoi(&pMsg[targetIndex]);//找到socket
  351. if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ",",1,1)))
  352. {
  353. tempLen = atoi(&pMsg[targetIndex]);
  354. if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ",",1,2)))
  355. {
  356. // if(changeDataFormat(&pMsg[targetIndex],tempLen))
  357. // {
  358. // SlwTrace(INF, "DataFormat Err",1);
  359. // return;
  360. // }
  361. if(tempSocket == GPS_DATA_SOCKET)
  362. {
  363. if(tcpControl == 0)
  364. {
  365. Hgs_Data_RecvHandle(&pMsg[targetIndex],tempLen);
  366. }else if(tcpControl == 1)
  367. {
  368. //走布标判断
  369. if(pMsg[targetIndex] == 0x7e && pMsg[targetIndex+tempLen-1] == 0x7e)
  370. {//是布标协议,进行转义
  371. tempLen=reduce((unsigned char *)&pMsg[targetIndex+1], tempLen-1);
  372. MC8332_GPS_RecvHandle((unsigned char *)&pMsg[targetIndex],tempLen);
  373. }else
  374. {
  375. SlwTrace(INF, "Unknown Protocol",1);
  376. }
  377. }
  378. /////////////////////////////////////////
  379. #if 0
  380. tempLen += 2;
  381. if(tempLen > 30) tempLen=30;
  382. for(i=0;i<tempLen;i++)
  383. {
  384. sprintf(bufTemp, "%02x", pMsg[targetIndex+i]);
  385. strcat(buf, bufTemp);
  386. }
  387. //strcat(buf, "\r\n");
  388. SlwTrace(INF, buf,1);
  389. #endif
  390. /////////////////////////////////////////
  391. }else if(tempSocket == CONFIG_SER_SOCKET)
  392. {
  393. Hgs_Data_RecvHandle(&pMsg[targetIndex],tempLen);
  394. }
  395. else
  396. {
  397. //if(tempSocket == HGS_SERVER_SOCKET)
  398. //Hgs_Data_RecvHandle(&pMsg[targetIndex]);
  399. }
  400. }
  401. }
  402. }
  403. }else if(0==ModemStrCmp(pMsg,"+TCPOPEN:"))//连接指令返回状态
  404. { //+TCPOPEN:OK
  405. //+TCPOPEN:Already connected
  406. if((pMsg[9] == 'O' && pMsg[10] == 'K') ||
  407. (pMsg[9] == 'A' && pMsg[14] == 'd' && pMsg[23] =='t'))
  408. {
  409. if(tcpControl == 0)
  410. {
  411. HgsConnetStatus=1;
  412. HigosSendFlag=0;
  413. }else if(tcpControl== 1)
  414. {
  415. sutGpsStatus.IPStatus = OPEN;
  416. }else if(tcpControl == 2)
  417. {
  418. #if(USE_CONFIG_FUN==1)
  419. sutConfig.g_ubConfigTcpStatus=1;
  420. #endif
  421. }
  422. }
  423. }else if(0==ModemStrCmp(pMsg, "+TCPCLOSE:OK"))
  424. {
  425. }else if(0==ModemStrCmp(pMsg, "+TCPCLOSE:"))
  426. {//主动关掉或者服务器关掉都是这样
  427. if(tcpControl== 0)
  428. {
  429. if(pMsg[10] == GPS_DATA_SOCKET+0x30)
  430. {
  431. if(HgsConnetStatus != 2)
  432. HgsConnetStatus=0;
  433. }
  434. }else if(tcpControl == 2)
  435. {
  436. #if(USE_CONFIG_FUN==1)
  437. if(sutConfig.g_ubConfigTcpStatus) sutConfig.g_ucTcpRetryNum=CONFIG_TCP_RETRY_CNT;
  438. sutConfig.g_ubConfigTcpStatus = 0;
  439. #endif
  440. }
  441. }else if(0==ModemStrCmp(pMsg, "+POC:START"))
  442. {
  443. sutPocStatus.modemRstFlag=1;
  444. }
  445. }
  446. /***********************************************************
  447. *控制发送位置信息
  448. 此函数每秒执行一次
  449. ************************************************************/
  450. void GpsCtrlSendPos(void)
  451. {
  452. static unsigned char authTryTime=0;//发起鉴权次数,也代表连续失败多少次
  453. static unsigned short SendTime=0;
  454. uint32_t AvgSpeed;
  455. int i;
  456. static unsigned short susGpsTimingSendCt=0;//控制按时间发送
  457. //static unsigned short sucGpsSentTcpCt=0;//从启动发送到收到计数器
  458. char buf[30];
  459. //连续发3次未见成功,则断开链接并重启链接
  460. if(g_ucModemSentTcpCt>3){
  461. sutGpsInfo.isServerLogin=0;
  462. g_ucModemSentTcpCt=0;
  463. sprintf(buf, "AT+TCPCLOSE=%d\r\n", GPS_DATA_SOCKET);
  464. ModemSendAT(buf);
  465. sutGpsStatus.IPStatus=CLOSE;
  466. g_ucModemSentTcpCt=0;
  467. sutGpsInfo.isServerLogin=0;
  468. }
  469. //
  470. if(g_iCSQ==99 || sutGpsStatus.IPStatus!=OPEN || 0==sutGpsInfo.isServerLogin)
  471. {
  472. susGpsTimingSendCt=0;
  473. return;
  474. }
  475. //计算平均速度
  476. sutGpsInfo.speedbuf[4]=sutGpsInfo.speedbuf[3];
  477. sutGpsInfo.speedbuf[3]=sutGpsInfo.speedbuf[2];
  478. sutGpsInfo.speedbuf[2]=sutGpsInfo.speedbuf[1];
  479. sutGpsInfo.speedbuf[1]=sutGpsInfo.speedbuf[0];
  480. sutGpsInfo.speedbuf[0]=sutGpsInfo.speed;
  481. for(i=0;i<5;i++){
  482. AvgSpeed=sutGpsInfo.speedbuf[i];
  483. }
  484. AvgSpeed/=5;
  485. sutGpsInfo.AvgSpeed=AvgSpeed;
  486. ///////////////////////////////////////////////
  487. SendTime=15;
  488. //----TCP发送后服务器未在时间段内回复,马上再发送
  489. if(sutGpsInfo.isGpsAuthOk==0)
  490. {
  491. //鉴权失败
  492. if(++sucGpsSentTcpCt>15)//定时鉴权
  493. {
  494. sucGpsSentTcpCt=0;
  495. susGpsTimingSendCt=0;
  496. //如果鉴权3次失败后则做一次注册请求
  497. if(sutPocStatus.Logined)
  498. {//登陆了才去鉴权
  499. if(++authTryTime > 3)
  500. {
  501. authTryTime=0;
  502. Registration();
  503. }else
  504. Authentication();
  505. }
  506. }
  507. return;//鉴权未成功的返回
  508. }else{
  509. if(g_ucModemSentTcpCt==0)
  510. {
  511. sucGpsSentTcpCt=0;
  512. g_ucModemSentTcpCt=0;
  513. }
  514. }
  515. sutGpsInfo.GPS_SecondCnt++;
  516. if(sutGpsInfo.isGpsValid)
  517. {//可以发位置包,检测时间是否到了
  518. if(sutGpsInfo.GPS_SecondCnt>=sutNewSegmentPara.SendGpsTime){
  519. sutGpsInfo.GPS_SecondCnt=0;
  520. SlwTrace(INF,"TSGpsTimingSendPos 15",1);
  521. TSGpsTimingSendPos();
  522. }
  523. }else
  524. {//没定位,不发位置包,则发心跳
  525. if(sutGpsInfo.GPS_SecondCnt >= 60)
  526. {
  527. sutGpsInfo.GPS_SecondCnt=0;
  528. SlwTrace(INF, "HeartTick",1);
  529. TS_SendHeartTick();
  530. }
  531. }
  532. }
  533. static char csqSendFlag=1;
  534. void UpdateCsqValue(int csq)
  535. {
  536. static char updateCSQ_ct=0;//兼容移动联通版本无法查CCSQ。
  537. static int tCsq[2];
  538. if(csq == 99 ||
  539. (csq >=0 && csq <=31))
  540. {
  541. tCsq[csqSendFlag]=csq;
  542. }
  543. updateCSQ_ct++;
  544. if(csqSendFlag==1 || updateCSQ_ct==2)
  545. {//收到了两组CSQ命令值,对比,如果有有效值
  546. if(tCsq[0] >=0 && tCsq[0] <=31) g_iCSQ=tCsq[0];//优先使用第一组
  547. else if(tCsq[1] >=0 && tCsq[1] <=31) g_iCSQ=tCsq[1];
  548. else g_iCSQ=99;
  549. tCsq[0]=99;
  550. tCsq[1]=99;
  551. updateCSQ_ct=0;
  552. }
  553. }
  554. /************************************************
  555. 每10ms处理一次
  556. **************************************************/
  557. void GpsTaskTick(unsigned char reset)
  558. {
  559. static unsigned int sucSecCt=0;
  560. static unsigned char sucSteep=0;
  561. static unsigned char sucSynSentCt=0;
  562. static unsigned char dly=0;
  563. char buf[50];
  564. if(reset){
  565. sucSecCt=0;
  566. sucSteep=0;
  567. return;
  568. }
  569. if(g_usRx3Len>0)
  570. {
  571. process_nema((char *)RxBuffer3);
  572. g_usRx3Len=0;
  573. }
  574. //===========以下控制每秒执行一次============
  575. if(os_time_get() < sucSecCt) return;
  576. sucSecCt=os_time_get()+100;
  577. GpsCtrlSendPos();
  578. //TCP发送防护,如果IPSTATUS一直等于SYN_SENT持续达10秒,则关闭TCP链路
  579. if(sutGpsStatus.IPStatus==SYN_SENT)
  580. {
  581. if(++sucSynSentCt>10)
  582. {
  583. sucSynSentCt=0;
  584. sutGpsInfo.isServerLogin=0;
  585. g_ucModemSentTcpCt=0;
  586. sprintf(buf, "AT+TCPCLOSE=%d\r\n",GPS_DATA_SOCKET);
  587. ModemSendAT(buf);
  588. sutGpsStatus.IPStatus=CLOSE;
  589. g_ucModemSentTcpCt=0;
  590. sutGpsInfo.isServerLogin=0;
  591. }
  592. }else sucSynSentCt=0;
  593. //---以下控制---
  594. if(++sucSteep>4)sucSteep=0;
  595. //----
  596. if(sucSteep==0)
  597. {
  598. if(csqSendFlag==1)
  599. {//模块在电信卡的cdma和evdo下使用CCSQ
  600. //其它所有情况使用CSQ
  601. csqSendFlag=0;
  602. ModemSendAT("AT+CSQ\r\n");
  603. }else{
  604. csqSendFlag=1;
  605. ModemSendAT("AT+CCSQ\r\n");
  606. }
  607. sprintf(buf, "[ATH]%d,[GPS]%d,[BAT]%0.2f,[CSQ]%d",
  608. sutGpsInfo.isGpsAuthOk,
  609. sutGpsInfo.isGpsValid,
  610. (double)g_iVbat/100,
  611. g_iCSQ);
  612. SlwTrace(INF,buf,1);
  613. }
  614. else if(1==sucSteep){
  615. ModemSendAT("AT+POC_PPP\r\n");
  616. }else if(2==sucSteep){
  617. if(99==g_iCSQ)return;
  618. if(sutGpsStatus.PPPStatus==OPEN){
  619. sprintf(buf, "AT+TCPSTATUS=%d\r\n", GPS_DATA_SOCKET);
  620. ModemSendAT(buf);
  621. }else{
  622. SlwTrace(INF, "Wait POC_PPP",1);
  623. }
  624. }else if(3==sucSteep)
  625. {
  626. if(99==g_iCSQ) return;
  627. if(sutGpsInfo.isGpsWork==0)
  628. {
  629. if(sutGpsStatus.CheckCnt < 50)
  630. {
  631. if(++sutGpsStatus.CheckCnt >= 2)
  632. {
  633. sutGpsStatus.CheckCnt = NO_GPS_CHECK_TIMEOUT;//设置为此值时认为是没有GPS机型
  634. }
  635. }
  636. SlwTrace(INF,"GPS modem not work!",1);
  637. }
  638. if(sutGpsStatus.IPStatus!=OPEN && sutGpsStatus.PPPStatus==OPEN)
  639. {
  640. if(tcpControl == 1)
  641. {//当控制为GPS时才去连接
  642. sutGpsInfo.isServerLogin=0;
  643. sprintf(buf,"AT+TCPOPEN=%d,%d.%d.%d.%d:%d\r\n",GPS_DATA_SOCKET,sutNewSegmentPara.GIP[0],sutNewSegmentPara.GIP[1],sutNewSegmentPara.GIP[2],sutNewSegmentPara.GIP[3],
  644. sutNewSegmentPara.GpsPort);
  645. SlwTrace(INF,buf,0);
  646. ModemSendAT(buf);
  647. }
  648. }
  649. }else if(4==sucSteep)
  650. {
  651. if(99==g_iCSQ)return;
  652. if(sutGpsStatus.IPStatus==OPEN && 0==sutGpsInfo.isServerLogin)
  653. {
  654. sutGpsInfo.isServerLogin = OPEN;
  655. }
  656. }
  657. }
  658. void VolumeSet(void)
  659. {
  660. char i,t;
  661. int Volume;
  662. SUT_MODEM_AT_MSG *pMsg=&sutAtmPro;
  663. //先配置一次,再查,因为默认就查有可能是没有返回的
  664. ModemSendAT("at+syscmd=start_pcm volume 6 7\r\n"); //7 5
  665. for(i=0;i<10;i++)
  666. {
  667. t=100;
  668. REGO:
  669. ModemSendAT("at+syscmd=start_pcm volume\r\n");
  670. while(t--)
  671. {
  672. if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData))))
  673. {
  674. if(0==ModemStrCmp((char *)pMsg->MsgData,"6 7"))
  675. {
  676. SlwTrace(INF, "[07]Set Volume ok",1);
  677. return;
  678. }else{
  679. if(t==0) ModemSendAT("at+syscmd=start_pcm volume 6 7\r\n");
  680. }
  681. }else
  682. os_dly_wait(1);
  683. }
  684. }
  685. SlwTrace(INF, "[07]Set Volume failed",1);
  686. }