#include "includes.h"

TempCtrl_Unit TempCtrl;


/******************************************************************
 * 函数功能：温控初始化
 * 
 * 
*****************************************************************/
void TemCtrl_Init(void)
{
	memset(&TempCtrl,0x00,sizeof(TempCtrl_Unit));
	
	if(Sys_RSR & 0xFFFFFFFE)        //除上电复位外其他复位源则恢复温控状态
	{
		Dbg_Println(DBG_BIT_SYS_STATUS,"MCU reset,recover state!");
		
		if(((Sav_Temp & 0xFF) == TEMP_OFF) || ((Sav_Temp & 0xFF) == TEMP_ON))    //读取的温控开关机状态合法
		{
			TempCtrl.TemState_Now.on_off = (Sav_Temp & 0xFF);
		}
		else
		{
			TempCtrl.TemState_Now.on_off = TEMP_OFF;
		}
		
		if( (((Sav_Temp >> 8) & 0xFF) == MODEL_COLD) || (((Sav_Temp >> 8) & 0xFF) == MODEL_HOT)
		 || (((Sav_Temp >> 8) & 0xFF) == MODEL_WIND) || (((Sav_Temp >> 8) & 0xFF) == MODEL_AUTO) )        //读取的温控模式状态合法
		{
			TempCtrl.TemState_Now.mode = ((Sav_Temp >> 8) & 0xFF);
		}
		else
		{
			TempCtrl.TemState_Now.mode = MODEL_COLD;
		}
		
		if( (((Sav_Temp >> 16) & 0xFF) == FAN_LOW) || (((Sav_Temp >> 16) & 0xFF) == FAN_MID) 		//读取的温控风速状态合法
		 || (((Sav_Temp >> 16) & 0xFF) == FAN_HIGH)|| (((Sav_Temp >> 16) & 0xFF) == FAN_AUTO))                             
		{
			TempCtrl.TemState_Now.fan = ((Sav_Temp >> 16) & 0xFF);
		}
		else
		{
			TempCtrl.TemState_Now.fan = FAN_MID;
		}
		//读取的温控设置温度合法   2024-04-18增加0==32的判断
		if(((((Sav_Temp >> 24) & 0xFF) >= 16) && (((Sav_Temp >> 24) & 0xFF) <= 32)) )  
		{
			TempCtrl.TemState_Now.set_t = ((Sav_Temp >> 24) & 0xFF);
		}
		else 
		{
			TempCtrl.TemState_Now.set_t = 24;
		}
		
	}
	else      //正常上电温控状态                      
	{
		TempCtrl.TemState_Now.on_off = TEMP_OFF;      //关机
		TempCtrl.TemState_Now.mode = MODEL_COLD;	  //制冷
		TempCtrl.TemState_Now.fan = FAN_MID;          //中风速
		TempCtrl.TemState_Now.set_t = 24;             //24
	}

	TempCtrl.TemState_Now.indoor_t = 24;
	TempCtrl.TemStateLast.indoor_t = TempCtrl.TemState_Now.indoor_t;
	TempCtrl.TemState_Ctrller.indoor_t = TempCtrl.TemState_Now.indoor_t;

	
	SYSCON->UREG0 = 0x00000000;
	SYSCON->UREG0 |= (TempCtrl.TemState_Now.mode << 8);
	SYSCON->UREG0 |= (TempCtrl.TemState_Now.fan << 16);
	SYSCON->UREG0 |= (TempCtrl.TemState_Now.set_t << 24);
	SYSCON->UREG0 |= TempCtrl.TemState_Now.on_off;        //2024-03-15
}







/******************************************************************
 * 函数功能：温控轮询任务,获得温控器状态、阀门状态
 * 
 * 
*****************************************************************/
void TemCtrl_Pro(void)
{
	static uint32_t TemCtrl_tick = 0x00;			
	
	//2、网关读取到的开关机状态
	if(TempCtrl.TemState_Now.on_off != TempCtrl.TemState_Ctrller.on_off)
	{
		TempCtrl.TemState_Ctrller.on_off = TempCtrl.TemState_Now.on_off;
		TempCtrl.TempCtrllerChange_Flag = 0x01;
	}
	
	if(TempCtrl.TemState_Now.set_t != TempCtrl.TemState_Ctrller.set_t)
	{
		TempCtrl.TemState_Ctrller.set_t = TempCtrl.TemState_Now.set_t;
		TempCtrl.TempCtrllerChange_Flag = 0x01;
	}
	
	if(TempCtrl.TemState_Now.mode != TempCtrl.TemState_Ctrller.mode)
	{
		TempCtrl.TemState_Ctrller.mode = TempCtrl.TemState_Now.mode;
		TempCtrl.TempCtrllerChange_Flag = 0x01;
	}		
	
	if(TempCtrl.TemState_Now.fan != TempCtrl.TemState_Ctrller.fan)
	{
		TempCtrl.TemState_Ctrller.fan = TempCtrl.TemState_Now.fan;
		TempCtrl.TempCtrllerChange_Flag = 0x01;
	}		
	
	
	
	//3、发送控制网关空调状态命令
	if( (TempCtrl.TempCtrllerChange_Flag == 0x01)&&(SysTick_1ms - TemCtrl_tick >= 300) )
	{
		TempCtrl.TemQuery_1S_tick = SysTick_1ms;
		TemCtrl_tick = SysTick_1ms;
		
		if(TempCtrl.TempCtrller_Cnt <= 0x03)
		{
			TempCtrl.TempCtrller_Cnt++;
			Ctrller_Ctrl_AirState();			
			
		}else{
			TempCtrl.TempCtrllerChange_Flag = 0x00;
			TempCtrl.TempCtrller_Cnt = 0x00;
		}
		
	}
	
//	//4、发送读取网关空调状态命令,获取温控器状态
//	if(SysTick_1ms - TempCtrl.TemQuery_1S_tick >= 1000)
//	{
//		TempCtrl.TemQuery_1S_tick = SysTick_1ms;
//		
//		Ctrller_Query_AirState();
//	}	
	
}    


/************************************************************************************
 * 函数名称  :  Ctrller_Query_AirFun
 * 函数功能  ： 查询空调性能
 * 函数输入  :
 * 函数输出  :  
**********************************************************************************/
void Ctrller_Query_AirFun(void)
{
	U8_T SdBuff[8];
	U16_T SdLen = 0x06;
	
	SdBuff[0] = 0xDD;
	SdBuff[1] = 0x06;
	SdBuff[2] = 0xFF;
	SdBuff[3] = g_Dip.DIP_addr;
	SdBuff[4] = 0x01;			//命令字
	
	SdBuff[5] = EEPROM_CheckSum(SdBuff,0x05);
	
	Controller485_SendData(SdBuff,SdLen);
}



/************************************************************************************
 * 函数名称  :  Ctrller_Query_AirState
 * 函数功能  ： 查询空调状态
 * 函数输入  :
 * 函数输出  :  
**********************************************************************************/
void Ctrller_Query_AirState(void)
{
	U8_T SdBuff[8];
	U16_T SdLen = 0x06;
	
	SdBuff[0] = 0xDD;
	SdBuff[1] = 0x06;
	SdBuff[2] = 0xFF;
	SdBuff[3] = g_Dip.DIP_addr;
	SdBuff[4] = 0x02;			//命令字
	
	SdBuff[5] = EEPROM_CheckSum(SdBuff,0x05);
	
	Controller485_SendData(SdBuff,SdLen);
}


