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

📄 do_other.c

📁 车载GPS监控终端的完整代码,与监控中心的通讯采用GPRS.
💻 C
📖 第 1 页 / 共 5 页
字号:
			&&((gPublic_Flag&ACCOFF_OK_F_1)==0)
			&&(gCycle_Send_Status!=WATCH_DATA)
			&&(gCycle_Send_Status!=ALARM_DATA) )
		{
			gPublic_Flag|=ACC_OFF_UP_F_1;
			ACC_OFF_Timer=0;
			Circle_Data_TCP(VEHICLE_RUNDATA_UP,0);
			gInternal_Flag|=SEND_CIRCLE_F_1;
			Send_COM1_String( (unsigned char *)OFF_ACC,sizeof(OFF_ACC) );
 			Judge_SMS_Way();
		}
		//2,ACC持续关闭时间达到满足改变上传行车轨迹的时间间隔
		else if(  (ACC_OFF_Timer<ACC_LASTOFF_TIME)
		        &&(ACC_OFF_Timer>=ACC_CHANGEOFF_TIME)
				&&(gPublic_Flag&ACC_OFF_UP_F_1 )
				&&((gPublic_Flag&ACCOFF_TRACK_F_1)==0)
				&&((gPublic_Flag&ACCOFF_OK_F_1)==0)
				&&(gCycle_Send_Status!=WATCH_DATA)
				&&(gCycle_Send_Status!=ALARM_DATA) 	)
		{
			if(	  (gCycle_TCP<ACCOFF_TRACK_TIME)
				&&(gCycle_TCP>0) )
			{
				gCycle_TCP=ACCOFF_TRACK_TIME;
			}
			gPublic_Flag|=ACCOFF_TRACK_F_1;
		}

		//3,持续规定的一段时间后,则需要关闭模块电源
		else if(   (ACC_OFF_Timer>ACC_LASTOFF_TIME)
			&&(gPublic_Flag&ACC_OFF_UP_F_1)
			&&(gPublic_Flag&ACCOFF_TRACK_F_1 )
			&&((gPublic_Flag&ACCOFF_OK_F_1)==0)
			&&(gCycle_Send_Status!=WATCH_DATA)
			&&(gCycle_Send_Status!=ALARM_DATA)  )
		{
			P6OUT|=POWER_ON_OFF;
			gPublic_Flag|=ACCOFF_OK_F_1;
			gReset_M22_On_Setp=0;
			gGeneral_Flag&=~RESET_GSM_ON_F_1;
			gM22_Status=GSM_WORK;
			gGeneral_Flag&=~LAND_TCP_SUCCESS_F_1;
			gGSM_Oper_Type=GSM_PHONE;
			gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
			gPhone_Step=0;gTimer_GSM_AT=0;
		}

		//3,关闭模块电源
		else if( gPublic_Flag&ACCOFF_OK_F_1 )
		{
			P6OUT|=POWER_ON_OFF;
			gGeneral_Flag&=~OFF_M22_F_1;
			gGeneral_Flag&=~OFF_GPS_F_1;
			gM22_GSM_ECHO_Timer=0;
			gFF0D_Receive_Timer=0;
			gGPS_No_Output_Timer=0;
			gGPS_Invaild_Timer=0;
			gGeneral_Flag&=~RESET_GSM_ON_F_1;
		}
	}
	/********************************************************\
	A8;判断是否可以执行制动或者解除制动操作,制动方面的信息不存储在Flash中
	\********************************************************/
	//1,是否允许执行制动操作
	/*
	if( (gM22_Stop_Status==ALLOW_SET_STOP)&&(gSTOP_Speed_Count>=5) )
	{
		gM22_Stop_Status=ASK_SET_STOP;
		P6OUT|=STOP_Q1;
		P6OUT|=STOP_Q2;

		P6OUT|=STOP_Q1;
		P6OUT|=STOP_Q2;
		gOK_Count=0;gError_Count=0;
	}
	//2,是否允许执行解除制动操作
	else if(gM22_Stop_Status==ALLOW_FREE_STOP)
	{
		gM22_Stop_Status=ASK_FREE_STOP;
		P6OUT&=~STOP_Q1;
		P6OUT&=~STOP_Q2;

		P6OUT&=~STOP_Q1;
		P6OUT&=~STOP_Q2;
		gOK_Count=0;gError_Count=0;
	}
	*/
	/********************************************************\
	A9;	制动结果的检测和判断
	\********************************************************/
	if(gCheck_Stop_Timer>500)
	{
		gCheck_Stop_Timer=0;
		/*
		if(   (gM22_Stop_Status==ASK_SET_STOP)		//执行制动动作的状态下
			||(gM22_Stop_Status==STOP_STATUS) )		//已经制动的状态下
		{
			if(P2IN&CHECK_ON_OFF)	gOK_Count++;
			else					gError_Count++;

			if( (gOK_Count+gError_Count)>60)
			{
				if(gOK_Count>45)
				{
					gStatus1_Flag|=STOP_SUCCESS_F_1;
					gM22_Stop_Status=STOP_STATUS;
				}
				else
				{
					gStatus1_Flag&=~STOP_SUCCESS_F_1;
					gM22_Stop_Status=NOP_READY;
				}
				gOK_Count=0;gError_Count=0;
			}
		}
		else if(   (gM22_Stop_Status==ASK_FREE_STOP)	//执行解除制动动作的状态下
				 ||(gM22_Stop_Status==NOP_READY) )		//已经确定解除制动的状态下
		{
			if( (P2IN&CHECK_ON_OFF)==0 )	gOK_Count++;
			else							gError_Count++;

			if( (gOK_Count+gError_Count)>60)
			{
				if(gOK_Count>45)
				{
					gStatus1_Flag&=~STOP_SUCCESS_F_1;
					gM22_Stop_Status=NOP_READY;
				}
				else
				{
					gStatus1_Flag|=STOP_SUCCESS_F_1;
					gM22_Stop_Status=STOP_STATUS;
				}
				gOK_Count=0;gError_Count=0;
			}
		}
		*/
	}
	/********************************************************\
	A12;判断周期数据发送的状态(这里是处理如果有行车轨迹,后来又有了类似报警,后来报警解除后的行车轨迹的继续上传的操作)
	\********************************************************/
	if( (gGeneral_Flag&TCP_IP_VALID_1)&&((gON_OFF_Temp0&TCP_LAND_ON_OFF_1)==0) )
	{
		if( (gCycle_TCP>0)&&(gCycle_Send_Status==NOP_DATA) )
		{
			gCycle_Send_Status=TRACK_DATA_TIME;gCircle_Timer=0;
			gInternal_Flag&=~SEND_CIRCLE_F_1;gGSM_Work_Count=0;gCheck_Data=0;
		}
		else if(    (gCycle_Distance>0)
				  &&(gCycle_Send_Status==NOP_DATA) )
		{
			gCycle_Send_Status=TRACK_DATA_DISTANCE;gCircle_Timer=0;
			gInternal_Flag&=~SEND_CIRCLE_F_1;gGSM_Work_Count=0;gCheck_Data=0;
		}
	}
	else
	{
		if(   (gCycle_GSM>0)
			&&(gCycle_Send_Status==NOP_DATA) )
		{
			gCycle_Send_Status=TRACK_DATA_TIME;gCircle_Timer=0;
			gInternal_Flag&=~SEND_CIRCLE_F_1;gGSM_Work_Count=0;gCheck_Data=0;
		}
		else if(   (gCycle_Distance>0)
				 &&(gCycle_Send_Status==NOP_DATA) )
		{
			gCycle_Send_Status=TRACK_DATA_DISTANCE;gCircle_Timer=0;
			gInternal_Flag&=~SEND_CIRCLE_F_1;gGSM_Work_Count=0;gCheck_Data=0;
		}
	}
	/********************************************************\
	A13;在TCP在线的工作方式下,如果检测到有来电(通过管脚电平变化的检测)
	\********************************************************/
	if(gM22_Status==TCP_ONLINE_WORK)
	{
		if(Ring_Test_Step==0)
		{
			if( (P1IN&RING_TEST)==0 )
			{
				Ring_Test_Step=1;
				gRing_Test_Timer=0;
			}
		}
		else if(Ring_Test_Step==1)
		{
			if(P1IN&RING_TEST)
			{
				Ring_Test_Step=0;
				gRing_Test_Timer=0;
			}
			else if(gRing_Test_Timer>RING_TEST_TIME)
			{
				if( (gGeneral_Flag&TCP_PHONE_F_1)==0 )
				{
					if((gGeneral_Flag&RING_F_1)==0)			gHangUp_Timer=0;
					gGeneral_Flag|=TCP_PHONE_F_1;
					gStatus1_Flag|=PHONE_ONLINE_F_1;
					gGeneral_Flag|=RING_F_1;
				}
				Ring_Test_Step=0;gRing_Test_Timer=0;
			}
		}
		else
		{
			Ring_Test_Step=0;
			gRing_Test_Timer=0;
		}
	}
	/********************************************************\
	A14;如果判断接收驾驶员信息未成功,则需要周期向记录仪发送查询驾驶员信息。
		直到设置成功为止
		这里取消GPS主动查询驾驶员信息的程序操作
	\********************************************************/
	/*
	//1,判断是否需要查询记录仪的驾驶员信息数据
	if(   (gGet_Driver_Info_Count>GET_DRIVER_INFO_TIME)
		&&(gDriver_Info==READY_READ_DRIVER_INFO)
		&&(gStatus==NORMAL_TYPE)   )
	{
    	Send_COM1_Byte(gStatus);
    	Check_Record = gStatus;
    	Send_COM1_Byte(0xAA);
    	Check_Record ^= 0xAA;
    	Send_COM1_Byte(0x75);
    	Check_Record ^= 0x75;
    	Send_COM1_Byte(K_GET_DRIVEDATA_E_ECHO);
    	Check_Record ^= K_GET_DRIVEDATA_E_ECHO;
    	Send_COM1_Byte(0x00);
    	Check_Record ^= 0;
    	Send_COM1_Byte(0x00);
    	Check_Record ^= 0;
    	Send_COM1_Byte(0x00);
    	Check_Record ^= 0;
    	Send_COM1_Byte(Check_Record);					//校验核
    	Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);		//包尾
    	gGet_Driver_Info_Count=0;
    	gDriver_Info=WAIT_RETURN_DRIVER_INFO;

	}
	//2,等待查询记录仪的驾驶员信息返回失败,则需要从新开始计算时间等下一个周期的查询
	else if(  (gDriver_Info==WAIT_RETURN_DRIVER_INFO)
			&&(gGet_Driver_Info_Count>WAIT_RETURNINFO_TIME) )
	{
		gGet_Driver_Info_Count=0;
		gDriver_Info=READY_READ_DRIVER_INFO;
	}
	*/
	//3,判断是否满足需要想显示终端发送驾驶员信息的数据条件
	/*
	if(   (gGet_Driver_Info_Count>READY_SENDINFO_TIME)
			 &&(gDriver_Info==GET_DRIVER_INFO)
			 &&(gInternal_Flag&DISP_ON_F_1)     )
	{
		//发送记录仪的驾驶员当前信息给显示屏
		if(gDisp_Buffer_Point+37<=sizeof(gDisp_Buffer))
		{
			gDisp_Buffer[gDisp_Buffer_Point]=37;
			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]=35;
			gDisp_Buffer_Point++;
			gDisp_Buffer[gDisp_Buffer_Point]=DISP_MAIN_IC_INFO_DOWN;
			gDisp_Buffer_Point++;
			SRAM_Init();
			for(i=0;i<29;i++)
			{
 				gDisp_Buffer[gDisp_Buffer_Point]=SRAM_Read(SRAM_DRIVER_INFO_CODE+i);
				gDisp_Buffer_Point++;
			}
			gDisp_Buffer[gDisp_Buffer_Point]='$';
			gDisp_Buffer_Point++;
			gDisp_Buffer[gDisp_Buffer_Point]='&';
			gDisp_Buffer_Point++;
			gGet_Driver_Info_Count=0;
			gDriver_Info=WAIT_SEND_DRIVER_INFO;
		}
	}
	//4,如果等待显示屏幕接收到驾驶员信息超时间无响应,则应该重新发送
	else if(   (gGet_Driver_Info_Count>WAIT_DISPINFO_TIME)
			 &&(gDriver_Info==WAIT_SEND_DRIVER_INFO)	 )
	{
		gGet_Driver_Info_Count=0;
		gDriver_Info=GET_DRIVER_INFO;
	}
	*/
	/********************************************************\
	A15,判断接收记录仪是否长时间没有向主控发送数据
	\********************************************************/
	if( gRecord_Data_Timer > OVER_RECORD_DATA_TIME )
	{
		//超时,如果记录仪显示为正常状态,则认为记录仪故障
		if( (gStatus2_Flag&RECORD_VAILD_F_1)==0 )
		{
			gStatus2_Flag|=RECORD_VAILD_F_1;
			gRecord_Status=0;
		}
	}
	/********************************************************\
	A16,每间隔12个小时,需要重新启动程序一次
		这部分的功能已经转移到中断中去执行
	\********************************************************/
	/********************************************************\
	A17;如果需要向记录仪发送设置间隔距离的是否成功,如果成功收到记录仪
	的响应,则不需要进行此操作,如果超过5秒仍然未收到响应,则间隔发送设置命令
	连续发送5次,如果仍然无响应,则停止发送
	\********************************************************/
	if(   ((gPublic_Flag&SET_DISTANCE_OK_F_1)==0)
		&&(gSet_Distance_Info_Count>WAIT_DISPINFO_TIME)
		&&(gStatus==NORMAL_TYPE)
		&&(gSend_Record_Count<5) )
	{
		gSend_Record_Count++;
    	Send_COM1_Byte(gStatus);
    	Check_Record = gStatus;
    	Send_COM1_Byte(0xAA);
    	Check_Record ^= 0xAA;
    	Send_COM1_Byte(0x75);
    	Check_Record ^= 0x75;
    	Send_COM1_Byte(K_SET_INTERDISTANCE);
    	Check_Record ^= K_SET_INTERDISTANCE;
    	Send_COM1_Byte(0x00);
    	Check_Record ^= 0;
    	Send_COM1_Byte(0x02);							//长度
    	Check_Record ^= 0x02;
    	Send_COM1_Byte(0x00);							//预留
    	Check_Record ^= 0;
    	Send_COM1_Byte(gCycle_Distance/0x100);			//距离值的高位字节
    	Check_Record ^= gCycle_Distance/0x100;
    	Send_COM1_Byte(gCycle_Distance%0x100);			//距离值的低位字节
    	Check_Record ^= gCycle_Distance%0x100;
    	Send_COM1_Byte(Check_Record);					//校验核
    	Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);		//包尾
    	gSet_Distance_Info_Count=0;
	}
	/********************************************************\
	A18;判断是否向显示屏发送显示屏上行信息的响应,
	\********************************************************/
	if(gPublic_Flag&DISP_SEND_INFO_F_1)
	{
		i=SRAM_Read(OTHER_SMS_2);
		if(i==VAILD_2);
		else
		{
			gPublic_Flag &= ~DISP_SEND_INFO_F_1;
			if(gDisp_Buffer_Point+7+2<=sizeof(gDisp_Buffer))
			{
				gDisp_Buffer[gDisp_Buffer_Point]=7+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]=7;
				gDisp_Buffer_Point++;
				gDisp_Buffer[gDisp_Buffer_Point]=DISP_MAIN_INFO_ECHO_DOWN;
				gDisp_Buffer_Point++;
				gDisp_Buffer[gDisp_Buffer_Point]=COMMAND_OK;
				gDisp_Buffer_Point++;
				gDisp_Buffer[gDisp_Buffer_Point]='$';
				gDisp_Buffer_Point++;
				gDisp_Buffer[gDisp_Buffer_Point]='&';
				gDisp_Buffer_Point++;
			}
		}
	}
	/********************************************************\
	B1;关于判断ACC检测和车载的空载/重载方面的程序检测

	补充说明:
	1, Test_Status_Step=0的时候检测ACC的检测线的状态,分为两种情况,如果此时ACC检测线处于开启状态标志或者关闭状态的标志,
		则需要检测ACC检测线的实际状态量是否发生变化,如果没有,则直接设置Test_Status_Step=2,如果有则设置Test_Status_Step=1。
	2,Test_Status_Step=1的时候,则说明检测到ACC的检测线实际状态量有变化,则在这个步骤中检测状态量的变化是否持续符合条件的时间
		如果检测符合时间条件,则改变ACC的状态量标志,设置Test_Status_Step=0;
	3,Test_Status_Step=2的时候,则说明ACC的检测无变化,则进行车载的空载/重载线的状态检测,如果分为两种情况如果此时检测空载/重载是处于空或者
		重,则需要检测空载/重载线的实际状态量是否改变,如过检测到有改变则设置Test_Status_Step=3.否则设置Test_Status_Step=0
	4,Test_Status_Step=3的时候,则说明空载/重载线检测到有所变化,则在这个步骤中检测状态量的变化持续时间是否符合要求,如果符合要求
		则改变空载/重载线的状态量的标志。同时设置Test_Status_Step=0
	\********************************************************/
	if(Test_Status_Step==0)
	{
		//1,如果ACC检测线开启标志的状态下,检测是否ACC检测线关闭
		if(gStatus1_Flag&ACC_ON_F_1)
		{
			if(P3IN&ACC_TEST)
			{
				gTest_Status_Timer=0;
				Test_Status_Step=1;
			}
		}
		//2,如果已经存在ACC线关闭标志的状态下,检测是否ACC检测线开启
		else
		{
			if( (P3IN&ACC_TEST)==0)
			{
				gTest_Status_Timer=0;
				Test_Status_Step=2;
			}
		}
	}
	else if(Test_Status_Step==1)
	{
		if( (P3IN&ACC_TEST)==0 )
		{
			gTest_Status_Timer=0;

⌨️ 快捷键说明

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