📄 do_other.c
字号:
{
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 + -