/************************************************************************************
 * 函数名称  :  Ctrller_Ctrl_AirState
 * 函数功能  ： 控制空调状态
 * 函数输入  :
 * 函数输出  :  
**********************************************************************************/
void Ctrller_Ctrl_AirState(void)
{
	U8_T SdBuff[12];
	U16_T SdLen = 0x0B;
	
	SdBuff[0] = 0xDD;
	SdBuff[1] = 0x0B;
	SdBuff[2] = 0xFF;
	SdBuff[3] = g_Dip.DIP_addr;
	SdBuff[4] = 0x03;			//命令字
	
	SdBuff[5] = TempCtrl.TemState_Now.on_off;		//开关机状态
	
	SdBuff[6] = TempCtrl.TemState_Now.set_t;		//设定温度
	
	if(TempCtrl.TemState_Now.mode == MODEL_COLD){	//空调工作模式, 0x01:制热, 0x02:制冷, 0x04:送风
		SdBuff[7] = 0x02;
	}else if(TempCtrl.TemState_Now.mode == MODEL_HOT){
		SdBuff[7] = 0x01;
	}else if(TempCtrl.TemState_Now.mode == MODEL_WIND){
		SdBuff[7] = 0x04;
	}else{
		SdBuff[7] = 0x02;
	}
	
	if(TempCtrl.TemState_Now.fan == FAN_AUTO){		//空调风速, 0x00:自动, 0x01:低风速, 0x02:中风速, 0x03:高风速, 0x04:停止
		SdBuff[8] = 0x00;
	}else if(TempCtrl.TemState_Now.fan == FAN_LOW){	
		SdBuff[8] = 0x01;
	}else if(TempCtrl.TemState_Now.fan == FAN_MID){	
		SdBuff[8] = 0x02;
	}else if(TempCtrl.TemState_Now.fan == FAN_HIGH){
		SdBuff[8] = 0x03;
	}else if(TempCtrl.TemState_Now.fan == FAN_STOP){
		SdBuff[8] = 0x04;
	}else{			
		SdBuff[8] = 0x02;
	}	

	SdBuff[9] = TempCtrl.Temp_dirwind;				//空调的风向值, 	0x00:无风向, 0x01:代表风向板位于位置1, ..., 0x07:代表风向板位于位置7, 0xFF:自动摆动
	
	SdBuff[10] = EEPROM_CheckSum(SdBuff,0x0A);	
	
	Controller485_SendData(SdBuff,SdLen);
}



/************************************************************************************
 * 函数名称  :  Ctrller_AirFun_Processing
 * 函数功能  ： 查询空调性能命令的回复数据处理
 * 函数输入  :
 * 			RecData  :  接收数据
 * 			Len      :  接收数据长度
 * 函数输出  :  
**********************************************************************************/
U8_T Ctrller_AirFun_Processing(U8_T *RecData, U16_T Len)
{
	if(Len < 12) return 0x01;
	
	
	return 0x00;
}


/************************************************************************************
 * 函数名称  :  Ctrller_AirState_Processing
 * 函数功能  ： 查询空调状态的回复数据处理
 * 函数输入  :
 * 			RecData  :  接收数据
 * 			Len      :  接收数据长度
 * 函数输出  :  
**********************************************************************************/
U8_T Ctrller_AirState_Processing(U8_T *RecData, U16_T Len)
{
	if(Len < 13) return 0x01;

	//开关机状态, 		0x00:关机, 0x01:开机
	if(RecData[5] <= 0x01){											
		TempCtrl.TemState_Now.on_off = RecData[5];
	}
	
	//空调的设定温度, 	16~30
	if( (RecData[6] >= TEM_MIN_SET)&&(RecData[6] <= TEM_MAX_SET) ){	
		TempCtrl.TemState_Now.set_t = RecData[6];
	}

	//空调的工作模式, 	0x01:制热, 0x02:制冷, 0x04:送风, 0x08:除湿
	if(RecData[7] == 0x01){											
		TempCtrl.TemState_Now.mode = MODEL_HOT;
	}else if(RecData[7] == 0x02){
		TempCtrl.TemState_Now.mode = MODEL_COLD;
	}else if(RecData[7] == 0x04){
		TempCtrl.TemState_Now.mode = MODEL_WIND;
	}else{
		TempCtrl.TemState_Now.mode = MODEL_COLD;
	}

	//空调的风速, 	0x00:自动, 0x01:低风速, 0x02:中风速, 0x03:高风速
	if(RecData[8] == 0x00){											
		TempCtrl.TemState_Now.fan = FAN_AUTO;
	}else if(RecData[8] == 0x01){
		TempCtrl.TemState_Now.fan = FAN_LOW;
	}else if(RecData[8] == 0x02){
		TempCtrl.TemState_Now.fan = FAN_MID;
	}else if(RecData[8] == 0x03){
		TempCtrl.TemState_Now.fan = FAN_HIGH;
	}else{
		TempCtrl.TemState_Now.fan = FAN_LOW;
	}
	
	//空调的风向值, 	0x00:无风向, 0x01:代表风向板位于位置1, ..., 0x07:代表风向板位于位置7, 0xFF:自动摆动
	TempCtrl.Temp_dirwind = RecData[9];
	
	//室内温度,  0~40
	if(RecData[10] <= 40){											
		TempCtrl.TemState_Now.indoor_t = RecData[10];
	}
	
	//空调的故障码,		


	TempCtrl.TemState_Ctrller.on_off = TempCtrl.TemState_Now.on_off;
	TempCtrl.TemState_Ctrller.set_t = TempCtrl.TemState_Now.set_t;
	TempCtrl.TemState_Ctrller.mode = TempCtrl.TemState_Now.mode;
	TempCtrl.TemState_Ctrller.fan = TempCtrl.TemState_Now.fan;
	TempCtrl.TemState_Ctrller.indoor_t = TempCtrl.TemState_Now.indoor_t;

	return 0x00;
}


