?? gps_handle.c
字號:
/****************************************Copyright (c)**************************************************
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.H"
#define __AMOD_GPS_PARSER
char * startchar(char * str,char endch );
uint16 StrTOUINT(char * str,uint8 DBits);
/*******************************************************************************************
** Function name: weekdayGet
** Descriptions: 根據(jù)輸入的日期,計算該日期對應(yīng)的星期數(shù)。
** Input parameters: uiYear 年
uiMonth 月
uiDay 日
** Output parameters: 無
** Returned value: 對應(yīng)的星期數(shù)
*******************************************************************************************/
INT32U weekdayGet(INT32U uiYear,INT32U uiMonth,INT32U uiDay)
{
INT32U uiDays[12] = {31,59,90,120,151,181,212,243,273,304,334,365};
INT32U uiNum;
uiNum = (INT32U)((uiYear-1L)*365 + uiDay + (uiYear-1L)/4 - (uiYear-1L)/100 + (uiYear-1L)/400);
if(uiMonth > 1)
uiNum+=uiDays[uiMonth-2];
if((uiMonth > 2)&&(uiYear%4==0&&uiYear%100!=0||uiYear%400==0))
uiNum++;
return uiNum % 7;
}
GPS_DATA_TYPE GPS_DATA;
//GPS故障后,置相關(guān)信息
uint8 Reset_GPS_DATA(RTC_DATETIME * dateTime)
{
GPS_DATA.Time.Flag=0; //故障
GPS_DATA.Time.Hour = (uint8)(dateTime->Time_hour);
GPS_DATA.Time.Min = (uint8)(dateTime->Time_min);
GPS_DATA.Time.Sec = (uint8)(dateTime->Time_sec);
GPS_DATA.Time.ms = 0; //.sss
GPS_DATA.Time.Day = (uint8)(dateTime->Time_day);
GPS_DATA.Time.Mon = (uint8)(dateTime->Time_month);
GPS_DATA.Time.Year = (uint8)(dateTime->Time_year-2000);
GPS_DATA.Time.Week=(uint8)(dateTime->Time_week);
//GPS_DATA.Latitude;
//GPS_DATA.Longitude;
GPS_DATA.Altitude=0;
GPS_DATA.HDOP=0;
GPS_DATA.VDOP=0;
GPS_DATA.StlUsed=0;
//////////GPS_DATA.Satellite[MAXSATELLITE];
GPS_DATA.Speed=0;
//GPS_DATA.Direction;
GPS_DATA.Status=0;
return TRUE;
}
// Chad
char gw_tempout[128];
#if !defined(__AMOD_GPS_PARSER)
uint8 recv_GPS_data(char * temp, uint16 uiNum)
{
char *tempstr=NULL;
char *p=NULL,*pp=NULL,*ppp=NULL;
char * str_flag[2]={"$GPGGA","$GPRMC"};
//unsigned short shRtnNum = 0 ;
pp=temp;
// Chad: Add to display
//__DBG3_printf2(pp, uiNum);
//sprintf(gw_tempout,"\r\n===GPS: (%d:%d)===\r\n", uiNum, shRtnNum);
//__DBG3_printf1(gw_tempout);
while((p=strstr(pp,"$"))!=NULL)
{
if ((ppp=strstr(p+1,"$"))!=NULL)
{
// Chad
//__DBG3_printf2(p, ppp-p);
if ((ppp-p)>=50)
{
static char buff[TRANSINFOLEN/2];
uint16 dataLen=0;
dataLen=(uint16)(ppp-p);
// Chad
//__DBG3_printf2(p, dataLen);
memset(buff,0,sizeof(buff));
//////////memmove(buff,p,ppp-p);
if(dataLen>TRANSLEN/2) return FALSE;
memcpy(buff,p,dataLen);
// Chad: Remove
// uartWrite(UART3,(uint8 *)buff,dataLen,NULL); //測試
//__DBG3_printf2(buff, dataLen);
//OSSchedLock();
// Chad: Add
//sprintf(gw_tempout,"\r\n===GPS===\r\n");
//uartWrite(UART3,(uint8 *)gw_tempout,strlen(gw_tempout),NULL); //測試
if(strstr(buff,str_flag[0])!=NULL && strstr(buff,"\r\n")!=NULL)
{
tempstr=buff;
// Chad
__DBG3_printf2(tempstr, dataLen);
startchar(tempstr,',');
tempstr = tempstr+strlen(str_flag[0])+1;//$GPGGA,
//UTC
startchar(tempstr,',');
GPS_DATA.Time.Hour = (uint8)(StrTOUINT(tempstr,2));
GPS_DATA.Time.Min = (uint8)(StrTOUINT(tempstr+2,2));
GPS_DATA.Time.Sec = (uint8)(StrTOUINT(tempstr+4,2));
GPS_DATA.Time.ms = StrTOUINT(tempstr+7,strlen(tempstr+7)); //.sss
tempstr = tempstr + strlen(tempstr)+1;//hhmmss.sss,
//Latitude
GPS_DATA.Latitude.dd = (uint8)(StrTOUINT(tempstr,2));
GPS_DATA.Latitude.mm = (uint8)(StrTOUINT(tempstr+2,2));
GPS_DATA.Latitude.mmmm = StrTOUINT(tempstr+5,4);//.mmmm
tempstr = tempstr + 11;//ddmm.mmmm, <--- should 11 ublox
//N/S Latitude
GPS_DATA.Latitude.Indicator = tempstr[0];
tempstr = tempstr + 2;//N,
//Longitude
GPS_DATA.Longitude.ddd = StrTOUINT(tempstr,3);
GPS_DATA.Longitude.mm = (uint8)(StrTOUINT(tempstr+3,2));
GPS_DATA.Longitude.mmmm = StrTOUINT(tempstr+6,4);//.mmmm
tempstr = tempstr + 12;//dddmm.mmmm, <--- should 12 ublox
//E/W Longtitude
GPS_DATA.Longitude.Indicator = tempstr[0];
tempstr = tempstr + 2;//E,
//Fix Indicator
GPS_DATA.Status = (uint8)(StrTOUINT(tempstr,1) << 4);
tempstr = tempstr + 2;//1,
//Satellites Used
GPS_DATA.StlUsed = (uint8)(StrTOUINT(tempstr,2));
tempstr = tempstr + 3;//07,
//HDOP
tempstr = startchar( tempstr,',' );
GPS_DATA.HDOP = (uint8)( StrTOUINT(tempstr, strlen(tempstr)-1) );
tempstr = tempstr+strlen(tempstr) + 1;//1.0,
//Altitude
tempstr = startchar( tempstr,',' );
if((p=strchr(tempstr,'.'))!=NULL)
tempstr[p-tempstr]='\0';
if(tempstr[0] == '-' )//負(fù)數(shù)
{
tempstr++;
GPS_DATA.Altitude = StrTOUINT(tempstr, strlen(tempstr));
//GPS_DATA.Altitude = 0-GPS_DATA.Altitude;
GPS_DATA.Altitude|=0x8000;
}
else
{
GPS_DATA.Altitude = StrTOUINT(tempstr, strlen(tempstr));
GPS_DATA.Altitude&=(~0x8000);
}
}
if(strstr(buff,str_flag[1])!=NULL && strstr(buff,"\r\n")!=NULL)
{
tempstr=buff;
// Chad
__DBG3_printf2(tempstr, dataLen);
startchar(tempstr,',');
tempstr = tempstr+strlen(str_flag[1])+1;//$GPGRMC,
startchar(tempstr,',');
GPS_DATA.Time.Hour = (uint8)(StrTOUINT(tempstr,2));
GPS_DATA.Time.Min = (uint8)(StrTOUINT(tempstr+2,2));
GPS_DATA.Time.Sec = (uint8)(StrTOUINT(tempstr+4,2));
GPS_DATA.Time.ms = StrTOUINT(tempstr+7,strlen(tempstr+7)); //.sss
tempstr = tempstr + strlen(tempstr)+1;//hhmmss.sss,
//data flag
GPS_DATA.Time.Flag = tempstr[0];
tempstr = tempstr +2;
GPS_DATA.Latitude.dd = (uint8)(StrTOUINT(tempstr,2));
GPS_DATA.Latitude.mm = (uint8)(StrTOUINT(tempstr+2,2));
GPS_DATA.Latitude.mmmm = StrTOUINT(tempstr+5,4);//.mmmm
tempstr = tempstr + 11;//ddmm.mmmm, <--- should 11 ublox
//N/S Latitude
GPS_DATA.Latitude.Indicator = tempstr[0];
tempstr = tempstr + 2;//N,
//Longitude
GPS_DATA.Longitude.ddd = StrTOUINT(tempstr,3);
GPS_DATA.Longitude.mm = (uint8)(StrTOUINT(tempstr+3,2));
GPS_DATA.Longitude.mmmm = StrTOUINT(tempstr+6,4);//.mmmm
tempstr = tempstr + 12;//dddmm.mmmm, <--- should 12 ublox
//E/W Longitude
GPS_DATA.Longitude.Indicator = tempstr[0];
tempstr = tempstr + 2;//E
startchar(tempstr,',');
if(tempstr!='\0')
{
ppp = tempstr + strlen(tempstr) + 1;
if((p=strchr(tempstr,'.'))!=NULL)
if(strlen(p)>2)
tempstr[p-tempstr+2]='\0';
GPS_DATA.Speed = StrTOUINT( tempstr, strlen(tempstr)-1) ;
tempstr = ppp;//0.13,
//Speed
}
else
{
GPS_DATA.Speed = 0;
tempstr++;
}
// Chad: Remove
// uartWrite(UART3,(uint8 *)"+Speed=",7,NULL); //測試
// sprintf(str_flag[0],"%d+\n",GPS_DATA.Speed);
// uartWrite(UART3,(uint8 *)str_flag[0],strlen(str_flag[0]),NULL); //測試
// Chad: Add
//sprintf(gw_tempout,"\r\n+Speed=%d++\r\n",GPS_DATA.Speed);
//uartWrite(UART3,(uint8 *)gw_tempout,strlen(gw_tempout),NULL); //測試
startchar(tempstr,',');
if(tempstr!='\0')
{
ppp = tempstr + strlen(tempstr) + 1;
if((p=strchr(tempstr,'.'))!=NULL)
tempstr[p-tempstr]='\0';
GPS_DATA.Direction.ddd = StrTOUINT(tempstr,strlen(tempstr));
tempstr = tempstr + strlen(tempstr) + 1;
if(tempstr!='\0')
{
GPS_DATA.Direction.m = (uint8)StrTOUINT(tempstr,strlen(tempstr));
tempstr = tempstr + strlen(tempstr) + 1;//306.62,
}
tempstr = ppp;
//Direction
}
else
{
GPS_DATA.Direction.ddd = 0;
GPS_DATA.Direction.m = 0;
tempstr++;
}
// Chad: Remove
// uartWrite(UART3,(uint8 *)"+Direction=",7,NULL); //測試
// sprintf(str_flag[0],"%d.%d+\n",GPS_DATA.Direction.ddd,GPS_DATA.Direction.m);
// uartWrite(UART3,(uint8 *)str_flag[0],strlen(str_flag[0]),NULL); //測試
// Chad: Add
//sprintf(gw_tempout,"\r\n+Direction=%d++\r\n",GPS_DATA.Direction.m);
//uartWrite(UART3,(uint8 *)gw_tempout,strlen(gw_tempout),NULL); //測試
GPS_DATA.Time.Day = (uint8)( StrTOUINT(tempstr, 2 ));
tempstr = tempstr + 2;//dd;
GPS_DATA.Time.Mon = (uint8)( StrTOUINT(tempstr, 2 ));
tempstr = tempstr + 2;//mm;
GPS_DATA.Time.Year = (uint8)( StrTOUINT(tempstr, 2 ));
tempstr = tempstr + 2;//yy;
}
memset(buff,0,sizeof(buff));
if(RTC_Init_OK!=2) //GPS時間
{
RTC_InitDft(); //初始化RTC為當(dāng)前時間
}
/*
else if(GPS_DATA.Time.Flag!='A')
{
RTC_DATETIME dateTime;
RtcTime(&dateTime);
Reset_GPS_DATA(&dateTime);//置為系統(tǒng)時間
}
*/
// OSSchedUnlock();
}
pp=ppp;
}
else
break;
}
return TRUE;
}
#endif // end of #if !defined(__AMOD_GPS_PARSER)
/*********************************************************************************************************
** Function name: startchar
**
** Descriptions: check the string from head to end
**
** input parameters: * str :string pointer
** endch :end char
** Returned value: char * :return the string
**
********************************************************************************************************/
char * startchar(char * str,char endch )
{
uint16 i=0;
char * Ptr;
Ptr=str;
while(str[i])
{
if(str[i]==endch)
{
str[i]=0;
return Ptr;
}
i++;
if(i>30)
break;
}
return NULL;
}
/*********************************************************************************************************
** Function name: StrTOUINT
**
** Descriptions: change string to 16 bits integer
**
** input parameters: * str :string pointer
** DBits :string length
** Returned value: uint16 :changed result
**
********************************************************************************************************/
uint16 StrTOUINT(char * str,uint8 DBits)
{
uint8 i=0;
uint16 j=0;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -