Files
RS485_T1_Transition/Source/SYSTEM/tempctrl_unit.c
yeyangwen 5a726f7378 feat:修改设备类型
feat:修改为红外转发设备,将中弘网关协议转换为主机红外协议
2026-02-09 17:48:39 +08:00

416 lines
12 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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;
}