/************************************************************************************
 * 函数名称  :  Ctrller_CtrlAirState_Processing
 * 函数功能  ： 控制空调状态的回复数据处理
 * 函数输入  :
 * 			RecData  :  接收数据
 * 			Len      :  接收数据长度
 * 函数输出  :  
**********************************************************************************/
U8_T Ctrller_CtrlAirState_Processing(U8_T *RecData, U16_T Len)
{
	if(Len < 7) return 0x01;
	
	if(RecData[5] == 0x00)		//控制设定失败
	{
		
	}
	else if(RecData[5] == 0x01)	//控制设定成功
	{
		TempCtrl.TempCtrllerChange_Flag = 0x00;
		TempCtrl.TempCtrller_Cnt = 0x00;		
	}
	
	return 0x00;
}



/************************************************************************************
 * 函数名称  :  Ctrller_RecData_Processing
 * 函数功能  ： 接收网关数据
 * 函数输入  :
 * 			RecData  :  接收数据缓冲区
 * 			Len      :  接收数据长度
 * 函数输出  :  处理状态
**********************************************************************************/
U8_T Ctrller_RecData_Processing(U8_T *RecData, U16_T Len)
{
	if( (Len < 6)||(RecData[1] != Len) )
	{
		Dbg_Println(DBG_BIT_SYS_STATUS,"Len Err:%d",Len);
		return 0x01;
	}
	
	if(RecData[0] != 0xCC)
	{
		Dbg_Println(DBG_BIT_SYS_STATUS,"Head Err");
		return 0x02;		
	}
	
	if( (RecData[2] != 0xFF)||(RecData[3] != g_Dip.DIP_addr) )
	{
		Dbg_Println(DBG_BIT_SYS_STATUS,"Addr Err:%d, %d",g_Dip.DIP_addr,RecData[3]);
		return 0x03;	
	}
	
	if(RecData[Len-1] != EEPROM_CheckSum(RecData,(Len-1)))
	{
		Dbg_Println(DBG_BIT_SYS_STATUS,"SumCRC Err:%d, %d",RecData[5],EEPROM_CheckSum(RecData,(Len-1)));
		return 0x04;	
	}
	
	switch(RecData[4])
	{
		case 0x01:		//查询网关连接的空调性能的回复
			Ctrller_AirFun_Processing(RecData,Len);
		break;
		case 0x02:		//查询网关连接的空调状态的回复
			//Ctrller_AirState_Processing(RecData,Len);
		break;
		case 0x03:		//控制网关连接的空调状态的回复
			Ctrller_CtrlAirState_Processing(RecData,Len);
		break;
		case 0x04:		//查询网关连接的空调原厂故障代码值的回复
		
		break;		
		default:
		break;
	}
	
	
	return 0x00;
}
