#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; }