⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nmeastring.cpp

📁 Gpsapi 2.0(标准mobile接口)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	char tmp[20];	

	while(str[i]!='.' && str[i]) i++;

	if(!str[i]) 
	{		
		intr=atoi(str);
		deci=0;
	}
	else
	{
		memcpy(tmp,str,i);
		tmp[i]=0;
		intr=atoi(tmp);

		len=strlen(str)-i-1;
		if(len>0)
			memcpy(tmp,str+i+1,len);
		tmp[len]=0;
		deci=atoi(tmp);
	}
	result=(intr*10000.0+deci)/10000;
	return result;
#else
	if(str && str[0]!='\0')
	{
		return atof(str);
	}
	return 0;
#endif
	
}

double NmeaString::GetDecimalDegrees(double dCoordinate)
{
	double return_value = 0.0;

	int degrees = (int) ::floor(dCoordinate);//整数部分
	int minutes = degrees % 100;             //获得分的整数部分

	double fractional_minutes = 0.0;
	double throw_away         = 0.0;

	fractional_minutes = ::modf(dCoordinate,&throw_away);//获得分的小数部分

	degrees -= minutes;
	degrees /= 100;//获得度

	return_value = degrees*3600.0;
	return_value += (double)((double)minutes*(double)60.0);
	return_value += (double)((double)fractional_minutes*(double)60.0);

	return (return_value);
}

BOOL NmeaString::Checksum(int istart,int len)
{
	int i=0;
	unsigned char chksum=0,total;
	char str[5];

	i=istart+2;
	chksum=m_pBuffer[istart+1];
	while(m_pBuffer[i]!='*' && i<(len+istart))
	{
		chksum^=m_pBuffer[i];
		i++;
	}

	if(m_pBuffer[i]!='*') return FALSE;

	memcpy(str,m_pBuffer+i+1,2);
	str[3]=0;

	total=(unsigned char)strtoul(str,NULL,16);
	
	if(total!=chksum)
		return FALSE;

	return TRUE;
}

int NmeaString::ParserGGA(int istart)
{
	int i,res,tmp;
	char *p,*token ;	
	double      dHigh=0;
	char str[10];

	i=istart+1;
	while(m_pBuffer[i]!='\r' && m_pBuffer[i+1]!='\n' && m_pBuffer[i]!='$' && i<m_lengh) i++;

	if(i>=m_lengh) return -1;	

	res=i-istart+2;
	m_pBuffer[res-1+istart]=0;

	if(m_pBuffer[i]=='$') return res;

	//验证数据有效性	
	tmp=0;
	i=istart;
	while(m_pBuffer[i])
	{
		if(m_pBuffer[i]==',') tmp++;

		i++;
	}
	if(tmp!=14) return res;	

	//解析卫星数据
	i=0;
	p=m_pBuffer+istart;
	token=StringTok(p,',');	
	while(token && i<NMEA_GPGGA_SEG_NUM)
	{
		switch(i)
		{
		case NMEA_GPGGA_TIME:	
			{
				if(strlen(token)>=6)
				{
					memset(str,0,5);
					memcpy(str,token,2);
					m_gTime.wHour=atoi(str)+8;

					memcpy(str,token+2,2);
					m_gTime.wMinute=atoi(str);

					memcpy(str,token+4,2);
					m_gTime.wSecond=atoi(str);
				}
			}
			break;
		case NMEA_GPGGA_GPS_STATUS:
			break;
		case NMEA_GPGGA_LAT:			
			//dLat=GetDecimalDegrees(Str2Double(token));
			break;
		case NMEA_GPGGA_LONG:	
			//dLong=GetDecimalDegrees(Str2Double(token));
			break;
		case NMEA_GPGGA_STAR_NUM:
			m_iStarNum=atoi(token);
			break;		
		case NMEA_GPGGA_HIGH:
			m_dHigh=Str2Double(token);
			break;
		}
		token=StringTok(NULL,',');
		i++;
	}	
	
	return res;	
}

