gps_uart.c 33 KB

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