| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097 |
- /******************************************************************************
- 版权所有:
- 文件名称: gprs.c
- 文件版本: 01.01
- 创建作者:
- 创建日期: 2012-8-17
- 功能说明: GRS模块
- 其它说明:
- 修改记录:
- */
- /*------------------------------- 头文件 --------------------------------------
- */
- #include "head.h"
- #include "gps_uart.h"
- #include "my_rtc.h"
- #include "gps.h"
- #include "bspconfig.h"
- #if defined(ADD_ATGM366_GPS_FUN) || defined(DEV_GPS_ATGM366) || defined(DEV_GPS_ATGM332D)
- #define BYTE2LONG(p)((long)(((p)[0]<<24)+((p)[1]<<16)+((p)[2]<<8)+(p)[3]))
- /*------------------------------ 全局变量 -------------------------------------
- */
- GpsNmeaRmcDataType GpsNmeaRmcData;
- u8 SendBuf[GPS_LINE_LEN/2];
- const GpsNmeaDataType GpsNmeaDataTbl[]=
- {
- { FALSE, "GGA" },
- { FALSE, "GLL" },
- { FALSE, "GSA" },
- { FALSE, "GSV" },
- { TRUE, "RMC" },
- { FALSE, "VTG" },
- { FALSE, "ZDA" },
- { FALSE, "TXT" },
- { FALSE, "ANT" },
- { FALSE, "DHV" },
- { FALSE, "GST" },
- };
- const char GpsNmeaCmdData[][50]=
- {
- {"$PCAS01,0*1C\r\n"},
- {"$PCAS01,1*1D\r\n"},
- {"$PCAS01,2*1E\r\n"},
- {"$PCAS01,3*1F\r\n"},
- {"$PCAS01,4*18\r\n"}, //57600
- {"$PCAS01,5*19\r\n"},
- // {"$PCAS03,0,0,0,0,1,0,0,0,0,0,,,0,0*03\r\n"}, //配置只上发RMC指令
- {"$PCAS03,0,0,0,4,1,0,0,0*07\r\n"}, //配置发RMC、GSV指令
- {"$PCAS04,3*1A\r\n"}, //配置选择北斗和GPS导航系统
- {"$PCAS02,1000*2E\r\n"}, //更新频率为1HZ
- {"$PCAS10,3*1F\r\n"}, //恢复出厂设置
- {"$PCAS04,2*1B\r\n"}, //单独选择北斗
- {"$PCAS04,1*18\r\n"}, //单独选择GPS
- };
- const int GpsCommBuadrateTbl[]=
- {
- 4800, 9600, 19200, 38400, 57600, 115200
- };
- /*------------------------------ 外部函数 -------------------------------------
- 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
- */
- extern int rtc_to_timespec(struct rtc_time_t * p_rtc, struct timespec * p_ts);
- GPS_SYNC_DELAY gps_sync;
- extern unsigned int g_keep_alive_gps;
- /******************************************************************************
- 函数名称:
- 函数版本: 01.01
- 创建作者:
- 创建日期:
- 函数说明:
- 参数说明:
- 返回值:
- 0: 成功
- 其它: 失败
- 修改记录:
- */
- extern struct timespec g_sys_time;
- char gps_crc(const char* p, u8 length)
- {
- char crc = p[0];
- u8 i;
- for(i=1; i<length;i++)
- {
- crc ^= p[i];
- }
- return crc;
- }
- void GPSCommInit(GPS_COMM* p,u8 chnl) //初始化
- {
- memset(p,0,sizeof(GPS_COMM));
- p->type=IEC_MODBUS_M;
- p->chnl=chnl;
- p->bData=false;
- //p->arrSendBuf=&g_tRsComm[chnl].sendbuf[0];
- ResetUartGPSLink(p);
- // rt_printf("gps com init\r\n"); //TODO ygl -
- }
- void ResetUartGPSLink(GPS_COMM* p) //重置
- {
- p->cTypeCounter=GPS_FRAME_HEAD;
- p->cRecvCnt=0;
- }
- void GPS_Recv(GPS_COMM* p,BYTE byRevData)
- {
- static unsigned char RecvCounter;
-
- if(p->bData)
- {
- p->cTypeCounter=GPS_FRAME_HEAD;
- return;
- }
- p->arrRecvBuf[p->cRecvCnt++] = byRevData; //接收数据
- switch(p->cTypeCounter)
- {
- case GPS_FRAME_HEAD: //
- if(byRevData=='$') //开始符号
- {
- // rt_printf("GPS_FRAME_HEAD\r\n");
- p->cTypeCounter++;
- }
- else
- {
- ResetUartGPSLink(p);
- }
- break;
- case GPS_FRAME_DATA:
- if(byRevData=='*') //数据结束段
- {
- // rt_printf("GPS_FRAME_DATA\r\n");
- RecvCounter=0;
- p->cTypeCounter=GPS_FRAME_TAIL;
- //p->nTypeCounter=GPS_FRAME_TAIL;
- }
- else if(p->cRecvCnt>GPS_UART_MAX_LEN) //数据异常保护后续需要修改
- //else if(p->nRecvCnt>GPS_UART_MAX_LEN) //数据异常保护后续需要修改
- {
- ResetUartGPSLink(p);
- }
- break;
- case GPS_FRAME_TAIL:
- if(byRevData=='\n') // 回车符
- {
- p->cTypeCounter=GPS_FRAME_HEAD;
- //p->nTypeCounter=GPS_FRAME_HEAD;
- p->bData=true;
- // rt_printf("GPS_FRAME_TAIL\r\n");
- // rt_printf("data: %s\r\n", p->arrRecvBuf);
-
- }
- else if(++RecvCounter>=4)
- {
- ResetUartGPSLink(p);
- }
- break;
- default:
- ResetUartGPSLink(p);
- break;
- }
- }
- void GPS_Timer(void)
- {
- u8 i;
-
- // TODO 待处理秒脉冲 by ewen
- // if(g_clock_mode != CLOCK_MODE_GPS_SECOND)
- // {
- // if(soe_check(EV_GPS_ADJUST_TIME)==true)
- // {
- // soe_record_ev(EV_GPS_ADJUST_TIME,0, 0,0,0 );
- // }
- return;
- // }
- if(ustimer_delay_origin2(&GpsNmeaRmcData.data_vaild_time, 60*1*USTIMER_SEC));//60*tRunPara.GPS_switch_delay*USTIMER_SEC))
- {
- GpsNmeaRmcData.data_vaild = 0;
- // TODO by ewen
- // if(soe_check(EV_GPS_ADJUST_TIME)==true)
- // {
- // soe_record_ev(EV_GPS_ADJUST_TIME,0, 0,0,0 );
- // }
- }
- if(ustimer_delay_origin2(&GpsNmeaRmcData.gsv_time, 30*USTIMER_SEC))
- {
- GpsNmeaRmcData.bd_sv_num = 0;
- GpsNmeaRmcData.gp_sv_num = 0;
- }
-
- for(i=0; i<GPS_NUM_MAX; i++)
- {
- if(ustimer_delay_origin2(&GpsNmeaRmcData.bd_online_time[i], 180*USTIMER_SEC))
- {
- GpsNmeaRmcData.bd_gsv[i].valid = 0;
- }
- if(ustimer_delay_origin2(&GpsNmeaRmcData.gp_online_time[i], 180*USTIMER_SEC))
- {
- GpsNmeaRmcData.gp_gsv[i].valid = 0;
- }
- }
- if(GpsNmeaRmcData.data_vaild == 0)
- {
- #ifdef GPS_ALIVE_SOE
- if(soe_check(EV_GPS_ALIVE)==true)
- {
- soe_record_ev(EV_GPS_ALIVE,0, 0,0,0 );
- }
- #endif
- GpsNmeaRmcData.bd_sv_num=0;
- GpsNmeaRmcData.gp_sv_num=0;
- }
- #ifdef GPS_NUM_SHOW
- g_sw_pub.ac_in[PUB_AC_IN_GPS_NUM] = (qs16)((GpsNmeaRmcData.bd_sv_num + GpsNmeaRmcData.gp_sv_num)*Q16_BASE);
- #elif defined BD_GPS_NUM
- g_sw_pub.ac_in[PUB_AC_IN_BD_NUM] = (qs16)(GpsNmeaRmcData.bd_sv_num*Q16_BASE);
- g_sw_pub.ac_in[PUB_AC_IN_GPS_NUM] = (qs16)(GpsNmeaRmcData.gp_sv_num*Q16_BASE);
- #endif
- }
- void GPS_Comm_App(GPS_COMM* p)
- {
-
- #ifdef ADD_PLUSE_OUTPUT
- GenerateSecdPluse();
- #endif
- GPS_Timer();
- // if(!g_clock_mode_gps)
- // return;
- GpsModuleFunInit(p);
- if(GpsNmeaRmcData.DataValidFlag=='S') //soeê??t
- {
- struct rtc_time_t rtc;
- // TODO by ewen
- //soe_record_opt(EV_GPS_ADJUST_TIME,GpsNmeaRmcData.MsOffset);
- // if(soe_check(EV_GPS_ADJUST_TIME)==false)
- // {
- // soe_record_ev(EV_GPS_ADJUST_TIME,1, 0,0,0 );
- // }
-
- GpsNmeaRmcData.gps_soe_time = ustimer_get_origin();
- timespec_to_rtc(GpsNmeaRmcData.ts,&rtc,1);
- if(rtc_time_write(&rtc) != 0) //
- {
- rt_printf("gps_fun:rtc_time_write err.\r\n");
- return;
- }
- GpsNmeaRmcData.DataValidFlag='0';
- // rt_printf_time("gps adjust,time=%d\r\n",GpsNmeaRmcData.MsOffset);
- }
- if(p->bData) //TODO: add vaild data control
- {
- GpsRecvDataFrameHandler(p);
- p->bData=false;
- p->cRecvCnt=0;
- }
- }
- int _pow10(unsigned char num)
- {
- int val=1;
- while(num--)
- val*=10;
- return val;
- }
- unsigned char* GetParamDataValue(unsigned char* pos,float* data) //, ,
- {
- unsigned char count,IntNum=0,DecNum=0,len,num;
- unsigned char *p=pos,*p1;
- int value;
- p++; //jump the first signed
- //len=(unsigned char*)strstr(p,",")-p;
- len=(unsigned char*)strchr(p,',')-p;
- if((len<=0)||len>15)
- {
- *data=0; //valid data
- return pos+len+1;
- }
- p1=p;
- for(count=0; count<len; count++,p1++)
- {
- if(*p1=='.') //取到小数点位置
- {
- DecNum=len-IntNum-1;
- break;
- }
- IntNum++;
- }
- //rt_printf("len=%d,InterNum=%d,DecNum=%d,x=%d\r\n",len,IntNum,DecNum,pow10(IntNum));
- value=0;
- while(IntNum) //get the part of Int
- {
- num=*p++-0x30; //必须为0x30-0x39
- value+=num*_pow10(IntNum-1);
- IntNum--;
- };
- *data=(float)value;
- if(DecNum)
- {
- p++; //point
- count=DecNum;
- value=0;
- while(count) //get the part of dec
- {
- num=*p++-0x30; //必须为0x30-0x39
- value+=num*_pow10(count-1);
- count--;
- };
- *data+=(float)value/_pow10(DecNum);
- }
- return pos+len+1;
- }
- //取字符
- unsigned char* GetParamDataChar(unsigned char* pos,unsigned char* data, int max_len)
- {
- unsigned char len;
- unsigned char *p=pos;
- //int value;
- p++; //jump the first signed
- //len=(unsigned char*)strstr(p,",")-p;
- len=(unsigned char*)strchr(p,',')-p;
- //rt_printf("len=%d\r\n",len);
- if((len<=0)||len>max_len)
- {
- *data=0; //valid data
- return pos+len+1;
- }
- memcpy(data,p,len);
- return pos+len+1;
- }
- char* gps_char_data_get(char* pos, char end, int* data)
- {
- unsigned char len;
- len=strchr(pos,end)-pos;
- if((len<=0)||len>15)
- {
- *data=-1; //valid data
- return pos+len+1;
- }
- *data=atoi(pos);
-
- return pos+len+1;
- }
- int CheckDataFrameVaild(unsigned char *pos)
- {
- unsigned char *p=pos,tmp;
- volatile unsigned char AddValue=0;
- //if(strstr(p,"*")==NULL)
- if(strchr(p,'*')==NULL)
- return -1;
- if(*p++!='$')
- return -1;
- while(*p!='*')
- AddValue^=*p++;
- p++; //*
- tmp=(*p++-0x30)<<4;
- tmp|=(*p-0x30)<<0;
- rt_printf("tmp=0x%02X,AddValue=0x%02X\r\n",tmp,AddValue);
- if(tmp!=AddValue)
- {
- rt_printf("tmp=%s\r\n",pos);
- return 0;
- }
- return 1;
- }
- void UtcTimeToSysTime(struct rtc_time_t * rtc,GpsNmeaRmcDataType* utc,u8 opt)
- {
- char* p=&utc->Date[0];
- rtc->day=(*p-0x30)*10+*(p+1)-0x30;
- p+=2;
- rtc->month=(*p-0x30)*10+*(p+1)-0x30;
- p+=2;
- rtc->year=(*p-0x30)*10+*(p+1)-0x30;
- p+=2;
- p=&utc->UtcTime[0];
- rtc->hour=(*p-0x30)*10+*(p+1)-0x30;
- p+=2;
- rtc->min=(*p-0x30)*10+*(p+1)-0x30;
- p+=2;
- if(opt==1)
- rtc->ms=((*p-0x30)*10+*(p+1)-0x30)*1000+(*(p+3)-0x30)*100+(*(p+4)-0x30)*10+*(p+5)-0x30;
- else //取S
- rtc->ms=((*p-0x30)*10+*(p+1)-0x30)*1000;
- //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);
- }
- void gps_pluse_clear(void)
- {
- GpsNmeaRmcData.pluse_count = 0;
- }
- int GpsAdjustTimeFun(struct rtc_time_t* psrtc) //本函数只能被捕获中断服务函数调用
- {
- // static u8 counter=0;
- struct timespec ts;
- int res=FALSE;
- u64 MsOffset;
- static u8 power_on = 1;
- #ifdef CN_AREA_GUOWANG_FBC
- GpsNmeaRmcData.data_vaild_time = ustimer_get_origin();
- GpsNmeaRmcData.data_vaild = 1;
- if(GpsNmeaRmcData.slave_vaild == 0)
- return res;
- #endif
- if(++GpsNmeaRmcData.pluse_count<=2)//tRunPara.GPS_sync_time) //2s判断一下校准时间 //TODO EWEN
- {
- // GpsNmeaRmcData.DataValidFlag='0';
- return res;
- }
- GpsNmeaRmcData.wait_sync = 0;
- // counter=0;
- #ifdef CN_AREA_GUOWANG_FBC
- GpsNmeaRmcData.slave_vaild = 0;
- #else
- if(GpsNmeaRmcData.DataValidFlag!='Y' )//|| !tRunPara.GPS_sync_enable) //TODO EWEN
- return res;
- #endif
-
- GpsNmeaRmcData.DataValidFlag='0';
- //rtc_to_timespec(psrtc,&ts);
- #ifdef CN_AREA_GUOWANG_FBC
- GpsNmeaRmcData.ts.tv_sec+= tRunPara.GPS_sync_time + 1;
- GpsNmeaRmcData.ts.tv_nsec=20*1000 + 1000*1000; //补偿20us + 1ms
- #else
- GpsNmeaRmcData.ts.tv_sec+= 1;//tRunPara.GPS_sync_time + 1; //TODO EWEN
- GpsNmeaRmcData.ts.tv_nsec=20*1000; //补偿20us
- #ifdef KP_GPS_TEST
- GpsNmeaRmcData.ts.tv_sec+=4;
- #endif
- #endif
-
- gps_get_time(&ts); //当前系统的精准时间带ms的
- if(GpsNmeaRmcData.ts.tv_sec<=ts.tv_sec) //系统时间超前
- MsOffset=(ts.tv_sec-GpsNmeaRmcData.ts.tv_sec)*1000+ts.tv_nsec/1000000;
- else //系统时间滞后
- MsOffset=(GpsNmeaRmcData.ts.tv_sec-ts.tv_sec)*1000-ts.tv_nsec/1000000;
- if(MsOffset>=5 || power_on) //5ms
- {
- timespec_to_rtc(GpsNmeaRmcData.ts,psrtc,1); //D£ê±
- sys_time_set(psrtc);
- if(MsOffset>=1000 || power_on) //1Sò?é??ó2?????SOE
- {
- power_on = 0;
- GpsNmeaRmcData.DataValidFlag='S'; //SOE±ê??
- GpsNmeaRmcData.MsOffset=MsOffset;
- }
- else
- GpsNmeaRmcData.DataValidFlag='0';
- // rt_printf("set time=%d\r\n",MsOffset); //校准
- res=TRUE;
- }
- else
- GpsNmeaRmcData.DataValidFlag='0';
- return res;
- }
- float gps_angle_calc(float value)
- {
- float tmp_d,tmp_m,tmp_dot;
- u32 tmp;
- tmp = (u32)value;
- tmp_d = value;
- tmp_m = (float)(tmp_d - tmp);
- tmp_dot = tmp_m*100.0f/60.0f;
- tmp = value;
- return (float)(tmp+tmp_dot);
- }
- void gps_dms_calc(float value, u32 *d, u32 *m, float *s)
- {
- u32 tmp1,tmp2;
- tmp1 = (u32)value;
- tmp2 = (u32)value/100;
-
- *d = tmp2;
- *m = (u32)((value/100.0f - tmp2)*100.0f);
- *s = (float)(value - tmp1)*60.0f;
- }
- //GPS接收数据解析
- int GpsRecvDataFrameHandler(GPS_COMM* data)
- {
- static unsigned char LocalUtcTime[11];
- unsigned char* p=&data->arrRecvBuf[0];
- unsigned char* p1=&data->arrRecvBuf[0];
- u8 msg_no, valid_flag;
- if((ustimer_delay_origin2(&data->recv_wait_time, 3*USTIMER_SEC) <= 0) && !data->recv_handle)
- {
- return FALSE;
- }
- data->recv_handle = 1;
- if(data->GpsModuleRunStep==GPS_MODULE_INIT_STEP) //???????????????????????????
- data->GpsModuleRunStep=GPS_MODULE_NORMAL_RUN_STEP;
- else if(data->GpsModuleRunStep==GPS_MODULE_BAUD_CHECK_STEP) //查找到合适的波特率
- data->GpsModuleRunStep=GPS_MODULE_BAUD_SET_STEP;
- //if(!CheckDataFrameVaild(p))
- // return;
- // $GNRMC,051033.000,A,2222.12622,N,11329.24936,E,0.00,0.00,050825,,,A*79
- if(strstr(p1,"RMC")!=NULL)
- {
-
- p=strstr(p1,"RMC");
- memcpy(&GpsNmeaRmcData.SingleType,p1+1,2); //记录是BD还是GN,即北斗还是GPS
- GpsNmeaRmcData.SingleType[p-p1] = 0;
- p+=3;
- p=GetParamDataChar(p,&GpsNmeaRmcData.UtcTime[0],sizeof(GpsNmeaRmcData.UtcTime));
- p=GetParamDataChar(p,&valid_flag,sizeof(valid_flag)); //数据有效标志
- if(valid_flag!='A')
- {
- #ifdef GPS_NUM_SHOW
- GpsNmeaRmcData.bd_sv_num=0;
- GpsNmeaRmcData.gp_sv_num=0;
- g_sw_pub.ac_in[PUB_AC_IN_GPS_NUM] = (qs16)((GpsNmeaRmcData.bd_sv_num + GpsNmeaRmcData.gp_sv_num)*Q16_BASE);
- #elif defined BD_GPS_NUM
- GpsNmeaRmcData.bd_sv_num=0;
- GpsNmeaRmcData.gp_sv_num=0;
- g_sw_pub.ac_in[PUB_AC_IN_BD_NUM] = (qs16)(GpsNmeaRmcData.bd_sv_num*Q16_BASE);
- g_sw_pub.ac_in[PUB_AC_IN_GPS_NUM] = (qs16)(GpsNmeaRmcData.gp_sv_num*Q16_BASE);
- #endif
-
- return FALSE;
- }
- GpsNmeaRmcData.data_vaild_time = ustimer_get_origin();
- GpsNmeaRmcData.data_vaild = 1;
- #ifdef GPS_ALIVE_SOE
- if(soe_check(EV_GPS_ALIVE)==false)
- {
- soe_record_ev(EV_GPS_ALIVE, 1, 0, 0, 0 );
- }
- #endif
- if(GpsNmeaRmcData.wait_sync)
- {
- // return FALSE;//临时屏蔽 by ewen
- }
- GpsNmeaRmcData.DataValidFlag = valid_flag;
- p=GetParamDataValue(p,&GpsNmeaRmcData.Latitude); //纬度
- p=GetParamDataChar(p,&GpsNmeaRmcData.LatitudeDir,sizeof(GpsNmeaRmcData.LatitudeDir)); //纬度方位
- p=GetParamDataValue(p,&GpsNmeaRmcData.Longtitude); //经度
- p=GetParamDataChar(p,&GpsNmeaRmcData.LongtitudeDir,sizeof(GpsNmeaRmcData.LongtitudeDir)); //经度方位
- p=GetParamDataValue(p,&GpsNmeaRmcData.Spd); //对地速度
- p=GetParamDataValue(p,&GpsNmeaRmcData.cog); //对地真航向
- p=GetParamDataChar(p,&GpsNmeaRmcData.Date[0],sizeof(GpsNmeaRmcData.Date)); //日期
- gps_pluse_clear();
- GpsNmeaRmcData.wait_sync = 1;
- memset(&GpsNmeaRmcData.UtcTime[8],'0',3); //去除毫秒 GPS模块机制
- // if(memcmp(GpsNmeaRmcData.UtcTime,LocalUtcTime,sizeof(GpsNmeaRmcData.UtcTime))) //若gps第一次获取到时间或者1s内第一次获取到时间则有效或者是GPS断线后第一次获取的时间
- {
- struct rtc_time_t rtc;
- UtcTimeToSysTime(&rtc,&GpsNmeaRmcData,0);
- rtc_to_timespec(&rtc,&GpsNmeaRmcData.ts);
- GpsNmeaRmcData.ts.tv_sec+=8*60*60; //UTC->BEIJING
- GpsNmeaRmcData.DataValidFlag='Y';
- //rt_printf("gene_flag=%d\r\n",GpsNmeaRmcData.DataValidFlag);
- memcpy(GpsNmeaRmcData.UtcTime,LocalUtcTime,sizeof(GpsNmeaRmcData.UtcTime));
- //rt_printf("recv gps uart data!");
- }
- gps_dms_calc(GpsNmeaRmcData.Longtitude, &GpsNmeaRmcData.Longtitude_dd, &GpsNmeaRmcData.Longtitude_mm, &GpsNmeaRmcData.Longtitude_ss);
- gps_dms_calc(GpsNmeaRmcData.Latitude, &GpsNmeaRmcData.Latitude_dd, &GpsNmeaRmcData.Latitude_mm, &GpsNmeaRmcData.Latitude_ss);
- #ifndef GPS_JWD_SPLIT
- g_sw_pub.ac_in[PUB_AC_GPS_LONGITUDE] = (qs16)(gps_angle_calc(GpsNmeaRmcData.Longtitude /100.0f)*Q16_BASE);
- g_sw_pub.ac_in[PUB_AC_GPS_LATITUDE] = (qs16)(gps_angle_calc(GpsNmeaRmcData.Latitude /100.0f)*Q16_BASE);
- #else
- g_sw_pub.ac_in[PUB_AC_GPS_LONGITUDE_D] =GpsNmeaRmcData.Longtitude_dd*Q16_BASE;
- g_sw_pub.ac_in[PUB_AC_GPS_LONGITUDE_M] =GpsNmeaRmcData.Longtitude_mm*Q16_BASE;
- g_sw_pub.ac_in[PUB_AC_GPS_LONGITUDE_S] =GpsNmeaRmcData.Longtitude_ss*Q16_BASE;
- g_sw_pub.ac_in[PUB_AC_GPS_LATITUDE_D] =GpsNmeaRmcData.Latitude_dd*Q16_BASE;
- g_sw_pub.ac_in[PUB_AC_GPS_LATITUDE_M] =GpsNmeaRmcData.Latitude_mm*Q16_BASE;
- g_sw_pub.ac_in[PUB_AC_GPS_LATITUDE_S] =GpsNmeaRmcData.Latitude_ss*Q16_BASE;
- #endif
- }
- else if(strstr(p1,"GSV")!=NULL)
- {
- if(strstr(p1,"BD")!=NULL)
- {
- u8 i;
-
- p = p1 + 7;
- p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_msg_num);
- p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_msg_no);
- p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_sv_num);
- if(strstr(GpsNmeaRmcData.SingleType,"BD")!=NULL)
- {
- g_sw_pub.ac_in[PUB_AC_GPS_NUM_SV] = (qs16)(GpsNmeaRmcData.bd_sv_num*Q16_BASE);
- }
- if(GpsNmeaRmcData.bd_sv_num > GPS_NUM_MAX)
- return FALSE;
- GpsNmeaRmcData.gsv_time = ustimer_get_origin();
- msg_no = GpsNmeaRmcData.bd_msg_no-1;
- if(GpsNmeaRmcData.bd_msg_no*4 < GPS_NUM_MAX)
- {
- for(i=0; i<4; i++)
- {
- p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_gsv[msg_no*4+i].id);
- p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_gsv[msg_no*4+i].ele);
- p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_gsv[msg_no*4+i].az);
- p = gps_char_data_get(p, ',', &GpsNmeaRmcData.bd_gsv[msg_no*4+i].cn0);
- GpsNmeaRmcData.bd_gsv[msg_no*4+i].valid = 1;
- GpsNmeaRmcData.bd_online_time[msg_no*4+i] = ustimer_get_origin();
- }
- }
- }
- else if(strstr(p1,"GP")!=NULL)
- {
- u8 i;
-
- p = p1 + 7;
- p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_msg_num);
- p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_msg_no);
- p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_sv_num);
-
- // rt_printf("GPS卫星:%d台\r\n", GpsNmeaRmcData.gp_sv_num);
- if(GpsNmeaRmcData.gp_sv_num > GPS_NUM_MAX)
- return FALSE;
- if(strstr(GpsNmeaRmcData.SingleType,"GN")!=NULL)
- {
- g_sw_pub.ac_in[PUB_AC_GPS_NUM_SV] = (qs16)(GpsNmeaRmcData.gp_sv_num*Q16_BASE);
- }
- GpsNmeaRmcData.gsv_time = ustimer_get_origin();
- msg_no = GpsNmeaRmcData.gp_msg_no-1;
- if(GpsNmeaRmcData.gp_msg_no*4 < GPS_NUM_MAX)
- {
- for(i=0; i<4; i++)
- {
- p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_gsv[msg_no*4+i].id);
- p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_gsv[msg_no*4+i].ele);
- p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_gsv[msg_no*4+i].az);
- p = gps_char_data_get(p, ',', &GpsNmeaRmcData.gp_gsv[msg_no*4+i].cn0);
- GpsNmeaRmcData.gp_gsv[msg_no*4+i].valid = 1;
- GpsNmeaRmcData.gp_online_time[msg_no*4+i] = ustimer_get_origin();
- }
- }
- }
- }
- else
- {
- #if 0
- if((data->GpsModuleRunStep==GPS_MODULE_NORMAL_RUN_STEP)&&(strstr(p,"TXT")==NULL)) //正常运行后若发现收到其他数据则下发配置指令
- #else
- if((data->GpsModuleRunStep==GPS_MODULE_NORMAL_RUN_STEP)&&(strstr(p,"GSV")==NULL))
- #endif
- {
- data->GpsModuleRunStep=GPS_MODULE_NEMA_SEL_STEP; //若配置不成功可循环配置
- }
- }
- return TRUE;
- }
- void GpsSwitchBaudrateFun(GPS_COMM* data, GpsCtrlCmdEnumType GpsCtrlCmd)
- {
- int ret;
- u8 chnl=data->chnl;
- GpsModuleRunStepEnum LocalGpsModuleRunStep=data->GpsModuleRunStep;
- memset(&g_tRsComm[chnl],0,sizeof(g_tRsComm[chnl]));
- g_tRsComm[chnl].ptBuf=(BYTE*)&g_tRsIEC[chnl];
- GPSCommInit((GPS_COMM *)g_tRsComm[chnl].ptBuf,chnl);
- //uart_open(UART_CHANNEL[chnl],tRunPara.tUartPara[i].wBaud,tRunPara.tUartPara[i].wParity);
- #if defined(BSP_DTU3) || defined(BSP_DTU2) || defined(BSP_DTU4)
- uart_open(UART_CHANNEL[chnl],GpsCommBuadrateTbl[GpsCtrlCmd],PARITY_NONE1);
- #else
- ret = uart_open(UART_CHANNEL[chnl],GpsCommBuadrateTbl[GpsCtrlCmd],PARITY_NONE_1);
- if (ret < 0)
- {
- printf("%s: outside uart %d open failed!\n", __FUNCTION__, UART_CHANNEL[chnl]);
- }
- #endif
- RS_Ena_Init(chnl);
- RS_Recv_Enable(chnl);
- data->GpsModuleRunStep=LocalGpsModuleRunStep; //串口初始化 存储的数据都被清0
- //rt_printf("Set baud:%d\r\n",GpsCommBuadrateTbl[GpsCtrlCmd]);
- }
- void GpsModuleFunInit(GPS_COMM* data)
- {
- static GpsCtrlCmdEnumType GpsSwitchBaudrate;
- static uint32_t us0=0;
- u8 count,chnl=data->chnl,i;
- int ret;
- if(us0==0)
- us0=ustimer_get_origin();
- if(ustimer_delay_origin2(&us0,USTIMER_SEC*2)>0)
- {
- // rt_printf("Step:%d\r\n",data->GpsModuleRunStep);
- switch(data->GpsModuleRunStep)
- {
- case GPS_MODULE_INIT_STEP:
- data->GpsModuleRunStep++;
- GpsSwitchBaudrate=GPS_SET_BUADRATE1_CMD;
- break;
- case GPS_MODULE_BAUD_CHECK_STEP:
- GpsSwitchBaudrateFun(data,GpsSwitchBaudrate);
- if(++GpsSwitchBaudrate>GPS_SET_BUADRATE5_CMD)
- GpsSwitchBaudrate=GPS_SET_BUADRATE0_CMD;
- //data->GpsModuleRunStep=GPS_MODULE_BAUD_SET_STEP;
- break;
- case GPS_MODULE_BAUD_SET_STEP:
- for(count=0; count<sizeof(GpsCommBuadrateTbl)/4; count++)
- {
- if(tRunPara.tUartPara[data->chnl].dBaud==GpsCommBuadrateTbl[count])
- break;
- }
- if(count==sizeof(GpsCommBuadrateTbl)/4)
- ; //ERROR
- else
- {
- GPS_Comm_Send(data,(char*)GpsNmeaCmdData[count],sizeof(GpsNmeaCmdData[count])); //根据定值配置模块的波特率
- }
- data->GpsModuleRunStep++;
- break;
- case GPS_MODULE_BAUD_FINISH_STEP: //找到合适的波特率
- #if 1
- memset(&g_tRsComm[chnl],0,sizeof(g_tRsComm[chnl]));
- g_tRsComm[chnl].ptBuf=(BYTE*)&g_tRsIEC[chnl];
- GPSCommInit((GPS_COMM *)g_tRsComm[chnl].ptBuf,chnl); //运行步骤恢复初始状态
-
- ret = uart_open(UART_CHANNEL[chnl],tRunPara.tUartPara[chnl].dBaud,tRunPara.tUartPara[chnl].wParity);
- if (ret < 0)
- {
- printf("%s: outside uart %d open failed!\n", __FUNCTION__, UART_CHANNEL[chnl]);
- }
-
- RS_Ena_Init(chnl);
- RS_Recv_Enable(chnl);
- #endif
- GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD]));
- // rt_printf("GPS_MODULE_BAUD_FINISH_STEP.\r\n");
- data->GpsModuleRunStep = GPS_MODULE_UPDATE_FREQ_STEP;//GPS_MODULE_NORMAL_RUN_STEP;
- break;
- case GPS_MODULE_NEMA_SEL_STEP:
- // rt_printf("GPS_MODULE_NEMA_SEL_STEP = %d.\r\n", sizeof(GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD]));
- GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_UPLOAD_RMC_CMD]));
- data->GpsModuleRunStep++;
- break;
- case GPS_MODULE_NAVI_SYS_STEP:
- // rt_printf("GPS_MODULE_NAVI_SYS_STEP.\r\n");
- GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_NAVI_SYS_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_NAVI_SYS_CMD]));
- data->GpsModuleRunStep=GPS_MODULE_NORMAL_RUN_STEP;
- break;
- case GPS_MODULE_UPDATE_FREQ_STEP:
- // rt_printf("GPS_MODULE_UPDATE_FREQ_STEP.\r\n");
- GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_UPDATE_FREQ_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_UPDATE_FREQ_CMD]));
- data->GpsModuleRunStep++;
- break;
- case GPS_MODULE_SYS_STEP:
- if(tRunPara.GPS_Mode == 1) //北斗
- {
- rt_printf("选择北斗系统.\r\n");
- GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_BD_SYS_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_BD_SYS_CMD]));
- }
- else if(tRunPara.GPS_Mode == 2) //GPS
- {
- rt_printf("选择GPS系统.\r\n");
- GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_GPS_SYS_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_GPS_SYS_CMD]));
- }
- else
- {
- rt_printf("选择北斗/GPS系统.\r\n");
- GPS_Comm_Send(data,(char*)GpsNmeaCmdData[GPS_SEL_NAVI_SYS_CMD],sizeof(GpsNmeaCmdData[GPS_SEL_NAVI_SYS_CMD]));
- }
- data->GpsModuleRunStep++;
- GpsNmeaRmcData.bd_sv_num = 0;
- GpsNmeaRmcData.gp_sv_num = 0;
- for(i=0; i<GPS_NUM_MAX; i++)
- {
- GpsNmeaRmcData.bd_gsv[i].valid = 0;
- GpsNmeaRmcData.gp_gsv[i].valid = 0;
- }
- data->recv_wait_time = ustimer_get_origin();
- data->recv_handle = 0;
- break;
- case GPS_MODULE_NORMAL_RUN_STEP:
- default:
- break;
- }
- }
- }
- void GpsSendBaudrateCmd(GPS_COMM* p)
- {
- u8 i=0;
- char* ptr=&SendBuf[0];
- //memset(ptr,'A',20);
- //ptr+=20;
- //*ptr++='\r';
- //*ptr++='\n';
- ptr[i++]='$';
- #if 0 // xxxxxx 20220920 add 此函数没有用上,消除警告
- GPS_Comm_Send(p,ptr-22,22);
- #endif
- }
- void GPS_Comm_Send(GPS_COMM* p,char* data,unsigned char datalen) //发送命令
- {
- unsigned char *ptr=&g_tRsComm[p->chnl].sendbuf[0];
- *ptr++=datalen;
- //rt_printf("TX:%s\r\n",data);
- memcpy(ptr,data,datalen);
- g_tRsComm[p->chnl].nSendCnt=1; //第一个字节为长度
- g_tRsComm[p->chnl].bSend=TRUE;
- }
- #if 0
- void GenerateSecdPluse(void)
- {
- static uint32_t us0=0;
- static u8 state=0;
- if(us0==0)
- us0=ustimer_get_origin();
- switch(state)
- {
- case 0:
- if(ustimer_delay_origin2(&us0,USTIMER_MS*600)>0)
- {
- GPIO_KOUT0_OFF();
- GPIO_KOUT1_OFF();
- state=1;
- rt_printf("high=%d\r\n",ustimer_get_origin());
- }
- break;
- case 1:
- if(ustimer_delay_origin2(&us0,USTIMER_MS*50)>0)
- {
- GPIO_KOUT0_ON();
- GPIO_KOUT1_ON();
- state=0;
- rt_printf("low=%d\r\n",ustimer_get_origin());
- }
- break;
- default:
- break;
- }
- }
- #endif
- char gps_data_valid_get(void)
- {
- return GpsNmeaRmcData.data_vaild;
- }
- void gps_info_printf(void)
- {
- struct rtc_time_t rtc;
- u16 i;
- rt_printf("GPS串口数据:");
- if(gps_data_valid_get() == 'A' || gps_data_valid_get() == 1)
- {
- rt_printf("\r\n");
- rt_printf(" 系统:%s\r\n", GpsNmeaRmcData.SingleType);
- timespec_to_rtc(GpsNmeaRmcData.ts,&rtc,1);
- rt_printf(" 时间:%04d-%02d-%02d,%02d:%02d:%02d.%03d\r\n", 2000+rtc.year, rtc.month, rtc.day, rtc.hour,
- rtc.min, rtc.ms/1000, rtc.ms%1000);
- rt_printf(" 经度:%f°(%d°%d′%f″)\r\n", gps_angle_calc(GpsNmeaRmcData.Longtitude/100.0f), GpsNmeaRmcData.Longtitude_dd, GpsNmeaRmcData.Longtitude_mm, GpsNmeaRmcData.Longtitude_ss);
- rt_printf(" 纬度:%f°(%d°%d′%f″)\r\n", gps_angle_calc(GpsNmeaRmcData.Latitude/100.0f), GpsNmeaRmcData.Latitude_dd, GpsNmeaRmcData.Latitude_mm, GpsNmeaRmcData.Latitude_ss);
- rt_printf("==============================================\r\n");
- if(GpsNmeaRmcData.bd_sv_num > 0)
- {
- rt_printf("北斗卫星:%d台\r\n", GpsNmeaRmcData.bd_sv_num);
- for(i=0; i<GPS_NUM_MAX; i++)
- {
- if((GpsNmeaRmcData.bd_gsv[i].valid == 1) && (GpsNmeaRmcData.bd_gsv[i].id > 0))
- {
- if(GpsNmeaRmcData.bd_gsv[i].id > 0)
- rt_printf(" [卫星编号:%d ", GpsNmeaRmcData.bd_gsv[i].id);
- else
- rt_printf(" [卫星编号:- ");
- if(GpsNmeaRmcData.bd_gsv[i].ele > 0)
- rt_printf("仰角: %d ", GpsNmeaRmcData.bd_gsv[i].ele);
- else
- rt_printf("仰角: - ");
- if(GpsNmeaRmcData.bd_gsv[i].az > 0)
- rt_printf("方位角: %d ", GpsNmeaRmcData.bd_gsv[i].az);
- else
- rt_printf("方位角: - ");
- if(GpsNmeaRmcData.bd_gsv[i].cn0 > 0)
- rt_printf("载噪比: %d]\r\n", GpsNmeaRmcData.bd_gsv[i].cn0);
- else
- rt_printf("载噪比: -]\r\n");
- }
- }
- }
- else
- {
- rt_printf("北斗卫星:-\r\n");
- }
- rt_printf("==============================================\r\n");
- if(GpsNmeaRmcData.gp_sv_num > 0)
- {
- rt_printf("GPS卫星:%d台\r\n", GpsNmeaRmcData.gp_sv_num);
- for(i=0; i<GPS_NUM_MAX; i++)
- {
- if((GpsNmeaRmcData.gp_gsv[i].valid == 1) && (GpsNmeaRmcData.gp_gsv[i].id > 0))
- {
- if(GpsNmeaRmcData.gp_gsv[i].id > 0)
- rt_printf(" [卫星编号:%d ", GpsNmeaRmcData.gp_gsv[i].id);
- else
- rt_printf(" [卫星编号:- ");
- if(GpsNmeaRmcData.gp_gsv[i].ele > 0)
- rt_printf("仰角: %d ", GpsNmeaRmcData.gp_gsv[i].ele);
- else
- rt_printf("仰角: - ");
- if(GpsNmeaRmcData.gp_gsv[i].az > 0)
- rt_printf("方位角: %d ", GpsNmeaRmcData.gp_gsv[i].az);
- else
- rt_printf("方位角: - ");
- if(GpsNmeaRmcData.gp_gsv[i].cn0 > 0)
- rt_printf("载噪比: %d]\r\n", GpsNmeaRmcData.gp_gsv[i].cn0);
- else
- rt_printf("载噪比: -]\r\n");
- }
- }
- }
- else
- {
- rt_printf("GPS卫星:-\r\n");
- }
- }
- else if(gps_data_valid_get() == 'V')
- {
- rt_printf("\r\n");
- rt_printf(" 系统:无效\r\n");
- rt_printf(" 时间:无效\r\n");
- rt_printf(" 经度:无效\r\n");
- rt_printf(" 纬度:无效\r\n");
- }
- else
- {
- rt_printf("无\r\n");
- }
- }
- int is_gps_alive(void)
- {
- return 0;//tRunPara.GPS_sync_enable && GpsNmeaRmcData.data_vaild;//TODO EWEN
- }
- //从机时间同步
- int gps_slave_sync(struct timespec* ts)
- {
- if(tRunPara.bGPS && GpsNmeaRmcData.data_vaild) //打开秒脉冲对时
- {
- gps_pluse_clear();
- GpsNmeaRmcData.ts = *ts;
- GpsNmeaRmcData.slave_vaild = 1;
- return 1;
- }
- return 0;
- }
- void gps_init_step_set(u8 step)
- {
- u8 i;
-
- for(i=0;i<CFG_UART_NUM_MAX;i++)
- {
- // ???????,??
- if(UART_CHANNEL[i]< 0 )
- {
- continue;
- }
- if(tRunPara.tUartPara[i].wProtocol==PROTOCOL_GPS)
- {
- ((GPS_COMM *)g_tRsComm[i].ptBuf)->GpsModuleRunStep = step;
- }
- }
- }
- #endif
|