int NmeaString::ParserGSA(int istart)
{
	int i,res,tmp;
	char *p,*token ;	
	double      dHigh=0;
	char str[10] = {0};


	i=istart+1;
	while(m_pBuffer[i]!='\r' && m_pBuffer[i+1]!='\n' && m_pBuffer[i]!='$' && i<m_lengh) i++;

	if(i>=m_lengh) return -1;

	res=i-istart+2;
	m_pBuffer[res-1+istart]=0;

	if(m_pBuffer[i]=='$') return res;

	//验证数据有效性
	tmp=0;
	i=istart;
	while(m_pBuffer[i])
	{
		if(m_pBuffer[i]==',') tmp++;

		i++;
	}
	if(tmp != NMEA_GPGSA_SEG_NUM) return res;

	//解析卫星数据
	i=0;
	p=m_pBuffer+istart;
	token=StringTok(p,',');	
	while(token && i < NMEA_GPGSA_SEG_NUM + 1)
	{
		switch(i)
		{
		case NMEA_GPGSA_MODE:	
			{
				//m_sGSAData.iMode = atoi(token);	
				if(!memcmp(token,"A",1))
					m_sGSAData.iMode = 1;
				else if(!memcmp(token,"M",1))
					m_sGSAData.iMode = 2;
				else
					m_sGSAData.iMode = 0;
			}
			break;
		case NMEA_GPGSA_TYPE:
			m_sGSAData.iType = atoi(token);
			break;
		case NMEA_GPGSA_PDOP:			
			m_sGSAData.dPdop=atof(token);
			break;
		case NMEA_GPGSA_HDOP:	
			m_sGSAData.dHdop=atof(token);
			break;
		case NMEA_GPGSA_VDOP:
			m_sGSAData.dVdop=atof(token);
			break;		
		default:
			break;
		}
		token=StringTok(NULL,',');
		i++;
	}

	return res;
}

int  NmeaString::StringFind(char* str,char chr)
{
	int i=0;

	while(str[i] && str[i]!=chr) i++;
	
	if(str[i]==chr) return i;

	return -1;
}

