feat:修改设备类型

feat:修改为红外转发设备,将中弘网关协议转换为主机红外协议
This commit is contained in:
yeyangwen
2026-02-09 17:32:59 +08:00
parent 2285326a47
commit 5a726f7378
1421 changed files with 47158 additions and 21011 deletions

View File

@@ -0,0 +1,415 @@
#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;
}