📄 gps_handle.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: GPS_HANDLE.c
** Last modified Date: 2005-06-17
** Last Version: 1.0
** Descriptions: header file of GPS
**
**------------------------------------------------------------------------------------------------------
** Created by: Yehaoben
** Created date: 2005-06-17
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#define GPS_GLOBALS
#include "config.H"
const char GGA_DATA_L[] = GGA_DATA;
const char GLL_DATA_L[] = GLL_DATA;
const char GSA_DATA_L[] = GSA_DATA;
const char GSV_DATA_L[] = GSV_DATA;
const char RMC_DATA_L[] = RMC_DATA;
const char VTG_DATA_L[] = VTG_DATA;
OS_STK GPS_task_stack[GPS_TASK_STACK_SIZE];
GPSDataQ_TYPE GPSDataQ[GPS_CMDNUM];
uint8 GPSDataQNUM;
uint8 GPSDataQWPTR;
void ZLG_GPS_Handle(void *pdata);
char * startchar(char * str,char endch );
uint16 StrTOUINT(char * str,uint8 DBits);
OS_EVENT *GPSSerialRcv;
char STOP_COMMAND[]=GPS_STOP_CMD;
char START_COMMAND[]=GPS_START_CMD;
char ADD_ALL_COMMAND[]=GPS_ADD_ALL_CMD;
/*********************************************************************************************************
** Function name: ZLG_GPS_Initial
**
** Descriptions: Initial GPS
**
** input parameters: None
** Returned value: None
**
** Used global variables: None
** Calling modules: None
**
** Created by: Yehaoben
** Created Date: 2005/06/02
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void ZLG_GPS_Initial(void)
{
uint8 i;
GPSSerialRcv = OSSemCreate(0);//creat the recive signal;
GPSDataQNUM = 0;
GPSDataQWPTR = 0;
for(i = 0; i < GPS_CMDNUM; i ++)
{
GPSDataQ[i].State = 0;//find the command
}
UART_Ini(9600);//initial com port
OSTaskCreateExt(ZLG_GPS_Handle,
(void *)0,
&GPS_task_stack[GPS_TASK_STACK_SIZE-1],
GPS_TASK_PRIO,
GPS_TASK_ID,
&GPS_task_stack[0],
GPS_TASK_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
//creat the ZLG_GPS_Handle task
}
/*********************************************************************************************************
** Function name: ZLG_GPS_Handle
**
** Descriptions: GPS handle task
**
** input parameters: None
** Returned value: None
**
** Used global variables: None
** Calling modules: None
**
** Created by: Yehaoben
** Created Date: 2005/06/02
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void ZLG_GPS_Handle(void *pdata)
{
uint8 i,err,temp8,j;
uint16 temp16;
char * temptr;
while(1)
{
OSSemPend(GPSSerialRcv,0,&err);//pend the recive signal;
if(err == OS_NO_ERR)
{
for(i = 0; i < GPS_CMDNUM; i ++)
{
if(GPSDataQ[i].State == 2)//find the command
break;
}
if(i >= GPS_CMDNUM)
continue;
temptr = GPSDataQ[i].Data;
OSSchedLock();
if(strncmp(temptr,GGA_DATA_L,strlen(GGA_DATA_L)) == 0)
{
startchar(temptr,',');
temptr = temptr+strlen(temptr)+1;//$GPGGA,
//UTC
startchar(temptr,',');
GPS_DATA.Time.Hour = (uint8)(StrTOUINT(temptr,2));
GPS_DATA.Time.Min = (uint8)(StrTOUINT(temptr+2,2));
GPS_DATA.Time.Sec = (uint8)(StrTOUINT(temptr+4,2));
GPS_DATA.Time.ms = StrTOUINT(temptr+7,strlen(temptr+7)); //.sss
temptr = temptr + strlen(temptr)+1;//hhmmss.sss,
//Latitude
GPS_DATA.Latitude.dd = (uint8)(StrTOUINT(temptr,2));
GPS_DATA.Latitude.mm = (uint8)(StrTOUINT(temptr+2,2));
GPS_DATA.Latitude.mmmm = StrTOUINT(temptr+5,4);//.mmmm
temptr = temptr + 10;//ddmm.mmmm,
//N/S Latitude
GPS_DATA.Latitude.Indicator = temptr[0];
temptr = temptr + 2;//N,
//Longtitude
GPS_DATA.Longtitude.ddd = StrTOUINT(temptr,3);
GPS_DATA.Longtitude.mm = (uint8)(StrTOUINT(temptr+3,2));
GPS_DATA.Longtitude.mmmm = StrTOUINT(temptr+6,4);//.mmmm
temptr = temptr + 11;//dddmm.mmmm,
//E/W Longtitude
GPS_DATA.Longtitude.Indicator = temptr[0];
temptr = temptr + 2;//E,
//Fix Indicator
GPS_DATA.Status = (uint8)(StrTOUINT(temptr,1) << 4);
temptr = temptr + 2;//1,
//Satellites Used
GPS_DATA.StlUsed = (uint8)(StrTOUINT(temptr,2));
temptr = temptr + 3;//07,
//HDOP
temptr = startchar( temptr,',' );
GPS_DATA.HDOP = (uint8)( StrTOUINT(temptr, strlen(temptr)-1) );
temptr = temptr+strlen(temptr) + 1;//1.0,
//Altitude
temptr = startchar( temptr,',' );
if(temptr[0] == '-' )//负数
{
temptr++;
GPS_DATA.Altitude = StrTOUINT(temptr, strlen(temptr)-1);
GPS_DATA.Altitude = 0-GPS_DATA.Altitude;
}
else
GPS_DATA.Altitude = StrTOUINT(temptr, strlen(temptr)-1);
}
else if(strncmp(temptr,GLL_DATA_L,strlen(GLL_DATA_L)) == 0)
{
GPSDataQ[i].State = 0; ;
}
else if(strncmp(temptr,GSA_DATA_L,strlen(GSA_DATA_L)) == 0)
{
startchar(temptr,',');
temptr = temptr+strlen(temptr)+3;//$GPGSA,A,
//MODE
temp8 = (uint8)(StrTOUINT(temptr,1));
GPS_DATA.Status = (GPS_DATA.Status & 0XF0) + temp8;
temptr = temptr+2;//3,
//Satellite
for(j = 0; j < MAXSATELLITE; j++)
{
temptr = startchar( temptr,',' );
if(strlen(temptr) > 0)
{
GPS_DATA.Satellite[j].ID = (uint8)( StrTOUINT(temptr, strlen(temptr)) );
}
temptr = temptr + strlen(temptr) + 1;//07,//,,
}
//PDOP
temptr = startchar( temptr,',' );
//GPS_DATA.PDOP = (uint8)( StrTOUINT(temptr, strlen(temptr)-1) );
temptr = temptr + strlen(temptr) + 1;//1.0,
//HDOP
temptr = startchar( temptr,',' );
GPS_DATA.HDOP = (uint8)( StrTOUINT(temptr, strlen(temptr)-1) );
temptr = temptr + strlen(temptr) + 1;//1.0,
//VDOP
temptr = startchar( temptr,'*' );
GPS_DATA.VDOP = (uint8)( StrTOUINT(temptr, strlen(temptr)-1) );
}
else if(strncmp(temptr,GSV_DATA_L,strlen(GSV_DATA_L)) == 0)
{
startchar(temptr,',');
temptr = temptr + strlen(temptr)+3;//$GPGSV,2,
temp8 = (uint8)(StrTOUINT(temptr,1));
temp8 --;
for(j = 0; j < 4; j++)
{
GPS_DATA.Satellite[temp8 * 4 + j].SNR = 0;
}
temptr = temptr + 2;//1,
//Stl Use
err = (uint8)( StrTOUINT(temptr, 2 ));
err = 12 - (temp8 * 4) ;
err = ( err > 4 ) ? 4 : err;
temptr = temptr + 3;//07,
//Satellite message
for(j = 0; j < err; j++)
{
//ID
GPS_DATA.Satellite[temp8 * 4 + j].ID = (uint8)( StrTOUINT(temptr, 2 ));
temptr = temptr + 3;//07,
//Elevation
GPS_DATA.Satellite[temp8 * 4 + j].AZnEL = (uint16)( StrTOUINT(temptr, 2 ));
temptr = temptr + 3;//79,
//Azimuth
temp16 = (uint16)( StrTOUINT(temptr, 3 ));
temp16 = temp16 * 100;
GPS_DATA.Satellite[temp8 * 4 + j].AZnEL = GPS_DATA.Satellite[temp8 * 4 + j].AZnEL + temp16;
temptr = temptr + 4;//035,
//SNR
GPS_DATA.Satellite[temp8 * 4 + j].SNR = (uint16)( StrTOUINT(temptr, 2 ));
temptr = temptr + 3;//42,
}
}
else if(strncmp(temptr,RMC_DATA_L,strlen(RMC_DATA_L)) == 0)
{
startchar(temptr,',');
temptr = temptr + strlen(temptr)+12;//$GPRMC,HHMMSS.SSS,
//data flag
GPS_DATA.Time.Flag = temptr[0];
temptr = temptr + 27;//A,DDMM.MMMM,N,DDDMM.MMMM,W,
startchar(temptr,',');
temptr = temptr + strlen(temptr) + 1;//0.13,
startchar(temptr,',');
temptr = temptr + strlen(temptr) + 1;//306.62,
GPS_DATA.Time.Day = (uint8)( StrTOUINT(temptr, 2 ));
temptr = temptr + 2;//dd;
GPS_DATA.Time.Mon = (uint8)( StrTOUINT(temptr, 2 ));
temptr = temptr + 2;//mm;
GPS_DATA.Time.Year = (uint8)( StrTOUINT(temptr, 2 ));
temptr = temptr + 2;//yy;
}
else if(strncmp(temptr,VTG_DATA_L,strlen(VTG_DATA_L)) == 0)
{
startchar(temptr,',');
temptr = temptr + strlen(temptr)+1;//$GPVTG,
startchar(temptr,',');
temptr = temptr + strlen(temptr)+1;//309.62,
startchar(temptr,',');
temptr = temptr + strlen(temptr)+1;//T,
startchar(temptr,',');
temptr = temptr + strlen(temptr)+1;//,
startchar(temptr,',');
temptr = temptr + strlen(temptr)+1;//M,
startchar(temptr,',');
temptr = temptr + strlen(temptr)+1;//0.13,
startchar(temptr,',');
temptr = temptr + strlen(temptr)+1;//N,
startchar(temptr,',');
GPS_DATA.Speed = StrTOUINT( temptr, strlen(temptr)-1) ;
}
GPSDataQ[i].State = 0;
OSSchedUnlock();
}
}
}
/*********************************************************************************************************
** Function name: ZLG_GPS_RVC_HANDLE
**
** Descriptions: Revice data and save into GPSDataQ
**
** input parameters: uint8 :one data
**
** Returned value: None
**
** Used global variables: None
** Calling modules: None
**
** Created by: Yehaoben
** Created Date: 2005/06/02
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void ZLG_GPS_RVC_HANDLE(uint8 i)
{
if(GPSDataQ[GPSDataQNUM].State == 1)// had got the $
{
GPSDataQ[GPSDataQNUM].Data[GPSDataQWPTR] = i;
if(i == '$')
{
GPSDataQWPTR = 0;
}
if( i == 0x0d )//command to end?
{
GPSDataQ[GPSDataQNUM].Data[GPSDataQWPTR+1] = 0;
GPSDataQWPTR = 0;
GPSDataQ[GPSDataQNUM].State = 2;
i = 0;
do
{
if(GPSDataQ[i].State == 0)
{
GPSDataQNUM = i;
break;
}
i++;
}while( i < GPS_CMDNUM );//find the next idle DataQ
if(i >= GPS_CMDNUM)
{
GPSDataQNUM = GPS_CMDNUM - 1;
GPSDataQ[GPSDataQNUM].State = 0;
}
OSSemPost(GPSSerialRcv);//send signal;
}
else
GPSDataQWPTR ++;
if(GPSDataQWPTR >= GPS_CMDMaxSize)//data overflow
{
GPSDataQWPTR = 0;
GPSDataQ[GPSDataQNUM].State = 0;
}
}
else//find the $
{
if( i == '$')
{
GPSDataQ[GPSDataQNUM].Data[GPSDataQWPTR] = i;
GPSDataQWPTR ++;
GPSDataQ[GPSDataQNUM].State = 1;
}
}
}
/*********************************************************************************************************
** 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
**
** Used global variables: None
** Calling modules: None
**
** Created by: Yehaoben
** Created Date: 2005/06/02
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
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
**
** Used global variables: None
** Calling modules: None
**
** Created by: Yehaoben
** Created Date: 2005/06/02
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint16 StrTOUINT(char * str,uint8 DBits)
{
uint8 i=0;
uint16 j=0;
if( DBits <= 5 )
{
do
{
if(str[i] != '.')
{
j=(str[i]-0x30)+j*10;
DBits--;
}
i++;
}while(DBits > 0);
}
return j;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -