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

📄 semiuart.c

📁 名厂车载GPS通信终端
💻 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 + -