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

📄 alarm.c

📁 名厂车载GPS通信终端
💻 C
字号:
#define ALARM_GLOBAL              1

#include "includes.h"


#pragma ROM ALARMTASKPROC[]
const ENTRY_PROC far ALARMTASKPROC[] ={ 
	{SEMIUARTRECV ,RecvSemidata},
	{GPSUARTRECV  ,Recv_Gps},
	{STATUSCHANGE ,Deal_Alarm},
	{SEMIUARTERR ,Deal_Alarm},
	{SEMIUARTALM ,Deal_Alarm}
};
//uchar send_alarm_status;
TIMER *Alarm_Timer;
TIMER *Sleep_Timer;
void Init_Alarm(void)
{
	uchar i;
	
	Init_Semiuart();
	Init_Gps();
	Init_Port();
	
	alarm_flag           = 0;
	Alarm_Timer          = Create_Timer(Send_Alarm_Proc);
	Sleep_Timer          = Create_Timer(Deal_Sleep);
	Start_Timer(Sleep_Timer,20,SECOND);
}

uchar Alarm_Juge(void)
{
	if(!save.basevalue.mode.bit.defend)
	{
		Clr_Word_Bit(&alarm_flag,_GUAD_ALM);
		Clr_Word_Bit(&alarm_flag,_BAK_ALM);
		Clr_Word_Bit(&alarm_flag,_ENGINE_ALM);
		Clr_Word_Bit(&alarm_flag,_BROKE_ALM);
		Clr_Word_Bit(&alarm_flag,_DRAG_ALM);
	}
	
	if(!(IsGpsWireOpen()||IsGpsWireClose()||IsGpsLongInvalid()))
	{
		Clr_Word_Bit(&alarm_flag,_GPSEER_ALM);
	}
	if(alarm_flag==0) 
	{
		Stop_Timer(Alarm_Timer);
		return FALSE;
	}
	else return TRUE;
}

uchar Get_One_Interval(uchar type)
{
	uchar temp;
	switch(type)
	{
	case 0:
		temp = save.alarmtime.rop;
		break;
	case 1:
		temp = save.alarmtime.burgle;
		break;
	case 2:
		temp = save.alarmtime.overarea;
		break;
	case 3:
		temp = save.alarmtime.overarea;
		break;
	case 4:
		temp = save.alarmtime.overspeed;
		break;
	case 5:
		break;
	case 6:
		temp = save.alarmtime.accerr;
		break;
	case 7:
		temp = save.alarmtime.voltage;
		break;
	case 8:
		temp = save.alarmtime.gpserr;
		break;
	case 9:
		temp = save.alarmtime.remoteerr;
		break;
	case 10:
		temp = save.alarmtime.remotealarm;
		break;
	case 11:
		temp = save.alarmtime.burgle;
		break;
	case 12:
		temp = save.alarmtime.burgle;
		break;
	case 13:
		temp = save.alarmtime.burgle;
		break;
	case 14:
		temp = save.alarmtime.powererr;
		break;
	case 15:
		temp = save.alarmtime.drag;
		break;
	}
	return temp;
}

uchar Get_Alarm_Interval(void)
{
	uchar len;
	uchar i;
	uchar interval; //时间间隔//
	
	interval = 0xff;
	
	for(i=0; i<15; i++)
	{
		if(i!=5)
		{
			if(Get_Word_Bit(&alarm_flag,i)){
				len = Get_One_Interval(i);
				if(interval>len)interval =len;
			}
		} 
	}
	return interval;
}

void Send_Alarm_Proc(void)
{
	uchar len;
	if(!(IsGpsWireOpen()||IsGpsWireClose()||IsGpsLongInvalid()))
	{
		Clr_Word_Bit(&alarm_flag,_GPSEER_ALM);
	}
	if(alarm_flag==0) 
	{
		Stop_Timer(Alarm_Timer);
		return;
	}
	len = Get_Alarm_Interval();
	if(len<10){len = 10;}
	
	Start_Timer(Alarm_Timer,len,SECOND);
	
	if(Need_Hangup())
	{
		if(at_atding==1)
		{
			if(!((AutoDial.state==_BUSY)&&(AutoDial.attrib==0x00)))                 // for 0x4561 command;
				Hangup();
		}
	}
	Send_Alarm_Data();
}

void Deal_Alarm(void)
{
	uchar len;
	if(save.basevalue.need_service==1)
	{
		return;
	}
	if(Alarm_Juge())
	{
		len = Get_Alarm_Interval();
		if(len<10){len = 10;}
		Restart_Timer(Alarm_Timer,len,SECOND);
		Send_Alarm_Proc();
	}
}

void Deal_Sleep(void)
{
	Start_Timer(Sleep_Timer,1,SECOND);
	if(save.basevalue.need_service==1)
	{
		Stop_Timer(Alarm_Timer);
		alarm_flag = 0;
	}
	if(port[_ACC].status==1||alarm_flag!=0)
	{
#ifdef DEBUG_SLEEP
		//uart1send("need wake gps");//
#endif 
		Wake_Gps();
	}
	else
	{
#ifdef DEBUG_SLEEP
		//uart1send("need sleep gps");//
#endif 
		Sleep_Gps();
	}
	if(port[_ACC].status)
	{
#ifdef DEBUG_SLEEP
		//uart1send("need wake handset");//
#endif
		Wake_Handset();
	}
	else
	{
#ifdef DEBUG_SLEEP
		//uart1send("need sleep handset");//
#endif
		if(gsmstatus.tel!=_TEL_IDLE)
		{
			Wake_Handset();
		}
		else
		{
			Sleep_Handset();
		}
	}
	if(!save.basevalue.mode.bit.consume)
	{
		if(port[_ACC].status==1||alarm_flag!=0)
		{
			Wake_Up_Gprs();
#ifdef DEBUG_SLEEP
			//uart1send("need wake gprs");//
#endif
		}
		else
		{
#ifdef DEBUG_SLEEP
			//uart1send("need sleep gps");//
#endif
			Sleep_Gprs();
		}
	}
	else
	{
		Wake_Up_Gprs();
	}
}

uchar Need_Hangup(void)
{
	if(alarm_flag&0xfe53)
	{
		return TRUE;
	}
	if(alarm_flag&0x0100)
	{
		if(IsGpsWireOpen())
		{
			return TRUE;
		}
		if(IsGpsWireClose())
		{
			return TRUE;
		}
	}
	return FALSE ;
}

void alarm_remove(uchar alarmtype)                 //解除报警//
{
	Clr_Word_Bit(&alarm_flag,alarmtype);
	if(alarm_flag==0)
	{
		Stop_Timer(Alarm_Timer);
	}
}

void AlarmTaskEntry(void)
{
	Find_Proc(ALARMTASKPROC,Current_Tskmsg->msgid,sizeof(ALARMTASKPROC)/sizeof(ENTRY_PROC));
}

⌨️ 快捷键说明

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