📄 do_other.c
字号:
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 + -