?? gps_handle.c
字號(hào):
if( DBits <= 5 )
{
do
{
if(str[i] != '.')
{
j=(str[i]-0x30)+j*10;
DBits--;
}
i++;
}while(DBits > 0);
}
return j;
}
#if defined(__AMOD_GPS_PARSER)
unsigned char gxbgps_nState;
unsigned char gxbgps_Checksum; // Calculated NMEA sentence checksum
unsigned char gxbgps_ReceivedChecksum; // Received NMEA sentence checksum (if exists)
unsigned short gxwgps_Index; // Index used for command and data
unsigned char gxbgps_Command[8]; // NMEA command
unsigned char gxbgps_Data[96]; // NMEA data
unsigned char gxbgps_HasNMEAData;
unsigned char gxbgps_pField[32];
unsigned char gxbgps_GGAGPSQuality;
unsigned char gxbgps_pRMCDataValid;
unsigned char gxbgps_pConvBuff[10];
//
unsigned char gxbgps_GPSNMEADataType;
//
unsigned short gxwgps_NMEAIndex; // Index used for Whole NMEA command and data
unsigned char gxbgps_NMEAData[128]; // NMEA command + data
/*
extern unsigned char gxbgps_nState;
extern unsigned char gxbgps_Checksum; // Calculated NMEA sentence checksum
extern unsigned char gxbgps_ReceivedChecksum; // Received NMEA sentence checksum (if exists)
extern unsigned short gxwgps_Index; // Index used for command and data
extern unsigned char gxbgps_Command[8]; // NMEA command
extern unsigned char gxbgps_Data[96]; // NMEA data
extern unsigned char gxbgps_HasNMEAData;
extern unsigned char gxbgps_pField[32];
extern unsigned char gxbgps_GGAGPSQuality;
extern unsigned char gxbgps_pRMCDataValid;
extern unsigned char gxbgps_pConvBuff[10];
//
extern unsigned char gxbgps_GPSNMEADataType;
//
extern unsigned short gxwgps_NMEAIndex; // Index used for Whole NMEA command and data
extern unsigned char gxbgps_NMEAData[128]; // NMEA command + data
*/
// Gps module
#define NP_STATE_SOM 0 // Search for start of message
#define NP_STATE_CMD 1 // Get command
#define NP_STATE_DATA 2 // Get data
#define NP_STATE_CHECKSUM_1 3 // Get first checksum character
#define NP_STATE_CHECKSUM_2 4 // get second checksum character
#define NP_MAX_CMD_LEN 8 // maximum command length (NMEA address)
#define NP_MAX_DATA_LEN 96 // maximum data length
#define MAXFIELD 32 // maximum field length
///////////////////////////////////////////////////////////////////////////////
// Name: GetField
//
// Description: This function will get the specified field in a NMEA string.
//
// Entry: BYTE *pData - Pointer to NMEA string
// BYTE *pField - pointer to returned field
// int nfieldNum - Field offset to get
// int nMaxFieldLen - Maximum of bytes pFiled can handle
///////////////////////////////////////////////////////////////////////////////
unsigned char gps_GetField(unsigned char *pData,
unsigned char *pField,
unsigned short nFieldNum,
unsigned short nMaxFieldLen )
{
unsigned short i = 0;
unsigned short nField = 0;
unsigned short i2 = 0;
//
// Validate params
//
if(pData == 0 || pField == 0 || nMaxFieldLen == 0)
{
pField[0] = '\0';
return 0;
}
//
// Go to the beginning of the selected field
//
i = 0;
nField = 0;
while(nField != nFieldNum && pData[i])
{
if(pData[i] == ',')
{
nField++;
}
i++;
if(pData[i] == 0)
{
pField[0] = '\0';
return 0;
}
}
if(pData[i] == ',' || pData[i] == '*')
{
pField[0] = '\0';
return 0;
}
//
// copy field from pData to Field
//
i2 = 0;
while(pData[i] != ',' && pData[i] != '*' && pData[i])
{
pField[i2] = pData[i];
i2++; i++;
//
// check if field is too big to fit on passed parameter. If it is,
// crop returned field to its max length.
//
if(i2 >= nMaxFieldLen)
{
i2 = nMaxFieldLen-1;
break;
}
} // emd of while
pField[i2] = '\0';
return i2;
}
void gps_ProcessGPRMC(void)
{
unsigned short shRtnLen=0;
sprintf(gw_tempout,"\r\nRMC: (%s)\r\n", gxbgps_Data);
__DBG3_printf1(gw_tempout);
//
// Time
//
if ( (shRtnLen=gps_GetField(gxbgps_Data, gxbgps_pField, 0, MAXFIELD))>0 )
{
if ( shRtnLen>=6 ) {
// <hhmmss> or <hhmmss.sss>
// Hour
//gxbgps_pConvBuff[0] = gxbgps_pField[0];
//gxbgps_pConvBuff[1] = gxbgps_pField[1];
//gxbgps_pConvBuff[2] = '\0';
//GPS_DATA.Time.Hour = (uint8) atoi(gxbgps_pConvBuff);
GPS_DATA.Time.Hour = (uint8)(( gxbgps_pField[0] - '0' ) * 10 + ( gxbgps_pField[1] - '0' ));
// minute
//gxbgps_pConvBuff[0] = gxbgps_pField[2];
//gxbgps_pConvBuff[1] = gxbgps_pField[3];
//gxbgps_pConvBuff[2] = '\0';
//GPS_DATA.Time.Min = (uint8) atoi(gxbgps_pConvBuff);
GPS_DATA.Time.Min = (uint8)(( gxbgps_pField[2] - '0' ) * 10 + ( gxbgps_pField[3] - '0' ));
// Second
//gxbgps_pConvBuff[0] = gxbgps_pField[4];
//gxbgps_pConvBuff[1] = gxbgps_pField[5];
//gxbgps_pConvBuff[2] = '\0';
//GPS_DATA.Time.Sec = (uint8) atoi(gxbgps_pConvBuff);
GPS_DATA.Time.Sec = (uint8)(( gxbgps_pField[4] - '0' ) * 10 + ( gxbgps_pField[5] - '0' ));
if ( shRtnLen>=10 ) {
//.sss
// minisecond
gxbgps_pConvBuff[0] = gxbgps_pField[7];
gxbgps_pConvBuff[1] = gxbgps_pField[8];
gxbgps_pConvBuff[2] = gxbgps_pField[9];
gxbgps_pConvBuff[3] = '\0';
GPS_DATA.Time.ms = (uint8) atoi((char *)gxbgps_pConvBuff);
} else {
GPS_DATA.Time.ms = 0;
} // end of if ( shRtnLen>=10 )
} // end of if ( shRtnLen>=6 )
}
//
// Data valid
//
if ( gps_GetField(gxbgps_Data, gxbgps_pField, 1, MAXFIELD) )
{
if ( gxbgps_pField[0] == 'A' || gxbgps_pField[0] == 'V' ) {
gxbgps_pRMCDataValid = gxbgps_pField[0];
GPS_DATA.Time.Flag = gxbgps_pRMCDataValid;
}
}
//
// Latitude
//
if ( (shRtnLen=gps_GetField(gxbgps_Data, gxbgps_pField, 2, MAXFIELD))>0 )
{
if ( shRtnLen>=9 ) {
// <ddmm.mmmm>
// dd
gxbgps_pConvBuff[0] = gxbgps_pField[0];
gxbgps_pConvBuff[1] = gxbgps_pField[1];
gxbgps_pConvBuff[2] = '\0';
GPS_DATA.Latitude.dd = (uint8) atoi((char *)gxbgps_pConvBuff);
// mm
gxbgps_pConvBuff[0] = gxbgps_pField[2];
gxbgps_pConvBuff[1] = gxbgps_pField[3];
gxbgps_pConvBuff[2] = '\0';
GPS_DATA.Latitude.mm = (uint8) atoi((char *)gxbgps_pConvBuff);
// mmmm
gxbgps_pConvBuff[0] = gxbgps_pField[5];
gxbgps_pConvBuff[1] = gxbgps_pField[6];
gxbgps_pConvBuff[2] = gxbgps_pField[7];
gxbgps_pConvBuff[3] = gxbgps_pField[8];
gxbgps_pConvBuff[4] = '\0';
GPS_DATA.Latitude.mmmm = (uint16) atoi((char *)gxbgps_pConvBuff);
} // end of if ( shRtnLen>=9 )
}
if ( (shRtnLen=gps_GetField(gxbgps_Data, gxbgps_pField, 3, MAXFIELD))>0 )
{
if( (gxbgps_pField[0] == 'S') || (gxbgps_pField[0] == 'N') )
{
GPS_DATA.Latitude.Indicator = gxbgps_pField[0];
}
}
//
// Longitude
//
if ( (shRtnLen=gps_GetField(gxbgps_Data, gxbgps_pField, 4, MAXFIELD))>0 )
{
if ( shRtnLen>=10 ) {
// <dddmm.mmmm>
// dd
gxbgps_pConvBuff[0] = gxbgps_pField[0];
gxbgps_pConvBuff[1] = gxbgps_pField[1];
gxbgps_pConvBuff[2] = gxbgps_pField[2];
gxbgps_pConvBuff[3] = '\0';
GPS_DATA.Longitude.ddd = (uint16) atoi((char *)gxbgps_pConvBuff);
// mm
gxbgps_pConvBuff[0] = gxbgps_pField[3];
gxbgps_pConvBuff[1] = gxbgps_pField[4];
gxbgps_pConvBuff[2] = '\0';
GPS_DATA.Longitude.mm = (uint8) atoi((char *)gxbgps_pConvBuff);
// mmmm
gxbgps_pConvBuff[0] = gxbgps_pField[6];
gxbgps_pConvBuff[1] = gxbgps_pField[7];
gxbgps_pConvBuff[2] = gxbgps_pField[8];
gxbgps_pConvBuff[3] = gxbgps_pField[9];
gxbgps_pConvBuff[4] = '\0';
GPS_DATA.Longitude.mmmm = (uint16) atoi((char *)gxbgps_pConvBuff);
} // end of if ( shRtnLen>=10 )
}
if ( gps_GetField(gxbgps_Data, gxbgps_pField, 5, MAXFIELD) )
{
if( (gxbgps_pField[0] == 'W') || (gxbgps_pField[0] == 'E') )
{
GPS_DATA.Longitude.Indicator = gxbgps_pField[0];
}
}
//
// Ground speed
//
if ( (shRtnLen=gps_GetField(gxbgps_Data, gxbgps_pField, 6, MAXFIELD))>0 )
{
/*
char *pIdx;
if( (pIdx=strchr(gxbgps_pField,'.'))!=0 )
//if(strlen(pIdx)>2)
if ( (shRtnLen-pIdx-1)>2 )
//gxbgps_pField[pIdx-gxbgps_pField+2]='\0';
pIdx[0]='\0';
GPS_DATA.Speed = StrTOUINT((char*)gxbgps_pField, strlen(gxbgps_pField)-1) ;
*/
double dAltitude = atof((char*)gxbgps_pField);
dAltitude = dAltitude * 100;
GPS_DATA.Speed = (uint16) dAltitude;
}
//
// course over ground, degrees true
//
if ( gps_GetField(gxbgps_Data, gxbgps_pField, 7, MAXFIELD) ) {
char *pIdx;
if( (pIdx=strchr((char*)gxbgps_pField,'.'))!=0 )
//gxbgps_pField[pIdx-gxbgps_pField]='\0';
pIdx[0]='\0';
GPS_DATA.Direction.ddd = StrTOUINT((char*)gxbgps_pField,strlen((char*)gxbgps_pField));
//pIdx = gxbgps_pField + strlen(gxbgps_pField) + 1;
pIdx++;
if( pIdx!='\0' )
{
GPS_DATA.Direction.m = (uint8)StrTOUINT(pIdx,strlen(pIdx));
}
}
//
// Date
//
if ( gps_GetField(gxbgps_Data, gxbgps_pField, 8, MAXFIELD) ) {
// Day
//gxbgps_pConvBuff[0] = gxbgps_pField[0];
//gxbgps_pConvBuff[1] = gxbgps_pField[1];
//gxbgps_pConvBuff[2] = '\0';
//GPS_DATA.Time.Day = (uint8) atoi((char *)gxbgps_pConvBuff);
GPS_DATA.Time.Day = ( gxbgps_pField[0] - '0' ) * 10 + ( gxbgps_pField[1] - '0' );
// Month
//gxbgps_pConvBuff[0] = gxbgps_pField[2];
//gxbgps_pConvBuff[1] = gxbgps_pField[3];
//gxbgps_pConvBuff[2] = '\0';
//GPS_DATA.Time.Mon = (uint8) atoi(gxbgps_pConvBuff);
GPS_DATA.Time.Mon = ( gxbgps_pField[2] - '0' ) * 10 + ( gxbgps_pField[3] - '0' );
// Year
//gxbgps_pConvBuff[0] = gxbgps_pField[4];
//gxbgps_pConvBuff[1] = gxbgps_pField[5];
//gxbgps_pConvBuff[2] = '\0';
//GPS_DATA.Time.Year = (uint8) atoi(gxbgps_pConvBuff);
GPS_DATA.Time.Year = ( gxbgps_pField[4] - '0' ) * 10 + ( gxbgps_pField[5] - '0' );
}
// Set RTC Time
if(RTC_Init_OK!=2 ) //GPS
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -