#include "includes.h"


/*两字节CRC校验
*len包括校验的长度
*/
void NetCRC16_Check(U8_T *aStr ,U16_T len)
{
	U16_T alen = len-2;   //CRC16???????
	U16_T xda , xdapoly ; //校验后的结果，多项式
	U16_T i,j, xdabit ;  //缓存变量
	
	if(len < 3)        //长度小于3
	{
		return ;         //直接返回
	}
	xda = 0xFFFF ;
	xdapoly = 0xA001 ;	// (X**16 + X**15 + X**2 + 1)
	for(i=0;i<alen;i++) 
	{
		xda ^= aStr[i] ;
		for(j=0;j<8;j++) 
		{
			xdabit = (U8_T)(xda & 0x01) ;
			xda >>= 1 ;
			if( xdabit ) xda ^= xdapoly ;
		}
	}    
	aStr[alen] = (U8_T)(xda & 0xFF) ;
	aStr[alen+1] = (U8_T)(xda>>8) ;
}



/** @name CRC16校验得到
*   @para
*      aStr   数组首地址
*      len    数组长度，不包括校验
*/
U16_T GetCRC16( U8_T *aStr , U16_T len)
{
    U16_T xda , xdapoly ;
    U16_T i, j, xdabit ;
    xda = 0xFFFF ;
    xdapoly = 0xA001 ;  // (X**16 + X**15 + X**2 + 1)
    for (i = 0; i < len; i++)
    {
        xda ^= aStr[i] ;
        for (j = 0; j < 8; j++)
        {
            xdabit = (unsigned char)(xda & 0x01) ;
            xda >>= 1 ;
            if ( xdabit ) xda ^= xdapoly ;
        }
    }
	
    return xda;
}

/*和校验*/
U8_T SOR_CRC(U8_T *Data, U8_T DataLen)
{
	U8_T i;
	U8_T sor_data = 0;
	
	for(i = 0; i < DataLen; i++)//i可能为0 ，也可以是1
	{
		sor_data = sor_data+Data[i];
	}
	return sor_data;
}



/*控制回复报文*/
void Rs485AskCtrlSend(U8_T* Recdata)
{
	U8_T SendData[10];
	
	SendData[0] = 0x55;
	SendData[1] = 0x55;
	SendData[2] = 0xee;  	//头
	
	SendData[3] = 0x07;  	//长度
	SendData[4] = Tem_Type;	//类型
	
	SendData[6] = 0x01;  	//类型	- 红外转发
	SendData[5] = g_Dip.DIP_addr;  
	SendData[7] = 0x01;  	//内容 - 接收成功
	
	NetCRC16_Check(&SendData[0+3], SendData[0+3]);    //校验

	Set_GroupSend(SendData,10,1,BUSSend_ValidTime3,20);	//组包
	
}



/**************************************************************************
 * IrSend_Rs485_Pro
 * 描述  ：红外转发接收处理函数
 * 输入  ：
 *   RecData   接收数据
 *   Len       数据长度
 * 输出  ：无
 * 调用  ：无
 *************************************************************************/
U8_T IrSend_Rs485_Pro(U8_T *RecData, U16_T Len)
{
	U8_T ret = 0;
	U16_T Crc_buf;   //正确报文校验保存
	
	if(0x0D != Len)
	{
		return 0x01;
	}

	if((0x55 != RecData[0]) || (0x55 != RecData[1])|| (0xee != RecData[2]) )
	{
		return 0x02;
	}
	
	if( (g_Dip.DIP_addr != RecData[6])&&(0xFF != RecData[6])  )
	{
		return 0x03;
	}
	
	if( (RecData[3] + 3 != Len) || (Tem_Type != RecData[4]))
	{
		return 0x04;
	}
	
	Crc_buf = GetCRC16(&RecData[3], RecData[3]-2);
	if(Crc_buf == (RecData[Len-2]+(RecData[Len-1]<<8)))   //校验通过
	{	
		//控制空调
		if(0x01 == RecData[5]) 
		{
			//设置温度命令
			if((TEM_MIN_SET <= RecData[7]) && (RecData[7] < TEM_MAX_SET))  //在指定温度范围内
			{
				TempCtrl.TemState_Now.set_t = (RecData[7]&0x1f);  
			}else if(RecData[7] == TEM_MAX_SET){
				TempCtrl.TemState_Now.set_t = (RecData[7]&0x20);
			}			

			switch(RecData[8])     
			{
				case 0x00: 
					TempCtrl.TemState_Now.on_off = TEMP_OFF;     //关机
					break;      
				case 0x01: 
					TempCtrl.TemState_Now.on_off = TEMP_ON;      //开机
					break;      
				default:   
					break;         //报文有误
			}
			
			switch(RecData[9])                 //风速
			{		
				case 0x03:  
					TempCtrl.TemState_Now.fan = FAN_HIGH;      //高风速
					break;
				case 0x02:  
					TempCtrl.TemState_Now.fan = FAN_MID;       //中风速
					break;
				case 0x01:  
					TempCtrl.TemState_Now.fan = FAN_LOW;       //低风速
					break;		
				case 0x00:  
					TempCtrl.TemState_Now.fan = FAN_STOP;       //低风速
					break;		
				default:
					break;			
			}	

			switch(RecData[10])          //
			{	
				case 0x00: 
					TempCtrl.TemState_Now.mode = MODEL_COLD;     //制冷
					break;
				case 0x01: 
					TempCtrl.TemState_Now.mode = MODEL_HOT;      //制热
					break; 
				case 0x02: 
					TempCtrl.TemState_Now.mode = MODEL_WIND;     //送风
					break;       
				default:
					break;
			}	
			
			Rs485AskCtrlSend(RecData);
			return 0x00;
		}
		
	}
	
	return 0x01;
}








