📄 do_other.c
字号:
/********************************************************\
* 文件名: 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 + -