gps_uart.c 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: gprs.c
  4. 文件版本: 01.01
  5. 创建作者:
  6. 创建日期: 2012-8-17
  7. 功能说明: GRS模块
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "head.h"
  14. #include "gps_uart.h"
  15. #include "my_rtc.h"
  16. #include "gps.h"
  17. #include "bspconfig.h"
  18. #if defined(ADD_ATGM366_GPS_FUN) || defined(DEV_GPS_ATGM366) || defined(DEV_GPS_ATGM332D)
  19. #define BYTE2LONG(p)((long)(((p)[0]<<24)+((p)[1]<<16)+((p)[2]<<8)+(p)[3]))
  20. /*------------------------------ 全局变量 -------------------------------------
  21. */
  22. GpsNmeaRmcDataType GpsNmeaRmcData;
  23. u8 SendBuf[GPS_LINE_LEN/2];
  24. const GpsNmeaDataType GpsNmeaDataTbl[]=
  25. {
  26. { FALSE, "GGA" },
  27. { FALSE, "GLL" },
  28. { FALSE, "GSA" },
  29. { FALSE, "GSV" },
  30. { TRUE, "RMC" },
  31. { FALSE, "VTG" },
  32. { FALSE, "ZDA" },
  33. { FALSE, "TXT" },
  34. { FALSE, "ANT" },
  35. { FALSE, "DHV" },
  36. { FALSE, "GST" },
  37. };
  38. const char GpsNmeaCmdData[][50]=
  39. {
  40. {"$PCAS01,0*1C\r\n"},
  41. {"$PCAS01,1*1D\r\n"},
  42. {"$PCAS01,2*1E\r\n"},
  43. {"$PCAS01,3*1F\r\n"},
  44. {"$PCAS01,4*18\r\n"}, //57600
  45. {"$PCAS01,5*19\r\n"},
  46. // {"$PCAS03,0,0,0,0,1,0,0,0,0,0,,,0,0*03\r\n"}, //配置只上发RMC指令
  47. {"$PCAS03,0,0,0,4,1,0,0,0*07\r\n"}, //配置发RMC、GSV指令
  48. {"$PCAS04,3*1A\r\n"}, //配置选择北斗和GPS导航系统
  49. {"$PCAS02,1000*2E\r\n"}, //更新频率为1HZ
  50. {"$PCAS10,3*1F\r\n"}, //恢复出厂设置
  51. {"$PCAS04,2*1B\r\n"}, //单独选择北斗
  52. {"$PCAS04,1*18\r\n"}, //单独选择GPS
  53. };
  54. const int GpsCommBuadrateTbl[]=
  55. {
  56. 4800, 9600, 19200, 38400, 57600, 115200
  57. };
  58. /*------------------------------ 外部函数 -------------------------------------
  59. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  60. */
  61. extern int rtc_to_timespec(struct rtc_time_t * p_rtc, struct timespec * p_ts);
  62. GPS_SYNC_DELAY gps_sync;
  63. extern unsigned int g_keep_alive_gps;
  64. /******************************************************************************
  65. 函数名称:
  66. 函数版本: 01.01
  67. 创建作者:
  68. 创建日期:
  69. 函数说明:
  70. 参数说明:
  71. 返回值:
  72. 0: 成功
  73. 其它: 失败
  74. 修改记录:
  75. */
  76. extern struct timespec g_sys_time;
  77. char gps_crc(const char* p, u8 length)
  78. {
  79. char crc = p[0];
  80. u8 i;
  81. for(i=1; i<length;i++)
  82. {
  83. crc ^= p[i];
  84. }
  85. return crc;
  86. }
  87. void GPSCommInit(GPS_COMM* p,u8 chnl) //初始化
  88. {
  89. memset(p,0,sizeof(GPS_COMM));
  90. p->type=IEC_MODBUS_M;
  91. p->chnl=chnl;
  92. p->bData=false;
  93. //p->arrSendBuf=&g_tRsComm[chnl].sendbuf[0];
  94. ResetUartGPSLink(p);
  95. // rt_printf("gps com init\r\n"); //TODO ygl -
  96. }
  97. void ResetUartGPSLink(GPS_COMM* p) //重置
  98. {
  99. p->cTypeCounter=GPS_FRAME_HEAD;
  100. p->cRecvCnt=0;
  101. }
  102. void GPS_Recv(GPS_COMM* p,BYTE byRevData)
  103. {
  104. static unsigned char RecvCounter;
  105. if(p->bData)
  106. {
  107. p->cTypeCounter=GPS_FRAME_HEAD;
  108. return;
  109. }
  110. p->arrRecvBuf[p->cRecvCnt++] = byRevData; //接收数据
  111. switch(p->cTypeCounter)
  112. {
  113. case GPS_FRAME_HEAD: //
  114. if(byRevData=='$') //开始符号
  115. {
  116. // rt_printf("GPS_FRAME_HEAD\r\n");
  117. p->cTypeCounter++;
  118. }
  119. else
  120. {
  121. ResetUartGPSLink(p);
  122. }
  123. break;
  124. case GPS_FRAME_DATA:
  125. if(byRevData=='*') //数据结束段
  126. {
  127. // rt_printf("GPS_FRAME_DATA\r\n");
  128. RecvCounter=0;
  129. p->cTypeCounter=GPS_FRAME_TAIL;
  130. //p->nTypeCounter=GPS_FRAME_TAIL;
  131. }
  132. else if(p->cRecvCnt>GPS_UART_MAX_LEN) //数据异常保护后续需要修改
  133. //else if(p->nRecvCnt>GPS_UART_MAX_LEN) //数据异常保护后续需要修改
  134. {
  135. ResetUartGPSLink(p);
  136. }
  137. break;
  138. case GPS_FRAME_TAIL:
  139. if(byRevData=='\n') // 回车符
  140. {
  141. p->cTypeCounter=GPS_FRAME_HEAD;
  142. //p->nTypeCounter=GPS_FRAME_HEAD;
  143. p->bData=true;
  144. // rt_printf("GPS_FRAME_TAIL\r\n");
  145. // rt_printf("data: %s\r\n", p->arrRecvBuf);
  146. }
  147. else if(++RecvCounter>=4)
  148. {
  149. ResetUartGPSLink(p);
  150. }
  151. break;
  152. default:
  153. ResetUartGPSLink(p);
  154. break;
  155. }
  156. }
  157. void GPS_Timer(void)
  158. {
  159. u8 i;
  160. // TODO 待处理秒脉冲 by ewen
  161. // if(g_clock_mode != CLOCK_MODE_GPS_SECOND)
  162. // {
  163. // if(soe_check(EV_GPS_ADJUST_TIME)==true)
  164. // {
  165. // soe_record_ev(EV_GPS_ADJUST_TIME,0, 0,0,0 );
  166. // }
  167. return;
  168. // }
  169. if(ustimer_delay_origin2(&GpsNmeaRmcData.data_vaild_time, 60*1*USTIMER_SEC));//60*tRunPara.GPS_switch_delay*USTIMER_SEC))
  170. {
  171. GpsNmeaRmcData.data_vaild = 0;
  172. // TODO by ewen
  173. // if(soe_check(EV_GPS_ADJUST_TIME)==true)
  174. // {
  175. // soe_record_ev(EV_GPS_ADJUST_TIME,0, 0,0,0 );
  176. // }
  177. }
  178. if(ustimer_delay_origin2(&GpsNmeaRmcData.gsv_time, 30*USTIMER_SEC))
  179. {
  180. GpsNmeaRmcData.bd_sv_num = 0;
  181. GpsNmeaRmcData.gp_sv_num = 0;
  182. }
  183. for(i=0; i<GPS_NUM_MAX; i++)
  184. {
  185. if(ustimer_delay_origin2(&GpsNmeaRmcData.bd_online_time[i], 180*USTIMER_SEC))
  186. {
  187. GpsNmeaRmcData.bd_gsv[i].valid = 0;
  188. }
  189. if(ustimer_delay_origin2(&GpsNmeaRmcData.gp_online_time[i], 180*USTIMER_SEC))
  190. {
  191. GpsNmeaRmcData.gp_gsv[i].valid = 0;
  192. }
  193. }
  194. if(GpsNmeaRmcData.data_vaild == 0)
  195. {
  196. #ifdef GPS_ALIVE_SOE
  197. if(soe_check(EV_GPS_ALIVE)==true)
  198. {
  199. soe_record_ev(EV_GPS_ALIVE,0, 0,0,0 );
  200. }
  201. #endif
  202. GpsNmeaRmcData.bd_sv_num=0;
  203. GpsNmeaRmcData.gp_sv_num=0;
  204. }
  205. #ifdef GPS_NUM_SHOW
  206. g_sw_pub.ac_in[PUB_AC_IN_GPS_NUM] = (qs16)((GpsNmeaRmcData.bd_sv_num + GpsNmeaRmcData.gp_sv_num)*Q16_BASE);
  207. #elif defined BD_GPS_NUM
  208. g_sw_pub.ac_in[PUB_AC_IN_BD_NUM] = (qs16)(GpsNmeaRmcData.bd_sv_num*Q16_BASE);
  209. g_sw_pub.ac_in[PUB_AC_IN_GPS_NUM] = (qs16)(GpsNmeaRmcData.gp_sv_num*Q16_BASE);
  210. #endif
  211. }
  212. void GPS_Comm_App(GPS_COMM* p)
  213. {
  214. #ifdef ADD_PLUSE_OUTPUT
  215. GenerateSecdPluse();
  216. #endif
  217. GPS_Timer();
  218. // if(!g_clock_mode_gps)
  219. // return;
  220. GpsModuleFunInit(p);
  221. if(GpsNmeaRmcData.DataValidFlag=='S') //soeê??t
  222. {
  223. struct rtc_time_t rtc;
  224. // TODO by ewen
  225. //soe_record_opt(EV_GPS_ADJUST_TIME,GpsNmeaRmcData.MsOffset);
  226. // if(soe_check(EV_GPS_ADJUST_TIME)==false)
  227. // {
  228. // soe_record_ev(EV_GPS_ADJUST_TIME,1, 0,0,0 );
  229. // }
  230. GpsNmeaRmcData.gps_soe_time = ustimer_get_origin();
  231. timespec_to_rtc(GpsNmeaRmcData.ts,&rtc,1);
  232. if(rtc_time_write(&rtc) != 0) //
  233. {
  234. rt_printf("gps_fun:rtc_time_write err.\r\n");
  235. return;
  236. }
  237. GpsNmeaRmcData.DataValidFlag='0';
  238. // rt_printf_time("gps adjust,time=%d\r\n",GpsNmeaRmcData.MsOffset);
  239. }
  240. if(p->bData) //TODO: add vaild data control
  241. {
  242. GpsRecvDataFrameHandler(p);
  243. p->bData=false;
  244. p->cRecvCnt=0;
  245. }
  246. }
  247. int _pow10(unsigned char num)
  248. {
  249. int val=1;
  250. while(num--)
  251. val*=10;
  252. return val;
  253. }
  254. unsigned char* GetParamDataValue(unsigned char* pos,float* data) //, ,
  255. {
  256. unsigned char count,IntNum=0,DecNum=0,len,num;
  257. unsigned char *p=pos,*p1;
  258. int value;
  259. p++; //jump the first signed
  260. //len=(unsigned char*)strstr(p,",")-p;
  261. len=(unsigned char*)strchr(p,',')-p;
  262. if((len<=0)||len>15)
  263. {
  264. *data=0; //valid data
  265. return pos+len+1;
  266. }
  267. p1=p;
  268. for(count=0; count<len; count++,p1++)
  269. {
  270. if(*p1=='.') //取到小数点位置
  271. {
  272. DecNum=len-IntNum-1;
  273. break;
  274. }
  275. IntNum++;
  276. }
  277. //rt_printf("len=%d,InterNum=%d,DecNum=%d,x=%d\r\n",len,IntNum,DecNum,pow10(IntNum));
  278. value=0;
  279. while(IntNum) //get the part of Int
  280. {
  281. num=*p++-0x30; //必须为0x30-0x39
  282. value+=num*_pow10(IntNum-1);
  283. IntNum--;
  284. };
  285. *data=(float)value;
  286. if(DecNum)
  287. {
  288. p++; //point
  289. count=DecNum;
  290. value=0;
  291. while(count) //get the part of dec
  292. {
  293. num=*p++-0x30; //必须为0x30-0x39
  294. value+=num*_pow10(count-1);
  295. count--;
  296. };
  297. *data+=(float)value/_pow10(DecNum);
  298. }
  299. return pos+len+1;
  300. }
  301. //取字符
  302. unsigned char* GetParamDataChar(unsigned char* pos,unsigned char* data, int max_len)
  303. {
  304. unsigned char len;
  305. unsigned char *p=pos;
  306. //int value;
  307. p++; //jump the first signed
  308. //len=(unsigned char*)strstr(p,",")-p;
  309. len=(unsigned char*)strchr(p,',')-p;
  310. //rt_printf("len=%d\r\n",len);
  311. if((len<=0)||len>max_len)
  312. {
  313. *data=0; //valid data
  314. return pos+len+1;
  315. }
  316. memcpy(data,p,len);
  317. return pos+len+1;
  318. }
  319. char* gps_char_data_get(char* pos, char end, int* data)
  320. {
  321. unsigned char len;
  322. len=strchr(pos,end)-pos;
  323. if((len<=0)||len>15)
  324. {
  325. *data=-1; //valid data
  326. return pos+len+1;
  327. }
  328. *data=atoi(pos);
  329. return pos+len+1;
  330. }
  331. int CheckDataFrameVaild(unsigned char *pos)
  332. {
  333. unsigned char *p=pos,tmp;
  334. volatile unsigned char AddValue=0;
  335. //if(strstr(p,"*")==NULL)
  336. if(strchr(p,'*')==NULL)
  337. return -1;
  338. if(*p++!='$')
  339. return -1;
  340. while(*p!='*')
  341. AddValue^=*p++;
  342. p++; //*
  343. tmp=(*p++-0x30)<<4;
  344. tmp|=(*p-0x30)<<0;
  345. rt_printf("tmp=0x%02X,AddValue=0x%02X\r\n",tmp,AddValue);
  346. if(tmp!=AddValue)
  347. {
  348. rt_printf("tmp=%s\r\n",pos);
  349. return 0;
  350. }
  351. return 1;
  352. }
  353. void UtcTimeToSysTime(struct rtc_time_t * rtc,GpsNmeaRmcDataType* utc,u8 opt)
  354. {
  355. char* p=&utc->Date[0];
  356. rtc->day=(*p-0x30)*10+*(p+1)-0x30;
  357. p+=2;
  358. rtc->month=(*p-0x30)*10+*(p+1)-0x30;
  359. p+=2;
  360. rtc->year=(*p-0x30)*10+*(p+1)-0x30;
  361. p+=2;
  362. p=&utc->UtcTime[0];
  363. rtc->hour=(*p-0x30)*10+*(p+1)-0x30;
  364. p+=2;
  365. rtc->min=(*p-0x30)*10+*(p+1)-0x30;
  366. p+=2;
  367. if(opt==1)
  368. rtc->ms=((*p-0x30)*10+*(p+1)-0x30)*1000+(*(p+3)-0x30)*100+(*(p+4)-0x30)*10+*(p+5)-0x30;
  369. else //取S
  370. rtc->ms=((*p-0x30)*10+*(p+1)-0x30)*1000;
  371. //rt_printf("year=%d,month=%d,day=%d,hour=%d,min=%d,ms=%d\r\n",rtc->year,rtc->month,rtc->day,rtc->hour,rtc->min,rtc->ms);
  372. }
  373. void gps_pluse_clear(void)
  374. {
  375. GpsNmeaRmcData.pluse_count = 0;
  376. }
  377. int GpsAdjustTimeFun(struct rtc_time_t* psrtc) //本函数只能被捕获中断服务函数调用
  378. {
  379. // static u8 counter=0;
  380. struct timespec ts;
  381. int res=FALSE;
  382. u64 MsOffset;
  383. static u8 power_on = 1;
  384. #ifdef CN_AREA_GUOWANG_FBC
  385. GpsNmeaRmcData.data_vaild_time = ustimer_get_origin();
  386. GpsNmeaRmcData.data_vaild = 1;
  387. if(GpsNmeaRmcData.slave_vaild == 0)
  388. return res;
  389. #endif
  390. if(++GpsNmeaRmcData.pluse_count<=2)//tRunPara.GPS_sync_time) //2s判断一下校准时间 //TODO EWEN
  391. {
  392. // GpsNmeaRmcData.DataValidFlag='0';
  393. return res;
  394. }
  395. GpsNmeaRmcData.wait_sync = 0;
  396. // counter=0;
  397. #ifdef CN_AREA_GUOWANG_FBC
  398. GpsNmeaRmcData.slave_vaild = 0;
  399. #else
  400. if(GpsNmeaRmcData.DataValidFlag!='Y' )//|| !tRunPara.GPS_sync_enable) //TODO EWEN
  401. return res;
  402. #endif
  403. GpsNmeaRmcData.DataValidFlag='0';
  404. //rtc_to_timespec(psrtc,&ts);
  405. #ifdef CN_AREA_GUOWANG_FBC
  406. GpsNmeaRmcData.ts.tv_sec+= tRunPara.GPS_sync_time + 1;
  407. GpsNmeaRmcData.ts.tv_nsec=20*1000 + 1000*1000; //补偿20us + 1ms
  408. #else
  409. GpsNmeaRmcData.ts.tv_sec+= 1;//tRunPara.GPS_sync_time + 1; //TODO EWEN
  410. GpsNmeaRmcData.ts.tv_nsec=20*1000; //补偿20us
  411. #ifdef KP_GPS_TEST
  412. GpsNmeaRmcData.ts.tv_sec+=4;
  413. #endif
  414. #endif
  415. gps_get_time(&ts); //当前系统的精准时间带ms的
  416. if(GpsNmeaRmcData.ts.tv_sec<=ts.tv_sec) //系统时间超前
  417. MsOffset=(ts.tv_sec-GpsNmeaRmcData.ts.tv_sec)*1000+ts.tv_nsec/1000000;
  418. else //系统时间滞后
  419. MsOffset=(GpsNmeaRmcData.ts.tv_sec-ts.tv_sec)*1000-ts.tv_nsec/1000000;
  420. if(MsOffset>=5 || power_on) //5ms
  421. {
  422. timespec_to_rtc(GpsNmeaRmcData.ts,psrtc,1); //D£ê±
  423. sys_time_set(psrtc);
  424. if(MsOffset>=1000 || power_on) //1Sò?é??ó2?????SOE
  425. {
  426. power_on = 0;
  427. GpsNmeaRmcData.DataValidFlag='S'; //SOE±ê??
  428. GpsNmeaRmcData.MsOffset=MsOffset;
  429. }
  430. else
  431. GpsNmeaRmcData.DataValidFlag='0';
  432. // rt_printf("set time=%d\r\n",MsOffset); //校准
  433. res=TRUE;
  434. }
  435. else
  436. GpsNmeaRmcData.DataValidFlag='0';
  437. return res;
  438. }
  439. float gps_angle_calc(float value)
  440. {
  441. float tmp_d,tmp_m,tmp_dot;
  442. u32 tmp;
  443. tmp = (u32)value;
  444. tmp_d = value;
  445. tmp_m = (float)(tmp_d - tmp);
  446. tmp_dot = tmp_m*100.0f/60.0f;
  447. tmp = value;
  448. return (float)(tmp+tmp_dot);
  449. }
  450. void gps_dms_calc(float value, u32 *d, u32 *m, float *s)
  451. {
  452. u32 tmp1,tmp2;
  453. tmp1 = (u32)value;
  454. tmp2 = (u32)value/100;
  455. *d = tmp2;
  456. *m = (u32)((value/100.0f - tmp2)*100.0f);
  457. *s = (float)(value - tmp1)*60.0f;
  458. }
  459. //GPS接收数据解析
  460. int GpsRecvDataFrameHandler(GPS_COMM* data)
  461. {
  462. static unsigned char LocalUtcTime[11];
  463. unsigned char* p=&data->arrRecvBuf[0];
  464. unsigned char* p1=&data->arrRecvBuf[0];
  465. u8 msg_no, valid_flag;
  466. if((ustimer_delay_origin2(&data->recv_wait_time, 3*USTIMER_SEC) <= 0) && !data->recv_handle)
  467. {
  468. return FALSE;
  469. }
  470. data->recv_handle = 1;
  471. if(data->GpsModuleRunStep==GPS_MODULE_INIT_STEP) //???????????????????????????
  472. data->GpsModuleRunStep=GPS_MODULE_NORMAL_RUN_STEP;
  473. else if(data->GpsModuleRunStep==GPS_MODULE_BAUD_CHECK_STEP) //查找到合适的波特率
  474. data->GpsModuleRunStep=GPS_MODULE_BAUD_SET_STEP;
  475. //if(!CheckDataFrameVaild(p))
  476. // return;
  477. // $GNRMC,051033.000,A,2222.12622,N,11329.24936,E,0.00,0.00,050825,,,A*79
  478. if(strstr(p1,"RMC")!=NULL)
  479. {
  480. p=strstr(p1,"RMC");
  481. memcpy(&GpsNmeaRmcData.SingleType,p1+1,2); //记录是BD还是GN,即北斗还是GPS
  482. GpsNmeaRmcData.SingleType[p-p1] = 0;
  483. p+=3;
  484. p=GetParamDataChar(p,&GpsNmeaRmcData.UtcTime[0],sizeof(GpsNmeaRmcData.UtcTime));
  485. p=GetParamDataChar(p,&valid_flag,sizeof(valid_flag)); //数据有效标志
  486. if(valid_flag!='A')
  487. {
  488. #ifdef GPS_NUM_SHOW
  489. GpsNmeaRmcData.bd_sv_num=0;
  490. GpsNmeaRmcData.gp_sv_num=0;
  491. g_sw_pub.ac_in[PUB_AC_IN_GPS_NUM] = (qs16)((GpsNmeaRmcData.bd_sv_num + GpsNmeaRmcData.gp_sv_num)*Q16_BASE);
  492. #elif defined BD_GPS_NUM
  493. GpsNmeaRmcData.bd_sv_num=0;
  494. GpsNmeaRmcData.gp_sv_num=0;
  495. g_sw_pub.ac_in[PUB_AC_IN_BD_NUM] = (qs16)(GpsNmeaRmcData.bd_sv_num*Q16_BASE);
  496. g_sw_pub.ac_in[PUB_AC_IN_GPS_NUM] = (qs16)(GpsNmeaRmcData.gp_sv_num*Q16_BASE);
  497. #endif
  498. return FALSE;
  499. }
  500. GpsNmeaRmcData.data_vaild_time = ustimer_get_origin();
  501. GpsNmeaRmcData.data_vaild = 1;
  502. #ifdef GPS_ALIVE_SOE
  503. if(soe_check(EV_GPS_ALIVE)==false)
  504. {
  505. soe_record_ev(EV_GPS_ALIVE, 1, 0, 0, 0 );
  506. }
  507. #endif
  508. if(GpsNmeaRmcData.wait_sync)
  509. {
  510. // return FALSE;//临时屏蔽 by ewen
  511. }
  512. GpsNmeaRmcData.DataValidFlag = valid_flag;
  513. p=GetParamDataValue(p,&GpsNmeaRmcData.Latitude); //纬度
  514. p=GetParamDataChar(p,&GpsNmeaRmcData.LatitudeDir,sizeof(GpsNmeaRmcData.LatitudeDir)); //纬度方位
  515. p=GetParamDataValue(p,&GpsNmeaRmcData.Longtitude); //经度
  516. p=GetParamDataChar(p,&GpsNmeaRmcData.LongtitudeDir,sizeof(GpsNmeaRmcData.LongtitudeDir)); //经度方位
  517. p=GetParamDataValue(p,&GpsNmeaRmcData.Spd); //对地速度
  518. p=GetParamDataValue(p,&GpsNmeaRmcData.cog); //对地真航向
  519. p=GetParamDataChar(p,&GpsNmeaRmcData.Date[0],sizeof(GpsNmeaRmcData.Date)); //日期
  520. gps_pluse_clear();
  521. GpsNmeaRmcData.wait_sync = 1;
  522. memset(&GpsNmeaRmcData.UtcTime[8],'0',3); //去除毫秒 GPS模块机制
  523. // if(memcmp(GpsNmeaRmcData.UtcTime,LocalUtcTime,sizeof(GpsNmeaRmcData.UtcTime))) //若gps第一次获取到时间或者1s内第一次获取到时间则有效或者是GPS断线后第一次获取的时间
  524. {
  525. struct rtc_time_t rtc;
  526. UtcTimeToSysTime(&rtc,&GpsNmeaRmcData,0);
  527. rtc_to_timespec(&rtc,&GpsNmeaRmcData.ts);
  528. GpsNmeaRmcData.ts.tv_sec+=8*60*60; //UTC->BEIJING
  529. GpsNmeaRmcData.DataValidFlag='Y';
  530. //rt_printf("gene_flag=%d\r\n",GpsNmeaRmcData.DataValidFlag);
  531. memcpy(GpsNmeaRmcData.UtcTime,LocalUtcTime,sizeof(GpsNmeaRmcData.UtcTime));
  532. //rt_printf("recv gps uart data!");
  533. }
  534. gps_dms_calc(GpsNmeaRmcData.Longtitude, &GpsNmeaRmcData.Longtitude_dd, &GpsNmeaRmcData.Longtitude_mm, &GpsNmeaRmcData.Longtitude_ss);
  535. gps_dms_calc(GpsNmeaRmcData.Latitude, &GpsNmeaRmcData.Latitude_dd, &GpsNmeaRmcData.Latitude_mm, &GpsNmeaRmcData.Latitude_ss);
  536. #ifndef GPS_JWD_SPLIT
  537. g_sw_pub.ac_in[PUB_AC_GPS_LONGITUDE] = (qs16)(gps_angle_calc(GpsNmeaRmcData.Longtitude /100.0f)*Q16_BASE);
  538. g_sw_pub.ac_in[PUB_AC_GPS_LATITUDE] = (qs16)(gps_angle_calc(GpsNmeaRmcData.Latitude /100.0f)*Q16_BASE);
  539. #else
  540. g_sw_pub.ac_in[PUB_AC_GPS_LONGITUDE_D] =GpsNmeaRmcData.Longtitude_dd*Q16_BASE;
  541. g_sw_pub.ac_in[PUB_AC_GPS_LONGITUDE_M] =GpsNmeaRmcData.Longtitude_mm*Q16_BASE;
  542. g_sw_pub.ac_in[PUB_AC_GPS_LONGITUDE_S] =GpsNmeaRmcData.Longtitude_ss*Q16_BASE;
  543. g_sw_pub.ac_in[PUB_AC_GPS_LATITUDE_D] =GpsNmeaRmcData.Latitude_dd*Q16_BASE;
  544. g_sw_pub.ac_in[PUB_AC_GPS_LATITUDE_M] =GpsNmeaRmcData.Latitude_mm*Q16_BASE;
  545. g_sw_pub.ac_in[PUB_AC_GPS_LATITUDE_S] =GpsNmeaRmcData.Latitude_ss*Q16_BASE;
  546. #endif
  547. }
  548. else if(strstr(p1,"GSV")!=NULL)
  549. {
  550. if(strstr(p1,"BD")!=NULL)
  551. {
  552. u8 i;
  553. p = p1 + 7;
  554. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_msg_num);
  555. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_msg_no);
  556. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_sv_num);
  557. if(strstr(GpsNmeaRmcData.SingleType,"BD")!=NULL)
  558. {
  559. g_sw_pub.ac_in[PUB_AC_GPS_NUM_SV] = (qs16)(GpsNmeaRmcData.bd_sv_num*Q16_BASE);
  560. }
  561. if(GpsNmeaRmcData.bd_sv_num > GPS_NUM_MAX)
  562. return FALSE;
  563. GpsNmeaRmcData.gsv_time = ustimer_get_origin();
  564. msg_no = GpsNmeaRmcData.bd_msg_no-1;
  565. if(GpsNmeaRmcData.bd_msg_no*4 < GPS_NUM_MAX)
  566. {
  567. for(i=0; i<4; i++)
  568. {
  569. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_gsv[msg_no*4+i].id);
  570. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_gsv[msg_no*4+i].ele);
  571. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_gsv[msg_no*4+i].az);
  572. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_gsv[msg_no*4+i].cn0);
  573. GpsNmeaRmcData.bd_gsv[msg_no*4+i].valid = 1;
  574. GpsNmeaRmcData.bd_online_time[msg_no*4+i] = ustimer_get_origin();
  575. }
  576. }
  577. }
  578. else if(strstr(p1,"GP")!=NULL)
  579. {
  580. u8 i;
  581. p = p1 + 7;
  582. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_msg_num);
  583. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_msg_no);
  584. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_sv_num);
  585. // rt_printf("GPS卫星:%d台\r\n", GpsNmeaRmcData.gp_sv_num);
  586. if(GpsNmeaRmcData.gp_sv_num > GPS_NUM_MAX)
  587. return FALSE;
  588. if(strstr(GpsNmeaRmcData.SingleType,"GN")!=NULL)
  589. {
  590. g_sw_pub.ac_in[PUB_AC_GPS_NUM_SV] = (qs16)(GpsNmeaRmcData.gp_sv_num*Q16_BASE);
  591. }
  592. GpsNmeaRmcData.gsv_time = ustimer_get_origin();
  593. msg_no = GpsNmeaRmcData.gp_msg_no-1;
  594. if(GpsNmeaRmcData.gp_msg_no*4 < GPS_NUM_MAX)
  595. {
  596. for(i=0; i<4; i++)
  597. {
  598. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_gsv[msg_no*4+i].id);
  599. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_gsv[msg_no*4+i].ele);
  600. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_gsv[msg_no*4+i].az);
  601. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_gsv[msg_no*4+i].cn0);
  602. GpsNmeaRmcData.gp_gsv[msg_no*4+i].valid = 1;
  603. GpsNmeaRmcData.gp_online_time[msg_no*4+i] = ustimer_get_origin();
  604. }
  605. }
  606. }
  607. }
  608. else
  609. {
  610. #if 0
  611. if((data->GpsModuleRunStep==GPS_MODULE_NORMAL_RUN_STEP)&&(strstr(p,"TXT")==NULL)) //正常运行后若发现收到其他数据则下发配置指令
  612. #else
  613. if((data->GpsModuleRunStep==GPS_MODULE_NORMAL_RUN_STEP)&&(strstr(p,"GSV")==NULL))
  614. #endif
  615. {
  616. data->GpsModuleRunStep=GPS_MODULE_NEMA_SEL_STEP; //若配置不成功可循环配置
  617. }
  618. }
  619. return TRUE;
  620. }
  621. void GpsSwitchBaudrateFun(GPS_COMM* data, GpsCtrlCmdEnumType GpsCtrlCmd)
  622. {
  623. int ret;
  624. u8 chnl=data->chnl;
  625. GpsModuleRunStepEnum LocalGpsModuleRunStep=data->GpsModuleRunStep;
  626. memset(&g_tRsComm[chnl],0,sizeof(g_tRsComm[chnl]));
  627. g_tRsComm[chnl].ptBuf=(BYTE*)&g_tRsIEC[chnl];
  628. GPSCommInit((GPS_COMM *)g_tRsComm[chnl].ptBuf,chnl);
  629. //uart_open(UART_CHANNEL[chnl],tRunPara.tUartPara[i].wBaud,tRunPara.tUartPara[i].wParity);
  630. #if defined(BSP_DTU3) || defined(BSP_DTU2) || defined(BSP_DTU4)
  631. uart_open(UART_CHANNEL[chnl],GpsCommBuadrateTbl[GpsCtrlCmd],PARITY_NONE1);
  632. #else
  633. ret = uart_open(UART_CHANNEL[chnl],GpsCommBuadrateTbl[GpsCtrlCmd],PARITY_NONE_1);
  634. if (ret < 0)
  635. {
  636. printf("%s: outside uart %d open failed!\n", __FUNCTION__, UART_CHANNEL[chnl]);
  637. }
  638. #endif
  639. RS_Ena_Init(chnl);
  640. RS_Recv_Enable(chnl);
  641. data->GpsModuleRunStep=LocalGpsModuleRunStep; //串口初始化 存储的数据都被清0
  642. //rt_printf("Set baud:%d\r\n",GpsCommBuadrateTbl[GpsCtrlCmd]);
  643. }
  644. void GpsModuleFunInit(GPS_COMM* data)
  645. {
  646. static GpsCtrlCmdEnumType GpsSwitchBaudrate;
  647. static uint32_t us0=0;
  648. u8 count,chnl=data->chnl,i;
  649. int ret;
  650. if(us0==0)
  651. us0=ustimer_get_origin();
  652. if(ustimer_delay_origin2(&us0,USTIMER_SEC*2)>0)
  653. {
  654. // rt_printf("Step:%d\r\n",data->GpsModuleRunStep);
  655. switch(data->GpsModuleRunStep)
  656. {
  657. case GPS_MODULE_INIT_STEP:
  658. data->GpsModuleRunStep++;
  659. GpsSwitchBaudrate=GPS_SET_BUADRATE1_CMD;
  660. break;
  661. case GPS_MODULE_BAUD_CHECK_STEP:
  662. GpsSwitchBaudrateFun(data,GpsSwitchBaudrate);
  663. if(++GpsSwitchBaudrate>GPS_SET_BUADRATE5_CMD)
  664. GpsSwitchBaudrate=GPS_SET_BUADRATE0_CMD;
  665. //data->GpsModuleRunStep=GPS_MODULE_BAUD_SET_STEP;
  666. break;
  667. case GPS_MODULE_BAUD_SET_STEP:
  668. for(count=0; count<sizeof(GpsCommBuadrateTbl)/4; count++)
  669. {
  670. if(tRunPara.tUartPara[data->chnl].dBaud==GpsCommBuadrateTbl[count])
  671. break;
  672. }
  673. if(count==sizeof(GpsCommBuadrateTbl)/4)
  674. ; //ERROR
  675. else
  676. {
  677. GPS_Comm_Send(data,(char*)GpsNmeaCmdData[count],sizeof(GpsNmeaCmdData[count])); //根据定值配置模块的波特率
  678. }
  679. data->GpsModuleRunStep++;
  680. break;
  681. case GPS_MODULE_BAUD_FINISH_STEP: //找到合适的波特率
  682. #if 1
  683. memset(&g_tRsComm[chnl],0,sizeof(g_tRsComm[chnl]));
  684. g_tRsComm[chnl].ptBuf=(BYTE*)&g_tRsIEC[chnl];
  685. GPSCommInit((GPS_COMM *)g_tRsComm[chnl].ptBuf,chnl); //运行步骤恢复初始状态
  686. ret = uart_open(UART_CHANNEL[chnl],tRunPara.tUartPara[chnl].dBaud,tRunPara.tUartPara[chnl].wParity);
  687. if (ret < 0)
  688. {
  689. printf("%s: outside uart %d open failed!\n", __FUNCTION__, UART_CHANNEL[chnl]);
  690. }
  691. RS_Ena_Init(chnl);
  692. RS_Recv_Enable(chnl);
  693. #endif
  694. GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD]));
  695. // rt_printf("GPS_MODULE_BAUD_FINISH_STEP.\r\n");
  696. data->GpsModuleRunStep = GPS_MODULE_UPDATE_FREQ_STEP;//GPS_MODULE_NORMAL_RUN_STEP;
  697. break;
  698. case GPS_MODULE_NEMA_SEL_STEP:
  699. // rt_printf("GPS_MODULE_NEMA_SEL_STEP = %d.\r\n", sizeof(GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD]));
  700. GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD]));
  701. data->GpsModuleRunStep++;
  702. break;
  703. case GPS_MODULE_NAVI_SYS_STEP:
  704. // rt_printf("GPS_MODULE_NAVI_SYS_STEP.\r\n");
  705. GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_NAVI_SYS_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_NAVI_SYS_CMD]));
  706. data->GpsModuleRunStep=GPS_MODULE_NORMAL_RUN_STEP;
  707. break;
  708. case GPS_MODULE_UPDATE_FREQ_STEP:
  709. // rt_printf("GPS_MODULE_UPDATE_FREQ_STEP.\r\n");
  710. GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_UPDATE_FREQ_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_UPDATE_FREQ_CMD]));
  711. data->GpsModuleRunStep++;
  712. break;
  713. case GPS_MODULE_SYS_STEP:
  714. if(tRunPara.GPS_Mode == 1) //北斗
  715. {
  716. rt_printf("选择北斗系统.\r\n");
  717. GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_BD_SYS_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_BD_SYS_CMD]));
  718. }
  719. else if(tRunPara.GPS_Mode == 2) //GPS
  720. {
  721. rt_printf("选择GPS系统.\r\n");
  722. GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_GPS_SYS_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_GPS_SYS_CMD]));
  723. }
  724. else
  725. {
  726. rt_printf("选择北斗/GPS系统.\r\n");
  727. GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_NAVI_SYS_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_NAVI_SYS_CMD]));
  728. }
  729. data->GpsModuleRunStep++;
  730. GpsNmeaRmcData.bd_sv_num = 0;
  731. GpsNmeaRmcData.gp_sv_num = 0;
  732. for(i=0; i<GPS_NUM_MAX; i++)
  733. {
  734. GpsNmeaRmcData.bd_gsv[i].valid = 0;
  735. GpsNmeaRmcData.gp_gsv[i].valid = 0;
  736. }
  737. data->recv_wait_time = ustimer_get_origin();
  738. data->recv_handle = 0;
  739. break;
  740. case GPS_MODULE_NORMAL_RUN_STEP:
  741. default:
  742. break;
  743. }
  744. }
  745. }
  746. void GpsSendBaudrateCmd(GPS_COMM* p)
  747. {
  748. u8 i=0;
  749. char* ptr=&SendBuf[0];
  750. //memset(ptr,'A',20);
  751. //ptr+=20;
  752. //*ptr++='\r';
  753. //*ptr++='\n';
  754. ptr[i++]='$';
  755. #if 0 // xxxxxx 20220920 add 此函数没有用上,消除警告
  756. GPS_Comm_Send(p,ptr-22,22);
  757. #endif
  758. }
  759. void GPS_Comm_Send(GPS_COMM* p,char* data,unsigned char datalen) //发送命令
  760. {
  761. unsigned char *ptr=&g_tRsComm[p->chnl].sendbuf[0];
  762. *ptr++=datalen;
  763. //rt_printf("TX:%s\r\n",data);
  764. memcpy(ptr,data,datalen);
  765. g_tRsComm[p->chnl].nSendCnt=1; //第一个字节为长度
  766. g_tRsComm[p->chnl].bSend=TRUE;
  767. }
  768. #if 0
  769. void GenerateSecdPluse(void)
  770. {
  771. static uint32_t us0=0;
  772. static u8 state=0;
  773. if(us0==0)
  774. us0=ustimer_get_origin();
  775. switch(state)
  776. {
  777. case 0:
  778. if(ustimer_delay_origin2(&us0,USTIMER_MS*600)>0)
  779. {
  780. GPIO_KOUT0_OFF();
  781. GPIO_KOUT1_OFF();
  782. state=1;
  783. rt_printf("high=%d\r\n",ustimer_get_origin());
  784. }
  785. break;
  786. case 1:
  787. if(ustimer_delay_origin2(&us0,USTIMER_MS*50)>0)
  788. {
  789. GPIO_KOUT0_ON();
  790. GPIO_KOUT1_ON();
  791. state=0;
  792. rt_printf("low=%d\r\n",ustimer_get_origin());
  793. }
  794. break;
  795. default:
  796. break;
  797. }
  798. }
  799. #endif
  800. char gps_data_valid_get(void)
  801. {
  802. return GpsNmeaRmcData.data_vaild;
  803. }
  804. void gps_info_printf(void)
  805. {
  806. struct rtc_time_t rtc;
  807. u16 i;
  808. rt_printf("GPS串口数据:");
  809. if(gps_data_valid_get() == 'A' || gps_data_valid_get() == 1)
  810. {
  811. rt_printf("\r\n");
  812. rt_printf(" 系统:%s\r\n", GpsNmeaRmcData.SingleType);
  813. timespec_to_rtc(GpsNmeaRmcData.ts,&rtc,1);
  814. rt_printf(" 时间:%04d-%02d-%02d,%02d:%02d:%02d.%03d\r\n", 2000+rtc.year, rtc.month, rtc.day, rtc.hour,
  815. rtc.min, rtc.ms/1000, rtc.ms%1000);
  816. rt_printf(" 经度:%f°(%d°%d′%f″)\r\n", gps_angle_calc(GpsNmeaRmcData.Longtitude/100.0f), GpsNmeaRmcData.Longtitude_dd, GpsNmeaRmcData.Longtitude_mm, GpsNmeaRmcData.Longtitude_ss);
  817. rt_printf(" 纬度:%f°(%d°%d′%f″)\r\n", gps_angle_calc(GpsNmeaRmcData.Latitude/100.0f), GpsNmeaRmcData.Latitude_dd, GpsNmeaRmcData.Latitude_mm, GpsNmeaRmcData.Latitude_ss);
  818. rt_printf("==============================================\r\n");
  819. if(GpsNmeaRmcData.bd_sv_num > 0)
  820. {
  821. rt_printf("北斗卫星:%d台\r\n", GpsNmeaRmcData.bd_sv_num);
  822. for(i=0; i<GPS_NUM_MAX; i++)
  823. {
  824. if((GpsNmeaRmcData.bd_gsv[i].valid == 1) && (GpsNmeaRmcData.bd_gsv[i].id > 0))
  825. {
  826. if(GpsNmeaRmcData.bd_gsv[i].id > 0)
  827. rt_printf(" [卫星编号:%d ", GpsNmeaRmcData.bd_gsv[i].id);
  828. else
  829. rt_printf(" [卫星编号:- ");
  830. if(GpsNmeaRmcData.bd_gsv[i].ele > 0)
  831. rt_printf("仰角: %d ", GpsNmeaRmcData.bd_gsv[i].ele);
  832. else
  833. rt_printf("仰角: - ");
  834. if(GpsNmeaRmcData.bd_gsv[i].az > 0)
  835. rt_printf("方位角: %d ", GpsNmeaRmcData.bd_gsv[i].az);
  836. else
  837. rt_printf("方位角: - ");
  838. if(GpsNmeaRmcData.bd_gsv[i].cn0 > 0)
  839. rt_printf("载噪比: %d]\r\n", GpsNmeaRmcData.bd_gsv[i].cn0);
  840. else
  841. rt_printf("载噪比: -]\r\n");
  842. }
  843. }
  844. }
  845. else
  846. {
  847. rt_printf("北斗卫星:-\r\n");
  848. }
  849. rt_printf("==============================================\r\n");
  850. if(GpsNmeaRmcData.gp_sv_num > 0)
  851. {
  852. rt_printf("GPS卫星:%d台\r\n", GpsNmeaRmcData.gp_sv_num);
  853. for(i=0; i<GPS_NUM_MAX; i++)
  854. {
  855. if((GpsNmeaRmcData.gp_gsv[i].valid == 1) && (GpsNmeaRmcData.gp_gsv[i].id > 0))
  856. {
  857. if(GpsNmeaRmcData.gp_gsv[i].id > 0)
  858. rt_printf(" [卫星编号:%d ", GpsNmeaRmcData.gp_gsv[i].id);
  859. else
  860. rt_printf(" [卫星编号:- ");
  861. if(GpsNmeaRmcData.gp_gsv[i].ele > 0)
  862. rt_printf("仰角: %d ", GpsNmeaRmcData.gp_gsv[i].ele);
  863. else
  864. rt_printf("仰角: - ");
  865. if(GpsNmeaRmcData.gp_gsv[i].az > 0)
  866. rt_printf("方位角: %d ", GpsNmeaRmcData.gp_gsv[i].az);
  867. else
  868. rt_printf("方位角: - ");
  869. if(GpsNmeaRmcData.gp_gsv[i].cn0 > 0)
  870. rt_printf("载噪比: %d]\r\n", GpsNmeaRmcData.gp_gsv[i].cn0);
  871. else
  872. rt_printf("载噪比: -]\r\n");
  873. }
  874. }
  875. }
  876. else
  877. {
  878. rt_printf("GPS卫星:-\r\n");
  879. }
  880. }
  881. else if(gps_data_valid_get() == 'V')
  882. {
  883. rt_printf("\r\n");
  884. rt_printf(" 系统:无效\r\n");
  885. rt_printf(" 时间:无效\r\n");
  886. rt_printf(" 经度:无效\r\n");
  887. rt_printf(" 纬度:无效\r\n");
  888. }
  889. else
  890. {
  891. rt_printf("无\r\n");
  892. }
  893. }
  894. int is_gps_alive(void)
  895. {
  896. return 0;//tRunPara.GPS_sync_enable && GpsNmeaRmcData.data_vaild;//TODO EWEN
  897. }
  898. //从机时间同步
  899. int gps_slave_sync(struct timespec* ts)
  900. {
  901. if(tRunPara.bGPS && GpsNmeaRmcData.data_vaild) //打开秒脉冲对时
  902. {
  903. gps_pluse_clear();
  904. GpsNmeaRmcData.ts = *ts;
  905. GpsNmeaRmcData.slave_vaild = 1;
  906. return 1;
  907. }
  908. return 0;
  909. }
  910. void gps_init_step_set(u8 step)
  911. {
  912. u8 i;
  913. for(i=0;i<CFG_UART_NUM_MAX;i++)
  914. {
  915. // ???????,??
  916. if(UART_CHANNEL[i]< 0 )
  917. {
  918. continue;
  919. }
  920. if(tRunPara.tUartPara[i].wProtocol==PROTOCOL_GPS)
  921. {
  922. ((GPS_COMM *)g_tRsComm[i].ptBuf)->GpsModuleRunStep = step;
  923. }
  924. }
  925. }
  926. #endif