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

📄 do_other.c

📁 车载GPS监控终端的完整代码,与监控中心的通讯采用GPRS.
💻 C
📖 第 1 页 / 共 5 页
字号:
			{
				gCircle_Timer=0;
				gInternal_Flag&=~LOAD_ONEVALID_F_1;
				//在0--gCycle_TCP内仍然未判断到一个有效的数据,则将这个作为一个点存储
				Circle_Data_TCP(nCommand,0);
				gInternal_Flag|=SEND_CIRCLE_F_1;
				Judge_SMS_Way();
			}
		}
	}
}

/********************************************************\
*	函数名:Max_Result()
	作用域:
*	功能:
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
unsigned long int Max_Result(unsigned long int x,unsigned long int y)
{
	if(x>y)	return(x);
	else	return(y);
}
/********************************************************\
*	函数名:Min_Result()
	作用域:
*	功能:
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
unsigned long int Min_Result(unsigned long int x,unsigned long int y)
{
	if(x<y)	return(x);
	else	return(y);
}

/********************************************************\
*	函数名:Account_Mid_Dot()
	作用域:
*	功能:
*	参数:
*	返回值:
*	创建人:
*
\********************************************************/
unsigned char Account_Mid_Dot(double x1,double y1,double x2,double y2)
{
	unsigned char Line_Flag=0;
	double k,b,k1,b1;
	double ak;
	double Max_gLongitude=0,Max_gLatitude=0;
	double Min_gLongitude=0,Min_gLatitude=0;
	double Longitude_Temp=0,Latitude_Temp=0;
	unsigned long int nLength=0;

	//先判断当前点与判断的线段的第一个点的距离,如果此点的距离就不满足偏离条件,则返回5
	//1,计算两点经度差值所表示的实际距离
	nLength=labs(gLatitude-(long int)(y1*3600000) );
	Latitude_Temp=(double)((nLength/1000.0)*DIS_LAT);
	//2,计算两点纬度差值所表示的实际距离
	nLength=labs(gLongitude-(long int)(x1*3600000) );
	Longitude_Temp=(double)((nLength/1000.0)*DIS_LON);

	if( (Longitude_Temp<gMax_Limit_Distance)&&(Latitude_Temp<gMax_Limit_Distance) )
	{
		Latitude_Temp=Latitude_Temp*Latitude_Temp+Longitude_Temp*Longitude_Temp;
		Latitude_Temp=sqrt(Latitude_Temp);
		if(Latitude_Temp<gMax_Limit_Distance)		return(5);
	}
	/////////////////////////////////////////////////////////////////////

	Longitude_Temp=(double)(gLongitude/3600000.0);
	Latitude_Temp=(double)(gLatitude/3600000.0);

	if(x1>=x2)
	{
		Max_gLongitude=x1;Min_gLongitude=x2;
	}
	else
	{
		Max_gLongitude=x2;Min_gLongitude=x1;
	}
	if(y1>=y2)
	{
		Max_gLatitude=y1;Min_gLatitude=y2;
	}
	else
	{
		Max_gLatitude=y2;Min_gLatitude=y1;
	}

	if(   ((Max_gLongitude-Min_gLongitude)<0.0003)
		&&((Max_gLatitude-Min_gLatitude)>0.0003)	 )
	{
		Line_Flag=1;
	}
	else if(   ((Max_gLongitude-Min_gLongitude)>0.0003)
			 &&((Max_gLatitude-Min_gLatitude)<0.0003)	 )
	{
		Line_Flag=2;
	}
	else if(   ((Max_gLongitude-Min_gLongitude)>0.0003)
			 &&((Max_gLatitude-Min_gLatitude)>0.0003)	 )
	{
		k=(y2-y1)/(x2-x1);
		ak=fabs(k);
		if(ak>1000)				Line_Flag=1;	//相当于垂直,相当于x相同
		else if(ak<0.001)		Line_Flag=2;	//相当于平行,相当于y相同
		else					Line_Flag=0;	//可以有计算的斜率
	}
	else	//两个点重合
	{
		return(0);
	}
	/*
	k=(y2-y1)/(x2-x1);
	ak=fabs(k);
	if(ak>100)				Line_Flag=1;	//相当于垂直,相当于x相同
	else if(ak<0.01)		Line_Flag=2;	//相当于平行,相当于y相同
	else					Line_Flag=0;	//可以有计算的斜率
	*/
	//1,如果两个点的纬度数据相同,则判断经度,y相同,判断x
	if(Line_Flag==2)		//gLatitude
	{
		if(Longitude_Temp>Max_gLongitude)		return(1);
		else if(Longitude_Temp<Min_gLongitude)	return(1);
		else
		{
			gLongitude_mid=gLongitude;
			gLatitude_mid=(long int)(3600000*(y1+y2)/2);
			return(2);
		}
	}
	//2,如果两个点的经度数据相同,则判断纬度,x相同,判断y
	else if(Line_Flag==1)	//gLongitude
	{
		if(Latitude_Temp>Max_gLatitude)			return(1);
		else if(Latitude_Temp<Min_gLatitude)	return(1);
		else
		{
			gLongitude_mid=(long int)(3600000*(x1+x2)/2);					//经度,相当于y
			gLatitude_mid=gLatitude;								//纬度,相当于x
			return(3);
		}
	}
	//3,如果可以计算斜率
	else if(Line_Flag==0)
	{
		b=y1-k*x1;
		k1=-1/k;
		b1=(double)(gLatitude/3600000.0)-k1*(double)(gLongitude/3600000.0);//b1=

		Longitude_Temp=(b1-b)/(k-k1);
		Latitude_Temp= k1*Longitude_Temp+b1;

		gLongitude_mid=(long int)(Longitude_Temp*3600000);
		gLatitude_mid=(long int)(Latitude_Temp*3600000);

		if(gLongitude_mid>(long int)(Max_gLongitude*3600000))			return(1);
		else if(gLongitude_mid<(long int)(Min_gLongitude*3600000))		return(1);
		else if(gLatitude_mid>(long int)(Max_gLatitude*3600000))		return(1);
		else if(gLatitude_mid<(long int)(Min_gLatitude*3600000))		return(1);
		else
		{
			return(4);
		}
	}
	return(0);
	//返回0,则属于异常
	//返回1,表示垂线的交点不在当前线段内,则此线段的判断结束,进行下一个线段的判断
	//返回2,垂线的交点在当前线段内,但两个点的经度相同,纬度不同
	//返回3,垂线的交点在当前线段内,但两个点的纬度相同,经度不同
	//返回4,垂线的交点在单前线段内,并且两个点的经度,纬度君不相同
	//返回5,说明当前点离线段的第一个点的距离已经不满足偏离距离的条件
}
/********************************************************\
*	函数名:Check_Sram_AreaData()
	作用域:
*	功能:
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)

\********************************************************/
/*
unsigned char Check_Sram_AreaData(void)
{
	unsigned int i=0;
	SRAM_Init();
	if( (SRAM_Read(SAREA_DATA_FS)==0x55)&&(SRAM_Read(SAREA_DATA_FE)==0xAA) )
	{
		return(1);
	}
	else
	{
		return(0);
	}
}
*/
/********************************************************\
*	函数名:Check_Area_Alarm()
	作用域:
*	功能:
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)

\********************************************************/
unsigned char Check_Area_Alarm(unsigned char Num)
{
	unsigned long int gLongitude_1=0,gLatitude_1=0;
	unsigned long int gLongitude_2=0,gLatitude_2=0;
	unsigned long int Max_gLongitude=0,Max_gLatitude=0;
	unsigned long int Min_gLongitude=0,Min_gLatitude=0;

	unsigned char Area_Flag=0;
	unsigned int Area_Add=0;
	unsigned int Aflag_Add=0;

	Area_Add=SAREA1_LON_1_2+(Num-1)*17;			//区域的首地址
	Aflag_Add=Area_Add+16;						//区域标志的地址

	//先判断对应的Num区域是禁出还是禁入
	SRAM_Init();
	Area_Flag=SRAM_Read(Aflag_Add);
	if( (Area_Flag!=0xaa)&&(Area_Flag!=0x55) )	return(0);
	//2,第一个点的经,纬度
	gLongitude_1 = SRAM_Read(Area_Add);
	gLongitude_1<<=8;
	gLongitude_1 += SRAM_Read(Area_Add+1);
	gLongitude_1<<=8;
	gLongitude_1 += SRAM_Read(Area_Add+2);
	gLongitude_1<<=8;
	gLongitude_1 += SRAM_Read(Area_Add+3);

	gLatitude_1 = SRAM_Read(Area_Add+4);
	gLatitude_1<<=8;
	gLatitude_1 += SRAM_Read(Area_Add+5);
	gLatitude_1<<=8;
	gLatitude_1 += SRAM_Read(Area_Add+6);
	gLatitude_1<<=8;
	gLatitude_1 += SRAM_Read(Area_Add+7);
	//3,第二个点的经,纬度
	gLongitude_2 = SRAM_Read(Area_Add+8);
	gLongitude_2<<=8;
	gLongitude_2 += SRAM_Read(Area_Add+9);
	gLongitude_2<<=8;
	gLongitude_2 += SRAM_Read(Area_Add+10);
	gLongitude_2<<=8;
	gLongitude_2 += SRAM_Read(Area_Add+11);

	gLatitude_2 = SRAM_Read(Area_Add+12);
	gLatitude_2<<=8;
	gLatitude_2 += SRAM_Read(Area_Add+13);
	gLatitude_2<<=8;
	gLatitude_2 += SRAM_Read(Area_Add+14);
	gLatitude_2<<=8;
	gLatitude_2 += SRAM_Read(Area_Add+15);

	Max_gLongitude=Max_Result(gLongitude_1,gLongitude_2);
	Max_gLatitude=Max_Result(gLatitude_1,gLatitude_2);
	Min_gLongitude=Min_Result(gLongitude_1,gLongitude_2);
	Min_gLatitude=Min_Result(gLatitude_1,gLatitude_2);

	//判断对应点在这个区域范围内
	if(   (gLongitude>Min_gLongitude)&&(gLongitude<Max_gLongitude)
		&&(gLatitude>Min_gLatitude)&&(gLatitude<Max_gLatitude)	)
	{
		//当前点在此区域范围内
		//1,如果此区域属于禁入标志
		if(Area_Flag==0xaa)			return(1);	//可以产生报警
		//2,如果此区域属于禁出标志,
		else if(Area_Flag==0x55)	return(2);	//
	}
	//判断这个点对应不在这个区域内
	else
	{
		//当前点不在这个区域范围内
		//1,如果此区域属于禁入标志,
		if(Area_Flag==0xaa)			return(3);	//此区域PASS
		//2,如果此区域属于禁出标志,则返回2
		else if(Area_Flag==0x55)	return(4);	//此区域计数
	}
	return(0);
}
/********************************************************\
*	函数名:Account_Distance()
	作用域:
*	功能:
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
	统计计算告诉了两个精度,两个纬度,计算出,中间点的精度,纬度值
\********************************************************/

