feat:修改设备类型
feat:修改为红外转发设备,将中弘网关协议转换为主机红外协议
This commit is contained in:
415
Source/SYSTEM/tempctrl_unit.c
Normal file
415
Source/SYSTEM/tempctrl_unit.c
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user