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

📄 do_other.c

📁 车载GPS监控终端的完整代码,与监控中心的通讯采用GPRS.
💻 C
📖 第 1 页 / 共 5 页
字号:
			Test_Status_Step=0;
		}
		//判断延迟时间内检测到,则认为ACC关闭
		else if(gTest_Status_Timer>TEST_ACC_TIME)
		{
			gStatus1_Flag&=~ACC_ON_F_1;
			gTest_Status_Timer=0;
			Test_Status_Step=0;
		}
	}
	else if(Test_Status_Step==2)
	{
		if(P3IN&ACC_TEST)
		{
			gTest_Status_Timer=0;
			Test_Status_Step=0;
		}
		//判断延迟时间内检测到,则认为ACC开启
		else if(gTest_Status_Timer>TEST_ACC_TIME)
		{
			gStatus1_Flag|=ACC_ON_F_1;
			gTest_Status_Timer=0;
			Test_Status_Step=0;
		}
	}
	else
	{
		gTest_Status_Timer=0;
		Test_Status_Step=0;
	}
	/********************************************************\
	B3;关于判断是否被劫报警方面的程序处理
	\********************************************************/
	if(Test_Alarm_Step==0)
	{
		if((P2IN&ARALM)==0 )
		{
			Test_Alarm_Step=1;
			gTest_Alarm_Timer=0;
		}
	}
	else if(Test_Alarm_Step==1)
	{
		if(P2IN&ARALM)
		{
			Test_Alarm_Step=0;
			gTest_Alarm_Timer=0;
		}
		else if(gTest_Alarm_Timer>=ROB_TIME)
		{
			if(gM22_Status==GSM_WORK)	gAlarm_Count=ALARM_COUNT;
			if( gAlarm_Type!=ROB_ALARM )
			{
				gAlarm_Type=ROB_ALARM;
				gStatus2_Flag|=ROB_ALARM_F_1;
				#ifdef Debug_GSM_COM1
				Send_COM1_Byte('S');Send_COM1_Byte('O');Send_COM1_Byte('S');
				Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
				#endif
				gCycle_Alarm=ALARM_CIRCLE_TIME;
				gCycle_Send_Status=ALARM_DATA;
				//被劫报警的上报的处理方式
				//1,组织数据包
				gCircle_Timer=0;
				Circle_Data_TCP(ALARM_UP,gSMS_ACK[ALARM_ACK]);
				gInternal_Flag|=SEND_CIRCLE_F_1;
				Judge_SMS_Way();
			}
			Test_Alarm_Step=0;
			gTest_Alarm_Timer=0;
		}
	}
	else
	{
		Test_Alarm_Step=0;
		gTest_Alarm_Timer=0;
	}
	/********************************************************\
	B4;判断是否有报警报警信息的发送(暂时增加一个条件)
	\********************************************************/
	if(   (gAlarm_Type!=NOP_ALARM)
	    &&(gCycle_Send_Status==ALARM_DATA)
	    &&(gCycle_Alarm>4) )
	{
		if( gCircle_Timer>gCycle_Alarm )
		{
			gCircle_Timer=0;
			Circle_Data_TCP(ALARM_UP,gSMS_ACK[ALARM_ACK]);
			//如果属于超速报警,则同时发送一个信息给显示终端
			if(   (gAlarm_Type==OVER_AREA_ALARM)		//区域报警
				||(gAlarm_Type==OVER_SPEED_ALARM)		//超速报警
				||(gAlarm_Type==OVER_TIRE_ALARM)		//疲劳驾驶报警
				||(gAlarm_Type==OVER_LINE_ALARM)	)	//线路偏移报警
			{
				Send_Over_Alarm_to_Disp(gAlarm_Type);
			}
			gInternal_Flag|=SEND_CIRCLE_F_1;
			if(gM22_Status==GSM_WORK)
			{
				if(gAlarm_Count==0)
				{
					gInternal_Flag&=~SEND_CIRCLE_F_1;
					gInternal_Flag&=~ALLOW_DATA_F_1;
					gCircle_Buffer_Point=0;
				}
				else
				{
					gAlarm_Count--;
					gInternal_Flag|=ALLOW_DATA_F_1;
				}
			}
		}
	}
	/********************************************************\
	B4-1;判断是否处于重点监控的传输方式
	\********************************************************/
	if( gCycle_Send_Status==WATCH_DATA )
	{
		//1,如果处于按定时间传输数据的方式
		if(gWatch_Type==WATCH_TYPE_TIME)
		{
			if(gWatch_Time==0)
			{
				gWatch_Count=0;gWatch_Time=0;
				gCycle_Send_Status=NOP_DATA;
				gWatch_Type=WATCH_TYPE_NULL;
				Load_Buffer1_Echo(ASK_FREEWATCH_UP,gGeneral_Buffer[5]);
			}
			else
			{
				TCP_WORK_Data(gWatch_Circle,VEHICLE_WATCHECHO_UP);
				if(gM22_Status==GSM_WORK)	gInternal_Flag|=ALLOW_DATA_F_1;
			}
		}
		else if(gWatch_Type==WATCH_TYPE_COUNT)
		{
			if(gWatch_Count==0)
			{
				gWatch_Count=0;gWatch_Time=0;
				gCycle_Send_Status=NOP_DATA;
				gWatch_Type=WATCH_TYPE_NULL;
				Load_Buffer1_Echo(ASK_FREEWATCH_UP,gGeneral_Buffer[5]);
			}
			else
			{
				TCP_WORK_Data(gWatch_Circle,VEHICLE_WATCHECHO_UP);
				if(   (gInternal_Flag&SEND_CIRCLE_F_1)
					&&( gWatch_Count>0 ) )
				{
					if(gM22_Status==GSM_WORK)	gInternal_Flag|=ALLOW_DATA_F_1;
				}
			}
		}
	}

	/********************************************************\
	B5;关于区域报警的检测程序
		说明:区域报警方式和超速度报警方式一样,每隔5秒种进行一次区域报警的检测
		累计5次,检测有效,则认为属于区域报警,一旦检测无满足条件的区域
		则立刻停止区域报警。(所有的检测条件必须是在GPS数据有效的状态下判断)
	\********************************************************/
	if( (gTimer_Area_Test>INTER_ATRA_TEST)&&(gGeneral_Flag&GPS_VALID_F_1)&&(gArea_Par!=0) )
	{
		gTimer_Area_Test=0;
		Area_All=0;
		Check_Result=0;
//		Send_COM1_Byte('(');
		for(i=1;i<=4;i++)
		{
			//依次检查4个区域的数据
			Check_Result=Check_Area_Alarm(i);
			//Send_COM1_Byte(ASCII(Check_Result));
			//返回1,则说明当前点在禁入区域内
			if(Check_Result==1)
			{
				//满足条件,则跳出此循环
				Area_All=1;break;
			}
			//返回2,则说明当前点的在禁出区域内
			else if(Check_Result==2)
			{
				Area_All=0;
				//go on
			}
			//返回3,则说明当前点不在禁入区域内
			else if(Check_Result==3)
			{
				//go on
			}
			//返回4,则说明当前点不在禁出区域内
			else if(Check_Result==4)
			{
				//需要判断完所有的禁出区域,如果当前点只要在一个禁出区域内,则认为无满足条件
				Area_Out_Num++;
			}
			//返回0。则说明当前判断区域数据无效
			else if(Check_Result==0)
			{
				//go on
			}
		}
		/*
		Send_COM1_Byte(')');
		Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
		*/
		SRAM_Init();
		j=SRAM_Read(SAREA_OUT_NUM);
		if( (Area_All==0)&&(Area_Out_Num>=j)&&(j<=4)&&(j>0))
		{
			Area_All=1;
		}
		else if( (Area_All==0)&&(gAlarm_Type==OVER_AREA_ALARM))
		{
			gAlarm_Type=NOP_ALARM;
			gCycle_Send_Status=NOP_DATA;
			gAlarm_Count=0;
			gCircle_Timer=0;
			gArea_No_Count=0;
			Circle_Data_TCP(VEHICLE_RUNDATA_UP,0);
			gInternal_Flag|=SEND_CIRCLE_F_1;
 			Judge_SMS_Way();
		}
		if( (Area_All==1)&&(gAlarm_Type==NOP_ALARM) )
		{
			gArea_No_Count++;
		}
	}
	if( (gArea_No_Count>5)&&(gAlarm_Type==NOP_ALARM) )
	{
		gArea_No_Count=0;
		gAlarm_Type = OVER_AREA_ALARM;
		gCycle_Send_Status=ALARM_DATA;
		gCircle_Timer=0;
		gCycle_Alarm=ALARM_CIRCLE_TIME;
		gSMS_ACK[ALARM_ACK]=0;
		Circle_Data_TCP(ALARM_UP,gSMS_ACK[ALARM_ACK]);
		Send_Over_Alarm_to_Disp(gAlarm_Type);
		gInternal_Flag|=SEND_CIRCLE_F_1;
		if(gM22_Status==GSM_WORK)
		{
			gAlarm_Count=ALARM_COUNT;
		}
		Judge_SMS_Way();
	}
	/********************************************************\
	B6;与行车轨迹相关的一些处理流程:
		1,先判断IP地址和开关量
		 1-1:如果IP地址有效果,且开关量处于开启状态
		 1-2:IP地址无效或者开关量未开启
		 	1-1-1:如果gCycle_GSM>4且为行车轨迹状态
	\********************************************************/
	//IP地址有效,开关量开启
	if( (gGeneral_Flag&TCP_IP_VALID_1)&&((gON_OFF_Temp0&TCP_LAND_ON_OFF_1)==0) )
	{
		//如果处于GSM工作方式
		if(gM22_Status==GSM_WORK)
		{
			//如果间隔属于大于20分钟
			if( (gCycle_TCP>=TCP_TRACK_MINTIME)&&(gCycle_Send_Status==TRACK_DATA_TIME) )
			{
				TCP_WORK_Data(gCycle_TCP,VEHICLE_RUNDATA_UP);
			}
			//如果间隔属于小于20分钟
			else if( (gCycle_TCP>4)&&(gCycle_TCP<TCP_TRACK_MINTIME)&&(gCycle_Send_Status==TRACK_DATA_TIME) )
			{
				TCP_WORK_Data(SMS_DATA_TIME,VEHICLE_RUNDATA_UP);
			}
		}
		//如果处于TCP的工作方式
		else if( gM22_Status==TCP_ONLINE_WORK )
		{
			if(gCycle_Send_Status==TRACK_DATA_TIME)
			{
				TCP_WORK_Data(gCycle_TCP,VEHICLE_RUNDATA_UP);
			}
		}
	}
	//如果IP地址无效,或者开关量关闭
	else
	{
		if( (gCycle_GSM>4)
			&&(gCycle_Send_Status==TRACK_DATA_TIME)
			&&(gM22_Status==GSM_WORK) )
		{
			GSM_WORK_Data();
		}
	}
	/********************************************************\
	\********************************************************/
	/********************************************************\
	B7;	关于线路报警的程序部分
		说明:
	\********************************************************/
	if(   (gStatus3_Flag&LINE_LIMIT_F_1)
		&&(gGeneral_Flag&GPS_VALID_F_1)
		&&(gLine_Num>0)&&(gLine_Num<=60) )
	{
		if(gLine_Timer>8)
		{
			gLine_Timer=0;
			gCommon_Flag&=~LINE_OUT_F_1;
			for(i=0;i<gLine_Num-1;i++)
			{
				Check_Result=Check_Line_Data(i);
				Clear_Exter_WatchDog();
				//Send_COM1_Byte(ASCII(Check_Result%10));
				//计算垂直点在当前线段内,属于需要统计计算距离
				//1,返回0,则表示异常
				if(Check_Result==0);
				//2,返回1,则表示垂直点没落在当前线段内
				else if(Check_Result==1);
				//3,返回2,则说明垂直点落在当前线段内,但距离大于最大限制的值
				else if(Check_Result==2)
				{
					gOver_Line_Count++;
					gCommon_Flag|=LINE_OUT_F_1;
				}
				//4,返回3,说明不满足偏离线路的条件
				else if(Check_Result==3)
				{
					gOver_Line_Count=0;
					gCommon_Flag|=LINE_OUT_F_1;
					if(gAlarm_Type==OVER_LINE_ALARM)
					{
						gCommon_Flag|=STOP_OVERLINE_F_1;
					}
					break;
				}
			}
			if(   (i==gLine_Num-1)
				&&((gCommon_Flag&LINE_OUT_F_1)==0) )
			{
				gOver_Line_Count++;
			}
		}
	}
	if(gOver_Line_Count>2)
	{
		//满足条件,则产生偏离报警
		gOver_Line_Count=0;
		if(gAlarm_Type==NOP_ALARM)
		{
			gAlarm_Type = OVER_LINE_ALARM;
			gCycle_Send_Status=ALARM_DATA;
			gCircle_Timer=0;
			gCycle_Alarm=ALARM_CIRCLE_TIME;
			gSMS_ACK[ALARM_ACK]=0;
			Circle_Data_TCP(ALARM_UP,gSMS_ACK[ALARM_ACK]);
			Send_Over_Alarm_to_Disp(gAlarm_Type);
			gInternal_Flag|=SEND_CIRCLE_F_1;
			if(gM22_Status==GSM_WORK)
			{
				gAlarm_Count=ALARM_COUNT;
			}
			Judge_SMS_Way();
		}
	}
	else if( (gAlarm_Type==OVER_LINE_ALARM)&&(gCommon_Flag&STOP_OVERLINE_F_1) )
	{
		gAlarm_Type=NOP_ALARM;
		gCycle_Send_Status=NOP_DATA;
		gAlarm_Count=0;
		gStatus2_Flag&=~ROB_ALARM_F_1;
		gCommon_Flag&=~STOP_OVERLINE_F_1;
		gCircle_Timer=0;
		gOver_Line_Count=0;
		Circle_Data_TCP(VEHICLE_RUNDATA_UP,0);
		gInternal_Flag|=SEND_CIRCLE_F_1;
		Judge_SMS_Way();
	}
}
/********************************************************\
		下面是程序 的子模块部分
\********************************************************/
/********************************************************\
*	函数名:Circle_Data_TCP
	作用域:本地文件调用
*	功能:  在TCP的工作方式下,如果是报警,或者行车轨迹,或者监控数据,
			组织到gCircle_Buffer[]缓冲中
*	参数:

*	返回值:

*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/

void Circle_Data_TCP(unsigned char nCommand,unsigned char nACK )
{
	unsigned char nInput=29+4;
	unsigned int iCheckOut=0;
	unsigned char nFlag=0;
	nFlag=gAlarm_Type;

	gCircle_Buffer_Point=0;
	gCircle_Buffer[gCircle_Buffer_Point]=SOH;
	iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
	gCircle_Buffer_Point++;
	gCircle_Buffer[gCircle_Buffer_Point]=nCommand;
	iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
	gCircle_Buffer_Point++;
	gCircle_Buffer[gCircle_Buffer_Point]=(char)(~nCommand);
	iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
	gCircle_Buffer_Point++;
	gCircle_Buffer[gCircle_Buffer_Point]=nInput-4;
	iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
	gCircle_Buffer_Point++;
	gCircle_Buffer[gCircle_Buffer_Point]=nACK;
	iCheckOut += gCircle_Buffer[gCircle_Buffer_Point];
	gCircle_Buffer_Point++;

⌨️ 快捷键说明

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