/********************************************************\
*	函数名:Send_Over_Speed_to_Disp
	作用域:
*	功能:  定期送给显示终端超速报警信息
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Send_Over_Alarm_to_Disp(unsigned char Alarm_Style)
{
	if(gDisp_Buffer_Point+8+2<=sizeof(gDisp_Buffer))
	{
		gDisp_Buffer[gDisp_Buffer_Point]=8+2;
		gDisp_Buffer_Point++;
		gDisp_Buffer[gDisp_Buffer_Point]=0;
		gDisp_Buffer_Point++;
		gDisp_Buffer[gDisp_Buffer_Point]='@';
		gDisp_Buffer_Point++;
		gDisp_Buffer[gDisp_Buffer_Point]='%';
		gDisp_Buffer_Point++;
		gDisp_Buffer[gDisp_Buffer_Point]=8;
		gDisp_Buffer_Point++;
		gDisp_Buffer[gDisp_Buffer_Point]=DISP_MAIN_ARALM_DOWN;
		gDisp_Buffer_Point++;
		gDisp_Buffer[gDisp_Buffer_Point]=Alarm_Style;
		gDisp_Buffer_Point++;
		gDisp_Buffer[gDisp_Buffer_Point]=0;
		gDisp_Buffer_Point++;
		gDisp_Buffer[gDisp_Buffer_Point]='$';
		gDisp_Buffer_Point++;
		gDisp_Buffer[gDisp_Buffer_Point]='&';
		gDisp_Buffer_Point++;
	}
}
/********************************************************\
*	函数名:Check_Line_Data
	作用域:
*	功能:  定期送给显示终端超速报警信息
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
	S_Num_ID的值的范围为1----61
\********************************************************/
unsigned char  Check_Line_Data(unsigned char S_Num_ID)
{
	unsigned long int gLatitude_1,gLatitude_2;
	unsigned long int gLongitude_1,gLongitude_2;
	unsigned long int nLength=0;
	unsigned char nR_Value=0;
	double	gLat_1,gLon_1,gLat_2,gLon_2;
	unsigned int SLine_Address;
	double 	Distance_LAT=0,Distance_LON=0;

	//先根据ID号计算相邻的两个点的第一个点的在SRAM中的位置
	SLine_Address=SLINE_DATA_1+8*S_Num_ID;
	//依次读取数据
	SRAM_Init();
	//第一个点的经,纬度
	gLongitude_1 = SRAM_Read(SLine_Address);
	gLongitude_1<<=8;
	gLongitude_1 += SRAM_Read(SLine_Address+1);
	gLongitude_1<<=8;
	gLongitude_1 += SRAM_Read(SLine_Address+2);
	gLongitude_1<<=8;
	gLongitude_1 += SRAM_Read(SLine_Address+3);

	gLatitude_1 = SRAM_Read(SLine_Address+4);
	gLatitude_1<<=8;
	gLatitude_1 += SRAM_Read(SLine_Address+5);
	gLatitude_1<<=8;
	gLatitude_1 += SRAM_Read(SLine_Address+6);
	gLatitude_1<<=8;
	gLatitude_1 += SRAM_Read(SLine_Address+7);
	//第二个点的经度,纬度
	gLongitude_2 = SRAM_Read(SLine_Address+8);
	gLongitude_2<<=8;
	gLongitude_2 += SRAM_Read(SLine_Address+9);
	gLongitude_2<<=8;
	gLongitude_2 += SRAM_Read(SLine_Address+10);
	gLongitude_2<<=8;
	gLongitude_2 += SRAM_Read(SLine_Address+11);

	gLatitude_2 = SRAM_Read(SLine_Address+12);
	gLatitude_2<<=8;
	gLatitude_2 += SRAM_Read(SLine_Address+13);
	gLatitude_2<<=8;
	gLatitude_2 += SRAM_Read(SLine_Address+14);
	gLatitude_2<<=8;
	gLatitude_2 += SRAM_Read(SLine_Address+15);
//==============
//==============

	//开始计算两个点的相关数据
	gLat_1=(double)(gLatitude_1/3600000.0);
	gLon_1=(double)(gLongitude_1/3600000.0);
	gLat_2

⌨️ 快捷键说明

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