gps_uart.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116
  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*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. // 此处写RTC,但是在设置系统时间时已交由系统写入此处不用再写
  226. //soe_record_opt(EV_GPS_ADJUST_TIME,GpsNmeaRmcData.MsOffset);
  227. // if(soe_check(EV_GPS_ADJUST_TIME)==false)
  228. // {
  229. // soe_record_ev(EV_GPS_ADJUST_TIME,1, 0,0,0 );
  230. // }
  231. GpsNmeaRmcData.gps_soe_time = ustimer_get_origin();
  232. timespec_to_rtc(GpsNmeaRmcData.ts,&rtc,1);
  233. if(rtc_time_write(&rtc) != 0) //
  234. {
  235. rt_printf("gps_fun:rtc_time_write err.\r\n");
  236. return;
  237. }
  238. GpsNmeaRmcData.DataValidFlag='0';
  239. // rt_printf_time("gps adjust,time=%d\r\n",GpsNmeaRmcData.MsOffset);
  240. }
  241. if(p->bData) //TODO: add vaild data control
  242. {
  243. GpsRecvDataFrameHandler(p);
  244. p->bData=false;
  245. p->cRecvCnt=0;
  246. }
  247. }
  248. int _pow10(unsigned char num)
  249. {
  250. int val=1;
  251. while(num--)
  252. val*=10;
  253. return val;
  254. }
  255. unsigned char* GetParamDataValue(unsigned char* pos,float* data) //, ,
  256. {
  257. unsigned char count,IntNum=0,DecNum=0,len,num;
  258. unsigned char *p=pos,*p1;
  259. int value;
  260. p++; //jump the first signed
  261. //len=(unsigned char*)strstr(p,",")-p;
  262. len=(unsigned char*)strchr(p,',')-p;
  263. if((len<=0)||len>15)
  264. {
  265. *data=0; //valid data
  266. return pos+len+1;
  267. }
  268. p1=p;
  269. for(count=0; count<len; count++,p1++)
  270. {
  271. if(*p1=='.') //取到小数点位置
  272. {
  273. DecNum=len-IntNum-1;
  274. break;
  275. }
  276. IntNum++;
  277. }
  278. //rt_printf("len=%d,InterNum=%d,DecNum=%d,x=%d\r\n",len,IntNum,DecNum,pow10(IntNum));
  279. value=0;
  280. while(IntNum) //get the part of Int
  281. {
  282. num=*p++-0x30; //必须为0x30-0x39
  283. value+=num*_pow10(IntNum-1);
  284. IntNum--;
  285. };
  286. *data=(float)value;
  287. if(DecNum)
  288. {
  289. p++; //point
  290. count=DecNum;
  291. value=0;
  292. while(count) //get the part of dec
  293. {
  294. num=*p++-0x30; //必须为0x30-0x39
  295. value+=num*_pow10(count-1);
  296. count--;
  297. };
  298. *data+=(float)value/_pow10(DecNum);
  299. }
  300. return pos+len+1;
  301. }
  302. //取字符
  303. unsigned char* GetParamDataChar(unsigned char* pos,unsigned char* data, int max_len)
  304. {
  305. unsigned char len;
  306. unsigned char *p=pos;
  307. //int value;
  308. p++; //jump the first signed
  309. //len=(unsigned char*)strstr(p,",")-p;
  310. len=(unsigned char*)strchr(p,',')-p;
  311. //rt_printf("len=%d\r\n",len);
  312. if((len<=0)||len>max_len)
  313. {
  314. *data=0; //valid data
  315. return pos+len+1;
  316. }
  317. memcpy(data,p,len);
  318. return pos+len+1;
  319. }
  320. char* gps_char_data_get(char* pos, char end, int* data)
  321. {
  322. unsigned char len;
  323. len=strchr(pos,end)-pos;
  324. if((len<=0)||len>15)
  325. {
  326. *data=-1; //valid data
  327. return pos+len+1;
  328. }
  329. *data=atoi(pos);
  330. return pos+len+1;
  331. }
  332. int CheckDataFrameVaild(unsigned char *pos)
  333. {
  334. unsigned char *p=pos,tmp;
  335. volatile unsigned char AddValue=0;
  336. //if(strstr(p,"*")==NULL)
  337. if(strchr(p,'*')==NULL)
  338. return -1;
  339. if(*p++!='$')
  340. return -1;
  341. while(*p!='*')
  342. AddValue^=*p++;
  343. p++; //*
  344. tmp=(*p++-0x30)<<4;
  345. tmp|=(*p-0x30)<<0;
  346. rt_printf("tmp=0x%02X,AddValue=0x%02X\r\n",tmp,AddValue);
  347. if(tmp!=AddValue)
  348. {
  349. rt_printf("tmp=%s\r\n",pos);
  350. return 0;
  351. }
  352. return 1;
  353. }
  354. void UtcTimeToSysTime(struct rtc_time_t * rtc,GpsNmeaRmcDataType* utc,u8 opt)
  355. {
  356. char* p=&utc->Date[0];
  357. rtc->day=(*p-0x30)*10+*(p+1)-0x30;
  358. p+=2;
  359. rtc->month=(*p-0x30)*10+*(p+1)-0x30;
  360. p+=2;
  361. rtc->year=(*p-0x30)*10+*(p+1)-0x30;
  362. p+=2;
  363. p=&utc->UtcTime[0];
  364. rtc->hour=(*p-0x30)*10+*(p+1)-0x30;
  365. p+=2;
  366. rtc->min=(*p-0x30)*10+*(p+1)-0x30;
  367. p+=2;
  368. if(opt==1)
  369. rtc->ms=((*p-0x30)*10+*(p+1)-0x30)*1000+(*(p+3)-0x30)*100+(*(p+4)-0x30)*10+*(p+5)-0x30;
  370. else //取S
  371. rtc->ms=((*p-0x30)*10+*(p+1)-0x30)*1000;
  372. //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);
  373. }
  374. void gps_pluse_clear(void)
  375. {
  376. GpsNmeaRmcData.pluse_count = 0;
  377. }
  378. int GpsAdjustTimeFun(struct rtc_time_t* psrtc) //本函数只能被捕获中断服务函数调用
  379. {
  380. // static u8 counter=0;
  381. struct timespec ts;
  382. int res=FALSE;
  383. u64 MsOffset;
  384. static u8 power_on = 1;
  385. #ifdef CN_AREA_GUOWANG_FBC
  386. GpsNmeaRmcData.data_vaild_time = ustimer_get_origin();
  387. GpsNmeaRmcData.data_vaild = 1;
  388. if(GpsNmeaRmcData.slave_vaild == 0)
  389. return res;
  390. #endif
  391. if(++GpsNmeaRmcData.pluse_count<=tRunPara.GPS_sync_time) // 根据对时间隔判断修正
  392. {
  393. // GpsNmeaRmcData.DataValidFlag='0';
  394. return res;
  395. }
  396. GpsNmeaRmcData.wait_sync = 0;
  397. // counter=0;
  398. #ifdef CN_AREA_GUOWANG_FBC
  399. GpsNmeaRmcData.slave_vaild = 0;
  400. #else
  401. if(GpsNmeaRmcData.DataValidFlag!='Y' || !tRunPara.bGPS_sync_enable)
  402. return res;
  403. #endif
  404. GpsNmeaRmcData.DataValidFlag='0';
  405. //rtc_to_timespec(psrtc,&ts);
  406. #ifdef CN_AREA_GUOWANG_FBC
  407. GpsNmeaRmcData.ts.tv_sec+= tRunPara.GPS_sync_time + 1;
  408. GpsNmeaRmcData.ts.tv_nsec=20*1000 + 1000*1000; //补偿20us + 1ms
  409. #else
  410. GpsNmeaRmcData.ts.tv_sec+= 1;//tRunPara.GPS_sync_time + 1; //TODO EWEN
  411. GpsNmeaRmcData.ts.tv_nsec=20*1000; //补偿20us
  412. #ifdef KP_GPS_TEST
  413. GpsNmeaRmcData.ts.tv_sec+=4;
  414. #endif
  415. #endif
  416. gps_get_time(&ts); //当前系统的精准时间带ms的
  417. if(GpsNmeaRmcData.ts.tv_sec<=ts.tv_sec) //系统时间超前
  418. MsOffset=(ts.tv_sec-GpsNmeaRmcData.ts.tv_sec)*1000+ts.tv_nsec/1000000;
  419. else //系统时间滞后
  420. MsOffset=(GpsNmeaRmcData.ts.tv_sec-ts.tv_sec)*1000-ts.tv_nsec/1000000;
  421. if(MsOffset>=5 || power_on) //5ms
  422. {
  423. timespec_to_rtc(GpsNmeaRmcData.ts,psrtc,1); //D£ê±
  424. sys_time_set(psrtc);
  425. if(MsOffset>=1000 || power_on) //1Sò?é??ó2?????SOE
  426. {
  427. power_on = 0;
  428. GpsNmeaRmcData.DataValidFlag='S'; //SOE±ê??
  429. GpsNmeaRmcData.MsOffset=MsOffset;
  430. }
  431. else
  432. GpsNmeaRmcData.DataValidFlag='0';
  433. // rt_printf("set time=%d\r\n",MsOffset); //校准
  434. res=TRUE;
  435. }
  436. else
  437. GpsNmeaRmcData.DataValidFlag='0';
  438. return res;
  439. }
  440. float gps_angle_calc(float value)
  441. {
  442. float tmp_d,tmp_m,tmp_dot;
  443. u32 tmp;
  444. tmp = (u32)value;
  445. tmp_d = value;
  446. tmp_m = (float)(tmp_d - tmp);
  447. tmp_dot = tmp_m*100.0f/60.0f;
  448. tmp = value;
  449. return (float)(tmp+tmp_dot);
  450. }
  451. void gps_dms_calc(float value, u32 *d, u32 *m, float *s)
  452. {
  453. u32 tmp1,tmp2;
  454. tmp1 = (u32)value;
  455. tmp2 = (u32)value/100;
  456. *d = tmp2;
  457. *m = (u32)((value/100.0f - tmp2)*100.0f);
  458. *s = (float)(value - tmp1)*60.0f;
  459. }
  460. //GPS接收数据解析
  461. int GpsRecvDataFrameHandler(GPS_COMM* data)
  462. {
  463. static unsigned char LocalUtcTime[11];
  464. unsigned char* p=&data->arrRecvBuf[0];
  465. unsigned char* p1=&data->arrRecvBuf[0];
  466. u8 msg_no, valid_flag;
  467. if((ustimer_delay_origin2(&data->recv_wait_time, 3*USTIMER_SEC) <= 0) && !data->recv_handle)
  468. {
  469. return FALSE;
  470. }
  471. data->recv_handle = 1;
  472. if(data->GpsModuleRunStep==GPS_MODULE_INIT_STEP) //???????????????????????????
  473. data->GpsModuleRunStep=GPS_MODULE_NORMAL_RUN_STEP;
  474. else if(data->GpsModuleRunStep==GPS_MODULE_BAUD_CHECK_STEP) //查找到合适的波特率
  475. data->GpsModuleRunStep=GPS_MODULE_BAUD_SET_STEP;
  476. //if(!CheckDataFrameVaild(p))
  477. // return;
  478. // $GNRMC,051033.000,A,2222.12622,N,11329.24936,E,0.00,0.00,050825,,,A*79
  479. if(strstr(p1,"RMC")!=NULL)
  480. {
  481. p=strstr(p1,"RMC");
  482. memcpy(&GpsNmeaRmcData.SingleType,p1+1,2); //记录是BD还是GN,即北斗还是GPS
  483. GpsNmeaRmcData.SingleType[p-p1] = 0;
  484. p+=3;
  485. p=GetParamDataChar(p,&GpsNmeaRmcData.UtcTime[0],sizeof(GpsNmeaRmcData.UtcTime));
  486. p=GetParamDataChar(p,&valid_flag,sizeof(valid_flag)); //数据有效标志
  487. if(valid_flag!='A')
  488. {
  489. GpsNmeaRmcData.bd_sv_num=0;
  490. GpsNmeaRmcData.gp_sv_num=0;
  491. g_sw_pub.ac_in[PUB_AC_GPS_NUM_SV] = 0;
  492. if(soe_check(EV_GPS_SIGNAL_LOST)==false)
  493. {
  494. soe_record_ev(EV_GPS_SIGNAL_LOST, 1, 0,0,0);
  495. }
  496. #ifdef GPS_NUM_SHOW
  497. g_sw_pub.ac_in[PUB_AC_IN_GPS_NUM] = (qs16)((GpsNmeaRmcData.bd_sv_num + GpsNmeaRmcData.gp_sv_num)*Q16_BASE);
  498. #elif defined BD_GPS_NUM
  499. g_sw_pub.ac_in[PUB_AC_IN_BD_NUM] = (qs16)(GpsNmeaRmcData.bd_sv_num*Q16_BASE);
  500. g_sw_pub.ac_in[PUB_AC_IN_GPS_NUM] = (qs16)(GpsNmeaRmcData.gp_sv_num*Q16_BASE);
  501. #endif
  502. return FALSE;
  503. }
  504. GpsNmeaRmcData.data_vaild_time = ustimer_get_origin();
  505. GpsNmeaRmcData.data_vaild = 1;
  506. if(soe_check(EV_GPS_SIGNAL_LOST)==true)
  507. {
  508. soe_record_ev(EV_GPS_SIGNAL_LOST, 0, 0,0,0);
  509. }
  510. #ifdef GPS_ALIVE_SOE
  511. if(soe_check(EV_GPS_ALIVE)==false)
  512. {
  513. soe_record_ev(EV_GPS_ALIVE, 1, 0, 0, 0 );
  514. }
  515. #endif
  516. if(GpsNmeaRmcData.wait_sync)
  517. {
  518. // return FALSE;//临时屏蔽 by ewen
  519. }
  520. GpsNmeaRmcData.DataValidFlag = valid_flag;
  521. p=GetParamDataValue(p,&GpsNmeaRmcData.Latitude); //纬度
  522. p=GetParamDataChar(p,&GpsNmeaRmcData.LatitudeDir,sizeof(GpsNmeaRmcData.LatitudeDir)); //纬度方位
  523. p=GetParamDataValue(p,&GpsNmeaRmcData.Longtitude); //经度
  524. p=GetParamDataChar(p,&GpsNmeaRmcData.LongtitudeDir,sizeof(GpsNmeaRmcData.LongtitudeDir)); //经度方位
  525. p=GetParamDataValue(p,&GpsNmeaRmcData.Spd); //对地速度
  526. p=GetParamDataValue(p,&GpsNmeaRmcData.cog); //对地真航向
  527. p=GetParamDataChar(p,&GpsNmeaRmcData.Date[0],sizeof(GpsNmeaRmcData.Date)); //日期
  528. gps_pluse_clear();
  529. GpsNmeaRmcData.wait_sync = 1;
  530. memset(&GpsNmeaRmcData.UtcTime[8],'0',3); //去除毫秒 GPS模块机制
  531. // if(memcmp(GpsNmeaRmcData.UtcTime,LocalUtcTime,sizeof(GpsNmeaRmcData.UtcTime))) //若gps第一次获取到时间或者1s内第一次获取到时间则有效或者是GPS断线后第一次获取的时间
  532. {
  533. struct rtc_time_t rtc;
  534. UtcTimeToSysTime(&rtc,&GpsNmeaRmcData,0); // 先将BD的UTC时间转为RTC
  535. rtc_to_timespec(&rtc,&GpsNmeaRmcData.ts); // 再将RTC转为timespec时间(主要用timespec)
  536. GpsNmeaRmcData.ts.tv_sec+=8*60*60; //UTC->BEIJING
  537. GpsNmeaRmcData.DataValidFlag='Y';
  538. //zhl add
  539. if(gps_time_valid == 0){
  540. // printf("GpsNmeaRmcData.ts.tv_sec:%lld\n", GpsNmeaRmcData.ts.tv_sec);
  541. shared_gps_time = GpsNmeaRmcData.ts.tv_sec;
  542. gps_time_valid = 1;
  543. }
  544. //rt_printf("gene_flag=%d\r\n",GpsNmeaRmcData.DataValidFlag);
  545. memcpy(GpsNmeaRmcData.UtcTime,LocalUtcTime,sizeof(GpsNmeaRmcData.UtcTime));
  546. //rt_printf("recv gps uart data!");
  547. }
  548. gps_dms_calc(GpsNmeaRmcData.Longtitude, &GpsNmeaRmcData.Longtitude_dd, &GpsNmeaRmcData.Longtitude_mm, &GpsNmeaRmcData.Longtitude_ss);
  549. gps_dms_calc(GpsNmeaRmcData.Latitude, &GpsNmeaRmcData.Latitude_dd, &GpsNmeaRmcData.Latitude_mm, &GpsNmeaRmcData.Latitude_ss);
  550. #ifndef GPS_JWD_SPLIT
  551. g_sw_pub.ac_in[PUB_AC_GPS_LONGITUDE] = (qs16)(gps_angle_calc(GpsNmeaRmcData.Longtitude /100.0f)*Q16_BASE);
  552. g_sw_pub.ac_in[PUB_AC_GPS_LATITUDE] = (qs16)(gps_angle_calc(GpsNmeaRmcData.Latitude /100.0f)*Q16_BASE);
  553. #else
  554. g_sw_pub.ac_in[PUB_AC_GPS_LONGITUDE_D] =GpsNmeaRmcData.Longtitude_dd*Q16_BASE;
  555. g_sw_pub.ac_in[PUB_AC_GPS_LONGITUDE_M] =GpsNmeaRmcData.Longtitude_mm*Q16_BASE;
  556. g_sw_pub.ac_in[PUB_AC_GPS_LONGITUDE_S] =GpsNmeaRmcData.Longtitude_ss*Q16_BASE;
  557. g_sw_pub.ac_in[PUB_AC_GPS_LATITUDE_D] =GpsNmeaRmcData.Latitude_dd*Q16_BASE;
  558. g_sw_pub.ac_in[PUB_AC_GPS_LATITUDE_M] =GpsNmeaRmcData.Latitude_mm*Q16_BASE;
  559. g_sw_pub.ac_in[PUB_AC_GPS_LATITUDE_S] =GpsNmeaRmcData.Latitude_ss*Q16_BASE;
  560. #endif
  561. }
  562. else if(strstr(p1,"GSV")!=NULL)
  563. {
  564. if(strstr(p1,"BD")!=NULL)
  565. {
  566. u8 i;
  567. p = p1 + 7;
  568. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_msg_num);
  569. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_msg_no);
  570. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_sv_num);
  571. if(strstr(GpsNmeaRmcData.SingleType,"BD")!=NULL)
  572. {
  573. g_sw_pub.ac_in[PUB_AC_GPS_NUM_SV] = (qs16)(GpsNmeaRmcData.bd_sv_num*Q16_BASE);
  574. }
  575. if(GpsNmeaRmcData.bd_sv_num > GPS_NUM_MAX)
  576. return FALSE;
  577. GpsNmeaRmcData.gsv_time = ustimer_get_origin();
  578. msg_no = GpsNmeaRmcData.bd_msg_no-1;
  579. if(GpsNmeaRmcData.bd_msg_no*4 < GPS_NUM_MAX)
  580. {
  581. for(i=0; i<4; i++)
  582. {
  583. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_gsv[msg_no*4+i].id);
  584. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_gsv[msg_no*4+i].ele);
  585. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_gsv[msg_no*4+i].az);
  586. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_gsv[msg_no*4+i].cn0);
  587. GpsNmeaRmcData.bd_gsv[msg_no*4+i].valid = 1;
  588. GpsNmeaRmcData.bd_online_time[msg_no*4+i] = ustimer_get_origin();
  589. }
  590. }
  591. }
  592. else if(strstr(p1,"GP")!=NULL)
  593. {
  594. u8 i;
  595. p = p1 + 7;
  596. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_msg_num);
  597. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_msg_no);
  598. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_sv_num);
  599. // rt_printf("GPS卫星:%d台\r\n", GpsNmeaRmcData.gp_sv_num);
  600. if(GpsNmeaRmcData.gp_sv_num > GPS_NUM_MAX)
  601. return FALSE;
  602. if(strstr(GpsNmeaRmcData.SingleType,"GN")!=NULL)
  603. {
  604. g_sw_pub.ac_in[PUB_AC_GPS_NUM_SV] = (qs16)(GpsNmeaRmcData.gp_sv_num*Q16_BASE);
  605. }
  606. GpsNmeaRmcData.gsv_time = ustimer_get_origin();
  607. msg_no = GpsNmeaRmcData.gp_msg_no-1;
  608. if(GpsNmeaRmcData.gp_msg_no*4 < GPS_NUM_MAX)
  609. {
  610. for(i=0; i<4; i++)
  611. {
  612. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_gsv[msg_no*4+i].id);
  613. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_gsv[msg_no*4+i].ele);
  614. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_gsv[msg_no*4+i].az);
  615. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_gsv[msg_no*4+i].cn0);
  616. GpsNmeaRmcData.gp_gsv[msg_no*4+i].valid = 1;
  617. GpsNmeaRmcData.gp_online_time[msg_no*4+i] = ustimer_get_origin();
  618. }
  619. }
  620. }
  621. }
  622. else
  623. {
  624. #if 0
  625. if((data->GpsModuleRunStep==GPS_MODULE_NORMAL_RUN_STEP)&&(strstr(p,"TXT")==NULL)) //正常运行后若发现收到其他数据则下发配置指令
  626. #else
  627. if((data->GpsModuleRunStep==GPS_MODULE_NORMAL_RUN_STEP)&&(strstr(p,"GSV")==NULL))
  628. #endif
  629. {
  630. data->GpsModuleRunStep=GPS_MODULE_NEMA_SEL_STEP; //若配置不成功可循环配置
  631. }
  632. }
  633. return TRUE;
  634. }
  635. void GpsSwitchBaudrateFun(GPS_COMM* data, GpsCtrlCmdEnumType GpsCtrlCmd)
  636. {
  637. int ret;
  638. u8 chnl=data->chnl;
  639. GpsModuleRunStepEnum LocalGpsModuleRunStep=data->GpsModuleRunStep;
  640. memset(&g_tRsComm[chnl],0,sizeof(g_tRsComm[chnl]));
  641. g_tRsComm[chnl].ptBuf=(BYTE*)&g_tRsIEC[chnl];
  642. GPSCommInit((GPS_COMM *)g_tRsComm[chnl].ptBuf,chnl);
  643. //uart_open(UART_CHANNEL[chnl],tRunPara.tUartPara[i].wBaud,tRunPara.tUartPara[i].wParity);
  644. #if defined(BSP_DTU3) || defined(BSP_DTU2) || defined(BSP_DTU4)
  645. uart_open(UART_CHANNEL[chnl],GpsCommBuadrateTbl[GpsCtrlCmd],PARITY_NONE1);
  646. #else
  647. ret = uart_open(UART_CHANNEL[chnl],GpsCommBuadrateTbl[GpsCtrlCmd],PARITY_NONE_1);
  648. if (ret < 0)
  649. {
  650. printf("%s: outside uart %d open failed!\n", __FUNCTION__, UART_CHANNEL[chnl]);
  651. }
  652. #endif
  653. RS_Ena_Init(chnl);
  654. RS_Recv_Enable(chnl);
  655. data->GpsModuleRunStep=LocalGpsModuleRunStep; //串口初始化 存储的数据都被清0
  656. //rt_printf("Set baud:%d\r\n",GpsCommBuadrateTbl[GpsCtrlCmd]);
  657. }
  658. void GpsModuleFunInit(GPS_COMM* data)
  659. {
  660. static GpsCtrlCmdEnumType GpsSwitchBaudrate;
  661. static uint32_t us0=0;
  662. u8 count,chnl=data->chnl,i;
  663. int ret;
  664. if(us0==0)
  665. us0=ustimer_get_origin();
  666. if(ustimer_delay_origin2(&us0,USTIMER_SEC*2)>0)
  667. {
  668. // rt_printf("Step:%d\r\n",data->GpsModuleRunStep);
  669. switch(data->GpsModuleRunStep)
  670. {
  671. case GPS_MODULE_INIT_STEP:
  672. data->GpsModuleRunStep++;
  673. GpsSwitchBaudrate=GPS_SET_BUADRATE1_CMD;
  674. break;
  675. case GPS_MODULE_BAUD_CHECK_STEP:
  676. GpsSwitchBaudrateFun(data,GpsSwitchBaudrate);
  677. if(++GpsSwitchBaudrate>GPS_SET_BUADRATE5_CMD)
  678. GpsSwitchBaudrate=GPS_SET_BUADRATE0_CMD;
  679. //data->GpsModuleRunStep=GPS_MODULE_BAUD_SET_STEP;
  680. break;
  681. case GPS_MODULE_BAUD_SET_STEP:
  682. for(count=0; count<sizeof(GpsCommBuadrateTbl)/4; count++)
  683. {
  684. if(tRunPara.tUartPara[data->chnl].dBaud==GpsCommBuadrateTbl[count])
  685. break;
  686. }
  687. if(count==sizeof(GpsCommBuadrateTbl)/4)
  688. ; //ERROR
  689. else
  690. {
  691. GPS_Comm_Send(data,(char*)GpsNmeaCmdData[count],sizeof(GpsNmeaCmdData[count])); //根据定值配置模块的波特率
  692. }
  693. data->GpsModuleRunStep++;
  694. break;
  695. case GPS_MODULE_BAUD_FINISH_STEP: //找到合适的波特率
  696. #if 1
  697. memset(&g_tRsComm[chnl],0,sizeof(g_tRsComm[chnl]));
  698. g_tRsComm[chnl].ptBuf=(BYTE*)&g_tRsIEC[chnl];
  699. GPSCommInit((GPS_COMM *)g_tRsComm[chnl].ptBuf,chnl); //运行步骤恢复初始状态
  700. ret = uart_open(UART_CHANNEL[chnl],tRunPara.tUartPara[chnl].dBaud,tRunPara.tUartPara[chnl].wParity);
  701. if (ret < 0)
  702. {
  703. printf("%s: outside uart %d open failed!\n", __FUNCTION__, UART_CHANNEL[chnl]);
  704. }
  705. RS_Ena_Init(chnl);
  706. RS_Recv_Enable(chnl);
  707. #endif
  708. GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD]));
  709. // rt_printf("GPS_MODULE_BAUD_FINISH_STEP.\r\n");
  710. data->GpsModuleRunStep = GPS_MODULE_UPDATE_FREQ_STEP;//GPS_MODULE_NORMAL_RUN_STEP;
  711. break;
  712. case GPS_MODULE_NEMA_SEL_STEP:
  713. // rt_printf("GPS_MODULE_NEMA_SEL_STEP = %d.\r\n", sizeof(GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD]));
  714. GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD]));
  715. data->GpsModuleRunStep++;
  716. break;
  717. case GPS_MODULE_NAVI_SYS_STEP:
  718. // rt_printf("GPS_MODULE_NAVI_SYS_STEP.\r\n");
  719. GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_NAVI_SYS_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_NAVI_SYS_CMD]));
  720. data->GpsModuleRunStep=GPS_MODULE_NORMAL_RUN_STEP;
  721. break;
  722. case GPS_MODULE_UPDATE_FREQ_STEP:
  723. // rt_printf("GPS_MODULE_UPDATE_FREQ_STEP.\r\n");
  724. GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_UPDATE_FREQ_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_UPDATE_FREQ_CMD]));
  725. data->GpsModuleRunStep++;
  726. break;
  727. case GPS_MODULE_SYS_STEP:
  728. if(tRunPara.GPS_Mode == 1) //北斗
  729. {
  730. rt_printf("选择北斗系统.\r\n");
  731. GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_BD_SYS_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_BD_SYS_CMD]));
  732. }
  733. else if(tRunPara.GPS_Mode == 2) //GPS
  734. {
  735. rt_printf("选择GPS系统.\r\n");
  736. GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_GPS_SYS_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_GPS_SYS_CMD]));
  737. }
  738. else
  739. {
  740. rt_printf("选择北斗/GPS系统.\r\n");
  741. GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_NAVI_SYS_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_NAVI_SYS_CMD]));
  742. }
  743. data->GpsModuleRunStep++;
  744. GpsNmeaRmcData.bd_sv_num = 0;
  745. GpsNmeaRmcData.gp_sv_num = 0;
  746. for(i=0; i<GPS_NUM_MAX; i++)
  747. {
  748. GpsNmeaRmcData.bd_gsv[i].valid = 0;
  749. GpsNmeaRmcData.gp_gsv[i].valid = 0;
  750. }
  751. data->recv_wait_time = ustimer_get_origin();
  752. data->recv_handle = 0;
  753. break;
  754. case GPS_MODULE_NORMAL_RUN_STEP:
  755. default:
  756. break;
  757. }
  758. }
  759. }
  760. void GpsSendBaudrateCmd(GPS_COMM* p)
  761. {
  762. u8 i=0;
  763. char* ptr=&SendBuf[0];
  764. //memset(ptr,'A',20);
  765. //ptr+=20;
  766. //*ptr++='\r';
  767. //*ptr++='\n';
  768. ptr[i++]='$';
  769. #if 0 // xxxxxx 20220920 add 此函数没有用上,消除警告
  770. GPS_Comm_Send(p,ptr-22,22);
  771. #endif
  772. }
  773. void GPS_Comm_Send(GPS_COMM* p,char* data,unsigned char datalen) //发送命令
  774. {
  775. unsigned char *ptr=&g_tRsComm[p->chnl].sendbuf[0];
  776. *ptr++=datalen;
  777. //rt_printf("TX:%s\r\n",data);
  778. memcpy(ptr,data,datalen);
  779. g_tRsComm[p->chnl].nSendCnt=1; //第一个字节为长度
  780. g_tRsComm[p->chnl].bSend=TRUE;
  781. }
  782. #if 0
  783. void GenerateSecdPluse(void)
  784. {
  785. static uint32_t us0=0;
  786. static u8 state=0;
  787. if(us0==0)
  788. us0=ustimer_get_origin();
  789. switch(state)
  790. {
  791. case 0:
  792. if(ustimer_delay_origin2(&us0,USTIMER_MS*600)>0)
  793. {
  794. GPIO_KOUT0_OFF();
  795. GPIO_KOUT1_OFF();
  796. state=1;
  797. rt_printf("high=%d\r\n",ustimer_get_origin());
  798. }
  799. break;
  800. case 1:
  801. if(ustimer_delay_origin2(&us0,USTIMER_MS*50)>0)
  802. {
  803. GPIO_KOUT0_ON();
  804. GPIO_KOUT1_ON();
  805. state=0;
  806. rt_printf("low=%d\r\n",ustimer_get_origin());
  807. }
  808. break;
  809. default:
  810. break;
  811. }
  812. }
  813. #endif
  814. char gps_data_valid_get(void)
  815. {
  816. return GpsNmeaRmcData.data_vaild;
  817. }
  818. void gps_info_printf(void)
  819. {
  820. struct rtc_time_t rtc;
  821. u16 i;
  822. rt_printf("GPS串口数据:");
  823. if(gps_data_valid_get() == 'A' || gps_data_valid_get() == 1)
  824. {
  825. rt_printf("\r\n");
  826. rt_printf(" 系统:%s\r\n", GpsNmeaRmcData.SingleType);
  827. timespec_to_rtc(GpsNmeaRmcData.ts,&rtc,1);
  828. rt_printf(" 时间:%04d-%02d-%02d,%02d:%02d:%02d.%03d\r\n", 2000+rtc.year, rtc.month, rtc.day, rtc.hour,
  829. rtc.min, rtc.ms/1000, rtc.ms%1000);
  830. rt_printf(" 经度:%f°(%d°%d′%f″)\r\n", gps_angle_calc(GpsNmeaRmcData.Longtitude/100.0f), GpsNmeaRmcData.Longtitude_dd, GpsNmeaRmcData.Longtitude_mm, GpsNmeaRmcData.Longtitude_ss);
  831. rt_printf(" 纬度:%f°(%d°%d′%f″)\r\n", gps_angle_calc(GpsNmeaRmcData.Latitude/100.0f), GpsNmeaRmcData.Latitude_dd, GpsNmeaRmcData.Latitude_mm, GpsNmeaRmcData.Latitude_ss);
  832. rt_printf("==============================================\r\n");
  833. if(GpsNmeaRmcData.bd_sv_num > 0)
  834. {
  835. rt_printf("北斗卫星:%d台\r\n", GpsNmeaRmcData.bd_sv_num);
  836. for(i=0; i<GPS_NUM_MAX; i++)
  837. {
  838. if((GpsNmeaRmcData.bd_gsv[i].valid == 1) && (GpsNmeaRmcData.bd_gsv[i].id > 0))
  839. {
  840. if(GpsNmeaRmcData.bd_gsv[i].id > 0)
  841. rt_printf(" [卫星编号:%d ", GpsNmeaRmcData.bd_gsv[i].id);
  842. else
  843. rt_printf(" [卫星编号:- ");
  844. if(GpsNmeaRmcData.bd_gsv[i].ele > 0)
  845. rt_printf("仰角: %d ", GpsNmeaRmcData.bd_gsv[i].ele);
  846. else
  847. rt_printf("仰角: - ");
  848. if(GpsNmeaRmcData.bd_gsv[i].az > 0)
  849. rt_printf("方位角: %d ", GpsNmeaRmcData.bd_gsv[i].az);
  850. else
  851. rt_printf("方位角: - ");
  852. if(GpsNmeaRmcData.bd_gsv[i].cn0 > 0)
  853. rt_printf("载噪比: %d]\r\n", GpsNmeaRmcData.bd_gsv[i].cn0);
  854. else
  855. rt_printf("载噪比: -]\r\n");
  856. }
  857. }
  858. }
  859. else
  860. {
  861. rt_printf("北斗卫星:-\r\n");
  862. }
  863. rt_printf("==============================================\r\n");
  864. if(GpsNmeaRmcData.gp_sv_num > 0)
  865. {
  866. rt_printf("GPS卫星:%d台\r\n", GpsNmeaRmcData.gp_sv_num);
  867. for(i=0; i<GPS_NUM_MAX; i++)
  868. {
  869. if((GpsNmeaRmcData.gp_gsv[i].valid == 1) && (GpsNmeaRmcData.gp_gsv[i].id > 0))
  870. {
  871. if(GpsNmeaRmcData.gp_gsv[i].id > 0)
  872. rt_printf(" [卫星编号:%d ", GpsNmeaRmcData.gp_gsv[i].id);
  873. else
  874. rt_printf(" [卫星编号:- ");
  875. if(GpsNmeaRmcData.gp_gsv[i].ele > 0)
  876. rt_printf("仰角: %d ", GpsNmeaRmcData.gp_gsv[i].ele);
  877. else
  878. rt_printf("仰角: - ");
  879. if(GpsNmeaRmcData.gp_gsv[i].az > 0)
  880. rt_printf("方位角: %d ", GpsNmeaRmcData.gp_gsv[i].az);
  881. else
  882. rt_printf("方位角: - ");
  883. if(GpsNmeaRmcData.gp_gsv[i].cn0 > 0)
  884. rt_printf("载噪比: %d]\r\n", GpsNmeaRmcData.gp_gsv[i].cn0);
  885. else
  886. rt_printf("载噪比: -]\r\n");
  887. }
  888. }
  889. }
  890. else
  891. {
  892. rt_printf("GPS卫星:-\r\n");
  893. }
  894. }
  895. else if(gps_data_valid_get() == 'V')
  896. {
  897. rt_printf("\r\n");
  898. rt_printf(" 系统:无效\r\n");
  899. rt_printf(" 时间:无效\r\n");
  900. rt_printf(" 经度:无效\r\n");
  901. rt_printf(" 纬度:无效\r\n");
  902. }
  903. else
  904. {
  905. rt_printf("无\r\n");
  906. }
  907. }
  908. int is_gps_alive(void)
  909. {
  910. return tRunPara.bGPS_sync_enable && GpsNmeaRmcData.data_vaild;
  911. }
  912. //从机时间同步
  913. int gps_slave_sync(struct timespec* ts)
  914. {
  915. if(tRunPara.bGPS && GpsNmeaRmcData.data_vaild) //打开秒脉冲对时
  916. {
  917. gps_pluse_clear();
  918. GpsNmeaRmcData.ts = *ts;
  919. GpsNmeaRmcData.slave_vaild = 1;
  920. return 1;
  921. }
  922. return 0;
  923. }
  924. void gps_init_step_set(u8 step)
  925. {
  926. u8 i;
  927. for(i=0;i<CFG_UART_NUM_MAX;i++)
  928. {
  929. // ???????,??
  930. if(UART_CHANNEL[i]< 0 )
  931. {
  932. continue;
  933. }
  934. if(tRunPara.tUartPara[i].wProtocol==PROTOCOL_GPS)
  935. {
  936. ((GPS_COMM *)g_tRsComm[i].ptBuf)->GpsModuleRunStep = step;
  937. }
  938. }
  939. }
  940. #endif