int NmeaString::ParserGSV(int istart)
{
	int i,res,tmp;
	char *p,*token ;
	int			iSentenceNum=0;
	int         iSentenceNo=0;
	double		dHigh=0; // 高程 米 	

	i=istart+1;
	while(m_pBuffer[i]!='\r' && m_pBuffer[i+1]!='\n' && m_pBuffer[i]!='$' && i<m_lengh) i++;

	if(i>=m_lengh) return -1;

	res=i-istart+2;
	m_pBuffer[res-1+istart]=0;

	if(m_pBuffer[i]=='$') return res;

	//验证数据有效性
	tmp=0;
	i=istart;
	while(m_pBuffer[i])
	{
		if(m_pBuffer[i]==',') tmp++;

		i++;
	}
	if((tmp-3)%4) return res;

	//return res;

	//解析卫星数据
	i=0;
	p=m_pBuffer+istart;
	token=StringTok(p,',');	
	while(token && i<(res+istart))
	{
		switch(i)
		{
		case NMEA_GPGSV_SENTENCE_NUM:
			iSentenceNum=atoi(token);
			break;
		case NMEA_GPGSV_SENTENCE_NO:
			iSentenceNo=atoi(token);
			if(iSentenceNo==1 || iSentenceNo>iSentenceNum)
				m_iStarDataLen=0;
			break;
		case NMEA_GPGSV_STAR_NUM:
			m_iStarNumCon=atoi(token);
			break;
		case 0:
			break;
		default:
			{
				if((tmp=StringFind(token,'*'))>=0)
				{
					token[tmp]=0;
					m_sStarData[m_iStarDataLen].sar=atoi(token);
					m_iStarDataLen++;
					m_iStarDataLen%=MAX_STAR_NUM;
					break;
				}

				switch((i-3)%4)
				{
				case NMEA_GPGSV_STAR_NO:
					m_sStarData[m_iStarDataLen].id=atoi(token);						
					break;
				case NMEA_GPGSV_STAR_ANGLE:
					m_sStarData[m_iStarDataLen].angleV=atoi(token);
					break;		
				case NMEA_GPGSV_STAR_ANGLE2:
					m_sStarData[m_iStarDataLen].angleH=atoi(token);
					break;
				case NMEA_GPGSV_STAR_SAR:
					m_sStarData[m_iStarDataLen].sar=atoi(token);
					m_iStarDataLen++;
					m_iStarDataLen%=MAX_STAR_NUM;
					break;
				}				
			}
			break;	
		}
		token=StringTok(NULL,',');
		i++;
	}

	
	return res;
}
BOOL NmeaString::AppendBuffer(char* str, int len)
{
	int i;
	int tmp;
	char* p;

	if(!str || len<=0) return FALSE;
	//Checksum()

	if((int)strlen(str)>len) str[len]=0;

//#ifdef WRITE_GPS_DATA_TO_FILE
	if (m_bLogGpsData)
	{
		int fsize;
		FILE* file;
		file=fopen(WRITE_FILE_PATH,"a+b");
		if(file)
		{
			fseek(file, 0, SEEK_END);

			fsize = ftell(file)/1000;
			fsize = fsize/1000;
			if(fsize<20)
			{
				fwrite(str,1,len,file);
			}

			fclose(file);
		}		
	}
//#endif
	//clear the buffer
	if(m_pos>0 && m_pos<m_lengh)
	{
		memcpy(m_pBuffer,m_pBuffer+m_pos,(m_lengh-m_pos)*sizeof(char));
		m_lengh-=m_pos;
		m_pBuffer[m_lengh]=0;

		m_pos=-1;
	}
	else if(m_pos!=0)
	{	
		m_lengh=0;
		if(m_pBuffer)
			m_pBuffer[0]=0;
	}

	//pack the buffer
	if(m_lengh!=0 && m_size>(3*DEFAULT_NEMASTRING_LEN) && (m_size*1.0/m_lengh)>2)
	{
		p=(char*)malloc(DEFAULT_NEMASTRING_LEN*2);
		if(p)
		{
			m_size=2*DEFAULT_NEMASTRING_LEN;
			memset(p,0,m_size);
			memcpy(p,m_pBuffer,m_lengh);
			free(m_pBuffer);
			m_pBuffer=p;
		}		
	}

	//store the old length
	tmp=m_lengh;

	//realloc the buffer
	if((len+m_lengh)>m_size)
	{
		p=(char*)realloc(m_pBuffer,sizeof(char)*(len+m_lengh+1));
		if(!p) return FALSE;

		m_size=len+m_lengh+1;
		m_pBuffer=p;		
	}

	//append the buffer
	memcpy(m_pBuffer+tmp,str,len);
	m_lengh+=len;
	m_pBuffer[m_lengh]=0;

	//parser the buffer
	i=0;
	while(i<m_lengh)	
	{
		if(m_pBuffer[i]=='$')
		{
			if(!memcmp(m_pBuffer+i,NMEA_GPRMC,NMEA_FRAME_FLAGS_LEN))
			{
				if((tmp=ParserRMC(i))<0) 
				{
					m_pos=i;
					break;
				}
				else
				{
					i+=tmp;
				}
			}
			else if(!memcmp(m_pBuffer+i,NMEA_GPGGA,NMEA_FRAME_FLAGS_LEN))
			{				
				if((tmp=ParserGGA(i))<0) 
				{
					m_pos=i;
					break;
				}
				else
				{
					i+=tmp;
				}
			}
			else if(!memcmp(m_pBuffer+i,NMEA_GPGSV,NMEA_FRAME_FLAGS_LEN))
			{				
				if((tmp=ParserGSV(i))<0) 
				{
					m_pos=i;
					break;
				}
				else
				{
					i+=tmp;
				}
			}
			else if(!memcmp(m_pBuffer+i,NMEA_GPGSA,NMEA_FRAME_FLAGS_LEN))
			{
				if((tmp=ParserGSA(i))<0) 
				{
					m_pos=i;
					break;
				}
				else
				{
					i+=tmp;
				}
			}
			else
				i++;
		
		}		
		else
			i++;		
	}

	return TRUE;
}

double NmeaString::Distance(double nX1, double nY1, double nX2, double nY2)
{   
	// 两点之间的距离 
	double nReturn = 0;
	double ndX = nX1 - nX2;
	double ndY = nY1 - nY2;
	nReturn = sqrt(ndX * ndX + ndY * ndY);

	return nReturn;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -