📄 alarm.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 + -