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

📄 do_other.c

📁 车载GPS监控终端的完整代码,与监控中心的通讯采用GPRS.
💻 C
📖 第 1 页 / 共 5 页
字号:
/********************************************************\
*	文件名:  Do_Other.C
*	创建时间:2004年12月7日
*	创建人:  
*	版本号:  1.00
*	功能:	  针对一些其他外部操作,比如报警检测等等
*	文件属性:公共文件
*	修改历史:(每条详述)
\********************************************************/
#include <msp430x14x.h>
#include <math.h>
#include <stdlib.h>
#include "Define_Bit.h"
#include "Other_Define.h"
#include "General.h"
#include "Uart01.h"
#include "W_Protocol.h"
#include "D_Buffer.h"
#include "SPI45DB041.h"
#include "Sub_C.h"

#include "TA_Uart.h"
#include "M22_AT.h"
#include "Do_Other.h"
#include "Do_Handle.h"
#include "Handle_Protocol.h"
#include "Disp_Protocol.h"
#include "Do_SRAM.h"
#include "Record_Protocol.h"
#include "Do_M22.h"
/*
#include "Main_Init.h"
#include "Check_GSM.h"
#include "Do_Reset.h"
#include "Do_GPS.h"
#include "Do_Disp.h"
*/
//#define Debug_GSM_COM1
unsigned int Circle_Data_GSM( unsigned char nCount,unsigned char nCommand,unsigned char nACK,unsigned int iCheckOutTemp );
unsigned int Circle_Data_GSM_Sub(unsigned int iCheckOutTemp);
unsigned int Dichotomy_PassData_First(unsigned int iFirst_Page,unsigned int iEnd_Page);

unsigned long int Max_Result(unsigned long int x,unsigned long int y);
unsigned long int Min_Result(unsigned long int x,unsigned long int y);
unsigned char Check_Area_Alarm(unsigned char Num);
unsigned char Account_Mid_Dot(double x1,double y1,double x2,double y2);
unsigned char  Check_Line_Data(unsigned char S_Num_ID);

//unsigned int ADC_NORMAIL_VCC[2]={ 0x0850,0x0EF0 };
//unsigned int ADC_STOP_VCC[2]={ 0x01F0,0x02EF };
/********************************************************\
补充说明:ADC_NORMAIL_VCC[2]根据实际的电路(分压电阻的不同)在正常状态下检测ADC转换的数值的范围
		  ADC_STOP_VCC[2]根据实际电路,已经执行了制动后,检测ADC转换的数值的范围
\********************************************************/
void GSM_WORK_Data(void);
void TCP_WORK_Data(unsigned int Timer,unsigned char nCommand);
/********************************************************\
*	函数名:Do_Other_Module
	作用域:外部文件调用
*	功能:
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Do_Other_Module(void)
{
	static unsigned char Test_Alarm_Step=0;
	static unsigned char Ring_Test_Step=0;
	static unsigned char Test_Status_Step=0;
	unsigned int i=0,j=0,k=0,h=0;
	unsigned long int x=0,y=0;
	unsigned char Check_Result=0;
	unsigned char Area_All=0;
	unsigned char Check_Record=0;
	unsigned char Area_Out_Num=0;
	double Distance_Temp=0;
	unsigned long int Dis_Data=0;

	//每间隔30分钟验证存储在buffer1中的参数是否有效
	if(gCheck_Par_Timer>CHECK_SYS_PAR_TIME)
	{
		gCheck_Par_Timer=0;
		k=Check_ParNum();
		if( (k==0)||(k==1) )
		{
			i=Check_Vaild(GPRS_IP_ADDRESS1_2,GPRS_IP_ADDRESS1_CHECK_2);
			j=Check_Port();
			h=Check_Vaild(GPRS_APN_ADDRESS2_2,GPRS_APN_END_2);
			if( (i==1)||(j==1)||(h==1))
			{
				//事先得先保存短消息中心号码,防止操作擦除掉目标号码
				gGeneral_Buffer[CENTER_NUM_2]=SRAM_Read(CENTER_NUM_2);
				for(i=CENTER_NUM_2+1;i<=CENTER_NUM_CHECK_2;i++)
				{
					gGeneral_Buffer[i]=SRAM_Read(i);
				}
				OperateSPIEnd();
				Load_Flash_Par_Buffer1();
			}
		}
		if(gInternal_Flag&SET_CSCA_F_1)	gTimer_CSQ=GSM_CHECKCSQ_TIME-2;
	}
	if(gCommon_Flag&ALLOW_HANGUP_PHONE_F_1)
	{
		gCommon_Flag&=~ALLOW_HANGUP_PHONE_F_1;
		SRAM_Init();
		SRAM_Write(PHONE_AT_2+0,VAILD_2);
		SRAM_Write(PHONE_AT_2+1,H_HUNGUP);
		SRAM_Write(PHONE_AT_2+2,0);
		Send_COM3_Load(4,MAIN_HANG_UP,0);
		gSys_Handle=MAIN_HANG_UP;
	}
	/********************************************************\
	A0;增加处理在来电或者拨出状态下的超时处理
	\********************************************************/
	if(gHangUp_Timer>HANGUP_COUNT)
	{
		if(	(gGeneral_Flag&RING_F_1)||(gGeneral_Flag&DAILING_UP_F_1)||(gGeneral_Flag&MONITOR_ON_F_1) )
		{
			gHangUp_Timer=0;
			SRAM_Init();
			SRAM_Write(PHONE_AT_2+0,VAILD_2);
			SRAM_Write(PHONE_AT_2+1,H_HUNGUP);
			SRAM_Write(PHONE_AT_2+2,0);
			Send_COM3_Load(4,MAIN_HANG_UP,0);
			gSys_Handle=MAIN_HANG_UP;
		}
	}
	/********************************************************\
	A1;如果未接收到登陆响应,则进行再次发送登陆命令
	\********************************************************/
	if(   (gLand_Interval_Timer>M22_LAND_TIME)
		&&((gGeneral_Flag&LAND_TCP_SUCCESS_F_1)==0)	)
	{
		gOther_Flag|=ALLOW_SENDLAND_F_1;
		gLand_Interval_Timer=0;
		gWait_Land_Echo_Count++;
		if(gWait_Land_Echo_Count>10)
		{
			gWait_Land_Echo_Count=0;
			TCP_Land_Error_Return();
		}
	}
	/********************************************************\
	A2;清除相关数据
	\********************************************************/
	if( ((gGeneral_Flag&TCP_PHONE_F_1)==0)&&(gDTMF_SAVE[0]!=0 ) )
	{
		for(i=0;i<sizeof(gDTMF_SAVE);i++)	gDTMF_SAVE[i]=0;
	}
	/********************************************************\
	A2-1;上报数据的状态位,1,无周期数据,2,按时间间隔上报数据
						3,按行使间隔上报数据,4,报警类型数据
	\********************************************************/
	//1,无周期数据
	if(gCycle_Send_Status==NOP_DATA)
	{
		gStatus3_Flag&=~M22_WORK_0_F_1;
		gStatus3_Flag&=~M22_WORK_1_F_1;
	}
	//2,按时间间隔上报数据
	else if(gCycle_Send_Status==TRACK_DATA_TIME)
	{
		gStatus3_Flag|=M22_WORK_0_F_1;
		gStatus3_Flag&=~M22_WORK_1_F_1;
	}
	//3,按行使间隔上报数据
	else if(gCycle_Send_Status==TRACK_DATA_DISTANCE)
	{
		gStatus3_Flag&=~M22_WORK_0_F_1;
		gStatus3_Flag|=M22_WORK_1_F_1;
	}
	//4,报警类型的上报数据
	else if(gCycle_Send_Status==ALARM_DATA)
	{
		gStatus3_Flag|=M22_WORK_0_F_1;
		gStatus3_Flag|=M22_WORK_1_F_1;
	}
	/********************************************************\
	A2-2;进行线路报警的标志
	\********************************************************/
	if(   (gCommon_Flag&ALLOW_LINE_DATA_F_1)
		&&(gCommon_Flag&ALLOW_LINE_DIS_F_1)  )
	{
		gStatus3_Flag|=LINE_LIMIT_F_1;
	}
	else
	{
		gStatus3_Flag&=~LINE_LIMIT_F_1;
		if(gAlarm_Type==OVER_LINE_ALARM)
		{
			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;
		}
	}
	/********************************************************\
	A3;每间隔3秒向显示终端发送一次系统状态(GPS的数据有效果无效,GSM的信号强度,TCP的在线状态,当前速度值)
		已经转移到下面的速度处理部分,以1秒发送一个速度处理,已经放在下一个部分处理
	\********************************************************/
	/********************************************************\
	A3-1;每间隔10秒向手柄发送一个场强信号
	\********************************************************/
	if(gHandle_Single_Count>10)
	{
		if( (gM22_Status==TCP_ONLINE_WORK)&&(gSignal<10) ) 	gSignal=30;
		gHandle_Single_Count=0;
		Send_Handle_Signal(gSignal);
	}
	/********************************************************\
	A4;如果在接收记录仪大量数据的存储区中还有未发送完的数据,则在这里处理
	\********************************************************/
	if(   (gOther_Flag&RECORD_DATA_F_1)
		&&(gSend_RecordData_Timer>=3)
		&&((gOther_Flag&ALLOW_SEND_RECORD_F_1)==0)  )
	{
		gSend_RecordData_Timer=0;
		gOther_Flag|=ALLOW_SEND_RECORD_F_1;
	}
	/********************************************************\
	A4;处理每一秒速度相关的处理
	\********************************************************/
	if(gDo_Speed_Count>=1)
	{
		gDo_Speed_Count=0;
		i=0;
		if( (gPublic_Flag&RECORD_NULL_F_1)==0 )
		{
			gSpeed_Disp=gSpeed_Record;
			gSpeed=(gSpeed_Record/3.6)+0.5;
			i=1;
		}
		else if(  (gPublic_Flag&RECORD_NULL_F_1)
				&&( (gPublic_Flag&GPS_NULL_F_1)==0)	)
		{
			gSpeed_Disp=(gSpeed_Gps*3.6)+0.5;
			gSpeed=gSpeed_Gps;
			i=1;
		}
		if(i==1)
		{
			//1;判断与超速报警相关的处理
			if( (gSpeed>=gMAX_Speed)&&(gSpeed<80)&&(gMAX_Speed>=10) )
			{
				gOver_Speed_Count++;
			}
			else
			{
				gOver_Speed_Count=0;
				if(gAlarm_Type==OVER_SPEED_ALARM)	gInternal_Flag|=STOP_OVERSPEED_F_1;
			}
			//2;判断关于制动方面的处理,在GPS数据有效的状态下,判断速度是否小于某一个值,并且持续5秒
			if( (gSpeed==0)||(gSpeed<=2) )	gSTOP_Speed_Count++;
			else							gSTOP_Speed_Count=0;
		}

		//每秒向显示终端发送数据
		//===================================================
		if(  (gDisp_Buffer_Point+14<=sizeof(gDisp_Buffer))
		   &&((gCommon_Flag&ALLOW_OUT_DISP_F_1)==0)   )
		{
			gDisp_Buffer[gDisp_Buffer_Point]=14;
			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]=12;
			gDisp_Buffer_Point++;
			gDisp_Buffer[gDisp_Buffer_Point]=DISP_MAIN_SYS_STATUS_DOWN;
			gDisp_Buffer_Point++;
			if(gGeneral_Flag&GPS_VALID_F_1)
			{
				gDisp_Buffer[gDisp_Buffer_Point]=0x01;			//GPS有效
			}
			else
			{
				gDisp_Buffer[gDisp_Buffer_Point]=0x00;			//GPS无效
			}
			gDisp_Buffer_Point++;
			gDisp_Buffer[gDisp_Buffer_Point]=gSignal;			//信号强度
			gDisp_Buffer_Point++;
			if(gM22_Status==TCP_ONLINE_WORK)
			{
				gDisp_Buffer[gDisp_Buffer_Point]=1;				//TCP的在线状态
			}
			else
			{
				gDisp_Buffer[gDisp_Buffer_Point]=0;
			}
			gDisp_Buffer_Point++;
			gDisp_Buffer[gDisp_Buffer_Point]=gSpeed_Disp;		//当前速度
			gDisp_Buffer_Point++;
			gDisp_Buffer[gDisp_Buffer_Point]=gDisp_Status;		//预留
			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++;
		}
	}
	/********************************************************\
	A5;	判断是否产生超速度报警的条件和结束超速报警的条件
	\********************************************************/
	if( gOver_Speed_Count>4 )
	{
		gOver_Speed_Count=0;
		if(gAlarm_Type==NOP_ALARM)
		{
			gAlarm_Type = OVER_SPEED_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;
			Judge_SMS_Way();
		}
	}
	else if( (gAlarm_Type==OVER_SPEED_ALARM)&&(gInternal_Flag&STOP_OVERSPEED_F_1) )
	{
		gAlarm_Type=NOP_ALARM;
		gCycle_Send_Status=NOP_DATA;
		gAlarm_Count=0;
		gStatus2_Flag&=~ROB_ALARM_F_1;
		gInternal_Flag&=~STOP_OVERSPEED_F_1;
		gCircle_Timer=0;
		gOver_Speed_Count=0;
		Circle_Data_TCP(VEHICLE_RUNDATA_UP,0);
		gInternal_Flag|=SEND_CIRCLE_F_1;
		Judge_SMS_Way();
	}
	/********************************************************\
	A6;判断是否产生疲劳驾驶报警和结束疲劳驾驶报警的条件
	\********************************************************/
	//A6-1:产生疲劳驾驶报警的条件
	if(	gOver_Tire_Count>4 )
	{
		gOver_Speed_Count=0;
		if(gAlarm_Type==NOP_ALARM)
		{
			gAlarm_Type = OVER_TIRE_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;
			Judge_SMS_Way();
		}
	}
	//A6-2:结束疲劳驾驶报警的条件
	else if	(gStop_Tire_Count>4)
	{
		gStop_Tire_Count=0;
		if(gAlarm_Type==OVER_TIRE_ALARM)
		{
			gAlarm_Type = NOP_ALARM;
			gCycle_Send_Status = NOP_DATA;
			gAlarm_Count=0;
			gCircle_Timer=0;
			gCycle_Alarm=0;
			Circle_Data_TCP(VEHICLE_RUNDATA_UP,0);
			gInternal_Flag|=SEND_CIRCLE_F_1;
 			Judge_SMS_Way();
		}
	}
	/********************************************************\
	A7;如果ACC检测线处于开启的状态,则需要进行开启模块电源的操作
		但如果处于关闭状态,则进行时间统计,如果超过48小时仍然为关闭状态,
		则需要进行关闭两个模块的电源供电,以达到节省用电的目的
	\********************************************************/
	//ACC检测处于开启状态
	if(gStatus1_Flag&ACC_ON_F_1)
	{
		if(   (gPublic_Flag&ACCOFF_TRACK_F_1)
			||(gPublic_Flag&ACCOFF_OK_F_1) )
		{
			if((gCommon_Flag&ALLOW_RESET_MCU_F_1)==0)
			{
				P6OUT&=~POWER_ON_OFF;
				gCommon_Flag|=ALLOW_RESET_MCU_F_1;
				gRload_Flash_Par_Timer=RLAOD_FLASH_TIME-5;
			}
//	    	Send_COM1_String((unsigned char *)POWER_OFF,sizeof(POWER_OFF));
//			gOther_Flag|=RESET_PROGRAME_F_1;
//			while(1);
		}
		else if(gPublic_Flag&ACC_OFF_UP_F_1)
		{
			gPublic_Flag&=~ACC_OFF_UP_F_1;
		}
	}
	//ACC检测处于关闭状态
	else
	{
		//1,先发送一个信息上传
		if(   ((gPublic_Flag&ACC_OFF_UP_F_1)==0)
			&&((gPublic_Flag&ACCOFF_TRACK_F_1)==0)

⌨️ 快捷键说明

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