📄 semiuart.c
字号:
#define SEMIUART_GLOBAL 1
#include "includes.h"
#define MAX_ROUND_BUF 10
TIMER *semisend_timer;
TIMER *semireset_timer;
TIMER *Semirst_Timer;
uchar Round_Buf[MAX_ROUND_BUF];
void Init_Common(void)
{
uchar i;
Step_Send = 0;
semiuart.sendstatus = _IDLE;
semiuart.recvstatus = _IDLE;
semiuart.sendlen = 0;
semiuart.recvlen = 0;
semiuart.head = 0;
semiuart.tail = 0;
for(i=0; i<MAX_SEMI_BUF; i++)
{
semiuart.sendbuf[i] = 0;
semiuart.recvbuf[i] = 0;
}
for(i=0; i<MAX_ROUND_BUF; i++)
{
Round_Buf[i] = 0;
}
StartTa2();
Enable_Int1();
send_semi_type = 0;
}
void rst_semiuart_proc(void)
{
ALARM_POWER = VOL_HIGH;
Init_Common();
Start_Timer(semisend_timer,5,HMSEL);
}
void Init_Semiuart(void)
{
Init_Common();
Recv_Status.defend = save.basevalue.mode.bit.defend;
Recv_Status.doorstatus = 0;
Recv_Status.alarm = 0;
Recv_Status.shake = 0;
Recv_Status.guard = 0;
semiuart.fail_time = 0;
Recv_Status.privat = save.basevalue.mode.bit.private;
semisend_timer = Create_Timer(Sendsemiproc);
semireset_timer = Create_Timer(Resetsemi_Proc);
Semirst_Timer = Create_Timer(rst_semiuart_proc);
Start_Timer(semisend_timer,2,SECOND);
}
void Reset_Semiuart(void)
{
Stop_Timer(Semirst_Timer);
StopTa3();
StopTa2();
Disable_Int1();
Stop_Timer(semisend_timer);
ALARM_POWER = VOL_LOW;
Start_Timer(Semirst_Timer,2,SECOND);
}
void Resetsemi_Proc(void)
{
Start_Timer(semireset_timer,60,MINUTE);
Reset_Semiuart();
}
uchar Assemble_Data(void)
{
uchar senddata;
senddata = 0;
if(port[_ACC].status)
{
Set_Char_Bit(&senddata,3);
}
if(port[_ENGINE].status)
{
Set_Char_Bit(&senddata,4);
}
if(port[_BAKUP].status)
{
Set_Char_Bit(&senddata,5);
}
if(shut_down_led)
{
Set_Char_Bit(&senddata,6);
}
return senddata;
}
void Deal_Fail(void)
{
semiuart.sendstatus = _IDLE;
semiuart.recvstatus = _IDLE;
#ifdef DEBUG_SEMIUART
//Uart1Send("semiuart Fail");
#endif
if(send_semi_type!=0) //send fail //
{
if(send_semi_type&CENTER_RELEASE || send_semi_type&CENTER_DEFEND)
{
if(gsmstatus.gprsdata == TRUE) //added by leon 050915
Send_Gprs_Ack(0x0245,0x0);
else
Send_Sms_Ack(0x0245,0x0);
}
/* if(send_semi_type&CENTER_DEFEND)
{
if(gsmstatus.gprsdata == TRUE) //added by leon 050915
Send_Gprs_Ack(0x0245,0x0)
else
Send_Sms_Ack(0x0245,0x0);
} */
}
if(semiuart.fail_time!=0xff)semiuart.fail_time++;
if(semiuart.fail_time>=3&&semiuart.fail_time<=9)
{
if(semiuart.fail_time%3==0)
{
Reset_Semiuart();
}
}
if(semiuart.fail_time==12)
{
#ifdef DEBUG_SEMIUART
//Uart1Send("semiuart err");
#endif
Start_Timer(semireset_timer,60,MINUTE);
Set_Word_Bit(&alarm_flag,_REMOTEERR_ALM);
Deal_Alarm();
//Send_Taskmsg(AlarmTaskid,SEMIUARTERR,NULL);
}
}
void Write_To_Send(uchar con)
{
Round_Buf[semiuart.head++] = con;
if(semiuart.head>=MAX_ROUND_BUF) semiuart.head = 0;
}
void Sendsemiproc(void) //发送定时器函数//
{
uchar buf[2];
uchar temp;
Start_Timer(semisend_timer,5,HMSEL);
if(semiuart.sendstatus!=_IDLE||semiuart.recvstatus!=_IDLE)
{
#ifdef DEBUG_SEMIUART
//Uart1Send("semiuart fail");
#endif
Deal_Fail();
}
if(semiuart.head==semiuart.tail)
{
temp = 0;
}
else
{
temp = Round_Buf[semiuart.tail++];
if(semiuart.tail>=MAX_ROUND_BUF)
{
semiuart.tail = 0;
}
}
send_semi_type = temp;
buf[0] = temp|Assemble_Data();
buf[1] = temp|Assemble_Data();
SendSemidata(buf,2);
}
uchar SendSemidata(uchar *ptr,uchar len)
{
uchar i;
if(semiuart.sendstatus!=_IDLE||semiuart.recvstatus!=_IDLE) return SEND_FAIL;
semiuart.recvstatus = _BUSY;
semiuart.recvlen = 0;
for(i=0; i<len; i++)
{
semiuart.sendbuf[len-1-i] = ptr[i];
}
#ifdef DEBUG_SEMIUART
//Uart1Send("semiuart send");
//Uart1Word(ptr[0]);
//Uart1Word(ptr[1]);
//Uart1Word(len);
#endif
semiuart.sendlen = len;
semiuart.sendstatus = _BUSY;
return SEND_SUCCESS;
}
void RecvSemidata(void)
{
uchar flag1,flag0;
uchar flag = 0;
static uchar door_count = 0;
static uchar guard_count = 0;
#ifdef DEBUG_SEMIUART
Uart1Send("semiuart recv");
#endif
if(semiuart.recvlen==2) //接收到两个字节//
{
flag0 = semiuart.recvbuf[0];
flag1 = semiuart.recvbuf[1];
semiuart.recvlen = 0;
semiuart.recvstatus = _IDLE;
if(Get_Char_Bit(&flag0,0)&&Get_Char_Bit(&flag1,0)&&((flag0&0xbf)==(flag1&0xbf)))
{
if(Get_Char_Bit(&flag0,7))
{
if(send_semi_type!=0)
{
if(send_semi_type&CENTER_RELEASE || send_semi_type&CENTER_DEFEND)
{
if(gsmstatus.gprsdata == TRUE) //added by leon 050915
Send_Gprs_Ack(0x0245,0x1);
else
Send_Sms_Ack(0x0245,0x1);
}
/* if(send_semi_type&CENTER_DEFEND)
{
Send_Sms_Ack(0x0245,0x1);
} */
}
semiuart.fail_time = 0;
Stop_Timer(semireset_timer);
if(Recv_Status.defend!=Get_Char_Bit(&flag0,1))
{
flag |= 0x01;
Recv_Status.defend = Get_Char_Bit(&flag0,1);
if(Recv_Status.defend==0)
{
flag |= 0x02;
}
}
if(Recv_Status.doorstatus!=Get_Char_Bit(&flag0,2)) //车门状态
{
if(door_count!=0xff)door_count++;
if(door_count>=2)
{
Recv_Status.doorstatus = Get_Char_Bit(&flag0,2);
}
}
else
{
door_count = 0;
}
if(Recv_Status.alarm!=Get_Char_Bit(&flag0,3)) //遥控报警//
{
Recv_Status.alarm = Get_Char_Bit(&flag0,3);
if(Recv_Status.alarm==1) //报警//
{
#ifdef DEBUG_SEMIUART
Uart1Send("semiuart alarm");
#endif
flag |=0x02;
Set_Word_Bit(&alarm_flag,_REMOTE_ALM);
}
}
Recv_Status.shake = Get_Char_Bit(&flag0,4); //刹车检测//
if(Recv_Status.guard!=Get_Char_Bit(&flag0,5)) //盗警//
{
if(guard_count!=0xff)guard_count++;
if(guard_count>=2)
{
flag |=0x02;
Recv_Status.guard = Get_Char_Bit(&flag0,5);
if(Recv_Status.guard==1)
{
Set_Word_Bit(&alarm_flag,_GUAD_ALM );
}
}
}
else
{
guard_count = 0;
}
if((!Get_Char_Bit(&flag0,6))&&Get_Char_Bit(&flag1,6))
{
Recv_Status.privat = 0;
//flag |= 0x01;
if(save.basevalue.mode.bit.private != Recv_Status.privat)
{
save.basevalue.mode.bit.private = 0;
Para_Crc(PARA_BASE_VALUE);
Store_Paras();
}
}
if(Get_Char_Bit(&flag0,6)&&!Get_Char_Bit(&flag1,6))
{
Recv_Status.privat = 1;
//flag |= 0x01;
if(save.basevalue.mode.bit.private!= Recv_Status.privat)
{
save.basevalue.mode.bit.private = 1;
Para_Crc(PARA_BASE_VALUE);
Store_Paras();
}
}
if(flag&0x01)
{
save.basevalue.mode.bit.defend = Recv_Status.defend;
Para_Crc(PARA_BASE_VALUE);
Store_Paras();
}
if(flag&0x02)
{
Deal_Alarm();
}
}
else{
Deal_Fail();}
}
else //错误数据//
{
Deal_Fail();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -