gps_uart.c 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064
  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. extern int rtc_to_timespec(struct rtc_time_t *p_rtc, struct timespec *p_ts);
  61. GPS_SYNC_DELAY gps_sync;
  62. extern unsigned int g_keep_alive_gps;
  63. /******************************************************************************
  64. 函数名称:
  65. 函数版本: 01.01
  66. 创建作者:
  67. 创建日期:
  68. 函数说明:
  69. 参数说明:
  70. 返回值:
  71. 0: 成功
  72. 其它: 失败
  73. 修改记录:
  74. */
  75. extern struct timespec g_sys_time;
  76. char gps_crc(const char *p, u8 length)
  77. {
  78. char crc = p[0];
  79. u8 i;
  80. for (i = 1; i < length; i++)
  81. {
  82. crc ^= p[i];
  83. }
  84. return crc;
  85. }
  86. void GPSCommInit(GPS_COMM *p, u8 chnl) // 初始化
  87. {
  88. memset(p, 0, sizeof(GPS_COMM));
  89. p->type = IEC_MODBUS_M;
  90. p->chnl = chnl;
  91. p->bData = false;
  92. // p->arrSendBuf=&g_tRsComm[chnl].sendbuf[0];
  93. ResetUartGPSLink(p);
  94. // rt_printf("gps com init\r\n"); //TODO ygl -
  95. }
  96. void ResetUartGPSLink(GPS_COMM *p) // 重置
  97. {
  98. p->cTypeCounter = GPS_FRAME_HEAD;
  99. p->cRecvCnt = 0;
  100. }
  101. void GPS_Recv(GPS_COMM *p, BYTE byRevData)
  102. {
  103. static unsigned char RecvCounter;
  104. if (p->bData)
  105. {
  106. p->cTypeCounter = GPS_FRAME_HEAD;
  107. return;
  108. }
  109. p->arrRecvBuf[p->cRecvCnt++] = byRevData; // 接收数据
  110. switch (p->cTypeCounter)
  111. {
  112. case GPS_FRAME_HEAD: //
  113. if (byRevData == '$') // 开始符号
  114. {
  115. // rt_printf("GPS_FRAME_HEAD\r\n");
  116. p->cTypeCounter++;
  117. }
  118. else
  119. {
  120. ResetUartGPSLink(p);
  121. }
  122. break;
  123. case GPS_FRAME_DATA:
  124. if (byRevData == '*') // 数据结束段
  125. {
  126. // rt_printf("GPS_FRAME_DATA\r\n");
  127. RecvCounter = 0;
  128. p->cTypeCounter = GPS_FRAME_TAIL;
  129. // p->nTypeCounter=GPS_FRAME_TAIL;
  130. }
  131. else if (p->cRecvCnt > GPS_UART_MAX_LEN) // 数据异常保护后续需要修改
  132. // else if(p->nRecvCnt>GPS_UART_MAX_LEN) //数据异常保护后续需要修改
  133. {
  134. ResetUartGPSLink(p);
  135. }
  136. break;
  137. case GPS_FRAME_TAIL:
  138. if (byRevData == '\n') // 回车符
  139. {
  140. p->cTypeCounter = GPS_FRAME_HEAD;
  141. // p->nTypeCounter=GPS_FRAME_HEAD;
  142. p->bData = true;
  143. // rt_printf("GPS_FRAME_TAIL\r\n");
  144. // rt_printf("data: %s\r\n", p->arrRecvBuf);
  145. }
  146. else if (++RecvCounter >= 4)
  147. {
  148. ResetUartGPSLink(p);
  149. }
  150. break;
  151. default:
  152. ResetUartGPSLink(p);
  153. break;
  154. }
  155. }
  156. void GPS_Timer(void)
  157. {
  158. u8 i;
  159. // TODO 待处理秒脉冲 by ewen
  160. // if(g_clock_mode != CLOCK_MODE_GPS_SECOND)
  161. // {
  162. // if(soe_check(EV_GPS_ADJUST_TIME)==true)
  163. // {
  164. // soe_record_ev(EV_GPS_ADJUST_TIME,0, 0,0,0 );
  165. // }
  166. return;
  167. // }
  168. if (ustimer_delay_origin2(&GpsNmeaRmcData.data_vaild_time, 60 * tRunPara.GPS_switch_delay * USTIMER_SEC))
  169. {
  170. GpsNmeaRmcData.data_vaild = 0;
  171. // TODO by ewen
  172. // if(soe_check(EV_GPS_ADJUST_TIME)==true)
  173. // {
  174. // soe_record_ev(EV_GPS_ADJUST_TIME,0, 0,0,0 );
  175. // }
  176. }
  177. if (ustimer_delay_origin2(&GpsNmeaRmcData.gsv_time, 30 * USTIMER_SEC))
  178. {
  179. GpsNmeaRmcData.bd_sv_num = 0;
  180. GpsNmeaRmcData.gp_sv_num = 0;
  181. }
  182. for (i = 0; i < GPS_NUM_MAX; i++)
  183. {
  184. if (ustimer_delay_origin2(&GpsNmeaRmcData.bd_online_time[i], 180 * USTIMER_SEC))
  185. {
  186. GpsNmeaRmcData.bd_gsv[i].valid = 0;
  187. }
  188. if (ustimer_delay_origin2(&GpsNmeaRmcData.gp_online_time[i], 180 * USTIMER_SEC))
  189. {
  190. GpsNmeaRmcData.gp_gsv[i].valid = 0;
  191. }
  192. }
  193. if (GpsNmeaRmcData.data_vaild == 0)
  194. {
  195. #ifdef GPS_ALIVE_SOE
  196. if (soe_check(EV_GPS_ALIVE) == true)
  197. {
  198. soe_record_ev(EV_GPS_ALIVE, 0, 0, 0, 0);
  199. }
  200. #endif
  201. GpsNmeaRmcData.bd_sv_num = 0;
  202. GpsNmeaRmcData.gp_sv_num = 0;
  203. }
  204. #ifdef GPS_NUM_SHOW
  205. g_sw_pub.ac_in[PUB_AC_IN_GPS_NUM] = (qs16)((GpsNmeaRmcData.bd_sv_num + GpsNmeaRmcData.gp_sv_num) * Q16_BASE);
  206. #elif defined BD_GPS_NUM
  207. g_sw_pub.ac_in[PUB_AC_IN_BD_NUM] = (qs16)(GpsNmeaRmcData.bd_sv_num * Q16_BASE);
  208. g_sw_pub.ac_in[PUB_AC_IN_GPS_NUM] = (qs16)(GpsNmeaRmcData.gp_sv_num * Q16_BASE);
  209. #endif
  210. }
  211. void GPS_Comm_App(GPS_COMM *p)
  212. {
  213. #ifdef ADD_PLUSE_OUTPUT
  214. GenerateSecdPluse();
  215. #endif
  216. GPS_Timer();
  217. // if(!g_clock_mode_gps)
  218. // return;
  219. GpsModuleFunInit(p);
  220. if (GpsNmeaRmcData.DataValidFlag == 'S') // soeê??t
  221. {
  222. struct rtc_time_t rtc;
  223. // TODO by ewen
  224. // 此处写RTC,但是在设置系统时间时已交由系统写入此处不用再写
  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 <= tRunPara.GPS_sync_time) // 根据对时间隔判断修正
  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.bGPS_sync_enable)
  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. GpsNmeaRmcData.bd_sv_num = 0;
  489. GpsNmeaRmcData.gp_sv_num = 0;
  490. g_sw_pub.ac_in[PUB_AC_GPS_NUM_SV] = 0;
  491. #ifdef GPS_NUM_SHOW
  492. g_sw_pub.ac_in[PUB_AC_IN_GPS_NUM] = (qs16)((GpsNmeaRmcData.bd_sv_num + GpsNmeaRmcData.gp_sv_num) * Q16_BASE);
  493. #elif defined BD_GPS_NUM
  494. g_sw_pub.ac_in[PUB_AC_IN_BD_NUM] = (qs16)(GpsNmeaRmcData.bd_sv_num * Q16_BASE);
  495. g_sw_pub.ac_in[PUB_AC_IN_GPS_NUM] = (qs16)(GpsNmeaRmcData.gp_sv_num * Q16_BASE);
  496. #endif
  497. return FALSE;
  498. }
  499. GpsNmeaRmcData.data_vaild_time = ustimer_get_origin();
  500. GpsNmeaRmcData.data_vaild = 1;
  501. #ifdef GPS_ALIVE_SOE
  502. if (soe_check(EV_GPS_ALIVE) == false)
  503. {
  504. soe_record_ev(EV_GPS_ALIVE, 1, 0, 0, 0);
  505. }
  506. #endif
  507. if (GpsNmeaRmcData.wait_sync)
  508. {
  509. // return FALSE;//临时屏蔽 by ewen
  510. }
  511. GpsNmeaRmcData.DataValidFlag = valid_flag;
  512. p = GetParamDataValue(p, &GpsNmeaRmcData.Latitude); // 纬度
  513. p = GetParamDataChar(p, &GpsNmeaRmcData.LatitudeDir, sizeof(GpsNmeaRmcData.LatitudeDir)); // 纬度方位
  514. p = GetParamDataValue(p, &GpsNmeaRmcData.Longtitude); // 经度
  515. p = GetParamDataChar(p, &GpsNmeaRmcData.LongtitudeDir, sizeof(GpsNmeaRmcData.LongtitudeDir)); // 经度方位
  516. p = GetParamDataValue(p, &GpsNmeaRmcData.Spd); // 对地速度
  517. p = GetParamDataValue(p, &GpsNmeaRmcData.cog); // 对地真航向
  518. p = GetParamDataChar(p, &GpsNmeaRmcData.Date[0], sizeof(GpsNmeaRmcData.Date)); // 日期
  519. gps_pluse_clear();
  520. GpsNmeaRmcData.wait_sync = 1;
  521. memset(&GpsNmeaRmcData.UtcTime[8], '0', 3); // 去除毫秒 GPS模块机制
  522. // if(memcmp(GpsNmeaRmcData.UtcTime,LocalUtcTime,sizeof(GpsNmeaRmcData.UtcTime))) //若gps第一次获取到时间或者1s内第一次获取到时间则有效或者是GPS断线后第一次获取的时间
  523. {
  524. struct rtc_time_t rtc;
  525. UtcTimeToSysTime(&rtc, &GpsNmeaRmcData, 0); // 先将BD的UTC时间转为RTC
  526. rtc_to_timespec(&rtc, &GpsNmeaRmcData.ts); // 再将RTC转为timespec时间(主要用timespec)
  527. GpsNmeaRmcData.ts.tv_sec += 8 * 60 * 60; // UTC->BEIJING
  528. GpsNmeaRmcData.DataValidFlag = 'Y';
  529. // zhl add
  530. if (gps_time_valid == 0)
  531. {
  532. // printf("GpsNmeaRmcData.ts.tv_sec:%lld\n", GpsNmeaRmcData.ts.tv_sec);
  533. shared_gps_time = GpsNmeaRmcData.ts.tv_sec;
  534. gps_time_valid = 1;
  535. }
  536. // rt_printf("gene_flag=%d\r\n",GpsNmeaRmcData.DataValidFlag);
  537. memcpy(GpsNmeaRmcData.UtcTime, LocalUtcTime, sizeof(GpsNmeaRmcData.UtcTime));
  538. // rt_printf("recv gps uart data!");
  539. }
  540. gps_dms_calc(GpsNmeaRmcData.Longtitude, &GpsNmeaRmcData.Longtitude_dd, &GpsNmeaRmcData.Longtitude_mm, &GpsNmeaRmcData.Longtitude_ss);
  541. gps_dms_calc(GpsNmeaRmcData.Latitude, &GpsNmeaRmcData.Latitude_dd, &GpsNmeaRmcData.Latitude_mm, &GpsNmeaRmcData.Latitude_ss);
  542. #ifndef GPS_JWD_SPLIT
  543. g_sw_pub.ac_in[PUB_AC_GPS_LONGITUDE] = (qs16)(gps_angle_calc(GpsNmeaRmcData.Longtitude / 100.0f) * Q16_BASE);
  544. g_sw_pub.ac_in[PUB_AC_GPS_LATITUDE] = (qs16)(gps_angle_calc(GpsNmeaRmcData.Latitude / 100.0f) * Q16_BASE);
  545. #else
  546. g_sw_pub.ac_in[PUB_AC_GPS_LONGITUDE_D] = GpsNmeaRmcData.Longtitude_dd * Q16_BASE;
  547. g_sw_pub.ac_in[PUB_AC_GPS_LONGITUDE_M] = GpsNmeaRmcData.Longtitude_mm * Q16_BASE;
  548. g_sw_pub.ac_in[PUB_AC_GPS_LONGITUDE_S] = GpsNmeaRmcData.Longtitude_ss * Q16_BASE;
  549. g_sw_pub.ac_in[PUB_AC_GPS_LATITUDE_D] = GpsNmeaRmcData.Latitude_dd * Q16_BASE;
  550. g_sw_pub.ac_in[PUB_AC_GPS_LATITUDE_M] = GpsNmeaRmcData.Latitude_mm * Q16_BASE;
  551. g_sw_pub.ac_in[PUB_AC_GPS_LATITUDE_S] = GpsNmeaRmcData.Latitude_ss * Q16_BASE;
  552. #endif
  553. }
  554. else if (strstr(p1, "GSV") != NULL)
  555. {
  556. if (strstr(p1, "BD") != NULL)
  557. {
  558. u8 i;
  559. p = p1 + 7;
  560. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_msg_num);
  561. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_msg_no);
  562. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_sv_num);
  563. if (strstr(GpsNmeaRmcData.SingleType, "BD") != NULL)
  564. {
  565. g_sw_pub.ac_in[PUB_AC_GPS_NUM_SV] = (qs16)(GpsNmeaRmcData.bd_sv_num * Q16_BASE);
  566. }
  567. if (GpsNmeaRmcData.bd_sv_num > GPS_NUM_MAX)
  568. return FALSE;
  569. GpsNmeaRmcData.gsv_time = ustimer_get_origin();
  570. msg_no = GpsNmeaRmcData.bd_msg_no - 1;
  571. if (GpsNmeaRmcData.bd_msg_no * 4 < GPS_NUM_MAX)
  572. {
  573. for (i = 0; i < 4; i++)
  574. {
  575. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_gsv[msg_no * 4 + i].id);
  576. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_gsv[msg_no * 4 + i].ele);
  577. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_gsv[msg_no * 4 + i].az);
  578. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_gsv[msg_no * 4 + i].cn0);
  579. GpsNmeaRmcData.bd_gsv[msg_no * 4 + i].valid = 1;
  580. GpsNmeaRmcData.bd_online_time[msg_no * 4 + i] = ustimer_get_origin();
  581. }
  582. }
  583. }
  584. else if (strstr(p1, "GP") != NULL)
  585. {
  586. u8 i;
  587. p = p1 + 7;
  588. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_msg_num);
  589. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_msg_no);
  590. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_sv_num);
  591. // rt_printf("GPS卫星:%d台\r\n", GpsNmeaRmcData.gp_sv_num);
  592. if (GpsNmeaRmcData.gp_sv_num > GPS_NUM_MAX)
  593. return FALSE;
  594. if (strstr(GpsNmeaRmcData.SingleType, "GN") != NULL)
  595. {
  596. g_sw_pub.ac_in[PUB_AC_GPS_NUM_SV] = (qs16)(GpsNmeaRmcData.gp_sv_num * Q16_BASE);
  597. }
  598. GpsNmeaRmcData.gsv_time = ustimer_get_origin();
  599. msg_no = GpsNmeaRmcData.gp_msg_no - 1;
  600. if (GpsNmeaRmcData.gp_msg_no * 4 < GPS_NUM_MAX)
  601. {
  602. for (i = 0; i < 4; i++)
  603. {
  604. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_gsv[msg_no * 4 + i].id);
  605. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_gsv[msg_no * 4 + i].ele);
  606. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_gsv[msg_no * 4 + i].az);
  607. p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_gsv[msg_no * 4 + i].cn0);
  608. GpsNmeaRmcData.gp_gsv[msg_no * 4 + i].valid = 1;
  609. GpsNmeaRmcData.gp_online_time[msg_no * 4 + i] = ustimer_get_origin();
  610. }
  611. }
  612. }
  613. }
  614. else
  615. {
  616. #if 0
  617. if((data->GpsModuleRunStep==GPS_MODULE_NORMAL_RUN_STEP)&&(strstr(p,"TXT")==NULL)) //正常运行后若发现收到其他数据则下发配置指令
  618. #else
  619. if ((data->GpsModuleRunStep == GPS_MODULE_NORMAL_RUN_STEP) && (strstr(p, "GSV") == NULL))
  620. #endif
  621. {
  622. data->GpsModuleRunStep = GPS_MODULE_NEMA_SEL_STEP; // 若配置不成功可循环配置
  623. }
  624. }
  625. return TRUE;
  626. }
  627. void GpsSwitchBaudrateFun(GPS_COMM *data, GpsCtrlCmdEnumType GpsCtrlCmd)
  628. {
  629. int ret;
  630. u8 chnl = data->chnl;
  631. GpsModuleRunStepEnum LocalGpsModuleRunStep = data->GpsModuleRunStep;
  632. memset(&g_tRsComm[chnl], 0, sizeof(g_tRsComm[chnl]));
  633. g_tRsComm[chnl].ptBuf = (BYTE *)&g_tRsIEC[chnl];
  634. GPSCommInit((GPS_COMM *)g_tRsComm[chnl].ptBuf, chnl);
  635. // uart_open(UART_CHANNEL[chnl],tRunPara.tUartPara[i].wBaud,tRunPara.tUartPara[i].wParity);
  636. #if defined(BSP_DTU4)
  637. uart_open(UART_CHANNEL[chnl], GpsCommBuadrateTbl[GpsCtrlCmd], PARITY_NONE1);
  638. #else
  639. ret = uart_open(UART_CHANNEL[chnl], GpsCommBuadrateTbl[GpsCtrlCmd], PARITY_NONE_1);
  640. if (ret < 0)
  641. {
  642. printf("%s: outside uart %d open failed!\n", __FUNCTION__, UART_CHANNEL[chnl]);
  643. }
  644. #endif
  645. RS_Ena_Init(chnl);
  646. RS_Recv_Enable(chnl);
  647. data->GpsModuleRunStep = LocalGpsModuleRunStep; // 串口初始化 存储的数据都被清0
  648. // rt_printf("Set baud:%d\r\n",GpsCommBuadrateTbl[GpsCtrlCmd]);
  649. }
  650. void GpsModuleFunInit(GPS_COMM *data)
  651. {
  652. static GpsCtrlCmdEnumType GpsSwitchBaudrate;
  653. static uint32_t us0 = 0;
  654. u8 count, chnl = data->chnl, i;
  655. int ret;
  656. if (us0 == 0)
  657. us0 = ustimer_get_origin();
  658. if (ustimer_delay_origin2(&us0, USTIMER_SEC * 2) > 0)
  659. {
  660. // rt_printf("Step:%d\r\n",data->GpsModuleRunStep);
  661. switch (data->GpsModuleRunStep)
  662. {
  663. case GPS_MODULE_INIT_STEP:
  664. data->GpsModuleRunStep++;
  665. GpsSwitchBaudrate = GPS_SET_BUADRATE1_CMD;
  666. break;
  667. case GPS_MODULE_BAUD_CHECK_STEP:
  668. GpsSwitchBaudrateFun(data, GpsSwitchBaudrate);
  669. if (++GpsSwitchBaudrate > GPS_SET_BUADRATE5_CMD)
  670. GpsSwitchBaudrate = GPS_SET_BUADRATE0_CMD;
  671. // data->GpsModuleRunStep=GPS_MODULE_BAUD_SET_STEP;
  672. break;
  673. case GPS_MODULE_BAUD_SET_STEP:
  674. for (count = 0; count < sizeof(GpsCommBuadrateTbl) / 4; count++)
  675. {
  676. if (tRunPara.tUartPara[data->chnl].dBaud == GpsCommBuadrateTbl[count])
  677. break;
  678. }
  679. if (count == sizeof(GpsCommBuadrateTbl) / 4)
  680. ; // ERROR
  681. else
  682. {
  683. GPS_Comm_Send(data, (char *)GpsNmeaCmdData[count], sizeof(GpsNmeaCmdData[count])); // 根据定值配置模块的波特率
  684. }
  685. data->GpsModuleRunStep++;
  686. break;
  687. case GPS_MODULE_BAUD_FINISH_STEP: // 找到合适的波特率
  688. #if 1
  689. memset(&g_tRsComm[chnl], 0, sizeof(g_tRsComm[chnl]));
  690. g_tRsComm[chnl].ptBuf = (BYTE *)&g_tRsIEC[chnl];
  691. GPSCommInit((GPS_COMM *)g_tRsComm[chnl].ptBuf, chnl); // 运行步骤恢复初始状态
  692. ret = uart_open(UART_CHANNEL[chnl], tRunPara.tUartPara[chnl].dBaud, tRunPara.tUartPara[chnl].wParity);
  693. if (ret < 0)
  694. {
  695. printf("%s: outside uart %d open failed!\n", __FUNCTION__, UART_CHANNEL[chnl]);
  696. }
  697. RS_Ena_Init(chnl);
  698. RS_Recv_Enable(chnl);
  699. #endif
  700. GPS_Comm_Send(data, (char *)GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD], sizeof(GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD]));
  701. // rt_printf("GPS_MODULE_BAUD_FINISH_STEP.\r\n");
  702. data->GpsModuleRunStep = GPS_MODULE_UPDATE_FREQ_STEP; // GPS_MODULE_NORMAL_RUN_STEP;
  703. break;
  704. case GPS_MODULE_NEMA_SEL_STEP:
  705. // rt_printf("GPS_MODULE_NEMA_SEL_STEP = %d.\r\n", sizeof(GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD]));
  706. GPS_Comm_Send(data, (char *)GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD], sizeof(GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD]));
  707. data->GpsModuleRunStep++;
  708. break;
  709. case GPS_MODULE_NAVI_SYS_STEP:
  710. // rt_printf("GPS_MODULE_NAVI_SYS_STEP.\r\n");
  711. GPS_Comm_Send(data, (char *)GpsNmeaCmdData[GPS_SEL_NAVI_SYS_CMD], sizeof(GpsNmeaCmdData[GPS_SEL_NAVI_SYS_CMD]));
  712. data->GpsModuleRunStep = GPS_MODULE_NORMAL_RUN_STEP;
  713. break;
  714. case GPS_MODULE_UPDATE_FREQ_STEP:
  715. // rt_printf("GPS_MODULE_UPDATE_FREQ_STEP.\r\n");
  716. GPS_Comm_Send(data, (char *)GpsNmeaCmdData[GPS_SEL_UPDATE_FREQ_CMD], sizeof(GpsNmeaCmdData[GPS_SEL_UPDATE_FREQ_CMD]));
  717. data->GpsModuleRunStep++;
  718. break;
  719. case GPS_MODULE_SYS_STEP:
  720. if (tRunPara.GPS_Mode == 1) // 北斗
  721. {
  722. rt_printf("选择北斗系统.\r\n");
  723. GPS_Comm_Send(data, (char *)GpsNmeaCmdData[GPS_SEL_BD_SYS_CMD], sizeof(GpsNmeaCmdData[GPS_SEL_BD_SYS_CMD]));
  724. }
  725. else if (tRunPara.GPS_Mode == 2) // GPS
  726. {
  727. rt_printf("选择GPS系统.\r\n");
  728. GPS_Comm_Send(data, (char *)GpsNmeaCmdData[GPS_SEL_GPS_SYS_CMD], sizeof(GpsNmeaCmdData[GPS_SEL_GPS_SYS_CMD]));
  729. }
  730. else
  731. {
  732. rt_printf("选择北斗/GPS系统.\r\n");
  733. GPS_Comm_Send(data, (char *)GpsNmeaCmdData[GPS_SEL_NAVI_SYS_CMD], sizeof(GpsNmeaCmdData[GPS_SEL_NAVI_SYS_CMD]));
  734. }
  735. data->GpsModuleRunStep++;
  736. GpsNmeaRmcData.bd_sv_num = 0;
  737. GpsNmeaRmcData.gp_sv_num = 0;
  738. for (i = 0; i < GPS_NUM_MAX; i++)
  739. {
  740. GpsNmeaRmcData.bd_gsv[i].valid = 0;
  741. GpsNmeaRmcData.gp_gsv[i].valid = 0;
  742. }
  743. data->recv_wait_time = ustimer_get_origin();
  744. data->recv_handle = 0;
  745. break;
  746. case GPS_MODULE_NORMAL_RUN_STEP:
  747. default:
  748. break;
  749. }
  750. }
  751. }
  752. void GpsSendBaudrateCmd(GPS_COMM *p)
  753. {
  754. u8 i = 0;
  755. char *ptr = &SendBuf[0];
  756. // memset(ptr,'A',20);
  757. // ptr+=20;
  758. //*ptr++='\r';
  759. //*ptr++='\n';
  760. ptr[i++] = '$';
  761. #if 0 // xxxxxx 20220920 add 此函数没有用上,消除警告
  762. GPS_Comm_Send(p,ptr-22,22);
  763. #endif
  764. }
  765. void GPS_Comm_Send(GPS_COMM *p, char *data, unsigned char datalen) // 发送命令
  766. {
  767. unsigned char *ptr = &g_tRsComm[p->chnl].sendbuf[0];
  768. *ptr++ = datalen;
  769. // rt_printf("TX:%s\r\n",data);
  770. memcpy(ptr, data, datalen);
  771. g_tRsComm[p->chnl].nSendCnt = 1; // 第一个字节为长度
  772. g_tRsComm[p->chnl].bSend = TRUE;
  773. }
  774. #if 0
  775. void GenerateSecdPluse(void)
  776. {
  777. static uint32_t us0=0;
  778. static u8 state=0;
  779. if(us0==0)
  780. us0=ustimer_get_origin();
  781. switch(state)
  782. {
  783. case 0:
  784. if(ustimer_delay_origin2(&us0,USTIMER_MS*600)>0)
  785. {
  786. GPIO_KOUT0_OFF();
  787. GPIO_KOUT1_OFF();
  788. state=1;
  789. rt_printf("high=%d\r\n",ustimer_get_origin());
  790. }
  791. break;
  792. case 1:
  793. if(ustimer_delay_origin2(&us0,USTIMER_MS*50)>0)
  794. {
  795. GPIO_KOUT0_ON();
  796. GPIO_KOUT1_ON();
  797. state=0;
  798. rt_printf("low=%d\r\n",ustimer_get_origin());
  799. }
  800. break;
  801. default:
  802. break;
  803. }
  804. }
  805. #endif
  806. char gps_data_valid_get(void)
  807. {
  808. return GpsNmeaRmcData.data_vaild;
  809. }
  810. void gps_info_printf(void)
  811. {
  812. struct rtc_time_t rtc;
  813. u16 i;
  814. rt_printf("GPS串口数据:");
  815. if (gps_data_valid_get() == 'A' || gps_data_valid_get() == 1)
  816. {
  817. rt_printf("\r\n");
  818. rt_printf(" 系统:%s\r\n", GpsNmeaRmcData.SingleType);
  819. timespec_to_rtc(GpsNmeaRmcData.ts, &rtc, 1);
  820. rt_printf(" 时间:%04d-%02d-%02d,%02d:%02d:%02d.%03d\r\n", 2000 + rtc.year, rtc.month, rtc.day, rtc.hour,
  821. rtc.min, rtc.ms / 1000, rtc.ms % 1000);
  822. rt_printf(" 经度:%f°(%d°%d′%f″)\r\n", gps_angle_calc(GpsNmeaRmcData.Longtitude / 100.0f), GpsNmeaRmcData.Longtitude_dd, GpsNmeaRmcData.Longtitude_mm, GpsNmeaRmcData.Longtitude_ss);
  823. rt_printf(" 纬度:%f°(%d°%d′%f″)\r\n", gps_angle_calc(GpsNmeaRmcData.Latitude / 100.0f), GpsNmeaRmcData.Latitude_dd, GpsNmeaRmcData.Latitude_mm, GpsNmeaRmcData.Latitude_ss);
  824. rt_printf("==============================================\r\n");
  825. if (GpsNmeaRmcData.bd_sv_num > 0)
  826. {
  827. rt_printf("北斗卫星:%d台\r\n", GpsNmeaRmcData.bd_sv_num);
  828. for (i = 0; i < GPS_NUM_MAX; i++)
  829. {
  830. if ((GpsNmeaRmcData.bd_gsv[i].valid == 1) && (GpsNmeaRmcData.bd_gsv[i].id > 0))
  831. {
  832. if (GpsNmeaRmcData.bd_gsv[i].id > 0)
  833. rt_printf(" [卫星编号:%d ", GpsNmeaRmcData.bd_gsv[i].id);
  834. else
  835. rt_printf(" [卫星编号:- ");
  836. if (GpsNmeaRmcData.bd_gsv[i].ele > 0)
  837. rt_printf("仰角: %d ", GpsNmeaRmcData.bd_gsv[i].ele);
  838. else
  839. rt_printf("仰角: - ");
  840. if (GpsNmeaRmcData.bd_gsv[i].az > 0)
  841. rt_printf("方位角: %d ", GpsNmeaRmcData.bd_gsv[i].az);
  842. else
  843. rt_printf("方位角: - ");
  844. if (GpsNmeaRmcData.bd_gsv[i].cn0 > 0)
  845. rt_printf("载噪比: %d]\r\n", GpsNmeaRmcData.bd_gsv[i].cn0);
  846. else
  847. rt_printf("载噪比: -]\r\n");
  848. }
  849. }
  850. }
  851. else
  852. {
  853. rt_printf("北斗卫星:-\r\n");
  854. }
  855. rt_printf("==============================================\r\n");
  856. if (GpsNmeaRmcData.gp_sv_num > 0)
  857. {
  858. rt_printf("GPS卫星:%d台\r\n", GpsNmeaRmcData.gp_sv_num);
  859. for (i = 0; i < GPS_NUM_MAX; i++)
  860. {
  861. if ((GpsNmeaRmcData.gp_gsv[i].valid == 1) && (GpsNmeaRmcData.gp_gsv[i].id > 0))
  862. {
  863. if (GpsNmeaRmcData.gp_gsv[i].id > 0)
  864. rt_printf(" [卫星编号:%d ", GpsNmeaRmcData.gp_gsv[i].id);
  865. else
  866. rt_printf(" [卫星编号:- ");
  867. if (GpsNmeaRmcData.gp_gsv[i].ele > 0)
  868. rt_printf("仰角: %d ", GpsNmeaRmcData.gp_gsv[i].ele);
  869. else
  870. rt_printf("仰角: - ");
  871. if (GpsNmeaRmcData.gp_gsv[i].az > 0)
  872. rt_printf("方位角: %d ", GpsNmeaRmcData.gp_gsv[i].az);
  873. else
  874. rt_printf("方位角: - ");
  875. if (GpsNmeaRmcData.gp_gsv[i].cn0 > 0)
  876. rt_printf("载噪比: %d]\r\n", GpsNmeaRmcData.gp_gsv[i].cn0);
  877. else
  878. rt_printf("载噪比: -]\r\n");
  879. }
  880. }
  881. }
  882. else
  883. {
  884. rt_printf("GPS卫星:-\r\n");
  885. }
  886. }
  887. else if (gps_data_valid_get() == 'V')
  888. {
  889. rt_printf("\r\n");
  890. rt_printf(" 系统:无效\r\n");
  891. rt_printf(" 时间:无效\r\n");
  892. rt_printf(" 经度:无效\r\n");
  893. rt_printf(" 纬度:无效\r\n");
  894. }
  895. else
  896. {
  897. rt_printf("无\r\n");
  898. }
  899. }
  900. int is_gps_alive(void)
  901. {
  902. return 0; // tRunPara.GPS_sync_enable && GpsNmeaRmcData.data_vaild;//TODO EWEN
  903. }
  904. // 从机时间同步
  905. int gps_slave_sync(struct timespec *ts)
  906. {
  907. if (tRunPara.bGPS && GpsNmeaRmcData.data_vaild) // 打开秒脉冲对时
  908. {
  909. gps_pluse_clear();
  910. GpsNmeaRmcData.ts = *ts;
  911. GpsNmeaRmcData.slave_vaild = 1;
  912. return 1;
  913. }
  914. return 0;
  915. }
  916. void gps_init_step_set(u8 step)
  917. {
  918. u8 i;
  919. for (i = 0; i < CFG_UART_NUM_MAX; i++)
  920. {
  921. // ???????,??
  922. if (UART_CHANNEL[i] < 0)
  923. {
  924. continue;
  925. }
  926. if (tRunPara.tUartPara[i].wProtocol == PROTOCOL_GPS)
  927. {
  928. ((GPS_COMM *)g_tRsComm[i].ptBuf)->GpsModuleRunStep = step;
  929. }
  930. }
  931. }
  932. #endif